Code of the Week #24: singlePhaseTransportModel laminarTransport(U, phi)

#201911

程序段来源版本 foam-extend-3.1

接下来这两次,我们将要来讨论一下以下的语句,一般来说,类似的两行是成对出现的。这一段程序取自 pisoFoam/createFields.H.

    singlePhaseTransportModel laminarTransport(U, phi);

    autoPtr<incompressible::turbulenceModel> turbulence
    (
        incompressible::turbulenceModel::New(U, phi, laminarTransport)
    );

我们这一次先看第一行:

    singlePhaseTransportModel laminarTransport(U, phi);

直接的意思是定义了以 laminarTransport 为名的 singlePhaseTransportModel 类的实例。这个 singlePhaseTransportModel 的类的定义在 src/transportModels/incompressible/singlePhaseTransportModel/,这里,我们先对 singlePhaseTransportModel.H 进行解析:

#ifndef singlePhaseTransportModel_H
#define singlePhaseTransportModel_H

#include "incompressible/transportModel/transportModel.H" // 传输模型
#include "autoPtr.H"                                      // 智能指针

// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

namespace Foam
{

class viscosityModel;

/*---------------------------------------------------------------------------*\
                Class singlePhaseTransportModel Declaration
\*---------------------------------------------------------------------------*/

class singlePhaseTransportModel                      // 定义
:
    public transportModel                            // 继承 transportModel 
{
    // Private Data

        autoPtr<viscosityModel> viscosityModelPtr_;


    // Private Member Functions

        //- Disallow copy construct
        singlePhaseTransportModel(const singlePhaseTransportModel&);

        //- Disallow default bitwise assignment
        void operator=(const singlePhaseTransportModel&);


public:

    // Constructors

        //- Construct from components
        singlePhaseTransportModel                       // 从 U 和 phi 构造
        (
            const volVectorField& U,
            const surfaceScalarField& phi
        );


    // Destructor

        virtual ~singlePhaseTransportModel();


    // Member Functions

        //- Return the laminar viscosity
        virtual const volScalarField& nu() const;          // 传回运动粘度,虚函数,需要在派生类中重新定义

        //- Correct the laminar viscosity
        virtual void correct();                            // 修正粘度

        //- Read transportProperties dictionary
        virtual bool read();                               // 读取 transportProperties 字典文件
};


// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

} // End namespace Foam

// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

#endif

相应的 singlePhaseTransportModel.C 中构造函数

singlePhaseTransportModel::singlePhaseTransportModel
(
    const volVectorField& U,
    const surfaceScalarField& phi
)
:
    transportModel(U, phi),
    viscosityModelPtr_(viscosityModel::New("nu", *this, U, phi)) // 使用了粘度模型指针
{}

其中 transportModel(U, phi) 的来源为 src/transportModels/incompressible/transportModel 中 transportModel.C 的定义为

transportModel::transportModel
(
    const volVectorField& U,
    const surfaceScalarField& phi
)
:
    IOdictionary
    (
        IOobject
        (
            "transportProperties",                  // 文件名
            U.time().constant(),                    // time() 里面的 constant 
            U.db(),
            IOobject::MUST_READ,
            IOobject::NO_WRITE
        )
    )
{}

其主要作用是传回 U, phi,并读取 constant 文件夹下的 transportProperties 文件。

viscosityModelPtr_(viscosityModel::New("nu", *this, U, phi)) 则使用 *this 所指的文件中相应的 viscosityModel。看下定义:

autoPtr<viscosityModel> viscosityModel::New
(
    const word& name,
    const dictionary& viscosityProperties,
    const volVectorField& U,
    const surfaceScalarField& phi
)
{
    word viscosityModelTypeName(viscosityProperties.lookup("transportModel"));

    Info<< "Selecting incompressible transport model "
        << viscosityModelTypeName << endl;
    // 以下寻找 viscosityModelTypeName 所指的粘度模型
    dictionaryConstructorTable::iterator cstrIter =
        dictionaryConstructorTablePtr_->find(viscosityModelTypeName);
    // 如果没有找到
    if (cstrIter == dictionaryConstructorTablePtr_->end())
    {
        ...
    }
    // 找到了就这样使用,生成相应的粘度模型供求解器使用
    return autoPtr<viscosityModel>
        (cstrIter()(name, viscosityProperties, U, phi));
}
3 个赞