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

OpenFOAM v2512 拓扑变化网格:层增删、接口连接与专用动态网格

讲解 OpenFOAM v2512 中拓扑变化网格的基本理论、场映射、层增加与删除、attach/detach、滑动接口、阀门和活塞类应用,以及建模和验证流程。

本文以 OpenCFD 发布的 OpenFOAM v2512 为基准。拓扑变化网格包含较多专用类,不同算例的字典结构差异较大。文中的字典片段用于说明组织方式,实际运行应以 v2512 对应类的源码、运行时帮助和教程为准。

1. 什么是拓扑变化

移动/变形网格只改变网格点坐标,单元、面和点之间的连接关系保持不变。拓扑变化网格则允许计算过程中改变离散网格本身,例如:

  • 增加或删除一层单元;
  • 把一个接口从断开状态连接起来;
  • 把相连区域重新断开;
  • 重新配对滑动界面的面;
  • 分裂或合并单元;
  • 改变单元数量、面数量或邻接关系。

因此,拓扑变化不仅要更新几何量,还必须重建:

  • ownerneighbour 关系;
  • 边界 patch 面列表;
  • cellZone、faceZone 和 pointZone;
  • 单元中心、面中心和体积;
  • 离散场从旧网格到新网格的映射。

OpenFOAM 的 dynamicFvMesh 抽象框架允许网格发生几何变化、拓扑变化或两者同时发生。

2. 为什么不总是使用变形网格

以往复活塞为例。若活塞向上移动而网格拓扑固定,活塞顶面附近的单元会持续被压缩:

初始: |  |  |  |  |  |
压缩: | |||||||||||||| |

随着间隙减小,单元高度接近零,容易出现:

  • 非正交角急剧增大;
  • 面权重恶化;
  • 单元体积过小;
  • 网格 Courant 数过高;
  • 最终产生负体积。

若在活塞接近一层网格高度时删除该层,剩余单元可以保持合理纵横比;活塞反向运动时再增加网格层。这就是 layer addition/removal 的基本思想。

拓扑变化网格适合运动规律明确、几何连接变化具有结构性的问题。若运动轨迹任意且难以定义层或接口,重叠网格往往更灵活。

3. 三类典型拓扑操作

3.1 网格层增加与删除

层增删通常依赖一个可识别的 faceZone 或 cellLayer。算法根据局部层厚度与目标厚度判断:

  • 层被压缩到下限时删除;
  • 间隙增大到上限时增加;
  • 新增单元由邻近单元复制或插值场值;
  • 删除单元的守恒量映射到保留单元。

可概括为:

运动边界位移

计算目标层厚度

是否低于删除阈值?——是→删除一层
    ↓否
是否高于增加阈值?——是→增加一层

更新网格和场

层增删特别适合:

  • 活塞缸;
  • 直线阀芯;
  • 规则往复压缩腔;
  • 沿一条坐标方向伸缩的区域。

3.2 接口连接与断开

Attach/detach 用于两个网格区域在运动过程中改变连接状态。

  • attach:将两侧相对应的边界面连接为内部面;
  • detach:把内部连接重新拆成两个边界 patch。

典型场景包括阀门闭合、机械接触前后的流道切换,以及某些多区域模型的临时连接。

接口连接不应只按几何距离触发,还要考虑:

  • 两侧面是否可配对;
  • 面法向是否相反;
  • 面积覆盖是否充分;
  • 连接后的单元是否有效;
  • 何时更新边界条件和通量。

3.3 滑动接口重连

传统 sliding interface 会随着转子转动改变界面面之间的拓扑连接。与 AMI 不同,AMI 通常保持两侧 patch 独立并通过非共形插值传递;拓扑滑移接口则可能显式切割、配对或重构连接。

该方法可用于混合器和旋转机械,但实现和维护成本较高。现代固定轴旋转问题通常优先考虑 cyclicAMI,除非已有经过验证的专用拓扑网格框架。

4. v2512 中的相关类

v2512 仍包含若干面向特定机构的动态拓扑类,例如:

topoChangerFvMesh
movingConeTopoFvMesh
linearValveFvMesh
linearValveLayersFvMesh
mixerFvMesh

这些名称反映了其用途:

  • movingConeTopoFvMesh:移动锥体类问题;
  • linearValveFvMesh:直线阀门运动;
  • linearValveLayersFvMesh:阀门运动与网格层处理;
  • mixerFvMesh:混合器或滑动接口类问题。

需要注意,这些类不是一套统一的“万能拓扑变化字典”。每个类可能要求不同的:

  • faceZone 名称;
  • cellZone 名称;
  • pointZone 名称;
  • 运动函数;
  • layer 参数;
  • attach/detach 接口;
  • 阀门或活塞几何参数。

