swift - 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 上进行优化?
感谢您的任何帮助!
解决方案
推荐阅读
- javascript - chartjs 保持点位置,将图像与标签放在一起
- reactjs - React 功能组件中 websocket 建立代码放在哪里
- microsoft-graph-api - 使用 Graph API 在 Teams 上创建会议邀请时如何附加文件
- excel - 根据当前月份获取单元格值
- javascript - 删除节点后未删除 D3.js 链接
- html - 使用图像绝对位置时使整个选择可点击
- javascript - NodeJS:无效的数组长度分配失败 - JavaScript 堆内存不足
- python - 仅在 MongoDB 中返回匹配的属性
- javascript - 如何重定向顶级路由而不是子路由?
- python - Flask UnitTests 访问错误的 URI