7

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

  1. 全局变量
  2. 13个具有多个子程序的模块
  3. 独立子程序
  4. 将英特尔 MKL 库用于 LAPACK 库(线性代数)
  5. 读取和写入文本文件

代码变得相当大。即使在这个阶段我试图得到正确的答案,代码的执行速度也是需要的。

我正在编写一个带有诸如ERROR: messageor INFO: messageso far 之类的标签的文本日志文件。但是写太多信息会减慢代码的速度。我知道在 Java 开发中,我们使用 log4j 库来有效地编写日志文件,我们可以在其中打开或关闭各种级别的日志记录。因此,一旦代码干净,我们就可以关闭低级别日志,只保留高级别日志。

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

4

4 回答 4

2

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

  • 详细 = 0 => 无输出
  • 详细 = 1 => 仅错误
  • 详细 >= 2 => 错误和信息

实现起来很简单:

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

等等。

于 2013-10-22T16:50:36.573 回答
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!'

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

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

于 2013-10-23T08:17:37.577 回答
1

我亲自创建了一个数据类型,其中包含一个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 ),乍一看似乎非常通用。我还没有使用它,但我肯定会研究它!

对严重延迟的回复深表歉意!希望这对某些人仍然有帮助!

于 2019-07-24T04:38:09.390 回答
0

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

于 2013-10-22T16:54:22.067 回答