GAMES 图形学系列笔记(三十七)

GAMES201:高级物理引擎实战指南2020 - P4:Lecture 4 欧拉视角 - GAMES-Webinar - BV1ZK411H7Hc

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那么欢迎大家再次回到我们的高级物理引擎,实战课程,我们已经到第四讲了,不知不觉这个课程已经过去差不多一半了,那么今天呢我们讲一讲欧拉视角下的流体模拟。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ok那么在开始讲之前,还是忍不住分享一下论坛上面的一些,大家提交的新的作业,感觉还是很有意思啊,有同学写了这个三维的fm,用上了新的viewer啊,有同学写了这个分型嗯。

有同学呢写了这个vertex ring lip morgan,应该还是一个非常有技术含量的作业,ok那么对这些就是homework林的一些新的作品,我觉得大家可以去论坛上面把代码下下来,自己跑一跑。

然后学习学习呃,这些东西是怎么写的,觉得还是很有意思的,看看别人代码的时候能理解很多新的东西。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

好然后homework肯定呢我们当时发了一个写的好讲,然后最近中科院物理所还写了一篇科普文章,大概是讲卡门涡街的这个标题叫做醉酒的蝴蝶,飞不出花花世界的原因,找到了,我也不太知道是什么意思。

但是反正是个讲流体的文章,然后里面用到的demo,其实就是我们和默克林有一个同学的作业,大家可以去看看,这个文章写得还是挺有意思的,主要是讲各种雷洛树下的这个残留啊,卡门涡街还有残留的行为。

非常通俗易懂,然后有很多同学问我啊,homework一之前要求是实现影视,实现这个时间计分器和显示时间积分器的对比,但是有些sober没法实现显示时间的计算器,咋办呢,啊这个其实不用担心。

你可以只只实现影视时间计算器,然后在影视时间计分器内部进行对比,比如说你可以实现不同的影视时间,积分器的格式,比如说jacob啊,你可以或者写这个country gradients啊。

或者mt grade都可以,这些新的格式呢我们今天会介绍到,ok然后论坛呢我们最近来了一次功能,升级到太极,升级到了v零点06:12,然后论坛有了一次很大的更新,可以呃支持贴公式,我试了一下。

还是非常非常实用的功能,然后也可以贴一些呃,贴些图,然后效果还是非常好的,非常感谢,work class,同学帮我们进行了这个非常辛苦的升级工作,现在论坛应该可用性啊比之前要好了很多,然后我们第五讲。

我们呃专门讲多体问题与我方法,我们请了著名的张星星师兄来给我们讲这方面,因为他是这方面的专家,那一讲呢我们会提到多体问题,和他们与柏松问题的联系呃,然后还会张欣怡同学还会给大家分享,分享我方法的乐趣。

然后从直观的角度,引导同学们认识几种不同的快速求和方法呃。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

为了欢迎我们的张鑫鑫师兄。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我还特地自己也写了一个窝方法的sober,但是基于他的之前的一个c加加程序写的,我这边可以给大家演示一下,是一个vertex ring lip morgan的程序,ok,还是很有意思。

这个代码只有几十行,大家可以哦,对这个这个代码我还没分享到论坛上,大家可以下载下来看一下,当然也是基本上可以实时的跑的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ok看这个代码还是,就90行捕捞的代码,然后非常容易理解,下一讲啊,就专门请了我们的客座讲师张艺兴师兄,给我们讲一讲呃窝方法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后呢7月6号我们打算空一周,这样给大家多留一些时间去实现一下,开放作业一呃,7月11号呢我们开放作业一评选截止,然后我们会做一些点评,然后发出一些嗯选出一些很好的作品,然后也会发出一些奖品啊。

这个有同学反应好像比较卡,那么呃没事,这个课程这一讲结束以后,我会把程序上传到论坛上面,大家可以自己在自己的机器上面跑,那肯定就会肯定就不卡了,那么课程纪念品呢,我们homework 0的获奖同学。

我们已经全部都寄到了,然后呃当然请大家查收,因为有可能有些地方会比较慢一些,有些地方比较快一些,有些地方可能还没有击倒,然后大家请留意自己的呃短信啊,邮箱啊,然后尽可能的呃确保不要被。

不要被别人拿走了之类的,这个非常这边非常感谢负责后勤的东西,帮我们定制了这么多呃杯子,然后负责邮寄工作,这个真的是一个非常辛苦的工作,对这个有同学问这是不是杯子,它当然是一个杯子呃。

不是后面的这个纪念品,不是后面的这个电源充电器啊,是这个杯子,还有杯盖,这个应该比较容易看出来呃,ok今天内容还是内容还是挺多的,我就不多说废话了,之前我们主要讲的是拉格朗日视角。

那么记得拉格朗日视角是什么,拉格朗日视角这些例子是随波逐流的,他们会随这里的材料在游戏里面移动,那么拉格朗日视角的例子,往往会用来记录一下,到底自己的位置和自己的速度在哪,或者会记录一些温度啊。

或者其他的属性对吧,那么它的关键就是我们的sensor,或者这个传感器呃,你可以想象成这个小的流体的粒子,它是随着你的流体或者固体在空间中移动的,今天呢我们讲一讲这个欧拉视角。

那么欧拉视角呢大家记住它的特点是什么,它的特点是你的这个采样的点,在空间中是完全不动的,ok有同学说我这个非常卡,我是不是应该把我这边的对我,因为我开了一个直播的同时,我嗯我在网上又开了一个网页。

开了一个虎牙的网页来看我自己的直播,可能这样会导致比较卡,我现在把我自己的那个网页关了,但这样的问题就是说我可能会看不到呃,弹幕或者提问,那么如果有问题的话,大家可以在课程群里面发发一微信群。

这样我不知道这样会不会不卡一些,试一试,今天嗯回到这个欧拉视角,欧拉视角它的特点是,它的采样点是永远不不会移动的,然后它的采样点回答什么问题,回答问题是在我这个点这边。

我的呃材料它以什么样的速度在穿过我自己,ok那么这个是欧拉视角的一个直观的理解,你可以认为就是很多在你在水里面插了很多桩,这些桩永远不动,但是这个妆每一个妆啊,都是知道自己周围的水流流速的好。

那么这个是图片部分了,我们下面进入稍微复杂一些的公式部分,呃今天呢我们会稍微讲一点点数学,但是不会讲特别多,然后这门课呢主要还是侧重于直观上的推导,呃我们偶尔会提到一些有限体积,有限微分啊。

有限语言之类的基础知识,但是我们只会提到非常最为直观的一部分,我们不会讲特别深的这些lumerical scheme的理论,如果大家想深入学习欧拉流体模拟啊,可以看一看这本书,这本书写的非常好。

我自己也是看这本书入门的,叫做free simulation for computer graphics,它的作者是robert bryson,这个是一个大佬级的人物了。

在流体计算机通信学里面的流体模拟里面呃,基本上是无人不知无人不晓的一个人物,但是顺便说一句,张星星师兄就是这位大佬的学生,名师出高徒呀,然后呃今天这讲呢,其实我们只是快速的过一下这个。

欧拉法流体模拟的一些内容,ok那么我们先overview一下,看一看这个欧拉法流体模拟到底是在干啥,首先我们要介绍一个概念,这个概念叫做material relatives,或者叫做材料导数。

中文的材料导数这个翻译应该没有什么问题,嗯他其实呢联系了欧拉视角和拉格尔视角,这个台词老师是什么意思呢,它的符号一般是用大d大写的d,然后而不是我们的偏微分符号或者小写的d。

然后呃材料导数它其实有两个部分,当你去求一个物理量的大d by d t的时候,他其实呃它有两个成分,第一个成分是这个物理量关于时间的导数,就partial by partial t对吧。

第二个成分呢是呃,材料在这点速度点乘上一个grad,然后直观上的什么,这个人是什么意思呢,直观上来就说你这个物理量,由于呃你是呃这个是material问题,那也就是说这个采样点。

是随着你的材料一起在移动的,那你这个彩随着材料一起移动,采样点,它的物理上的变化有两个成分对吧,第一个成分呢是你假设你即使不动,那你的这个物理量也会改变。

那你其实就有一个呃partial by party partial t,那这个其实是一个可以说它是它的这个material,derivative的一个欧拉的分量,就是空间中不动,然后随着时间改变而改变。

第二个分量呢是呃,由于你的材料移动了,所以你这个地方你的变化率是什么,变化率是你的u乘上呃,你的这个scale field在空间中,本来关于空间的变化率就是它的gradient对吧。

u点乘上gradient又得到物理量,关于材料呃,由于材料移动所导致的变化,这个material rita有很多名字,然后有的同学喜欢叫他,advertive或者lagrandia或者particle。

他有很多很多的名字,然后我们一般呢这边这个课里面,我们就叫它material,我们不要引入特别多的名字,要不然他会比较confusing,那么常见的例子呢,就比如说温度的变化,温度变化有两种成分呃。

如果是你是把温度计在粒子上面,那你这边啊温度变化,首先它你这个例子不动,它也会变对吧,第一个分量就是怕手t pasht,怕是大t怕是小t,就是他对呃t大t是temperature,小t是时间。

第二个分量呢是以粒子移动导致的变化,那么就是u点乘上gravity对吧,有的时候呢这个material drs也会对速度本身去求,那么如果说你是对速度的x分量需求,那其实你直接套用公式就可以了。

只不过可能有点绕,因为你是呃速度的变化,它本身是老速度的影响,ok刚才讲了这个material derivative,那么我们下面就讲一讲,这个不可压缩的n s方程,这个a商城有很多变种。

这边我们介绍一个比较简单的版本,看起来好像很复杂,但是其实大家不用担心这个方程是什么呢,我们直接看这个公式三,它是什么意思呢,就是说你的流体里面的一个小的粒子,或者一个小一小包材料。

它的速度关于时间的导数有三个成分,第一个成分是由于压强的梯度导致的,这么一个贡献对吧,你如果想如果说你的这个呃一小包材料,它的压强在空间中的变化,那它就会受到压强的这个力,对它的加速导致的影响。

第二个成分是什么,第二个成分它的粘性,这个联系下我们一般在图形学里面是忽略它,因为我们一般希望流体这个效果越不练越好,然后因为越不连以后你就更更为突出各种窝呀,各种看起来非常炫酷的效果。

所以我们一般会把这个联系项给丢了,所以这一项大家其实不用考虑,然后还有一个g g是什么呢,g就是重力加速度,对吧嗯我们再看一下这个方程五,由于我们这个是一个不可压缩的流体,那么不可压缩是什么意思。

不可压缩,就是说你的速度场不能有散度对吧,如果你速度场有散度的话,那你局部就会由于材料的过度流入或者流出,导致这部分的流体被压缩或者延伸,被压缩或者延伸有什么后果,就是它的密度会变化。

但是我们这边又是一个不可压缩的流体,所以它的速度的反应应该是零,那么实际情况下我们怎么来求解,这么呃一个不可压缩n s方程吗,看起来好像很复杂,但是我们一旦把它分开来,分成好几份,它就不再复杂了。

首先我们会做一个叫operator speaking的操作,这个名字又是听起来很复杂,但是大家可以去看一下这个more details,它面会介绍这个operator spleeding是什么意思啊。

它的严格的定义,但是我们这大家只要知道operator stating呢,就是把一个呃,把一个关于时间的pd给它拆成若干个部分,使得每一个部分都非常的简单,这就是它直观的含义。

ok那么我们怎么来split呢,首先我们去把它这个其中的advection这一部分,给它提取出来,也就是说我们把原来这个方程,我把右边右端项给忽略掉,我们认为右转项是零,就得到公式六对吧。

然后我们再把这个g的这一部分给他考,考虑进去,就得到了公示期,然后呢,最后我们再把关于压强的贡献,这一部分给它考虑进去,然后我们还要把呃速度场散度为零,这么个条件也考虑进去,就得到了我们的公式吧。

ok那么我们接下来会分别讲公式六和公式八,公示期非常非常简单,公示期其实往往就是给你的速度上,直接加速一个呃,直接提添加一个重力加速度,然后ok我看到有很多同学说非常非常卡,我想想我有没有什么办法。

我这好像也没有什么办法,我看看我能不能呃,是不是我的wifi的问题呢,应该应该还好,ok我们就继续讲吧,我觉得好像如果卡的同学能不能试一试,换换线路,然后我这就有的同学说正常,有的同学说卡。

那我猜应该我这应该还好,然后ok我应该暂时没有什么能做的,所以就不好意思了,我们就先继续,好,那么我们刚才讲了operator beating,我们刚才讲公式678对吧,我们把原来一个很复杂的一个pd。

给它拆成了好几个部分,那现在呢我们得到了这么1233个部分,外力和projection,那么我们可以再对它进行时间的离散化,那我们就得到了对于每一个time step,我们有三步,第一步呢。

所谓的advection听起来是个很高大上的词,其实含义非常简单,它就是移动我们的流体的长这么呃,或者说呢我们通过当前的速度场求解出来,下一个时间步的速度场的一个初始版本。

但这个初始版本是没有考虑到外力,没有考虑到压强的,我们只考虑速度场的移动,所以这一步叫做action o,那么第二步呢,第二步是在我们刚才求出来的速度上,的基础之上,我们再去加上外力。

那就得到了一个u star star,是两个star,那么第三步我们这个u star star由于经过了,即使他即使u本身是没有散度的,由于经过了the vaction和外力的修改。

他自己可能会产生一些散度对吧,那么我们怎么办呢,我们再进行一步projection,给它加上一个压强的一个作用,这个压强的作用呃,是这个压强当然不是随便抽出来,这个压强得是满足,加上这个压强以后。

你的新的速度场的散度是零,ok那么我们来呃,有了这三步以后,我们得考虑一下,到底怎么样来表示我们的速度场,这边就牵扯到呃我们的一个数据结构,这个叫做实际上非常简单的,就是一个均匀网格。

当然你如果是oa farm模拟流体的话,不一定要网格,你可以用三角网格啊,你可以用这个呃,三维里面你可以用四面体网格,然后你也可以用各种其他的像呃,你也可以用,你如果真的愿意的话,你也可以用例子。

就是例子永远不动,然后你可以用它来build一个欧拉法的方程,那也是可以,但是这些方法都比较复杂,我们今天呢就讲一个非常简单的,这个叫regular gra,均匀网格。

均匀网格呢一般在二维里面就是正方形,三维里面就是六面体,那么如果说我们把空间分成很多个均匀的,正方形的cell,就是cell就是细胞了,我们这边其实是3x3=9个sl对吧,那么这个问题是在于。

我们对于每个cell它自己还是有一个面积的,它里面任意选一点,我们都可以用来存速度的横向分量,纵向分量以及压强,那我们存在哪儿呢,这边就有选择了,最简单的乘法就是全部存在cell的中心。

也就是说偏离横向偏移零点呃,和cl的corner偏离0。5个cel,然后纵向呢也和cell的这个左下角,偏移0。5个cl,那么你把所有东西全部存在中心,如果这样的话呢。

那你去分配这个速度场和压强场的时候,你就可以直接呃在太极里面,其实你直接开这个呃uv p它就是其实ti divr,然后t i。f32 对吧,然后它的shape,其实就和你的cell的大小是一模一样的。

因为你有一个cell,你就有一个压强或者速度的采样,ok然后,稍微更复杂一些的方法呢是用stagger grade,所谓staggrade,就是说我们可以把速度的横向分量,速度的纵向分量以及压强。

存在这个cell的不同的地方,然后这边呢我们红色的存的是速度的横向分量,绿色的点呢存的是速度的纵向分量,蓝色的点存的是压强了,注意这边是写错了,这边不应该是orange,这边应该是blue。

然后如果说你要这么去分配你的速度,场的grade的话,那么你一定要稍微注意一下,因为呃如果说你的网格是3x3,那么你的横向的速度长,它其实是一个4x3的速度,看你的纵向速度长了。

它其实是一个3x4的数组,你看看,因为呃虽然你有三个三个grade,三个每个方向,这里有三个grade,但是你其实如果说存在边上的话,那你其实有四条边对吧,这个我记得小学的时候。

学过一个叫做什么植树问题,还专门研究这种这种这个加1-1的事情,这个可能是童年回忆了,那么压强就不用担心压强还是存在他的cell center的,所以不用担心,那么staggree有什么好处呢。

staggree后面我们算到各种有限差分的时候,它就会有很多的好处,特别是它能够避免一个叫做checkerboard,pattern的这个一个很坏的事情。

如果关于这个checkerboard pattern,大家有兴趣的话,可以去看之前提到的一本书,ok那么我们刚才呃,虽然在每一个cell里面都加了一个采样点,使得我们能知道那一点的速度,那么还有很多。

但毕竟这个excel里面除了一些点以外,还有几乎所有的地方它都是没有数值的,那么怎么办呢,我们怎么样在这个cell里面,所有的地方都把我们,比如说速度横向分量,或者速度纵向分量来产生定义呢。

这个地方就需要用到一个插值技术呃,常见的情况,常见的插值方法是这个双线性插值,by linear interpolation,有的时候有些书上也会讲。

流体里面可能会用by cubic interpolation,但是最近好像不是特别流行,最近好像流行的搞,他就是直接搞一个白linear interpolation。

by linear interpolation,非常容易实现,然后呃在大部分情况下work也挺好的,所以大家一般就用白零点了,什么是blinear interpolation呢。

假设我们在这个一个cel的四个顶点上面,呃,如果我们知道一个一个这个正方形,它四个顶点上的值,比如说呃这个地方还有黄色,绿色,粉红色和蓝色对吧,那么我们如果说需要用这四个顶点上的值。

我们只知道这四个顶点上的值,怎么去重建出这个正方形里面任意一点的值呢,这个其实嗯还是比较直观的,我们其实只需要呃,首先我们只需要把这个点关于嗯,每一个顶点的距离给他算出来对吧。

这个距离是我们是用了一个什么metric,这个距离我们用的metric其实是呃,它关于对角线这个点形成的面积,这个可能稍微有点绕,但是大家可以看底下的这个直观的解释。

我们这个黑点它的数值是怎么加权计算到的呢,它是黄色的点的数值乘上黄色矩形的面积,加上蓝色的点的数值,乘上蓝色矩形的面积,加上绿色点的数字,加上乘上绿色矩形的面积啊,但是这个就是一个简单的加权平均。

其实还是很容易理解,那么做了这一步以后,虽然我们只是在空间里面的很少个离散的点,上面有数值采样,但是我们可以通过双这个双线性插值,得到空间里面几乎所有点的呃,一个数值的近似。

假设我们的物理的这个这个feel,它是一个几乎是连续的,没有这个跳变的话,那这个binary interpolation,还是能够做非常好的工作的,ok那么接下来呢我们就讲一讲advection。

所谓的action啊,就是移动流体的材料,说到reaction呢,这个有非常非常多不同的schemes,然后不同的scheme呢,它其实是在数值粘性,稳定性,性能和复杂程度之间在做不同的取舍。

当然这里面最简单的就是,我们后面第一个讲的叫做similar roger fection,它非常的稳定,但它的数值连性也比较高,什么数值联系呢,我们后面会演示,那是一个稍微复杂一点的方法呢。

叫做micromic或者b f e c c,它是啊3米2个中心的一个升级版本,然后呢最近还有一些新的skin,比如说呃,我们曲子怡同学和张艺兴师兄,提出的这个by mark square。

那也是一个很有意思的陪伴,大家可以去看一看,最近stay up应该是2019的一篇很好的paper,然后还有particle action,就是说我们虽然我们是用欧拉网格,表示背景的速度场。

但是我们可以把很多物理量给它记在例子上面,呃,这个我们在后面讲到,混合欧拉拉格尔说话的时候,我们会提到这个particle action的方法,它其实也有很多很多的变种。

那么今天呢我们就讲一讲最简单的similar,grand vaction和bf c c或者microy,my comic和bf e c c本质上是非常类似的,基本上只有一些系统上的差别。

所以呃大家一般也不做严格的区分,ok那么什么是三bilibrarian roger advx呢,假设呀我们要求下一个时间步x点的速度,那么我们如果知道这个时间不它的呃,上一个时间步的速度场。

我们怎么来求这个下一个时间不x点的速度呢,假设我们的速度场在空间中每一点都是恒定的,并且它从来不变,那么怎么办呢,其实非常非常简单,我们只需要把x点的位置沿着时间,沿着当前的速度上去嗯。

向后推移一个吊塔t,向后推一个吊塔t,这样我们就得到了x这一个点,在上一个时间步的位置对吧,那么由于x啊,它是你可以认为它是一个拉格朗日的一个例子,那么由于我知道他上一个时间步在这个地方。

下一个时间步跑到了这个地方,那现在问题来了,这一个时间不x的速度是多少呢,这个其实非常简单,其实你只要在上一个时间不嗯,在x这一点做一次双线性插值,你就知道了,这个例子在上一个时间步的位置啊。

在上一个时间步的速度对吧,由于它这个粒子的速度,你假设它是不变的,所以在下一个时间步的速度呢,就等于呃这个例子在上一个时间步的位置,在速度原来速度场里面的采样,ok那这个是要实现起来。

其实非常非常的容易,我们对于,如果说我们要对x这个物理量去求similar,graction,把结果存在lex里面,那么怎么办,我们就去loop over x里面所有的下标,然后把new x。

他这个下标的值设成blinear interpolation啊,我设成x值就是x是旧的物理量的值,在这边,在它的历史上的位置去做一个双线性插值,这边呢我们要做一个back trace函数。

back trace函数是什么意思,就是说我们把时间倒着播放,倒着播放,我们就能回到历史,就可以求出x这一个点在上一个实验部的位置,然后我们在上一个实验部去求x的值,就可以得到呃,这个时间播的物理量。

ok可能有点绕,但是呃应该直观,应该直观上还是比较容易理解的,但是呃这个就会导致很多问题对吧,我们由于我们的速度场它并不是一个恒定的值,它会经常变,那你实际上x它在速度场里面的,这个x这个支点。

还有速度场里面移动,并不一定是沿着一条直线,它可能是沿着一条曲线,那么实际上你的这个material parcel,它的移动路径可能非常非常的复杂,你可能会得到一个偏离后的偏离后的结果。

比如说呃你如果这次这个支点x是在这,那么你会计算你获取会计算出它上一个时间步,它的位置是在红色的点,这但是呢实际上他可能是在绿色点缀,那你这个就设置好礼仪,没有1000里了,那么怎么办呢。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

队友在讲这个之前,我们先来演示一下。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这个这个误差会产生一个什么样的效果哦,对其实代码现在已经在github上面已经有了,应该是在这,大家可以去论坛里面去点击这个链接,或者你直接到games 201的这个release里面。

可以下载到我刚才演示的这几个几个代码。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ok那么我们来演示一下,你如果看到我的vx里面其实有一些选项,我先把这边来稍微调一下一。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ok那么我们一开始有一个太极的图标,然后我们加一个旋转的速度,成如果说啊我们用一个比较简单的sevlog,range and action的话,如果说我们只用一个非常简单的trace back。

的一个scheme,那就会导致这个素质场,他的你看他这个太极图标就越来越小,越来越小了,这个就是我们的误差导致的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

由于说呃你每次trace spect的时候,你的这个路径都不准确,你其实会得到一个更远一点的值,导致你的这个每次做完一留以后,做完advaction以后,你的图标就越来越小,当然还有一个问题是什么。

它这个图标会越来越模糊对吧,这个越来越模糊的问题,我们后面再解决,我们先来解决一下,这个图标变得越来越小的问题,如果说你呃如果说你有一坨流体,它就是这么顺时针的旋转的话,那么你如果说我们这个太极图标呢。

就是表示一个速度场,白色表示高温度呃,黑色表示低的温度,我们假设速度场不会defuse,那么我们呃呃我刚才说错了,应该是温度场,白色是高温度,然后黑色是低温度,我们假设这个温度场是不会defuse的话。

呃,那么我们当然不希望这个温度场,随着你流体的旋转变得越来越小,这个就会就实际上是数值误差对吧,那怎么办呢,我们其实有更好的backtrace的方法。

这个其实就变成一个initial value problem,它是一个数值o d e,学过数值分析的同学,应该都知道这个该怎么处理,我们刚才啊其实演示的时候,我得先把这个背景的程序给关了,要不然太卡了。

ok我们刚才演示的时候呢,其实用的是forward order,然后它其实很简单,我们要求这个p在上一个时间步的位置,怎么办呢,我们把p减掉,p在当前时间步的位置乘上dt对吧,那么我们其实就回到过去了。

那么这个叫做fooiler,他其实呃注意这边,其实这个负号是因为我们在往后面往历史去推,而不是往未来推,如果是往未来推的话,这个应该是一个,正好这边里面所有的符号都是,由于我们在going back。

我们在重新播放,我们的返回播放我们的物理模拟导致的,那么怎么得得到一个更精确的一个estimation呢,其实直观上也非常容易,我们可以用ark to game或者叫显示终点法,显示充电法干啥呢。

我们先把这个p呃往回回播放,0。5个dt,我们就得到一个两帧之间的中间点,然后呢,我们在这个中间点这个地方采样一个速度,然后用这个速度去play back啊,t的位置,ok那么其实你可以想象。

如果用了终点法的话,我们的对于速度的第二次,对于速度的estimation就会更准确一点,因为呃你如果一个区间你要近似它,你怎么近似,可以用开头的,可以用结尾,但是最好的还是用中间的。

如果你这个区间跟上面的数值,是一个线性函数的话对吧。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那么我们先把它换成我们试一试,大家可以改一改这个scheme呃,我刚才rk是一,我们现在把它换成啊换成二,这个注释应该在这换成二呢,我们机器实在用ark to cheme。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

你可以看到我这边有个叫backtrace的函数,然后它里面有一坨ta。static对吧,然后ti。sestatic,其实就是在编译期做一些判断,那么如果当rp是q的话。

我们就是在用中点法进行呃向后的追踪,向历史的追踪。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我看看重点法效果怎么样,ok你可以看到用户终解法以后,我们基本上没有了,刚才那种越转越小的问题对吧,虽然它还是越来越糊,但是越来越糊,这个是另外一个问题,我们先把这个越转越小的问题解决。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这是2k two,一般来说2k two呢有的时候已经够了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们也可以试试2k three。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这是2k three,基本上和2k two没有什么区别。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ok然后,2k three是干啥的,2k4 其实就是一个升级版的2k two,它更复杂一点,它首先呢呃往回走0。5dt得到一个p1 ,然后再p处呢这边再sample一次,然后得到一个呃,得到一个v2 。

然后用这个v2 呢再去play back一次,得到一个p2 ,然后再再三步一次得到一个v3 ,然后你最后真实的速度的estimation,其实就是啊,把之前你得到这些速度进行一个加权平均。

然后这个全职是不是随便写的,这个全职是有技巧的呃,它有一个推导的方法,这个大家可以自己去研究,但实际情况中一般2k q呃,一般就差不多了,有的时候用2k4 台,很少情况下必须要用2k4 。

但是随着你的这个格式越来越复杂,你的计算量也会变得越来越大,对吧呃这边就也是有一个取舍了,然后我们刚才讲到啊,如果用sama rgx,它会越来越糊,为什么会越来越糊呢。

还记得我们之前讲过blinder interpolation吗,由于我们在做interpolation的时候,我们会做甲醛平均,那平均了以后,其实本来你如果有一个很sharp的一个变化,你做了平均以后。

它就变糊了对吧,你本来如果这个端点左边是零,右边是一,你取在中间取一个,你就得到0。5,那你这个速度场就会很自然的变糊,那么怎么样解决这个变糊的问题呢,这边就要用到一个稍微高级一点的呃格式。

这个叫做bf c c或者叫做micromic,然后他们两个刚才说的其实非常的像,然后大家很很多文献里面其实会混淆使用,他们俩呃,这边我们就讲的其实是底下代码其实是microy,然后啊。

他你可认为他的hilid其实就是b f c c,什么是b f e c c呢,b b c它的全名叫做back and forth arrow,compensation and correction。

什么意思呢,其实想法非常简单,你可以看到它其实调用了这个sl是三倍,lol running action,其实x新就是我们刚才的sema grand,ok,那么我们用x星啊,先回到过去求到一个呃。

把x做一次of action得到是得到一个呃x x,然后呢我们再反过来做一次,我们再把x音做一次ction,当然这边我传给他的是负的dt,就得到一个x星,x星星对吧,那么理论上来说。

如果说我们这个semi oraction,它是没有任何误差的话,那么我们把这个速度长先往呃往前推一个dt,再往后推一个dt,我们是不是应该得到x星和x星,星和x它应该是一样的对吧。

