3

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

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
10
  • Off by one? Try i=0:Cells(1)-1, j=0:Cells(2)-1 Commented Sep 15, 2015 at 18:23
  • I'm declaring from 0, REAL, dimension(0:cells(1), 0:cells(2)) :: temperature Commented Sep 15, 2015 at 18:33
  • And the do loop works. Commented Sep 15, 2015 at 18:34
  • 3
    It'd be best for us to see a complete example capable of reproducing the error. I'm particularly interested in the values and declaration of Cells, delta, and upperBoundary. Have you tried compiling with bounds checking? Commented Sep 15, 2015 at 18:48
  • 1
    I realized it doesn't seg faults if I compile using the command ifort main.f90 -o a -mkl -warn noalign -autodouble -check bounds -check pointers -check uninit -heap-arrays but does seg fault if I compile using ifort main.f90 -o a -g -CB -CU -debug -traceback -check bounds -mkl -warn noalign -autodouble -check bounds -check pointers -check uninit -heap-arrays Commented Sep 16, 2015 at 2:49

1 Answer 1

0

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

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.