13_commandLine
Important
访问 https://aerosand.cn 以获取最近更新。
0. 前言
新同学很难不注意到求解器总是有几个固定的头文件,包括 setRootCase.H ,createTime.H 和 createMesh.H 。网络上找到的代码解析常常只有一句注释介绍功能,也许无法消除困惑感。该系列将分别讨论。
前文讨论了 C++ 中的命令行参数,本文将过渡到对 OpenFOAM 中命令行参数的讨论。在此之前,我们先看一下 setRootCase.H 文件。
本文主要讨论
- 理解 setRootCase.H 头文件
- 了解 argList 类
- 开发用户自定义命令行参数
- 编译运行 commandLine 项目
1. 项目准备
终端输入命令,建立项目
ofsp
foamNewApp ofsp_13_commandLine
cd ofsp_13_commandLine
cp -r $FOAM_TUTORIALS/incompressible/icoFoam/cavity/cavity debug_case
code .终端输入命令,测试初始求解器
wmake
ofsp_13_commandLine -case debug_case测试初始求解器没有问题,可以进一步开发。此步骤以后不再赘述。
终端输入命令,新建脚本和说明,并给脚本权限
code caserun caseclean READEME.md
chmod +x caserun caseclean脚本和说明参考前文讨论。除非有特别情况,不再赘述脚本和说明。
终端输入命令,查看文件结构如下
tree
.
├── caseclean
├── caserun
├── debug_case
│ ├── 0
│ │ ├── p
│ │ └── U
│ ├── constant
│ │ └── transportProperties
│ └── system
│ ├── blockMeshDict
│ ├── controlDict
│ ├── decomposeParDict
│ ├── fvSchemes
│ ├── fvSolution
│ └── PDRblockMeshDict
├── Make
│ ├── files
│ └── options
├── ofsp_13_commandLine.C
└── README.md
6 directories, 15 files除非有特别情况,不再赘述简单的文件结构。
2. setRootCase.H
API 页面 https://api.openfoam.com/2506/setRootCase_8H.html
我们可以通过终端查找该文件
find $FOAM_SRC -iname setRootCase.H使用 vscode 可以直接点击终端输出的文件路径打开该文件。
在 vscode 中可以通过 OFextension 直接跳转打开该文件。
为了方便理解,我们查阅一下 OpenFOAM 2.0x 版本的代码,
Github 仓库文件链接如下 https://github.com/OpenFOAM/OpenFOAM-2.0.x/blob/master/src/OpenFOAM/include/setRootCase.H
代码如下
| |
现代版本的代码具体如下
| |
很多求解器中也使用功能增强后的 setRootCaseLists.H ,其代码如下
// This is setRootCase, but with additional solver-related listing
#include "setRootCaseListOptions.H"
// 向求解器添加一系列用于查询和列表的命令行选项
#include "setRootCase.H" // 原始版本
#include "setRootCaseListOutput.H"
// 程序启动时,检查用户是否使用了这些选项,并执行相应的输出操作(例如,列出信息后退出程序)
该头文件既保持了基础功能的简洁性,又为需要使用这些高级功能的求解器(如后处理工具)提供了灵活的扩展能力。
比如,可以在终端中使用求解器和添加的命令行选项,如下
simpleFoam -listSwitches可以看到终端给出了所有的调试/优化开关。
读者可以自行探索阅读代码中提供的命令行选项。
3. argList类
类 Foam::argList是 OpenFOAM 中的基础类,具有很多的成员数据和成员方法。我们大概挑几处代码作为切入点简单了解一下 argList 类。
API 页面 https://api.openfoam.com/2506/argList_8H.html
我们可以通过终端查找该文件
find $FOAM_SRC -iname argList.H打开该类的声明 argList.H,内容如下
| |
关于成员函数 checkRootCase()的实现,需要去看同目录下的类的定义,即 argList.C 文件,摘取部分内容如下
| |
讨论到此,读者应该了解并明白setRootCase.H到底是检查什么目录了。
Tip
对于现阶段来说,读者不宜深挖代码。只要做到心里有数,可以理解且不陌生排斥即可。
更深入的代码讨论参见 ofsc(openfoam sharing coding) 系列。
4. 帮助信息
我们可以使用命令行参数实现一些功能。
在主函数上修改
| |
终端输入命令,编译并查看帮助信息
wmake
ofsp_13_commandLine -help终端输出如下
Usage: ofsp_13_commandLine [OPTIONS]
Options:
-case <dir> Case directory (instead of current directory)
-decomposeParDict <file>
Alternative decomposePar dictionary file
-parallel Run in parallel
-doc Display documentation in browser
-help Display short help and exit
-help-full Display full help and exit
Program for command line @ Aerosand
Solver options:
Calculation Accuracy - o1, o2, o3
Calculation Acceleration - 1, 2, 3
Using: OpenFOAM-2406 (2406) - visit www.openfoam.com
Build: _9bfe8264-20241212 (patch=241212)
Arch: LSB;label=32;scalar=64可以看到其中有自定义的帮助信息
5. 强制参数
强制参数在项目运行时必须输入,否则会有错误提醒。
在主函数上修改
| |
重新编译此项目。
终端输入命令,运行该项目
ofsp_13_commandLine -case debug_case/ o2 2终端输出如下
Create time
Solver setup:
Accuracy : o2
Acceleration : 2
ExecutionTime = 0 s ClockTime = 0 s
End可以想到,当我们拿到这些命令行参数,可以用来参与到项目的计算中。
6. 应用选项
应用选项在项目运行时可写可不写。
在主函数上修改
| |
重新编译此项目。
为该项目提供自定义字典。不使用代码中设置的字典默认路径,创建字典 /debug_case/constant/myDic
自定义字典如下
| |
终端输入命令,运行该项目
ofsp_13_commandLine -case debug_case/ o2 2 -dict ./debug_case/constant/myDict -nPrecision 16 -debug终端输出如下
Create time
Create mesh for time = 0
Solver setup:
Accuracy : o2
Acceleration : 2
Using custom dictionary: "./debug_case/constant/myDict"
Reading myDict
Dictionary from "./debug_case/constant/myDict"
mathLib : Eigen
tolerance : 1e-06
Setting nPrecision to 16
Debug mode enabled
ExecutionTime = 0 s ClockTime = 0 s
End7. 其他命令行
求解器头文件中还常见 postProcess.H 。该头文件主要用于在求解器或实用程序中集成后处理功能。它的核心作用是允许用户在模拟运行期间或之后,计算并输出额外的派生场(如涡量、流函数、梯度等),而无需单独运行后处理工具。
例如,可以在计算结束后,终端输入命令如下
postProcess -func vorticity这样可基于已保存的时间步计算涡量场,无需修改代码。
另外也可以在 controlDict 中增加 functions 模块,如
...
functions
{
vorticity
{
type vorticity;
libs (fieldFunctionObjects);
}
}这样可以使得求解器在每个写入时间步都会计算并输出涡量场。
另外,求解器头文件还常见 addCheckCaseOptions.H ,代码如下
Foam::argList::addDryRunOption
(
"Check case set-up only using a single time step"
);
Foam::argList::addBoolOption
(
"dry-run-write",
"Check case set-up and write only using a single time step"
);该头文件向求解器添加额外的标准命令行选项,主要用于检查算例设置的完整性而无需完整运行模拟。
例如,终端输入命令
simpleFoam -case debug_case -dry-run
// 仅检查算例设置,不运行求解
simpleFoam -case debug_case -dry-run-write
// 检查算例设置并写入初始场这些命令使用户能够快速发现设置错误,避免在完整运行到中途才发现问题。
8. 小结
本文一步一步讨论了 OpenFOAM 中命令行参数可能有的功能。虽然本文项目只是简单演示,相信读者可以在此讨论基础之上,理解 OpenFOAM 中的命令行参数,并为以后的自开发提供一些想法。
本文主要讨论
- 理解 setRootCase.H 头文件
- 了解 argList 类
- 开发用户自定义命令行参数
- 编译运行 commandLine 项目
支持我们
Tip
希望这里的分享可以对坚持、热爱又勇敢的您有所帮助。
如果这里的分享对您有帮助,您的评论、转发和赞助将对本系列以及后续其他系列的更新、勘误、迭代和完善都有很大的意义,这些行动也会为后来的新同学的学习有很大的助益。
赞助打赏时的信息和留言将用于展示和感谢。
