2单流体SPH算法实现

经过前一章的介绍,知道了SPH算法的原理,这一章我们介绍SPH算法的代码具体实现


2.1算法框架

SPH算法的思想是用粒子来模拟流体,其中粒子承载了各种属性(如 位置、速度、加速度、密度、压强等),通过不断更新粒子的属性(其实最终的目的就是为了更新粒子的位置),达到流体动态模拟的效果。而粒子的属性受其周围粒子的影响,一般通过光滑核函数 A(ri)=∑AjmjρjW(r⃗ −r⃗ j,h) A ( r i ) = ∑ A j m j ρ j W ( r → − r → j , h ) A(r_i)=\sum A_j \frac{m_j}{\rho_j}W(\vec r- \vec r_j, h),来计算粒子的各种属性。

所以,SPH算法迭代的流程如下:

Created with Raphaël 2.1.2 初始化粒子属性 计算粒子密度ρ 计算粒子压强p 计算粒子受到的压力F_pressure 计算粒子的粘滞力F_viscosity 得到粒子的加速度 更新粒子的位置

算法框架如下:
1. 初始化粒子的位置、速度、加速度、静态密度。
2. 根据光滑核函数计算粒子的插值密度 ρ(ri) ρ ( r i ) \rho(r_i)
3. 根据公式 pi=k(ρ(ri)−ρ0) p i = k ( ρ ( r i ) − ρ 0 ) p_i = k(\rho(r_i) - \rho_0)计算粒子的压强
4. 根据光滑核函数以及以及前二步得到的密度 ρ(ri) ρ ( r i ) \rho(r_i)和压强 pi p i p_i,计算粒子的压力 Fpressurei F i p r e s s u r e F_i^{pressure}
5. 根据光滑核函数以及粒子的粘度系数 μi μ i \mu_i和粒子的速度 u⃗ i u → i \vec u_i计算粒子的粘滞力 Fviscosityi F i v i s c o s i t y F_i^{viscosity}
6. 累加压力 Fpressurei F i p r e s s u r e F_i^{pressure}、粘滞力 Fviscosityi F i v i s c o s i t y F_i^{viscosity}和重力 Fexternali F i e x t e r n a l F_i^{external}得到粒子的受力 Fi F i F_i,除于密度 ρ(ri) ρ ( r i ) \rho(r_i),进而得到粒子的加速度 a⃗  a → \vec a
7. 更新粒子的速度 u⃗ i u → i \vec u_i、位置 r⃗ i r → i \vec r_i
8. 返回第二步,一直迭代。


2.2 寻找邻域粒子

我们知道,粒子的各种属性是由光滑核半径 h h h之内的邻域粒子的属性计算得到的,那如何找到这些邻域粒子呢?


最常规的思路是,计算两个粒子之间的距离d=r→i−r→j" role="presentation" style="position: relative;">d=r⃗ i−r⃗ jd=r→i−r→jd = \vec r_i - \vec r_j,如果 d<h d < h d ,则代表两个粒子相互影响。
然而我们发现,用这种方式去搜索所有粒子的邻域粒子的话,其时间复杂度为 O(n2) O ( n 2 ) O(n^2),可见这种方式效率不高。那如何改进呢?

我们可以通过划分网格的方式搜索邻域粒子,如下图所示。以 h h <script type="math/tex" id="MathJax-Element-38">h</script>为网格长度划分网格,使得网格覆盖所有的粒子。这样搜索某一个粒子的邻域粒子时,只需要搜索器周围的9个网格,而无需遍历所有的粒子,大大增加的效率。



2.3算法实现

写了一个简单的示例程序,运行效果如下:


该demo中粒子的绘制是用OSG写的。如果只是为了研究SPH算法,其实不需要太关注粒子绘制的问题,OSG绘制粒子只需要给SPH提供一个函数接口——输入是所有粒子的坐标,输出就是OSG用自己的渲染线程把粒子绘制出来。所以,每次更新完粒子的位置都调用一次这个函数就可以了。

下面给出源代码:SPH

程序是用vs2010开发的,OSG库的版本是3.4.1,要跑起来得要配置一下OSG。另外,SPH算法都写在sph.h和sph.cpp这两个文件中。