因为呃如果说你的action是完美的话,那你其实往前推dt,再往后推推dt,你应该是能保持原样的,但是实际上它不一样,那不一样以后呢,为什么会不一样呢,是因为advection error。

那么我们把它俩做差,然后再取个1/2,就可以得到我们对advection error一个估计,ok我们我们得到这个reaction error估计以后呢,得到一个x final x final。

其实就是我们的最后的速度长,ok但这边你要小心一点,就是说如果说呃你这个correction本身啊,可能会导致你的the vaction scheme产生overshooting。

这个会产生一些artifacts,然后我们现在来看一看bf e c c的效果。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们大家如果下载了下载了这个代码,可以进行一下修改,比如说我们可以把这个u s m c换成q对吧。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

mc就是micromic,然后可以看到我们一旦用了micromascheme以后呀,这个基本上就没有这种变糊的问题了,基本上没有变糊的问题,你可以看到我,我现在按一下空格可以暂停,你可以看到呢。

它这个圆这边部分这个部分基本上没有变弧,它运动的部分还是稍微有点变化,但这个和三倍lab软件比起来已经好了很多很多。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们来试一试,再看一看3米的高中卷,可以做一下对比。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我刚才把uc mc设成了false,然后现在是在用sam两个range,你可以看到,特别是这个圆的这个边界啊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

它已经变得非常的糊了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在上转一会儿,他直接就,你让他转一会儿,这个地方其实已经不太看得清了,这个不太看得清以后会有什么后果呢,一旦不但看呃,这个是一个其实是一个颜色,一个黑白的一个颜色场。

如果说大家是在速度场上面做这个操作的话,它一旦变模糊,就说明你产生了数值的联系对吧,数值的联系就是速度场呃,速度场在模拟的过程中,它会产生一些nero的一些diffusion的这个问题。

它有产生这个这个diffusion以后,它就会导致能量的衰减,量衰减以后,这个流体啊就没有之前看起来那么energetic,所以就会有问题,就会导致你的流体看起来非常黏,你看转一会以后。

他这个就基本上不太看得清。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

刚才讲到accomic里面有一个overshooting的问题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们来看一看,我们还是现在有my home,这个要有一个clipping,keeping是干啥呢,keeping是我们做完这个呃micro mac以后,我们需要去防止它产生一些非常大的值。

为什么会产生非常大的值呢,因为它这个地方它会根据你的呃这个reaction error,让你在边界上产生一些呃,像吉布斯现象那样的问题,然后如果你不去做这个一个呃guarding的话。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

它就会导致产生一些artifact,我们来看一看吧,如果说我们把这个clipping给他去了,你可以看到呢,它产生了一些很看起来不是令人满意的,这个波纹状的这些artifact啊。

所以大家记得如果写macrome的话,要记得去做一下clipping。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

但这个代码都在ction点拍里面有,大家可以下载下来,自己玩一玩,ok那么刚才就是direction,那么接下来呢我们讲一讲projection,projection啊,其实它非常简单。

projection是主要要做什么事呢,你得去求出一个合适的标量场p,使得这个标量场p的梯度呃,施加在这个u上面以后,你的u变成了一个没有散度的一个速度,成什么意思呢。

我们用有限差分在空间上面展开一下啊,我们假设投影后的这个速度场,project以后的速度场叫做u star,那么u star减去u这边应该是除以个delta t,等于什么,等于负的肉分之一啊。

gravt对吧,我把这个交叉t呢从u2 减去u下面,移到了这边来,呃当然我们要满足usr的导数啊,usd这个散注是零对吧,那么我们可以做一做一项得到了公式十,然后我们在对公式时的左半部分。

这一部分两边同时求散度,为什么两边同时求散度呢,因为求了散度以后,我们左边就得到了一个这个呃u s2 的散度,u s散度是零对吧,我们希望把这个usr给他消了,同时写了散了以后,我们知道左边变成零。

右边呢呃散出operator是一个linuerdo,可以把它塞进去,得到了一个u的散度,减去掉他t除以肉,然后然后有一个这么一个算符,这个是一个laplacial period,后面我们会提到它。

其实就是说对于p的gradient求一个散度,ok那我们再做一个最后的一项,得到了公式13,公式13呢其实就是呃,p的梯度的散度等于肉除以调tt,然后再乘上u的散度,那么我们需要求出一个p。

它满足公式13,这个公式公式13啊,到这变成公式14,然后公式14,它其实呃是一个非常非常常见的一个形式,它叫做pssecreation,它呃你如果把右端项做成f的话。

那你经常可以把它写成这个delta p等于f,但是这个da大家注意,这个delta dela p和delta t dotx不一样,它不是说p的差值,它是个da,它是laptoperator。

然后他有的时候呢会写作lab平方,有的时候会把它写成这个呃,中间一个点乘的一个形式,两个倒三角,这门课里啊,由于我们用deltt deltx来表示呃,差值表示这个difference。

所以我们就不用这个调查符号来表示laptoperator,这样避免一些歧义,如果说呃f等于零呢,这个方程又被称为拉普拉斯方程,但是我们这个课里面f一般是不是零分,因为我们一般是用这个泊松方程。

是用来求解速入场的压强来投影这个速度场,所以我们的一般这个f啊它是有良好的,f其实就是公式14的右半部分,ok那么我们下面下面要做一个事情,还记得我们的物理量,都是存在一个背景的网格上面的吗。

那么我们要建立一个离散的方程,来去近似这么个离呃连续的方程,ok那么我们要建立一个线性方程组,这个线性方程组呢,它满足a乘上p等于b的形式,那么a和b分别是怎么定义的呢,ok那既然我们的方程式公式16。

那么我们看一看,我们首先我们看一看怎么来近似这个p的拉plus,operator呃,这个拉普拉斯p在ig点的求职,这个我们后面后面一个slides会讲到,为什么会是这么一坨复杂的公式。

大家这边只要记住它是用p周围的四个点的值,包括他自己就是一共是五个点,来求出p在这一点的拉普拉斯freer的一个近似,这个叫做five points dl,号为的five points dl。

然后还有一个要求的是什么呢,还有一个要求的是u的散度对吧,u的散度怎么求呢,u的散度其实也可以用啊,u周围的四个采样点的值来算出来,这个我们下一页slides会介绍,为什么是这么个公式。

大家看这个信息系统啊,这个线性度还是挺大的对吧,如果说你的呃网格是n乘以m的话,那你这个线性系统,由于你的p p它是有n乘m个采样点,你的b也有n乘m采样点,那你的a呢其实就是n乘m再乘上n乘m。

如果你是三维的话呢,你的a这个矩阵就是n乘m乘k,再乘上n乘m乘k这么个元素,它其实就是一个非常非常大的矩阵,好在它是稀疏的,我们后面会讲到怎么样去呃,求这个矩阵a,ok那么我们先来看一看。

为什么u的散度会这么被近似呢,哦注意这边少了一个e除以dtx,这个u的散度是什么意思呢,直观上理解就是说这个cell里面呃,速度的散度意味着什么,意味着你这个流入或者流出的流体的量对吧。

如果你是流出的话,那你的这个散度为正,如果你是流入的话,你散度为负,ok那么我们怎么样来求出呃这一个点,它流出流体的速率呢,还记得我们之前讲了staggrid吗,如果说我们用了staggrid。

那么我们的速度的横向的分量,是记在这个cell的两条竖边上面,速度的纵向分量呢,是记在这个cell的两条横边上面,ok那么如果说我们知道这个这一条边上,它的速度是呃是uxi加1j的。

这个它的流体是以这个速度往外面流,那么它这个cell它这个这条边对于整个cell里面,流体流入或者流出的贡献,其实就是吊塔x乘上ux a加e j,那么我们还得把它减去它左边的这个部分对吧。

你左边是流进来的,这边是流出去的,流进来的得减掉,流出去的得加上,那么纵向的两条边啊,这个横向两条边其实也是一样,它的纵方向的流体对于流体速度,对于这个cell的它的嗯密度的贡献。

他其实是首先你得加上他这个流出去的对吧,然后你再把它减掉,它流进来的,其实这么1+1减,不好意思你你就得到了他的呃,速度场的散度,那么压强大plus of operator是怎么算的呢,其实也非常类似。

如果说我们要求在style中间,这一个点的压强的lapoperator,那么用类似的推导方法,我们也可以先把这一个cell,它的四条边上面压强的梯度给他算出来对吧,这一个点它的压强梯度是什么呢。

应该是上面这个点减去下面这个点,除上吊塔x就得到这个点的梯度呃,这条边上面的梯度类似呢,你四条边的梯度都可以算出来,然后你要求它散路对吧,你要求拉散路怎么办呢,就和上面一张size一模一样。

那么你做了这个操作,再进行一点点化简,你就可以得到这个嗯p的laptoperator,然后-4 p i g,然后加上它周围的这些cell的值,那么现在问题来了。

如果说我们这个流体假设它右边这三个cell是啊,是一面是一个固体,假设我们的流体就左边两列,第三列呢是一个固体,那么这边我们就得对它进行修改,这个叫做呃这个就是它的边界条件的问题。

如果说他右边这三个cell呢是空气的话,我们就叫做它是一个开放边界条件,开放边界条件其实非常容易,我们就可以把p认为在这些cl里面是零,那么在下面这个方程里面,我们只要把t的对应的值换成零就可以了。

那么如果是它是一个固体固体的话,也就是说固体什么意思呢,也就是说你这一面它的压强差或者这一面呢,它的速度一定是零对吧,那他的速度永远是零了,那你的这个压强差呃,就其实压强的梯度应该也是永远失灵。

那么如果说他有一面,你会发现它呃,如果你发现它有一面和一个固体相邻,那你其实首先你得把这一面的这个,p i g的贡献给去了,那除了去了他呢,你还得把这个四给它减掉,一变成三对吧。

因为你中间的这个它的贡献,也因为你的右边这条边是一个固体,而去掉这个推导,大家可以去看之前提到的一本书,那本书里面robert ron,那本书里面讲的其实非常的细,这边由于时间关系,我就不继续深入了。

ok刚才讲了怎么去建立一个方程,a乘上p等于b对吧,那么这个方程我刚才提到,他是非常非常large scale的一个线性方程组,那么我们这怎么去检查呢,首先啊,我们来看一看这个20世纪最重要的十个算法。

但这个是仁者见仁,智者见智,这个只是呃有一个期刊评,评选出来这么十个算法,十个算法我觉得还是比较有意思的,你可以看到呀,我这边加粗了其中的四个算法,这四个算法有什么特点呢,他们都可以用来解线性方程组呃。

我们今天要讲这个quite of subspace,iteration method,然后它其实是历史非常非常悠久的一个算法了,然后呢除了用iteration method解linear system。

你还可以去做matrix decomposition对吧,你可以去prefect orize你的你的矩阵,然后呢你还可以用,你如果是要解泊松方程了,其实你还可以用快速布列变换f t。

然后呢你还可以用fast multiple去做preconditioner,所以其实你看这些算法里面,其实很多都是和线性方程组有关的,就是ax等于b这么个线性方程组,它背后有这么多的学问,嗯顺便说一句。

这个simplex methods for india programing,其实也可以用来解rage body simulation,然后my chocolate originary。

mtchery m c m c其实也可以用来做衰做渲染,其实图形学里面用到这些算法还是很多的,另外一方面也确实说明,这个算法确实在各个领域都有很好的应用,ok嗯对,其实由于我自己把虎牙的直播给关了。

所以我现在其实看不到大家弹幕里面的问题,如果大家有问题呢,请在课程的微信群里面提出,这样我就可以或者在games的群里面提出,这样我就可以看到了,我不知道大家现在暂时有没有什么问题,因为我把网页关了。

我自己也看不到,所以大家可以发到微信群里面,这样我就知道了,ok那么回到我们解信息系统,很多物理引擎啊,最后到最后都都转化为一个解,一个很大信息系统的问题,ax等于b然后怎么去检查呢,有很多种解法。

如果你线性系统不是特别大,你可以用partil这个direct solver呃,其中呢最有名的就是partil,然后大家也非常喜欢用它,毕竟你只要把这个信息系统给他的,把这个矩阵的气候形式给他构造出来。

然后喂给parties,把这就给你很稳定的给它解出来,然后所以大家很多时候会很偏爱,这么这么个方法,因为它省事,而且性能也不低,其实在系统比较小的时候,不是特别大的时候还是很管用。

除了direct server呢,还有一种一类server叫做iterative ser,direct ver呢会一下子给你把解算出来,iterative solver呢它会呃得到一个解。

然后在这个解上面,然后呢这iteriterative ser有好几种呃,很多种变种,比如说你可以有gala,还有jacob,然后这两个是非常常用的,除了他们还有什么s o r i。

s o r之类的各种呃,其他的itering server,其中呢damage隔壁我们之前已经讲过了,今天呢我们主要讲的是这个precondition country。

country regredients,然后它是快乐subspace over其中的一种,这边要提到呀,一个好的emicrosover,通常呢是有很多不同的solver给组合成的。

比如说图形学里面要求这个泊松方程,一般会怎么做呢,大家外面会用conjugate gradients,然后用multies or preconditioner。

让multigrade的每一层呢用djacoby domoving,然后呢在multivate最下面一层,用partial这个direct sober去进行direct off。

这个基本上已经是图形学里面,求泊松方程的标配了,呃这个里面有很多名词,我后面会提到,这边大家只要记住它是呃,solver之间可以进行组合,那么现在问题来了,我们怎么去表示这个a呢,刚才我提到呀。

如果在三维free simulation里面,这个a可能会非常非常大对吧,因为你每一个vocal都得在a里面占一行,那么但是a有一个通常来说,如果你运气好的话,它有一些好的性质。

比如说呢它通常是sparse,如果运气好呢,它还是对称的,并且是镇定,叫做对称正定或者叫s p d,那么你怎么去存a呢,a说白了其实就是个二维数组对吧,你最简单的方式你就把它存成一个稠密的矩阵。

一个dance matrix,这个通常在a比较小的时候是work的,但是它不是特别scalable,比如说你如果这边是1024,是1024,你还可以存,如果说你有一兆个呃voxel。

一兆或者一兆个pixel,那你就存不下了,你都没有空间存它,这个时候呢往往就要用到一个sparse,matrix的一个表示,用sparse matrix来存的a,为什么呢,因为虽然你a的每一行。

可能比如说你有一兆个元素,但其中呢很可能只有十个元素是非零的,其他全部都是零对吧,你如果你全部都是零,那你就不用存它了,然后sparse matrix有很多很多种存档格式啊,什么csr啊,coo啊。

然后这边就不具体展开了,然后在图形学里面一般的常见的搞法呢,我们是不存这个a很不存这个a什么意思,这个我们后面会提到这个叫做一个matrix,three的搞法,通常呢这个是最高效的方法,对于存储来说。

由于不需要存a的entry了,所以它能省很多内存,对于计算来说,大家不要觉得计算是加减乘除公式计算,你从memory fetch data这个也是计算一部分,而且在现代计算机体系结构里面啊。

memory bandwidth和flops比起来是非常昂贵的,一个一个这个操作,而是非常昂贵昂贵的资源,因为你内存很慢,cpu很快,这个我们后面第九讲会提到高性能物理模拟。

这个时候你就要考虑到我到底是在线的,把这个值算出来,还是说嗯我去把这个值预先算好,放在内存里面,然后每次去取这两个,是这两个设计在不同的情况下会各有优劣,但是对于呃流体模拟里面的泊松方程。

一般来说大家都是不存的,直接用magic three的方法去表示这个a,ok那么具体matrix free是什么意思呢,我们后面会提到,这边我们讲一讲clot subsidivers。

然后quite a subsisubsive solvers,基本上是最有效的linear systems office之一了,然后它其中又有很多很多个变形。

那最知名的变形叫做conjugate gradient,共轭梯度法,或者一般会被缩写缩写成cg跟computer graphics,其实呃那个cg不是一个cg,然后在graphics里面呢。

除了cg以外,大家还会用,有的时候会用cr,还会有这个gm s,然后可能很少很少情况会用搬到bcd step,大家这边呢一开始的话只要掌握cg就可以,因为cg确实在很多情况下已经足够了。

如果大家想学更多的关于quite of super,super space over的话,有一个书呢叫做introduction to conjugate。

gredimethod with all day啊,就这个不过梯度无痛教程,这个还是一个写的非常好的书,这个书已经出来呃,几十年了,然后呃这个应该是免费,这个应该是一个免费的书。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因为他直接挂在自己的主页上了,大家可以下载下来看一看啊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

虽然他自己声称是一个无痛教程,你如果真的要把它啃下来,还是要费点时间,我自己之前看的时候,说实话也费了一些时间,并不并不像他说的那样完全是无痛,但是他标题也没有标题党,他说这个是没有剧透的学习。

你这个只是呃学习嘛,总是要有一点痛苦的,他只是把你痛苦减轻一点,这是一个非常写的非常好的书,大家可以去看一看,关于什么是快乐subspace,我这边就不继续去深入了。

然后对于conjugate gradients呢,其实它实现起来非常的容易,其实也就这么个十几行代码,ok然后如果说你一开始没有办法理解,conjugate gradients在做什么,完全没有关系。

你把这个十几行代码啊记好或者给他抄好,那你基本上你soba就是work,然后呢你当你得到结果以后,你再去慢慢研究它,为什么是这么个结果就可以了啊,这个确实一开始要掌握的话,还是需要一些理解的。

ok那么这边大家可以看到呃,他我大概讲一讲这个算法在干啥吧,它其实就是一开始先算一个residual,然后这个p呢这个p和刚才压强不一样,这个p呃是我们的沿着这个解的这个search的方向。

然后x呢是我们对当前的解的一个estimation,然后我们每次呢这个有一个循环对吧,我们每一次在这个循环里面,我们去estimate一下x应该加上多少分的p,使得x能够更接近我们的解。

然后呃我们更新了x以后,这个r也得更新对吧,你看这个r的定义r等于b减去a x,所以更新了x呢,我们r也得更新,而更新了以后呢,如果r已经足够小了,我们就中断。

然后呢我们在estimate一个叫做beta,然后用这个贝塔p和和r去更新新的p,得到下一步的这个p的这个search direction,然后到下一个循环里面,你看我们用这个p来更新x了。

所以这个是一个不断的迭代的一个过程,当然中间这些为什么阿尔法这么取,为什么贝塔这么取,这个就需要一些比较深入的理解,直观上来讲,他就是在做一个能量最小化。

然后他还是选择一个在一个快乐suspace里面去做,能量最小化,还是一个很有意思的一个过程,大家可以去看那本书,那本书里面讲的非常的清楚,但是那本书作者自己也很坦然,他说他写了本书的动机。

就是他自己一开始看了很多共轭梯度教程,一个都不懂,然后他最后最后就自己写出了一个教程啊,所以这跟我记录大家一开始不能理解,我不用担心,大家都是都是不能理解的。

这个本身就是一个很computing的一个过程,o,说到迭代法求解线性方程组,iterative method,他的convergence rate和一个指标非常联系密切,这个指标是什么呢。

是condition number,什么是condition number呢,这个就涉及到矩阵的ion system,我们来回顾一下什么是特征值与特征向量呀,如果说我们有这么个非零向量x。

使得ax等于lambda x,也就是说呢a作用在这个x上面,会把这个x方向不改变,而长度缩呃,缩放拉姆达倍,那么lambda就是a的一个特征值,x就是a的一个特征向量,一个矩阵啊。

可能有很多很多个特征值对吧,然后呢呃condition number是什么意思呢,condition number就是这个矩阵的最大的特征值,除掉最小特征值,这个直观上的理解。

就是说这个矩阵如果作用到一个向量上面,它如果有一些方向把这个向量拉的非常长,有一些方向把又把这个向量缩的非常短,你就会觉得这个矩阵看起来非常的厉害,他的condition number就会非常大。

当然这个是直观的理解,然后要注意的是,condition number有很多很多种定义,我们这边是采取了,通常对s p d矩阵的一个定义,你可能在其他地方呢会看到其他的定义。

但总体来说呢肯定是number越小,它收敛得越快,另外一个呃,能够提高你的这个刚才我们讲的肯定是number,越小才说的越快,那么另外一个能够提高italy solver的一个。

收敛速度的一个trick叫做什么,叫做one starting,那这个是什么概念呢,如果说解这个literally dissolver的时候,你的initial gas已经和你真正的解,非常接近的话。

这个叫做warm starting,在流体模拟里面的warm starting是什么呃,大概是怎么做呢,就是说你这个linear system,解的是每一步的压强场对吧,那么我们有一个sumption。

就是说你上一部的压强场,很可能和这一步的压箱厂差别不是特别大,那咋办,我们把上一步的压箱厂拿过来,当做这一步的压箱厂的初始初始的猜测,然后进行迭代,这样能够显著的在某些情况下能够显著的减少。

你需要迭代收敛的时候需要的迭代次数,当然实际上情况我自己的测试发现,这个trick对于jacob啊,搞赛道啊,或者country gradle是work work,非常非常好的。

但是对于multigrade就word不是特别好,具体的我没有研究过,我觉得直观上的理解可能是multigrade,他的preconditioner distort,你的你的这个空间。

这边我们来演示一下,这边是一个free sober对吧,这是我很早之前写的,你可以看到这边有一个argument叫做warm starting,如果说我们把warm starting给它去了。

你就会看到我这边当然没有迭代到熟练了,我这边是呃,你看我这个有jcopy iteration,我只是用了固定次数的joperation,如果说我把它调到34,你可以看到它的体积会不断的缩小。

为什么体积会缩小,体积会缩小,就是因为你的压强场没有球好,如果你的压强场求好的话,那你经过压强这个投影以后,你的速度场是五散的,速度场无散以后,你的体积就不会放大或者缩小对吧。

但如果你压向上球的不好的话,那你的速度上就会放大或者缩小,那么如果说我把warm starting开下来,我就需要很少的迭代次数啊,我就可以把压箱乘求了呃,迭代到一个非常准确的一个解。

这样的话呢嗯我的这个素质场就会更加的不散,效果就会更好,那么刚才讲到preconditioning啊,刚才讲到这个condition number有没有什么办法呢。

我们可以让a的condition number小一点,其实你让a的肯定是number变小了,那可能是没有办法,因为你不能变a,我是不是又把这个为什么这个风扇这么长,ok,不好意思。

我这个电脑它一跑gpu的程序,它就会风扇就会转起来,大家可能会听到一些噪声,但是我声音大一点吧,刚才讲到呃,a的condition number越大,就会导致迭代法需要更长的时间,或者更多的迭代次数。

有没有什么办法,我们能让a的肯定是那么变小一点的,这个叫做这个技巧,叫做preconditionally,注意啊,我们呃去solve ax等于b的时候对,如果说m是一个可逆矩阵。

那么solve ax等于b,其实等价于我们sob一个m-1,就是m的力乘上a,再乘上x等于m的逆乘上b对吧,我把ax等于b左右各乘上m的力,这个为什么会有帮助呢,这个因为有的时候md乘上a。

会有一个更小的这个condition number呃,和a api,它的可能性当中可能更小,它收敛就更快,或者说呢嗯他的icon value classroom比a自己更更好。

这个icon value classroom,这个是一个country regredient soga,里面决定它收敛迭代次数的一个metric,这个大家可以去看之前的那本cg的书,可这边有个问题了。

有同学会问,为什么我们不直接让m等于a呢,啊这个其实就是呃很有意思的一个问题,就因为你如果那就是m等于a的话,那你其实你这个方程其实就变成了,x等于md乘上b对吧,那其实就不用解了。

但为什么我们不能让m等于a,还是因为一旦em等,如果你都有m等于a了,那你就能invert这个a了,那你就不需要这个preconditioner对吧,这个就是呃就是因为我们没有办法算出m的。

我们就是因为我们没有办法算出a的逆,所以我们才需要做preconditioning,如果我们能让m等于a,那我们就能算出m d m d m等于a,那么m就是a的,你就是因为md算不出来。

就是因为a的d算不出来,我们才需要precondition 0,所以啊一般来说m是取一个近似的,和a近似的一个矩阵,而且他很容易求利o,那么刚才提到m一般是取一个和a比较接近,又比较容易求逆的矩阵。

哪些矩阵比较容易求力呢,对角阵很容易求力对吧,对角阵你直接把他对角线给他求个力,就得到了这个取证里,所以呢这个就引入了这个就造成了一个pregnition,它叫做jacob pregnition。

或者有的地方叫做diagonal preconditioner,还有的地方会用incompleto ley,然后呃这也是一个常见的一个precondition。

这个大家可以去看robert bryson的一本流体的书,里面会讲到sap,cg就是用incomplete lesky来做padditioning,今天我们主要讲一讲这个multique。

因为multique现在基本上已经成为同心学里面,求压力投影的这个标配了,大家还是要能够实现mt龟,猫龟还是很容易实现,而且效果非常非常的好,然后大家不要觉得preconditioner。

一定得能写成一个矩阵的形式,你如果有一个fast multiple,你也可以把它用作pregnitier,他只要是一个general linear preter就可以了,那么我们来讲一讲mi rs。

刚才讲到了mti que,它是一个收敛非常快的一个preconditioner,他其实近似的去invert了a,为什么他能够近似invert a,而且又算得非常快呢。

因为大家想如果说你去解建你建立的这个方程,如果说呃你你只在原来的网格上建立这个方程,那你的这个还记得我们对于laplus,operator的这个discretization嘛。

我们是关于一个cel和它周围的四个cl呃,做的这么一个dispensation,那么他这个每一次做一次这个零点operator,他能看到的cell是非常小,只有五个cell对吧。

但是很多时候你会发现我们的这个呃,速度的散度,它可能是一个非常large scale,非常low frequency的一个速度散步,这个low frequency的这个速度散度。

就没有办法被这个一个senso给它capture了,那么怎么办,我们可以搞一个multi resolution的一个方法,我们把这个recedure这个这个这个余量给它。

不断的做着做一次restriction操作,什么意思呢,我们把四个格子给它合并成一个格子,合并成一个格子呢,然后我们在这个格子上面再做gsmoothing。

然后呢我们做在computers residual,然后再respect,然后最后我们建立了一系列的网格,从最细的网格到最初的网格,到了最初的网格呢以后呢,我们就可以这个一般信息系统就非常小了。

小的信息图怎么算比较快,之前我们还提到对吧,一般就是用direct solver或者用或者用potil,然后当然如果你懒的话,你直接在小的信息系统上面,直接用jcb叠加个240,那也没有问题。

那么这个最对highliywood idea,其实就是说我们把这个residual grade,给他做一次motor solution的处理,然后使得我们可以在多个尺度上面去啊。

消灭我们的residual,这个multi grade它有很多很多的设计空间,它呃刚才看到了一张图,大家也会觉得非常复杂对吧,你这个有有restriction,有prolongation。

有这个v cycle w cf,cyle有好多种不同的递归的方式,这个大家可以呃,我后面会推荐一本书,大家可以去看一看,然后smoother呢刚才我提到好的linear system solver。

他很多时候是由比较简单的linear system server,给它compose起来的,那你smooth里面可以用gf,可用jacoby,可以用dap,jacob和s都可以。

可以是各种各样的各种各样的smoother,然后呢,还有你可能会有很多个很多不同的层对吧,你的层你这个到底选多少层比较好呢,如果你层数太少,那你这个对cos这个level,他的vox数目会非常非常多。

那解解会很慢,如果你存太多了以后,他做了cos以后,那它就会逐渐的失去了原来几个星期的把握,所以层太多了也不好,这个就有一个trade off了,一般来说大家的搞法就是说不断做cosine。

直到你的最cos的一层the box数目,能够被direct solver高效的soft的时候,你就不再继续做cos 0,然后最底层的solver用什么,可以用bf force riobe。

我刚才说的偷懒的方法,或者使用disober,然后呢刚才讲到这个smoothing iteration,到底每一层啊拍了多少个,这又是一个需要设计的地方。

然后呢还有cos和boundary condition,怎么去handle guerin cos啊,sei break mtv的呀,这个后面的话题就很多很多很多了,我们就不展开了,当然说这么多。

其实你要实现起来并不并不难啊,我们有一个参考的实现,一般来说呢我刚才提到,如果你要解personequation,如果你是在regular grade上面来做,那基本上motique是少不了了。

现在你要发一个c graph,你如果要接persn equation,你不用multi gram的,别人都会质疑你这个性能是不是有问题,呃这边呢推荐两个材料。

一个一个就是multique tutorial,这个是非常好的一个教程,然后呢另外一个是graphics里面啊,这个应该不是最早的multigrade paper,但是它非常容易understand。

它就是一个,其实太极里面也是有multi grade的例子的,我们来看一看这个呃,mtv很少单独用来做sober,一般大家都是用来把它用来做cg的preconditioner。

