· 靳贺伟 · 网格基础  · 19 min read

OpenFOAM v2512 重叠网格详解:供体—受体插值、建模流程与守恒控制

系统讲解 OpenFOAM v2512 Overset/Chimera 重叠网格的理论结构、单元分类、zoneID、插值模板、动态运动设置、质量守恒、网格设计和典型应用。

本文以 OpenCFD 发布的 OpenFOAM v2512 为基准。重叠网格在不同 OpenFOAM 分支中的类名、求解器和字典写法可能不同,不能直接混用。

1. 重叠网格解决什么问题

传统移动网格要求整个计算域保持一套连续拓扑。当物体发生大幅平移、复杂旋转、偏心运动或六自由度运动时,背景网格会被持续拉伸,最终出现高非正交、严重偏斜甚至负体积。

重叠网格的思路是把计算域拆成若干彼此独立的子网格:

  • 背景网格描述远场或主体设备;
  • 局部网格包围运动物体并随其一起运动;
  • 多套网格在空间中留出一定体积重叠;
  • 在重叠区内通过供体—受体插值交换流场变量。

因此,运动网格可以作为刚体移动,不必把位移传递到整个背景域。该方法也称 Overset Mesh 或 Chimera Mesh。

典型结构可表示为:

背景网格 zone 0
┌────────────────────────────────┐
│                                │
│       局部运动网格 zone 1      │
│       ┌──────────────┐         │
│       │  运动物体    │         │
│       │ 及近场网格   │         │
│       └──────────────┘         │
│                                │
└────────────────────────────────┘

重叠网格的优势不是“精度天然更高”,而是允许复杂运动,同时维持各子网格自身的几何质量。代价是引入了额外插值、孔洞切除、供体搜索以及守恒修正。

2. 四类单元与计算拓扑

重叠网格算法的核心不是简单地把两套网格叠在一起,而是为每个单元确定计算角色。

2.1 正常计算单元 calculated cell

这类单元按普通有限体积方法离散质量、动量、能量和组分方程,未知量由线性方程组求解。

2.2 供体单元 donor cell

供体单元位于另一套网格中,为受体单元提供插值数据。一个受体单元可以对应一个或多个供体单元。

2.3 受体单元 acceptor/interpolated cell

受体单元位于网格交接带,其场值由供体单元插值得到。一般写成:

[ \phi_A=\sum_{i=1}^{N_D}w_i\phi_{D,i}, \qquad \sum_{i=1}^{N_D}w_i=1 ]

式中,(\phi_A) 为受体单元变量,(\phi_{D,i}) 为第 (i) 个供体单元变量,(w_i) 为插值权重。

2.4 孔洞单元 hole cell

被实体或更高优先级网格覆盖的单元需要从离散系统中屏蔽,否则同一物理空间会被重复求解。它们被标记为 hole cells。

由此可见,重叠网格在每次连接关系更新时需要完成:

  1. 判断实体遮挡和孔洞区域;
  2. 选择 fringe/acceptor 单元;
  3. 搜索可用供体单元;
  4. 建立插值模板和权重;
  5. 将插值约束加入有限体积方程。

动态运动时,这些关系可能随每个时间步更新。

3. v2512 中的主要类和求解器

v2512 中与重叠网格直接相关的动态网格类包括:

staticOversetFvMesh
dynamicOversetFvMesh

其中:

  • staticOversetFvMesh:子网格位置不随时间变化,但仍通过重叠插值连接;
  • dynamicOversetFvMesh:允许一个或多个网格区域运动,并在运动后更新重叠连接。

dynamicOversetFvMesh 继承多运动求解器框架,可为不同 cellZone 定义不同运动。

常见重叠网格求解器包括:

overSimpleFoam             稳态不可压缩
overPimpleDyMFoam          瞬态不可压缩动态网格
overRhoSimpleFoam          稳态可压缩
overRhoPimpleDyMFoam       瞬态可压缩动态网格
overInterDyMFoam           VOF 两相流动态网格

