Passando um procedimento interno como argumento
Eu quero resolver muitas vezes uma equação diferencial para diferentes parâmetros. É mais complicado que isso, mas por uma questão de clareza, digamos que o ODE éy'(x) = (y+a)*x
comy(0) = 0
e eu queroy(1)
. Eu escolhi o algoritmo dverk do netlib para resolver o ODE e ele espera que a função no lado direito seja de uma determinada forma. Agora, o que fiz com o compilador Intel Fortran é o seguinte (simplificado):
subroutine f(x,a,ans)
implicite none
double precision f,a,ans,y,tol,c(24),w(9)
...
call dverk(1,faux,x,y,1.d0,tol,ind,c,1,w)
...
contains
subroutine faux(n,xx,yy,yprime)
implicite none
integer n
double precision xx,yy(n),yprime(n)
yprime(1) = (yy(1)+a)*xx
end subroutine faux
end subroutine f
Isso funciona muito bem com ifort, a sub-rotinafaux
vê o parâmetroa
e tudo funciona como esperado. Mas gostaria que o código fosse compatível com o gfortran e, com este compilador, recebo a seguinte mensagem de erro:
Erro: procedimento interno 'faux' não é permitido como argumento real em (1)
Preciso ter ofaux
rotina dentrof
, caso contrário, não sei como dizer o valor dea
, porque não posso alterar a lista de parâmetros, pois é isso que odverk
rotina espera.
Gostaria de manter odverk
rotineiramente e entenda como resolver esse problema específico sem uma solução alternativa, pois sinto que isso se tornará importante novamente quando precisar integrar uma função parametrizada com diferentes integradore