Я не уверен, что это то, что вы ищете, но:
Fortran также позволяет вам передавать имена подпрограмм / функций как фактические аргументы для вызовов подпрограмм / функций.Соответствующие фиктивные аргументы должны иметь атрибут "external".
subroutine fobj(n,x,f,func)
implicit none
integer :: n
real(8),external :: func
real(8) :: f
real(8) :: x(n)
intent(in ) :: n,x
intent(out) :: f
!OBJECTIVE FUNCTION
f=func(x,n)
end subroutine fobj
function func1(x,n)
implicit none
real(8) func1
integer n
real(8) :: f,x(n)
f = x(1)**2-x(2)+2*x(3)
end function func1
function func2(x,n)
implicit none
real(8) func2
integer n
real(8) :: f,x(n)
f = x(1)**2+x(2)+2*x(3)
end function func2
program main
real(8),external :: func1,func2
real(8),allocatable :: x(:)
real(8) :: f
integer n
n=50
allocate(x(n))
x=10. !Set X to a known value
call fobj(n,x,f,func1) !Call func1
print*,f !10**2-10+2*10 = 110
x=10. !Reset X ... just to make sure there is no funny business in func1,func2
call fobj(n,x,f,func2) !Call func2
print*,f !10**2+10+2*10 = 130
deallocate(x)
end program main
Конечно, эта программа не делает ничего полезного, кроме вызова func1 и func2 неясными способами, но, надеюсь, это иллюстрирует суть.Если вы хотите отключить функцию во время компиляции, то я думаю, что include "myfile"
, вероятно, чище (просто переключение файла, который вы включаете в данный момент, как предложено @AlejandroLL)