所以最后就会得到一个东西叫做multi grade。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

precondition and company regredients mg pcg,我们来跑一跑这个m tp c接,诶advance,这个声音应该是一个三维的播送方程,server。

这个每个iteration啊,就是一个共轭梯度的iteration,你看到这mtv的产生了很多的kernel嗯,我们来看看他刚才的输出啊,在这儿还不太会找到,如果用了mg pcg。

我们只需要六个iteration,就可以把residual从这么大一个数,缩到这么小的一个数,当然m g p cg,你用m g p c g以后,你的每个intuition也会变得很贵很多。

但是总体来说呃,减少的itation的数量还是能够抵消到,你每个h是变贵的成本,所以大家基本上解psy equation都是用mg p c g,呃,我其实可以modify一下mg pcg。

我看看能不能用,啊这个例子里面好像,啊有一个use multigrade,我可以把它怎么给它换一换,我可以不用毛利柜的,给大家演示一下这个是怎么个传进去的啊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我把它改成false,我现在把mtv关了,我们来跑一跑,解同样的一个system,我这次不用毛利贵的,我这次只用裸的cg,你可以看到呀,他这个residual掉落速度明显就变慢了。

这已经20个a同学生了,还没解完,multique它有一个性质,就是你multiple写的好的话,那你基本上你的residual是迭代一次,少一个数量级,迭代一次少一个数量级。

所以multigrade它的是这个不管你的这个system有多大,它的迭代次数通常来说是肯定的,比如说呃迭代十次呃,cg 10次,mt grade,那基本上就能够收敛,但是裸的cg啊。

它迭代次数会随着你的,一般来说你可以认为它随着你的信息系统,它的边长是线性的增长,所以cg它的特别是你性能越大,你用毛利贵就收益就越好,你到现在还没有熟练,我就不让他跑,可能跑到下课也不能收敛。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ok大家可以去看一看这个,这个example其实很简单,这个呃这个example呢用了维度无关编程,大家可以把里面dimension改成two呢,就是一个二维的mt柜,改成三就是三维的mt柜。

当然我刚才提到mtv,它设计非常非常复杂的,这个mtv是一个高度简化版的mt贵,他用的所有地方都是最简单的,方便大家去理解它在干啥,ok那么我们总结一下刚才讲了,刚才讲了这么多呀。

其实都在讲这个欧拉的流体模拟,在通信学中,对于每一个time step呢,其实就两个关键操作对吧,advection和projection,the action呢其实就是移动的流体field的。

说白了就是嗯这边唯一一个关键的事情,就是说你要用一个好的advection scheme,使得它的numerical biscoti或者numerical diffusion,要尽量的小对吧。

如果说你的emo with scody很高的话,你这个流体本身不粘,它变得很黏,那你看起来就啊没有那些很刺激的效果,大家在突击圈里面,还是喜欢看雷诺数比较大的流体的模拟,ok然后呢。

如果说你要找一个数值,点型比较小的一个scheme,你可以采用micromi,或者你可以用b f c c,或者你用particle action,后面我们会讲到particle action,第二步呢。

第二关键的东西是projection,projection,就是说你得去保证你的速度场是diversions trade,它得五散,什么是为什么要无伞呢,因为你的素质上五散了以后。

你的流体的体积才得以保持,像我还记得我刚才那个加工吗,如果说我的pressure这个扫不好,如果我只迭代十个一堆人就把他掐了,那我得到的解就不得到,这个压力的解就不是很准确,就会导致速度长是有散步的。

有散度呢,它的这个就不能保持自己的体积,看起来就会呃这个流体会看起来很奇怪,当然了,你要把它迭代到速度上五散,那这个是需要一个很好的零点solver,那通常大家会用mg p c g。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

啊对其实我我应该提一下,有一个太极里面有一个sam叫stable fluid。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这个是荒野大神写了一个流体模拟的一个demo。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这个其实是一个交互的demo,大家可以去玩一玩。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这个我没记错的话,应该是用了3d lebron jaction,加上jacob projection,大家如果有兴趣的话呢,可以把它改一改,把它改成microme,然后再改成嗯。

用至少得用contringredient to solve这个pressure吧,当然你如果用stable free和这个呃jacob tation,还有好处,那就是它比较容易实现对吧。

大家可以看到这个还是有一点点黏的,看起来有点黏,然后它的压强也不是完全无损,你如果很猛的去拖一拖,你会看到它这个体积有被压缩或者膨胀的,这个现象,可刚才提到了,其实,欧拉法解这个流体其实就两个东西对吧。

the election和呃和这个projection,然后啊这个vision projection它内部虽然你要做好,但他们怎么组合,这个也很有讲究,这边呢呃介绍一个问题,也就是说你如果原始的速度场。

你做了一次的vision以后,然后你会得到还是这个黑线,你会得到这么个速度长对吧,你得到速度场里面呢,就会有一个有散度的分量和一个无散的分量,这个地方你可以轮子做一个后后侧分解。

然后你这个地方再去做一个projection以后,你就会发现你把有散度的那个速度上,分量给它投影掉了以后,它的动能就会得到损失,它动能得到损失以后呢,那你这个速度长,它就会呃这个地方就会引入一个呃。

numerical viscosity,或者呢你会导致他的vertiity,它的这个涡量它就会给被丢了,被丢了以后,那你就得想个办法把它恢复出来,那这个地方大家可以看张星星师兄的这个文章。

叫做a b u c k是一个挺有意思的文章,他呃通过去重建丢掉了涡量的速度场,给他提高这个流体的这个降低这个流体的数值,连性,另外一个很有意思的paper叫做vtureflection,sober。

他的idea是什么呢,如果说还是刚才那样,我们做一个advection以后再做projection,那么我们就会丢掉这一部分能量,那reflection干啥呢,我去我不去把它嗯。

我不去把它一次把它project掉,我去做一个在advance中间做一次projection,这个projection是能量对于能量没有损失的,我就把这个点给它移到了这儿。

然后后面我们再做一半election,然后最后的这个projection,它能量损失就会小了很多啊,这个这个paper大家可以去尝试实现一下,这个paper非常容易实现,可能五行代码就能实现。

你如果有一个microsoft,再加上一个好的pressure的一个projection,solver的话,可能稍微改改代码,改五行代码就能实现它,而且效果非常非常的惊人啊。

这个是sopa 2018的一个,我觉得非常好的一个paper,既容易实现,而且效果又非常好,大家作业一样,如果有兴趣的话,可以实现一下,这个我觉得呃收获会很多。

而且可以看看他paper里面的推导还是很有意思,ok那么我们基本上就讲的差不多了,呃如果说大家还想继续深入学习呢,毕竟我觉得这节课其实内容也很多了,这个大家肯定要一段时间消化。

嗯如果说大家觉得有一点有一定难度呢,那其实也没有关系,我在课件里面写了好几本书,然后大家可以看看这些书,然后如果呃觉得大家听了这一讲觉得不懂,也不用特别觉得frustrated或者什么的。

不用特别灰心丧气啊,呃一开始总是会有一点难度的,我一开始学的时候和大家其实也一样,但是我只是呃我在这一讲里面,其实更多的是一个导游的作用,更多是一个导游作用,给大家推荐几本书吧。

我觉得你真的要一个小时把欧拉法呃,欧拉视角下的这个流体模拟全部讲清楚,还是非常非常有难度的,我真的已经竭尽全力了,呃大家可以去看看那些书,我觉得还是写的很好了,如果大家还想还想继续提高。

然后首先可以去考虑考虑3d的怎么模拟,然后呢怎么把boundary condition给他做的更好一点,我刚才提到这个boundary condition啊。

只是以voxo为精度的bury condition,很多时候大家会,如果说你的这个边界,正好在你的这个boxo内部划了一刀咋办,这个牛也要做去去做这个cos之类的操作。

那么大家可以去看这个chris bi的这个paper,这个是一个很好的paper,然后流体怎么和固体couple怎么去耦合,也是一个很好的话题。

怎么去做这个two face for resimulation,two face free simulation啊,其实最简单的例子就是说呃你如果有一瓶水,然后假设你有一瓶矿泉水对吧,你把它瓶盖打开。

你把它倒着往下,让这个水往下倒,那你这个水往下流出的过程中啊,你还有空气进去,那你如果说要做一个one face fluid simulation的话,那你这个水就会直接的往下流出来,而没有空气进去。

就会非常非常不自然,如果你做two face呢,你就会有空气进去的,这个效果就会非常的非常有趣,大家可以去看reference,11,是一个很很好的一个用stream function。

来去做two face fluciation,那么刚才我讲的其实全部都是,应该是说是可以认为是气体的模拟气体,它有一个特点,大家一般也叫它烟雾模拟,然后如果要模拟水的话,你就得有一个水和气体的界面对吧。

这个界面它是压强的边界条件,压强的利克雷边界条件压强为零,怎么去handle流体界面,怎么去capture,流体界面的变化就要用到level set,level set。

这个最权威的书就是这个level set methods,and dynamic implicit surfaces,作者是senior shell和rog physical,然后大家可以去呃。

这个这个书其实是一个不是特别友好的一本,对于graphic来说不是特别友好,大家可以去看run他早期rptical,他早期有很多用level set的paper发在sram上面。

那些paper是把这个level set的理论在,在重新学里面的一些比较简化版的应用,然后还有vertex method,vertex method也很有意思啊,那就是说我们之前讲的。

全部都是以速度为基础的n s方程,那么以速度为基础,你很容易做到这个动量守恒对吧,你可能会拖到质量守恒,但是很多时候你很难做到涡量守恒,如果你用一个以涡量为基础的这个server的话。

你就比较容易做到模式量守恒,涡量是什么呢,微量就是流体里面打圈的一部分,如果你做了这个微量守恒的话,你就能保持流体和流血打圈的部分,那你就流体效果就会更好一些,这个我们留给下一讲呃。

新兴师兄来给我们做一个呃,专题专题的这个课程,ok如果大家对实现epied oilers free sober有兴趣的,也可以把它来作为homework,he像我之前讲的呃。

这些应这个oiler resolver通常很难呃,比一般来说你如果叫做要做incompressible的话,那一般来说是没有显示格式,因为显示没法做了,incompressible啊。

除非你用vertistic作为你用涡量的方法,但是我们都是用速度来做,那么你如果想用erance loser来作为homework一呢,那就可以进行implies sover内部的比较。

比如说dj kobe versus,这个country regredients或者multique versus,普通的country degredients对吧,ok那么这一讲就到这里。

我来看看大家有没有什么问题,对我应该终于可以开一下我的虎牙的这个窗口,看看弹幕里面有没有什么问题,我之前不敢开,我怕怕他卡,我看看,哦我现在登录上去,看不到之前的弹幕了,哎呀好吧。

那大家还是把问题发到qq群里面吧,发到微信群里面吧,不知道之前有没有问题,之前之前大家应该弹幕里面发了很多问题,但是因为我没有开播放的原因,我没有看到弹幕,所以不好意思,如果大家想有问题的话。

可以在论坛上面或者在微信群里面发出来,ok或者要不我们今天就先到这儿,然后大家有问题呢,可以在课程微信群或者在论坛里面提出,毕竟其实这节课啊确实容量还是挺大的,我们本来是准备讲两讲。

好多人fluid simulation,但是我们这次压缩成一讲,所以给大家吃了个压缩饼干,可能需要消化一段时间嗯,我一开始学的时候也消化,课要也消化了很长时间,所以我也能理解,这个学起来确实没有不能呃。

一下子掌握,我觉得很正常很正常,这个大家可以看一看样例代码,自己去写一写,有的时候你即使你不理解其中数学,你把这个代码拿下来自己改一改,改着改着,你可能也就理解他这个额数学是什么样的。

它背后数学什么样的对吧,你可以跑跑别人的代码,然后看一看,ok那么我们今天就到这儿,然后感谢大家来我们的课程,希望大家呃做出更加惊艳的作业,我觉得这个alern foresignation。

能做出很多很棒的效果啊,特别是烟雾啊,流体啊,烟雾啊,液体啊,还是很容易做出很炫酷的效果,ok那么就到这了,拜拜我们下周再见啊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GAMES201:高级物理引擎实战指南2020 - P5:Lecture 5 多体问题与涡方法 - GAMES-Webinar - BV1ZK411H7Hc

那么欢迎各位同学啊,我们今天请来了一位重量级嘉宾,就是我们的张欣欣师兄,然后张毅师兄是呃u b c的计算机图形学博士,然后他给自己的描述是热爱物理与计算,数学,解决其中有挑战性的问题。

致力于在计算机上再现大自然的美,真的是这个,我觉得在座的各位应该有很多同学都很喜欢,希望在计算机上再去模拟一些,大自然里面的自然现象,我觉得呃在计算机上再现大自然的美。

应该还是一个非常非常非常有趣的事情,这也是为什么我们要开这门课的,初中说到这个在线呃普及物理型的各种工程啊,这个其实我之前和呃星星师兄,有一次聊到这个事情,然后我当时有一个困惑。

我就觉得如果我们开了这么个课,会不会有同学觉得我们在拔苗助长,或者呃会会不会有同学觉得超纲了,然后进行实用,就反问我一句,你自己不就是这么拔苗助长长出来的吗,我想好像确实也对啊,只要大家有兴趣。

这个课程稍微难一点啊,或者呃遇到一些难度啊,其实在兴趣的驱使下,我觉得这些都不是问题,当然我们当然会尽我们最大的可能性,把这个课程以一个通俗易懂的方式给他讲出来,ok那么对另外一个事情就是说。

我们以后还是希望大家能多看看直播,因为我们确实有同学反映,我们之前直播有卡顿啊,或者呃背景有噪声的问题,但是我相信现在都已经解决了,因为我换了一台比较猛的g比较猛的电脑。

然后我还专门去amazon买了一个,应该还算比较靠谱的这个microphone,我希望希望以后就不会有这个卡顿,或者呃背景噪音的问题了,而且大家如果看直播的话,有很多问题就可以在线提出来。

然后我们收到这个反馈啊,其实也给我们讲课的过程,其实也是一个非常非常大的帮助,ok那么我们就把剩下内容交给星星师兄了,星星今天会给我们讲讲补充方程,与其快速解法,all right,so,那我们开始吧。

好的好,谢谢这个胡世纪的介绍哈,那个呵呵呵心流水,可见这么多天的授课,这个叫什么口才方面已经长进很多啊,那个对,我希望今天的课尽量能够做到通俗易懂,这四个字,这个但我也相信以我看了上一次的课件哈。

我觉得能够留存到今天的同学,应该应该挺不容易了,所以所以哈那我呵呵,我也不多说了哈,我们现在就开始吧,今天我会讲这个有关播送方程和快速解的,他的一个一个快速解的中呃一些一些事情。

那么这个我们从快速方法来看。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这个泊松方程的时候,我是基于这个泊松方程和它的基础解,这样一个角度来看的,也就是说我们现在讨论的是,把之前我们看到的解法,都是基于它是一个偏微分方程的角度去看的,那么今天呢我们考虑的是一个开空间的。

泊松问题,并且把它通过这样一种积分积分,这样一个基础解积分的形式,来看待这个活动问题,那么其实像这样的一个播送问题呢,很多同学他在你们应该在这个高中的时候,就已经接触过了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

比如说我们十分熟悉的这个万有引力,那么万有引力呢,我们通常就是说我们的市场满足一个,关于密度的泊松方程。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后呢我们那不同的任意两点之间的受力呢,就是这个市场的梯度,那么在这样一个情况下呢,我们如果把这样一个梯度运算代入到,我们的这个基础解的这样一个求和系统中,我们就会把就会得到我们高中的时候。

很熟悉的那一个呃万有引力的公式,我们的利与距离的平方成反比。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当然这里因为这还有一个。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这个是这个距离的这个方向,所以他一除是一个距离的平方,我们力与距离的平方成反比方向,沿着这个粒子与粒子之间的,这样一个相互的方向,并且前面还乘一个系数对吧。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

它与质量成正比,那那么这个呃。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

当我们看到这个呃求和表达式的时候,其实我们就能够注意到哈,如果我在一个万有引力系统中有n个例子。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

以及我有我要去对m个点求这样一个力的话。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那么我的一个直接求和的办法呢,需要n平方的时间,或者说在这里是n乘以m的这样一个时间,那么这个时间呢它的这个skin是很差的,所以我们需要快速的方法,来降低它的这样一个skin。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那么呃这个时候呢,我们就可以看看一下这张大图,我之后会在之后的这个slides里进行一个详解,那这样一类的方法呢就叫做快速多机展开,这个呃胡适弟应该也在之前的这个呃斯莱呃,之前的课程中有讲。

这个是被誉为20世纪,21世纪十大重要的算法之一,的快速波及展开,那么快速突击展开,它究竟利用了怎样的一种思想,他究竟采用了怎样的一个分析的方法,使得最后人们能够在线性的时间里去计算。

这一个n平方的求和问题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们现在就来展开一步步分解看一下,首先我们考虑一个二维的,为了为了简化,因为我尽量希望使这个概念可以清晰的传达,而不是它呃其中具体的一些细节,那么我们现在先来看一个二维的播送方程,和他的一个呃。

这个和它的一个基础解,当然这里为了方便我采用负数来表达,我们的这个坐标,并且呢呃我们知道这样一个球和表达式,它的实部就是呃我们要求的这个呃波动方程,它的解,ok而这个log of距离呢就是二维情况下。

我们的格林函数,那么此时我们考虑一个考虑一个呃,考虑一个圆,以及它在远处这个z点处嗯,引发的这样一个一个一个势能,那么这个时候呢,如果我们在pc on的这个地方去做一个泰勒展开。

那么实际上我们就会发现其实在这一点,在这个z点,他的这个是其实是可以看,至于qi这个这个电子的带电量在零点,在这个零点处,在这个零点处对它的一个势能加上一个高阶项,加上一个高阶项。

这个是我们对于对于对于原来的这个函数,在零点做泰勒展开以后直接得到的这个关系,那么这个时候我们想象,如果我在靠近零点的地方,有很多很多的带电的电荷,它对于这一点的作用。

如果我们都去对零点做一个泰勒展开的话,那么我们实际上就会得到什么呢,我们的fez是等于所有这些东西的,它的这个电量的核对吧,它的视作用的一个和,那么我们在这里对零点做了泰勒展开呢。

我们就发现它其实可以拆成两个部分,第一个是它就好像是一个来自于零点的,一个带了更大电荷的电子,对于这一点的这样一个视作用,以及第二个我们的一些高阶项,我们的一个高阶项是来自于对它的这样一个形,状。

所以这个时候我们看一下,我们把这个公式抽象一下,我们就会发现我们会有一个大q,这个大q呢,它其实相当于是说在零点附近,所有的电子的电量的总和,以及我们的高阶项q k,他呢是在这个零点附近的。

做完泰勒展开了以后,我们得到的这样一些高阶局,像而我们关于这点的这个事,就所有的这些呃零点附近的电子,关于这一点是,它其实是可以写成q乘以我们的格林函数,以及加上这样一些高阶项。

除以z k的这样一个这样一个累加,那么这个后面的这个高阶项呢,我们会发现它是几何收敛的,那么实际上在这个时候呢,我们已经可以得到一个n乘以logn的算法了,这个算法呢又被称为这个吹口虚构的。

他通过这样来实现,首先我们假设自己有很多的电子,在一个空间里头,然后我们对它做一个网格划分,然后呢在每一个格子的中心点,在每一个格子的中心点,我们去近似的计算这个q和q k也不是近似。

就我们去计算q和q k使得什么呢,使得离这个格子远处的这样一个市场的,是可以被q和q k,近似的,那么这个时候你可以想象我们不断的往上,不断的逐层往上抽象,我们最后就得到了一个特别特别粗的一个网格。

它里面存着这些q和q k,其实是代表着所有属于这个格子的这样一个电,量,所所代表的这样一个泰勒展开的这样一个形式,对吧,那么这个时候就有意思了,如果我们想要求这个空间中。

任意一点的这样一个电场式或者重力势,那么实际上我们可以怎么来做呢,首先我们通过树状结构的便利,走到最后的这个叶节点,然后我我们可以,我们认为所有离这些叶节点最近的格子,我们通过直接求和的那个公式来计算。

然后当我们逐渐的这个距离变远的时候,因为原厂它基本上是比较平滑的,那么这个时候呢,我们就可以用那些记录在这个格子中心点处的,这些泰勒展开,去近似他的这样一个原厂式的影响,然后直到最后我们通过最粗的。

最粗糙的那一个解析度上的q和q倍,去近似他的这样一个原厂式的影响,这我们就得到了一个对于这个格子十分精准的,这样一个原厂式的计算,而这个过程呢,因为我们要对每一个格子都去做这样一个,落根的计算。

所以最后我们总的计算量是n乘一老根的,那么我们这边我觉得是有一个问题,就是说包括我也有这个问题啊,就是说这种类似于像八叉树的这种近似的方法,有的地方叫它吹code,有个地方叫它这个burnhot。

然后还有很多很多其他的名字,他们都是一个东西吗,是一个东西全都是一个东西,事实上这个缺口就是bernhart发明的,或者发现了,应该说是对对对,所以这些说这都是一个东西,对没有问错。

ok那么我们更进一步的,我们在知道了这个n log的缺口的了以后,我们怎么样去得到这样一个线性时间的算法呢,这个时候我们就再往前考虑一步,而这个问题就是我们能得到欧文时间,算法的一个关键。

此时我们假设我们已经在一个z1 ,这个中心处的电子云,我们已经统计了出它的这样一个q和q k对吧,它可以精确的估计,在原厂z处的这样一个电子式,那么这个时候我们要问一个问题。

我如何通过这个电子云的q和q k直接估计,估计出另外一个z2 处的q和q k,使得在这个z点处的,是可以被z2 处的这样一个展开,所精确的表达呢,这个时候我们其实涉及到的就是什么呢。

就是把一个multiple,把一个这个multiple呃,所以这个又叫做一个m2 m的变化,那这个时候其实方法也很简单,我们既然有了z一处的这样一个电子式的,这样一个计算公式。

我们对它重新在z2 处进行一个泰勒展开,并且重写这个公式,我们就得到了一个新的这样一个形态,你会发现,其实在这以z2 为中心的这样一个,这样一个电子云,它对最初的影响可以写成这样的一个公式。

就是q乘以log z减z2 ,加上一个suv加上后面的高阶项,我们这个时候recall一下,我们刚才得到的这个multiple展开的公式,我们发现其实他们俩是有一个类似的形式的,首先我们都有一个大的q。

代表的是所有电子电量的和对,然后呢我们都有一个q k,当然在这里它变成了一个pk对吧,代表的是一些高阶的余项,而他们的收敛性呢也是都是这样一个几何收敛,那么这个时候我们就说dk到底是什么。

其实bk呢我们发现它是对于q k的一个泛化,它是对q k的一个泛化,什么叫泛化呢,首先我们来看bk的第一项,它是大q乘以z一到z2 的k次方除以k,这个东西是什么呢,我们recall一下。

在之前这个我们在看算这个,我们recall一下,我们之前在算q k的时候,他的第一项是什么,他的第一项是关于这个qj的一个和,ok,那么在这里呢它就变成了这个他的第一项,也是关于qg的一个和对吧。

所以其实这两项是相等的,ok那么以及呢它还有自己的一个高阶项,这个高阶项是通过这里的展开了以后,直接这个推导计算出来的,ok,那么在这个时候我们发现它其实这个高阶项呢,是关于原来的那些qk的。

那些高阶turn的这样一个计算的表达式,那么它实际上形象的来看,这相当于是个什么呢,我们的这个我们的这个电子的电源,它其实就是一种十分特殊的model,他们带了电量,q which当它是一个电子的时候。

他就是他自己带的电量,他的所有的qk项都是零,而这个时候呢,我们直接套用bk的这个计算公式,我们其实是可以复现我们的这个multiple expansion,也就是说我们可以复现出从电子累加到这个呃。

累加到一个点的这样的一个multiple expansion,那当我们从n个或者当我们从呃不对,当我们从s个这样的已知的mmultiple,去构造一个新的multiple的时候。

其实每一个已知的multiple,它就又相当于是一个电子了,它就又相当于是一个电子了,然后这个时候呢我们就computer这个bk,通过使用什么呢,通过使用呃,呃加上这些这个rest of turns。

那这个时候我们的我们还是要注意,我们的bk的第一项的这个q,也就是这些小的电子云,他带的这样的一个总电量,所以这样一种操作,我们实际上是把multiple直接给translate。

到了一个新的multiple身上,那么可能刚才讲的有点迷糊,我在这里呢就用一种代码的形式,再把刚才的过程展开一下,首先我们可以定义一个multiple的结构,这个结构呢它包含了两个重要的信息。

第一第一个是它的终点坐标在哪,它的中心在哪,第二个呢是我们有一个,我们有一个qk这样一个turn,当然在这里我们讨论的范围内,它是一个负数对吧,它来表达他的所有的这些高阶项。

那么当我们从source charge来出发的时候呢,它其实是一个特殊的multiple,这个multiple呢它的center就是我们charge的这个坐标,以及呢它的这个q0 。

他的q0 就是他自己带的电量,它其他的这个q k的这些turn呢就是0k,这时候我们可以写出一个通用的multiple to multiple,的这样一个圈子transfer。

那么它呢take的这个参数是一个q list,是一个vector of multiple对吧,然后这个时候我们先去计算它新的终点坐标,比如说终点坐标。

我们可以通过对于这些q list的center的一个加权和,来得到,以及呢我们去计算出它的q0 t跟q0 turn呢,就是所有的q list,它的这个q0 t的和。

然后呢我们对于从一到p这几个高阶展开上,我们呢调用这个,我们调用computer bk的那个公式,去计算它的这个p turn的这样一个值,然后我们把这个result返回,这个时候。

我们就构造了一个从电子到multiple,以及从multiple,multiple的这样一个转变的这样的一个程序。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那当我们知道了如何从multiple,转变到另外一个multiple的时候,接下来就有一个问题变得十分有趣了,这个问题就是,如果我们在一个中中心为c的地方,知道了他的multiple展开。

也就是说这个multiple可以告诉我们,在一个任意一个z点处,它的这个它的这个准确的,这个电场市到底是多少,那么这个时候我们就想问了,我如何能够把它转转换成一个离z距离很小的。

另外一个z一处的这样的一个local口,我们注意这里不是multiple to multiple,transform,multiple to multiple,它的这个transform。

他要求的是我的multiple一和multiple 2,都是离我要求的这个z点是比较远的,这个时候我们是m two m transform,而回到现在的这个问题。

我们希望把一个离z比较远处的这样一个multip,转化到一个离z比较近的地方呢,这个z一为中心的一个local口,这个local local,大家又可以形象的想象它是一个什么呢,它就像是一个差值。

它就像是一个差值,它使得在这一点处的这样一个市市场函数,能够很准确的被这一处的这样一个,多项式给表达出来,所以它就像是一个差值,一个局部领域的差值函数,那么这个时候我们去看一下,当我们做完了。

我们该做的数学了以后,我们其实就得到了这样的一个公式,首先这个z一处的这个这个local它的第一项,它的第一项我们可以看到它是什么呢,它的q乘以log,z一减去c加上这样一个peter的这样一个求和。

它实际上是什么呢,它实际上是电场是在这一处的这么一个势能,这么一个potential值对吧,所以它实际上就是电场是在这一处的值,那ok再加上一个什么呢,我们要求z点数的这个电场式的话。

它实际上就是把电场是在z一处,再加上一个高阶的扰动,其中这个高阶扰动呢由这个式子给出,它是一个bl乘以z减z一的l次方,的这么一个形式,那么由于我们知道这个z减去z1 ,是一个很微小的量。

是小于半径的一个量,而bl呢它的它的半径是这个,它的半径是这个z一减去c的k次方,所以这个这个式子它又是几何收敛,那么这里我们就给出了bl的这么一个表达式,这里我们就给出了bl的一个表达式。

这呢我们就完成了一个,从multiple到loco的这样一个变化,而这个时候我们loco的这样一个结构,它大概是这样的,首先他知道他自己的中心在哪里,然后呢他有一个turn叫做bp。

就是还有这么pig这样的这样一个beer,它来计算,那它的b0 是谁呢,b0 就是它的终点处的电场式的值啊,这个时候我们就又来了一个新的问题,就是如果我们已经知道了,它能够表达所有在它这个半径范围内的。

这些点的这个事的做事的这个值,那么我们怎么给它转变为,一个以c2 为中心的loco,都可以被c2 的这样一个local ball准确的表达,那这个时候,其实我们涉及到的只是一个坐标的变换。

