Что ж, вы можете делать то, что хотите, если возитесь с внутренними и указателями KIND, но если вас интересует только сигнатура функций и подпрограмм, оставьте это Fortran. Если вы определите
function calc8(arg1)
real(8), intent(in) :: arg1
...
и
function calc4(arg1)
real(4), intent(in) :: arg1
...
в модуле и объявить интерфейс, подобный этому
interface calc
module procedure calc8
module procedure calc4
end interface
(Внимание, я не проверял синтаксис подробно, это ваша ответственность.)
тогда Fortran сопоставит вызов с верной версией функции. Конечно, вы должны написать обе версии функции, но на самом деле это Фортран 95 способ сделать это. Это может быть довольно утомительно, я склонен писать общую версию и запускать скрипт sed, чтобы специализировать его. Это немного круто, но это работает.
Если код функции идентичен, кроме вида аргументов, я иногда пишу функцию для real (8) (или что-то еще) и пишу версию для real (4), которая вызывает версию real (8) в виде в преобразованиях типов.
В Фортране 2003 есть улучшенные способы определения полиморфных и универсальных функций, но я до сих пор не разбираюсь в них.