SPH求解器

基本原理

光滑粒子流体动力学(Smoothed Particle Hydrodynamics, SPH)是一种无网格Lagrangian方法,通过核函数插值来求解偏微分方程。

核函数近似

对于任意函数 $A(\mathbf{r})$,SPH插值定义为:

$$A(\mathbf{r}) = \sum_{b} A_b W(\mathbf{r} - \mathbf{r}_b, h)$$

其中: - $W$ 是光滑核函数 - $h$ 是光滑长度 - $b$ 遍历邻域粒子

核函数

PhysEngine支持Wendland C2核函数:

$$W(q, h) = \alpha_d \begin{cases} (1 - q/2)^2 (1 + 2q) & 0 \leq q \leq 2 \ 0 & q > 2 \end{cases}$$

归一化系数: - 1D: $\alpha_1 = 4/3$ - 2D: $\alpha_2 = 15/7\pi$ - 3D: $\alpha_3 = 21/16\pi$

算法流程

flowchart TD
    A[初始化粒子位置] --> B[时间步长估计]
    B --> C[八叉树邻居搜索]
    C --> D[计算右端项 RHS]
    D --> E[状态方程更新]
    E --> F[边界条件处理]
    F --> G[位置/速度更新]
    G --> H{收敛?}
    H -->|| B
    H -->|| I[输出结果]

状态方程

采用Tait方程描述流体状态关系:

$$P = B \left[ \left( \frac{\rho}{\rho_0} \right)^\gamma - 1 \right]$$

参数说明: - $B = \rho_0 c_0^2 / \gamma$ - $c_0$ 为参考声速 - $\gamma$ 通常取7

人工粘度

为处理激波,引入Lagrangian人工粘度:

$$\Pi_{ab} = \begin{cases} \frac{-\alpha \bar{c}{ab} \mu} + \beta \mu_{ab}^2}{\bar{\rho{ab}} & \mathbf{v} < 0 \ 0 & \text{otherwise} \end{cases}$$} \cdot \mathbf{r}_{ab

其中 $\mu_{ab} = h \frac{\mathbf{v}{ab} \cdot \mathbf{r}$}}{|\mathbf{r}_{ab}|^2 + \epsilon h^2

核心方程

密度更新(连续方程)

$$\frac{d\rho_a}{dt} = \rho_a \sum_b \frac{m_b}{\rho_b} (\mathbf{v}a - \mathbf{v}_b) \cdot \nabla_a W$$

动量方程

$$\frac{d\mathbf{v}a}{dt} = -\sum_b m_b \left( \frac{P_a}{\rho_a^2} + \frac{P_b}{\rho_b^2} + \Pi$$} \right) \nabla_a W_{ab} + \mathbf{g

时间步长

基于CFL条件和声波传播条件:

$$\Delta t = \min\left( \text{CFL} \cdot \frac{h}{c_0 + v_{\max}}, 0.25 \cdot \frac{h}{\sqrt{\nu_{\max}}} \right)$$