subprogramas - funciones intrinsecas fortran
¿Cómo pasar una función con múltiples argumentos a una subrutina que espera una función con un solo argumento? (1)
En Fortran 2008 puede pasar funciones internas como argumentos y gfortran lo admite.
subroutine calling()
a0 = ...
call treatfunction(wrapper, input=myinput, output=myoutput)
contains
real function wrapper(x)
real, intent(in) :: x
wrapper = fun(x,a0)
end function
end subroutine
Por cierto, me mantendría alejado de lo external
, es malo, use bloques de interfaz.
Tengo una subrutina (ejemplo mínimo)
subroutine treatfunction(f,input,output)
external, real::f
real, intent(in):: input
real, intent(out):: output
output = f(input) + f(1.0) ! i.e. f has only one argument
end subroutine
y una función con dos argumentos
real function fun(x,a)
real,intent(in)::x,a
Ahora, por un tiempo determinado, en tiempo de ejecución, quiero pasarme la fun
para treatfunction
. Entonces, idealmente, me gustaría llamar algo así como
call treatfunction(fun(:,a=a0), input=myinput, output=myoutput)
¿Cuál es la forma más elegante de hacer esto con las características de Fortran2003 gfortran-5
?
Por supuesto, podría insertar un argumento ficticio opcional a
en la función treatfunction
y llamar a f
con f(x)
o f(x,a)
dependiendo del present(a)
en el cuerpo de la subrutina. Pero cambiar la subrutina no es elegante.