首页 > 解决方案 > GPU 粘弹性流体模拟

问题描述

我正在尝试将这篇论文用于粘弹性流体模拟 - http://www.ligum.umontreal.ca/Clavet-2005-PVFS/pvfs.pdf - 在 GPU 上运行(使用 iOS Metal)。本文使用基于粒子的方法,利用局部粒子之间的弹簧相互作用来模拟弹性。我无法有效地计算弹簧相互作用。论文中的伪代码:

foreach neighbor pair i j, (i < j) 
q ← ri j /h
if q < 1
if there is no spring i j
add spring i j with rest length h
// tolerable deformation = yield ratio * rest length d←γLij
if rij > L+d // stretch
Lij ←Lij+∆tα(rij−L−d)
else if rij < L−d // compress
Lij ←Lij−∆tα(L−d−rij) foreach spring i j
if Li j > h
remove spring i j

其中 i 和 j 是粒子;rij = |rij|, rij = positionj − positioni 和 h 是交互半径;Lij 是静止长度;

弹簧的数量是可变的,每个粒子可能有很多弹簧,也可能没有弹簧,这取决于相邻的粒子。我看不到在 GPU 上存储或计算弹簧交互的有效方法。如果我有一个缓冲区,比如说,最大值。每个粒子分配 10 个弹簧,弹簧定义如下:

struct Spring {
   int i; // index of particle i
   int j; // index of particle j
   float rest_distance = 0.0;
};

然后我可以循环遍历每个粒子的弹簧(为无弹簧/移除弹簧写入某种最大值)但我认为访问、写入和移除弹簧会非常慢,我将不得不使用原子操作来同步写入穿过螺纹。剩余长度需要在每一帧/迭代中保留+更新。

有没有更好的方法来存储和循环通过这样的可变数量的弹簧,或者这只是不适合在 GPU 上进行优化?

感谢您的任何帮助!

标签: swiftgpumetalparticlesfluid-dynamics

解决方案


推荐阅读