本文描述OpenFOAM中的初始条件与边界条件。
当使用CFD求解器来求解控制方程的近似解时,实际上求解的是一个初边值问题,这类问题在求解计算时需要输入适当的边界条件和初始条件。很明显边界条件和初始条件必须在物理上是真实的。边界条件是数值方法的必需部分,其将区域边界的信息告诉求解器。初始条件也是数值方法的必要组成部分,其定义了物理问题的初始状态。
1 边界条件
边界条件(boundary condition,BC)可以分为三种主要类型:
-
Dirichlet边界
:直接指定边界上待求物理变量的值 -
Neumann边界
:指定边界上物理量的法向梯度 -
Robin边界
:为上面两种边界的混合,既指定物理量的值,也指定梯度值
在实际应用过程中,上面三种边界类型可以任选其中一个。
在OpenFOAM中定义边界条件涉及到的操作包括:
-
查找边界条件在域中的位置 -
确定边界条件类型 -
提供所需的物理信息
边界条件的选择取决于:
-
几何考虑 -
涉及到的物理问题 -
边界条件所在位置能够提供的物理信息 -
数值计算的考量
如下图所示的计算区域中所包含的初始条件(IC)与边界条件(BC)。
2 初始条件
初始化条件(initial condition,IC)可以分为两类:
-
均匀(Uniform)的初始条件 -
非均匀(Non-uniform)的初始条件
可以从以下途径获取非一致的初始条件:
-
其他仿真计算得到的结果作为初始条件 -
数学函数计算结果 -
势流求解器计算的结果 -
降阶模型计算的结果 -
实验数据
定义初始条件包括:
-
找到域中初始条件的位置 -
确定初始条件类型 -
提供所需的物理信息
初始条件的选择取决于:
-
几何考虑 -
涉及到的物理问题 -
可用的的物理信息 -
数值计算的考量
对于初始条件,需要提供问题的初始信息或初始状态。此信息可以是均匀值,也可以是非均匀值。可以将初始条件应用到整个计算区域或计算区域中的某一独立区域。如下图所示。
3 进出口边界
关于进出口边界条件:
-
入口边界用于计算区域中预期会有流体流入的区域;但是当边界条件指定为速度分布时,入口可以允许流体流出 -
压力边界条件不允许入口有流体流出 -
速度入口主要用于不可压缩流动;压力与流量入口适合于可压缩与不可压缩流动 -
相同的概念也适合于出口
关于零梯度边界与回流边界条件:
-
零梯度(zero gradient)边界条件从计算区域中通过外推得到物理量的值 -
零梯度边界不需要任何信息。 -
零梯度边界条件可用于入口,出口和壁面。 -
回流(backflow)边界条件提供了一个通用的的流出/流入条件,对于存在回流的问题可以指定流入/流出条件。 -
对于回流出口(backflow outlet),当通量为正(流出计算域)时应用Neumann边界条件(零梯度);当通量为负(流体流入计算域)将应用Dirichlet边界条件(固定值)。 -
同样的概念适用于回流入口。
边界条件的一些组合非常稳定,而有些组合的可靠性较低,如入口处设置为速度和出口处设置为零压力梯度,这种组合由于静压不固定,此模拟最终将崩溃。
关于对称边界条件:
-
对称边界条件仅适用于平面。 -
只有当几何形状和流场都对称时才可以使用对称边界。 -
从数学上讲,设置对称边界条件等于该平面上的法向速度为零以及平面上所有变量的法向梯度为零。 -
从物理上讲,它们等效于滑移壁面。
关于边界条件与初始条件:
-
边界条件和初始条件在物理上必须是真实的 -
边界条件定义不当可能会对计算结果产生重大影响 -
初始条件与边界条件同等重要 -
良好的初始条件可以提高算法的稳定性和收敛速度,另一方面,非物理初始条件可能会减慢收敛速度或导致发散 -
需要为要求解的每个变量定义边界条件和初始条件 -
设置正确的边界条件极其重要,但需要了解其中的物理原理 -
需要对理论背景有所了解,才能设置正确的边界条件 -
不要强制指定出口处的流量,对除压力之外的其他所有流动变量使用零法向梯度边界。求解器从计算域内部外推获取所需的信息 -
注意出口处的反向流动(流入计算域的流动)和入口处的反向流动(反射波),它们需要特殊处理 -
如果可能,选择流入和流出边界条件,使流动垂直于边界流入或流出 -
在出口,仅对不可压缩的流动使用零梯度边界条件,并且当确定流动已充分发展时 -
与大气相连通的出口边界可以使用静压边界条件 -
从大气环境中流入计算区域的入口边界可以使用总压边界条件(例如打开的窗户) -
质量流量入口在入口边界处产生均匀的速度分布 -
指定压力的边界条件允许形成自然速度曲线 -
边界条件和初始条件的所需值取决于要求解的方程以及所使用的物理模型,例如:对于不可压缩和层流,只需设置速度和压力即可。如果要解决湍流可压缩流,则需要设置速度,压力,温度和湍流变量。对于多相流,将需要为每个相设置基本变量。•如果进行湍流燃烧或化学反应,则需要定义组分,化学反应以及湍流变量 -
最小化边界附近的网格偏斜度,非正交性,增长率和长宽比 -
尽量避免在垂直于边界且在入口和出口附近的方向上出现较大的梯度。也就是说,使边界远离计算区域内扰动的位置
4 OpenFOAM中的边界条件
OpenFOAM中将边界类型区分为基本类型和数值类型量中。
对于基本类型边界:
-
基本类型的边界条件基于几何信息或处理器间通信halo边界 -
基本类型边界条件是在路径 constant/polyMesh
中的boundary
文件中定义的 -
在生成或转换网格时会自动创建 boundary
文件 -
将网格转换为OpenFOAM格式时,可能需要手动修改 boundary
文件,因为转换程序有可能无法识别原始网格的边界类型 -
如果缺少基本类型边界条件或拼写错误,OpenFOAM会报告错误的位置和原因
对于数值类型边界:
-
数值类型边界条件将物理量值分配给指定表面边界 -
在路径 0
中的场变量字典中定义了数值类型边界条件 -
当谈论数值类型边界条件时,通常指的是Dirichlet,Neumann或Robin边界条件 -
需要手动创建场变量字典(例如0/U,0/p,0/T,0/k,0/omega) -
如果缺少数值类型边界条件或拼写错误,OpenFOAM会报告错误的位置和原因
下表所示的基本类型与数值类型是相同的:
基础类型 | 数值类型 |
---|---|
constant/polyMesh/boundary文件 | 0/U - 0/p - 0/T - 0/k - 0/omega等文件 |
cyclic cyclicAMI empty processor symmetry symmetryPlane wedge |
cyclic cyclicAMI empty processor symmetry symmetryPlane wedge |
这些边界在OpenFOAM中成为约束边界(constraint patch)。要想找到这些边界的完整列表及源代码位置,可以进入路径$WM_PROJECT_DIR
中,输入命令:
find . d -iname *constraint*
基本类型patch
可以是OpenFOAM中可用的任何边界条件,从数学上将,可以是Dirichlet, Neumann或Robin边界条件。如下表所示:
基础类型 | 数值类型 |
---|---|
constant/polyMesh/boundary文件 | 0/U - 0/p - 0/T - 0/k - 0/omega等文件 |
patch | advective calculated codedFixedValue epsilonWallFunction fixedValue inletOutlet movingWallVelocity rotatingWallVelocity slip supersonicFreeStream totalPressure zeroGradient … 等等 |
基础边界wall
定义为:
边界类型 | 数值类型 | 数值类型 |
---|---|---|
constant/polyMesh/boundary | 0/U | 0/p |
wall | type fixedValue; value uniform (0 0 0); |
zeroGradient |
此边界条件不包含在基本类型边界条件patch
中,可以在此边界条件上使用专门的模型选项。
backflow
出口边界,可以使用以下边界条件组合:
边界类型 | 数值类型 | 数值类型 |
---|---|---|
constant/polyMesh/boundary | 0/U | 0/p |
patch | type inletOutlet; inletValue uniform (0 0 0); value uniform (0 0 0); |
type fixedValue; value uniform 0; |
inletValue
关键字用于回流处理。•这种情况下,如果流体返回计算区域,将使用通过关键字inletValue
设置的值。否则它将使用zeroGradient
边界条件。
外部空气动力学计算中典型的边界条件如下表所示:
边界描述 | 压力 | 速度 | 湍流场 |
---|---|---|---|
入口面 | zeroGradient | fixedValue | fixedValue |
出口面 | fixedValue | inletOutlet | inletOutlet |
壁面 | zeroGradient | fixedValue | 壁面函数 |
对称面 | symmetry | symmetry | symmetry |
周期面 | cyclic | cyclic | cyclic |
空面 | empty | empty | empty |
滑移壁面 | slip | slip | slip |
壁面是可以为kqWallFunction, omegaWallFunction, nutkWallFunction等,如下表所示:
物理场 | 壁面函数(高雷诺数) | 求解边界层(低雷诺数) |
---|---|---|
nut | nut-壁面函数 | fixedValue 0或一个较小值 |
k,q,R | kqRWallFunction | fixedValue 0或一个较小值 |
epsilon | epsilonWallFunction | zeroGradient或 fixedValue 0或一个较小值 |
omega | omegaWllFunction | omegaWallFunction fixedValue 指定一个较大值 |
zeta | - | fixedValue 0或一个较小值 |
nuTilda | - | fixedValue 0或一个较小值 |
nut壁面函数可以是:nutkAtmRoughWallFunction, nutkRoughWallFunction, nutkWallFunction, nutLowReWallFunction, nutURoughWallFunction, nutUSpaldingWallFunction, nutUTabulatedWallFunction, nutUWallFunction, nutWallFunction
。
最后,记住基本类型边界条件的名称和数值类型边界条件的名称必须相同,否则OpenFOAM会给出错误提示,特别是如果要从其他格式转换网格时。另外在将名称分配给边界时,不要使用空格。
OpenFOAM®实现了许多边界条件。可以在以下目录中找到主要数值边界条件的源代码:$WM_PROJECT_DIR/src/finiteVolume/ fields/
湍流模型(壁函数)的壁边界条件位于以下目录中:$ WM_PROJECT_DIR/src/MomentumTransportModels/momentumTransportModels/derivedF vPatchFields/wallFunctions
要查找在OpenFOAM中实现的所有边界条件,请转到目录$WM_PROJECT_DIR
并在终端中键入:
$> find . -type d -iname *fvPatch*
$> find . -type d -iname *derivedFv*
$> find . -type d -iname *pointPatch*
获取有关OpenFOAM®中所有可用边界条件的更多信息,可以阅读Doxygen文档,也可以通过以下链接在线访问文档:http://cpp.openfoam.org/v8/
5 boundary字典文件
例如下面的模型边界:
与之对应的constant/polyMesh/boundary
文件内容如下所示:
// 这里的3指的是定义的边界数量
3
(
// 指定了一个名为movingWall的边界
movingWall
{
// 边界类型为patch,基础边界
type patch;
// 组成边界的网格面数量,通常不改
nFaces 20;
// 组成边界的起始面编号,通常不改
startFace 760;
}
// 边界的名称可以任意取,不要有空格
fixedWalls
{
// 定义了一个wall边界,基础边界
type wall;
nFaces 60;
startFace 780;
}
frontAndBack
{
// 定义了一个empty边界
// 表示计算的是2D文件
type empty;
nFaces 800;
startFace 840;
}
)
6 0/U文件
例如下面的边界条件:
其对应的0/U
文件如下所示:
dimensions [0 1 -1 0 0 0 0];
internalField uniform (0 0 0);
boundaryField
{
// 这里的边界名称必须与boundary中的一致
movingWall
{
// 指定边界类型为固定值
type fixedValue;
// 指定入口速度向量
value uniform (1 0 0);
}
fixedWalls
{
type fixedValue;
value uniform (0 0 0);
}
frontAndBack
{
// empty类型保持与boundary一致
type empty;
}
}
7 0/p文件
如下面的边界条件组合:
对应的0/p
文件:
dimensions [0 2 -2 0 0 0 0];
internalField uniform 0;
boundaryField
{
// 必须与boundary文件中边界名称一致
movingWall
{
// 指定为零梯度边界
type zeroGradient;
}
fixedWalls
{
type zeroGradient;
}
frontAndBack
{
type empty;
}
}
本篇文章来源于微信公众号: CFD之道
评论前必须登录!
注册