本案例演示利用SketchUp得到山地地形,利用SCDM生成流体计算区域,利用Fluent Meshing生成计算网格,利用OpenFOAM计算风环境的基本流程。
三维地形的生成方法有很多,比如利用实测等高线数据、卫星地图遥测数据、DEM数据库等点云数据逆向生成三维几何,不过这些数据都不太容易获取。本文选择利用SketchUp Pro 2020进行地形获取,此方法虽然精度不高,但用于大范围环境计算也还勉强凑合。
注:如果打不开卫星地图,显示网络无法连接的话,则可能需要爬墙。这里的卫星地图是基于谷歌地图的)
”
此时在SketchUp中显示的是平面图,需要将其显示为三维几何。
几何模型如图所示。
导出几何模型zone.obj。
注:这里可以选择导出为obj或stl,建议导出obj格式。
”
利用SCDM导入并处理几何模型,同时生成计算区域。
zone.obj
发现几何尺寸单位没有导入进来,这里对几何三个方向各放大1000倍,将尺寸单位转化为米。
完成后的几何模型尺寸如下图所示量级。
创建计算边界:inlet、outlet、ground、side1、side2及top。
利用Fluent Meshing生成计算网格,如下图所示。
从OpenFOAM算例库中拷贝一个与想要计算的问题比较类似的案例。
i:/OpenFOAM/case
。利用下面的命令从simpleFoam
中导入算例文件windAroundBuildings
:cp -r /opt/openfoam8/tutorials/incompressible/simpleFoam/windAroundBuildings/ .
mv windAroundBuildings/ wind
cd wind
zone.cas
拷贝到文件夹wind
中fluent3DMeshToFoam zone.cas
哦豁,出错了。
看错误提示是说在zone.cas文件的第1040318行有无法识别的字符[
。
用文本编辑器打开zone.cas文件,找到第1040318行,这一行的内容是关于cad几何的,可以直接删除掉。
注:我不甚清楚为何Fluent Meshing导出的cas文件中会存储这么多的几何模型相关信息,事实上该文件的后面一半的数据全部都可以删除,不会影响到网格。
”
删除此行信息后保存cas文件。重新利用命令fluent3DMeshToFoam zone.cas
,此时网格顺利转化,如下图所示。
constant/polyMesh/boundary
查看边界信息,文件内如下所示FoamFile
{
version 2.0;
format ascii;
class polyBoundaryMesh;
location "constant/polyMesh";
object boundary;
}
// * * * * * * * * * * * * * * * * * * * //
6
(
ground
{
type wall;
inGroups List<word> 1(wall);
nFaces 5173;
startFace 570669;
}
inlet
{
type patch;
nFaces 1288;
startFace 575842;
}
outlet
{
type patch;
nFaces 1094;
startFace 577130;
}
side1
{
type symmetry;
inGroups List<word> 1(symmetry);
nFaces 1069;
startFace 578224;
}
side2
{
type symmetry;
inGroups List<word> 1(symmetry);
nFaces 999;
startFace 579293;
}
top
{
type symmetry;
inGroups List<word> 1(symmetry);
nFaces 4987;
startFace 580292;
}
)
可以看到边界类型完整地转化过来了。
在计算边界设置时,速度入口采用atmBoundaryLayerInletVelocity
边界类型;入口湍动能采用atmBoundaryLayerInletK
,入口湍流耗散率采用atmBoundaryLayerInletEpsilon
。
1、U文件
U文件内容如下所属。
FoamFile
{
version 2.0;
format ascii;
class volVectorField;
object U;
}
// * * * * * * * * * * * * * //
dimensions [0 1 -1 0 0 0 0];
internalField uniform (0 0 0);
boundaryField
{
inlet
{
type atmBoundaryLayerInletVelocity;
Uref 10.0;
Zref 20;
zDir (0 1 0);
flowDir (1 0 0);
z0 uniform 0.1;
zGround uniform -1937.019;
}
outlet
{
type inletOutlet;
inletValue uniform (0 0 0);
value uniform (0 0 0);
}
ground
{
type slip;
}
"(side1|side2|top)"
{
type symmetry;
}
}
2、p文件
p文件内容如下所示。
FoamFile
{
version 2.0;
format ascii;
class volScalarField;
object p;
}
// * * * * * * * * * * * * * * * * * //
dimensions [0 2 -2 0 0 0 0];
internalField uniform 0;
boundaryField
{
inlet
{
type zeroGradient;
}
outlet
{
type uniformFixedValue;
uniformValue 0;
}
ground
{
type zeroGradient;
}
"(side1|side2|top)"
{
type symmetry;
}
}
3、k文件
k文件内容如下所示。
FoamFile
{
version 2.0;
format ascii;
class volScalarField;
object k;
}
// * * * * * * * * * * * * * * * * * * //
kInlet 1.5;
dimensions [0 2 -2 0 0 0 0];
internalField uniform $kInlet;
boundaryField
{
inlet
{
type atmBoundaryLayerInletK;
Uref 10.0;
Zref 20;
zDir (0 1 0);
flowDir (1 0 0);
z0 uniform 0.1;
zGround uniform -1937.019;
}
outlet
{
type inletOutlet;
inletValue uniform $kInlet;
value uniform $kInlet;
}
ground
{
type zeroGradient;
}
"(side1|side2|top)"
{
type symmetry;
}
#includeEtc "caseDicts/setConstraintTypes"
}
4、epsilon文件
epsilon文件如下所示。
FoamFile
{
version 2.0;
format ascii;
class volScalarField;
object epsilon;
}
// * * * * * * * * * * * * * * * //
epsilonInlet 0.03;
dimensions [0 2 -3 0 0 0 0];
internalField uniform $epsilonInlet;
boundaryField
{
inlet
{
type atmBoundaryLayerInletEpsilon;
Uref 10.0;
Zref 20;
zDir (0 1 0);
flowDir (1 0 0);
z0 uniform 0.1;
zGround uniform -1937.019;
}
outlet
{
type inletOutlet;
inletValue uniform $epsilonInlet;
value uniform $epsilonInlet;
}
ground
{
type zeroGradient;
}
"(side1|side2|top)"
{
type symmetry;
}
#includeEtc "caseDicts/setConstraintTypes"
}
5、nut文件
nut文件内容如下所示。
FoamFile
{
version 2.0;
format ascii;
class volScalarField;
object nut;
}
// * * * * * * * * * * * * * * * * //
dimensions [0 2 -1 0 0 0 0];
internalField uniform 0;
boundaryField
{
inlet
{
type calculated;
value uniform 0;
}
outlet
{
type calculated;
value uniform 0;
}
ground
{
type calculated;
value uniform 0;
}
"(side1|side2|top)"
{
type symmetry;
}
#includeEtc "caseDicts/setConstraintTypes"
}
1、指定controlDict
controlDict字典文件内容如下所示。
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object controlDict;
}
// * * * * * * * * * * * * * * * * * * //
application simpleFoam;
startFrom latestTime;
startTime 0;
stopAt endTime;
endTime 5000;
deltaT 1;
writeControl timeStep;
writeInterval 50;
purgeWrite 0;
writeFormat ascii;
writePrecision 12;
writeCompression off;
timeFormat general;
timePrecision 6;
runTimeModifiable true;
functions
{
#includeFunc residuals
}
// ******************************** //
libs ("libatmosphericModels.so");
2、fvSchemes文件
文件内容如下所示。
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object fvSchemes;
}
// * * * * * * * * * * * * * * * * * //
ddtSchemes
{
default steadyState;
}
gradSchemes
{
default Gauss linear;
}
divSchemes
{
default none;
div(phi,U) bounded Gauss upwind;
div(phi,epsilon) bounded Gauss upwind;
div(phi,k) bounded Gauss upwind;
div((nuEff*dev2(T(grad(U))))) Gauss linear;
}
laplacianSchemes
{
default Gauss linear limited corrected 0.33;
}
interpolationSchemes
{
default linear;
}
snGradSchemes
{
default limited corrected 0.33;
}
3、fvSolution文件
文件内容如下所示:
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object fvSolution;
}
// * * * * * * * * * * * * * * * * * * //
solvers
{
p
{
solver GAMG;
tolerance 1e-7;
relTol 0.1;
smoother GaussSeidel;
}
"(U|k|epsilon)"
{
solver smoothSolver;
smoother GaussSeidel;
tolerance 1e-8;
relTol 0.1;
nSweeps 1;
}
}
SIMPLE
{
nNonOrthogonalCorrectors 0;
residualControl
{
p 1e-3;
U 1e-4;
"(k|epsilon)" 1e-4;
}
}
relaxationFactors
{
fields
{
p 0.3;
}
equations
{
U 0.7;
k 0.7;
epsilon 0.7;
}
}
cache
{
grad(U);
}
算例模型较大,采用并行计算可以有效地提高计算效率。
利用命令添加decomposeParDict
:
foamGet decompseParDict
修改字典文件:
FoamFile
{
version 2.0;
format ascii;
class dictionary;
object decomposeParDict;
}
// * * * * * * * * * * * * //
numberOfSubdomains 48;
method scotch;
运行命令进行计算:
decompsePar
mpirun -np 48 simpleFoam -parallel
计算完毕后可以采用两种方式:
reconstruct
汇总结果数据后进行后处理paraFoam -builtin
直接进入后处理,在paraview中选择Case Type
为Decomposed Case
计算过程中可以使用下面的命令查看残差。
foamMonitor -l postProcessing/residuals/0/residuals.dat
计算过程收敛残差如下图所示。
声明:原创文章,欢迎留言与我讨论,如需转载留言