2017-10-05 107 views
-3

我使用FORTRAN GNU編譯器編譯使用fortran(.f90)編寫的一段代碼。與其他編譯器不同,寫入語句的輸出不顯示在屏幕上,而是寫入輸出文件中。Gnu Fortran編譯器寫入選項

例如我在源代碼的中間放置了「write(*,*)'在此處檢查'',以便當有人運行代碼的編譯版本時,此消息顯示在屏幕上。

我不明白爲什麼運行代碼時沒有在終端窗口中顯示此消息,但它是寫在輸出文件。

我會感激你的幫助來解決這個!

>

我編譯這些源代碼:

https://github.com/firemodels/fds/tree/master/Source

make文件,我使用的編譯代碼位於:

https://github.com/firemodels/fds/tree/master/Build/mpi_intel_linux_64

我運行使用生成文件創建

一個可執行程序

,我使用的編譯器的版本是

GNU的Fortran(Ubuntu的5.4.0-6ubuntu1〜16.04.5)5.4.0 20160609

>

謝謝。

+1

您所描述的行爲是不期望的。 gfortran編譯器不是問題。請發佈代碼。 – Manfredo

+1

請告訴我們你到底在做什麼。我們需要*精確的*代碼(請參閱[mcve])和*精確*的方式來編譯它(您正在使用的所有編譯器選項和標誌)以及如何運行它。我們需要您的操作系統和編譯器版本。 –

+0

請把代碼**放到這個問題**中。在外部鏈接的代碼是不夠的,你的代碼是**方式太大**。見[問]和[mcve]。您必須告訴我們錯誤發生的位置。解決問題的正式原因是:*「尋求調試幫助的問題(」爲什麼不是這個代碼工作?「)必須包含所需的行爲,特定的問題或錯誤以及在問題本身中重現它所需的最短代碼。「* –

回答

0

方式大局觀:有沒有你是從源代碼構建FDS而不是從https://pages.nist.gov/fds-smv/downloads.html直接從NIST即下載的二進制文件的一個原因?

當然,如果你有資格獲得安全相關使用的代碼,你可能需要從源代碼編譯,而不是用別人的二進制文件。您可能需要將特定信息添加到標題頁面,例如代碼版本,運行日期等,以滿足質量保證要求。

如果你只是學習FDS(練火的分析,瞭解CFD,評估的代碼),我強烈建議使用NIST的二進制文件。如果您需要/想要從源代碼進行編譯,我們需要更多信息來診斷問題。

這就是說,在你有需要,你構建代碼的使用情況的假設操作,您的具體問題似乎是寫入默認輸出單元*是不是把你想到哪裏輸出。

現代Fortran提供了iso_fortran_env模塊,它將Fortran的許多隱晦瑣事正式化,在這種情況下,默認輸入和輸出單元。

在正在修改,尋找類似的模塊:

use iso_fortran_env 

use iso_fortran_env, only: output_unit 

use, intrinsic:: iso_fortran_env, only: STDOUT => output_unit 

如果你看到的output_unit或進口(如在最後一種情況下)的別名,寫入該單元而不是*

如果您不從iso_fortran_env導入,請將上面的最後一行添加到您打印的例程或模塊中,然後寫入STDOUT而不是*

這可能會或可能不會解決問題,具體取決於FDS作者是否做了一些奇怪的重定向IO操作。他們可能;我不確定如何在MPI環境下編寫屏幕,在該環境下代碼可以在多臺聯網機器上並行運行(在這種情況下,我會寫入網絡日誌記錄系統,但這只是我)。但是在運行代碼的單個實例的簡單情況下,寫入output_unit比寫入*更精確,並且比寫入6更便於閱讀。

祝你好運與FDS;我試着簡單地用它來模擬空氣中的氫氣羽流形成層。 FDS帶來了我可憐的8 CPU機器,所以我回過頭去估計它,而不是試圖使CFD工作...

+0

所以你建議,一般應該使用'寫(STDOUT,'而不是'write(*,'?我不希望他/她一定做了一些錯誤的事情,如果它做了一些奇怪的事情。 –

+0

寫作沒有什麼不準確如果它們(可能)出現同樣的問題,你會如何修改'print'語句? –

+0

對於我來說,'write(*,...)'是不明確的因爲Fortran處理器決定'*'的含義;它可能是標準化和記錄的,但它仍然讓我感到不安,我更喜歡'output_unit',因爲我從來不需要猜測我的代碼在做什麼,我更願意明確地指定這個單位,因爲它少了一個元素,我也避免使用'print',但這是另一回事,如果'write(*,'適合你,很好,它會讓我緊張,所以我避免它:) – arclight