05_vector
Important
访问 https://aerosand.cn 以获取最近更新。
0. 前言
上一篇浏览了几个常见的基础类,本文尝试讨论 vector 类的部分细节,帮助读者熟悉开发流程、工具使用、编译原理。
本文主要讨论
- 练习源码的查阅
- 讨论 vector 类的部分代码实现
- 理解原生库的使用
- 编译运行 vector 项目
1. Vector 类
API 页面 https://api.openfoam.com/2506/classFoam_1_1Vector.html
终端输入命令,本地查找
find $FOAM_SRC -iname vector终端输入命令,打开该类的文件夹
code $FOAM_SRC/OpenFOAM/primitives/Vector该类的文件结构如下
tree -L 1
.
├── bools/
├── complex/
├── floats/
├── ints/
├── lists/
├── Vector.H
└── VectorI.H阅读 Vector.H 的代码描述可知,该类是 3D Vector 的模板类,继承自 VectorSpace 类并添加封装了 3 分量的构造、分量元素的接口函数、点积和叉积的等方法。
具体到 Vector.H 的代码,简单方法在代码中直接实现,复杂方法则大量使用内联函数(inline function)以提高代码性能。OpenFOAM 特别提供 VectorI.H 文件来写内联函数的实现。
进入 Vector/int 文件夹,查看 Vector/ints/labelVector.H 代码
...
typedef Vector<label> labelVector;
...进入 Vector/floats 文件夹,查看 Vector/floats/vector.H 代码
| |
可以看到,代表不同数据类型的文件夹 /bools , /complex , /floats ,/ints ,/lists 都是 Vector 模板类对不同基本数据类型的 typedef ,也就是类型别名。
Warning
暂不深究代码的所有细节
2. 源码讨论
2.1. 声明
查阅 Vector/Vector.H 代码,我们分段讨论
API 页面 https://api.openfoam.com/2506/Vector_8H_source.html
Tip
API 的代码页可以点击跳转到不同的头文件、类、函数等。
| |
2.2. 内联
很多方法的定义在内联文件中
API 页面 https://api.openfoam.com/2506/VectorI_8H_source.html
查阅 Vector/VectorI.H 代码
| |
Warning
上面这些代码讨论主要是为了帮助读者熟悉 C++ 语言在 OpenFOAM 中的使用,克服对 C++ 语言的陌生和恐惧,便于读者理解后续实践的代码。暂时不需要花费更多时间去阅读更多 OpenFOAM 的源代码,也不需要深究代码细节,后续会在 ofsc 系列讨论代码。
3. 项目构建
终端输入命令,建立本文项目
ofsp
mkdir ofsp_05_vector
code ofsp_05_vector继续使用终端命令或者使用 vscode 界面创建其他文件,最终文件结构如下
tree
.
├── Aerosand
│ ├── Aerosand.C
│ ├── Aerosand.H
│ └── Make
│ ├── files
│ └── options
├── Make
│ ├── files
│ └── options
└── ofsp_05_vector.C4. 开发库
4.1. 库源码
代码 Aerosand.H 为
| |
代码 Aerosand.C 为
| |
4.2. 库 Make
库 Make/files 为
Aerosand.C
LIB = $(FOAM_USER_LIBBIN)/libAerosand开发库没有其他依赖,库 Make/options 为空
4.3. 库编译
终端输入命令,进行库的编译
wclean Aerosand
wmake Aerosand5. 主项目
5.1. 主源码
代码 ofsp_05_vector.C 为
| |
5.2. 项目 Make
项目 Make/files 为
ofsp_05_vector.C
EXE = $(FOAM_USER_APPBIN)/ofsp_05_vector因为我们包含了 vector.H ,路径为 $FOAM_SRC/OpenFOAM/primitives/Vector/floats/vector.H。由 Make 文件的位置能判断,该文件属于 OpenFOAM 库,路径为 $FOAM_SRC/OpenFOAM。归属关系如下。
$FOAM_SRC/OpenFOAM
├── lnInclude/
├── ...
├── Make
│ ├── files
│ └── options
└── primitives
├── ...
└── Vector
├── ...
├── floats
│ ├── ...
│ └── vector.H
├── Vector.H
└── VectorI.H原则上,我们应该在项目 Make/options 中包含 OpenFOAM 库。实际上,OpenFOAM 的构建系统(wmake)已经自动处理原生必备库的依赖关系。我们只需要添加第三方库、自己开发的库、某些可选模块的库即可。
Important
$FOAM_SRC/OpenFOAM 库已经自动依赖,其中类的使用均无需用户再次链接。
项目 Make/options 为
EXE_INC = \
-IAerosand/lnInclude
EXE_LIBS = \
-L$(FOAM_USER_LIBBIN) \
-lAerosand6. 编译运行
终端输入命令,编译运行该项目
wclean
wmake
ofsp_05_vector运行结果如下
3.14 * (1 2 3) = (3.14 6.28 9.42)
distance: 1.73205
normalise: (0.267261 0.534522 0.801784)
inner product: 5.34522
inner product: 5.34522
cross product: (-0.267261 0.534522 -0.267261)
cross product: (-0.267261 0.534522 -0.267261)
Hi, OpenFOAM! Here we are.
1 + 3.14159 = 4.14159
1 * 3.14159 = 3.14159
Current time step is : 0.27. 小结
本文完成讨论
- 练习源码的查阅
- 讨论 vector 类的部分代码实现
- 理解原生库的使用
- 编译运行 vector 项目
支持我们
Tip
希望这里的分享可以对坚持、热爱又勇敢的您有所帮助。
如果这里的分享对您有帮助,您的评论、转发和赞助将对本系列以及后续其他系列的更新、勘误、迭代和完善都有很大的意义,这些行动也会为后来的新同学的学习有很大的助益。
赞助打赏时的信息和留言将用于展示和感谢。
