**SPH(光滑粒子流体动力学)**把连续介质离散为携带质量、速度、内能的粒子,物理量通过核函数在邻域粒子上加权插值得到——没有网格,就没有网格畸变。它是爆炸抛掷、超高速碰撞、射流形成等极端大变形问题的主力算法,代价是张力不稳定、边界精度与计算开销三大顽疾。
上一节网格三活法各有死穴,本节干脆把网格扔掉:当问题里"任何连通的网格都活不过十毫秒"时,无网格法登场。
SPH 的出发点朴素:任何一点的场量,用周围粒子的值加权平均出来。权重就是核函数——一个随距离衰减的光滑函数,只在一个支持域半径内非零。导数运算转移到位子上:对核函数求导代替对场量求导,于是第 1 章的守恒方程组变成一组粒子间的相互作用(邻域内的压力梯度、人工粘性力、能量交换)。每个粒子像带着身份证的微小观察者,走到哪算到哪。
这个结构带来爆炸问题最需要的性质:拓扑自由。土石抛掷中一块飞石裂成三块、射流拉成细丝再断裂,粒子集合自然分开,无需任何网格重划或界面追踪。同样逻辑的无网格家族还有物质点法(MPM,粒子在背景网格间穿梭,岩土动力学新宠)和离散元(DEM,显式模拟颗粒接触)。
SPH 粒子不是越密越好:粒子间距必须显著小于被模拟波的波长,否则波在粒子尺度上"看不见"。用 Python 做一次离散度核算:
# SPH 粒子分辨率核算:接触爆炸驱动钢板 import math # 钢板厚 10 mm,其中应力波波长量级 = 波速 x 脉宽 c0, tau = 5100.0, 2.0e-6 # 波速 m/s,脉冲 2 微秒 lam = c0*tau # 波长空间尺度 print(f"脉冲空间波长约 {lam*1e3:.1f} mm") # 经验准则:波长方向至少 6~10 个粒子 for n in (6, 10): dx = lam/n print(f"每波长 {n} 粒子 → 粒子间距 dx = {dx*1e3:.2f} mm") # 厚度方向 10 mm 至少 3~4 层 dx = min(lam/8, 10/4) print(f"综合取 dx = {dx*1e3:.2f} mm") # 三维 100x100x10 mm 板的粒子数估算 Nx, Ny, Nz = int(100/ (dx*1e3)), int(100/(dx*1e3)), int(10/(dx*1e3)) print(f"板离散为约 {Nx}x{Ny}x{Nz} = {Nx*Ny*Nz} 粒子(仅板,不含炸药与空气)")
输出:脉冲空间波长约 10.2 毫米;每波长 8 粒子时间距约 1.3 毫米;仅钢板一项就需约 4.6 万粒子,加上炸药与空气域轻松上十万。粒子数直接决定邻域搜索开销,这就是 SPH"精度自由、算力买单"的直观体现。
无网格不是免费午餐,三个已知问题与对策:
| 顽疾 | 表现 | 对策 |
|---|---|---|
| 张力不稳定 | 拉伸状态下粒子成团、数值断裂 | 人工应力项、改用粒子对粒子修正格式 |
| 边界缺陷 | 核函数在边界被截断,密度被低估 | 边界虚粒子、核函数修正 |
| 邻域开销 | 每步都要找邻居,比同规模网格贵 | 树搜索、预排序邻域表 |
⚠️ 常见坑:SPH 结果里出现"粒子串"或材料异常成团,先怀疑张力不稳定而不是物理现象。判别方法:加密粒子重算,真物理特征随加密收敛,数值假象随加密移动或消失。这条"网格无关性检验"是无网格结果进入勘测报告的前置条件。
图:无网格法的使用决策与检验闭环。最后一步"与实验对账"是第 5.3 节的主题。
物质点法(MPM)把材料离散为拉格朗日粒子、在背景欧拉网格上解动量方程,兼得两套描述的优点:粒子携带历史量(应力、损伤)不丢失,网格规则无畸变,特别适合岩土大变形——边坡爆破抛掷、地基冲击成坑近年大量采用。离散元(DEM)则干脆承认离散性:每个颗粒是一个单元,接触算法显式求解颗粒间力链,天然适合块石堆爆破块度预测与碎裂流。三者分工的经验法则:关心连续介质的波与变形用 SPH 或 MPM,关心块体运动与堆积形态用 DEM,混合问题(爆堆)用耦合方案。
选型的最后一条判据是"证据对齐":勘测复算的目的是对账现场证据,证据是块度曲线就选能输出块度的方法,证据是波形就选能算波的传播的方法。方法输出与证据类型对不上,再先进的算法也只是昂贵的图画。
无网格与网格的混合使用同样是实用套路:关心区域内用 SPH 粒子,远场用网格,粒子进入网格区时按守恒转换成网格量。爆炸抛掷问题常用此法把粒子数压到纯粒子方案的几分之一。混合界面同 5.1 的耦合界面一样,是必须检查的误差关口——勘测复算看到混合方案时,先问界面守恒误差多大。
粒子法的另一个隐藏成本是后处理:网格法输出场量天然等值线化,粒子法要重采样到规则网格才能画云图,重采样本身引入平滑误差——你看到的粒子法云图,严格说是"粒子真值的重构像",复算时要允许这一层模糊的存在。
粒子法的验证也有一条省力路径:先用小规模基准算例(自由飞溅、泰勒杆撞靶)检验算法参数组合,再上全尺寸工程算例——基准算例有实验数据可对,几十万粒子的代价换来的参数可信度,比直接在千万粒子大算例里试错便宜一个量级。
下一节把前两节的算法组装进一次真实的商业软件建模流程,并补上让冲击波"可算"的关键一环:人工粘性。