2015-08-23 184 views
0

我正在創建二維數組phi並將其初始化爲0.然後,我要通過一對do循環來修改phi的一些值。但是,一些價值在他們不應該被分配時被分配。Fortran:未分配值的二維數組

具體當我運行下面的例子(用ifort 14或15編譯)大約1/3的底行是-20,當我用gfortran編譯約1/3的底行是-20,另一個是1/3rd是10

當我在if-elseif聲明之前取消對phi(i,j) = 0.0的註釋時,phi(i,j)的值保留0.0。所以這不是if-elseif正在改變它的價值。

有誰知道這是什麼原因造成的?

作爲一個側面的問題,當我取消close (42),我沒有放置後,它會執行。所以我不確定這是否相關。

謝謝

約翰

program test 
implicit none 
real, parameter, dimension(2) :: delta = (/ 1E-7, 1E-7 /) 
real,parameter,dimension(2) :: Length = (/ 6E-6, 5E-6 /) 
integer, PARAMETER, dimension(2) :: cells = Length/delta 
real, dimension(cells(1), cells(2)) :: phi 

REAL,parameter :: V0 = -20 
REAL,parameter :: VL = 10 
integer :: i,j 

phi = 0.0 

open(unit=42,file='ChangeValuePhi.csv',form='formatted') 
do i = 0, size(phi,1) 
    do j = 0, size(phi,2) 
      if (j .ne. 0) then 
       write(42,'(A)',Advance="NO") "," 
      endif 

!   phi(i,j) = 0.0 
      if (j <= nint(lowerBoundary(i * delta(1))/delta(2))) then  !If at minimum z feature 
       phi(i,j) = V0 
      elseif (j >= nint(upperBoundary(i * delta(1))/delta(2))) then  !If at maximum z feature 
       phi(i,j) = VL 
      end if 

      write(42,'(F6.2)',Advance="NO") phi(i,j) 
    enddo 
    write(42,*) 
enddo 
!close(42) 

contains 

function lowerBoundary(r) result(z) 
    real :: r,z 
    real, parameter :: RL = 3E-6 
    real, parameter :: HL = 3E-6 

    if (r < RL) then 
     z = HL - HL * (r/RL) 
    elseif (r >= RL) then 
     z = 0.0 
    endif 
end function lowerBoundary 

function upperBoundary(r) result(z) 
    real :: r,z 
    real, parameter :: RU = 0.0 
    real, parameter :: HU = 0.0 

    if (r <= RU) then 
     z = Length(2) - (HU - HU * (r/RU)) 
    elseif (r > RU) then 
     z = Length(2) - 0.0 
    end if 
end function upperBoundary 


end program test 
+0

「upperBoundary」中除零以外是否沒有運行時錯誤?你被「RU」除以零。 – innoSPG

+0

不,因爲r> = 0,但你說得對,我應該改變「或者等於」的位置以避免被零誤差除法。 – user1543042

回答

1

您正在訪問phi出界。在循環,

do i = 0, size(phi,1) 
    do j = 0, size(phi,2) 
... 
!   phi(i,j) = 0.0 
      if (j <= nint(lowerBoundary(i * delta(1))/delta(2))) then  !If at minimum z feature 
       phi(i,j) = V0 
      elseif (j >= nint(upperBoundary(i * delta(1))/delta(2))) then  !If at maximum z feature 
       phi(i,j) = VL 
      end if 
... 
enddo 

要訪問phi與任一ij等於0 Fortran數組是1索引除非專門聲明下界是別的東西(例如0)。您看到的錯誤輸出是由於出界限訪問。

您可以做循環的開頭改爲

do i = 1, size(phi,1) 
    do j = 1, size(phi,2) 
     if (j .ne. 1) then 
      write(42,'(A)',Advance="NO") "," 
     endif 

,以避免出界訪問。

+0

好吧,我顯然一直在盯着我的電腦幾個小時。謝謝。 – user1543042

+0

@ user1543042我知道這種感覺太好了。 – casey