无法在FORTRAN子例程中使用SUNDIALS-KINSOL?

无法在FORTRAN子例程中使用SUNDIALS-KINSOL?,fortran,Fortran,感谢您查看此问题 问题: 赛格。生成正确的计算结果后,从包含KINSOL解算过程的f90子例程返回时出错。在主程序中使用相同的解决过程时没有问题 环境: linux, 海湾合作委员会, 日晷静态库 如何启动问题: 获取附带的简化测试代码 module moduleNonlinearSolve integer,save::nEq contains subroutine solveNonlinear(u) double precision::u(*) integer iout

感谢您查看此问题

问题: 赛格。生成正确的计算结果后,从包含KINSOL解算过程的f90子例程返回时出错。在主程序中使用相同的解决过程时没有问题

环境: linux, 海湾合作委员会, 日晷静态库

如何启动问题:

获取附带的简化测试代码

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

注意:如果将所有日晷程序都放在主程序中,它将完美地工作。

非常感谢您的任何意见

Mianzhi

根据文档,fkinmalloc的第一个参数必须与
C
类型
long int
具有相同的整数类型。在您的例子中,
long int
的长度为8字节,但您要传入一个4字节整数的数组。这将导致
fkinmalloc
尝试写入数组边界以外的内存。这通常会导致内存损坏,其症状与您所观察到的一样:在稍后某个随机点崩溃,例如从函数返回时。您应该能够通过valgrind运行程序来确认这一点,valgrind可能会报告大小为8的无效写入。不管怎样,替换

integer :: iout(15)

应该解决这个问题

根据文档,
fkinmalloc
的第一个参数必须与
C
类型
long int
的整数类型相同。在您的例子中,
long int
的长度为8字节,但您要传入一个4字节整数的数组。这将导致
fkinmalloc
尝试写入数组边界以外的内存。这通常会导致内存损坏,其症状与您所观察到的一样:在稍后某个随机点崩溃,例如从函数返回时。您应该能够通过valgrind运行程序来确认这一点,valgrind可能会报告大小为8的无效写入。不管怎样,替换

integer :: iout(15)


应该解决这个问题

为什么要包含
fkfun
的源代码?我看不到它在任何地方被调用。fkfun是KINSOL调用的一个外部函数。实际上,KINSOL的目的是求解非线性方程组“fkfun=0”。此链接时间问题定义方法也被其他FORTRAN非线性求解器使用@HighPerformanceMark您是否有KINSOL例程的接口?请仔细检查。我不确定问题出在哪里,但向函数中添加
隐式none
可能会发现类型问题?您的计算机上的C type
long int
的大小是多少?为什么要包含
fkfun
的源代码?我看不到它在任何地方被调用。fkfun是KINSOL调用的一个外部函数。实际上,KINSOL的目的是求解非线性方程组“fkfun=0”。此链接时间问题定义方法也被其他FORTRAN非线性求解器使用@HighPerformanceMark您是否有KINSOL例程的接口?仔细检查。我不确定问题出在哪里,但可能在函数中添加
隐式none
会发现类型问题?您的计算机上的C类型
long int
的大小是多少?它可以工作!非常感谢你。我本应该学会使用valgrind@阿穆雷特成功了!非常感谢你。我本应该学会使用valgrind@阿马脲
integer*8 :: iout(15)