OpenFOAM Sharing Programming 开发编程基础06 开发库
参考:
- https://github.com/UnnamedMoose/BasicOpenFOAMProgrammingTutorials
- https://www.topcfd.cn/simulation/solve/openfoam/openfoam-program/
- https://www.tfd.chalmers.se/~hani/kurser/OS_CFD/
- https://github.com/ParticulateFlow/OSCCAR-doc/blob/master/openFoamUserManual_PFM.pdf
- https://www.youtube.com/watch?v=KB9HhggUi_E&ab_channel=UCLOpenFOAMWorkshop
- http://dyfluid.com/#
- https://ss1.xrea.com/penguinitis.g1.xrea.com/study/OpenFOAM/index.html
感谢原作者们的无私引路和宝贵工作。
OpenFOAM 中,当某一些类实现某个特定的功能,可以把它们开发成库。
对“类”“库”链接有疑问的,请参考 OpenFOAM开发编程基础00 基本实现和开发 | 𝓐𝓮𝓻𝓸𝓼𝓪𝓷𝓭 (aerosand.cn)
我们将上篇讨论中的压力场、速度场的伪计算开发成独立的库,然后在应用中调用它,当然开发库也可以被任何应用调用。
建立本文的项目文件夹并进入
1 | // terminal |
应用准备
1 | // terminal |
在应用文件夹中新建开发库
1 | // terminal |
脚本和说明
略。
文件结构
整个应用的文件结构如下
1 | |- 06_01_devLib/ |
开发库
头文件
头文件 /userApp/computeVelocityPressure/computeVelocityPressure.H
,内容如下
1 |
|
- 各个函数的原型
- 为什么开发库的头文件要包含
fvCFD.H
?读者可以尝试注释掉这行,重新编译,并阅读报错信息。这样可以加深对fvCFD.H
文件内容的理解。
源代码
源文件 /userApp/computeVelocityPressure/computeVelocityPressure.C
,我们采用更“OpenFOAM”风格的实现方式,内容如下
注意和 OpenFOAM开发编程基础05 场的基本操作 | 𝓐𝓮𝓻𝓸𝓼𝓪𝓷𝓭 (aerosand.cn) 比较各个函数的实现
1 |
|
也许会有同学对比数据类型有困惑,比如
scalar
类型和volScalarField
类型。简单理解就是,scalar
只是一个值,而volScalarField
是一组数据,包含了计算域内所有离散点的scalar
值,相当于是一个矩阵,也就是表示了一个“场”。
库 Make
/userApp/computeVelocityPressure/Make/files
内容如下
1 | computeVelocityPressure.C |
- 注意
LIB
关键字的变化
/userApp/computeVelocityPressure/Make/options
1 | EXE_INC = \ |
- 该库,强调是这个库,在编译的时候,不会使用到其他更多的库,所以
options
中有这些基础库就够了,不需要修改
编译
终端使用命令
1 | // terminal |
- 这个库也是独立的,可以被其他任何应用调用,只要写对调用路径
createFields.H
创建场 /userApp/createFields.H
,内容上和上一篇讨论的场文件相同
1 | Info<< "Reading transportProperties\n" << endl; |
主源码
主源码 /userApp/06_01_devLib.C
,内容如下
1 |
|
应用 Make
/userApp/Make/files
1 | 06_01_devLib.C |
/userApp/Make/options
1 | EXE_INC = \ |
- 注意开发库的处理,既要“包含”,也要“链接”。
编译运行
1 | wmake |
运行结果如下
1 | Create time |
我们也可以通过 paraview
打开查看计算结果。
1 | // terminal |
小结
研究中涉及到的通用方法可以抽象成开发库,但是初学者不能追求把方法都写成开发库,具体问题应当具体对待。通过本篇讨论,最主要的还是熟悉代码架构和代码语法。
此外,编程中注意单位统一,注意数据类型统一。