我正在創建二維數組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
「upperBoundary」中除零以外是否沒有運行時錯誤?你被「RU」除以零。 – innoSPG
不,因爲r> = 0,但你說得對,我應該改變「或者等於」的位置以避免被零誤差除法。 – user1543042