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!这部分先这样,这些是在其他源码中会大量会用的基础类型,在阅读其他代码前,最好了解这部分最基础的功能。
暂无评论内容