求解器是否满足具体物理需求仍需核查。例如颗粒追踪、组分输运、燃烧和自定义源项不一定在所有 over... 求解器中完整实现。

4. 建立重叠网格算例的总体流程

一个可靠流程通常包括:

分别生成背景网格和局部网格

合并网格并保留 cellZone/patch

创建连续 zoneID 场

设置 overset patch

定义局部网格运动

设置插值方法和线性求解器

检查孔洞、供体、受体和覆盖关系

先做低速/短时测试

进行守恒、时间步和网格独立性验证

4.1 分别生成子网格

背景域和局部运动域可以分别用 blockMeshsnappyHexMesh、Gmsh、Fluent 等生成。重点不是生成工具,而是:

  • 每套子网格自身必须封闭、合法;
  • 局部网格外边界应构成完整 overset 接口;
  • 运动物体壁面位于局部网格内部;
  • 重叠区域要有足够宽度;
  • 接口应避开叶片近壁层、射流出口、火焰面、激波和相界面等强梯度区。

多套网格通常可通过 mergeMeshes 合并到同一算例中,再用 topoSetsetSet 或网格生成阶段的 zone 信息建立 cellZone。

4.2 建立 zoneID

重叠连接需要 0/zoneID,其类型是 volScalarField,不是 cellZone 本身。编号从 0 开始并连续:

背景网格       zoneID = 0
第一个局部网格 zoneID = 1
第二个局部网格 zoneID = 2

示意文件:

FoamFile
{
    format      ascii;
    class       volScalarField;
    object      zoneID;
}

dimensions      [0 0 0 0 0 0 0];
internalField   uniform 0;

boundaryField
{
    inlet       { type zeroGradient; }
    outlet      { type zeroGradient; }
    walls       { type zeroGradient; }
    oversetPatch{ type zeroGradient; }
}

实际操作中需要将局部 cellZone 对应单元赋值为 1、2 等。可使用 setFields 或专门脚本完成。

4.3 设置 overset patch

局部子网格外边界在 constant/polyMesh/boundary 中应为:

oversetPatch
{
    type            overset;
    nFaces          ...;
    startFace       ...;
}

0/U0/p0/k0/omega 等场文件中,可使用:

oversetPatch
{
    type            overset;
}

也可在场文件结尾引入约束类型:

#includeEtc "caseDicts/setConstraintTypes"

这样可减少遗漏某个场的风险。新增能量、组分或湍流变量时,要确认该变量也具有正确的 overset 边界条件。

5. dynamicMeshDict:局部刚体旋转示例

固定轴旋转局部网格的基本结构可写为:

dynamicFvMesh  dynamicOversetFvMesh;

motionSolverLibs (fvMotionSolvers);

solver          solidBody;

solidBodyCoeffs
{
    cellZone               rotorZone;
    solidBodyMotionFunction rotatingMotion;

    rotatingMotionCoeffs
    {
        origin             (0 0 0);
        axis               (0 0 1);
        omega              62.831853; // rad/s,约 600 r/min
    }
}

对于多个独立运动体,可使用多运动求解器结构,分别指定 cellZone 和运动函数。需要注意:

  • axis 应为旋转轴方向,而不是角速度矢量本身;
  • omega 单位是 rad/s;
  • cellZone 必须只包含随该运动函数移动的网格;
  • 物体壁面与局部网格应保持一致运动;
  • 初始时刻所有子网格不得发生非法实体穿透。

六自由度问题可采用 sixDoFRigidBodyMotion,同时定义质量、惯量、约束、阻尼和外力。此时必须特别关注时间步、碰撞和极端姿态下的供体覆盖。

6. 插值方法与离散矩阵

system/fvSchemes 中设置:

oversetInterpolation
{
    method          inverseDistance;
}

反距离插值的基本思想是距离越近,权重越大:

[ w_i=\frac{d_i^{-p}}{\sum_j d_j^{-p}} ]

其中 (p) 为距离权重指数。v2512 还包含其他 cell-to-cell stencil 或权重实现,例如体积权重和最小二乘类方法,但可用性和适用性应以具体版本源码及教程为准。

