メインコードに問題がありますので、問題を特定しようとしました。 。したがって、私はこの小さなコードがあります。今のところFortranの不思議なセグメンテーションエラー
MODULE Param
IMPLICIT NONE
integer, parameter :: dr = SELECTED_REAL_KIND(15, 307)
integer :: D =3
integer :: Q=10
integer :: mmo=16
integer :: n=2
integer :: x=80
integer :: y=70
integer :: z=20
integer :: tMax=8
END MODULE Param
module m
contains
subroutine compute(f, r)
USE Param, ONLY: dr, mmo, x, y, z, n
IMPLICIT NONE
real (kind=dr), intent(in) :: f(x,y,z, 0:mmo, n)
real (kind=dr), intent(out) :: r(x, y, z, n)
real (kind=dr) :: fGlob(x,y,z, 0:mmo)
!-------------------------------------------------------------------------
print*, 'We are in compute subroutine'
r= 00.0
fGlob=sum(f,dim=5)
r=sum(f, dim=4)
print*, 'fGlob=', fGlob(1,1,1, 1)
print*, 'f=', f(1,1,1, 0,1)
print*, 'r=', r(1,1,1, 1)
end subroutine compute
end module m
PROGRAM test_prog
USE Param
USE m
Implicit None
integer :: tStep
real (kind=dr), dimension(:,:,:, :,:), allocatable :: f
real (kind=dr), dimension(:,:,:,:), allocatable :: r
!----------------------------------------------------------------------------
! Initialise the parameters.
print*, 'beginning of the test'
! Allocate
allocate(f(x,y,z, 0:mmo,n))
allocate(r(x,y,z, n))
f=1.0_dr
! ---------------------------------------------------------
! Iteration over time
! ---------------------------------------------------------
do tStep = 1, tMax
print *, tStep
call compute(f,r)
f=f+1
print *, 'tStep', tStep
enddo
print*, 'f=', f(1,1,1, 0,1)
print*, 'r=', r(1,1,1, 1)
! Deallacation
deallocate(f)
deallocate(r)
print*, 'End of the test program'
END PROGRAM test_prog
を、私はifort
でコンパイルするとき、私はsegmentation fault
を持っている、と私はgfortran
てコンパイルする場合、それが動作する理由を理解することはできませんよ。そして、最悪の場合、ifort
とgfortran
の両方でコンパイルすると、fast
オプションを使用して、segmentation fault (core dumped)
エラーが再び発生します。さらに混乱して、両方のコンパイラでtraceback
オプションを指定してコンパイルしようとしたところ、すべて正常に動作します。
私は、segmentation fault (core dumped)
というエラーは、通常、間違った場所(行列インデックスなど)で読み書きしようとしていることを意味します。ここではこの小さなコードで、私はこのような間違いを見ません。
なぜこれらのエラーが発生するのか誰にも分かりますか?
この記事を読む - https://software.intel.com/en-us/articles/determining-root-cause-of-sigsegv-or-sigbus-errors - すべての問題をチェックした後に報告するそれが起こる。 –
小さなmcveを持つのが良いです。それでも、コンパイラが '-g -fcheck = all -Wall'' -g -traceback -check -warn'を指定してデバッグオプションを試してみてください。 –
私はあなたのリンクの中で、調査を続けます。しかし、私は問題がスタックオーバーフローの問題だと思う。私はあなたにこれを確認します。とにかく、私がグーグルで見つけていないこの便利なリンクをありがとう。 –