我尝试使用显式方法(抛物型微分方程)运行25年的海洋温度模型。Fortran错误:程序接收到的信号SIGSEGV:分段错误 - 无效内存引用
如果我运行一年a = 3600
或五年a = 18000
它工作正常。
但是,当我运行它25年a = 90000
它崩溃。
a
是使用的时间步数。一年被认为是360天。时间步骤是4320秒,delta_t = 4320.
。
这里是我的代码:
program task
!declare the variables
implicit none
! initial conditions
real,parameter :: initial_temp = 4.
! vertical resolution (delta_z) [m], vertical diffusion coefficient (av) [m^2/s], time step delta_t [s]
real,parameter :: delta_z = 2., av = 2.0E-04, delta_t = 4320.
! gamma
real,parameter :: y = (av * delta_t)/(delta_z**2)
! horizontal resolution (time) total points
integer,parameter :: a = 18000
!declaring vertical resolution
integer,parameter :: k = 101
! declaring pi
real, parameter :: pi = 4.0*atan(1.0)
! t = time [s], temp_a = temperature at upper boundary [°C]
real,dimension(0:a) :: t
real,dimension(0:a) :: temp_a
real,dimension(0:a,0:k) :: temp
integer :: i
integer :: n
integer :: j
t(0) = 0
do i = 1,a
t(i) = t(i-1) + delta_t
end do
! temperature of upper boundary
temp_a = 12. + 6. * sin((2. * t * pi)/31104000.)
temp(:,0) = temp_a(:)
temp(0,1:k) = 4.
! Vertical resolution
do j = 1,a
do n = 1,k
temp(j,n) = temp(j-1,n) + (y * (temp(j-1,n+1) - (2. * temp(j-1,n)) + temp(j-1,n-1)))
end do
temp(:,101) = temp(:,100)
end do
print *, temp(:,:)
end program task
变量a
是第11行(integer,parameter :: a = 18000
)
至于说,a = 18000
作品,a = 90000
没有。
在90000
让我得到:
Program received signal SIGSEGV: Segmentation fault - invalid memory reference.
Backtrace for this error:
RUN FAILED (exit value 1, total time: 15s)
我使用的是Windows 8.1,NetBeans和Cygwin的(已gfortran内置)一个Fortran。
我不确定这个问题是否由错误的编译器或其他引起的。
有没有人有任何想法呢?它会帮助我很多!
问候
你应该用运行时数组边界检查来编译你的代码。当你这样做时,你应该找到你的错误。这与“a”而不是“k”有关。 – francescalus
使用gfortran测试程序时使用'-fcheck = all -Wall -g -fbacktrace'。 –