SPH算法的理论和实践(2)相关推荐

  1. SPH算法的理论和实践(1)

    前段时间做了一个有关于SPH算法的项目,现在正好抽空把它写出来.SPH(Smoothed Particle Hydrodynamics)是光滑粒子流体动力学方法的意思,说白了就是用粒子模拟流体的流动效 ...

  2. 分布式机器学习:算法、理论与实践 2)

    第6章: local receptive convolution 本来就是局部耦合的,咋个横向/纵向并行? 第7章: 第8章: 第9章: 第10章: 第11 章:

  3. Java 理论与实践: 非阻塞算法简介——看吧,没有锁定!(转载)

    简介: Java™ 5.0 第一次让使用 Java 语言开发非阻塞算法成为可能,java.util.concurrent 包充分地利用了这个功能.非阻塞算法属于并发算法,它们可以安全地派生它们的线程, ...

  4. 万字长文详解文本抽取:从算法理论到实践

    导读:"达观杯"文本智能信息抽取挑战赛已吸引来自中.美.英.法.德等26个国家和地区的2400余名选手参赛,目前仍在火热进行中(点击阅读原文进入比赛页面,QQ群见上图或文末二维码) ...

  5. 相机激光标定算法:从理论到实践

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 本文是标定系列解读第三篇,介绍了Camera-Lidar标定,通过对一些基础知识和小细节进行讨论和理论 ...

  6. ​万字长文详解文本抽取:从算法理论到实践(附“达观杯”官方baseline实现解析及答疑)...

    [ 导读 ]"达观杯"文本智能信息抽取挑战赛已吸引来自中.美.英.法.德等26个国家和地区的2400余名选手参赛,目前仍在火热进行中(点击"阅读原文"进入比赛页 ...

  7. 如何打造顶级目标检测算法?百度官方揭秘 ECCV2020 双料冠军的理论与实践

    计算机视觉最火方向是什么? 当然是目标检测啦! 目标检测,是计算机视觉领域的核心问题之一,近两年全球顶会的相关论文达上百篇,受到越来越多的人关注.无论是做人脸识别.自动驾驶.文字检测.人机交互,都离不 ...

  8. 重磅直播|立体视觉之立体匹配理论与实践​

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 大家好,本公众号现已开启线上视频公开课,主讲人通过B站直播间,对3D视觉领域相关知识点进行讲解,并在微 ...

  9. 干货 | 清华大学郑方:语音技术用于身份认证的理论与实践

    本讲座选自清华大学语音和语言技术中心主任郑方教授近期于清华大数据"技术·前沿"系列讲座上所做的题为<语音技术用于身份认证的理论与实践>的演讲. 以下为演讲的主要内容: ...

最新文章

  1. iOS可动态切换的NavigationTitle
  2. JavaScript面向对象(一)——JS OOP基础与JS 中This指向详解
  3. 字节对齐《c和指针》笔记--包含位域结构体的内存对齐(32bit,GCC)
  4. 10 个令人惊喜的 jQuery 插件推荐
  5. c语言第八周上机作业答案,C语言第五次上机作业参考答案
  6. VS2010打开旧版本MFC工程无对话框
  7. Win10文件管理器那些你不知道的秘密
  8. C语言读取文件大量数据到数组
  9. [Javascript]js中所学知识点回顾总结
  10. 永洪BI强制显示移动端布局
  11. 计算机考研专业课——c语言
  12. LOW逼三人组(二)----选择排序算法
  13. 解决Visio另存为(或者导出)pdf字符间距变化/不均等字母间距的问题
  14. 第二层、三层、四层交换机原理
  15. 618 Tech Talk丨大促活动如何抵御大流量 DDoS 攻击?
  16. Python 汉字转拼音库 pypinyin, 附:汉字拼音转换工具
  17. 【雅思大作文考官范文】——第十八篇:“problem and solution essay”
  18. css overflow
  19. 开发H5游戏练手, 黑暗堡垒-炼狱传奇H5 (一) 登陆界面开发
  20. 利用arcgis-ArcMap手动快速检查重庆三调图斑的方法探讨与自动化检查的想法

热门文章

  1. [Unity插件]物体轮廓特效HighlightPlus
  2. arm tcm linux,ARM紧致内存TCM的解释
  3. char和varchar的区别是什么?
  4. php5编译安装常见错误和解决办法集锦
  5. python求100内五的倍数_100一百以内5的倍数有哪些
  6. 使用MySQL的聊天室_聊天室phpmysql(一)
  7. 什么是嵌入式 如何理解嵌入式系统开发
  8. Debian改变网卡名称
  9. 前端之网站结构语义化
  10. uAvionix获得FAA合同,部署和演示多个无人机同时飞行的C波段频率分配管理(FAM)