Передача внутренней процедуры в качестве аргумента

Я хочу решить дифференциальное уравнение много раз для разных параметров. Это сложнее, чем это, но для ясности, скажем, 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 рутина и понимание, как решить эту конкретную проблему без обходного пути, так как я чувствую, что это снова станет важным, когда мне нужно будет интегрировать параметризованную функцию с различными интеграторами.

Ответы на вопрос(3)

Ваш ответ на вопрос