OpenFOAM中自带了两种类型的动网格,一是传统的网格,通过边界移动或变形来控制网格点内部的运动,通过局部重划防止网格质量的降低。这种网格的特点是当运动非常复杂时,非常容易出现计算错误。
二是嵌套(overset)网格,这是将每个部件的网格组合在一起,只需要控制单个部件的网格的运动,这样不涉及单元的形状变化,显然要容易得多。
传统网格按照不同的维度,又可以进行分类。比如按运动是显式还是隐式的进行分类。显式运动时,物体的运动是可以提前确定的;隐式运动,比如球浮在水上,需要通过流体的状态来求解物体运动。
也按边界是否变形来分类。刚体运动,比如一个球在正方形区域内运动,外边界为正方开,内边界为圆,两种边界不发生变形。边界变形的运动,比如手捏装有水的气体,多相流也可以视为边界变形的隐式运动,或自由边界运动。
按拓扑是否改变来分类。拓扑就是网格点间的连接关系,新增网格点,把一个单元划分为多个单元均为拓扑改变。拓扑不改变的情形通常有两种:一是不同区域的网格发生相对移动,但内部的网格点间不相对移动。比如将一个正方形网格旋转一个角度。又比如在一个正方形区域内有一个圆形区域,这个圆形区域自转。二是内部网格点发生相对移动,但移动幅度很小,可以忽略不计。比如正方形内的圆形区域绕直线小幅来回运动,此时网格单元会拉伸,但不需要将单元分割或合并。
在OpenFOAM中完整实现网格运动,一是需要指定动网格类型,二是要指定运动求解器,需要指定motionSolverLibs和motionSolver,三是指定流体力学求解器。通常动网格类型中带MotionSolver的表示支持运动求解器,流体力学求解器名字中带DyM的表示支持动网格,带Overset的表示支持嵌套网格。
传统网格
传统网格共有9种。
嵌套网格
目前只有一种:dynamicOversetFvMesh.
运动求解器
运动求解器用于控制网格运动,主要是显式与隐式。最重要的是lib是fvMotionSolvers。
显式指定运动
指定不同时刻的偏移,中间时刻用插值得到:displacementLaplacian。指定不同时刻的速度,中间时刻用插值得到:velocityComponentLaplacian。
指定偏移需要在0/constant中添加pointDisplacement文件。有三种形式:一是固定值,二是通过列表给不同时刻指定不同值,三是在这个文件中直接插入C++代码来计算每一个时刻的值。显然第三种形式最灵活。
pointDisplacement文件设置
它的格式与设定压强、温度等初场类似。实际上也可以通过类似形式来给不同时刻指定不同的边界值。
固定值:
patch
{
type fixedValue;
value uniform (0 0 0);
}
时变值:
patch
{
type uniformFixedValue;
uniformValue table
(
(0 (0 0 0))
(5 (10 0 0))
);
}
以上表示5时刻偏移为(10,0,0),注意这里的偏移是累积偏移,指相对于初始时刻的偏移。
用C++代码计算:
//标量声。
patch
{
type codedFixedValue;
value uniform 0;
// Name of generated boundary condition
redirectType rampedFixedValue;
code
#{
const scalar t = this->db().time().value();
operator==(min(10, 0.1*t));
#};
}
//向量场
标量场code块中指定C++代码,此时表示偏移为。
隐式运动
sixDoFRigidBodyMotion。