【大作业】喷泉模拟

作业来源

参考了《太极图形课S1》的WCSPH代码。

尝试实现课程中提到的 One way coupling

主题是简单的喷泉模拟。

运行方式

运行环境:

[Taichi] version 0.8.5, llvm 10.0.0, commit 45c6ad48, osx, python 3.7.3
[Taichi] Starting on arch=x64

运行:

python3 demo.py

效果展示

WCSPH_Fountain

整体结构

├── LICENSE
├── README.MD
├── data
│   └── WCSPH_Fountain.gif
├── demo.py
├── particle_system.py
├── sph_base.py
└── wcsph.py

实现细节:

demo.py particle_system.py sph_base.py wcsph.py是项目源代码,其中包含SPHBase类、WCSPHSolver类、ParticleSystem类和一个main函数。

具体公式推导,可以看: here (P77-78)。

整体流程

  1. 粒子系统的初始化。
  2. 创建一个GUI来显示粒子和边界。
  3. 使用 WCSPHSolver 来更粒子的状态。
  4. 在GUI中显示粒子和边界。

ParticleSystem类

  1. 初始化
    • 设置field,确定数据结构
    • 初始化field,设置位置,速度,质量和边界
    • 使用太极语言的稀疏数据结构【改进部分】
  2. 移动可交互边界 mv_cross(x,y)
  3. 增加粒子 add_particles
  4. 查找邻域的粒子search_neighbors

WCSPHSolver类

  1. 计算密度 compute_densities
  2. 计算压力 compute_densities
  3. 计算非压力 compute_densities
    • 粒子之间的粘性力
    • 粒子受到的重力
    • 喷泉向上的动力(line59)
  4. 更新速度和位置advect
    • Symplectic Euler
  5. 流程控制substep
 def substep(self):
     self.compute_densities()
     self.compute_non_pressure_forces()
     self.compute_pressure_forces()
     self.advect()

SPHBase类

  1. 核函数 cubic_kernel
  2. 核函数导数 cubic_kernel_derivative
  3. 粘性力的贡献 viscosity_force
  4. 压力的贡献 pressure_force
  5. 获取碰撞后的速度 get_new_velocity
  6. 粒子和边界的碰撞 segment_collision
    • 碰撞后粒子的中心位置和边界的距离大小为粒子半径。
    • 碰撞后粒子的边界法向速度反向,边界法向速度服从Coulomb’s Law(参考GAMES103的PPT_04_P13)。
  7. 粒子和边界的碰撞调用 enforce_boundary
  8. 流程控制 step
 def step(self):
     self.ps.initialize_particle_system()
     self.substep()
     self.enforce_boundary()

代码

4 个赞