2012-08-17 60 views
1

我目前正在寫我的文憑論文在Fortran 90.在我的代碼的某個階段,我只是想計算一個整數(應該給一個方向在笛卡爾網格作爲結果的網格單元)。需要幫助的文憑論文:計算梯度向量的首選方向

沒有錯誤消息,但結果是錯誤的。它會是什麼?我正在尋找的價值是變量idirhf(見下文)。它應該始終是1,23。取決於計算的preferred方向。然而,它往往是idirhf = 0或甚至idirhf = 1195或其他...價值fcdx,fcdyfcdzReal值。他們重申了漸變的組成部分。

所有變量都在前面的步驟中聲明,未顯示。

任何人都可以幫忙嗎?我已經花了幾個小時就現在有點問題......

下面是代碼的一部分:

   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 
+1

我認爲馬克是正確的,並且你錯誤地將任務分配給了'idirhf'和'x','y'或者'z'。除了Fortran有邏輯的'.AND.'運算符 - 不需要使用嵌套的'IF's。 – 2012-08-17 16:08:20

+0

實際上,爲了使邏輯更清晰,我試圖將其重寫爲'integer :: maxdir; maxdir = maxloc(gradf); select case(maxdir)case(1)...'注意,如果(比如說)'gradf(1)== gradf(2)> gradf(3)'表示當前狀態,那麼if體中沒有一個會得到執行;確切的數值相等可能不太可能,但根本不可能(例如,如果某些衍生物在初始條件下爲零)。 – 2012-08-18 03:19:39

回答

2

您的文章沒有顯示出我們的x,y,z值它們首先被用來更新前idirhf裏面有你的雙重IF陳述。如果序列

   idirhf = x 
       x = 1 

真的

   x = 1 
       idirhf = x 

+0

感謝您的快速回復和有用的答案。我會改變我的來源。我已經試過idirhf = MAXLOC(gradf)命令。然而,我沒有選擇select case命令,所以它沒有運行,雖然我宣佈gradf爲一列和三個組件的分配字段。 – DomDynamo 2012-08-18 12:20:05

+0

我現在擁有它就像你告訴馬克。它仍然是一樣的。並感謝您的建議Hristo Illiev。我已經使用.AND。 & 。要麼。與運算符> =,<=相加的命令即使三個值中的兩個值在數值上相等時也選擇一個方向。我的主管不希望這樣做,因爲處理代碼的其他人可能太複雜了。 – DomDynamo 2012-08-18 12:48:04