08_io
Important
访问 https://aerosand.cn 以获取最近更新。
0. 前言
通过第一阶段的 8 篇讨论,相信读者已经对 OpenFOAM 的项目架构和编译原理已经有了一定的理解。接下来我们进一步讨论求解器项目必须的一些基础。
Tip
需要重申目前阶段 OpenFOAM 初学者的 C++ 学习的个人建议。
- 需要做的是: 先学习 C++ 面向对象基础,然后不断学习 C++,逐渐深入,在不断的实践中积累 C++ 经验。
- 不需要做: 暂时不需要掌握 C++ 高级特性,暂时不需要学习复杂算法,不能等学完 C++ 再开始 OpenFOAM。
本文主要讨论
- 了解 OpenFOAM 的信息写入写出
- 实现 C++ 方式的信息写入写出
- 编译运行 io 项目
1. 参考 OF 的写入写出
我们知道 C++ 可以通过输入输出流来实现信息的写入写出,下面我们查看一下 OpenFOAM 写入写出的数据格式。
终端输入命令,前往 run 文件夹路径
run如果终端提示缺少此文件夹
终端输入命令,创建 run 文件夹,并来到此文件夹路径
mkdir -p $WM_PROJECT_USER_DIR/run
run终端输入命令,拷贝原生算例 cavity 到 run 文件夹路径
cp -r $FOAM_TUTORIALS/incompressible/icoFoam/cavity/cavity .终端输入命令,通过 vscode 打开算例,查看其中的文件
code cavity1.1. 写入文件
在 vscode 终端中输入命令,查看算例的文件结构以及初始文件
tree终端输入如下
.
├── 0
│ ├── p
│ └── U
├── constant
│ └── transportProperties
└── system
├── blockMeshDict
├── controlDict
├── decomposeParDict
├── fvSchemes
├── fvSolution
└── PDRblockMeshDict文件解释如下
- 文件夹
0/是算例的初始场文件(即时间为 0 的时间步)- 比如包含此算例的压力场 p 和速度场 U
- 均包含相应的内部场和边界条件
- 文件夹
constant/是几何、物理等相关的写入字典- 这里的“字典”是 OpenFOAM 的写入文件格式,可以简单理解成 OpenFOAM 的写入文件
- 比如包含
transportProperties文件,一般指定流体的粘度、扩散系数等物理参数 - 稍后生成的网格信息文件将保存在此文件夹
- 文件夹
system/是控制计算的写入字典- 比如包含
blockMeshDict文件,指定稍后网格生成的参数 - 比如包含
controlDict文件,指定时间步长、起止时间等参数 - 比如包含
fvSchemes文件,指定空间时间的离散格式等 - 比如包含
fvSolution文件,指定求解器选择、松弛因子等 - 其他字典文件暂不深究
- 比如包含
使用 vscode 查看 transportProperties 字典
| |
使用 vscode 查看 controlDict 字典
| |
简单来说,原生算例里的所有文件(包括稍后其中生成的网格信息)都是写入文件,其中的信息将传输进入 OpenFOAM 的应用。
1.2. 写出文件
我们快速计算该算例
终端输入命令,划分网格并计算
blockMesh
icoFoam终端输入命令,查看计算后的文件结构
tree -L 2
.
├── 0
│ ├── p
│ └── U
├── 0.1
│ ├── p
│ ├── phi
│ ├── U
│ └── uniform
...
├── 0.5
│ ├── p
│ ├── phi
│ ├── U
│ └── uniform
├── constant
│ ├── polyMesh
│ └── transportProperties
└── system
├── blockMeshDict
├── controlDict
├── decomposeParDict
├── fvSchemes
├── fvSolution
└── PDRblockMeshDict可以看到计算后,结果以字典中指定的方式 0.005*20=0.1s,每隔 0.1 秒存储一次,直到 0.5 秒停止。保存的内容也由求解器确定,比如 phi 等,暂不深究。另外也能看到网格划分后保存的网格信息 polyMesh 文件夹。
我们以 0.5/ 文件夹中的速度场结果为例,查看其数据格式
| |
Tip
整个过程即:
- 从外部文件向项目写入信息
- 项目运行(计算)
- 从项目向外部文件写出信息
2. C++ 方式实现写入写出
在初学的时候我们就知道 C++ 提供 iostream 标准库,包含 cin 和 cout 方法,用于从标准输入中读取信息流,或者从标准输出中写入信息流。除此之外,C++ 还提供 fstream 标准库,用于外部文件和信息流之间的交互。
ofstream表示输出文件流,用于创建文件并向文件写入信息ifstream表示输入文件流,用于从文件读取信息fstream表示通用文件流,同时具有写入写出的方法
我们使用 C++ 的方式去实现写入写出。
2.1. 项目准备
终端输入命令,建立本文项目
ofsp通过 vscode 的 C/C++ Project Generater 打开此项目。
终端输入命令,测试项目模板
make run可以看到项目运行结果,说明项目初始模板没有问题。
2.2. 主源码
我们通过该项目模拟求解器读取算例字典文件的参数。
主源码 ofsp_08_io/src/main.cpp 内容如下
| |
2.3. 说明文件
因为目前的项目较为简单,读者可以根据自己的需要准备说明文件。不再赘述。
2.4. 编译运行
终端输入命令,检查编译
make终端输出命令
g++ -std=c++17 -Wall -Wextra -g -Iinclude -c -MMD src/main.cpp -o src/main.o
src/main.cpp: In function ‘int main(int, char**)’:
src/main.cpp:6:14: warning: unused parameter ‘argc’ [-Wunused-parameter]
6 | int main(int argc, char *argv[])
| ~~~~^~~~
src/main.cpp:6:26: warning: unused parameter ‘argv’ [-Wunused-parameter]
6 | int main(int argc, char *argv[])
| ~~~~~~^~~~~~
g++ -std=c++17 -Wall -Wextra -g -Iinclude -o output/main src/main.o -Llib
Executing all complete!可以看到终端输出的信息提醒 warning: unused parameter ‘argc’ ,我们确实没有使用 argc ,所以不用在意。最后提醒 Executing all complete! 表示编译成功,没有问题。
我们在该项目的根目录下提供类似 OpenFOAM 字典的文件。ofspProperties 文件内容如下(路径为 /ofsp/ofsp_08_io/ofspProperties)
nu 0.01
application laplacianFoam
deltaT 0.005
writeInterval 20
purgeWrite 0终端输入命令,运行此项目
./output/main或者重新编译并运行
make clean
make run终端输出信息如下
nu 0.01
application laplacianFoam
deltaT 0.005
writeInterval 20
purgeWrite 0我们可以看到每一项外部文件的关键词后的参数都被读入了程序,意味着这些参数都可以参与到项目的计算中,项目最终将结果写出。
写出的文件 U 同样在项目根目录下,内容如下
| |
格式和 OpenFOAM 的输出速度场的格式类似。
3. 小结
通过这个项目,我们可以简单理解, OpenFOAM 求解器是如何通过字典文件拿到参数指定的值。这些参数参与项目计算。之后,项目将计算结果写出到外部文件。写出的文件本质上是符合 OpenFOAM 格式要求,符合后处理软件格式要求,等待进一步分析的数据文件。
本文完成讨论
- 了解 OpenFOAM 的信息写入写出
- 实现 C++ 方式的信息写入写出
- 编译运行 io 项目
支持我们
Tip
希望这里的分享可以对坚持、热爱又勇敢的您有所帮助。
如果这里的分享对您有帮助,您的评论、转发和赞助将对本系列以及后续其他系列的更新、勘误、迭代和完善都有很大的意义,这些行动也会为后来的新同学的学习有很大的助益。
赞助打赏时的信息和留言将用于展示和感谢。