只是一个坐标的变换啊,那么比如说我们就把式子直接写出来,我们其实要求什么呢,是ak乘以z减去z0 的k次方,它可以变到一个bk乘以z的k次方,这样一个形式上,那么会这个可能学完初中的这个数学。

我们就能够做这件事了,那么实际上在这里呢,是有一个这个叫做honor scheme的方法,在计算上帮我们进行一个动态规划啊,动态规划的这样一种计算,可以加速这个turn的这样一个计算的过程。

诶到这我相信有的同学会有一个问题,就是说为什么multiple to multiple,看起来也是一个呃中心的转移,然后locple to local也是中心转移。

为什么local to local就比较简单,而multiple multiple的形式会稍微复杂一点的哦,其实也都差不多是吧,其实也差不多,其实都是我觉得他也没有简单多少,你看这里其实还是很复杂的。

我只是写的简单了,这个形式我觉得是挺复杂的,他的这个公式我觉得其实是挺挺挺烦的,所以我如果不躲都不建议做这个local to local的,我还是觉得用插值的办法会好,构造一个差值就行了啊。

好先这其实它只是形式看起来简单了,我这一个bk对吧,但其实这个bk呢,你会发现它代表的是这么一坨东西对吧,那么在三维的情况下,这个式子会更加的恶心,你看这里这是啥,这bono。

这是binomial coefficians对吧,对对对对,这很恶心的这坨东西,ok嗯那还有一个问题,就是说我们在这说的multiple,和在物理里面的电路机子,它们之间是有对应关系的吗。

是有对应关系的,是exactly的一个对应关系,而且那就是他的说b0 是电单极子,b一是电偶极子,是这个吗,对就是这个机子对,ok所以就是dn就是电二的n次方极子,对你都可以这样想象,其实是怎么样的。

其实在三维的情况下,我们那个我们那个方程是one of them are嘛对吧,是1÷2的那个r i j,然后那个时候我们如果在cartesian coordinates。

在这个笛卡尔坐标系下对他做泰勒展开,然后我们得到了一系列的这个相对吧,这个monopole什么quad pole,八八炮对吧,这些东西就分别对应的是物理上的那样,那样一个概念,ok alexcess嗯。

那么那么在这里其实我们我更喜欢哈,把刚才所讲的这一整个过程再做一个抽象,我们会发现其实multiple expansion,我们实际上在做一件什么事情呢,就是对原来的这个几何,对于这些电子啊。

我我看到我们也把它看作一个几何的话,他是在做一个cosy,他是对他在做一个粗化,然后我们的local expansion呢,它实际上是在做一件什么事情呢,他是在做一个差值。

所以这个时候我们看multiple transform的时候,我们一开始从一些电子开始,然后我们在格子的中心点,去计算出它的qq k和c对吧,然后我们再把格子上的qq k和c。

计算到上一个格子的q q k和c,这个时候呢我们总共的计算量,我们总共会便利过的格子的量,一加上在三维的情况下是1+1/8,加1/64加点点点,所以总共我们会遍历过的格子量是o n。

然后在每一个格子上呢,我们会从事的这样一个计算量,大概是c的p次方对吧,大概是c的t次方的这样一个计算量,所以在这个时候我们往上行的时候,我们的计算复杂度是线性的,那我们再来看下行,下行的时候呢。

我们会经历multiple to locle的transform,以及local to loco transform,那可以当我们在执行multiple to loco,transform的时候。

我们可以注意到,对于每一个格子,对于每一个格子,它所相对应的multiple的数量是有限的,他并不会去累加所有的multiple,他只需要去计算在自己这一层上,和自己相对来说是multiple的东西。

因为来自于原厂,也就是,比如说考虑这个黑色格子,和这些灰色和这些虚线格子,这些虚线格子是这个黑色格子的原厂,这些原厂对它的作用其实通过谁来完成呢,其实通过loco to loco的这样一个变换来完成。

也就是说,当我要计算这个黑色格子的原厂作用力的时候,我实际上是做了两件事,第一件事我从它的复节点,从它的这个复节点去继承loco,并且把附节点的loco给转变到自己的这个,格点中心上来。

然后呢我在我自己相应的这一层上去累加,对于我来说是multiple的这样一个贡献,那么这个时候呢,其实每一个格子它的计算量是常数时间的,而这个常数时间大约也是c的p次方,而这样的格子总共有多少个呢。

一样也是n加上八分之n,加上64分之n点点点,所以呢我们下行时间总共也是欧文的,那么我在这里我再对比一下,这个数代码和快速多极展开,他们两个之间的一个区别,我们可以看到,如果我想对x一和x2 这两个点。

去计算他们的市场值的时候,我们发现对于数代码我们总共要去对于x1 ,我们要累加123456,这些格子对我的一个作用对吧,以及于呢对于这个x2 ,我仍然要去累加123456对我的这样作用。

所以我当我有n个格子要计算我整个长,每个格子呢我实际上要去累加的量,大约是一个logn的计算量,所以它的计算复杂度是n log n的,而回过来我们看快速多极展开,当我要计算x一的所有的贡献量的时候。

其实它总共分两步,第一步是啥,第一步是红框,这个格子也就是它的复节点早已经累加好的,来自于123这三个格子的贡献对吧,这是复节点上就存着的,然后呢我们通过一个l to l的变换。

把副节点上的贡献直接先变换给我了,直接先拿过来了对吧,然后我再去累加来自于这个456,这三个节点的这样一个贡献,那么这个时候对于我来说,我每一次的计算时间,计算复杂度都是一个常数的,所以这也是,这。

也就是为什么fmm,它能成为一个线性时间复杂度算法的原因,那么实际上在我看来哈,前面的这个这些local people do to loco的,这个变化是十分复杂的,我们可以考虑一个更简单的情形。

如果我在附节点的时候,我不去计算local和我取而代之的是什么呢,我在复节点的这几个节点上,这几个box的这个节点上去,计算出来自于123这三个东西的一个贡献,然后我干嘛呢,我在计算x的时候。

我通过一个双线性插值,或者在三维的时候,一个三线性差值先去插值出这个贡献,我不就等于已经拿到了,来自于123的一个贡献吗,因为足够平滑,所以我认为差值也是可能的,ok我再说一遍。

我们在这个节点处去用multiple的方法,去计算1123处的这样一个贡献,然后在里面呢我先插值,插完值了以后,我再去计算456的贡献,并且我把这些东西都计算在哪呢,都放在我这个格子的格点上。

我认为这也是一种方法,这可以避免这个locpto local的这样一个,比较复杂的计算量,比较复杂的这样一种计算,其实我觉得那个代码写出来也很恶心,可能有很多bug都不好修,因为这个公式确实太恶心了。

可能换一个人都修不了,修不了bug,对啊,我昨天还打算自己看看,一天之内能不能实现一遍,然后写着写着发现了这些公式实在太多了,这个一天肯定写不出来,还是很复杂的,所以大家一定要知道,这是一个。

连胡渊明都不可能在一天内写完的东西,我以前玩的东西太多了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对哦好,所以我们再来回顾一下这张全图,这张全图其实给了我们一个很好的这样一个后,羿面前,他表述了说,首先我们从这个source party开始对吧,我们先做p two m变换。

然后呢我们再做m two m变换,然后我们再做m to l变化,然后我们再做l to l变换,最后我们做l two p变换,然后呢在particle周围呢,我们再去累加来自于其他粒子的这些贡献。

这就是整个这个fast multiple它的一个一个一个走法,先是top,先是button up,然后再top down,所以其实我们会发现这个东西的计算。

它似乎和multi grade method它也有异曲同工之妙,也存在这样一种空间的这样一种呃,button up和top down的这样一种结构,那么在三维的情况下,在这儿我要指出一下。

就是我们的泰勒展开可以以两种形式来完成,一种呢是在ktition space,在这个笛卡尔坐标系下进行展开,另外一种呢就是在这个球鞋坐标系下,进行这个展开,那么在球鞋坐标系下进行展开的时候呢。

我们就得到了原始的fast multiple method,那这个大家如果想看更多的这个细节呢,我推荐大家去看这个a short horse on,fast multiple methods。

因为他是这个green guard写的,green guard呢,他就是fmm这个算法的一个发现者,所以这个这个课程我认为是呃,这个cos我觉得是写的比较好。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

有同学问,是不是任意的是函数都可以用多级展开。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这个就有意思了,这个有关于什么样的势函数。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

就是说有关于什么样的和才能够被施展开,在这一在这个short course里面,它是有有讨论的,他有一个引理的证明,就首先你这个和是要满足一个条件,你才能进行市展开的。

那么这种核呢我们叫做degenerate kerne,嗯哼ok它要符合这样一个条件,那么通常的物理上的来来,源于物理应用的这些和,我们可以认为他都是可以被这个市展开的。

包括高斯和包括这个呃热热力学的这个和,包括我们的这个呃格林函数啊,这个万有引力的这个和它都是可以被展开的,那么至于任意的和能不能够被展开呢,大家就要去套那个引力验证一下啊,这个不是任意的,ok政治是。

看来这个课程这个show cos确实非常给力啊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我也应该去学习一下。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那实际上这东西呢它这个fast multiple method,它是有很多这个呃有趣的应用的啊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

一个比较重要的应用,比如说我们可以计算gravitational force。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

以及关于重力的场的一些信息的变化。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那个这个除了可以帮我们在cosmology这个方面,预测星体的运动以外呢。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们还可以就还有人用它来搜寻这个dark matter。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那事实上这dark matter这个名字很酷炫啊,暗物质或者暗能量啊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那么嗯如果我们搜这个fast multiple method的话。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们其实是会搜到有关于dark matter的,这样一些论文的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那么它实际上它是要解决一个什么问题呢,当我们观测到一些带有星体的质量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

或者我们对一块区域有这么一个质量的估计。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

以及我们知道它在怎么运行的时候,这个时候我们就可以借助这样一种。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

仿真分析的办法,去尝试去搜寻出我们计算出来的这个轨迹。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

是否真的符合我们观察到的现象,如果这其中差异很大的话。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这说明什么,这说明就存在我们没有看到的质量。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那这不就是所谓的暗物质吗,啊所以如果对这块有兴趣的同学。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

也可以去看一下有关于这方面的论文哈,那么另外一个它比较有巨大作用的领域,是什么呢,是静电场,electrical static,electrical static,它和我们的这个万有引力一样。

它具有完全一样的这样一个泊松方程,当然正负号不一样啊,这里我要强调一下,正负号不一样,但它的形式是完全一样的,这样一个泊松方程,它除了可以在这个静电物体,物体的表面就给定一个电子的分布。

去计算出静电场的这个静电场式的,这样一个方向以外呢,它还可以干什么呢,事实上在分子和分子之间,或者在分子尺度,静电作用力是它的主要的一个作用力,那么这个东西呢,就会被应用在分子动力学分析中。

那事实上在一个分子动力学软件中,每一个时间去计算这样一个分子静电场力,是呃十分核心的一个任务,而对于分子动力学的分析呢,可以有助于人们做这个肿瘤方面的研究,以及做这个靶向药的设计。

以及像现在呃像呃新冠疫苗的时候,人们就用这样的方法来分析这样一个新冠疫苗,它最好的这个a c r受体的结合点的位置啊,这其实可能很多呃,大家可能很多都不知道,原来这个之中还有这样一个泊松方程。

在再play一个important ro。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

长见识了哈哈,那么以及以至于我们有这个hao方程,hamhz方程呢,它就通过我们对这个hamhz方程的,这样一个求解的,我们就可以去求解这个生产,比如说在这个声音领域。

当我们在某一个位置放了一个这个扬声器,我们想计算这一整个范围内的这个整个声音的,一些声压的分布等等等,这样一些情况呢,我们就可以通过求解harmless equation,来来解决这个问题。

那么以及于呢它可以在这个electro magnetic,就是电磁立场这样一个方向呢,呃产生一个应用,比如说当我们在设计某种健体的时候,那么我们就可以通过这个电磁力的这样一个分。

析去找出它可能被雷达探究的半径,可能被雷达探测到的半径,以及我们去反向优化它的这样一个形体设计,使得它尽可能的能够,呃这个达到一个更好的隐蔽性。

那么这个就是通过electro magnetic的计算得到的,而这两个东西它都来自于这样一个ham,ho或equation的这样一个求解。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那么以及以及呢,我们有一个十分重要的应用是什么呢,就是这个边界元方法,在边境源方法中我们求解一个什么,求解一个拉普拉斯方程,这个拉普拉斯方程呢,它其实是告诉我了我们这个整个流程,整个厂里头是什么。

是有事无缘的对吧,有事无缘,那么这个时候就有意思了,其实这样一个有事无缘的厂子,它的所有的属性就被边界出的值,所唯一的决定了啊,所唯一的决定了,比如说我们如果在边界边界处。

这个比如说在这里这个伽马一这条边界上,我们知道了他的def dn,以及在伽马二这条边界上,我们知道了他的b的这个值的话,那剩下的整个厂里的所有的数值,就都是确定的了,这个数值的确定呢。

可以通过一个解析的表达式来得到,这个表达式呢就是边界积分方程啊,我这里已经把它写成离散形式了,我这儿已经把它写成离散形式了,所以实际上我们是什么呢,我们把一个偏微分方程,带边界条件的偏微分方程啊。

转化成了一个积分方程,在这里我们把它转化成了一个积分方程,这就是边界元方法,那么这个积分方程它有一个特点,就是说它的矩阵是稠密的,因为每一个点它都来自于其他所有点的作用,所以它的这个方程是矩阵是稠密的。

但是usually它的肯定是number是很好的,比如说如果我们用一个co subspace的这样一个,迭代法去求解这样一个积分方程的时候,通常我们在常数迭代时间里就能够找到他的解。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所以他的肯定是number,通常是很好的,但他举证很稠密,所以这里我就列下对比,在二维的情况下,在二维的情况下,假如说我们fuldomain是n平方,负的domain是n平方,这个时候。

如果我们用multigree的方法来求解偏微分方程,由于multi的方法是在常数时间收敛的,那么我们得到的是一个,总共是大概一个n平方的一个计算量对吧,而如果我们用来if。

或者用strike forward,的一个边界元方法来计算的话,那么我们要知道边界圆在一个n平方的范围内,因为它只有边界嘛,所以大概有n个element对吧。

那比如说我们用by cg step这样一个方法来迭代,它可以在常数时间收敛,但是每一次迭代,那它要用n平方的时间来计算,这个稠密矩阵相乘的这个时间,所以他最后的总的计算量呢是和multi gi的差不多。

打平手的,就如果他买衣服的来实现的话,他是打平手的,那在三维的时候情况就糟糕了,比如说我们的fdm是n的三次方,那multique的方法呢。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们知道它是o n3 的时间收敛,那么当边界元呢,这个时候他有n平方的elements了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

而计算这个从密矩阵的代价呢,就是n的四次方的computation了,所以即使它能在常数时间收敛,它总共是n的四次方的computation,它就和这个multigree的方法。

他就永远都无法战胜multipi的方法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那么反过来,如果在计算这样一个积分求和的这样一个时候,ok计算这个积分求和的时候。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们用之前所推导的快速多极展开的方法,用快速求和的方法来替换掉,这个矩阵向量相乘的过程,简单的说原来它是一个矩阵乘以向量,这个时候呢我们用matrix free,用matrix free的这样一种形式。

然后用fmm去计算它的这个结果的话,那么在2d我们就是o n的,我们打败了多重网格方,然后在3d的情况下呢,我们就是o n平方的o n o n平方的,我们也打败了这个多重网格法。

那么我们要知道它有一个好处,就是边界圆这个方法它是sumalthletic的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

它是一个半解析的这样一个方法,在我们对于圆的这个划分,精细到一定程度了以后,他给出的答案几乎就是解析解,所以这个是他十分有趣的一个性质哈,他给出的答案几乎就是解析解。

并且很呃不用很细致的一个这个边界源的划分,就已经可以得到很好的答案了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所以这个是他很有趣的一个性质,它是3m ltc的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那么比如说用这样的一些编辑的方法,我们可以来求解哪些问题呢,那ok比如说在这里我就展示了说,有关于波动的这样一个这样一个呃方程,那么这个是像像我现在所展示的这样一个,simulation domain。

如果我们用呃n s方程的方法来求解,我需要把整个抖妹抖体积化,这里面就需要很多很多的计算员,这里面就需要很多很多的计算员,而我如果用边界圆的方法在上面求这个呃,式方程,或者说叫做伯努力方程啊。

我可能得到的物理,没有n s方程所表达的那么复杂,但是要知道这个呃国动力方程,已经是对n s方程很好的一个近似了,因为他只是假设你的流畅无年而已,只是假设这个流畅无年。

而且流畅的这个速度是一个是一个市场,是一个市场,那么在这个情况下呢,我们是可以求解出复杂的这些波浪运动的,这样一个形态的,那么对于很多应用来讲,由于波浪的这样一个,特别是远处的波浪的这个这样一个形态。

已经是很核心的一个研究任务了,所以在这种情况下,使用边界元的方法求解,很显然是更明智的,那么以至于在这里所展示的这个案例给我们,我们可以去计算升压,通过求解之前所说的求解这个emo equation。

这样一个边界圆方法,我们就可以说,在我们已知一个物体的外形的时候,我们就可以在它周围,任意范围内去计算这样一个升压,那计算升压有什么好处呢,我们就可以知道它在飞行,在这样一个以一定速度飞行的过程中。

所产生的噪音,或者所产生的可被探测的这样一个声音,它的影响的范围是多少啊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们可以去进行这样一个升压的计算,那么以基于什么呢,在图形学或者在很多这个有关领域吧,我们还很关心的就是湍流,也就是涡流的这样一种计算,那么涡流实际上呢,我们来自于一个矢量的泊松方程。

我们首先通过求解一个矢量的泊松方程,来得到我们的一个呃string function流函数,然后我们再对这个流函数打这个客运算,来得到我们的速度差,那么它反过来呢,又能够写成这样一个求和的问题。

那么这个时候呢,我发这个fast summation,又可以用来求解这样一个涡流。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那么求解涡流这个问题。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

他其实特别有意思啊,比如说我在这里展示的这个案例,我在这儿展示的这个案例。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所所展示的这个现象叫做vtex ring。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

他是讲这个两个vtex ring,一旦产生运动了以后。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

他会做这样一种你中有我,我中有你的这样一种交叠上升,ok那么这样一个这样一个现象。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果我们想通过n s方程去捕捉。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

其实他是十分痛苦的,比如说我在这里需要用很多的这个自由度。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我用了一个512的平方的这样一个网格,然后呢我要用一个advanced呃。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

比较高级的这样一个时间积分的方案。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

高阶的这样一个时间积分的方案,并且这个server呢,他可能要很多很多行的c加加代码。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

即使用太极来写,它可能有很多行。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

它才能差不多的模拟出这样一个leap。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

而最后我们发现他的这个box还是,很快的就融合了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

很快的就融合了,那么现在我们看一下,如果直接用这个握方法来写的这样一个东西,我们我们就可以捕捉出这样一个leap,他呢我的时间积分方法,我可以as simple as s一个前向欧拉。

并且我在整个计算中只有四个自由度,就是四个我点那四个窝点,这四个自由度ok也不,当然也不止四个4x3,他们的坐标对吧,这样这么点自由度,反正然后呢我只要很少行,我记得应该是数应该是百来行的c加加代码。

那么在太极里头呢,它的代码的行数就更少了,它大概只需要几十行呃,多少行,七八十行嗯,居然也要七八十,你是算上visualization了是吧,嗯对,就是其实里面好像我记得,好像初始化这两个窝的位置啊。

还有什么的,就花了两个10号,哈哈行吧,就就刨掉这些以外,大概只需要40行左右的代码部分,大概40吧。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

对,我们就能够捕捉出这样一个复杂的,这样一个运动现象,而这个要知道我们是通过n s方程的求解。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

是要花很大的力气才能够做到的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

所以到现在我差不多总结一下,我们总共有这么几种submission是要求解的,比如说第一种关于电场力和万有引力,那么就是市场的梯度,市场在x点的梯度,那么它的求和是关于平方,关于半径的平方成反比。

质量成正比对吧,方向是沿着这个距离的方向啊,这里消掉一个消掉可以消掉一个r啊,那么以及在这个边界园中呢,我们要对一个不同一点的kernel做计算了,这个kernel是说我需要在每一个j。

每一个每一个便利的j的位置去点击,去拿我这个方向的这个梯度,去点击我当时的那个法线,点击j a这个地方的法线,那么这个会使得这个kernel变得很不一样啊,这会使这个ko变得很不一样。

所以呃我们要考虑一下这个东西,我们怎么来求对吧,以及呢我们有一个bo smart,bo smart,当然他很像我们的这个万有引力的,这样一个公式了,它只不过这里用的是一个叉乘的形式。

ok大概这三种submission。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那么这个时候我就有一个问题了,我就说如果我给大家一个routine,这个routine叫做computer graduate,如果我给定一些电子元或者重力源s。

这是n个particle with its mass,对吧,这是n个particle with its mass,然然后呢,我来computer grab fee,我就能够告诉你。

所有的这些po位置出的这个gravy,也就是他们的受力,这个f的话,我如果给了你这样一个routine,你把它当做一个black box。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们怎么去求剩下的这两个,我们怎么去求剩下的这两个求和。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那么这里我展示一下,我们怎么求这个边界积分中的,这个nj的这样一个求和,其实我们可以把nj有关于nj的那个东西啊,我们把它拆成三个特啊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们把它拆成三个ten,我们发现其实是ngx乘以d,这个one nor d x加上ng的y分量乘以d。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

他d他的这个y分量,那么这个时候我们就我就发现这件事情,他就很有意思,他可以这样来做,如果从原来的这些s,从原来的这些s我们去构造出三个不同的s,构造出三个不同的这个圆,那么其中呢这些圆这样来构造。

我把每一个si自己的原有的这个带电量去乘以,他当时的当初的这一个法线的x分量,或者y i分量或者z分量,我去构造出三个新的s,并且呢,我对这三个不同的s都去做一个computer grade feed。

这样一个操作,ok然后我分别把这个f一的x分量,f2 的y分量以及f3 的z分量,我把这三个东西加起来。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

实际上我就得到了,对于这个式子的一个求和的值。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我就得到了对于这个式子的一个求和的值,那么中间具体的这个呃,中间具体的这个过程,我希望同学们可以自己拿个笔写一写啊,你就很容易能够想通这件事情,这是很显然的,那么至于bo smart怎么来做呢。

我就留给大家作为一个家庭作业了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

好吧,在给定grade feat,计算grad feat的这样一个基础上,怎么去计算这个bo smart啊,注意我们是对于j去便利的啊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

注意我们是对于j去便利的,对大家如果做了这个bo smart这个作业的话,也可以在论坛上面和其他同学分享分享,这应该是一个祭祀,主要是一个数学公式的推导对吧,对,主要是个转数学公式推导或者转化的过程。

实现起来还是很难的,我觉得实现起来是不用实现,就是推一下就行,拿支笔一写就行,那么剩下的我呢讲一下其他的两种,这个快速求和方法,一种呢就是p3 m。

一种呢就是这个呃和无关的kernel independent呃,快速求和,那么首先我先讲一下p3 m,其实pcm他的观点就比较的怎么说呢,比较的这个嗯比较的印q一体。

我们是通过这个去混合了偏微分方程的视角,和samson的这样一个视角,来得到p3 m这个方法的,那么我们注意到每一个这个submission,其实它都是对应着一个这个偏微分方程的,每一个扫描线。

它都都对应了一个偏微分方程。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那么这个时候我们就可以,就可以先想这样一件事情,如果我有一些例子,我先把这些例子做一个p to g的操作对吧,我先把例子speed到这个网格上去,然后我在这个网格上呢去计算一个什么。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

去计算一个泊松方程的解,去计算这个泊松方程的解。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

得到我的流函数或者得到我的势函数对吧,得到流函数或者是函数,然后我对它施加这个梯度或者克,我实际上这个时候就得到了什么呢,我就得到了一个平滑的市场,我就得到了一个平滑的场对吧。

这个厂注意了是包含所有粒子的贡献了,这个要注意,是包含所有粒子贡献的一个平滑的这样一个厂,它包含了,但是呢这个场这个我们得到的场,他的进场的这个值它是没有细节的对吧,它是没有一个细节的。

所以接下来我们要考虑的是,如何把这些细节给加回来,那么加加回来细节的方法就很有意思了事,事实上我们可以先把这个平滑的场插值出来,然后呢再对于周围去累加一个呃,去累加它的一个高频。

高频的这样一个像所带来的影响。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们就可以加回这个湍流场的这样一个细节,那么在我把这个算法给奥特曼之前呢,我先呃向大家展示一下,那这样一种做法,它首先它的计算时间它确实达到了线性,比如说在这里这条蓝线是o n哈。

然后这条绿线它是o n平方,所以计算时间呢我们确实达到了这样一个线性,那么我们的计算精度呢,我们也可以看见,随着我的correction range的这样一个增加,它能够到达这个小于1%的这么一个状况。

在这里我记得呃,我在这应该是小于0。01%了,所以是达到十的-3次方这样一个精度的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那么呃,那么我现在把这个p p3 m给奥特曼一下,它其实是这样,首先我们有一堆例子对吧,我们去做一个particle to bread的这样一个操作,然后此时我们得到的是一个平滑层,我们得到一个平滑层。

然后呢我们去计算它的高频场,计算高频场,我们把每个例子减掉,他从平滑城里差值出来的那个值,我们就得到了它的什么高频分量对吧,高频分量,这个时候呢我们拿我们的这个泊松方程。

我们拿我们的这个psp去求解这个平滑的场,并且得到我们的流函数或者我们的势函数,然后我们对流函数或者势函数求curl,求grading,我们就得到了我们的平滑的这样一个速度分量,速度分量。

那么这个时候我们最后在粒子上的这个,湍流的速度分量,它由两部分组成,首先我们去插值平滑的速度分量,然后呢我们再对它附近区域的这个高频分量,这个高频分量去做一个什么,做一个快速求和,也不是说快速求和。

是说叫做直接求和,那么我们就得到了这样一个湍流的,这样的一个速度差,ok所以那这样的一种计算呢,由于我们每次我们所有的计,在整个过程中的计算都是线性的,所以最后我们得到的是一个什么呢。

也是一个线性时间呢求科算法,并且它比这个快速多极展开要简单得多,同学们其实甚至用有用呃,课程至上一节为止,已经开发的这些呃工具和能力,应该就足以写出这样一个呃p3 m算法,这里面这个第三步是用mt贵的。

应该就可以吧,这就用猫体贵的,就用猫体贵,但是你边界条件是不是有一个。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

还有个8号出院那边诶,不用你看我这里p3 不用边界条。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

就是说边界条件可以认为是零,你看我这个图我画的很清楚,所有的这些例子,它是split到很小的一个格子上去的,很小的一块区域上去的,我就边界足够远吗,然后这个边界我就是让他足够远,就是让他足够远。

因为什么这样可以呢,因为我最后有那个高频分量的一个直接累加,对吧,所以这样是不会损失进度的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这样是不会损失进度的,对,那么还有一种呢,就是这个和无关的快速求和方法,那和无关的快速求和方法,实际上他的视角是这样的,当我有个这个电子的时候,我去构造两个圈,把它给包住,我去构造两个圈,把它包住。

这两个圈是这样的,首先我来自于呃,我我要在pj这些点上,也就是说在外圈上去求出来自于qi的,这样一个直接求和的贡献,这个是我已知的要达到的数值,与之要达到的数值,然后呢。

我假设这些数值是由来自于内圈上的,一些未知的电子的电量来给出的,这个时候我要求说什么呢,我内圈的电子的电量要是多少,我才能够在外圈上给出这样一个四分布,所以所以而这个k k j是已知的。

这个pj是已知的,然后我们要去求这个西格玛k,所以这个时候其实我们是一个什么,是一个矩阵求逆的过程,locally的一个矩阵求逆的过程,而一旦我们这个内圈和外圈这个形状是确定的,这样一个情况下。

我们的这个这个是这个kk j,就是一个已经确定的值了对吧,所以每个圈上有多少个多少个电荷,这个是随意,这个是多多益善的,就是这个电荷越多,对这个电荷越多,你可能越准确嘛,对吧对。

所以这中间差不多就是有几百个呃,有时候100个吧就够了,ok,啊所以这里我再做一下总结,今天呢我们讲了几种这个快速求和方法,有快速舵机展开和p3 m,然后我们呢我后来讲了这个。

所以能够被快速求和方法来求解的方程,它们包括了泊松方程,拉普拉斯方程,pho方程,还有边界元方法对吧,然后以至于呢这些快速求和方法,它可能产生的应用包括了在静电场方面,它有这个分子动力学。

