Vol*_*ker 4 fortran parameter-passing gfortran
我想为不同的参数多次解决微分方程.它是比这更复杂,但是为了清楚起见,让我们说的ODE是y'(x) = (y+a)*x
有y(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
例程并了解如何在没有解决方法的情况下解决这个特定问题,因为当我需要将参数化函数与不同的集成器集成时,我觉得它将再次变得重要.
您可以将所有这些放在一个模块中,并创建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)