二维阵列上的分段错误 [英] Segmentation fault on 2D array
问题描述
我有下面的代码.当我取消注释 temperature(i,j) = anode_temperature
时,I SegFault.
I have the code below. When I uncomment temperature(i,j) = anode_temperature
, I SegFault.
forall(i=0:Cells(1), j=0:Cells(2), j >= nint(upperBoundary(i * delta(1)) / delta(2)))
phi(i,j) = Anode_Voltage
! temperature(i,j) = anode_temperature
end forall
但是,我可以使用下面的代码访问每个元素.
However, I can access every element using the code below.
do i = 0,Cells(1)
do j = 0,Cells(2)
temperature(i,j) = anode_temperature
write(*,*) i,j,temperature(i,j)
enddo
enddo
这是一个独立的程序.由于有人提到他们使用 ifort,所以我使用的是 ifort 14.
Here is a self-contained program. Since someone mentioned they used ifort, I am using ifort 14.
program Main
implicit none
REAL, PARAMETER :: Pi = 3.14159265359
integer,parameter :: ND = 2
real, parameter :: RL = 1.0E-6 !Boundary radius
real, parameter :: HN = 5.0E-6 !Length of included needle
real, parameter :: HL = 2.0E-6 !Tip height
real, parameter :: LTT = 3E-6 !Tip-to-tip distance
real, parameter :: RU = 0.5E-6 !Boundary radius
real, parameter :: HU = 1.5E-6 !feature height
real, parameter :: zLen = HN + HL + LTT + HU
real,parameter,dimension(ND) :: Length = (/ 20E-6, zLen /) !computational domain size (r,z)
! Grid Spacing
real, parameter, dimension(ND) :: delta = (/ 1.0E-8 , 1.0E-8 /)
integer, PARAMETER, dimension(ND) :: cells = Length / delta
real,parameter :: VApplied = -150
REAL, PARAMETER :: cathode_temperature = 1473.14 !Cathode Temperature [K]
REAL, parameter :: anode_temperature = 973.14 !Anode Temperature [K]
real :: Cathode_Voltage, Anode_Voltage
REAL, dimension(0:cells(1), 0:cells(2)) :: phi
REAL, dimension(0:cells(1), 0:cells(2)) :: temperature !grid-wise gas temperature
integer:: i,j
phi = 0.0
temperature = 0.0
Cathode_Voltage = VApplied
Anode_Voltage = 0
forall(i=0:Cells(1), j=0:Cells(2), j <= nint(lowerBoundary(i * delta(1)) / delta(2)))
phi(i,j) = Cathode_Voltage
temperature(i,j) = cathode_temperature
end forall
forall(i=0:Cells(1), j=0:Cells(2), j >= nint(upperBoundary(i * delta(1)) / delta(2)))
phi(i,j) = Anode_Voltage
temperature(i,j) = anode_temperature
end forall
!forall(i=0:Cells(1), j=0:Cells(2), (j > nint(lowerBoundary(i * delta(1)) / delta(2))) .and. (j < nint(upperBoundary(i * delta(1)) / delta(2))))
! phi(i,j) = Cathode_Voltage + (Anode_Voltage - Cathode_Voltage) * ((delta(2) * j - lowerBoundary(i * delta(1)) ) / ( upperBoundary(i * delta(1)) - lowerBoundary(i * delta(1)) ))
! temperature(i,j) = cathode_temperature + (anode_temperature - cathode_temperature) * ((delta(2) * j - lowerBoundary(i * delta(1)) ) / ( upperBoundary(i * delta(1)) - lowerBoundary(i * delta(1)) ))
!end forall
contains
pure function LowerRegion(r) result(k)
implicit none
real,intent(in) :: r
integer :: k
if (r < 0) then
k = 0
elseif (r < RL) then
k = 1
elseif (r >= RL) then
k = 2
elseif (r > R) then
k = 3
endif
end function LowerRegion
pure function UpperRegion(r) result(k)
implicit none
real,intent(in) :: r
integer :: k
if (r < 0) then
k = 0
elseif (r < RU) then
k = 1
elseif (r >= RU) then
k = 2
elseif (r > R) then
k = 3
endif
end function UpperRegion
!!!!!!!!!!!! Define geometry for regions radially !!!!!!!!!!!!!!!!!!
pure function lowerBoundary(r) result(z)
implicit none
real,intent(in) :: r
real :: z
if (LowerRegion(r) == 1) then
z = HN + HL * (1.0 - (r / RL))
elseif (LowerRegion(r) == 2) then
z = 0.0
endif
!end function lowerBoundary_Scalar
end function lowerBoundary
pure function upperBoundary(r) result(z)
implicit none
real,intent(in) :: r
real :: z
if (UpperRegion(r) == 1) then
z = zLen - HU * (1.0 - (r / RU))
elseif (UpperRegion(r) == 2) then
z = zLen
end if
end function upperBoundary
end program Main
推荐答案
正如@haraldkl 所建议的,存在编译器错误.forall
循环和 -g
编译器标志(或者更具体地说是自动导致的 -O0
标志)的组合.这是我在英特尔论坛上发的帖子.
As was suggested by @haraldkl, there was a compiler bug. The combination of the forall
loops and the -g
compiler flag (or more specifically the -O0
flag this automatically causes). This is the post I made on the Intel forum.
https://software.intel.com/en-us/forums/intel-fortran-compiler-for-linux-and-mac-os-x/topic/593599
这篇关于二维阵列上的分段错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!