它可以作用于肿瘤呃,药物设计等等,以及我们的electro magnetics,它可以有这个船舶的这样一个设计对吧,然后我们的这个声声学方面呢,我们可以做这个urban planning。

比如说你现在要建一个高架,这个高架呢会经过几个居民区,那么这个时候呢,实际上可以通过一个升压的分布,去在高架上面呃,适当的放一些隔离带,或者叫做隔离的那个隔离板,来起到一个最好的去弱化这样一个呃。

弱化这样一个噪音的这样一个方案,比如说我们有这个vehicle shape design,这个vehicle就包括了这个大道,飞机,小到一辆车,它的外形都可以被优化。

通过这样一个降低升压的这样一个方法来优化,来得到我们最好的这样一个降噪,还包括呢我们可以做影院的一个设计,在这个过程中呢,可以通过这样一个升压的分析和计算,去找出最好的。

在这个影院中构造这个声音的这样一个回响,这样一种方案,以至于我们可以做这个potential flow对吧,我们potential flow方面,我们就有有这个飞机的记忆的这样一个设计啊。

有我们的这个呃波浪的这样一个计算对吧,以及呢我们在湍流方面,我们有这个vertex method呃,那好吧,今天的这个分享就到这里了,哇真的非常棒,我觉得我今天听了一下。

我又对这个fm和p p m理解更深入了一些,之前看师兄好多西瓜和论文,感觉里面那些给每个每篇效果都非常的棒啊,包括其实从其实我记得你博士期间是三篇论文,其实都是哦。

有可能有两篇是vertex method对吧,我记得第一篇,第二篇,第三篇是一个呃是一个big flip的一个一个paper,对对对对对哇,我觉得还是每一篇效果都非常的惊艳。

我记得我第一次看到p p p m,大概是我大二还是大三的时候,那个时候感觉对各种东西也不太理解,然后这一转眼都可能有哇,这一拳也好多年了,好多年了,有同学问哦,窝方法如何处理固体边界哦。

五个方法处理固体边界的时候是这样的,求解边界积分方程,就是说我看我这儿找不找得到呃。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我这没有讲,但是我们回到这个边界园的那一个slides哈。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我回到边界源的这个slides,其实在窝方法处理边界的时候,我们是这样的,我们希望找到一个在这个边界上的,这样一个窝分布,或者这样一个电子分布,这个区别于这是一个势流,你是要做这个呃。

你需要做粘性流还是非粘性流,我先说这个无粘流,无粘流的话,其实我们只要保证法线方向是不穿透的,就可以了对吧,法线方向是不穿透的就行了,所以这个时候,其实我们需要找到一个什么条件呢。

我们是想在这里找出一个电子,你可以想象它就像在这里找出一个电子的分布,使得这些电子呢它可以introduce一个速度场,一个试流场,一个potential flow的这样一个厂。

这个potential flow的这个厂的刚好可以去干嘛,刚好可以去cancel掉,刚好可以去cancel掉,这个边界处的这些,本来会这个穿透的这些速度对吧,所以你立的方程呢。

就是这些东西产生了一个边界速流场,然后你让他去乘以这个法线方向ni对吧,它正好可以等于负的对吧,负的现在你已知的这个呃速度点乘n对吧,这个就是你要呃,你你对于这个无电流要解的一个方程,那对于粘性流呢。

你解一个额外的方程,就是说你希望在这里再找到一个这个沿着这条,沿着这个边界的butt sheet,沿着这个边界的一个vtec,使得它刚好可以in roduce一个速度场,能够去干嘛呢。

能够去cancel tangent方向上的分量,能够去cancel tangent的方向,那这个就是你找出来的这个这个边界,出的这个值了,那么这个边界处的值呢,接下来你再通过这个热扩散的那样一个方程。

或者说呃那个叫做什么,在这里,这因为在一个纯粒子的方法中,你是不太好不太好做热cosm,所以你可能要通过一些randow,或者通过一些呃这个能量总和不变的啊,这样一些扩散的方式。

把这个上面求出来的这个vertex系统,在这样一个强度,给emit到周围的这个涡流里面去,那这样的话呢你就能够形成卡门涡街了,对ok,所以相当于是你还是呃在你得在固体,比如说你说卡门国界的话。

你得在这个圆柱的内部去给他先求出一个呃,你就假设它没有固体,然后你求出一个就先假设没有布局什么分布,然后你就你这样吧,你就是这对我你你n时刻,假设你现在在n时刻,你所有的涡粒子已知对吧。

所有的速度已知对吧,这时候你先做什么呢,你先做对流对吧,你把握粒子走一下,然后你再去干嘛,你再去从涡粒子里面求出一个速度对吧,那这个速度呢,它在边界上不一定是严格满足的对吧。

或者说一定不是严格满足的对吧,那么它就有一个分量要被你cancel掉对吧,要看收掉多少呢,就是你去把它点成tangent或者点成法线对吧,嗯就是你要看售掉的量,那这个量由谁来cancel呢对吧。

由谁来cancel,那它就由谁,就由这个边界处的电子引发的一个视流场,或者说在边界上的这样一个vtex sheet,引发的这样一个速度差来cancel对吧,i c当你求出这两个东西了以后。

那个电子厂你不用管对吧,他就是个四流场,它无限的剩下的那个vertex 呢,你再通过一些热扩散的形式,把它上面的这些那个,把它上面的这些窝料给扩散到你的系统里去。

你就你就你你就已meet了新的涡粒子了吗,这边有一个边界条件,它是vertex的source,对对对,他就是一个探索,在他的边界上,对啊,就是一个butt s,假设这是一个无法移边界条件。

他会搓出这些word works,对对ok,有意思有意思,对这个这个我觉得可以这个写起来应该还好,如果其实就是一个找一个普通的vertex solver,然后在边界上不断去see的这个。

以某种方式去c的这个窝,这个窝的例子应该也可以搞出一个卡门,我姐在对,事实上对于二维的这个圆球不对,二维的spr和一个给定的那个速度啊,这个东西是有个解析的表达式的,你得找一下可以找到。

然后你就按照这个去去seed就行了,然后出来就是个卡门涡街,对哈哈,ok而且那个卡门过街特别的炫,就是各种湍流,各种turbent,特别的特别的是就对对对,是之前之前。

我们作业林里面有一个同学写了一个卡门,我借用lbm写的,然后还被中科院物理所啦去写了一篇科普文章,还是很有意思嗯,ok那么如果大家暂时还没有问题的话,大家可以在微信群里面和信息师傅保持联系啊。

我感觉这个sm还有这个pv p m啊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这些快速学习方法还是挺有难度的,我觉得他的idea应该还好。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

和mod其实差不多,但是你如果真的要实现它还是很难,理想情况下,我应该写一个这个,但是我看到他有什么m t m m t l l t l l t。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

p p two p这些加起来实在是太麻烦了,而且很多各种常数啊,这些百米可以分享100,太会写,对三维的就更恶心,三维的你要去看一下那个公司都想上吊,那个那些在呃。

那spherical harmonic expansion去展开了,我靠那还要做rotation,就是三维在做l to l,还是做m two l那个transform的时候,为了加快它的一个计算量啊。

两个spherical harmonic expansion,先做一个对齐,先做一个那个旋转,使它对齐到半径方向,使它对齐到半径,然后再去做一个那个转换,就会那个系数就会更快,不然的话会慢一点。

就有很多像这样的那个很恶心,我觉得所以我说我是真的觉得差值应该是个好。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

好,对对对,就是插值方法说不定会让他减少很多,但是m t m这些还是得做的呀。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

因为很多是m two l就不做了,m two l不做了,只要做m two m就行,意思就是m t m还得做l dl不用做了,对对对对对。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ok那那我们就再次感谢一下星星师兄。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

给我们分享的这个内容,我觉得真的非常的质量非常高。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

而且非常硬核,从这个手写的pp就可以看出来。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

真的是在百忙之中给我们来抽空讲这么一讲,真的非常不容易。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

再次感谢感谢,ok那么我们就能保持以后的沟通嗯。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GAMES201:高级物理引擎实战指南2020 - P6:Lecture 6 线性弹性有限元与拓扑优化 - GAMES-Webinar - BV1ZK411H7Hc

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ok那么我们就开始好,还是欢迎大家回到我们的课程,我们把电脑升级了一下,应该不会再有卡顿的问题了,然后还是希望大家多来听听直播,因为及时提出问题嘛,然后我们收到反馈,这个我收到反馈以后也会调整难度。

这样大家讲的讲的大家也容易理解一些,那么今天我们来讲一讲,这个线性有限元和拓扑优化,其实主要是讲线性有限元,拓扑优化呢只是顺带提一下,然后课程的附件里面有一个代码包,代码包里面呢它有这个嗯。

线性有限元的呃,这个top优化的一个代码示例,然后大家可以跑一跑,还有一个手把手教你做特殊优化的一个pdf,那个是mit的一个计算机图形学的一个作业,然后当时我帮他们写的这个代码,然后借这次就搬过来了。

给大家可以手把手的去做一做,当然这些作业我们也不批改批改,大家都不用提交,可以只是你有时间的话,你可以做一做。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

没有时间的话,你可以看一看嗯,意思一下就可以,ok那么作为一的获奖选手呢,我们已经在植物上面公布了,大家可以去看一看优秀呃,作品的优秀同学的这个作业,然后和以前一样,代码都是直接。

一般get close一下就可以装菜就可以运行的,所以大家可以看一看,跑一跑呃,看看别人的作业是优秀的同学是怎么做的,然后这样自己也可以学习学习,那么当然了,肯定有很多同学说这个时间太紧了。

我没有赶上deadline,或者最近有事没时间做,这个完全不用担心哦,因为我们呃你加把劲,一个月以后就可以把它作为作业二来提交,作业,二呢又回到这个开放作业的模式,和作业领差不多呃。

只要是一个物理模拟器就可以,只要我们没有标准标准,就是你自己满意就可以,然后有很多很多个选项,你可以实现一个可交互的2d的物理模拟游戏,你你也可以去专门优化性能呃,你可以提高粒子数啊,或者提高网格精度。

因为高性能的物理模拟器,当你粒子数多了以后,网格比较细的以后是很多时候呃,很多是很多低性能的物理模拟器的东西,就不能再用了,高性能物理模拟器啊,里面有很多东西呃,并不能把地形的照搬。

比如说你本来是用稠密数组存在你的线性系统,但是你网格多了以后,你就可能重名速度变得非常大,内存存不下了对吧,可能啊你就希望用一个稀疏数组,这个时候呢就会意识到,你要做一个高精度的物理模拟,你要做挑战。

你要面临的挑战其实是非常非常多的,除了性能,你也可以去实现一些高精度的格式,比如说你以前是用的sama rg,你现在可以把它换成比如说bf c c,或者买comic这个高精度的格式。

或者你也可以用一些election,reflection scheme之类的去降低数值点性,使得你的烟雾模拟看起来更加的呃怎么说呃,充满活力一些就叫energetic,这个这个让我想起来一个笑话。

因为呃很多时候计算机图形学里面,大家有的时候你做这个sober,你的目的是去迎合你的导演的需求嘛,所以呃我想起来就是kaths是他是dream,以前在dream works后来到了维塔。

然后他们是负责vfx,他在那边就他有一次给大家介绍它的数据结构,叫vd b,然后他就讲到一个笑话说呃在统计学里面,这个很多时候大家希望艺术家可控性就是呃,instead of。

你去实现一个特别高精度的火焰,有的时候导演会让你实现什么,导演会让你实现一个生气的火焰好,这个时候你就要想想呃,怎么样去提高你的这个呃simulator,怎么样艺术家去控制你simulator。

因为simulator的它的背景,它的底层是partial differential equations,实是这些偏微方程组对吧,但是有的时候艺术家并不会直接去操纵偏微方。

他可能会想用一些其他的办法去操纵这个火焰,所以这个艺术可控性,还是一个很重要的一个事情,但是这个也可以作为选项四,然后选项五呢你可以自己想想,有什么别的有意思的方向,可以自己去研究研究。

或者找一篇比较好的syrah的模拟方面论文,然后自己去实现一下也可以,当然你可以基于自己的或者别人的作业一,然后呢,我们的评分标准呢是以新增的这个原创部分,然后还是建议大家组队,因为组队的话呢。

首先你如果组队的话,你如果拿了奖,那我们会你队里面有多少人,我就会给你寄多少个杯子,所以呃记多少个课程纪念品,所以这个组队的话,从得到纪念品的效率来说是比较高的,但是这个是一个呃不是最主要的。

最主要的是你组队了以后,你会在做这个写代码的过程中啊,你会呃提高和别人合作这个能力,这个还是挺重要的,然后这个截止日期呢是北京时间8月15日,23:59,也就是说接近一个月以后,那么接下来呢。

我们基本上就进入了课程的后半部分,前半部分呢大家嗯应该来说还是有一些难度的,很多同学反映,特别是推这个影视时间积分器的时候,这个头都秃了,难度还是挺大的,这个其实非常正常,大家不要受这个打击。

我一开始推一个时间分期的时候,我一我一开始推,我记得是大三的时候,我去实现,大二的时候去实现一个m p m的影视,实现积分器,那个真的推的我是头秃,但他经常是什么呃,四阶张量之之类的。

推起来特别容易推错,然后推了好久才把他搞对,然后弹簧质点其实也挺复杂的,和m比起来他更不规则,它会有一些对于什么,比如说呃x取了normalization以后的向量,关于x求导之类的这些项目。

这些项一不小心就会推错,然后这就是为什么之前也推荐大家组队,因为组队的时候,这个公式大家可以互相检查对吧,这样实际上两个人都退缩的概率,就会比一个人退缩概率要低很多,那么接下来今天我们讲有田园。

然后接下来两讲呢,我们会讲混合欧拉拉格朗日视角,这个其实包括一些常见的方法,比如说particle excel或者flip或者iphone,particle insl,然后也会讲到物质点法。

物质点法应该是这两讲里面的重头戏,到了第九讲,我们会讲一讲高新计算与物领情,其实就是一些常见的优化物理引擎性能的技巧,那么8月10号呢我们还是像之前一样,我们空一次,大家留一点时间。

可以消化一下之前讲课的内容,也给大家留一些时间完善自己的物理引擎,最后一讲呢我们进行总结,可能会点评一下优秀作业,可能会回顾一下整个课程内容,最后可能会讨论一下呃,物理物理里面一些还没有解决的问题。

ok那么这个是课程安排部分,接下来呢我们就到了今天的重头戏啊,有些部分我还是把这个图标拖到左下角,这样不会挡住,好开奖之前先喝口水,这个后面肯定会讲的口干舌燥,因为今天其实公式稍微有点多。

那么这部分呢我们分为四个内容,首先我们大概看一看有限元是干啥的,然后后面第二第三部分呢,我们举两个简单的用有限元来离散化的例子呃,首先我们从大家最熟悉的泊松方程,标量泊松方程来开始讲,然后呢。

我们再介绍一个柯西动量方程的优先原理散化,当然我们呃讲的是最简单的,就是说呃基本上只有一项的这种动量方程,没有为没有外力,没有这个呃质量的flash就是没有这个密度的变化,所以其实只有一个t。

然后最后呢我们大概介绍一下拓扑优化,那么有限元方法,它其实是加六经方法里面的一种,然后什么是加六经方法呢,加六经方法就是一种呃,把强行的pd转化为弱性的一种方法,嗯这个后面什么是强行,什么是弱性。

我们会再细讲,在有些园里面的,连续的p d e会一步一步经过变换,变为一套离散的线性系统,然后大家呃就可以用最喜欢的线性系统修剪器,像比如说工作梯度呀,mtv的呀,去sop这个有限元的系统。

那么经过计算机图形学里面的简化,一般这个有限元他还是就这么几个套路,可以看到这边有1~5步对吧,首先我们把强行的pd转化为弱转化为弱性,用一个test function w。

后面我们会提到什么是强行的pd呢,强行的pd就是每一点都成立的pd,它是一个连续的形式,它在空间里面连续的每一个点都成立,那么这个大家可以感觉到他肯定是呃,不太在计算机里面是不太容易实现的对吧。

因为你计算机里面只有有限的呃,存储和有限的计算,所以你是没有办法去做这么个连续的表示,呃然后刚才说的第一步,然后呃哦对我还没说什么是弱形若行,就是说我们把这个强行pd它的残差项。

用一个test function加权,然后积分这个后面我们会提到,那么第二步呢我们做这个分部积分,分部积分以后,我们可以做一些实际上把系统进行一些简化,我们一般可以把呃get it的去去到里面。

pd里面的二阶导数项,然后第三步我们用一个散度定理,然后再进一步简化纤维方程,同时呢在这一步里面,我们可以去得到第二类边界条件,就是诺伊曼边界条件的一个显示的形式,然后呢我们在做离散化,离子化。

也就是说我们把这个空间里面连续的场,用一系列离散的点来表示,那么大家应该已经很熟悉了,线性差值对吧,双线性插值,三性差值,其实这些都是非常常见的呃,用离散的量表示连续量的方法。

有些园里面有很多很多种插值的方法,但有些园里面一般叫basic function,它有很多种basic function可以选择在这边这一讲里面,我们其实只考虑tt这个线性的basis方式。

后面会有一些图,大家可以有一些直观的理解,那么你把这个连续的常用这些呃,离散的basis function的加权组合来表示,以后你就得到一个离散的系统,那你最后可以得到一个大家一般会常常见的。

叫做stephens matrix,但是他这个不一定是stephens,在很多时候它可能是一些其他的呃,物理意义,并不是总是说是一个刚性这么一个东西。

然后除了这个matrix才会得到一个right hand side,就是这个load bor,最后一步我们求解信息系统dj f m非常重要,因为很多其他离散化方法,像有这个叫物质点法呀。

他其实也是一种加勒定方法,他的思想和m和fm其实非常非常像,只不过在npm里面呢,它没有显示的元素,它是一种叫element free grian,它是叫呃无元素加到金发,ok。

那么我们还是从大家最熟悉的二维泊松方程,来看解,那么普通方程是啥,大家应该还记得吧,就是呃我把这个我有一个标量场,这个u我给他求一次梯度,再求一次散步,然后等于零在整个空间里面。

那么这条空间呢它其实还有四条边对吧,那他在这个问题里面,我们假设前它的这个三条边,它是狄利克雷边界,什么是狄利克雷边界呢,底力科技可类边界,就是说我直接指定这个u在这边界上,这一点的值。

我用一个fx去表示它的边界上的值,那么下面一条边呢,它是一个诺伊曼边界条件,也就是说呃我们不直接指定ux值,而是我们指定ux它的导数的值,当然我这边得和边界上的法向量做一次点。

成了我们gx表示它的洛伊曼边界条件的值,一般大家也会把德雷克雷边界条件,叫做第一类边界条件,然后诺伊曼边界条件呢叫做第二类边界条件,然后我们这还是一个连续的问题,左边这个是连续的问题啊。

然后我们一般来说呢,在统计学里面,很有可能会用一些网格去把它分成很多,很多个这个小的部分,然后同学里面大家比较喜欢用regular的,这个叫规则的四面体四边形网格,四边形网格,然后很多同学会问。

如果说我把这个100和u11 连一条边,那我会得到两个三角形,就得到一个三角形网格,那这个可不可以呢,这个也完全可以,实际上很多时候大家会更喜欢用三角形网格,三角形网格有很多的优势,比如说它可以呃。

你可以很容易地做网格的密度的渐变对吧,就adaptivity,然后三角形网格也可以,这边我其实展示的是一个方形的边界,如果边界是一个圆形或者是一个其他形状的话,你可能会更想用三角形网格。

因为三角形网格能够更好的贴合你的边界,当然我们今天这一讲,我们所有的数涉及到数字的部分,我们都是用正方形的元素来表示的,ok那你可以看到我这边其实分了多少个元素,分了3x3=9元素对吧。

那多少个自由度呢,其实我们的自由度是存在,每一个元素的四个顶点上,那我们其实有4x4=16个自由度,也就是说16个浮点数来表示这个呃,这个场具体怎么表示,我们后面会提到这有啥用,这其实有很多用。

光是一个标量的泊松方程,你就你就可以用来解流体模拟里面的压力投影,对吧,这是一个最常见的用处,当然一般大家在流体模里面用fm用的比较少,一般用图形学里面常用的是final difference。

是有限差分和final morning是这个有限体积,好刚才我们介绍这个问题,那么接下来我们来看看到底怎么离散化它,首先我们得把这个强形式给它,转换成一个弱形式,怎么个转换法呢,我们想象呃。

我们有一个任意的二维标量函数叫w x,这个w x呃,我们把它和之前的强形式去乘起来,然后做一个积分,然后在我们的整个东北ea上面做一个积分,那么我们有这么个关系式,这个关系式就是说。

如果说我们这个pd在每一点都成立,当且仅当对于任意的test function w,它这个积分都等于零,那么我们来直观上理解一下,如果我们要从左边推到右边,其实很好理解对吧。

嗯这个如果说左边这个项永远都是零,那你这边是w不管这个w不管是什么,你乘上一个零都是零,然后你再和da去再积分得到还是零,所以从左到右是非常tribute的,但是从右到左的,那么这个就需要一些想象力了。

如果我们存在一个点,它的呃强行是这个三,他这个plan operator不是零,那么怎么办,我们可以总是可以,想方设法构造出来一个test function w,使得右边的这个不等于零对吧。

然后我们这个叫做利弗利,把它换一换,就可以从右边推到左边,当然这个构造这个只是一个直观上的构造,你真的要去从数学分析上去证明,它还是要下一番功夫的,ok那么我们接下来要做一个什么事情。

我们接下来希望把这个强行式里面的呃,二阶导数给它去掉,用我们的这个test function咋去呢,我们来看一看呃,首先我们要用一个技巧叫做分部积分,这个大家应该都非常熟悉了。

其实或者你不调到分部积分也可以,你可以叫他乘积的导数对吧,你看这个右边它就是w乘上grab u,你要算它的散度,那你这边呃求导数的话,其实就是两个term对吧,你先给w求导数,然后再点乘上u的导数。

或者呢w乘上这个这个u的这个二阶导数,或者说他的npsl trader,那么你看我们做了这个变换以后有什么好处,我们得到了一个这一项,这一项,他你看上面这个方程这一项它其实是零啊,那你就可以做一步简化。

你把这一项给他踢了,那你就得到这么个整式,那么你会发现吗,上面这个公式等于零,当且仅当这个公式二是成立的,那么接下来我们把test function,我们不apply在原来的这个上面,这个公式上面。

我们把它apply在公式二上面,就可以得到公式三对吧,公式三你可以看到呃,uda plant的一零,当且仅当呢,对于任意的w我们有这么个公式成立,有人会问你这不还是有二阶导数吗。

你这个地方不还是有一个二阶导数,后面我们会讲这个地方可以怎么把它去掉,ok那么公式三到这边来变成公式四,我们怎么把右边的这个二级老师给他去了呢,其实也很简单对吧,你看到它其实是一个散步的形式。

那么一个体积里面散度的机会等于什么,等于它边界上的啊,这个向量函数在呃和法向量点乘,绕这个边积分一圈对吧,这边其实用了一个散度定理,那冥龙彩龙定理以后呢,你会发现我如果在二维里面。

那么我左边的其实就是一个呃面积分,右边其实就是一个沿着它的边界,一个线积分好,那么我们所有刚才讨论的,全部都是局限在一个呃连续的空间里面,接下来呢我们要做一个事情,就是说我们用一系列的离散的函数。

去表示这个连续的函数,那么这些离散函数呃,我们怎么来用一些离散的basis方,也就是说这个基函数来表示一个离散的呃,来表示一个这个原来这个u呢其实也非常容易。

那么首先我们有一系列的呃base function,假设我们其实是有四个道,假设我们是five 0123,那么假设我们的定义域啊,就是从这个原点到这一点,那你其实可以看到我们的f0 和f3 。

它是只有右半部分或者左半部分,那个fi一和i2 ,它是有两边都有,它,这个我们这边用的是一个,最最最简单的线性的计函数,你可以看到公式六,其实直观上的理解也很容易了。

但其实就是把我们的这些奇函数根据优先加权,或者说scale一下,然后我们再求个和,那求个和以后,你会发现我们其实就得到了一个呃连续的呃,也不叫连续的,这个叫peace by senior。

是分段线性的这么一个u的函数,它其实在很多时候能够做的挺好的,挺好的,近似的,那么在这门课里面,我们专注在这个线性的计算中,上面,有同学说我这边能不能用一些更加fancy的一些,我不我不喜欢直线。

我把它换成曲线也行不行,然后完全可以,那么那种情况下呢,那你其实就整个系统就会变得更加复杂一些,那有些同学会问了,那你说这么复杂,这东西不就是线性差值吗,对他确实就是线性差值。

你如果嗯认为这个幽灵是就是零点的这个值,因为就是一这一点的值,那它之间的值啊,确实就是现性差值出来的,那一维里面是线性差值,大家可以推导出来,二维里面是什么,就是双线性插值,三维里面就是三线性插值。

在统计学里面,大家其实一般情况下呃linear或者by linear,trilinear,差值一般就够了,那么有的时候会有些呃文章里面会用高阶的,那也可以,但是相对来说比较少,那刚才看的是一维的情况。

到了二维情况会怎么办呢,注意这个是一个二维的图啊,差不是三维的,我这边啊这个图里面是用高度来表示函数的值,但是这个图是偷的,这个图是从cal的网站上面找过来的图,我实在是没有精力去画这个图。

这个画图实在太费时间了,大家可以呃,如果这门课结束以后,大家可以去看一看council的这篇介绍fm的文章,他这个其实还是写的非常好的,当然人家是商业fm软件,他写这个文章一方面是介绍f1 m。

一般一方面是也是宣传自己的软件呃,大家可以看看他这个里面图都非常精美,ok那么二维的basic function长啥样,如果你是三角形网格的话,那你basic function大概就是长这样。

它其实是一个大家一般叫它一个帐篷函数,但非常像一个帐篷,它每一面都是三角形对吧,然后它在中间高,然后相邻的道上面,相邻的这个顶点上面全部都是零,那么呃你会发现啊,他其实这个杯子方式。

他其实大部分basic function是不相交的,刚才我们看的这个例子,它是相交的,把他这个大i m fig它是呃有一分是重合的,但是大部分情况下但是不重合,这个有什么意义。

这个后面你就会发现它不重合的话,就对应的一个是你的线线性系统里面,这一个啊零这么一个值,那么他如果说重合的话就是非零,那么既然大部分basis function它是不重合的。

那它说明这个线性系统里面基本上大部分都是,所以说你得到了建议系统啊,它其实是一个稀疏的线性系统,ok,那么我们还是回到我们最喜欢的这个,四边形的元素,这边我们其实用的是工工整整的。

方方正正的这个长方体的元素,这边就要用一下你的想象来去visualize这个basic function,这边其实在二维里面,它其实就是一个双线性插值的base function。

或者说它就是一个呃一个曲面版的tt function,tfunction,它是一个帐篷,但是它的它会有四个面,对它的每一个面是一个曲面,为什么是曲面,而不是而不是平面吗,刚才我们看的这个三角形元素。

它不是平面吗,ok那么,这个其实是涉及到blinear或者trainer,interprelation里面有一点让人迷惑的一点,就是blinear interpolation,虽然说它叫blinear。

但是它是关于x是0。2,关于我是零零,但是它关于x y它就是二次函数,所以你得到的并不是一个完全0。2的对吧,它其实是因为它是把x方向的这个linear,和y方向的linear给它乘起来。

所以得到了本质上还是一个二次函数,然后总体来说啊,那一般你肯定是呃,比如说u11 这一点,它的形函数,那它肯定是和刚才一样,它在周围的这八个点上面都是零,中间一个点是一。

啊对我刚才可能用了一下这个新函数,这个菜其实就是或者或者叫基函数,我一般可能比较喜欢用g函数,因为basis function它一到中文应该叫基函数,它其实呃但是有些地方它会有混用不同的称。

有些园里面它这个地方啊,有些地方它的这个术语它不是很规范,有些人会有一些强迫症,他必须这个地方用shift方式,那个地方用business function啊,但是我们就不去做明显的区分。

ok那么接下来我们刚才说了这个ux啊,我们其实可以把它表示成若干个,basic方面或者基函数的加权求和对吧,那么我们再回忆一下,我们之前想soft这个方程四,其实到这边变成方程八了。

那么其实我们想求解一个u使得什么呢,使得我们这个方式能够满足对吧,右边怎么来的,还记得吗,右边是散入定理搞来的,左边是怎么来,左边是分部积分来的,ok那么我们简单的substitution。

