You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SPH结合N体引力模拟中行星旋转阻尼问题及优化问询

解决SPH粘性阻尼刚性行星旋转的高效真实粘性计算方案

问题核心

我实现了结合引力与SPH的N体模拟,可模拟行星形变、碰撞等效果,但现有粘性力计算会无差别阻尼刚性旋转的行星(即使粒子间无相对刚体运动)。当前粘性力计算代码:

visc_force = viscosity * Mass_neighbor * (Vel_neighbor - Vel_particle) / density_neighbor * kernelFun_laplacianf(r, r0);

粘性是行星聚集必需的能量耗散机制(纯引力无法形成稳定行星),但刚体旋转不应被阻尼;此前尝试仅保留粘性力径向分量的方案,会破坏层流等真实流体效果。现寻求无需额外循环或扩大邻域的高效真实粘性计算方案。

原有公式的问题分析

你使用的是SPH中最简单的拉普拉斯型粘性项,它会对所有惯性系下的速度差施加阻尼——而刚体旋转时,相邻粒子在惯性系下存在切向速度差(尽管随体坐标系下无相对运动),这个项会误将该速度差判定为需要耗散的剪切变形,从而阻尼旋转。

高效解决方案:保留剪切粘性,排除刚体旋转分量

核心思路是:仅对粒子间的真实剪切速度差施加粘性阻尼,排除刚体旋转带来的切向速度差,同时保留径向速度差的耗散(满足行星聚集需求)。以下是两种高效实现方案:

方案1:单次遍历的剪切分量过滤法

无需额外循环,在现有邻居遍历流程中即可完成计算。核心是分离相对速度中的刚体旋转分量(无剪切变形)与真实剪切分量:

// 遍历单个邻居粒子时的计算逻辑
vec3 r_ij = pos_neighbor - pos_particle;
float r = length(r_ij);
if (r < 1e-6) continue; // 避免除以0
vec3 r_hat = r_ij / r;
vec3 v_ij = vel_neighbor - vel_particle;

// 分离相对速度的剪切分量:移除径向分量后剩余的部分
vec3 v_shear = v_ij - dot(v_ij, r_hat) * r_hat;

// 仅对剪切分量施加粘性力
visc_force += viscosity * mass_neighbor / density_neighbor * v_shear * kernelFun_laplacianf(r, r0);

效果说明

  • 刚体旋转时,相邻粒子的相对速度完全由刚体运动产生,无真实剪切变形,v_shear为0,粘性力不生效,不会阻尼旋转;
  • 层流等真实剪切流动中,v_shear对应实际剪切速度差,粘性力会正确耗散剪切能量,维持流体行为;
  • 行星聚集时的径向压缩/膨胀速度差被排除在v_shear外,你可以选择保留径向分量的粘性耗散(只需在代码中叠加径向分量的贡献),完全满足行星形成的能量需求。

方案2:基于应变率张量的精确粘性计算

如果需要更精确的流体粘性行为(如符合Navier-Stokes方程的粘性),可以基于应变率张量计算,同样可在单次邻居遍历中完成(需累积速度梯度):

// 第一步:遍历邻居累积速度梯度
mat3 vel_grad = mat3(0.0);
for (每个邻居j) {
    vec3 r_ij = pos_neighbor - pos_particle;
    float r = length(r_ij);
    vec3 grad_W = kernelFun_gradient(r, r0); // 核函数的梯度
    vec3 v_ij = vel_neighbor - vel_particle;
    vel_grad += (mass_neighbor / density_neighbor) * outer_product(v_ij, grad_W);
}

// 计算应变率张量(对称速度梯度,仅包含剪切和膨胀变形)
mat3 strain_rate = 0.5 * (vel_grad + transpose(vel_grad));

// 第二步:遍历邻居计算粘性力(可与第一步合并为单次遍历,预存邻居信息)
vec3 visc_force = vec3(0.0);
for (每个邻居j) {
    vec3 r_ij = pos_neighbor - pos_particle;
    vec3 grad_W = kernelFun_gradient(r, r0);
    float rho_avg = 0.5 * (density_particle + density_neighbor);
    // 粘性应力张量的贡献
    vec3 stress_contrib = 2.0 * viscosity * strain_rate * r_ij;
    visc_force += (mass_neighbor / rho_avg) * stress_contrib * grad_W;
}

效果说明

应变率张量仅包含流体的变形部分,自动排除刚体旋转的反对称速度梯度分量,因此粘性力只会作用于真实的剪切和膨胀变形,完全符合流体力学规律,同时避免刚体旋转阻尼。

方案对比

  • 方案1实现简单,计算量极小,完全适配现有遍历逻辑,无额外开销;
  • 方案2更精确,符合Navier-Stokes方程,适合对流体行为要求较高的场景;
  • 两者均不会破坏层流等真实流体效果,同时解决刚体旋转阻尼问题,满足行星聚集的能量耗散需求。

内容的提问来源于stack exchange,提问作者Paul Aner

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 02:50:19