1
关于重叠网格的网格操作流程
以overInterDyMFoam 中的floatingBody Case为例简单介绍重叠网格的网格操作流程。
算例所在目录为tutorials/multiphase/overInterDyMFoam/floatingBody
因为overmesh的原理是使用两套网格,并通过overset区域进行插值传递信息。因此算例目录中有background 和 floatingBody 两个文件夹。首先我们通过两个文件夹下的Allrun.pre文件可以看到其在每个文件夹中的操作流程。简单说floatingBody只进行了浮体网格的设置和边界名称的设置。通过`mergemeshes`命令可以将floatingBody 中生成的网格文件merge到background的网格中,剩下的操作都在background文件夹中进行。
Allrun 脚本实例和注释如下,注释中详细解释了每个命令的操作意义:
Allrun.pre IN floatingOject
#!/bin/sh
cd ${0%/*} || exit 1 # run from this directory
# Source tutorial run functions
. $WM_PROJECT_DIR/bin/tools/RunFunctions
# Set application name
application=`getApplication`
runApplication blockMesh #blockMesh定义了重叠区域
runApplication topoSet #topoSet定义了浮体的形状和位置的Cell 重叠域为除去浮体内部的所有Cell
runApplication subsetMesh -overwrite c0 -patch floatingObject #对c0域添加边界名字为floatingOject
# ----------------------------------------------------------------- end-of-file
Allrun.pre IN background
#!/bin/sh
cd ${0%/*} || exit 1 # Run from this directory
. $WM_PROJECT_DIR/bin/tools/RunFunctions
# Create background mesh
runApplication blockMesh
# Add the cylinder mesh
runApplication mergeMeshes . ../floatingBody –overwrite #关节的一步是将floatingBody的网格融合进了背景网格中。此处需要注意一个问题,overset mesh 和 background mesh 的坐标范围一定要统一,这样才可以重叠在一起。因此两套网格的坐标点设置统一很重要。
# Select cellSets for the different zones
runApplication topoSet #下面详述:对计算域Cell进行了定义,便于更新域和setFields.
restore0Dir
# Use cellSets to write zoneID
runApplication setFields #设置初始场值,以及用(0,1)标记floatingbody的区域zoneID.
runApplication decomposePar
#------------------------------------------------------------------------------
2
TopoSetDict 的介绍和使用
上述 background 中的 Allrun.pre 文件中的操作命令可以看到,融合网格后,需要设置zoneID来标记不同的网格区域,此处需要首先用toposet 工具来标记网格区域。
控制字典如下:
{
version 2.0;
format ascii;
class dictionary;
object topoSetDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
actions
(
//首先标记 C0网格区域为整个背景网格,采用 insidepoints 的方式来进行设置。会自动寻找到整个边界区域,然后标记整个网格区域为c0
{
name c0;
type cellSet;
action new;
source regionToCell;
sourceInfo
{
insidePoints ((12.0 0.05 1.0));//此处该点一定要设置在扣出浮体的内部,否则会出现重叠网格和背景网格之间的不耦合现象。
}
}
//然后通过c0区域来标记c1区域
{
name c1;
type cellSet;
action new;
source cellToCell;
sourceInfo
{
set c0;
}
}
//最后通过反选实现 标记除去c0区域外的网格区域为c1
{
name c1;
type cellSet;
action invert;
}
);
// ************************************************************************* //
3
setField 对流体域进行定义
上述的在background中的topoSetDict 已经设置了 C0(背景网格区域) 和C1(重叠网格区域)。 然后,通过setField进行alphawater的设置和zoneID的设置。alphawater的设置同传统算例,在此不详述。这里主要讲一下关于zoneID的初始场值的设置(其中c0 zone 被定义为0,C1 zone 设置为1)。
{
version 2.0;
format ascii;
class dictionary;
object setFieldsDict;
}
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
defaultFieldValues
(
volScalarFieldValue alpha.water 0
volScalarFieldValue zoneID 123
);
regions
(
boxToCell
{
box ( -100 -100 -100 ) ( 100 100 1.0 );
fieldValues ( volScalarFieldValue alpha.water 1 );
}
/* boxToCell
{
box ( 0.7 0.8 -100 ) ( 100 100 0.75 );
fieldValues ( volScalarFieldValue alpha.water 1 );
}*/
cellToCell
{
set c0;
fieldValues
(
volScalarFieldValue zoneID 0
);
}
cellToCell
{
set c1;
fieldValues
(
volScalarFieldValue zoneID 1
);
}
);
// ************************************************************************* //
上述设置结果如图所示分别标记的 c0区域和c1区域
重叠网格中设置了两个不同区域的网格,而两套网格之间需要通过 `overset`边界来进行定义插值单元网格的。插值原理见沈志荣《船桨舵相互作用的重叠网格技术数值方法研究》。因此下面介绍一下重叠网格算例中的几个重要边界。
重叠网格示意图
图中的overset Boundary 便是floatingbody中定义的sides,如下边界条件文件所示,其边界类型为 `overset`。图中的wall boundaries 则是floatingObject 边界。
sides
{
type overset;
inGroups 1(overset);
nFaces 300;
startFace 227915;
}
此边界是定义在 floatingBody 中,最后merge到 background 网格上,是进行重叠域标记和信息传递的重要边界条件,具体实现待补充。
oversetPatch
{
type overset;
inGroups 1(overset);
nFaces 0;
startFace 116951;
}
atmosphere
{
type patch;
inGroups 1(patch);
nFaces 713;
startFace 116951;
}
一个特殊的边界,做什么用的暂时不知道,边界面设置为0个。startFace 为整个边界编号中的起始编号。如上面所示参照atmosphere边界。如果没有此边界,log 文件中会出现 warning 大概是 oversetPatch 不是计算域中的第一个起始编号。
最后关于topoSet, setFields, refinemesh,等网格和前处理工具,可在代码中application/utilities/中看到详细的Dict设置指导以及实现的源代码。