1

この問題をご覧いただきありがとうございます。

問題: セグ。正しい計算結果が生成された、KINSOL の解決プロセスを含む f90 サブルーチンから戻るときにエラーが発生しました。同じ解決プロセスがメインプログラムにある場合は問題ありません。

環境: Linux、gcc、日時計の静的ライブラリ

問題の開始方法:

添付の REDUCED テスト コードを取得する

module moduleNonlinearSolve
  integer,save::nEq
contains
  subroutine solveNonlinear(u)
    double precision::u(*)
    integer iout(15),ier
    double precision rout(2),koefScal(nEq)
    koefScal(:)=1d0
    call fnvinits(3,nEq,ier)
    call fkinmalloc(iout,rout,ier)
    call fkinspgmr(50,10,ier)
    call fkinsol(u,1,koefScal,koefScal,ier)
    call fkinfree()
    do i=1,nEq
      write(*,*),i,u(i)
    end do
  end subroutine
end module

subroutine fkfun(u,fval,ier)
  use moduleNonlinearSolve
  double precision::u(*)
  double precision::fval(*)
  integer::ier
  forall(i=2:nEq-1)
    fval(i)=-u(i-1)+2d0*u(i)-u(i+1)-1d0
  end forall
  fval(1)=u(1)+2d0*u(1)-u(2)-1d0
  fval(nEq)=-u(nEq-1)+2d0*u(nEq)+u(nEq)-1d0
  ier=0
end subroutine

program test
  use moduleNonLinearSolve
  double precision u(10)
  nEq=size(u)
  u(:)=10d0
  call solveNonlinear(u)
end program``

コンパイル

$ gfortran -c -Wall -g test.f90
$ gfortran -Wall -g -o test test.o -lsundials_fkinsol -lsundials_fnvecserial -lsundials_kinsol -lsundials_nvecserial -llapack -lblas

走る

$ ./test

注: すべての SUNDIALS プロシージャをメイン プログラムに配置すると、問題なく動作します。

ご意見をお寄せいただきありがとうございます。

綿芝

4

1 に答える 1

1

KINSOLのドキュメントによると、 の最初の引数はfkinmalloctype と同じ整数型でなければなりませClong int。あなたの場合、long int長さは 8 バイトですが、4 バイト整数の配列を渡しています。これfkinmallocにより、配列の境界を超えて他のメモリに書き込もうとすることになります。これは通常、メモリの破損につながります。これには、観察しているのと同じような症状があります。関数から戻るときなど、後のランダムな時点でクラッシュします。valgrind を介してプログラムを実行すると、おそらくサイズ 8 の無効な書き込みが報告されるため、これを確認できるはずです。

integer :: iout(15)

integer*8 :: iout(15)

問題を解決する必要があります。

于 2012-11-01T12:42:40.407 に答える