#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));
}