我目前正在寫我的文憑論文在Fortran 90.在我的代碼的某個階段,我只是想計算一個整數(應該給一個方向在笛卡爾網格作爲結果的網格單元)。需要幫助的文憑論文:計算梯度向量的首選方向
沒有錯誤消息,但結果是錯誤的。它會是什麼?我正在尋找的價值是變量idirhf
(見下文)。它應該始終是1
,2
或3
。取決於計算的preferred
方向。然而,它往往是idirhf = 0
或甚至idirhf = 1195
或其他...價值fcdx
,fcdy
和fcdz
是Real
值。他們重申了漸變的組成部分。
所有變量都在前面的步驟中聲明,未顯示。
任何人都可以幫忙嗎?我已經花了幾個小時就現在有點問題......
下面是代碼的一部分:
distz = (dr (k) + dr (k - 1) + dr (k + 1))/2.
fcdx = (fv (i + 1, j, k) - fv (i - 1, j ,k)) &
& /(2. * dz)
fcdy = (fv (i, j + 1, k) - fv (i, j - 1, k)) &
& /(2. * dp)
fcdz = (fv (i, j, k + 1) - fv (i, j ,k - 1)) &
& /(distz)
gradf (1) = ABS (fcdx)
gradf (2) = ABS (fcdy)
gradf (3) = ABS (fcdz)
!
! Prüfung in welche der 3 Kooridnatenrichtung x,y,z
! die HF gebildet werden soll:
!
IF (gradf(1) > gradf(2)) THEN
IF (gradf(1) > gradf(3)) THEN
idirhf = x
x = 1
ider1 = y
ider2 = z
nsten1 = 5
nsten2 = 5
END IF
END IF
!
IF (gradf(2) > gradf(1)) THEN
IF (gradf(2) > gradf(3)) THEN
idirhf = y
y = 2
ider1 = x
ider2 = z
nsten1 = 4
nsten2 = 5
END IF
END IF
!
IF (gradf(3) > gradf(1)) THEN
IF (gradf(3) > gradf(2)) THEN
idirhf = z
z = 3
ider1 = x
ider2 = y
nsten1 = 4
nsten2 = 5
END IF
END IF
! WRITE(*,*)'###Nach gradf-Vergleich.idirhf = ', idirhf
我認爲馬克是正確的,並且你錯誤地將任務分配給了'idirhf'和'x','y'或者'z'。除了Fortran有邏輯的'.AND.'運算符 - 不需要使用嵌套的'IF's。 – 2012-08-17 16:08:20
實際上,爲了使邏輯更清晰,我試圖將其重寫爲'integer :: maxdir; maxdir = maxloc(gradf); select case(maxdir)case(1)...'注意,如果(比如說)'gradf(1)== gradf(2)> gradf(3)'表示當前狀態,那麼if體中沒有一個會得到執行;確切的數值相等可能不太可能,但根本不可能(例如,如果某些衍生物在初始條件下爲零)。 – 2012-08-18 03:19:39