作业来源
参考了《太极图形课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
效果展示
整体结构
├── 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)。
整体流程
- 粒子系统的初始化。
- 创建一个GUI来显示粒子和边界。
- 使用 WCSPHSolver 来更粒子的状态。
- 在GUI中显示粒子和边界。
ParticleSystem类
-
初始化
- 设置field,确定数据结构
- 初始化field,设置位置,速度,质量和边界
- 使用太极语言的稀疏数据结构【改进部分】
- 移动可交互边界
mv_cross(x,y)
- 增加粒子
add_particles
- 查找邻域的粒子
search_neighbors
WCSPHSolver类
- 计算密度
compute_densities
- 计算压力
compute_densities
- 计算非压力
compute_densities
- 粒子之间的粘性力
- 粒子受到的重力
- 喷泉向上的动力(line59)
- 更新速度和位置
advect
- Symplectic Euler
- 流程控制
substep
def substep(self):
self.compute_densities()
self.compute_non_pressure_forces()
self.compute_pressure_forces()
self.advect()
SPHBase类
- 核函数
cubic_kernel
- 核函数导数
cubic_kernel_derivative
- 粘性力的贡献
viscosity_force
- 压力的贡献
pressure_force
- 获取碰撞后的速度
get_new_velocity
- 粒子和边界的碰撞
segment_collision
- 碰撞后粒子的中心位置和边界的距离大小为粒子半径。
- 碰撞后粒子的边界法向速度反向,边界法向速度服从Coulomb’s Law(参考GAMES103的PPT_04_P13)。
- 粒子和边界的碰撞调用
enforce_boundary
- 流程控制
step
def step(self):
self.ps.initialize_particle_system()
self.substep()
self.enforce_boundary()