我们简单的把这个ux带到,把这个离散码ux替换到呃方程八里面去,就是说把七塞到八里面就会得到一个九对吧,这个九你会发现它其实就是说呃,当然我们只换左半边,右半边,这个因为我们是不换的。

因为右半边我们后面有别的处理方法,ok那么,这个里面其实还有一个w,我们一般来说w你也可以用这个base function来表示,但是还记得吗,我们这个w是任意的w,然后我们这边只考虑它的离散的情况。

就是说这个w也是由basic方式来表示的,那么你这边如果要取任意aw,其实啊这边相当于说你只要取任意的basic function,作为w就可以了。

这边其实说呃因为w本身也是basic function,给它线性组合出来的嘛,所以我们只要取它的g就可以了,ok呃这个地方可能得稍微想一下,但是呃我们可以非常安全的,把任意w换成任意i呃。

人鱼发来这个地方得想一下,但是还是比较容易想通的,因为你如果不取极限g函数的话,反正它也是线性相关的,你只要取线一向线性这个无关组就可以了,那么我们把w换成fire了以后,我们就可以得到这个公式十。

好公式十到这儿变成了公式11,那么我们把呃接下来做一部非常有意思的事情,我们需要把这个ug啊给它,从积分里面给它提取出来,提出来以后,这其实就是一个比较脆弱的交换顺序对吧,那么我们得到的公式12。

我们只换左边这部分,右边我们还是保持它原样,那么你会看到公式12,变成一个我们非常熟悉的形式,这边未知数其实是u g,就是呃这一点你要求的压强的值,或者一些什么其他东西的值,然后。

呃你看ug左边这么一整坨这么一个括号,它其实啊和尤其是没有关系的,他其实就是一个如果知道的话,知道了,这其实就是一个常数项对吧,那么右边呢右边这个我们会后面我们会讲,它其实是一个啊。

可以用诺伊曼边界条件给他推出来,ok你如果把它写成矩阵形式,你就会变成这个ku等于f,那ku a等于f是其实就是ax等于b,在有限元里面的一个大家喜欢用了一个别名,它其实就是ax比它就是一个线性系统。

那么在k有限园里面,这个ku f都有自己的名字,k一般大家叫做这个stiffness matrix,或者叫刚度矩阵,然后u呢u一般大家叫做嗯自由度,或者叫做解向量,f呢叫做load bor。

就是说嗯这个其实更像是在固体,在解这个固体小形变里面会用到的这些术语,但是这边我们呃大家习惯了,所以我们就照用,还记住这几个名字,ku f,那么还记得我们刚才前一张size里面有这个。

有这么括号里面这么一坨,那么我们它其实就是下面这个矩阵形式的,k i j对吧,那么k i j它是啥呢,它是呃在整个冬梅里面积分,他这个fi和fg他们的梯度点乘的积分。

由于我们这边用一个简单的base function,所以其实他这个积分不难计算,那么在一些更难的basic function里面,大家会用高in queror,但是这边我们简化以后。

我们其实手动积分一下也没完全没有关系,那么假设我们中间这一点是i,那么fi其实是什么,大家可以想象一下是一个帐篷函数,对吧,那么他的这个帐篷函数啊,如果说我的j和i是一样的话。

那其实就是两个相同的账目函数,在这里面算这个fia呃和fj,然后算他们的梯度,然后变成然后积分对吧,那其实由于我们的basic function它的支撑是有限的,它只是只在一个很小的范围里面,有。

他这个base function只在周围四格里面是非零的,在更远的地方全部都是零,所以我们其实只要考虑什么,只要考虑他周围的四个元素的面积,里面的积分就完全ok了,ok然后如果是i等于j。

你会得到一个这个是8/3,那你如果j在这边还在这的话,你会算出来的是负呃,1/3对吧,然后周围全算出来全部都是-1/3,当然这里面还有一个一些像比如说dx啊,这边我们就忽略掉了。

你如果说把它再scale一下,就可以得到一个九点的,拉普拉斯的aplan operator的一个dl,中间是八,周围全是-1,那么还记得我们之前曾经用有限积分,这个有限差分。

final difference来呃,推出过一个五点的拉普拉斯stl吗,就是-4,然后四个角是一对吧,这是呃这可能有正负号的一些问题,然后但是大家一般也不care。

然后你会发现它其实同一个operator,你用不同的方式可以算化的,可能得到不同的cs,当然其实大家呃在我之前提到图形学里面,一般大家做这个流体,还是更多时候是用有限差分或者有线体。

所以用这个stl用的多一些,前面这个中间是八,周围是一的那个三层,反而用的比较少,但是呃播送方程作为推有限元的例子,还是非常非常好,因为它真的是最简单的,不能再简单了,还记得我们之前一直有一个。

像我们一直没有去讨论的,就是这个方程的右转向额,我们用散步令,你把这个散步的积分换成了边界上的,这个应该叫做啊,我忘了这个叫什么名字,反正是边界上的这么一个梯度的积分对吧。

还记得我们这个呃u的梯度点乘上normal,这个是一个什么项,这其实就是我们之前提到的这个,诺伊曼边界条件对吧,所以我们其实在这边,在这个地方我们就解决一下边界条件的问题。

首先我们考虑一下这个dva类边界条件,也就是说叫第一类边界条件,那么呃其实非常容易,这个其实enforce第一类边界条件非常容易对吧,我们只要把相关的ui,也就是说在边界上的那些自由度,它的值设置成嗯。

这个第一类边界条件给定了,f在xi xi就是ui那个点的坐标,我们直接设置,为什么呢,因为你如果是,你如果用线性插值的方式来理解的话,那其实确实那一点上的值就应该是f的值。

那么诺伊曼边界条件稍微稍微复杂一些,你会看到我们之前是用gx来给定的呃,user梯度点乘上normal对吧,那么你会发现这边其实这个项目,你也可以直接塞进去,那你把这个g塞到这个14的右端项。

你可以得到一个呃,最后你会得到一个呢,你low vor里面就会有一个非零的一个entry,所以其实你会发现,其实诺伊曼边界可能会导致你丢单项,有这个非零,在于有些有些园里面,大家会在这个。

固体里面大家又来向一般会叫做这个traction,好像应该叫做牵引力,就是说实际上就是你这个塞给他们力,所以有的时候大家会说,我推一个弹性的一个材料,我其实给他apply了一个诺伊曼别的条件。

这可能会有人让让人摸不到头脑,他明明就是一个呃推力,怎么就变成了诺伊曼边界条件呢,啊他其实从这个地方就可以看出来,好那么接下来我们进入第三部分,刚才我们讲的这个是一个泊松的方程。

我看一看有没有图像有问题,啊对,刚才说这个traction有有同学说叫做逆变焦,或者或者叫做面离啊,这个嗯还是非常好,这个有准确的术语嗯,lovector对。

lovector中文好像叫荷载荷荷荷载荷荷载啊,两个都是多音字,我就乱读了,应该叫荷载啊,反正呃就这样了,嗯哦对再合啊,anyway,有能不能把这个拼音的声调也帮我打打出来,这两个字都是多音字。

ok嗯对,有同学说在算力的时候,在力学里面第一类边界条件是什么呢,第一类边界条件就是这个点的位移,如果说你会经常说我这个固体这个地方,我去定了个钉子,把它嗯固定在了平面上,这就是第一类平台的点。

然后我如果呃给加一个弹簧在那去拖拖沓的,这个就是第二类边界条件,对这个我们后面其实会提到,好,那么我们接下来讲一个稍微稍微复杂一点的,有限元离散发,这个就是呃线性弹性的这个有限元。

这个其实呃是从什么推出来的呢,是从这个柯西动量方程推出来的,那么当然上面这个方程稍微有点复杂,你可以看到其实有一个它也很容易理解的,还是左边的是一个v的拉格朗的导数对吧,就是说你的加速度等于什么呢。

其实就是f等于ma对吧,呃或者或者说这个其实是呃a等于f除以m,那么右边像是什么,右边是嗯就一个16/6分之一,其实就是f等于ma里面这个mg一项,然后这个地方有一个稍微有点难理解的。

就是说我这边要算呃柯西stress tensor的散度,这个可以sensor,它是一个3x3的一个张量,或者说叫或者是矩阵了,然后它是对称的,在三维里面就是3x3,二维里面就是2x2。

然后算tsa的二阶tensor的这个散度,后面我们会提到有没有什么容易理解的方法,然后再加上一个g g是什么,g就是体积力或者说重力加速度,ok那么我们先把他大刀阔斧的简化一把。

首先我们考虑的是这个准静态的过程,就是说它的速度它是零对吧,然后或者说就是一个微小形变,就是根本就没有和移动,它只有一个微小的形变,所以他v 10,说到这个准镜台,我想起来一个笑话。

我有一次我本科的时候学计算机,然后呃我当时在摇班,然后我隔壁的同学,因为姚班有学计算机或者学数学,或者学物理的同学,有一次我起床,可能是前一天写代码写的时间太长了,然后起床就落枕,脖子很疼。

然后呃我就跟我室友提到这个事情,我室友他是学物理的,然后他就然后我跟他说,我这个脖子啊,它这个疼痛感是随着我脖子转动的速度成正比,然后他上来就来了一句,那你以后可以准静态转动脖子,这个什么叫准静态。

就是说你虽然在转,但是你每时每刻速度,就是你就是说你很很慢的转你的脖子,ok啊这个就是一个关于cos static的一个笑话,我每次看到cos static,我都会想到本科时候这个这个经历。

然后呢刚才讲到速度是零对吧,然后我们的density我们认为它是不变的,那么我们可以把这1/6这个term给他去了,然后也没有gravity,也没有体积力,ok那么我们把这些全部去了以后。

就得到一个呃最简单的形式,就是说呃克星stress tensor的散度等于零,那么我们这边的自由度是什么呢,我们还是用u表示自由度,这边的自由度是这个displacement。

什么叫displacement,就是说我的呃这一个点在施加了外力的情况下,他得有一个形变对吧,它形变了以后,这个点它的形变的位置,和原来的位置就会有一个位移,这个位移就是displacement。

注意啊,之前我们讲嗯,之前我们讲这个最简单的三角形f e m时候,那个其实是一个比较山寨的f m嘛,然后他根本就不是用呃,我们那讲讲的时候,根本就没有提到他是怎么推出来的对吧。

呃那个时候我们是用了一个fifunction对吧,然后by方式呢它其实呃我们当时那个fifunction,它其实就是呃新的位置,关于旧的位置,关于material space的位置的一个映射。

但这边我们不用那个范了,我们这边是用的是新的位置减去旧的位置,得到了这么一个displacement,这边要注意一下,和之前用的不是一个东西,那么其实这边你会发现,这个方程里面好像没有出现。

我们的degree of freedom对吧,没有出现有,那么是为什么呢,因为这个sigma它其实是u的一个线性函数,那这个中间有一套非常复杂的映射,那么当然是一个线性映射,后面我们会提到有同学会问。

这个东西到底是一个login还是alin的,但其实他这个是一个呃infantasia的,infinitesimal的一个declaration,它是一个呃微小微小的形变,所以你他根本就没有移动。

所以你这边说他是loona或者lin的,这个其实没有太大太多意义,呃我这边还是提到这一点,因是因为很多搞graphic同学会觉得我用了网格,我就是欧拉的方法,但其实并不一定啊。

他这个其实并不是根据你用网格,还是用例子来区分它到底是leona还是order,ok那么刚才我们提到这个coaches,stress tensor divergence,这个其实可能不是很容易理解啊。

我们这边引入一套新的符号系统,叫做index notation,这个系统还是非常有用的,后面我们推pm的时候也会用到这套系统,那么什么是index htation呢,就是说我们用alpha beta。

gamma这一坨希腊字母来表示它的index,那这样做了以后,我们就可以统一的呃,把x y z3 个轴或者w有四个轴的,我们一般就考虑三维问题,所以其实这就只有呃x y z了。

那么我们就直接用x阿尔法来表示,这个阿尔法可以是零的时候呢,第零个轴其实就是x,如果二分等于一得到的就是y就是第一个轴,然后背上如果是二分等于二的,知道就是z我这边其实不应该吧。

呃x不应该用x贝塔x伽马,我这边应该是用x0 ,x1 x2 或者x1 x2 x3 ,取决于你是从零开始输出还是从一开始输出,呃,总之呢我们是用这个下标,统一的下标来表示空间的轴。

然后呢用一个逗号来表示口径导数,比如说啊刚才我们的这个coach stress stress test,如果说我们是他是呃,阿尔法贝塔这么一个component,关于gma这个轴求导的话。

我们就用这个sigma下标是阿尔法贝塔,然后逗号伽马,ok记得逗号后面的这个伽马表示求导,然后这么做了以后呢,我们就可以得到一个,把原来它是一个vectannotation。

我们可以把它变成一个index notation,这样看起来就比较清楚,因为说实话这个33tensor散度,一开始他是什么意思,其实你还是要想一下的,但是用index station它就很容易表示出来。

ok那么其实你可以看到,我们如果考虑左边,他这个这个向量方程的alpha component的话,你可以看到,那其实有几项我们可以明显的很容易就换,比如说这个v可以换成v2 阿尔法对吧。

这个g体积的这个body force,我们可以换成g阿尔法,然后他的内力,它的这个内部的力呢,这这一特就是呃koshi stress tensor,散步除以除以o,然后他其实你可以把它换成对于贝塔求和。

然后实际上是stress tensor,他的阿尔法贝塔component,component,关于贝塔求和呃,关于贝塔求导以后再求和,ok,这么一个东西,他就说如果你一个下标出现两次。

那就会有一个隐藏的求和好,但这边我们就不用呃隐藏求和,我们就直接把所有球和全部都用西格玛写出来,这样就更加清楚一些,因为出现了两次,这个不是很容易定义,比如说你这边阿尔法这边有两个阿尔法,有两个贝塔。

到底是两个头球和呢,还是只对其中一个求和对吧,这个就呃对于初学者来说不是很友好,我们这边就假设,我们把所有的这个求和全部写了出来,好那么接下来呢我们用有限元去比赛划一把,注意啊。

这个和刚才的泊松方式比起来,稍微稍微复杂一点点,为什么它复杂呢,因为刚才柏松他是他是一个标量的一个pd对吧,这边我们是一个十张的pd,而且呢刚才的柏松,我们这个u是直接出现在房车里面的。

但是在这个有限元里面的啊,在这个呃柯西动量方程里面,我们还有一个mapping,这个main是把你的u map到sigma对吧,然后接下来我们推导了现在sigma上面做。

然后后面我们再讲怎么把u给替换上去,all right,那么首先我们和刚才一样的套路,还记得第一步是什么吗,有些人他是加料金法对吧,首先我们给他上一个test function,给它沉下来呃。

当然这个test function要注意一下,它是一个标呃,这个矢量test function,它是从这个二维平面到一个二维向量,那么我们得去把它关于贝塔求和对吧,那么其实就得到一个这样一个方程。

那么为什么要上test function呢,上test function以后我们就有两个像,有两个像以后我们就可以分部积分了,或者用这个导数的乘法公式呃,这个乘法的导数公式对吧。

ok那么我们来看一看我们刚才得到的这一项,这一项呢它分到左边就是两项对吧,注意这边我们把它括起来,整个对贝塔对于x贝塔求的一次导出,那么求导数其实用index station看起来就更加清晰了。

你看我要不是给把这个贝塔塞给左边,要么给他塞给右边对吧,那么我们其实其实还是一个叫什么,这个口诀叫做d u b u d v加v d u对吧,我记得当时微积分的时候学过这个口诀,然后ok做了分部积分。

还是和刚才一样的套路对吧,这边这一项我们知道它是等于零了,所以我们可以把这个term给他删了,删了以后呢,就只有右边的这两个项目,那就得到这个这么个方程,什么方程,那么大家应该可以反映出来。

这个地方我们接下来要做什么,接下来就是给他做积分,做积分以后,这边可以用散落定理,散度定理以后,就彻底的把它换成了一个面上积分,或者线上积分,左边呢就是一个面上积分或者体上的积分,ok。

那么接下来我们还是做一样的事情,有了公式15,到这儿变成公式16,然后呃公式17是和刚才一样的套路对吧,一模一样,就是说我们把连续的方程,连续的这个u这个函数把它替换成离散的。

用basic function给它支撑起来的这么个函数,ok然后呢呃到了18里面,我们就还是和刚才一样的套路,我们可以把这个w什么test function,给它换成basis function对吧。

我们不需要去测所有的w,我们只要测比较有代表性的那么几个w也行,有代表性的w是啥呢,就是base function,然后u呢还是把它塞进来,塞进来的时候注意我们只换左半部分,不画右半部分。

右半部分这个地方它是刚才提到的,只是一个面临,ok那么其实左边呢我们其实呃你会发现左边,由于啊我们这个左边是一个关于sigma函数,它并不是一个关于sigma的方程,并不是一个关于u的方程对吧。

所以我们其实还不太好直接把它放进来,那么接下来我们要做一个事情,就是把这个sigma和u的关系给它确定下来,这样呢我们就可以把左边彻底的给他,换成一个关于u的方式,就可以把这个sigma给他删了。

那么如果把sigma去了以后,那么其实左边很容易又可以变成ko的vf对吧,刚才我们讲到,其实我们需要把这个sigma和u给他联系起来,对吧,这个u怎么一步步到这个sigma,那这边有一个string。

有一个从啊u到string tensor的过程,string tensor是什么,我们之前提到这个这门课里面,所有的string都可以把它换成deformation,它其实就是一个。

但是局部形变这么一个东西,当然displacement和呃这个这个,displacement也是measure形变的一个东西,在这边我们其实要给他再求一次导数,才能得到局部的这个形变率,获得这么个东西。

然后这个string tensor这边我们其实就呃很容易的,我们可以做一个定义,它其实就是呃u的梯度,注意这边又有这个向量矩阵的问题了,他这个是虽然是一个呃三维的向量,但是你求的梯度里。

它就变成一个变成一个什么,变成一个二维的,就变成一个33的矩阵或者一个二阶tensor,那么就得到一个这个就得到一个这个string test,那么string cher呢。

我们可以把它变成再经过一些变换,注意这个lambda和mu是什么,lambda和muse,是我们之前提到叫lame parameter对吧,然后呃在统计学里面还是非常非常常见的。

特别是你在呃模拟弹性的物体的时候,ok那你得到这个呃,这个是一个柯西的这个stress tensor,它等于什么,它等于lambda乘上sin test的trace乘上i。

然后再加上两倍的mu乘上这个呃street cancer,当然这个可能看起来非常的confusing了,我们可以用index dotation来进一步简化一下。

那其实就得到这个e的阿法贝塔component,等于什么,等于12/2分之一个u的alpha component,对贝塔求导,加上u的贝塔对阿尔法求导对吧,然后呃,后面我们也可以用类似的方法去表示一下。

然后这边我们有一个这个dota方式,这个调查方式其实就是阿法和贝塔相等的时候,等于一,不相等的时候等于零,然后呃用这个调查方式呢,其实对应的就是identity matrix,说了这么多啊。

其实这些这些都不重要,重要的是什么,重要的是这个sigma是ud linear function,那说了这么多啊,终于我们得去build这个linear system的举证了,刚才说到呀。

这个西格玛是u的linear function,然后我们又有公式19,ok,那么我们这个地方其实还是可以推出一个k u,等于f了,但是这个地方要稍微注意一点,这个我们公式的这个左边算k这个term。

你这个u要提出来要下一番功夫了,他不是说直接可以提出来,他中间还要经过stress string matrix和string displacement matrix,后面我们会提到这两步处理。

才能得到这个真正的k,所以真正的这个fm它的呃弹性fm里面,他的这个k啊,他这个矩阵是要把它组装起来,还是不是特别容易的,你要去考虑他这个senal size,就是说如果说我们没有边界条件的话,呃。

对于每一个u,它会和多少个其他的e u的component的接触呢,也就是说你这个k里面那一行,有多少个非零项呢,其实非常非常多的,就是因为中间这个部分它的嗯变换,它是不是特对对应关系还是有点复杂。

如果说呃你在二维的时候,首先你这个u它对和周围的,它其实是和周围的三乘三个呃,节点是有关系对吧,你这个u中间这个和周围的3x3,然后呢,周围33里面每一个节点都有两个component。

所以你这个二维里面就有18个entry,三维里面就更复杂了,虽然三维里面,你这个就是每一个相当于每一个boxo,他会和周围的八个包呃,就就每一个顶点它会和周围的八个box有关系,八个boxo是什么。

八个voxo就有3x3乘三二十七个顶点,你再乘上一个三对吧,因为你每一个顶点上面有三个很ent,所以就81个81个能no zerries啊,你要把这个81个项目都写出来,还是不容易的一个事情。

这k到底长啥样的啊,我们接下来就揭开它的神秘面纱,你会看到他呃,这个k我刚才说它还是非常复杂的,我们就看一个大家一般会讨论的是什么,会讨论一个element,它的这个k e matrix。

ok那么这一个问他这个k matrix,哈哈看起来不是特别好,他首先你得去呃,它有八个不同的项,然后这个八个不同项,关于这个呃排列组合得到以后,得到一个8x8的这么一个矩阵,这个大家一般都是打表的。

我是很久以前手动推过,这个88矩阵里面的一两项已经推了,我嗯挺挺累的,然后一般大家都是呃你抄我,我抄你就把这个88的矩阵啊烂熟于心,也不是烂烂熟于心嘛,就是塞在你的代码里面。

然后呃随时在硬盘里面某个角落能把它找出来,这个地方其实要讲起来就非常非常的复杂了,我这边就不细讲了,但是大家要记得你从u到西格玛中间,这个非常long trivial的这么一个线性变换。

导致了这个8x8的,对于每一个元素的刚性矩阵,有的每个元素钢琴矩阵,然后我们就可以组装出来一个真正的大的,这个k矩阵呃,这个组装过程呢大家可以去,如果你会matlab的话,你可以看看有一个99行呃。

拓扑优化实现用matlab写这么一个文章,然后它是一个非常非常容易上手的一个文章,当然他也会介绍徒步优化,那么既然都讲到拓扑优化,我们接下来就简单介绍一下,拓扑优化是啥,那么我们这边介绍一个。

最最最简单的拓扑优化问题,叫做minimal compliance,比如说呃我们想最小化什么的,最小化它的compliance它的定义是什么,定义是什么,什么叫compliance。

compliance就是呃u transpose乘上k再乘上u,其实就是说某一种形变的能量,或者说这个loss function在如果做gpin的话,你可能更喜欢lost方式。

这个这个称呼他就是mesh呃,你这个物体的形变大小,然后呢我们当然还要满足q等于f对吧,你的这个dispacement得和你的load bor得是对应的,然后你还只有有限的材料。

也就是说你这个空间里面有很多小格子,然后这个小格子里面每一个格子可以是zero,也可以是one,就是可以是空的,也可以是填充的,然后,你就用这个0~1之间连续的数目,来表示这个格到底是有材料还是没材料。

然后大家再用一些trick,让这个值要么是接近零,要么是接近一,把它推到两级上面,这样你就可以把一个离散的优化问题,把它表示成连续的优化问题,当你有个体积限制,你不是说整个空间都得填满。

如果说你要最最小化上面这个东西,不给你几个限制的话,最简单方式是什么,最难就是你把整个空间全部填满,但是你在有体积限制的情况下,你就得想想办法,ok那么我们说了这么多啊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们还是看一个demo吧,这个刚才这个例子不是很直观啊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

刚才列了一坨公式,可能大家非常confused,我们来看几个。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

看一个拓扑优化的一个演示,找一个白一点的背景。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这,嗯看起来更对,ok好,那么top优化在同一学院里面还是挺常用的,为什么呢,就是因为它好看,倒不是说他做出来的东西呃,当然在工程里面,大家可能更喜欢top优化做出来的呃,这个结构它会省材料的。

在图形学里面很多时候大家就是图它一个好看,但是很多时候由于这个拓扑优化,现在有3d打印的技术,是有3d打印以后,这个突破优化一下子就变得非常的popular,因为这些他优化出来。

材料往往会非常非常的复杂,那么你在以前你用以前的这种增材制造的方式,你往往造不出来,但是你用3d打印以后,这个就非常容易,你直接呃任何材料都可以打印吧对吧,ok那么这个里面我们在干啥呢。

我们这个里面其实是在做一个优化,我们把它的右下角给它固定住,注意右下角固定住,然后呢左下角我们给它呃,或者大家可以脑补一下,这个其实是我用了一个对称的技巧,他这个其实只是结构的右半部分。

因为左半部分和它完全对称了,我们其实就是假设这边有一个点,这边这个点和这个点都是固定的,然后中间给它加一个向下的力,然后然后我就问你,如果就给你这么多材料,你不能把这个空间全部填满。

你只能有空间的50%的volume是呃,可以放材料的,你怎么样去设计你的这个结构,使得它的这个complex,其实也就是说这个函数的值可能尽可能小k,那么呃,祝大家应该也可以在网上下载到这个程序。

你看到这个这个程序是一个交互的程序,你可以调它的分辨率,如果你分辨率高了以后,你近段时间也就会相应的变长,但是你得到的结果也会更好一些,我说的更好,也只是说它看起来更复杂,看起来看起来更好啊。

一般来说有的时候大家会用这个objective,来去作为结果好坏的一个mesure objective,其实就是对应上面的这个lp的这个l ro。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ok那么限于时间关系啊,这个拓扑优化我就不继续讲太多了,大家可以去玩一玩这个demo,这个demo里面有好几种边界条件,刚才我讲讲的是一个比较简单的把脚上固定,这边我们是把呃左上角和左上角和左下角固定。

然后给这边加一个力,这个这个例子好像叫做n b b,并还是叫m m b b,我不太记得了,好像叫m b b b,然后它就是相当于你固定左边两边,然后给你可以想象,如果是左边是一面墙。

然后你要呃优化一个生出来的结构,使得这个伸出来的结构呢啊,最右边这可以挂一个衣服什么的啊,其实还是比较比较直观的,你可以看到它基本上优化出来,这么个像钳子一样的结构,还有这个边界条件三。

边界条件三是一个桥梁结构,这可能分辨率有点高,一下子算不出来,ok这个是干啥的,这个是把左右左下角,右下角给它固定住,然后给上面每一个点都施加一个向下的力,实际上就是一个桥梁的一个设计的一个东西。

但是我不知道现实中有没有人真的这么设计,桥梁,可能会有有些建筑师他会喜欢用徒步优化呃,来设计这些建筑,其实有真的,有些建筑是头部优化设计出来,大家不要觉得这个头部优化是一个,理论上的东西,很多。

由于它设计出来这个结构往往非常具有美感呃,很有这种叫做生物质感,所以很多设计师最近也比较,最近不是很流行这个环保仿生这些设计,所以很多设计师啊,他会用徒步优化来去设计这个建筑,这个城市有的时候啊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

sob有限元还是要费一些功夫的,你可以看到他这边在非常卖力的去迭代,看到他这个由于我们用的是ctrl redis,没有加预条件,所以你可以看到它收敛速度并不是很快,特别是当你的这个结构不是很清晰的时候。

大家如果要看这个minimum compliance,拓扑优化其实只有两个关键词,一个叫做sip呃,一个叫做oc,你只要记住这两个关键词,然后到那个文档里面去找,这simple和oc是啥就可以了。

这个其实算法和之前推的有限元的比起来呃,就和非常容易理解了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

它没有那么多非常复杂的东西,它其实就是一个很简单的一个优化问题,ok那么说到这个头部优化,也不得不提,我们之前做过一个非常有意思的工作,就是说呃,如果说我们呃把这个图优化的分辨率,推到非常高会怎么样。

我们刚才演示的top优化,它分辨率其实非常低的,他只有大概100x200,这个分辨率图形学里面大家很少用这么高,这么这么低的分辨率,大家一般都喜欢,至少是几百乘几百啊,至少是大几百。

或者是这个几千是几千人这么个分辨率对吧,那么特殊优化,由于它是要算一个f e m,所以它的分辨率之前一直都很难做的很高,因为你要solve fm还是挺费时间的,你会看到之前,首先他这个stl非常大对吧。

和普通比起来,然后非常复杂,然后,呃他还你要给他设计一个presugitioner,还不是特别容易呃,ok然后所以说我们就做了这么个工作,这个工作其实它其实目的非常简单。

就是说如果说我把这个分辨率调到非常高,然后只给你一台电脑,只给一台电脑,我们去做这个拓扑优化啊,解fm,然后我们能得达到一个什么样的效果,这个视频我传到哔哩哔哩上面,大家可以去看一看。

应该是刚审核通过的,昨天晚上传的,它其实里面核心部分就是一个高性能的f m server,然后当时我们找了一台机器,找了一台有512g内存的机器,这样我们可以在一台机器上面,就用cpu去做有限元求解。

