【问题标题】:Segmentation fault on 2D array二维阵列上的分段错误
【发布时间】:2015-09-15 18:13:49
【问题描述】:

我有下面的代码。当我取消注释 temperature(i,j) = anode_temperature 时,我会出现 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

但是,我可以使用下面的代码访问每个元素。

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。

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

【问题讨论】:

  • 减一?试试i=0:Cells(1)-1, j=0:Cells(2)-1
  • 我从 0 声明,REAL, dimension(0:cells(1), 0:cells(2)) :: temperature
  • do 循环有效。
  • 我们最好看到一个能够重现错误的完整示例。我对CellsdeltaupperBoundary 的值和声明特别感兴趣。您是否尝试过使用边界检查进行编译?
  • 我意识到如果我使用命令ifort main.f90 -o a -mkl -warn noalign -autodouble -check bounds -check pointers -check uninit -heap-arrays 编译它不会出现段错误,但如果我使用ifort main.f90 -o a -g -CB -CU -debug -traceback -check bounds -mkl -warn noalign -autodouble -check bounds -check pointers -check uninit -heap-arrays 编译则会出现段错误

标签: segmentation-fault fortran


【解决方案1】:

正如@haraldkl 所建议的,存在编译器错误。 forall 循环和 -g 编译器标志的组合(或者更具体地说,这是自动导致的 -O0 标志)。这是我在英特尔论坛上发的帖子。

https://software.intel.com/en-us/forums/intel-fortran-compiler-for-linux-and-mac-os-x/topic/593599

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-07
    • 2014-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多