openFOAM的源码文件夹src
中的内容如下:
dyfluid@dyfluid:~/OpenFOAM/OpenFOAM-7/src$ ls
Allwmake genericPatchFields rigidBodyDynamics
atmosphericModels lagrangian rigidBodyMeshMotion
combustionModels mesh rigidBodyState
conversion meshTools sampling
dummyThirdParty ODE semiPermeableBaffle
dynamicFvMesh OpenFOAM sixDoFRigidBodyMotion
dynamicMesh OSspecific sixDoFRigidBodyState
engine parallel surfMesh
fileFormats Pstream thermophysicalModels
finiteVolume radiationModels topoChangerFvMesh
functionObjects randomProcesses transportModels
fvAgglomerationMethods regionCoupled triSurface
fvMotionSolver regionModels TurbulenceModels
fvOptions renumber waves
我们实际上比较关注的是其中的combustion
相关的文件夹,但是为了读懂那个文件夹之前,我们需要先了解openFOAM的底层实现,即文件夹OpenFOAM
。进入这个文件夹后,可以得到如下内容:
dyfluid@dyfluid:~/OpenFOAM/OpenFOAM-7/src/OpenFOAM$ ls
algorithms dimensionedTypes global interpolations matrices primitives
containers dimensionSet graph lnInclude memory
db fields include Make meshes
这其中的primitives
为多个文件夹最终引用的文件所在位置,那么我们从这里开始,内容如下:
dyfluid@dyfluid:~/OpenFOAM/OpenFOAM-7/src/OpenFOAM/primitives$ ls
Barycentric hashes Random SymmTensor
Barycentric2D ints ranges SymmTensor2D
bools MatrixSpace RowVector Tensor
chars nil Scalar Tensor2D
complex nullObject septernion transform
contiguous one spatialVectorAlgebra triad
demandDrivenEntry ops SphericalTensor Tuple2
DiagTensor Pair SphericalTensor2D Vector
direction polynomialEqns strings Vector2D
functions pTraits subModelBase VectorSpace
globalIndexAndTransform quaternion Swap zero
本次阅读的是其中的chars/char
文件夹,其中包含两个文件:
char.H charIO.C
其中char.H
的内容如下:
namespace Foam
{
class Istream;
class Ostream; //并非iostream中的流函数,而是在Foam这个名字空间的输出
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
char readChar(Istream&);
Istream& operator>>(Istream&, char&);
Ostream& operator<<(Ostream&, const char);
Ostream& operator<<(Ostream&, const char*);
inline bool isspace(char c)
{
return
(
c == ' '
|| c == '\\n'
|| c == '\\r'
|| c == '\\t'
);
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
}
首先是名字空间的定义,这里使用了一个新的名字空间Foam
。这里首先定义了两个新的类Istream
和Ostream
,并给出了四个函数声明,以及一个inline
函数,inline
函数的作用是判断一个char
类型是否是空格space
。
我们再来看这几个函数的具体实现,他们在当前文件夹的charIO.C
中,主要内容如下:
#include "char.H"
#include "IOstreams.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
char Foam::readChar(Istream& is)
{
char c;
is.read(c);
return c;
}
Foam::Istream& Foam::operator>>(Istream& is, char& c)
{
is.read(c);
is.check("Istream& operator>>(Istream&, char&)");
return is;
}
Foam::Ostream& Foam::operator<<(Ostream& os, const char c)
{
os.write(c);
os.check("Ostream& operator<<(Ostream&, const char)");
return os;
}
Foam::Ostream& Foam::operator<<(Ostream& os, const char* s)
{
os.write(s);
os.check("Ostream& operator<<(Ostream&, const char*)");
return os;
}
其中使用了一个我们这里没有的头文件IOstreams.H
,它位于文件夹src/OpenFOAM/db/IOstreams
,这里我们先不管它的具体内容,直接阅读。
第一个函数readChar
的作用是读取文件流中的一个char
,然后check
是否合法(具体是怎么check以后去那个文件夹看),然后将读取的结果作为函数的返回值返回。
第二个函数,其实是一个运算符>>
的重定义,比如如下:
Foam::Istream Is;
char a;
...
Is>>a>>b;
就代表读取文件流中的一个char
,然后将它赋值给a
,同时return
,可以再继续将文件流中的下一个char
再赋值给b
。return
的技巧可以让我们的重定义运算可以连续使用,《Essential C++》提到了这一技巧,笔者以前的博客中有提到。
第三第四个函数其实是同一个运算符<<
的重定义,只不过根据输入的是char
本身还是&char
进行了多态,对如下用法:
Os<<a<<b;
相当于现将a
输入文件流,再将b
输入文件流。
暂无评论内容