然后推到一个很高的分辨率,这个其实有应该是有超过10亿个,是不是11,这个是呃,对应该是10亿对10亿个呃,超过11个这个boxes,然后你会可以想象这个里面。

你如果用光把这个k matrix给他存下来,就不够存,那怎么办,你得做matrix,也就是说高精度的情况下,大家往往会考虑matrix的搞法,因为你没法把这个矩阵存下来。

你还得设计一个很好的precondition的,要不然你这个收敛其实就收敛不了,然后呃,你或者你要很多很多次cg iteration才能收敛,就效率非常低,呃,这个其实根本质上就是一篇高性能计算的文章。

有我看到有同学呃说到这一点,他其实呃和graphics相比,和传统的graphics simulation比起来,它更像是simulation里面加高性能计算,ok这个是上面显示的。

这是一个鸟嘴结构的拓扑优化,这个是鸟嘴结构是干啥呢,就是说我如果把这个面固定,然后我给他这个鸟嘴的某些部分家里,因为你这个鸟嘴得是一个有用嘛,你鸟嘴得够硬才能去吃一些果子呀,什么啊。

鸟一般是吃什么坚果对吧,鸟嘴里够硬才能咬得动这个啊,花生啊什么东西的,所以这个设计上面,你是要设计一些有一个条件的,ok你就可以看到它这个其实得到一个仿生设计,其实你可以去看一看呃,有些鸟它的化石。

它其实内部结构可能和这个还是有点像。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

不能不能说完全像,毕竟这个是在计算机里面进化出来,它不是在自然条件底下进啊,进化出来的呃,ok那么其实今天我们就讲的内容就差不多了,我来看一看有些问题哦,有同学说拓扑优化的那两个关键字对。

其实这个拓扑优化它其实关键字就是就是这样,你只要在这个文我的作业包里面有一个pdf,但这个作业大家只是有空的话就可以做一做,没空的话就不用做,那个代码是c加加写的。

因为这个是早期的时候太极还是一个c加加库,然后我后来实在没有找到时间,去用新版的python的太极重写了,下次一定这次真的是没有时间了,然后他是一个c加加的作业,然后我们在m i t交通信学的时候。

也会用到那个作品,当时是你会看到它里面有一个2万行的图文件,然后有一个200行的拓扑优化的一个程序,那个代码可以在各种平台上,不用装虚拟机就可以运行,然后那个文档里面那个包里面有个pdf。

那个pdf里面会介绍sip o c,然后还有手把手的教你,怎么把这个代码从一个不word的这个程序,把它呃,优化到一个逐渐实现到一个能word的头部优化,最后你能看到就是我刚才展示的这个。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这个程序的效果,有同学说f m能不能结合multigrade,对你如果要看fm加mt grade,那你一定要看一下这篇这篇文章,这篇文章是fm加mtv的一个,我觉得还是不错的一个文章。

当然这个mt贵不是像普通的mtv那么容易啊,这个mt贵的还是非常头疼的,要把它写对真的很不容易,你可以看这个代码其实是开源的,但是一个c加加的一个代码呃,为什么不用gpu,因为gpu没有这么多的内存。

gpu它的memory可能只有现在可能只有22g,24g,但是我们整个系这个这个信号跑起来,大概要用到300多g,或者将近将近400g的内存,但你不要觉得300多g400 g好像很多。

其实之前有一篇nature paper,也是做这个高精度的table depremization,然后他用了我记得用了500台电脑,还有什么8000个cpu core才把它算出来,我们只用了一台电脑。

50个cpu块就把它算出来了,分辨率和它也差不多啊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

GAMES201:高级物理引擎实战指南2020 - P7:Lecture 7 混合欧拉-拉格朗日视角(1) - GAMES-Webinar - BV1ZK411H7Hc

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

好那我们正式开始嗯,今天我们来讲一讲混合欧拉拉冈人的视角,而这个是一个听起来很复杂,其实非常非常简单的话题,我们这一讲啊,其实没有任何公式啊,这样非常好,所以我直接都用keynote做slides。

没有用雷tag呃,下一讲我们会讲一些讲一讲这个背后的理论,这一讲我们就专门讲他的呃高层的一些想法。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

今天呢我们主要讲一讲,整个欧拉拉格人视角的一个overview,然后啊我们具体介绍一些例子,遗留格式,比如说particle excel,fm。

particle excel和polynomial particle excel,呃,他们分别简称pick a pic,polypc,这三个pig方法是中医学里面非常非常常用的,混合欧拉拉格尔方法。

然后还有一类方法呢叫做flip,flip,其实也非常非常常用,今天我们呃除了讲这几个呢,我们最后还会讲一讲m p m,然后下一讲呢我们来讲m p m的理论和实践。

以及m p m里面的这个constitute model,好像中文叫本构模型,然后我们会讲pm里面的拉格朗日历,以及影视,m p m时间积分和一些高级的采集feature,这是下一周的内容。

这周呢我们就讲一讲一些比较基本的内容,好我们先来回顾一下什么是拉克人视角,什么是欧拉视角,他们其实是连续介质的两种视角对吧,那在拉杆人视角里面呢,你想想呃,你可以把自己想象成一个随随波逐流的小船,对吧。

呃你每时每刻都在问自己,我的位置和速度是啥,你是随着你模拟的材料一起移动,这个就是拉格尔视角,一般来说在拉杆视角里面,大家喜欢用party,但并不是拉格尔视角里面就一定就是party go。

还记得我们之前的有很多有限元的模拟,它也是拉格尔视角对吧,但是它就是用的是一个flash,ok那么欧拉视角呢,他和拉格尔视角是不一样的,欧拉视角里面的这些所谓的传感器,或者你自己的观察的位置。

它是从来不移动的,然后你每时每刻都在问自己另外一个问题,这个问题是对于我自己这个位置经过的材料,它的速度是啥对吧,那这个就是拉格尔视角,其实还是非常容易理解的,你可以认为它就是一些插在水里面的桩子。

如果你在模拟这个水的话,这个桩子是从来不移动的,这个克拉管视角是形成了鲜明的对比,还记得那句话吗,呃拉港人视角是随波逐流,在统计学里面,大家两个都经常使用纯拉格朗视角。

和纯呃欧拉视角都是非常常用的模拟方法,在拉格朗的视角里面,大家一般来说会用particle,然后在欧拉视角里面,大家一般会用一个grade,或者用一个mesh,那拉冈伦视角里面也可以用mesh。

也可以用,但是相对来说比较少一些,拉格尔视角里面典型的一个呃,一系列方法是基于粒子的方法,比如说s p h啊,然后position based dynamics,里面很多东西都是用八个人视角来做的。

比如说你看左边这个是nvidia做了一个工作,他们所有东西全部都是用例子来表示的,你可以看到拉格伦视角它的很大的一个好处,就是它用粒子来表示以后,它可以表示出各种各样的呃形状。

然后各种各样的材料也可以用这个来表示,欧拉视角呢,这边右边是一个很经典的一篇烟雾模拟论文,也快有20年了,他是用一个背景网格来表示,这个厂里面的速度和density,这个烟的浓度之类的。

各种物理属性都是在纯grade上面去表示,没有粒子,那么很多同学自然要问,到底拉格朗视角和欧拉视角哪一个更好呢,那么一般说到这种问题啊,我们都得先定一个标准对吧。

嗯那有好几个key facturers是关键因素,我们得去考虑,那其实我们在这边就是在呃define,什么叫better,better有好多种层面对吧,如果一个人跟你说,这个算法每个层面都好。

那你可能得想一想他是不是在忽悠你,因为很少有这样的算法,一般算法也就是在几个层面比较好,你要根据具体的情况来选择使用算法,真正的在每一个层面都比较好的算法,是非常非常少见的。

ok那么我们这边要考虑哪一个更好的时候,要考虑哪些因素呢,首先我们要考虑的是物理量的守恒对吧,你这个模拟的方法你至少得实现动量守恒,然后在要求高一点,可能得角动量守恒对吧。

那你还可能得考虑你的体积是不是守恒,如果你在模拟的是incompressible的东西的话,比如说你在模拟嗯不可压缩的流体,那你希望它的体积能够守恒,然后你还希望它的能量能守恒。

比如说你这个机械能不守恒,然后你别看这几个守恒量看起来非常tribute,但其实你真正的要把它做到的话,还是非常不容易的,你很可能设计一个scheme,自己弄着弄着,你发现诶好像角动量不守恒了。

然后呃一般来说减重量不守恒,很少来比较少,是爆炸的情况,一般来说是慢慢慢慢就没了啊,这个其实和能量的耗散其实也非常相关,那接下来呢我们就要考虑它的性能性能,在现代计算机体系结构上面的性能。

基本上就是两个factor,一个是parallem,一个是quality,你这个方法容易不容易并行,然后这是计算上面呃,访存上面是你的这个算法,在访问内存的时候。

是不是有比较好的special和这个temporal locality,它的时间和空间的局部性是不是好,因为在当前的计算机体系结构上面,你的flop就是你的这个浮点数计算,是一个非常廉价的东西。

真正昂贵的,不管是从时钟周期还是从能量上来讲,都是你从主内存移动到寄存器,这个移动内存或者叫保存的过程,所以考虑paralysm和locality,你得嗯和当前计算机体系结构进行结合。

然后来考虑这样才能达到一个比较高的性能,最后呢你可能还得考虑考虑计算实现的复杂性,对吧,你这个算法有可能各方面都好,但是就是实现起来太复杂了,没人能正确实现出来,你别笑啊,其实有很多算法都是这样。

他好像呃看起来非常简单,你真正要实现起来还是非常非常难的,不是所有的算法都能被你,99行或者88行给实现是吧,当你这个复杂程度高了以后,很有可能复杂的程度高以后,他就不守恒了,或者性格就变低了。

为什么呢,为什么不守恒了,也没人能实现对,那当然就不守恒了,为什么性能变低了,因为你算法变复杂以后,你要去优化它就非常非常难啊,你随便你找一个简单的算法,你教给我,我给你重写一遍,快十倍。

一般都不成问题,但是你如果给我一个非常非常复杂的算法,那我就要考虑一下我要不要帮你做这个事情,因为这工作量可能成本太高了对吧,我就呃即使一个非常擅长优化的人,他可能也不愿意花这个时间去帮你优化。

因为太复杂了,ok那么讲完了这么多呀,我们定义好的一个标准,接下来我们来看一看,我们的混合欧拉拉格尔方法,为什么我们要用混合欧拉拉梗式方法呢,当然是因为我们会让他们希望,让它变得better对吧。

让它变得更好,那我们想想看,在一个fluid solver里面,通常我们有两个component,对大家还记得吗,如果是一个incompressible fluid solver的话,一般就两部对吧。

一个是the action,一个是projection,action,就是说你要去移动你的流体的这个场,projection是什么呢,projection是你的速度长,如果说有散度分量的话。

我希望把这个散度分量给他投影掉,也就是说我希望去enforce他的incompressibility,我希望去满足它的不可压缩性,大家在之前的实现中应该逐渐也发现呃。

action和projection系呃,喜欢的表示其实是不一样的,欧拉网格呢就特别擅长projection,为什么你在欧拉网格上面还记得吗,在欧拉网格上面,如果我们用一个均匀网格的话。

那很容易district,还记得我们的五点播送stl吗,对吧,就五点泊松的模板其实就是中间是二维,里面是中间是-4,上下左右各是一,或者你取一个负号,反过来也全部都没有关系。

均匀网格上面聊起离散拉普拉斯算子,是非常非常容易的,同时呢你如果对于一个网格上的节点,你要去查找他的邻居也非常容易对吧,那你这个在内存里面都是均匀排布好的,你只要呃比如说你如果是i g的话。

那你上面的就是i j减一下,面就是i j加一对吧,这个其实是非常容易实现,neighborhood,look up,非常容易实现,然后呢你如果要去做preconditioner。

由于你的结构是一个均匀的网格,这边你要做precondition也非常非常容易,很容易你就可以上一个geometric multic grade,这个几何多数网格法去做preconditioning。

这样你收敛也会非常快,所以你会看到欧拉网格它其实在做projection的时候,它有非常非常多的优势,但是它有一个很大的缺点是什么,他在做the advection的时候很容易出问题。

还记得我们之前呃讲了好几种vection的方法对吧,不管你是用sama runner也好,不管你是用呃micromic或者b p c c也好,呃你可能有一些方法比另外一些方法是好一点。

但是他总改变不了它的数值耗散的问题,可以看到我们右边这两个图,假设我们一开始的时候,这个太极图标是这样,当他转了几圈以后,自己往往就会变得非常的模糊,他会丢掉能量和几何上面的细节。

这个就在模拟的时候会非常的不尽人意对吧,因为你模拟的模拟人,你这个能量就跑了,跑没了,那这个就呃在流体魔力里面,往往这个导致的结果就是说你的呃,流体看起来非常非常的黏。

或者说一般大家叫做two biscu,它的联性太高了,然后同时呢你可能有一只,一开始是一个兔子形状,你这个模拟就模拟它就变得越来越糊,然后他就不知道变成一个什么形状,最后可能就变成一团球了。

那这个就呃看起来效果就不是很好,当然你如果说你要考虑准确性的话,那准确性也不好,ok那么刚才讲的是欧拉网格,接下来呢我们就讲一讲拉格朗的例子,那么粒子它非常非常擅长一流对吧,我要移动一个例子。

或者只要干啥,我只要把他的位置加上dt乘上速度,或者用一些更高级的格式,我就可以简简单单把这个物理量在空间中移动,同时呢他或许还会非常呃conservative,比如说你如果把质量track。

用例子去track你的质量,那你的例子由于你从从头到尾它都不生不灭,所以你的质量自动就是守恒的,动量呢你也很容易做到守恒对吧,那如果你用规的话,那你移动以后,你可能得做一些额外操作,才能保证动量守恒。

这个是它的好处,它非常非常擅长,但是你如果在例子上面做projection,那你这个就非常头疼了,为什么呢,因为你粒子在空间中的分布啊,你的呃它是不规则,他可能你中间有一个例子。

那你怎么定义他左边的例子呢,它左边可能有好几个例子,你很难定义清楚,他要离散化,它就非常的tricky,之前哦,我们很多同学实现s p h里面这个shape function啊。

这个叫kernel function,它结果好多好多种变种,为了在粒子上面能够实现离散化,这个实现起来还是有点头疼,同时呢你要去找你的邻居,你要去apply standal的话,你得找你的邻居对吧。

那你的查找邻居这个过程也非常非常的复杂呃,一般来说大家都要用一些比较复杂的数据结构,比如说一些hash reen,或者一些呃,各种各样更fancy的数据结构来实现邻居的查找。

一般在纯particle的方法里面,邻居的查找以及在邻居上的操作就是它的瓶颈,所以例子它并不是真正擅长,projection的一种表示方式,那么问题来了。

既然alerin green欧拉网格擅长projection,例子擅长the action,我们有没有一种方法能够把两个表示各取其长,然后又能避免其短,把他们smart combine。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

就我们把他们聪明的结合在一起呢,答案是肯定的,这个就牵扯到我们今天的呃,混合欧拉拉格式方法,既然我们要做到科举学长,那我们得两个表示都得有对吧,那么一般来说呢,在混合欧拉拉格人方法里面。

他的欧拉grade和拉格朗日particle,他们并不是同等地位的,一般来说大家是呃,把拉格尔的例子作为一等公民,欧拉网格作为二等公民,为什么呢,因为你大部分信息啊,主要还是存在拉等人的例子上面。

the grid呢一般只是一个附属的,用来计算中间结果的东西,ok,那么明确了拉格的例子和欧拉网格的地位以后,我们呃就可以设计整个算法,首先呢我们有一些拉杆的例子对吧,它存所有的状态。

然后我们要一般来说在这一切方法里面,它的套路都是第一步,我们先做particle to retransfer,我把网呃例子上面的数据传输到网格上。

这一般大家叫做p t g particle to grid,简称p g,那么做完p to g以后啊,你的网格上面就有一些物理的信息对吧,那我们在网格上面就可以做一些grade的operation。

网格操作,这些great operation有一般有啥呢,一般有呃pressure projection,你希望去呃把你的呃,速度的散度分量给他投影掉,去enforce你的速度的无伞或者不可压缩性。

也有可能在grade上面去做一下boundary condition,但boundary condition也可以在party上面做啊。

我们这边只是说grade上面的boundary condition,边界条件,然后gre上面一坨操作给他做完了,然后我们就可以做great to particle transfer。

我们再把信息在gre上面走了一圈以后,我们再把它重新拿回来,然后这样我们就又把信息到了particle上面,最后呢我们在particle上面做一些更新,包括移动我们的particle。

然后或者呃更新材料的一些constitute model之类的,比如说更新deformation,gredient,更新它的形变梯度以及更新它的体积啊,一些各种其他的属性。

这个其实就是整个混合欧拉拉格尔方法的呃,这个套路其实还是比较清晰的,他就是有既有欧拉表示,有拉格朗表示,我们用transfer方法,把信息在两个表示之间来回倒,那么这个来回倒的过程。

它其实也会引入一系列的问题,包括你来回倒会导致信息的损失,来回倒会导致计算量变大之类的,各种各样的问题,我们在后面都会逐一解决。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那么我们现在就来考虑一个最最最简单的呃,混合欧拉公式方法叫做particle excel,一般大家简称pc或者读作pick,那然后这个party insult方法,其实就是一个非常非常古老的一个。

混合欧拉拉控制方法嗯,在pk里面,他的p图记的过程其实也非常非常直观,就是对于每一个particle呀,我把他的各种物理信息给他,传输到它相邻的若干个格点上面,这边我用一个二维的二维的例子。

然后他的呃传输范围是3x3的great node,然后传输的量是什么呢,一般来说最常见的就是速度,偶尔呢大家也会传输温度或者力,m p m里面就会传输力,然后这个是particle degrade。

然后你在gree上面做完一些操作,你得做great to particle对吧,那你其实每一个例子,从周围的3x3这么个网格上面去收集信息,然后收集的一般来说就是呃,速度或者温度之类的物理量。

那么在传输的时候啊,一般大家会遵循一个原则,就是说这个例子并不是均匀对待它的邻居的,或者说呃是不平等的对待他的邻居,当一个邻居节点对他更近的时候,他就会有更多的importance。

这个这个大家应该也能理解,就是说呃距离更近,它的重要性就越高,那么一般来说呢这个importance是怎么定义的呢,大家会用呃一些和函数,或者叫做你把它叫做差值函数,也可以这边叫差值函数。

可能有点奇怪啊,你可以叫它,这个就可以叫它是一个kernel function或者核函数,然后这个核函数呢一般来说大家的搞法是,我在x方向上有一个和函数,在y方向上有一个和函数。

然后这两个核函数呢把它乘积起来以后,就得到在呃每一个格点上它的权重对吧,和函数一般是怎么选择呢,呃和函数其实混合欧拉拉公式方法里面有很多,很多种选择的方式,然后我们今天介绍三种最最最简单的核函数啊。

这个叫b splenko,然后一般来说呢,大家呃最常见的俾斯麦kernel是什么呢,其实你如果做线性的这个差值,就或者这个帐篷函数,它其实就是一个最简单的linear belan。

然后呀你如果希望它长得更smooth一些,你可以用quadratic belin,quadratic belin就是下面这个图里面的红色的线,零点就是这个黄色的线,然后你可以用cube cubic。

它就是下面这个蓝色的线,你可以看到,当这个b splay它的变得复杂程度变高以后,它的计算量其实也稍微变得更高一些,如果你是零六的话,你就要取一个f a b s对吧,你就要取一个浮点数绝对值就可以了。

但quadratic呢你就得算平方操作,cubic就有三次方的操作,然后一般来说大家用linear和quadratic,用的比较多,cubic实际上用的相对来说比较少一些。

因为quetic一般已经足够smooth了,linear有什么问题,linear它不够smooth,然后有的时候会导致你的模拟系统,就不是特别稳定,所以project一般是大家用的最多的。

特别是在m p m里面,在flip里面大家在流体里面大家会用liner,然后后面我们会讲,ok那么我们来看一看particle excel,particle degrade怎么个写法啊。

其实也非常简单了,这边假设我们是用一个sales center grid,也就是说我们的呃,节点呢是放在每一个cell的中心,那这是什么意思,也就是说我的每一个cell,他的顶点的位置是dx的倍数对吧。

比如说这个点就是零零,然后这个点呢是dx 0,这个点呢就是2d x0 ,那么所有的呃,所有的这个node它的位置其实就是必须是多少,加上0。5的dx,比如说这一个note,它就是2。5d x0。

5dx横坐标2。5呃,纵坐标0。5,ok啊,然后如果说我们用这样一个规则规则的情况,我们对于每一个例子啊,对每一个particle in x,这个x就是所有的particle的位置。

那么我们得计算它能够它的3x3的范围里面,左下角的那么一个节点坐标是什么,对吧,那么怎么来算呢,首先我们把节点的位置,我们so sorry,我们把我们把粒子的位置乘上一个inverse dx。

也就是说我们把它除掉dx,那么我们其实就是把物理空间里面的连续的位,置,把它转化到了网格空间里面的呃,这呃这个离散的位置对吧,我们除掉dx粒子,除掉dx,然后减0。5,为什么减0。5呢。

注意我们这边格点的位置是和呃,它的位置一定是0。5,dx他一定一定有这个0。5dx分量在里面,所以我们把这边减到0。5,ok然后呢我们算这个quadratic display的这个权重。

然后这个权重算出来以后,注意我们这边其实是一个所有的这些操作啊,全部都是二维的向量的操作,所以我这边其实算了多少多少个值,我算了六个值对吧,三个值是x分量,三个值是y分量。

然后我们把这个权重x和y方向上的权重,分别算出来以后呀,我们每一举它的范围里面的3x3的node对吧,node就是格点了,然后我们对于每一个note。

每个note它有一个相对于左下角的node的offset对吧,这offset其实就是什么,其实就是ig对吧,我们i j是从03呃,呃i从03,这个从0~3权重是啥呢,然后i是x方向上的偏移对吧。

那么我们取权重的x分量,然后第一个vector,然后取权重的d y分量比这个vector,然后我们就把x分量上的权重,和y分项的权重给它乘起来,得到了它这个节点的权重,然后呢我们就得把信息。

把这个particle上面的信息给他写到节点上面,注意我们这边每一个节点它存了两种信息,第一种信息是你真的物理量,这个真的物理量就是你的权重乘上你的物理量,给它叠叠加上去,那另外一个信息。

另外一类信息非常非常重要,是什么,就是你的权重只有你的权重,为什么呢,因为你有些地方可能例子多,有的地方可能粒子少,所以呢你就希望去呃把我的权重也算一算,然后这样我们就可以去做。

用权重呢去做一下normalization,这样实现一个守恒啊,这边可能稍微有点需要理解一下,其实就是每一个从每一个节点的视角来看,它的物理量是什么,它的物理量就是周围的particle。

立particle的物理量的加权平均,那你加权平均,你加了权,那你总得把全的和算出来,然后把全除掉吧,总总有一个全的normalization的过程,所以呢他也需要去算一算权重的和,除了物理量的核以外。

ok那么刚才说了,我们这个有一个权重的和,那么其实就是gram这个物理量对吧,然后我们在做完particle degrade以后,我们得做一下great normalization,对吧对吧。

物理量硅上面物质要除以这个权重,首先呢我们得我们只需要处理,权重大于零的grade就可以了,如果说它的权重是零的,这个根本就不在particle能够触及的范围之内,我们也就不需要去处理它。

那么对于所有权大于零的例子呃,这个网格点呢我们就把它的速度除掉,它的权重对吧,这个速度其实是有加权平均,所以我们要除掉甲醛和这个非常容易理解,那么做完那往往你做完normalization以后。

你得去做各种像pressure projection啊,之类的各种操作对吧,那么我们这边就呃忽略掉pressure projection,或者忽略掉我们节点上面受力的计算了,我们直接考虑呃。

grade particle,我们直接考虑它的advation的部分,和刚才其实规律particle刚才其实一模一样对吧,我们还是要算一下它左下角节点的坐标,然后算它的权重,这个和刚才一模一样。

然后我们局部啊有一个叠加变量是这个v,就是accumulate呃,我们把所有的网格上面的v都加圈以后,叠加到局部的这个v的一个和对吧,其实非常容易,这个其实非常容易理解,其实就是每一个例子。

把周围的节点上面的速度给他收集一下,然后重新收集到这个例子上面,那么算出来这个新的v啊,我们就可以呃,我们可以把这个x用我们先移动这个例子,我们把x用上一步时间的v,然后乘上dt该累加上。

当然你这边也用新的v也是可以的,这边其实是一个呃显示欧拉法,那如果用新的v呢,然后我们用新的b去更新粒子的b,这应该还是总体来说是非常直观的,那么刚才我们讲的其实只是particle excel。

那么如果说这个纯particle excel其实没什么用对吧,因为你只是在移动例子,你没有做什么有意义的操作,那么particle excel呢,往往可以和基于网格的泊松求解器联合起来。

然后得到一个流体模拟器,ok那么它的这个simulation cycle是长啥样的,其实和刚才非常简单,我们在particle,particle,particle to grad,操作里面。

去把速度从particle transfer到grade上面,一般这个这一步大家会用scatter,然后great normalization,然后呢我们在规则规则上面去解它的pressure。

解完pressure以后呢,我们把这个呃pressure apply在你的速度场上面,apply到速度场以后,我们用g9 p的操作,从你的速度场去gather information。

然后从网格到粒子上面,那么然后接下来我们可以根据呃,这个无伞的速度场去移动一个例子,注意它这边已经变成了,由于我们有一个pressure projection的过程,这边新的速度上就是无伞的五散。

主要是为了什么,主要是保持体积对吧,你是incompressible fluid,这个时候你移动例子的时候,你可以用2k two three four,你都可以愿意用一个高阶格式的话,会更准确一些。

那么我其实有一个demo,这个是我老早写的,ok我们来看一看这个demo,可以稍微用命一下,啊这个是我老早写了本科手写了,换了1080ti的机器,现在我们可以随随便便就上最高分辨率了。

我们来稍微调一下这个体积,subs steps给它调大哦,我还不能缩小,这边还有个重要的参数,我得调整零,这个其实就是一个particle excel simulation。

注意你做particle excel的时候,你要记得把这个demo里面的flip blending,给它调成零,因为如果你的这个flip blending不是零的话,它会把一些flip的成分也包含进去。

这边我后面会解释什么是flip,ok你可以看到它体积不是很守恒,是因为我们的,这个sober他的迭代次数不够多,这个地方没有用,country ingredients。

这个地方由于为了gpu上面实现方便,我们是用的jo be对吧,大家可以在自己机器上玩一玩,你可以看到这是一个party excel simulation,它是流体的,它总体来说看起来不是特别好。

它看起来会稍微有一点点,如果你特别是比如说,我们把分辨率稍微调低一点,这样它可以,你可以看到它很多的这个涡量啊,它这个旋转这个旋涡转着转着模拟模拟就没了,特别是你分辨率越低的话,它这个数值耗散就会越大。

比如说这个128x128,它看起来非常灵,就像一团糖浆,或者说呃也不能说蜂蜜也分,当然没有蜂蜜这么甜,可能是蜂蜜和水的混合物那种感觉,一般来说大家看到这种情况就会说它过于一点,然后不太会使用。

所以这个party excel有一个什么问题,他这个能量耗散就比较严重,一般大家很少直接使用party incel,那么为什么会有能量耗散呢,我们来看一个最最最简单的。

particle incel的一个demo,这个大家代代码包里面其实是有的,叫pick versus a pig,我们可以来跑一跑,我把它启动一下。

ok这是一个最简单的party political excel的demo,然后我们现在是用的,你看底下有一个scheme,你可以用a来切换这个scheme,那个按a的话,我们还没有讲到apex。

所以我们现在就只考虑这个pk,如果说我们把这个速度场,初始成一个translational的速度,成比如说向右的速度上啊,你会看到它移动的是非常顺畅的,注意啊。

我为了防止它跑出我的simulation demin,我就再把它的速度在边界上面做了一下clamping,把他位置climb clip一下,防止它跑出去,你看到他的如果是平移的话,它是非常顺畅。

但是呢如果说我按一下r,把它的初始速度设置成一个rotation的话,你会你会发现它转着转着它就不转了,这个就非常头疼,因为你在模拟流体里面,你很多时候有这个窝对吧。

他war本质上就是流体在做主tation,那他不转了,你这个就很影响流体的效果,那类似的呢,我还可以把它按,我还可以按键盘上的d把它设置成dation,设置,带雷神以后,它就是一个拉长的效果。