重叠插值约束会改变线性方程矩阵结构,通常使其不再对称。因此不应机械照搬普通不可压缩算例的对称求解器。可从以下设置起步:

p
{
    solver          PBiCGStab;
    preconditioner  DILU;
    tolerance       1e-7;
    relTol          0.01;
}

U
{
    solver          smoothSolver;
    smoother        symGaussSeidel;
    tolerance       1e-7;
    relTol          0.05;
}

这只是起始模板,最终应根据条件数、残差衰减和守恒误差调整。

7. 质量守恒与通量修正

普通变量插值并不自动保证插值带两侧的面通量完全守恒。可能出现:

  • 入口与出口质量流量长期不平衡;
  • 局部压力振荡;
  • 对流标量产生虚假源汇;
  • VOF 相分数或组分总量缓慢漂移。

在 PIMPLE 设置中可启用:

PIMPLE
{
    nOuterCorrectors          2;
    nCorrectors               2;
    nNonOrthogonalCorrectors  0;

    oversetAdjustPhi          true;
}

某些 overset 场边界还支持 fluxCorrection。但通量修正不能替代独立检查。至少应计算:

[ \varepsilon_m= \frac{|\dot m_{in}-\dot m_{out}|} {\max(|\dot m_{in}|,\epsilon)} ]

并监控:

  • 全域连续性误差;
  • 每个子域净通量;
  • 插值带附近局部通量;
  • 标量和能量总量;
  • 长时间积分后的累积漂移。

对于多相流和反应流,守恒要求比单相等温流更严格。一个速度场看起来连续,不代表相质量、组分质量和焓也足够守恒。

8. 壁面距离和湍流模型

常规 meshWave 壁面距离算法不能自然穿过重叠插值关系。若壁面函数或 RANS 模型依赖准确壁面距离,可在 fvSchemes 或相关字典中使用连续型方法,例如:

wallDist
{
    method          Poisson;
}

或:

wallDist
{
    method          advectionDiffusion;
}

需要检查:

  • 局部运动网格中壁面附近的 (y^+);
  • overset 区域附近的壁面距离是否跳变;
  • nutomegaepsilon 是否出现异常条带;
  • 运动后近壁层是否保持足够分辨率。

9. 重叠区网格设计准则

9.1 重叠宽度

重叠区不能只有一层单元。运动过程中受体单元需要在另一套网格中找到稳定供体。工程上应留出多层完整单元,并在整个运动轨迹内检查最小覆盖。

9.2 网格尺度匹配

供体和受体网格尺寸相差过大时,小尺度梯度会在插值中丢失。建议使插值带两侧的特征尺寸处于同一数量级,避免突然由极细网格跳到极粗网格。

9.3 避开强梯度区

重叠接口宜放在流场相对平缓区域,尽量远离:

  • 固体近壁边界层;
  • 叶尖涡核心;
  • 喷口剪切层起始位置;
  • 火焰面和点火区;
  • 激波;
  • VOF 自由界面;
  • 高浓度颗粒或污染物源。

9.4 全运动包络检查

只检查初始位置是不够的。应在代表性姿态或完整运动周期中输出网格,检查:

  • donor 缺失;
  • hole 泄漏;
  • acceptor 层突然跳变;
  • 局部网格穿出背景域;
  • 实体表面与孔洞边界距离过小。

10. 时间步和并行计算

动态重叠计算除了流动 Courant 数,还受到网格运动约束。局部网格在一个时间步内移动过多,供体模板会发生剧烈变化,导致残差和载荷振荡。

旋转问题可控制每步转角:

[ \Delta \theta = \omega\Delta t ]

叶片通过问题常要求每个特征角度划分足够多时间步。应通过时间步独立性验证,而不是只满足 maxCo

并行计算时,供体可能位于其他处理器,增加搜索和通信。分区策略应避免把每个小型运动网格切得过碎,并检查:

  • 各处理器负载;
  • 重叠连接重建时间;
  • 并行结果与串行或少核结果的一致性;
  • 运动后是否发生供体搜索失败。

11. 后处理与诊断

