18_fieldCal
Important
访问 https://aerosand.cn 以获取最近更新。
0. 前言
基于前面的讨论,我们练习一个简单场计算的案例。
本文主要讨论
- 为计算增加简单的物理场
- 以 OpenFOAM 的方式管理物理场
- 练习开发库
- 编译运行 fieldCal 项目
1. 项目准备
终端输入命令,建立项目
ofsp
foamNewApp ofsp_18_fieldCal
cd ofsp_18_fieldCal
cp -r $FOAM_TUTORIALS/incompressible/icoFoam/cavity/cavity debug_case
code .测试初始求解器,提供脚本(参考前文脚本)和说明。
2. 增加物理场
拷贝过来的测试算例并没有温度场,我们给算例添加初始温度场。
2.1. 温度场
温度和压力一样是标量,可以通过拷贝压力场文件,修改后得到温度场文件。
终端输入命令,准备温度场文件
cp -r debug_case/0/p debug_case/0/T
code debug_case/0/T修改后得到的温度场文件为
| |
2.2. 主源码
主源码修改为
| |
2.3. 编译运行
编译运行此项目(注意不要清除温度场文件)。
终端输出如下
Create time
Create mesh for time = 0
Reading transportProperties
Reading field p
Reading field T
Reading field U
Reading/calculating face flux field phi
Starting time loop
Time = 0.005
Time = 0.01
Time = 0.015
Time = 0.02
...
Time = 0.49
Time = 0.495
Time = 0.5
Calculation done.
ExecutionTime = 0.02 s ClockTime = 0 s
End终端输入命令,对计算结果可视化
paraFoam -case debug_case注意到 debug_case/ 的时间步文件夹下出现了新时间步的场文件,以 debug_case/0.3/ 为例,其包含的计算结果文件如下
debug_case/0.3
├── gradT
├── p
├── phi
├── T
├── U
├── uniform
│ ├── functionObjects
│ │ └── functionObjectProperties
│ └── time
├── zeroScalarField
└── zeroVectorField可以查看各个场文件中的计算结果数值。
Warning
打开 0.3/phi 可以看到并没有计算更新值,其他非 p,U 文件也没有计算更新值。这是因为场在创建时候给定的计算公式只是初始化,并不会随着时间推进而计算更新。所以,需要在主源码的时间循环中去计算需要的场。
3. 项目整理
在 OpenFOAM 实际应用中,一般的
- 场的接入应放入单独的文件 createFields.H
- OpenFOAM 本身提供 createPhi.H
- 自定义方法也放入单独文件,如 calculatePressure.H
所以该应用的文件结构调整后为
tree -L 1
.
├── calculatePressure.H
├── caseclean
├── caserun
├── createFields.H
├── debug_case
├── Make
└── ofsp_18_fieldCal.C3.1. createFields.H
场接入文件 createFields.H 为
| |
3.2. calculatePressure.H
自定义方法 calculatePressure.H 为
| |
3.3. 主源码
主源码整理为
| |
3.4. 编译运行
编译运行,可以看到结果是一样的。
项目整理后,
- 主源码功能划分非常清晰
- 每个功能都更加易于维护
4. 开发库
当某一类方法的实现可以保留为特定功能以便后续使用,所以可以将它们固定为开发库,以供各种项目随时调用。
回忆参考之前的讨论 https://aerosand.cc/docs/ofs/ofsp/03_wmake/
4.1. 开发库代码
我们建立开发库 computeVelocityPressure 并提供相应文件。
终端输入命令,建立开发库
foamNewApp calculateVelocityPressure建立开发库后,项目的文件结构为
.
├── calculateVelocityPressure
│ ├── calculateVelocityPressure.C
│ ├── calculateVelocityPressure.H
│ └── Make
│ ├── files
│ └── options
├── caseclean
├── caserun
├── createFields.H
├── debug_case
│ ├── 0.org
│ │ ├── p
│ │ ├── T
│ │ └── U
│ ├── constant/
│ └── system/
├── Make
│ ├── files
│ └── options
└── ofsp_18_fieldCal.C开发库声明 calculateVelocityPressure.H 为
| |
开发库定义 calculateVelocityPressure.C 为
| |
4.2. 开发库 Make
开发库 Make/files 内容为
calculateVelocityPressure.C
LIB = $(FOAM_USER_LIBBIN)/libcalculateVelocityPressure开发库 Make/options 内容为
EXE_INC = \
-I$(LIB_SRC)/finiteVolume/lnInclude \
-I$(LIB_SRC)/meshTools/lnInclude
EXE_LIBS = \
-lfiniteVolume \
-lmeshTools该库,强调是这个库,在编译的时候,不会使用到其他更多的库,所以 options 中有这些基础库就够了,不需要另外增加。
4.3. 开发库编译
终端输入命令,编译开发库
wmake calculateVelocityPressure终端提示开发库编译成功,可以供项目使用。
4.4. 场的接入
保持 createFields.H 代码不变。
4.5. 主源码
主源码 ofsp_18_fieldCal.C 修改为
| |
4.6. 项目 Make
项目 Make/files 内容为
ofsp_18_fieldCal.C
EXE = $(FOAM_USER_APPBIN)/ofsp_18_fieldCal项目 Make/options 内容为
EXE_INC = \
-I$(LIB_SRC)/finiteVolume/lnInclude \
-I$(LIB_SRC)/meshTools/lnInclude \
-IcalculateVelocityPressure/lnInclude
EXE_LIBS = \
-lfiniteVolume \
-lmeshTools \
-L$(FOAM_USER_LIBBIN) -lcalculateVelocityPressure注意开发库的处理,既要“包含”,也要“链接”。既然指明”路径“,也要指明”名称“。
4.7. 编译运行
编译运行项目。
终端输出如下
Create time
Create mesh for time = 0
Reading transportProperties
Reading field p
Reading field T
Reading field U
Reading/calculating face flux field phi
This is a test
Starting time loop
Time = 0.005
Time = 0.01
Time = 0.015
Time = 0.02
...
Time = 0.49
Time = 0.495
Time = 0.5
ExecutionTime = 0.02 s ClockTime = 0 s
End4.8. 后处理
我们同样可以通过 paraview 可视化计算结果。
终端输入命令,可视化计算结果。
paraFoam -case debug_case5. 小结
回顾之前的讨论,我们大概可以感受到数值计算的核心要素所在——时间、网格、物理场。有了这些工具之后,我们便可以将数学物理模型构建为数学方程,从而组建线性代数方程,进行数值求解。不要着急,我们距离求解器编程越来越近了。
本文完成讨论
- 为计算增加简单的物理场
- 以 OpenFOAM 的方式管理物理场
- 练习开发库
- 编译运行 fieldCal 项目
支持我们
Tip
希望这里的分享可以对坚持、热爱又勇敢的您有所帮助。
如果这里的分享对您有帮助,您的评论、转发和赞助将对本系列以及后续其他系列的更新、勘误、迭代和完善都有很大的意义,这些行动也会为后来的新同学的学习有很大的助益。
赞助打赏时的信息和留言将用于展示和感谢。
