网格生成 06:六面体网格与“Holy Grail”难题

六面体为什么难

四面体可以通过局部插点自然细化;纯六面体的连接关系更“刚”。在规则体网格中插入一个孤立点,无法只靠很小邻域内的简单操作保持所有单元都是六面体。局部决定会沿 sheet/chord 传播到很远,几何与拓扑强耦合。

六面体网格的目标也不只是 all-hex:还希望边界贴合、特征保持、奇异线少、Jacobian 为正、尺寸渐变合理,并能承受大变形求解。

正则与奇异结构

在内部,正则网格边通常邻接 4 个六面体。价数不为 4 的内部边形成奇异边;奇异边连接成奇异图。边界上正则价数另有约定,不能与内部混用。

从对偶角度:

  • 一层相连六面体形成 sheet;
  • 穿过相对面的序列形成 chord;
  • sheet/chord 的塌缩、膨胀和交换会全局改变连接;
  • 错误操作可能产生非流形、重复单元或负体积。

六类经典路线

路线核心做法优点硬问题
mapping把简单块映到目标体规则、高质只适合可映射几何
sweeping从源面沿方向扫到目标面工程常用、方向自然自动识别可扫体困难
multi-block先分成立方拓扑块质量可控、IGA 友好自动块分解仍难
octree/grid体素覆盖后模板过渡鲁棒、自动、并行边界和奇异结构复杂
polycube变形到轴对齐多立方体可规则采样双射、角点与畸变控制
frame/parameterization3D 标架场再积分方向表达强奇异图可实现性和翻转

还有 plastering、whisker weaving、对偶方法与 hex-dominant 混合网格。它们解决的目标不同,不能只按是否全自动排名。

3D frame field 比 2D cross field 更难

三维标架是三个互相正交方向,但立方体的 24 个旋转对称使相邻单元的标架匹配属于离散群。场的奇异集合通常是一维曲线,不再是离散点。即使平滑标架存在,也未必对应可实现的六面体奇异图。

体参数化希望得到

F:Ω→R3,JF=[∇u  ∇v  ∇w]T,F:\Omega\to\mathbb R^3,\qquad J_F=[\nabla u\;\nabla v\;\nabla w]^T,

并让三个梯度与标架对齐、切缝变换属于立方对称群加整数平移,同时要求det⁡JF>0\det J_F>0。这些约束共同造成非凸、混合离散—连续优化。

Polycube 的逻辑

若存在双射F:Ω→PF:\Omega\to P,其中PP 是轴对齐 polycube,则可在PP 中铺规则体素,再通过F−1F^{-1} 拉回:

H=F−1(Z3∩P).H=F^{-1}(\mathbb Z^3\cap P).

但这句公式隐藏三件难事:构造合理 polycube 拓扑、保证FF 全局双射、让拉回六面体具有正且足够大的 Jacobian。

八节点六面体 Jacobian 检查

对参考立方体[−1,1]3[-1,1]^3 的三线性形函数Ni(ξ,η,ζ)N_i(\xi,\eta,\zeta):

x(ξ,η,ζ)=∑i=18Nixi,J=∂x∂(ξ,η,ζ).x(\xi,\eta,\zeta)=\sum_{i=1}^{8}N_i x_i, \qquad J=\frac{\partial x}{\partial(\xi,\eta,\zeta)}.

下面代码在333^3 个点采样;它适合早期调试,但不是严格全域证明。

import numpy as np

SIGNS = np.array([
    [-1,-1,-1], [ 1,-1,-1], [ 1, 1,-1], [-1, 1,-1],
    [-1,-1, 1], [ 1,-1, 1], [ 1, 1, 1], [-1, 1, 1]
], dtype=float)

def hex_jacobian(vertices, xi):
    vertices = np.asarray(vertices, dtype=float)
    xi = np.asarray(xi, dtype=float)
    dN = np.empty((8, 3))
    for i, (a, b, c) in enumerate(SIGNS):
        x, y, z = xi
        dN[i] = [a*(1+b*y)*(1+c*z),
                 b*(1+a*x)*(1+c*z),
                 c*(1+a*x)*(1+b*y)]
    dN /= 8.0
    return vertices.T @ dN

def sampled_min_det(vertices):
    samples = (-1.0, 0.0, 1.0)
    return min(np.linalg.det(hex_jacobian(vertices, [x,y,z]))
               for x in samples for y in samples for z in samples)

cube = (SIGNS + 1.0) / 2.0
assert sampled_min_det(cube) > 0

为什么“存在”仍不等于“可用”

组合理论可能证明某类边界可以填充 all-hex,但没有同时给出:

  • 小数量单元;
  • 简单奇异图;
  • 无翻转几何嵌入;
  • 可接受的长宽比与边界正交性;
  • 对任意 CAD 容差错误的鲁棒实现。

因此“从拓扑层面解决”和“工业级全自动解决”必须分开表述。

关键资料

自测

  1. 为什么纯 hex 难以像四面体那样局部插点?
  2. polycube 方法最关键的逻辑前提是什么?
  3. 角点 Jacobian 全正是否严格保证三线性 hex 内部有效?

答案:局部修改会沿 sheet/chord 全局传播;到 polycube 的映射必须全局双射且拉回有效;通常不够,需要更完整采样或严格界。

文献深读

octree、whisker weaving、polycube、frame field、体量化、奇异图优化和公开基准的三十年演化,见六面体网格、体参数化与块结构文献谱系。