推荐输出或检查:

  • cell type:calculated/interpolated/hole;
  • zoneID
  • 网格速度;
  • 插值权重和供体数量;
  • 质量流量与连续性误差;
  • 受力和力矩的周期稳定性;
  • 重叠区两侧变量剖面。

验证时可选择一条穿过重叠带的采样线,比较 (U)、(p)、温度或组分是否出现非物理跳变。还应把重叠接口位置移动一定距离,若主要结论随接口位置显著变化,说明插值误差尚未受控。

12. 典型应用案例

12.1 多旋翼和螺旋桨

每个旋翼建立独立局部网格,可定义不同转速、转向和相位。背景域不随旋翼运动。适合旋翼间干扰、旋翼—机身耦合和倾转机构。

12.2 船舶与浮体六自由度运动

船体近场高质量网格随船体平移和转动,背景域描述自由液面和远场。优点是大幅姿态变化不会拉坏背景网格;难点是 VOF 界面穿过重叠区时的相分数扩散与守恒。

12.3 阀门和运动构件

当阀芯运动轨迹复杂、间隙几何难以用层增删处理时,可用局部重叠网格。若阀门最终形成极小间隙,仍需检查供体空间是否足够,重叠网格不能自动解决零间隙接触。

12.4 车辆超车与相对运动

车辆各自使用独立局部网格,背景域保持固定,可模拟横向和纵向相对运动以及瞬态气动力变化。

12.5 旋转格栅和动态送风

多个格栅可分别定义旋转相位和转速,解析射流周期性扫掠。若格栅只绕固定轴旋转,AMI 往往更经济;若存在摆动、偏心或多个运动自由度,重叠网格更灵活。

13. 常见失败及其原因

13.1 找不到 donor

原因通常是:

  • 重叠区太薄;
  • 局部网格运动超出背景网格;
  • zoneID 错误;
  • patch 或 cellZone 设置错误;
  • 网格尺度差异过大。

13.2 压力残差周期性爆发

可能原因包括:

  • 每步运动过大;
  • 供体模板频繁跳变;
  • 线性求解器不适合非对称矩阵;
  • 重叠区位于强压力梯度区;
  • 通量修正不足。

13.3 质量不守恒

应依次检查:

  1. 边界条件和通量定义;
  2. oversetAdjustPhi
  3. 插值带网格匹配;
  4. 时间步;
  5. PIMPLE 外校正次数;
  6. 标量方程是否也正确应用 overset 约束。

13.4 近壁湍流量异常

检查壁面距离算法、overset 区位置、近壁网格是否随物体完整运动,以及湍流场边界条件。

14. 与 AMI、变形网格的选择

问题特征优先方法
固定轴、规则圆柱接口、连续旋转AMI
小幅边界位移且网格不畸变变形网格
大幅平移、摆动、偏心或六自由度重叠网格
规则活塞运动、可通过层增删保持网格拓扑变化网格
仅需时间平均旋转影响MRF

重叠网格应在几何运动确实需要时使用,而不是作为所有旋转问题的默认方法。

15. 最小验证清单

在正式计算前至少确认:

  • 所有子网格通过 checkMesh
  • zoneID 从 0 连续编号;
  • overset patch 和所有场边界条件完整;
  • 全运动包络内均可找到供体;
  • 插值区避开主要高梯度区;
  • 使用适合非对称矩阵的求解器;
  • 壁面距离算法适用于重叠连接;
  • 已启用并验证必要的通量修正;
  • 入口/出口质量误差可接受;
  • 完成时间步、网格和接口位置敏感性分析。

参考资料

  1. OpenCFD Ltd.:OpenFOAM v2512 dynamicOversetFvMesh 源码说明
  2. OpenCFD Ltd.:Overset 网格使用说明
  3. OpenCFD Ltd.:OpenFOAM v2512 oversetFvPatchField 源码说明
  4. OpenCFD Ltd.:oversetAdjustPhi 通量修正说明

返回“理论基础 · 网格基础”子栏目

Back to Blog

Related Posts

View All Posts »