openFOAM代码阅读——基础代码中的char

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。这里首先定义了两个新的类IstreamOstream,并给出了四个函数声明,以及一个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再赋值给breturn的技巧可以让我们的重定义运算可以连续使用,《Essential C++》提到了这一技巧,笔者以前的博客中有提到。

第三第四个函数其实是同一个运算符<<的重定义,只不过根据输入的是char本身还是&char进行了多态,对如下用法:

Os<

相当于现将a输入文件流,再将b输入文件流。

你可能感兴趣的:(openFOAM)