专业的Fortran代码开发:日志文件创建

时间:2013-10-22 16:43:33

标签: fortran fortran90

我开发了一个具有以下特征的Fortran代码:

  1. 全局变量
  2. 13个具有多个子程序的模块
  3. 独立子程序
  4. 将英特尔MKL库用于LAPACK库(线性代数)
  5. 读写文本文件
  6. 代码变得非常大。尽管在这个阶段我试图得到正确的答案,但仍需要执行代码的速度。

    到目前为止,我正在编写包含ERROR: messageINFO: message等标记的文本日志文件。但是写太多信息会减慢代码的速度。我知道在Java开发中我们使用log4j库来高效地编写日志文件,我们可以打开或关闭各种级别的日志记录。因此,一旦代码干净,我们就可以关闭低级别日志并保留高级日志。

    我想知道其他程序员在Fortran 90 +中处理这个问题的最佳方法是什么。

4 个答案:

答案 0 :(得分:2)

最简单的方法是创建一个整数变量verbose并在执行时读取其值(从文件或通过命令行)。通过这样做,您可以创建不同的级别:

  • verbose = 0 =>没有输出
  • verbose = 1 =>仅错误
  • 详细> = 2 =>错误&信息

实施起来很简单:

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

等等。

答案 1 :(得分: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!'

这给我的文件和发生错误的行,并通过注释第一行我可以轻松地打开/关闭消息。

您可以轻松地将其扩展到不同的调试级别并写入文件......

答案 2 :(得分:0)

我见过人们在编译器级别实现日志记录的方式类似于Kyle Kanos的预处理器指令方法。不是fortran标准,但我知道可以用一些fortran编译器完成。

答案 3 :(得分:0)

我亲自创建了一个数据类型,该数据类型包含一个message(字符数组)和一个处理消息的过程指针。它不是最有效的系统,但是消息是通过write(io%message, fmt_statement) fmt_variables写入的,然后调用过程指针,即io%print(msgType, msgLog, message),例如io%print(error, debug, io%message)

type, private :: badLogger
   character(128), private :: message = ""

   ! Note here that IO is an abstract interface elsewhere
   ! and that defaultPrint is some printing procedure that
   ! matches the IO interface
   procedure(IO), private, pointer :: print => defaultPrint
end type badLogger

! Usage:
type(badLogger) :: io
write(io%message, *) "I love pizza!"
call io%print(comment, fun, io%message)

我最近读了pFLogger。该项目的GitHub页面为https://github.com/Goddard-Fortran-Ecosystem/pFlogger/blob/master(请参见https://ntrs.nasa.gov/archive/nasa/casi.ntrs.nasa.gov/20170011091.pdfhttps://ntrs.nasa.gov/archive/nasa/casi.ntrs.nasa.gov/20170011458.pdf),乍一看,它看起来非常有用。我还没有用过,但是我肯定会研究它的!

对不起,您的回复太迟了!希望这对某些人还是有帮助的!

相关问题