使用前应先运行:

foamDictionary constant/dynamicMeshDict

并结合:

foamHelp -entry dynamicFvMesh
foamSearch $FOAM_TUTORIALS dynamicFvMesh

查找 v2512 本机安装中的实际示例。

5. 拓扑更新中的场映射

网格改变后,旧网格上的场不能直接逐单元复制,因为单元数量和连接关系已变化。需要建立网格映射:

[ \phi^{new}=\mathcal{M}(\phi^{old}) ]

其中 (\mathcal{M}) 表示从旧网格到新网格的插值或守恒映射。

不同类型变量的要求不同:

5.1 单元中心标量和矢量

如 (p)、(T)、(U)、组分质量分数,可通过体积权重或邻域插值映射。但应保持:

  • 压力场平滑;
  • 温度和浓度有界;
  • 速度不产生非物理跳变。

5.2 面通量

质量通量 phi 是压力—速度耦合的关键。拓扑变化后新增面或删除面,需要重新构造或修正通量,确保离散连续性:

[ \sum_f \phi_f = 0 ]

若只映射 U 而未正确处理 phi,拓扑事件后常出现压力残差爆发。

5.3 守恒标量

对于相分数、组分质量、焓和颗粒浓度,应优先关注积分守恒:

[ Q=\sum_c \phi_c V_c ]

拓扑更新前后的 (Q) 不应无故改变。若物理边界在拓扑事件期间确实做功或有质量交换,则应把真实源项和数值映射误差区分开。

6. 几何守恒律与网格运动通量

移动控制体上的有限体积方程需要满足几何守恒律。对于任意单元:

[ \frac{dV}{dt}=\sum_f \phi_{mesh,f} ]

式中 (\phi_{mesh,f}) 是网格面扫掠体积通量。

拓扑变化时,新旧网格之间没有简单的一一对应关系,几何守恒处理更复杂。若网格体积变化与网格通量不一致,即使流体保持静止,也可能产生虚假速度或压力波动。

因此应在无流动或均匀流场条件下先做“空运动测试”:

  • 设定均匀速度或静止场;
  • 仅执行一个完整运动周期;
  • 检查速度、压力和总质量是否保持;
  • 检查每次 layer/attach 事件后的残差峰值。

7. 层增删网格的设计原则

7.1 层厚阈值

增加和删除阈值不应完全相同,否则在临界位置附近可能频繁增删,形成数值抖动。应设置一定滞回区:

删除阈值 < 保持区 < 增加阈值

7.2 层方向

层面应尽量与运动方向正交。若运动边界倾斜或曲率变化很大,新增单元可能产生高偏斜。

7.3 面网格一致性

新增层的面拓扑来自既有界面,要求:

  • faceZone 连续;
  • 面法向方向一致;
  • 不存在裂缝、重复面和非流形边;
  • 层内单元可形成完整闭合体积。

7.4 最小间隙

拓扑变化可以缓解单元压缩,但不能跨越物理上零厚度的几何奇点。阀门完全关闭时,需要明确采用:

  • detach/attach;
  • 封闭边界切换;
  • 保留有限最小间隙;
  • 或专门接触模型。

8. 一个通用建模流程

第一步:确定拓扑事件

先用运动学图明确:

  • 哪些边界移动;
  • 哪些网格层会增删;
  • 哪些接口会连接或断开;
  • 事件发生的位移、时间或几何条件。

第二步:生成适合层处理的初始网格

建议:

  • 运动方向上保持规则层;
  • 避免在 layer 区使用大量随机多面体;
  • 将复杂几何变化限制在层区之外;
  • 明确 faceZone、cellZone、pointZone。

第三步:设置 dynamicMeshDict

示意结构如下:

dynamicFvMesh  linearValveLayersFvMesh;

linearValveLayersFvMeshCoeffs
{
    // 以下名称和关键字需按具体 v2512 类核对
    valvePatch       valve;
    pistonPatch      piston;
    layerZone        movingLayerFaces;
    minLayerThickness ...;
    maxLayerThickness ...;
    // 运动规律、轴线及接口设置
}

该片段用于展示“选择专用动态网格类 + 对应 Coeffs 子字典”的结构,不应未经核对直接运行。

第四步:定义运动边界条件

移动壁面速度应与网格运动一致。对于无滑移壁面,常用移动壁面速度边界条件或由网格速度自动处理的条件。必须确认:

  • 绝对速度还是相对速度;
  • 通量是否包含网格运动;
  • 运动边界处的压力法向梯度;
  • 湍流壁面函数能否在拓扑更新后正确重建。

第五步:逐步测试拓扑事件

