overset 重叠网格在 OpenFOAM 中的计算流程(v2406)
v2406-overset整体计算流程
twoSimpleRotor
Allrun.pre
1 | !/bin/sh |
Allrun
1 | #!/bin/sh |
overset在数值配置文件上需要额外设置的地方
例如,fvSchemes:
1 | oversetInterpolation |
fvSolution
1 | cellDisplacement |
v2406-overset网格处理流程
该脚本展示了在 OpenFOAM 中构建重叠网格(Overset Mesh)的一种特定策略:基于单块网格的区域分割法。它不是生成两个独立网格再合并,而是生成一个网格,修剪它,然后通过 ID 区分不同区域。
流程步骤(blockMesh+topoSet+subsetMesh,工程上难以适用)
1. 生成基底 (blockMesh)
- 操作:
runApplication blockMesh - 目的: 创建一个覆盖全域的初始六面体网格块。
2. 定义几何形状 (topoSet -s 1)
- 操作: 运行
topoSet选择一组特定的网格单元(CellSet)。 - 目的: 标记出计算域的实际几何范围(例如,标记出一个名为
box的集合)。
注:可以用foamToVTK -cellSet setName(-cellSet选项仅在基金会版本中有),然后用paraview来读取VTK来看不同的set。.com版本,可以用命令setsToZone,把sets变为cellZone,在paraview中read zone然后再extract blocks。
3. 网格修剪与边界重命名 (subsetMesh)
- 操作:
runApplication subsetMesh box -patch hole -overwrite - 目的:
- 保留: 仅保留上一步选中的
box集合内的网格,删除其余部分。 - 补丁: 将切割产生的裸露面(原内部面)命名为边界补丁
hole。 - 意义: 这一步确定了网格的最终拓扑结构。在重叠网格中,这个
hole边界通常后续会被指定为overset边界类型。
- 保留: 仅保留上一步选中的
4. 标记重叠区域 (topoSet -s 2)
- 操作: 再次运行
topoSet。 - 目的: 在修剪后的网格中,根据空间位置区分出不同的功能区域。例如,分别选中“背景区域”和“转子区域”,并将它们存为不同的
cellSet。
5. 初始化 ZoneID (setFields)
- 操作:
runApplication setFields - 目的: 核心步骤。
- 利用上一步生成的
cellSet,修改zoneID场(一个volScalarField,实际存储整数)。 - Zone 0: 通常设为背景网格。
- Zone 1, 2…: 设为运动部件(转子)。
overInterFoam求解器依赖此 ID 来识别哪些网格单元作为一个刚体整体进行运动。
- 利用上一步生成的
topoSet
在OpenFOAM-v2406中,regionsToCell依赖于controlDict中的:
1 | libs (overset fvMotionSolvers); |
没有上述,将会:
1 |
|
topoSet example
1 | /*--------------------------------*- C++ -*----------------------------------*\ |
核心逻辑总结
- 画 (BlockMesh) -> 选 (TopoSet) -> 切 (SubsetMesh) -> 分 (TopoSet) -> 赋ID (SetFields)。
- 最终结果是一个包含多个不连续(或逻辑上分离)区域的网格文件,每个区域通过
zoneID进行区分,准备好进行重叠网格计算。
这是一个 OpenFOAM 重叠网格(Overset Mesh)案例的完整工作流程整理。该流程通过分步生成子网格,最后在一个主背景网格中合并并计算。
总体流程概览(blockMesh,snappyHexMesh,mergeMesh,topoSet)
网格剖分结果

整个模拟分为三个主要部分并行准备,最后统一汇总:
- 生成部件 1 网格 (overset-1):通常是一个独立的运动物体(如船体 Hull)。
- 生成部件 2 网格 (overset-2):通常是另一个独立的运动物体(如螺旋桨/旋转区域)。
- 背景网格与求解 (background):生成背景流场,合并上述两个部件,进行重叠区域标记,最后并行计算。
子网格生成:Overset-1 (船体)
该步骤在 overset-1 文件夹下进行,目的是生成包含第一个物体的独立网格。
- 准备几何文件:
- 创建
constant/triSurface目录。 - 拷贝几何文件
HULL.obj.gz到该目录。
- 创建
- 生成基础网格:
- 运行
blockMesh生成背景块。
- 运行
- 特征提取:
- 运行
surfaceFeatureExtract提取几何的特征边(用于网格加密)。
- 运行
- 并行网格划分 (SnappyHexMesh):
decomposePar:将区域进行并行分解。snappyHexMesh -overwrite:并行运行网格划分工具,生成贴体网格。
- 网格重组与优化:
redistributePar -reconstruct -constant -overwrite:将并行生成的网格合并回constant目录。renumberMesh -constant -overwrite:优化网格编号以提高读取和计算效率。
子网格生成:Overset-2 (推进器/旋转部件)
该步骤在 overset-2 文件夹下进行,流程与 Overset-1 几乎完全一致,只是几何不同。
- 准备几何文件:
- 创建
constant/triSurface目录。 - 拷贝几何文件
BLADES.obj.gz,HUB.obj.gz,MRF_REGION.obj.gz。
- 创建
- 生成基础网格:
- 运行
blockMesh。
- 运行
- 特征提取:
- 运行
surfaceFeatureExtract。
- 运行
- 并行网格划分:
decomposePar:并行分解。snappyHexMesh -overwrite:生成贴体网格。
- 网格重组与优化:
redistributePar -reconstruct -constant -overwrite:合并网格。renumberMesh -constant -overwrite:优化网格。
背景网格准备 (Background Pre-processing)
该步骤在 background 文件夹下进行,目的是生成最外层的流场区域。
- 生成背景基础网格:
- 运行
blockMesh生成大的计算域。
- 运行
- 背景网格细化(可选但常见):
- 运行
snappyHexMesh -overwrite对背景关注区域进行加密(通常不包含具体几何,只是加密空间)。
- 运行
网格合并与模拟运行 (Background Main Run)
这是最关键的步骤,将所有子网格整合并开始计算。
- 初始化:
restore0Dir:恢复初始场文件(0文件夹)。
- 合并网格 (Merge Meshes):
mergeMeshes . ../overset-1 -overwrite:将 overset-1 的网格合并到当前背景网格中。mergeMeshes . ../overset-2 -overwrite:将 overset-2 的网格合并到当前背景网格中。- 注:此时网格虽然在同一个算例里,但物理上还是重叠且互不连通的。
- 创建重叠边界 (Patch Creation):
createPatch -overwrite:根据字典配置,将特定的面(通常是 merged 进来的子网格的外边界)转换为overset类型的边界条件。
- 区域标记与场设置 (Zone & Fields):
topoSet(第一次):创建 cellSet,用于标记特定的区域(如初始液面位置或特定的重叠区域)。setFields:根据topoSet的结果或其他几何,初始化流场数据(如 alpha.water 相分数,或初始速度场)。topoSet(第二次, 可选):使用topoSetDict.cHullProp,可能用于标记船体或螺旋桨特定的计算域属性。
- 并行计算:
decomposePar -force:将合并后的巨大网格进行区域分解,准备并行。runParallel $(getApplication):运行主求解器(如overInterDyMFoam或overPimpleDyMFoam)。求解器会在第一步自动进行 Hole Cutting(挖洞),确定哪些网格参与计算,哪些被屏蔽。
- 结果重组:
redistributePar -reconstruct -overwrite:计算完成后,将分散的并行结果合并回主文件夹以便后处理。
流程总结
flowchart TB
%% 定义样式
classDef subMesh fill:#e1f5fe,stroke:#01579b,stroke-width:2px;
classDef bgMesh fill:#fff3e0,stroke:#ef6c00,stroke-width:2px;
classDef merge fill:#e8f5e9,stroke:#2e7d32,stroke-width:2px;
classDef process fill:#f5f5f5,stroke:#333,stroke-width:1px;
%% 总流程入口
Start((Start)) --> Parallel_Gen
%% 并行生成子网格部分
subgraph Parallel_Gen [并行生成独立网格]
direction LR
%% Overset-1 分支
subgraph Overset1 [Component 1 Hull]
direction TB
O1_Geo[拷贝几何 HULL.obj] --> O1_BM[blockMesh]
O1_BM --> O1_SFE[surfaceFeatureExtract]
O1_SFE --> O1_Decomp[decomposePar]
O1_Decomp --> O1_SHM[snappyHexMesh]
O1_SHM --> O1_Recon[redistributePar -reconstruct]
O1_Recon --> O1_Renumber[renumberMesh]
end
%% Overset-2 分支
subgraph Overset2 [Component 2 Propeller]
direction TB
O2_Geo[拷贝几何 BLADES/HUB.obj] --> O2_BM[blockMesh]
O2_BM --> O2_SFE[surfaceFeatureExtract]
O2_SFE --> O2_Decomp[decomposePar]
O2_Decomp --> O2_SHM[snappyHexMesh]
O2_SHM --> O2_Recon[redistributePar -reconstruct]
O2_Recon --> O2_Renumber[renumberMesh]
end
%% Background 分支 (Pre)
subgraph BackgroundPre [Background Mesh]
direction TB
BG_BM[blockMesh] --> BG_SHM[snappyHexMesh]
end
end
%% 连接各部分到合并阶段
O1_Renumber --> Merge_Process
O2_Renumber --> Merge_Process
BG_SHM --> Merge_Process
%% 合并与求解设置
subgraph Merge_Process [合并与装配 Background Dir]
direction TB
M1[mergeMeshes: 引入 Overset-1]:::merge
M2[mergeMeshes: 引入 Overset-2]:::merge
CP[createPatch: 定义 overset 边界]:::process
TS1[topoSet: 标记流体区域]:::process
SF[setFields: 初始化物理场]:::process
TS2[topoSet: 标记部件属性]:::process
M1 --> M2 --> CP --> TS1 --> SF --> TS2
end
%% 求解与后处理
TS2 --> Final_Calc
subgraph Final_Calc [求解]
direction TB
DecompFinal[decomposePar]:::process
Solver[运行并行求解器<br>自动进行 Hole Cutting]:::merge
ReconFinal[redistributePar -reconstruct]:::process
DecompFinal --> Solver --> ReconFinal
end
ReconFinal --> End((End))
%% 应用样式
class Overset1,Overset2 subMesh;
class BackgroundPre bgMesh;
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.
