2013-10-22 37 views
6

我已經開發出具有以下特徵的Fortran代碼:專業Fortran代碼開發:創建日誌文件

  1. 全局變量
  2. 13個模塊與多個子程序
  3. 獨立子程序
  4. 使用Intel MKL用於LAPACK庫(線性代數)的庫
  5. 讀取和寫入文本文件

代碼變得相當大。儘管在這個階段我正在嘗試得到正確的答案,但代碼的執行速度仍然是需要的。

我正在寫一個帶有標籤的文本日誌文件,例如ERROR: messageINFO: message到目前爲止。但是編寫太多的信息會減慢代碼的速度。我知道在Java開發中,我們使用log4j庫來有效地編寫日誌文件,以便我們可以打開或關閉各種日誌記錄級別。因此,一旦代碼清理完畢,我們可以關閉低級日誌並保留高級日誌。

我想從其他程序員那裏瞭解在Fortran 90+中處理此問題的最佳方法。

+2

你可能想看看在[XERROR](http://people.sc.fsu.edu/~jburkardt /f_src/xerror/xerror.html)庫。 –

+0

你沒有說你是否想在運行時或編譯時關閉它們。當你編碼時,這會有很大的不同。 – cup

回答

2

最簡單的方法是創建一個整數變量verbose並讀取其執行時的值(從文件或通過命令行)。通過這樣做,你可以創建不同的層次:

  • 詳細= 0 =>無輸出
  • 詳細= 1 =>僅錯誤
  • 詳細> = 2 =>錯誤&信息

這將會是很容易實現:

IF(verbose >= 1) CALL OutputError(message) 
IF(verbose >= 2) CALL OutputInfo(message) 

等。

+0

感謝@Kyle的建議。我知道我應該創建一個像write_log(verbose,message)的子例程,並在整個代碼中使用它來寫日誌。我只想知道是否有任何標準程序可以讓我的共同開發人員隨後要求他們遵循我的日誌記錄方法。 – Amitava

+0

@Amitava:沒有一個標準*的方式來這樣的事情。你可以做的最好的做法是編寫'write_log'子例程,並且告訴你的同事使用'write_log'是記錄特定程序的首選方法。 –

0

我見過人們在編譯器級別執行日誌記錄的方式與Kyle Kanos的方法類似,具有預處理器指令。不是fortran標準,但我知道可以用一些fortran編譯器來完成。

2

我使用的正是這種任務的以下預處理宏(內MACROS.h):

#ifdef DEBUG 
#define DWRITE write(*,*) __FILE__,__LINE__, 
#define dwrite write(*,*) __FILE__,__LINE__, 
#else 
#define DWRITE ! 
#define dwrite ! 
#endif 

在我的代碼,然後我有以下標題:

#define DEBUG 
#include "MACROS.h" 

... 

dwrite 'An error occurred!' 

這給我的文件和發生錯誤的行,並通過評論第一行,我可以輕鬆地打開/關閉消息。

您可以輕鬆地擴展這個不同的調試級別和寫入文件...

+0

爲什麼你有#else塊? – BHF

+0

否則'dwrite'不會被定義,編譯器會發出錯誤。如果DEBUG沒有定義,預處理器會簡單地註釋掉以'dwrite'開頭的每一行。我可以用這種方式做更多的事情:如果設置了'DEBUG',我可以使'pure'函數*不純*,'elemental'函數'elemental'和'impure',等等。 –