不要直接运行完整物理模型。建议顺序:

  1. 仅网格运动,不求解流动;
  2. 单次增加层;
  3. 单次删除层;
  4. 单次 attach;
  5. 单次 detach;
  6. 完整运动周期;
  7. 加入层流流动;
  8. 最后加入湍流、传热、组分或多相模型。

9. 时间步选择

拓扑事件通常发生在离散时间点。时间步过大会造成:

  • 一次跨过多层厚度;
  • 新增/删除单元数量过多;
  • 事件时刻与真实运动不一致;
  • 场映射变化过强;
  • 压力校正难以收敛。

除流动 Courant 数外,应限制每步边界位移:

[ C_{mesh}=\frac{|U_{mesh}|\Delta t}{\Delta x_{layer}} ]

其中 (\Delta x_{layer}) 为层区特征厚度。一般应使运动在若干时间步内逐渐接近阈值,而不是一步跨越多个单元层。

10. 典型应用案例

10.1 内燃机活塞与气门

活塞运动改变燃烧室容积,气门还涉及开启、闭合和狭小间隙。可组合:

  • 活塞方向层增删;
  • 气门附近局部拓扑处理;
  • 接口连接/断开;
  • 燃烧、喷雾和传热模型。

该类算例的主要难点是拓扑事件与喷射、点火、湍流和壁面换热同时发生,必须验证质量、能量和组分守恒。

10.2 往复式压缩机

活塞周期运动适合层增删。可研究:

  • 容积效率;
  • 阀片动态;
  • 余隙容积;
  • 压力脉动;
  • 泄漏与温升。

若阀片为柔性大变形,单纯专用拓扑网格可能不足,需要与变形网格、FSI 或重叠网格组合。

10.3 线性阀门

阀芯沿轴线移动,流通面积随位移变化。规则轴向运动可用 linearValve... 类框架。若阀芯偏心、转动或几何高度复杂,重叠网格更容易实施。

10.4 搅拌器和旋转混合器

历史上可通过 sliding interface 或 mixerFvMesh 处理旋转区。对标准固定轴问题,AMI 通常更直接;拓扑滑移方法更适合既有经过验证的专用模型。

11. 与其他动态网格方法的比较

方法是否改变拓扑优势主要限制
变形网格无插值、实现直观大位移导致网格畸变
AMI通常否固定轴旋转成熟、界面清晰运动需适配滑移接口
重叠网格子网格内部通常否复杂大运动灵活插值和守恒复杂
拓扑变化规则机构可保持高质量网格设置、映射和调试复杂
动态加密自动追踪高梯度不能独立描述固体运动

拓扑变化网格不是“比重叠网格更高级”,而是适用于不同运动结构。

12. 常见问题

12.1 增加层后出现极差单元

检查 layer faceZone 是否连续、运动方向是否与层法向一致、相邻面尺寸是否突变,以及阈值是否允许一次增加过厚单元。

12.2 拓扑事件后压力发散

检查:

  • phi 是否被正确重构;
  • PIMPLE/PISO 是否有足够校正;
  • 新单元场值是否合理;
  • 时间步是否过大;
  • 边界条件是否在 patch 变化后仍有效。

12.3 总质量或组分突然跳变

记录拓扑事件前后:

[ M=\sum_c \rho_c V_c, \qquad M_i=\sum_c \rho_c Y_{i,c}V_c ]

若没有真实边界交换,跳变主要来自场映射、通量重构或有界性修正。

12.4 attach 后接口泄漏

检查面配对、面法向、覆盖率、重复面和连接后的内部面方向。可用 checkMesh -allTopology 检查非法内部面和非流形连接。

13. 验证清单

  • 初始网格拓扑和几何均通过 checkMesh
  • faceZone/cellZone/pointZone 名称与字典一致;
  • 每个增加、删除、连接、断开事件都单独测试;
  • 拓扑事件前后无负体积和严重偏斜;
  • 网格运动通量满足几何守恒;
  • phi 在更新后得到正确修正;
  • 质量、能量、相分数和组分积分量连续;
  • 完整周期结束后网格和场不存在累积漂移;
  • 完成时间步和层厚阈值敏感性分析;
  • 与实验、理论容积变化或简化模型进行对比。

参考资料

  1. OpenCFD Ltd.:OpenFOAM v2512 动态网格类层次
  2. OpenCFD Ltd.:OpenFOAM v2512 linearValveLayersFvMesh
  3. OpenCFD Ltd.:OpenFOAM v2512 attachInterface 源码
  4. OpenCFD Ltd.:OpenFOAM v2512 slidingInterface 类成员

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

Back to Blog

Related Posts

View All Posts »