Передача внутренней процедуры в качестве аргумента
Я хочу решить дифференциальное уравнение много раз для разных параметров. Это сложнее, чем это, но для ясности, скажем, ODEy'(x) = (y+a)*x
с участиемy(0) = 0
и я хочуy(1)
, Я выбрал алгоритм dverk из netlib для решения ODE, и он ожидает, что функция в правой части будет иметь определенную форму. Теперь то, что я сделал с компилятором Intel Fortran, является следующим (упрощенным):
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
Это отлично работает с ifort, подпрограммойfaux
видит параметрa
и все работает как положено. Но я хотел бы, чтобы код был совместим с gfortran, и с этим компилятором я получаю следующее сообщение об ошибке:
Ошибка: внутренняя процедура 'faux' не разрешена в качестве фактического аргумента в (1)
Мне нужно иметьfaux
рутина внутриf
или я не знаю, как сказатьa
потому что я не могу изменить список параметров, так как это то, чтоdverk
рутина ожидает.
Я хотел бы сохранитьdverk
рутина и понимание, как решить эту конкретную проблему без обходного пути, так как я чувствую, что это снова станет важным, когда мне нужно будет интегрировать параметризованную функцию с различными интеграторами.