openFOAM代码非常非常多,但是让人比较郁闷的是很多是基础类的实现,openFOAM中很多基础的类,包括char,string,int等等,都添加功能封装在了Foam这个名字域中。
好处就是同样使用int,可以比在C++使用更多的功能,坏处就是一个很简单的功能,依赖的文件数量惊人。
把这么多的封装全部读完总结完可能头发都白了,但是只把常用的拿出来总结一下是可以的,这篇帖子就是做这个工作,当然这里是针对chemFoam这个求解器。这个帖子会在编写其他帖子的过程中持续更新
基础类的源码组织特点
通常为一个xxx.H文件,外加一个xxxI.H文件,一个xxx.C文件。可能会出现的xxxIO.C文件,以及通过List类创建的xxxList.H文件,以及他们的IO处理,xxxIOList.H,以及他们的List创建的xxxListIOList.H或.C文件(大型套娃现场)。
但是总之都是一个基础类不断封装得到的,只要知道其中一个的套路就都明白了
xxxI.H文件通常为xxx.H文件中inline函数的具体实现
xxx.C文件通常为xxx.H文件中一般函数的具体实现
xxxIO.C文件是和IO相关的实现,例如>>和<<的重定义,以及readxxx这种函数的实现
xxxList.H其实是用List创建了新的类型,这里的List可以暂时理解成一个数组。例如:
typedef List<label> labelList;
typedef List<labelList> labelListList;
typedef List<labelListList> labelListListList;
(三重套娃现场)
xxxIOList.H和xxxIOList.C中前者为新类型typedef IOList<xxx> xxxIOList;,而后者为通过一系列的宏实现一些基础的函数功能,这些宏的说明会在其他帖子中解释
xxxListIOList.H就是typedef IOList<xxxList> xxxListIOList;
规律还是很明显的,看名字就可以大概了解文件中的内容。
int相关的类
分unsigned和一般两种,前者的文件最前有一个u字母,源文件有:
int32.C int32.H int32IO.C
int64.C int64.H int64IO.C
int.H intIO.H
label.H label.C labelList.H labelIOList.H labelIOList.C labelListIOLit.H
uint32.C uint32.H uint32IO.C
uint64.C uint64.H uint64IO.C
uint.H uintIO.H
uLabel.H uLabel.C
其中继承关系为int32 int64->int->label,其中32和64分别代表32bit和64bit的整数。他们分别使用int32_t和int64_t进行定义,并给定了和文件流相关的函数。
char相关的类
继承关系为char->string->word->wordRe fileName keyType。源文件有:
char.H charIO.C wchar.H wcharIO.c
string.H stringI.H string.C stringIO.C stringIOList.H stringIOList.C stringOps.H stringOps.C
word.H word.C wordI.H wordIO.C wordIOList.H wordIOList.C
wordRe.H wordRe.C wordReI.H wordList.H wordReList.H wordReListMatcher.H wordReListMatcherI.H
keyType.H keyTypeI.H keyType.C
fileName.H fileNameI.H fileName.C fileNameIO.C fileNameList.H
char直接使用了C语言内置的char,但是添加了和文件流操作相关的运算符和函数,这些话函数均可以独立调用。而wchar则使用了更多字节的编码形式(A wide-character and a pointer to a wide-character string)
string则使用了std:string在Foam的名字空间进行封装,添加了内置的变量typeName debug null,以及一系列的功能性函数。
word keyType fileName在均为string的子类,他们在string的基础上添加了更多的功能,使得他们可以用在更加具体的情形中。
bool相关的类
bool中有一个很重要的拓展类是Switch,这里也写在这里,他们的源文件如下:
bool.H bool.C boolIO.C boolList.H boolList.C
Switch.H Switch.C SwitchIO.C
其中bool类型也使用了C语言内置的bool类型,但是对文件流相关的操作符和函数进行了定义,可以直接调用。
而Switch的功能,在源文件中也有解释(A simple wrapper around bool so that it can be read as a word: true/false, on/off, yes/no, y/n, t/f, or none/any.),就是将bool类型写成rue/false, on/off, yes/no, y/n, t/f, or none/any的多个形式。另外其中添加了若干功能性函数和操作符重定向。
scalar相关的类
这里并没有定义新的类,而是使用了typedef,然后添加了一些新的功能:
typedef double doubleScalar;
typedef long double longDoubleScalar;
源文件如下:
Scalar.H Scalar.C
doubleFloat.H
doubleScalar.H doubleScalar.C
floatScalar.H floatScalar.C
longDoubleScalar.H longDoubleScalar.C
scalar.H scalar.C
scalarList.H scalarList.C
scalarIOList.H scalarIOList.C
scalarListIOList.H scalarListIOList.C
除去基本的文件流功能外,还添加了很多开方求三阶函数等等的功能。
OK!这部分先这样,这些是在其他源码中会大量会用的基础类型,在阅读其他代码前,最好了解这部分最基础的功能。










![[转]我国CAD软件产业亟待研究现状采取对策-卡核](https://www.caxkernel.com/wp-content/uploads/2024/07/frc-f080b20a9340c1a89c731029cb163f6a-212x300.png)

