光滑粒子流体动力学 (Smoothed Particle Hydrodynamics, SPH)
第一步:理解基本思想与动机
SPH是一种无网格的拉格朗日粒子法,用于模拟流体动力学及其他连续介质问题。它的核心思想是:将连续的流体(或其他介质)离散为一组具有质量的“粒子”,这些粒子携带所有物理量(如密度、速度、能量)。物理量的场及其空间导数,不是通过定义在固定网格上的值来计算,而是通过周围邻域粒子的加权平均(即“光滑”)来获得。这种方法天然地避免了传统网格方法中可能出现的网格缠结问题,特别适合模拟具有大变形、自由表面、运动边界和复杂界面的问题,如天体物理、溃坝、金属冲击成型等。
第二步:掌握核心数学基础——插值理论与核近似
SPH的数学基础是插值理论。任何连续函数 \(A(\mathbf{r})\) 在空间位置 \(\mathbf{r}\) 的值,可以通过其在全域 \(\Omega\) 的值进行积分插值来近似:
\[ A(\mathbf{r}) = \int_{\Omega} A(\mathbf{r}') W(\mathbf{r} - \mathbf{r}', h) d\mathbf{r}' \]
这个积分插值公式是精确的,如果核函数 \(W\) 满足以下两个条件:
- 归一性: \(\int_{\Omega} W(\mathbf{r} - \mathbf{r}', h) d\mathbf{r}' = 1\)。
- 在光滑长度 \(h \to 0\) 时,核函数趋近于狄拉克δ函数: \(\lim_{h \to 0} W(\mathbf{r} - \mathbf{r}', h) = \delta(\mathbf{r} - \mathbf{r}')\)。
这里 \(h\) 称为“光滑长度”,它定义了核函数的影响范围。核函数 \(W\) 通常是一个紧支的、光滑的、偶函数,如三次样条或高斯核。
第三步:从连续积分到粒子离散化——粒子近似
将连续的流体离散为N个粒子后,上述积分插值公式可离散化为求和形式,即粒子近似:
\[ A(\mathbf{r}_i) \approx \sum_{j=1}^{N} A_j \frac{m_j}{\rho_j} W(\mathbf{r}_i - \mathbf{r}_j, h) = \sum_{j=1}^{N} A_j V_j W_{ij} \]
其中,下标 \(i\) 和 \(j\) 分别表示目标粒子和其邻域粒子,\(m_j\) 是粒子质量,\(\rho_j\) 是密度,\(V_j = m_j / \rho_j\) 是粒子代表的体积,\(W_{ij} = W(\mathbf{r}_i - \mathbf{r}_j, h)\)。这个公式是SPH所有计算的起点,它表示任意物理量在粒子 \(i\) 处的值,是其所有邻域粒子 \(j\) 的该物理量的加权平均。
第四步:推导空间导数的SPH表达式
物理量空间导数的SPH表达式,可以通过对核函数求导得到。这是SPH算法的关键一步。例如,标量场 \(A\) 的梯度在粒子 \(i\) 处的近似为:
\[ \nabla A(\mathbf{r}_i) \approx \sum_{j=1}^{N} A_j \frac{m_j}{\rho_j} \nabla_i W_{ij} \]
然而,直接使用这个公式通常数值性质不佳。更常用的是通过散度恒等式或积分插值推导出的对称形式,例如:
\[ \nabla A(\mathbf{r}_i) \approx \rho_i \sum_{j=1}^{N} m_j \left( \frac{A_i}{\rho_i^2} + \frac{A_j}{\rho_j^2} \right) \nabla_i W_{ij} \]
这种形式保证了梯度算子的反对称性(当交换 \(i\) 和 \(j\) 时,符号相反),对于动量方程等至关重要,可以自然地满足牛顿第三定律和动量守恒。
第五步:构建流体动力学控制方程的SPH形式
以可压缩无粘流体的欧拉方程为例。控制方程为:质量守恒(连续性方程)、动量守恒和能量守恒。我们需要将它们写成适用于粒子系统的SPH离散形式。
- 密度近似:最直接的方法是使用粒子近似公式直接计算密度:
\[ \rho_i = \sum_{j=1}^{N} m_j W_{ij} \]
这称为“求和密度法”。另一种方法是求解连续方程的SPH形式。
2. 动量方程:利用推导出的梯度对称形式,动量方程 \(\frac{d\mathbf{v}}{dt} = -\frac{1}{\rho} \nabla P\) 的一种常用SPH离散形式为:
\[ \frac{d\mathbf{v}_i}{dt} = -\sum_{j=1}^{N} m_j \left( \frac{P_i}{\rho_i^2} + \frac{P_j}{\rho_j^2} \right) \nabla_i W_{ij} \]
其中 \(P\) 是压力。这个形式得益于梯子的反对称性,保证了相互作用的动量守恒。
3. 能量方程:对于内能 \(u\),其方程 \(\frac{du}{dt} = -\frac{P}{\rho} \nabla \cdot \mathbf{v}\) 的SPH形式可以写为:
\[ \frac{du_i}{dt} = \frac{P_i}{\rho_i^2} \sum_{j=1}^{N} m_j (\mathbf{v}_i - \mathbf{v}_j) \cdot \nabla_i W_{ij} \]
状态方程:为了闭合方程组,需要引入状态方程,将压力 \(P\) 与密度 \(\rho\) 和内能 \(u\) 联系起来。对于弱可压缩流体模拟,常使用一个简单的人为状态方程,如 \(P = B((\rho / \rho_0)^\gamma - 1)\),其中 \(B\) 和 \(\gamma\) 是常数。
第六步:处理关键技术问题与改进方案
基本SPH方法存在几个著名的数值问题,必须解决才能获得稳定准确的结果:
- 张力不稳定性 (Tensile Instability):在拉伸状态下,粒子排列可能变得不稳定并产生非物理的团簇。常通过引入人工应力项来抑制。
- 零能模式 (Zero-Energy Mode):粒子在非物理的规则模式下运动,而不影响内能。常通过使用具有二阶导数的耗散项来控制。
- 边界处理:自由边界(如水面)是自然满足的,因为粒子缺失的地方自动形成边界。但对于固壁边界,需要布置固定或虚拟粒子来提供排斥力或插值支持,以防止流体粒子穿透。
- 人工粘度:为了处理冲击波和稳定计算,需要在动量方程中添加一个人工粘度项,如Monaghan型人工粘度,它同时提供耗散并防止粒子在碰撞时非物理穿透。
- 光滑长度自适应:为了让粒子在拉伸或压缩区域保持合适的邻居数量,光滑长度 \(h\) 需要根据当地粒子密度(或邻居数)进行自适应调整,通常与密度通过一个关系式 \(h \propto \rho^{-1/d}\)(d为维数)耦合。
第七步:总结算法流程与拓展应用
一个典型的SPH流体动力学模拟流程如下:
- 初始化:设置粒子的初始位置 \(\mathbf{r}_i\)、速度 \(\mathbf{v}_i\)、质量 \(m_i\)、内能 \(u_i\),并计算初始密度 \(\rho_i\) 和压力 \(P_i\)。
- 邻居查找:对于每个粒子 \(i\),快速找到所有位于其光滑长度 \(h\) 影响范围内的邻居粒子 \(j\)。常用单元格链接法或树形算法来加速这一过程。
- 密度更新:利用邻居信息,通过求和密度法或连续方程更新所有粒子的密度 \(\rho_i\)。
- 状态方程:根据新的密度和内能,计算压力 \(P_i\)。
- 力计算:计算粒子所受的合力,包括压力梯度力、人工粘性力、体力(如重力)以及可能的人工应力项。
- 时间积分:根据计算出的加速度 \(d\mathbf{v}_i/dt\) 和内能变化率 \(du_i/dt\),使用显式时间积分方法(如蛙跳法Verlet、预测-矫正法)更新粒子的位置、速度和内能。
- 循环:重复步骤2至6,直至模拟结束。
SPH已从最初的天体物理领域,扩展到自由表面流、固体力学(尤其是大变形和破坏)、多相流、流固耦合、生物力学以及计算机图形学等众多领域,是现代计算物理学中一种极其灵活且强大的工具。