Я хочу решить дифференциальное уравнение много раз для разных параметров. Это сложнее, чем это, но для ясности предположим, что ODE y'(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)
Мне нужно, чтобы внутри f
была подпрограмма faux
, иначе я не знаю, как определить значение a
, потому что я не могу изменить список параметров, так как это то, что dverk
рутина ожидает.
Я хотел бы сохранить процедуру dverk
и понять, как решить эту конкретную проблему без обходного пути, поскольку я чувствую, что она снова станет важной, когда мне нужно будет интегрировать параметризованную функцию с различными интеграторами.