调试

调试是一门艺术。每个人都有自己喜欢的方法。在这里,我们提供一些我们认为有用的提示。

在调试模式下编译(例如,对于 gmake 用户使用 make DEBUG=TRUE; 对于 cmake 用户使用 cmake -DCMAKE_BUILD_TYPE=Debug)并在输入文件中运行 amrex.fpe_trap_invalid=1 可能会有帮助。在调试模式下,许多编译器调试标志会被启用,所有的 MultiFab 都会初始化为信号 NaN。参数 amrex.fpe_trap_invalid 会在发生浮点异常时生成回溯文件。然后可以检查这些文件以追踪问题的来源。

查看数据的其他几种方法包括:

  1. MultiFab 写入磁盘

VisMF::Write(const FabArray<FArrayBox>& mf, const std::string& name);

并使用 Amrvis 检查它(请参阅 AMReX 文档中的 Amrvis 部分)。

  1. 您还可以使用 print_state 例程:

void print_state(const MultiFab& mf, const IntVect& cell, const int n=-1);

它会输出单个单元格的数据。

  1. 如果您想比较旧的和新的绘图文件,

fcompare --infile1 plt00000_run1 --infile2 plt00000_run2 --diffvar u_g

将打印出两个绘图文件之间每个变量的最大绝对和相对差异,还会创建一个新的绘图文件 “diffs”,其中包含两个绘图文件之间 u_g 的差异(在这种情况下)。

fcompare 可执行文件可以在 AMReX 中构建(转到 amrex/Tools/Plotfile 并输入 “make”)。

  1. Valgrind 是另一个有用的调试工具。注意,对于使用多个 MPI 进程的运行,可以让 Valgrind 为不同的进程输出到不同的文件。例如,

mpiexec -n 4 valgrind --leak-check=yes --track-origins=yes --log-file=vallog.%p ./mfix.exe ...