SUNDIALS-CVODE的Fortran界面坏了吗?

时间:2013-02-08 18:50:56

标签: fortran

我试图在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

2 个答案:

答案 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)