完备性与重构:原理与诊断验证
从零阶与一阶矩条件出发定义 C0/C1 完备性,手算一维三次样条核下线性场梯度的 2.24% 偏差,并给出 Shepard 归一化与 MLS/CSPM 矩阵重构的适用边界与条件数门槛。
完备性与重构:原理与诊断验证
完备性问的是"离散核能不能把直到某次的多项式原样再现",重构则是把这件事从"希望它成立"变成"用矩阵求逆强制它成立"。二者的分界很清楚:零阶矩条件不满足只损失常数场的精度,一阶矩条件不满足则连线性场的梯度都算不对,而梯度是动量方程里唯一真正用到核导数的量。下面给出矩条件的写法、一次可手算的偏差量级,以及 Shepard 归一化与 MLS/CSPM 各自能修好什么。完备性失效的症状常被误判为物理失稳:自由面压力偏低、近壁速度梯度系统性偏大、加密到 仍不收敛。这些现象与真实的拉伸不稳定、壁面滑移很难从云图上区分,但有一条干净的判别路径——把已知解析多项式灌进离散算子,看它能否原样吐出,且误差按应有的幂次随分辨率下降。
线性场梯度偏差可以手算
动量方程用的是梯度而不是场值。对一维线性场 ,差值形式的梯度近似给出
理想情况下 (连续情形由分部积分得 ),实际值由 决定。取三次样条核 、,在 的均匀点阵上,邻居位于 ,对应导数 ,于是
即线性场梯度被放大了 。把 换成 重算:邻居位于 ,对应 ,得到 ,梯度反而偏小 。两个结果说明 会穿过 ,本例的零点约在 。这个零点不是普适常数,它随核函数、维度和点阵类型变化,所以"梯度偏大还是偏小"必须实测而不能猜。
Shepard 归一化只修零阶矩
最省事的重构是把核按自身求和归一化:
它保证 ,对常数场精确,对自由面尤其有效—— 的表面粒子会被放大 倍,表面密度亏损随之消失。代价是它只动零阶矩:线性场梯度仍然偏百分之几,因为 并没有被强制为零。凡是"加了归一化之后压力还是歪的"的算例,问题通常就在这里。
MLS 与 CSPM 用矩阵求逆补齐一阶矩
要让 完备性对任意粒子分布成立,必须解一个小线性系统。定义修正矩阵
只要 可逆,上式对线性场精确成立,与粒子是否规则无关——这正是 MLS 与 CSPM 相对 Shepard 的根本差别。代价有三条:每步每粒子要求一次 求逆(二维 、三维 ,开销约等于多算一次核梯度); 在近边界处条件数迅速恶化;求逆后的梯度不再与 反对称,会破坏动量守恒。第三条最容易被忽略,实践中常用"内部用 CSPM、边界带用 Shepard"的分区策略折中。
判定 是否可用,看条件数:规则点阵约 , 抖动的点阵约 ,三点近共线时可达 。工程门槛取 ,超过就退回差值形式并改做归一化。
import numpy as np
def mls_gradient(x, f, i, nb, gradW, V):
"""x:(N,d) f:(N,) nb:邻居索引 gradW:(len(nb),d) V:(N,)"""
d = x.shape[1]
M = np.zeros((d, d))
rhs = np.zeros(d)
for k, j in enumerate(nb):
dx = x[j] - x[i]
M -= V[j] * np.outer(dx, gradW[k])
rhs += V[j] * (f[j] - f[i]) * gradW[k]
if np.linalg.cond(M) > 1.0e3: # 退化保护
return None # 退回差值形式 + Shepard 归一化
return np.linalg.solve(M, rhs)
二次场检验拉普拉斯算子
线性基只能再现到一阶,二阶导数需要二次基。用 测试:线性基 MLS 的拉普拉斯相对残差为 ,且随 只按一阶衰减;把二维基函数从 3 个增到 6 个后,残差降到 ,已达双精度舍入水平。代价是每粒子求逆的矩阵从 变成 ,所需最少邻居数从 6 升到 12(实际应留到 )。因此只在黏性主导、且分辨率不足以让二阶项自动变小时才值得升基;多数自由面流动用线性基加差值形式拉普拉斯即可。
完备性用矩条件写成等式
Liu 与 Liu 把完备性按能再现的多项式次数分级。离散核 满足 完备性,指
满足 完备性,指在此基础上还满足
其中 是粒子体积。把 与 合起来看,就是"常数场被精确再现、线性场的加权质心落在粒子自身位置"。这两条一旦成立,任何线性场的核近似都是精确的,误差只剩二阶以上的曲率项。
用解析多项式构造可证伪的试验
patch test 不推进时间:把粒子摆到目标几何上,赋解析多项式值,只调用离散算子(梯度、拉普拉斯、重构),再比较输出与解析值。三类多项式各查一件事——常数场 查零阶矩,线性场 查一阶矩,二次场 查二阶矩。二阶矩之所以要单独查,是因为黏性、扩散、表面张力项都含二阶导数,只满足一阶完备性的格式会在这些项上静默失真。
两个无量纲残差是主判据:
是零阶矩残差,直接反映求和式密度能否再现常数场; 是一阶矩残差,衡量加权质心是否落在粒子自身位置。第二式除以 是为了让阈值不随分辨率漂移,否则同一格式在不同 下会给出不同量级的数,没法横向比较。
故障模式与判定试验
归一化适合自由面、多相界面和几何简单的问题,成本几乎为零。MLS/CSPM 适合近壁高梯度区、非均匀点阵和需要一阶精确梯度的后处理量(涡量、应变率)。两者都不适合:粒子数少于基函数个数时(二维线性基至少需要 6 个非共线邻居,三维至少 10 个;实际取 与 才有余量);拉伸区粒子稀疏到 接近奇异时;以及必须严格守恒的长时间积分,因为求逆破坏了成对反对称。
失效信号很集中: 偏离 1 超过 ,或 超过 ,或修正前后目标量差超过 。出现任一条,先查邻居表是否把边界粒子算进来了,再查是否在同一个算例里混用了两套重构。
十有八九不是公式写错,而是修正矩阵病态。按下面顺序查最快:
- 打印 的最大值。规则点阵约 ,位置抖动 后约 ,三点近共线时可达 ,门槛取 。
- 查邻居表是否纳入边界粒子。漏掉时近壁粒子的 缺一整侧贡献,条件数会跳一个量级。
- 查拉伸区的最小粒子间距。若某粒子的最近邻距离低于 ,它在 中的权重大到能主导求逆。
- 查基函数阶数与邻居数是否匹配:二维线性基至少 6 个非共线邻居,三维至少 10 个;实际分别取 与 才有余量。
import numpy as np
def mls_laplacian(x, f, i, nb, V, W):
"""二维二次基最小二乘,返回 (grad, lap)。基 [1, dx, dy, dx^2, dxdy, dy^2]"""
basis = lambda d: np.array([1.0, d[0], d[1], d[0]**2, d[0]*d[1], d[1]**2])
A = np.zeros((6, 6)); b = np.zeros(6)
for j in nb:
p = basis(x[j] - x[i])
A += V[j] * W[j] * np.outer(p, p)
b += V[j] * W[j] * p * (f[j] - f[i])
if np.linalg.cond(A) > 1.0e3: # 退化保护:退回线性基
return None
c = np.linalg.solve(A, b)
return c[1:3], 2.0 * (c[3] + c[5]) # 梯度, 拉普拉斯
| 现象 | 根因 | 判定试验 |
|---|---|---|
| 常数场精确、线性场梯度偏 2% | 只做了 Shepard 归一化,一阶矩未强制 | 构造 ,比较 与 |
| 表面压力正常、近壁速度梯度失真 | 边界粒子未纳入求和, 矩条件在壁面失效 | 画壁面法向的 剖面 |
| 修正后总动量缓慢漂移 | 求逆后的梯度不再反对称 | 统计 相对 $\sum_i m_i |
| 某几个粒子速度爆掉 | 近奇异,解出巨大修正量 | 记录每步 的最大值 |
| 加密后梯度误差不降 | 点阵规则性差,重构矩阵随分辨率恶化 | 同一分辨率下比较规则点阵与抖动点阵 |
| 线性 patch 残差停在 量级 | 只做了归一化,一阶矩未被强制为零 | 同一点阵分别跑 Shepard 与 MLS,比较 |
| 二次 patch 残差不随加密下降 | 基函数次数低于算子阶数 | 把二维基从 3 个升到 6 个,看残差是否跳到 |
| 自由面 超过 0.2 | 支撑域被切断,外侧质量权重丢失 | 关掉边界粒子重跑,比较 与表面 |
| 个别粒子速度出现尖峰 | 近奇异,解出巨大修正量 | 每步输出 最大值及其粒子坐标 |
| 内部二阶、边界一阶 | 边界一阶矩残缺,与核函数无关 | 仅对边界带启用 MLS,看边界阶数是否回到 2 |
一组二维实测数据说明内部与边界的差距
取二维三次样条核,、、支持半径 ,在 方腔内做三组试验。内部粒子 、;自由面粒子 、;壁面若布置两层边界粒子并纳入求和, 回落到 。
自由面那一行的 0.208 说明五分之一的质量权重被截断在支撑域之外,这已经不是精度问题而是格式失效。阈值因此分两档:内部要求 且 ,边界带允许放宽到 ;任一区域越档,先别动 ,先查边界处理。
内部带与边界带必须分开测阶
把重构误差按粒子到边界的距离分层统计,才能看出差别。对 、, 取 ,用相邻两级的 $L_2$ 误差拟合阶数:
手算一次:原始核近似在 时 ,在 时 ,于是 。继续加密到 得 ,相邻阶 ,内部带稳定在二阶。
边界带(距边界 内)的对照更能说明问题:
三行把结论钉死了:归一化只强制 ,一阶矩在截断处依旧残缺,所以阶数卡在 1;MLS 用矩阵求逆把一阶矩强行补上,边界带才回到接近二阶。若算例只在边界带塌阶,换核函数没有意义,加一层 MLS 或增厚边界粒子层才有效。
| 处理方式 | 内部带 $L_2$ 阶 | 边界带 $L_2$ 阶 |
|---|---|---|
| 原始核近似 | 1.96 | 1.01 |
| Shepard 归一化 | 1.99 | 1.04 |
| 线性基 MLS | 2.00 | 1.91 |
参考资料
- Liu G.R., Liu M.B., Smoothed Particle Hydrodynamics: A Meshfree Particle Method, World Scientific, 2003.
- Chen J.K., Beraun J.E., A generalized smoothed particle hydrodynamics method for nonlinear dynamic problems, Computer Methods in Applied Mechanics and Engineering, 190(1-2): 225-239, 2000.
- Dilts G.A., Moving-least-squares-particle hydrodynamics I: Consistency and stability, International Journal for Numerical Methods in Engineering, 44(8): 1115-1155, 1999.
- Belytschko T., Krongauz Y., Organ D., Fleming M., Krysl P., Meshless methods: An overview and recent developments, Computer Methods in Applied Mechanics and Engineering, 139: 3-47, 1996.
- Randles P.W., Libersky L.D., Smoothed particle hydrodynamics: some recent improvements and applications, Computer Methods in Applied Mechanics and Engineering, 139(1-4): 375-408, 1996.
- Liu M.B., Liu G.R., Lam K.Y., Constructing smoothing functions in smoothed particle hydrodynamics with applications, Journal of Computational and Applied Mathematics, 155(2): 263-284, 2003.
- Chen J.K., Beraun J.E., Jih C.J., Completeness of corrective smoothed particle method for linear elastodynamics, Computational Mechanics, 24(4): 273-285, 1999.
- Liu M.B., Liu G.R., Smoothed particle hydrodynamics (SPH): an overview and recent developments, Archives of Computational Methods in Engineering, 17: 25-76, 2010.