我试图在fortran程序中使用SUNDIALS-CVODE。但是fcvmalloc()
总是返回错误标志。
包含在日程包中的fortran样本程序也不起作用。
它在fcvmalloc()
中也存在同样的问题。
但是c样本效果很好。
我在ubuntu和debian sid上尝试过apt以及本地编译的包。这些组合都不起作用,它们在fcvmalloc()
中只有相同的问题。
感谢您查看此问题,以下是简化测试用例。
program test
integer*4,parameter::nEq=2
integer ier
integer*4 ipar(1),iout(25)
double precision rpar(1),rout(10)
double precision t,dt,u(nEq)
t=0d0
u=[1d0,2d0]
call fnvinits(1,nEq,ier)
call fcvmalloc(t,u,1,1,1,1d-5,1d-5,iout,rout,ipar,rpar,ier)
call fcvspgmr(0,1,50,0d0,ier)
dt=1d-1
do i=1,10
call fcvode(t+dt,t,u,1,ier)
write(*,*),t,u
end do
call fcvfree()
end program
subroutine fcvfun(t,u,du,ipar,rpar,ier)
double precision t
double precision u(*)
double precision du(*)
integer ipar(*)
double precision rpar(*)
integer ier
du(1)=-0.5d0*u(1)
du(2)=-3d0*u(2)
ier=0
end subroutine
答案 0 :(得分:0)
尝试使用meth,itmeth,iatol,rtol和atol的变量名而不是数值;从Fortran调用C库例程时可能会导致问题。还要确保将cvcode构建为双精度或扩展精度而不是单精度。
答案 1 :(得分:0)
在现代fortran的情况下,您可以使用iso_c_binding并声明您的参数和变量与fcvode.h头文件中的C类型兼容 即。
integer(c_long ),parameter::nEq=2
integer(c_int ) ier
integer(c_long ) ipar(1),iout(21)
real(c_double ) rpar(1),rout(10)
real(c_double ) t,dt,u(nEq)