2013-01-31 29 views
0

我想補充兩個數組,但由於某種原因選擇目標磁盤陣列只包含零。 當我編譯和運行程序時,我沒有得到任何錯誤,但輸出文件是錯誤的。 在代碼我叫dhscf填補陣列Gnaatm和Gnascf與價值觀,我(TRY),拯救那些在gavenaa和gavenas,呼叫dhscf再次爲Gnaatm的Gnascf獲得新的價值。當我將所有這些數組寫入文件gavenas en gavenaa似乎是空的,雖然Gnaatm和Gnascf不是。Fortran數組除了出錯

我使用的代碼是:

模塊變種

real(dp), dimension(:), allocatable :: Gnaatm(:), Gnascf(:), gavenaa(:), & 
& gavenas(:) 

端模塊

grdsam.f:

allocate (Gnaatm(nasize)) 
allocate (Gnascf(nasize)) 
allocate (gavenaa(nasize)) 
allocate (gavenas(nasize)) 

    call dhscf(.....) 
    gavenaa = Gnaatm 
     gavenas = Gnascf 

    do ipt = 1, npt 

     call dhscf(....) 
     gavenaa = Gnaatm + gavenaa 
     gavenas = Gnascf + gavenas 
    enddo 

open(unit=12, file="Zgavenaatm.txt", status="replace") 
    do iwrite = 1, nasize 
    write(12, *), iwrite, gavenaa(iwrite), Gnaatm(iwrite) 
    enddo 
close(12) 

open(unit=12, file="Zgavenascf.txt", status="replace") 
    do iwrite = 1, nasize 
    write(12, *), iwrite, gavenas(iwrite), Gnascf(iwrite) 
    enddo 
close(12) 

deallocate (Gnaatm) 
deallocate (Gnascf) 
deallocate (gavenaa) 
deallocate (gavenas) 

端grdsam

當我跑過程序我沒有得到錯誤,但輸出文件是錯誤的。典型的輸出是這樣的:

 10 0.0000000000000000  -2.35488624992556957E-015 
     11 0.0000000000000000  -4.75822627213221874E-017 
     12 0.0000000000000000  -7.16040821425613171E-014 
     13 0.0000000000000000  8.33283089385797112E-021 
     14 0.0000000000000000  -1.04121906025281556E-014 

第二列只包含零,但第三列確實包含數字。 所以數組'Gnaatm'和'Gnascf'包含數字,但不知何故將它們添加到'gavenaa'和'gavenas'出錯了。任何人都可以告訴我我做錯了什麼?

ps。我使用gfortran編譯器在Ubuntu 12

+0

我認爲這個問題存在於你的子程序'dhscf'中......到目前爲止你沒有發現任何錯誤。 – sigma

+0

如果您尚未這樣做,請嘗試使用最大調試選項編譯並查看編譯器是否可以幫助找到問題。用gfortran我建議:-O2 -fimplicit-none -Wall -Wline-truncation -Wcharacter-truncation -Wsprising -Waliasing -Wimplicit-interface -Wunused-parameter -fwhole-file -fcheck = all -std = f2008 -pedantic -fbacktrace –

+0

你確定在計算結束時這些數組應該包含0以外的值嗎? –

回答

1

如果你只是在做整個數組賦值你爲什麼用forall構建困擾?由於有關的所有陣列具有相同的大小,你可以簡化這個塊:

gavenaa(1:nasize) = Gnaatm(1:nasize) 
forall(icount = 1:nasize) 
    gavenas(icount) = Gnascf(icount) + gavenas(icount) 
end forall 

gavenaa = Gnaatm 
gavenas = Gnascf + gavenas 

同樣,在你的代碼的其餘部分。

我不能說你對forall的使用是不正確的,但是看起來沒有必要並且將你的代碼減少一點會幫助你和我們正確地診斷和解決你遇到的任何問題。

3

我會很驚訝,如果任何Fortran編譯器必須的東西基本問題如添加了兩個數組,所以無論顯示的代碼是不是正是你正在使用的代碼,或者問題是在部分代碼是被省略。

首先,你不要在這裏表現出來,所以我會問它:你有沒有在你的代碼implicit none?沒有它就繼續浪費時間;它避免了許多「愚蠢的」錯誤,比如拼寫錯誤的變量名稱。

其次,你有沒有試着寫(部分)您有興趣到屏幕的數組老式的調試方法?只要在賦值語句之後立即加入一些類似於如下的語句:

write(*,*) gavenaa(:5) 

以查看數組是否包含您期望的值。

如果仍然無法找到發生問題的地方,請嘗試將代碼簡化爲最小但完整的示例,以展示相同的問題。這樣做通常會發現錯誤,但如果不能,那麼其​​他人可以更容易地幫助您,如果您可以給他們一些完整並直接編譯的代碼。