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.