调试
调试是一门艺术。每个人都有自己喜欢的方法。在这里,我们提供一些我们认为有用的提示。
在调试模式下编译(例如,对于 gmake 用户使用 make DEBUG=TRUE
; 对于 cmake 用户使用 cmake -DCMAKE_BUILD_TYPE=Debug
)并在输入文件中运行 amrex.fpe_trap_invalid=1
可能会有帮助。在调试模式下,许多编译器调试标志会被启用,所有的 MultiFab
都会初始化为信号 NaN。参数 amrex.fpe_trap_invalid
会在发生浮点异常时生成回溯文件。然后可以检查这些文件以追踪问题的来源。
查看数据的其他几种方法包括:
将
MultiFab
写入磁盘
VisMF::Write(const FabArray<FArrayBox>& mf, const std::string& name);
并使用 Amrvis
检查它(请参阅 AMReX 文档中的
Amrvis 部分)。
您还可以使用
print_state
例程:
void print_state(const MultiFab& mf, const IntVect& cell, const int n=-1);
它会输出单个单元格的数据。
如果您想比较旧的和新的绘图文件,
fcompare --infile1 plt00000_run1 --infile2 plt00000_run2 --diffvar u_g
将打印出两个绘图文件之间每个变量的最大绝对和相对差异,还会创建一个新的绘图文件 “diffs”,其中包含两个绘图文件之间 u_g 的差异(在这种情况下)。
fcompare
可执行文件可以在 AMReX 中构建(转到 amrex/Tools/Plotfile 并输入 “make”)。
Valgrind 是另一个有用的调试工具。注意,对于使用多个 MPI 进程的运行,可以让 Valgrind 为不同的进程输出到不同的文件。例如,
mpiexec -n 4 valgrind --leak-check=yes --track-origins=yes --log-file=vallog.%p ./mfix.exe ...