snappyHexMesh 表面质量:工程设置与参数选择
从弦高偏差反算 STL 三角面尺寸与表面加密级别,给出 surfaceCheck、surfaceFeatureExtract 的字段取值和薄壁、自交、法向不一致的定位方法。
snappyHexMesh 表面质量:工程设置与参数选择
STL 的表面质量决定了 snappyHexMesh 能贴出多好的壁面,参数只能在这个上限之内调。真正需要在导入前定下来的只有三件事:三角面尺寸是否足以把曲率误差压到容许值、表面是否封闭且法向一致、哪些棱边必须作为特征保留。这三件事都可以在 snappyHexMesh 运行之前用 surfaceCheck 和 surfaceFeatureExtract 判定。
弦高偏差决定三角面尺寸
把半径为 的圆柱面离散成夹角 的折线时,弦到弧的最大偏差为
反解出给定容许偏差 所需的最大弦长 :
这条式子是把 CAD 公差翻译成网格要求的标准做法。设圆柱半径 、允许的表面偏差 ,则
即三角面弦长不应超过 8.9 mm。若背景网格 ,需要 ,即 ,取 。这与 refinementSurfaces 里给该表面 level (2 3) 的下限一致:最低 2 级保证曲率偏差达标,最高 3 级用于处理小特征。
反过来,如果拿到的 STL 弦长只有 3 mm,那么表面加密级别只需满足几何特征分辨率,而不必再为曲率买单,可以省下大量单元。
特征边提取的夹角判据
surfaceFeatureExtract 用 includedAngle 判定哪条边算特征边。设两侧三角面外法向为 ,法向夹角 ,则表面内二面角为 :
平面处 、,不会被标记;直角棱 、,只要 includedAngle 大于 90° 就会被标记。默认值 150 相当于把法向偏转超过 的边全部收进来。一个 的倒圆若被离散成 20 段,每段转角 ,不会误判成特征边,这是合理的;但若该圆角只用了 3 段(每段 ),就会整条被标成特征,snap 阶段反而会把它锁成折线。
// surfaceFeatureExtractDict
body.stl
{
extractionMethod extractFromSurface;
includedAngle 150;
subsetFeatures
{
nonManifoldEdges no;
openEdges yes;
}
}
surfaceCheck 的三个必看项
surfaceCheck 的输出里有三项直接决定 snappyHexMesh 能不能跑通:封闭性、自交数量、连通部件数。
surfaceCheck body.stl | tee log.surfaceCheck
surfaceFeatureExtract | tee log.surfaceFeatureExtract
典型合格输出应包含 Surface is closed、Surface has no self-intersections、Surface has 1 unconnected part,以及 Min/max edge length。若 unconnected part 是 2 以上,说明几何里有多余的碎片或垫片,snappyHexMesh 会把它们当成独立实体切割,产生额外的封闭腔体。若 open edges 非零,locationInMesh 的“内外”判定就没有定义,切割阶段会随机保留一侧。
边长的 min/max 也值得对照:若最小边长是 而最大是 ,跨度达到 5 万倍,snap 阶段在小面上几乎必然过冲。工程做法是先对 STL 做一次简化,把小面合并到 以上,再进入网格流程。
薄壁与间隙的判定
壁厚 与背景单元 的比值决定了能不能保住这条通道。经验护栏是
其中 是该处加密后的单元尺寸。设换热器翅片厚度 、翅片间距 ,背景单元 ,则需要 ,即 ,对应 ,,取 。若按 6 级加密,,翅片间只能放 个单元,勉强可算;若把 降到 4,,间隙里只剩 1.6 个单元,缝隙会被直接填死。
失败模式与判定
| 现象 | 根因 | 判定试验 |
|---|---|---|
Cannot find a cell outside the mesh |
STL 不封闭或整体法向反 | surfaceCheck 的 Surface is closed 是否为真 |
| 吸附后壁面出现漏面 | 三角面自交或存在退化面 | surfaceCheck 报告的 self-intersection 数量与位置 |
| 尖角被抹圆 | 该棱边未被提取为特征边 | 统计 .eMesh 中该棱上的特征点个数 |
| 局部曲面欠解析、出现棱角 | 三角面弦长大于 | 量测 STL 边长并与容许弦长对照 |
| 薄壁通道被填死 | 壁厚小于 | 量测壁厚与局部单元尺寸之比 |
| 出现多余的封闭腔体 | 表面有多个 unconnected part |
surfaceCheck 的连通部件计数 |
snap 在小面上过冲 |
面尺寸跨度过大(>10⁴ 倍) | 对比 Min/max edge length |
| 同一个几何每次切割结果不同 | 表面存在非流形边 | surfaceCheck 的 non-manifold edges 计数 |
表面清理与归档
清理顺序建议固定为:合并重复点 → 删除退化三角形 → 修补孔洞 → 统一法向 → 提取特征边。每步之后重跑 surfaceCheck,并把三项关键输出抄进记录。用 surfaceMeshTriangulate 或 surfaceReduction 可以降低面数,但降面会同时放大弦高偏差,必须用 复核。
归档内容:原始 STL 的哈希、清理后 STL 的哈希、log.surfaceCheck、log.surfaceFeatureExtract、.eMesh 文件、以及 refinementSurfaces 中该表面的 level 取值。这五样齐了,换人复算时才能在不动几何的前提下只调网格参数。
参考文献
- OpenFOAM Foundation, OpenFOAM User Guide v11, §4.3 “Surface preparation” 与 §4.4 snappyHexMesh, 2023.
- OpenFOAM v11 源码
src/surfMesh/surfaceCheck/、src/utilities/surface/surfaceFeatureExtract/。 - J. F. Thompson, B. K. Soni, N. P. Weatherill (eds.), Handbook of Grid Generation, CRC Press, 1999, Chapter 1 “Surface definition and chordal deviation”.
- P. J. Frey, P.-L. George, Mesh Generation: Application to Finite Elements, 2nd ed., ISTE/Wiley, 2008, §5.2 “Geometric error and sizing”.
- S. J. Owen, “A survey of unstructured mesh generation technology”, Proceedings of the 7th International Meshing Roundtable, pp. 239–267, 1998.
- C. Geuzaine, J.-F. Remacle, “Gmsh: a three-dimensional finite element mesh generator with built-in pre- and post-processing facilities”, International Journal for Numerical Methods in Engineering, 79(11): 1309–1331, 2009.