0

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

2 回答 2

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)
于 2014-05-23T11:11:23.403 回答
0

尝试对 meth、itmeth、iatol、rtol 和 atol 使用变量名,而不是数值;从 Fortran 调用 C 库例程时可能会导致问题。还要确保将 cvcode 构建为双精度或扩展精度,而不是单精度。

于 2013-02-16T05:41:25.830 回答