你会发现啊,呃这个dation它也有问题,他这个拉着拉着它就自己就不移动,理想状况下呢,它应该是我可以看大家看一下,理想中的话,这个dation应该是不停的在拉伸自己。

ok那我再切换回我们的这个呃particle in ca skin,那么还有一个sharing这个运动,sharing就是这个剪切的运动,这个剪切的运动它其实也不能保持,他就模拟着模拟着能量就耗散掉了。

那么为什么会有这种现象呢,这个就是你得考虑它的,great to particle的这个传输的时候啊,它就会有这个信息的丢失,为什么呢,假设我们只有一个例子,kernel support是3x3的话。

那么我们有33x3=9个格点,每一个格点上假设我们传输了,我们只传输速度啊,那只传输速度的话,每一个格点上有x分量和y分量的速度对吧,那它其实有18个自由度在格点上面。

但是你的particle上面有几个自由度,你八六上面的速度,你只有x方向,x方向上速度和y方向上速度,你八六上面只有两个自由度,那你这个传输的时候,从18个自由度一下子变成只有两个自由度。

你是不是就得丢失信息对吧,那么怎么样来解决这个问题呢,有两套解决方案,第一套解决方案呢是,我们不要只在例子上面保留两个自由度,我们可以传输一些信息对吧,我们粒子上我们可以在网格上面看一看。

他是不是还有旋转的这个分量啊,它有个角速度,有没有一些sharon的分量,有没有dlational的这个分量,我们都把它记下来,两个方法,这两个都是比较接近的方法,比较呃最近提出来的方法。

epic是2016年seagraph,然后polypg是我没记错的话,2017年的c graph asia,在呃,都是在通信学里面提出来了两套模拟的方法,另外一个呢另外一套搞法呢。

就是说我不transfer更多的信息,但是呢我呃不把所有的信息都通过grade,来传传输,我只通过gree传输一个dota,传输一个dota,这样我们就能在party上面保持一些信息。

ok那么我后面会介绍flip这个方法,那么apex其实直观上来说是非常容易理解的啊,刚才我们看到如果我们只用pc的话,它只有这个constant,它只有这个常量速度场的两个分量对吧。

这是一个v0 和v1 ,我们这边用零表示x分量,一表示y分量,就是呃x轴和y轴,那么实际上我们刚才看到,我们刚才还有很多常见的速度的呃模式,比如说我们有这个c00 ,c0 是什么,是dation。

是x分向上的dational的这个分量,就说它沿着x它的速度不是一样的,你的x越大,它的速度越大,它其实就是在拉伸你的材料对吧,这个叫c00 ,还有c10 ,c10 呢是一个sharing的这个动运动。

它随着你的x的增加,你的y方向的速度会增加,它是一个sharing的一个mod,一般来说大家会叫这些速度场的这个pa叫做mod,然后pk的话其实只有两个mod,apex,它的mode就会更多一些。

ok那么然后还有什么,还有c01 ,c01 什么也是一个sharing,随着y变大,你x方向这个向右的速度也会变大,类似的还有c1 ,c一是y方向上y方向上的dation。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

比较复杂,实现起来却异常简单的一个搞法啊,这个他的直观上理解也非常非常容易,我记得我是第一次看到这个apex的论文的时候,我觉得好像非常复杂,另一个时候我大概大三上学期的时候,我记得非常清楚。

因为算法的复杂,这个数学上的复杂程度和实现的复杂程度,反差过大,所以这个算法给我留下了很深刻的印象,呃,大家可以在哔哩哔哩上看一看这个epic的视频,这个强烈推荐这个整个视频啊。

包括这个论文写的都是极其的通俗易懂,而且呃写的可以说这个paper writing以及这个video,它的制作质量都非常非常的高,我强烈建议大家去看一看,你会觉得收获颇丰,即使你不能理解其中的数学。

你光从他的high level idea上面去理解一下也非常好。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

之前我们刚才看了这个旋转的这个mod,用pc的话,它就叫流量都没了对吧,但是apex它的particle,degrade和grade particle都是角动量守恒的,然后这个推导比较复杂。

大家可以去看两篇文章,一篇文章是发在西瓜上面,这个推导,大家有兴趣可以看看,没兴趣的话,你不看也没有关系,大家可能看到刚才很多,可能很多同学在这边会被刚才那个推倒吓到了,说这玩意儿实现起来效果这么好。

然后数学上公式有那么复杂的,实现起来是不是也很复杂,其实完全不是,它实现起来只要三行代码就可以了哈,这个呃可能都不是三行完整代码,就2。5行代码就非常容易呃,我们来看这个p two g和g9 p操作。

那p9 g操作呢,其实和刚才的pk几乎是一模一样对吧,那唯一的一个变化呢就是我这边有一个i fine,这个所谓fm particle excel吗,它有一个f一的速度场。

这个fm速度场我们再从particle,转移到规则的时候呃,除了我们去呃转移particle本身的速度,这个平移速度这个v我们还得转移呢,它的一个局部的这个fi速度,i fi速度场是什么呢。

呃fm入场就是你的这个c乘上d p o s,d p o s是这个节点的位置,减去particle粒子得到一个数值,然后这个是一个矩阵乘法,这个具体的数学上推导,我们会在下一讲里面更深入的讲解。

这一讲呢我们只讲具体实现,因为你如果能实现出来,那你就有更多的兴趣去研究它背后的数学公式,一开始就讲数学公式可能比较枯燥,对于我这种学计算机的人来说,当然你如果是数学公理非常好,你如果是学应用数学。

那你可能会先想想推公式,但我相信大部分同学还是比较喜欢,先把它实现出来,再去讲其中的道理,ok然后这个是p9 g g two p呢g6 p的时候,你得去算一算你的c对吧,那算这个c其实也非常容易。

就算c其实你只要去对于每个节点,你把它对c的贡献给它叠加起来就可以了,那这个地方就有一个一系列系数,然后一个有一个这个是output a,这个是两个向量的外籍,这个具体为什么是这样啊,我们先留一个悬念。

下下一讲再讲,这一讲大家就先接受它,就是这样,ok那么可以看到这个公式,可以这个实现可以说是非常非常简单了,那么我们来跑一跑,刚才我们跑的是pick,我们同样的程序,什么样的效果,还记得吗。

pick我不管给他什么样运用,除了translation pick是好了,这个是还是用pig translation pick是好的,我看看dation pick不行,然后sharing pk也不行。

rotation呢pk更不行了啊,rotation可以认为是dation和sharing,组合起来得到的东西,那么现在我按一下a,你可以看到我这边有一个scheme,你可以用a按a来切换scheme。

我们来按一下a,我们现在把它切换到了epic,那这个时候我们看看translation和pc一样,pick translation也没啥问题对吧,我们来看rotation。

你可以看到他这个rotate起来就非常的,相当的流畅,rotation不会出现pick刚才亮的呃,转着转着就能量耗散掉的情况,我们再看一下pick,我们按一下啊,sorry sorry,我们换一下a。

把它换成pick,你看他就不行了,那sharing呢,sharing也没有,完全没有任何问题,打雷神呢,打雷神也没有任何问题,呃呃我们和这个pick dation比较一下。

pk雷神和能量耗散非常非常之快对吧,因为pick它倾向于去smooth你的输入场,他会不断的把你的速度场去平均化,但是dation呢他们思路上每一点都是不一样的,那你在嗯做pig的时候。

你的速度上就会被逐渐的抹平,抹平了以后它就不动了,好可以看到这个epic是像可以说是效果惊人啊,很多时候大家还不满足,那这个时候就会有一个polypc,polpc是什么个搞法呢。

你可以看到刚才我们节点上其实有三乘,3x2呃,横向三个节点,纵向有三个节点,每个节点两个component是18个自由度,那么polypc,就说我例子上面能不能也用18个自由度。

我例子上面也用18个自由度,那么我从呃假设我只有一个例子,那我从great to的传到粒子上面,就是两个都是18个自由度,如果他们这18个自由度还都是线性相,线性无关的话。

那么我是不是就可以呃做到一个无损的传输,那无损的传输过来,它这个能量的宝石是不是就更好了对吧,这个就是polypc的核心想法,他其实在epic上面更上一层楼,我用更多的mod去呃。

做这个transfer,那这个polyfic,它其实你可以看到,它除了有我们刚才说的这个linear,这个constant和linear这些mod以外,它还有blinear和quatic。

这个实现起来就稍微更复杂一些了,但是它的效果其实也是不错的,这个是一个more more tex的一个模拟呃,你可以看到polypc,它其实就能保持更多的这个mortastic。

然后这边还有一个flip flip,我们会后面再讲,那么flip想法是什么呢,flip他的想法就是我不gather物理量,我们去gather物理量在规的操作上面的增量。

然后我把这个增量gather到particle上面,在gdp的时候,我们只去收集它增量,然后直接把这个增量呃,apply在例子上面,这个增量是啥呢,在你去不可压缩流体的时候。

你增量一般就是这个pressure projection和边界条件对吧,那你做固体模拟的时候,你的增量的就是它裁掉的内里,他的这个内力当然除了内力以外,还有这个边界条件对吧,然后有一些做vfx的同学。

可能会直接用flip来指代一整个solver,那就他可能会觉得flip是一个呃,使用了quin style pressure projection,加上flip。

the vection free ser呃,这个在业界有的时候也会这么说,但是flip它本身只是一个用来遗留的格式,它并不是一个整个的solar,但是有的时候大家会喜欢用flip来说,是整个sol。

这边可能有一点会让人摸不着头脑,所以我额外来讲一讲,这个flip其实也有些历史了,这个flip他是一开始是在jcp,1986年他就提出来了,然后第一次被引入到graphic里面,是2005年。

那么pick flip,他在实现的时候到底有啥区别呢,其实啊区别很小,很pick里其实就是直接从你的呃,下一个时间步的速度场上面gather回来,flip呢他不我刚才说了flip,他不gather呃。

速路上,注意我这边下标是i的话,就是grades,然后下标是p的话就是particle,我去gather什么,我去gather的是新的速度场和旧的速度场的差,我把它gather回来。

然后呢我把它叠加到例子上面,旧的纸上面,那么其实我信息就不完全是从particle degrade,然后归咎particle,对吧,我多了一条particle to。

particle的这个这么个信息路径,这个就能避免很多信息的丢失,如果你纯party to grade,然后graded particle,那你会丢掉很多信息,ok那么flip有什么问题。

flip它就是一般来说有的时候会非常noisy,然后他会看起来噪声非常大,那么pig又过于dissipative,那么有没有什么办法能够取长补短呢,当然有办法啊,这个时候大家就会搞一个叫做flip,0。

99的搞法,什么叫flip 0。99,flip,0。99,就是0。99乘上flip的这个这个操作,加上0。1乘上pc的操作,那你就可以呃,相对来说给flip也引入了一些pick的单品。

pick damping是非常非常大的,你就算只有0。10。01的pick,那你这个单品已经足够了,我们来看看demo,你可以看到,嗯这个ok这个地方有一个flip blending。

这个显示上稍微有点问题,我就如果说我把它调成一,就是纯flip的话,你可以看到它表面是非常noisy,它这个例子就是整个,你可以看到它表面非常的buy对吧,他这个效果不是很好。

这个flip他其实也有很多种实现的方法,很大的一个差别是你做完速度更新以后,你到底是用pick的速度场去移动你的速度,还是用flip的速度场去移动你的速度,这个实现呢是用flip速度上去移动你速度。

它实现出来就会非常非常的easy呃,如果你用pk速度上去移动,速度还会就会稍微好一点,但是这个里面就没有实现另外一种方法,那么我们怎么样让它变得不挪isy的一种搞法,就是你用pg对吧,我把它移动移到零。

你看我用纯pick,那它就完全不同a z,但它也非常的不energetic,他就没有能量,能量很快就耗散掉了,那么我就希望去把它中间来个差值,pick和flip的差值,你可以看到。

这样的话他就没有那么noisy,然后它的也能保持很多能量,这个就其实比较好,一般来说大家呃在用flip的时候,都会blend进去一点,pick这个demo大家可以去玩一玩。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

ok那么讲了这么多格式啊,那到底用了用哪一个呢,那么我的建议呢就是如果你刚开始的话,建议你使用epic,为什么呢,因为pc基本上不用pick,它过于呃过于单品了,他就是单品过的。

他这个能量很多模式很快就没了,然后为什么不建议开始用popolypc,或者用flip呢,因为polypc商相对来说实现起来更复杂一些,那么如果要精益求精,你完全可以用polypick。

但是它实现起来稍微稍微复杂一些,然后flip flip的话就实现起来,然后它实现起来会比较noisy,它比较noisy,而且它的实现起来的时候。

你得多开一个grade来去存新的grade和旧的grade,这样你才能算出grade dela对吧,你就要多allocate一个great呃,这个各种feel,所以实现起来稍微复杂一些。

刚才演示的只要三行代码就可以实现了,对于存储非常友好,他不需要去备份你的速度上,同时呢它保持你的angular momentum,看你的角动量是恒的,而且非常stable,然后视觉效果也比较好。

相当于他在各种方法里面站在一个呃,甜点是swiss boss这么一个位置,后面我们会讲m m p m是在干啥哦,有同学有一个问题是particle特别多,内存还是比flip多,他我觉得他意思是。

当你粒子占的内存很多的时候,那网格上的内存是不是就可以忽略不计,那这个完全是讲呃,有的时候粒子上占的内存会很多呃,特别在m p m里面,你的例子会有很多,m p m也是一种混合方法,后面我们会听到。

然后你如果是在模拟流体的时候,你的每一个great cell里面,二维里面你往往会有至少四个例子,三维里面至少有八个例子,所以这样看起来的话,其实例子上用的占用的空间啊,是比规则上面占用空间要多很多的。

所以确实很多时候规则的空间。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

大家是忽略不计的,这个是个很好的问题,那么我们就讲到了npm,终于讲到了npm,这个课最终极的目标其实就是讲npm呃,m p m它是一个混合欧拉朗日模拟的scheme。

之前我们讲scheme嘛都是只有a vection对吧,我们呃你要做projection的,你得用一个别的multique server,或者m g p c g to solve,它的压强。

但是m p m它就是一个stand alone的一个schema,他,拉格尔例子和欧拉网格来完成整个模拟的过程,然后如果既然它是一个整个的simulation,scheme的话。

那你particle它存储的东西就不只是速度,它要存好多好多东西,比如说前面梯度,比如说你的现在的体积,比如说呃,你如果是要模拟一些各种别的材料的话,你可能还得存各种别的物理量。

npm在strap里面是非常呃热门的话题,最近几年是非常火,2020年可能就有至少五篇paper是桨叶片,然后最早的时候他是south ky他们去研究出来的,然后在1996年左右。

最早被大概这个时候被提出来,然后第一次引入到graphics里面,然后在graphic里面发扬光大的是,第一次引入的是2013年,然后最早的时候是用来模拟血,最近几年m p m是非常非常热门的话题。

有好多好多paper都是gb m p m,这个polo上面有很多可以研究的,比如说你polo上面各种材料模型,你可以去研究,可以研究血,然后泡沫,然后沙子啊。

各种各种各样grade上面呢你用规律用什么data structure,可以用space grade,可以用open bdp,你可以用multiple grid,多个grid。

然后你当然也可以用太极来表示它的grid,然后particle degree transfer,这中间transfer刚才也讲了很多,比如说pick a pic,然后polypc还有gmp对吧。

还有moving these quares,后面我们要讲m s m p m就是moving this quest,transfer,还有一个叫compatible fat的格式。

它是其实是用来模拟切割的,以及m p m和钢铁的耦合,这个课程里面我们就不讲cpu。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

但是m s是一个非常有意思的东西,我们会讲到刚才说到呀,呃最早的时候m p m是按模拟学的,然后这个是迪士尼的这个电影叫冰雪奇缘,然后当时npm还是非常慢的,这个场景模拟了。

据说是模拟了一个星期才模拟出来,当然现在大家有gpu的大家,然后有m s这些各种技巧以后,m p m其实已经可以跑的非常快了,然后再加上太极这个编程语言的加成,所以现在大家可以基本上用88行代码。

写一个能在自己电脑上跑的npm,基本上没有任何难度呃,可以看到它这个整个算法的发展过程,它的复杂程度和性能都是在不停的在被优化的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

mm到底为什么poplar它有很多很多很好的性质,比如说它能自动的把不同的材料给它混合起来,你可以在m p m里面模拟这个立体模拟固体,然后关键的material这个叫颗粒状材料。

比如说沙子或者米饭什么的,都可以用来模拟,然后呢它还可以自动handle collation,自动的字体和字体的碰撞,然后别不同材料之间的碰撞都可以用,然后他的它会有自动的fraction啊。

你一个m p m,你把它拉伸拉的太长了以后,它自动会就会断裂,但是这个fracture并不是数值,并不是一个呃准确的反馈,但是很多时候这个fire也够用了,后面有时间的话,我们可能会提到他有m p m。

也可以和这个连续伤害模型cdm给它整合起来,然后有一套方法叫cd m p,是一个最近的一个比较好的saber paper,后面如果有时间我们也会提到m p m呢,还非常擅长模拟大型变。

这个大型变在graphics里面做,visual effects里面是非常受欢迎的,对吧,你这个一个角色,你总是希望他这个扭来扭去,或者耳朵拖得非常长,或者呃被某一个子弹打了以后发生很大的变形。

就很夸张嘛,大家很喜欢看这样的效果,在动画里面非常有用,然后他既用了呃格子应用的例子,它是一个hybrid欧拉拉格朗日方法,这个欧拉网格啊。

在这边除了其实这边就不是用来做pressure projection,但你也可以做pressure projection,但更多时候大家用欧拉网格是为了去resolve collection。

self collision,然后两个粒子碰撞与碰撞的过程。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

是通过欧拉网格来实现,但是大部分物理量还是存在粒子上面,ok那么我们来看一看最早的时候,npm他的这个simulation cycle是好有好多好多部,他有接近啊,不是接近他,就是有十部。

它是首先你有state,然后你做p图g到grade上面,然后grade上面呢你还得去呃asmate下particle volume,这一步我们现在已经不做了,然后你在龟上面还得算这个算它的受力。

然后各种更新,然后帮边界条件,有可能你还要做implies solver,你得做一个影视的时间积分,这个我们下一讲会讲,然后更新到例子上面,然后这样不断的一个流程,可以说还是比较复杂的,你要实现起来。

当时聊实现m p m还是相当复杂的,我记得我当时实现的时候,可能实现了有个有个一个月,那个时候我还是个本科生,然后什么都不懂这个当然。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

但是这个算法本身就比较复杂,然后这个是他的早期的时候的实现方法呃,这个大家可以去看一看,还是思路比较清晰的,但是步骤比较多,但是今天我们就不讲这个复杂的方法,我们直接讲简单的讲。

我们在2018年的时候提出来这个mm p movie girl,s p,所以呃他是一个其实是一个比较新的方法,因为它的前前置工作,而是在这个科技树的前一个节点,在16年才解锁。

然后我们在2018年是我本科的时候,在蒋老师实验室,可能是一个暑假做的一个一个项目,还是挺有意思的,然后他有什么好处,他需要用的flops就是浮点数操作,是比呃传统m p m要少了1/2。

相当于他快了两倍,因为mp m它是一个computer b操作,所以我们还是希望去降低它的负电数次数的,如果是mei bb,降低复联数也没有意义,没有意义,但它是个computer b。

然后它比传统mp m容易实现很多很多,非常非常容易实现,然后用太极的话,88行代码就可以实现,然后太极里面有好多demo,大家可以跑一跑,我可以给大家演示几个。

今天呢我们会后面会go through一下,这个m88 是怎么实现的,我这边就给大家呃跑一跑这个m p m88 ,m88 ,其实就是一个最简单的m p m fluid solver,对吧。

它是一个比较简单的,只有一个材料,再看一下它是其实效果还是不错的,你用了apex,就它能比较好的保持面的这些窝的这些效果,然后呢太机里面还有一些别的例子,比如说npm 99,那我就直接把这个拖到这了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

pm 99,99行代码呢,这个里面就有三种材料,有一个这个液体,然后有一个红色的,这个是呃果冻,你可以认为是弹性物体吧,各种都可以,然后嗯白色的是雪,白色的是血,但你如果觉得这个不可交互。

你可以跑m p m21 128,他其实每个代码都差不多,只是加了几条代码,就是更多的材料以及一些用户界面之类的,这个里面你可以用通过拖动鼠标啊,来去操作这些mp例子,这个好像按r k reset。

如果把它不小心全部搞坏了,你可以按一下r reset就可以了,这个是没有重力的,我可以按一下w s d给它加重力,啊反正就是一个几比几几比较好玩的一个demo。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

大家可以去跑一跑。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那么接下来我们讲一讲,这个88和代码到底咋实现啊,其实npm啊,和之前讲的apex其实已经非常非常像,m s m p m基本上就是epic,再加上十几行代码去加入npm的一部分。

然后他和之前的party excel啊,这些hybrid alering,a ring的方法其实是非常接近的,你首先要做一个party degree,这个呃把粒子传输到格子上面对吧。

然后再做great operation,然后再做great to particle,其实和之前一模一样,唯一的区别呢就是说你在做p6 g的时候,你可能得算一算每个例子。

它的coaches stress以及它的coaches stress,对于每一个greek note上面的贡献好。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

那么我们来看一看具体代码呃,首先我们看这个88行代码的前21行,那其实就是一个很典型的太极代码的前半部分,他前半部分一般是我们去定义一些常数对吧,我们有8192个例子好,当然最重要的请记得要初始化太极。

得指定gpu后端,然后他会在coda或者open gl啊,或者在metal上面运行,然后我们的grade呢,是128x128的,ok然后我们指定一个时间不长dt。

然后每个party呢有一个自己的boom和density,然后质量呢就是volume chandacity对吧,然后我们还有一个bug modules,这边e它就是它的sten,在液体里面就是bug。

modulus,体积模量,ok然后我们来看一看他的subs step kernel,substep knel里面第一部分就是p6 g对吧,你会发现它非常非常像,唯一一个区别就是我多了一个stress。

这个stress是什么呢,stress就是液体被压缩以后,它有一个抵抗压缩的过程,这个它就会在通过一个coaching stress来体现出来,它就会给每一个粒子都会去推开周围的例子。

当然它不能m p m的例子和例子,从来不直接用的,它是通过先推开周围的网格来实现这个操作,那对于这个stress呢,你看我这边除了呃我这边还有刚才还是一样。

epic就是我把每一个例子的transitional velocity,切给它,叠加到grade node上面,然后还有个i fine这这么一个成分,呃,fine里面刚才apex里面的fn就是c。

但是m s m p m里面的f又多,除了c以外还多了一个stress的分量啊,这也要稍微注意一下,它有一个stress分量,那么其实你可以看到m m s m t m是高度,做做最小化改动一个好处是什么。

第一它省计算,因为我可以我这边可以把stress和epic,他这个c给它叠加到一起,统一的用一个fm matrix来来存储,然后这样我在scatter的时候,我就不需要先scattered它的力。

再scatter它的呃,这样我的计算量就少了一倍,然后还更简单对吧,这个地方其实你去看传统m p m,这个地方实现起来还是不容易的,那么接下来啊,great normalization。

这个大家应该都很熟悉了,刚才讲到,我们只需要对质量大于零的地方去做,normalization,这个44行前面其实就是pc epic,polypc前面的normalization,45行以后是啥。

45行以后是边界条件对吧,如果说一个节点它靠近边界太近了,我就得去给把它的速度的某个分量给它设成零,这是最简单的边缘条件,大家可以去理解一下到底在干啥,这边由于时间关系,我就不细讲了。

最后一步是great parle,greg particle和epic其实也非常非常像吧,那其实这边基本上就是完全就是epic,68号之前都完全就是epic,唯一一个区别就是71行,71行。

我们这边更新了一下j j是什么,j是这个粒子的体积,我们怎么更新j呢,一加上dt乘上epic,它的这个c的trace,epic的c的trace是什么,我们来回忆一下a p h。

这个c矩阵到底是什么物理含义,你看到c矩阵还有四项,其中有两项,这个c00 和c11 c0 c一是dation,它的分量对吧,这个dation是c里面,唯一会影响体积变化的两个分量。

因为你如果去share你的材料的话,它体积是不会变化的,当然你只有用这个c00 ,它的你去在横向上去拉他或者c1 ,在纵向上去拉它,它的体积才会变化,然后cd加c一是什么,就是c的trace。

那么c的trace乘上dt,再加上一就是你的呃体积的变化率,那么我们把这个j去乘上这么个体积的变化,就可以得到下下一个实验部的j,那么这边是一个fluid的这个流体的模型。

流体模型里面的力完全就是由j来控制的,那么最后呢就变进到了我们主程序部分,我们得初始化这个例子对吧,然后我们创建一个窗口,在窗口里面不断的去调这个subset,注意你每次做m p m这个cycle之前。

你得去把你的grade上面的速度和质量,都给它设成零,所以啊这就是88行代码哈,其实只有87行代码,但是为了中国人喜欢八嘛,就是我们就叫它88行代码版本就ok了,这88行代码版本还是比较容易实现的。

这个大家每个人应该都可以去尝试实现一下,好那么我们来回顾一下,今天呢我们主要讲了,混合欧拉拉格朗日的这些scheme,那么他的核心思想呢,就是用particle来track你的material去追踪你。

material,你的可能是material上面可能会存位置,可能会存速度,如果你是在做npm的话,你听说上面还会存在formation,用rider呢来去更新你的力的场或者速度的场。

你可能在fluid里面,你会在规则上面做一下quin projection,在你的npm里面,你可以在规则上面去算一下koshi stress,在规则上面的导致了这个内力。

这样我们就有了一个pick这个方法,然后为了减轻pg dissipation,有两套模式对吧,第一种是我们传更多的,传更多的这个information,我们可以加入更多的mod,比如说epic。

epic加入了一个局部的iphine速路上,polypg呢,polpg加入更多的局部的polynomial速度上,另外一种方式呢是用flip flip,不去传输我们的这个所有的物理量。

我们去传输物理量调查对吧,这样就变成了flip这个方法,当然pick和flip可以blender在一起,最后呢我们简单讲了一下,它增加了代表量其实非常非常少。

你是相当于是用particle去存你的deformation information,然后再用epic去传输,你的例子上的各种受力也好,deformation green update也好。

这个理论我们下一讲会提到,大家只要记得m s m p m和epic,真的是非常非常相近了,如果大家想学习更多npm的内容呢,大家可以去看张老师和joe特曼,还有angel sally这些。

其实呃npm最早的五个researcher,他们在sf 2016年上做的这个课程,还是质量非常高的,他们有个cosnow是cosnow的。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

堪称呃最我看过的最well written the course note,它整个公式啊都非常的清晰,大家可以去看一看,其实里面也介绍了各种连续介质力学啊,可以说图文并茂。

学习起来的事还是非常非常不错了。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

我们最近2019年,我们在surah上面还有一个呃,如果大家对高性能感兴趣,可以去看一看这个高性能的cosnote,然后如果说大家想学更多npm的paper的话,可以看蒋老师的paper list。

这个是一个npm最近的paper,所有的配合者集合在蒋老师的主页上,ok那么今天就到这了,我看看有没有什么问题需要解答的,还是有不少问题的,啊我有同学说p to g的一部分,这个加等于。

因为你不同的例子,可能会同时去accumulate到同一个good node对吧,这边就有个data race,那么这个加等于在太极里面是自动的,omic,这个我们之前其实也提到过呃。

有的版本里面可能会写tian atomic ad,把它显示的写成atomic,但我们这边是用的是自动atomic,在太极里面所有的加等于都是自动的tommy,如果你不要加,不用自动的tommy怎么办。

你就写成规的v,这个等于规律v加上它其实就你不用加,等于你用a等于a加b把它显示写出来,那就是butommy怎么做到不可压缩的啊。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这个是个好问题,这个例子真的不可压缩吗,这个m p m128 88,这个里面它其实是弱可压缩的一个weekly compressible,它不完全是不可压缩的,这边其实是用他的。

你可以看到我刚才提到bug mojs对吧,其实这个是一个可压缩流体啊,但是它看起来不太可压缩,就是这个其实它是可压缩的,那它怎么保持体积的呢。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

是因为我们通过维持了维护了这个j,然后这个j你可以看到它,j这边会算出一个stress,他这个stress是jp减去一,然后乘上了一坨系数对吧,呃当你的j小于一的时候。

它就会有一个推开周围格点上速度的这个题,至大于一的时候,它就会有嗯拉近周围割裂上速度的这么一个力,所以它其实是通过j来保持自己的体积。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值