SUNDIALS-CVODE的Fortran界面坏了?
我试图在fortran程序中使用SUNDIALS-CVODE。但fcvmalloc()
总是返回错误标志。SUNDIALS-CVODE的Fortran界面坏了?
包含在日package包中的fortran示例程序也不起作用。 它在fcvmalloc()
中有同样的问题。 但c样品运作良好。
我已经尝试从apt以及在本地编译的,在Ubuntu和Debian sid上的软件包。这些组合都不起作用,他们在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
尝试使用meth,itmeth,iatol,rtol和atol的变量名代替数字值;从Fortran调用C库例程时可能会导致问题。另外请确保您将cvcode构建为双精度或扩展精度,而不是单精度。
不幸的是它没有帮助。结果是一样的@ @ WaywiserTundish – mianzhi 2013-02-16 15:14:13
好的,文档说iout是21个元素的整数数组,而rout是6个元素的真实数组。你的代码尺寸稍大一些。尝试更改这些数组大小。如果这不起作用,那么可能是分解调试器的时候了。 – WaywiserTundish 2013-02-17 07:33:25
旧版本使用21/6。但最新版本使用25/10。 @ WaywiserTundish – mianzhi 2013-02-17 15:11:57
在现代FORTRAN的情况下,你可以使用ISO_C_BINDING和fcvode.h头文件 即
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)
很可能,问题出现在'long'中,现在是8个字节而不是4个,如同例子所假设的那样。让答案更好解释为什么要这样做,我会投票。 (我没有在任何地方找到Fortran接口。) – 2014-05-23 12:57:32
确实,fortran中的fortran界面文档并不完美。然而,对于fcvode,有一些文档解释了特定函数参数的类型定义:http://computation.llnl.gov/casc/sundials/documentation/cv_guide/node6.html – zmi 2014-05-24 00:30:47
难道fvinits()成功完成申报与C类型兼容的参数和变量?该文件称fcvmalloc()将在发生故障时将诊断信息打印到终端 - 您看到了什么? – WaywiserTundish 2013-02-14 04:48:06
'fnvinits'返回好标志。 'fcvmalloc()'说'[CVODE ERROR] CVodeInit 内存请求失败.'@WaywiserTundish – mianzhi 2013-02-15 17:39:59