本案例演示利用OpenFOAM创建一个标量输运方程求解器。
本案例要求解的方程为:
没有瞬态项和源项。
1 文件框架
利用foamNewApp
快速创建文件框架。
run
foamNewApp demo10 && cd demo10
执行完毕后的文件框架如下图所示。
本案例比较简单,只需要一个源文件demo10.C
即可。
2 源代码
源文件demo10.C
的内容如下。
#include "fvCFD.H"
int main(int argc, char *argv[])
{
#include "setRootCase.H"
#include "createTime.H"
#include "createMesh.H"
Info << "读取物理场beta" << endl;
volScalarField beta
(
IOobject
(
"beta",
runTime.timeName(),
mesh,
IOobject::MUST_READ,
IOobject::AUTO_WRITE
),
mesh
);
Info << "读取物理场U" << endl;
volVectorField U
(
IOobject
(
"U",
runTime.timeName(),
mesh,
IOobject::MUST_READ,
IOobject::AUTO_WRITE
),
mesh
);
// 读取字典文件
Info << "读取字典文件transportProperties" << endl;
IOdictionary transportProperties
(
IOobject
(
"transportProperties",
runTime.constant(), //- 此文件在constant文件夹下面
mesh,
IOobject::MUST_READ_IF_MODIFIED,
IOobject::NO_WRITE
)
);
Info << "从字典文件中读取扩散系数gamma" << endl;
dimensionedScalar gamma("gamma", dimViscosity, transportProperties);
Info << "读取/计算面通量场phi" << endl;
surfaceScalarField phi
(
IOobject
(
"phi",
runTime.timeName(),
mesh,
IOobject::READ_IF_PRESENT, //若phi文件存在,则读取,否则采用速度与面积相乘计算得到
IOobject::AUTO_WRITE // 保存该变量
),
fvc::interpolate(U) & mesh.Sf() //速度向量与面积向量点积
);
//求解控制方程
solve(fvm::div(phi, beta) - fvm::laplacian(gamma, beta));
// 创建一个标量场用于存储结果,也可以直接用beta
volScalarField result
(
IOobject
(
"result",
runTime.timeName(),
mesh,
IOobject::NO_READ,
IOobject::AUTO_WRITE
),
beta //将beta的值拷贝给result
);
result.write();
Info << nl << "计算完毕" << endl;
runTime.printExecutionTime(Info);
return 0;
}
编译并测试运行,如下图所示。
3 测试计算
案例文件需要根据求解器的需求来准备。上面准备的求解器中需要求解物理量beta。
-
constant/transportProperties
文件中需要指定扩散系数gamma
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "constant";
object transportProperties;
}
// * * * * * * * * * * * * * * * * * //
gamma 0.01;
由于在读取字典文件时指定了量纲,因此在字典文件中无需重复指定量纲。
-
system/fvSolution
文件中需要指定beta的求解方法
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "system";
object fvSolution;
}
// * * * * * * * * * * * * * * * * * //
solvers
{
beta
{
solver GAMG;
smoother DILUGaussSeidel;
tolerance 1e-6;
relTol 0;
}
}
-
system/fvSchemes
文件需要指定控制方程中对流项、梯度项以及laplacian项的离散格式
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "system";
object fvSchemes;
}
// * * * * * * * * * * * * * * //
ddtSchemes
{
default none;
}
// 梯度项
gradSchemes
{
default none;
grad(beta) Gauss linear;
}
//散度项
divSchemes
{
default none;
div(phi,beta) bounded Gauss upwind;
}
// laplacian项
laplacianSchemes
{
default none;
laplacian(gamma,beta) Gauss linear corrected;
}
// 通量插值
interpolationSchemes
{
default none;
interpolate(U) linear;
}
snGradSchemes
{
default none;
}
-
system/controlDict
按常规设置
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "system";
object controlDict;
}
// * * * * * * * * * * * * * * * * //
startFrom startTime;
startTime 0;
stopAt endTime;
endTime 1;
deltaT 1;
writeControl timeStep;
writeInterval 1;
purgeWrite 0;
writeFormat ascii;
writePrecision 6;
writeCompression off;
timeFormat general;
timePrecision 6;
runTimeModifiable true;
-
0/beta
文件指定物理场beta的边界条件与初始条件
FoamFile
{
version 2.0;
format ascii;
class volScalarField;
object beta;
}
// 注意beta是标量
dimensions [0 0 0 0 0 0 0];
internalField uniform 0;
boundaryField
{
left
{
type fixedValue;
value uniform 1;
}
lower
{
type fixedValue;
value uniform 0;
}
"(upper|right)"
{
type zeroGradient;
}
frontAndBack
{
type empty;
}
}
-
0/U
文件
FoamFile
{
version 2.0;
format ascii;
class volVectorField;
object U;
}
// * * * * * * * * * * * * * //
dimensions [0 1 -1 0 0 0 0];
internalField uniform (1 1 0);
boundaryField
{
"(lower|upper|left|right)"
{
type fixedValue;
value $internalField;
}
frontAndBack
{
type empty;
}
}
在案例根路径下执行下面的命令进行计算。
blockMesh
demo10
很快就计算完了。
计算结果如下图所示。
(完毕)
本篇文章来源于微信公众号: CFD之道
评论前必须登录!
注册