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

数値の代わりに、meth、itmeth、iatol、rtol、および atol の変数名を使用してみてください。これにより、Fortran から C ライブラリ ルーチンを呼び出すときに問題が発生する可能性があります。また、cvcode を単精度ではなく倍精度または拡張精度としてビルドしたことを確認してください。

于 2013-02-16T05:41:25.830 に答える
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 に答える