openfoam5 二次开发–源项source
第一次在csdn里写blog,不正确或者不详细的地方欢迎大家指正。
本文是一个简单的二次开发,一个标量场T的source,source的值等于选定的网格区域cellZone
的T平均值。
1. Tsource的构造
编写header文件Tsource.H
,首先包含以下头文件:
#include "autoPtr.H"
#include "topoSetSource.H"
#include "cellSet.H"
#include "fvMesh.H"
#include "volFields.H"
#include "cellSetOption.H"
然后定义数据成员Tave_
:
class Tsource : public cellSetOption
{
protected:
// T的平均值
scalar Tave_;
然后是Tsource
的构造,内容可参考OpenFOAM/src/fvOptions/source/derived/meanVelocity
中的构造方式。
再然后是成员函数,包括在每个时间步中计算T的平均值的correct
函数、添加source到eqn中的addSup
函数、以及读取控制参数的read
函数。
// Member Functions
//- 矫正Tave_值
virtual void correct(volScalarField& T);
//- 将显式源项加入到不可压eqn中
virtual void addSup
(
fvMatrix<scalar>& eqn,
const label fieldi
);
...
// IO
//- Read source dictionary
virtual bool read(const dictionary& dict);
2. addSup和correct的实现
在Tsource.C
文件中,correct
函数可以这样实现:
void Foam::fv::Tsource::correct(volScalarField& T)
{
Tave_ = 0.0;
// 计算网格区域中的T平均值(先求和再除以体积V)
forAll(cells_, i)
{
label celli = cells_[i];
Tave_ += T[celli];
}
Tave_ /= V_;
}
addSup
函数如此实现:
void Foam::fv::Tsource::addSup
(fvMatrix<scalar>& eqn, const label fieldi)
{ // 显式源项Su
volScalarField::Internal Su
( // 构造并初始化
IOobject
(
name_ + fieldNames_[fieldi] + "Sup",
mesh_.time().timeName(),
mesh_,
IOobject::NO_READ,
IOobject::NO_WRITE
),
mesh_,
dimensionedScalar("zero", eqn.dimensions()/dimVolume, Zero)
);
// 网格区域内的源项Su值等于Tave_
UIndirectList<scalar>(Su, cells_) = Tave_;
// 方程中加入显式源项Su
eqn += Su;
}
其余部分均可参考meanVelocity
的实现。
3. 编译
接下来,编译Tsource.C
和TsourceIO.C
:
首先,进入src/fvOption
文件夹,执行wclean
;再在src/fvOptions/Make/files
文件中加入:
$(derivedSources)/Tsource/Tsource.C
$(derivedSources)/Tsource/TsourceIO.C
(TsourceIO.C
参照meanVelocityForceIO.C
)
保存之后,重新编译fvOptions
即可。
4. 运行
在运行时,选择算例tutorials/basic/scalarTransportFoam/pitzDaily
,
给定fvOptions
文件:
// fvOptions:
T
{
// 给出源项的类型
type Tsource;
// 选择添加的区域类型
selectionMode all;
// 加入到温度场
fields (T);
}
是作为温度源项T添加的。
保存运行scalarTransportFoam
即可。
不过有一点要注意一下,刚才的Tsource.H
中并没有定义constrain
函数,所以要把scalarTransportFoam.C
文件中的
fvOptions.constrain(TEqn);
注释掉,再重新编译scalarTransportFoam
,然后运行。
亲测可用: