传递内部过程作为参数

Vol*_*ker 4 fortran parameter-passing gfortran

我想为不同的参数多次解决微分方程.它是比这更复杂,但是为了清楚起见,让我们说的ODE是y'(x) = (y+a)*xy(0) = 0,我想y(1).我从netlib中选择了dverk算法来解决ODE,并且它希望右侧的函数具有某种形式.现在我对英特尔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
Run Code Online (Sandbox Code Playgroud)

这对ifort工作得很好,子子程序faux看到参数a,一切都按预期工作.但我希望代码与gfortran兼容,并且使用此编译器,我收到以下错误消息:

错误:内部过程'faux'不允许作为(1)的实际参数

我需要将faux例程放在里面f,否则我不知道如何告诉它的值a,因为我无法更改参数列表,因为这是dverk例程所期望的.

我想保留dverk例程并了解如何在没有解决方法的情况下解决这个特定问题,因为当我需要将参数化函数与不同的集成器集成时,我觉得它将再次变得重要.

bdf*_*bes 5

您可以将所有这些放在一个模块中,并创建a一个全局模块变量.制作faux模块程序.这样,它可以访问a.

module ode_module
    double precision::a

    contains

    subroutine f(x,a,ans)
        implicit none
        double precision f,ans,y,tol,c(24),w(9)

        call dverk(1,faux,x,y,1.d0,tol,ind,c,1,w)

    end subroutine 

    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 module
Run Code Online (Sandbox Code Playgroud)