问题描述
我正在尝试将本文用于粘弹性流体模拟 - 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 上进行优化?
感谢您的帮助!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)