Как реализовать встроенное приведение REAL для пользовательского типа данных в Fortran

Я искал в Интернете решение этой проблемы, но должен признать, что полностью застрял.

У меня есть производный тип данных

TYPE :: MyType
    REAL(KIND=MY_REAL_KIND) :: real_val
    INTEGER :: int_val
END TYPE

Я перегружаю операторы и встроенные функции для работы с ним. Мне нужно перегрузить приведение REAL для работы с этим типом, чтобы при вызове он возвращал элемент real_val. Так фа так хорошо:

 FUNCTION real_mytype (a) RESULT (x)
    IMPLICIT NONE
    TYPE(MyType), INTENT(IN) :: a
    REAL(KIND=MY_REAL_KIND) :: x
    # Take advantage of the overloaded (=) operator
    x = a
END FUNCTION real_mytype

Но тогда мне нужно выполнить приведение с заданной точностью, скажем, как

INTEGER, PUBLIC, PARAMETER :: sp = SELECTED_REAL_KIND( 6, 37)
INTEGER, PUBLIC, PARAMETER :: dp = SELECTED_REAL_KIND(12,307)
TYPE(MyType) :: a
call external_function_that_I_cant_change(REAL(a, sp))
call second_external_function_that_I_cant_change(REAL(a, dp))

Я не знаю, как написать такой интерфейс, потому что тип возвращаемого значения (двойное вещественное число или одиночное вещественное число) будет зависеть от значения входного параметра INTEGER (sp или dp), а не от его типа, что является своего рода запрещено в Фортране. Следующее просто не имеет смысла:

FUNCTION real_mytype_1d (a, p) RESULT (x)
    IMPLICIT NONE
    TYPE(MyType),  INTENT(IN) :: a
    INTEGER                   :: p
    REAL(KIND=something_that_depends_on_p)  :: x
    x = a
END FUNCTION real_mytype_1d

Я уже взглянул на функцию передачи, как предложено integer-or-as">здесь, но я не смог найти решение (тип возвращаемого значения val зависит от типа пресс-формы).

Любое предложение?


person Sparonuz    schedule 02.04.2021    source источник
comment
Вопрос, на который вы ссылаетесь, имеет ответ, который (правильно) говорит о том, что то, что вы хотите сделать, невозможно. Вы можете использовать тип (например, real(a,0._dp), который является идеей пресс-формы), но не значение. Внутренние процедуры могут вести себя совсем иначе, чем не внутренние.   -  person francescalus    schedule 02.04.2021
comment
Большое спасибо за ответ! Если я правильно понимаю, вы говорите, что я не могу воспроизвести поведение внутренней процедуры просто с перегрузкой, поэтому я не могу создать модульную процедуру для РЕАЛЬНОЙ функции, которая ведет себя точно так же, как встроенная процедура Fortran?   -  person Sparonuz    schedule 02.04.2021
comment
Вы можете воссоздать поведение некоторых (/many/most) встроенных функций, но не всех. real является одним очевидным случаем, потому что: (невнутреннее) универсальное устранение неоднозначности не может быть получено через значение аргумента; значение фиктивного аргумента не может появляться в постоянном выражении; значение может использоваться для управления потоком, что приводит к различному полиморфному распределению результата функции, но такой результат функции подлежит многочисленным ограничениям при использовании. Просто на встроенные функции не распространяются те же правила, что и на нас (посмотрите, как мы реализуем trim в Forttan 77?).   -  person francescalus    schedule 02.04.2021
comment
Большое спасибо, это развеяло все сомнения, которые у меня были. Тогда я передам настоящий с правильным типом!   -  person Sparonuz    schedule 02.04.2021