Games201-欧拉法流体模拟
回答一个问题:在我这个点,材料以什么速度穿过我这个点
Material Derivatives材料导数
材料导数,两个成分,物理量关于时间和空间的导数
关于t的偏导是欧拉的分量,由于材料移动了,这个物理量的材料导数也会产生变化
比如温度的变化有两种成分,温度粒子不动也会产生变化的部分,粒子运动也产生另一部分的温度变化
不可压缩的NS方程
流体粒子的速度关于时间的导数有三个成分:
1、由于粒子的压强梯度,压强在空间中有变化,他就会受到压强对他的压力(?和变化有关系怎么说??)
2、黏性,一般回模拟会忽略
3、重力加速度
方程5,不可压缩的速度场不可以有散度,若有则局部的材料的密度就会有所变化,流体微团的密度变化=压缩或拉伸
把一个关于时间的偏微分方程PDE拆成很多的部分,让他们变得简单
1、advection 移动、平流,移动流体的场,通过当前速度场求下一个速度场
2、在上一步得出的速度场的基础上加外力
3、前两部可能会产生散度,这里加上压强的作用,加上压强后要求速度场散度为0
Advection
cell-center grid
均匀网格
把数据存在格子上的不同位置 staggered grid,把数据存在格子的不同位置
一个cell上各个非采样点的位置,需要使用Bilinear interpolation,一个按照面积的加权平均,加权平均会导致变糊
有很多的Advection schemes方案,每种都考虑了不同的情况,有不同的特性,数值黏性等等
Semi-Lagrangian advection
当你知道了一个上一个时刻的速度场如何求得当前时刻的速度,上一个时间步的速度就是双线性插值得到,把当前时间步粒子的位置按着上一个时间步的速度场采样然后往回移动,得出一个上一个时间步位置,当前时间步的速度等于在上一时间步在原来速度场的采样
Ordinary differential equation ODE 常微分方程
RK 1,RK 2方法,解决图像越变越小的问题
但是速度场还是会变糊
BFECC
解决越运行越模糊的问题,速度场模糊意味着能量衰减、数值的粘性,
先往前然后往回,得到一个advection error的量,得到一个修正量
Projection
求一个合适的压力场,使得我们的速度是没有散度的
看起来很像一种约束
拉格朗日乘子法https://www.zhihu.com/question/38586401
如何保证无散度?约束求解,这里11、12看起来很像联立求解
数据都存在网格上,需要建立一个离散的方程
求P的梯度用到了 拉普拉斯Operator
非常大的一个线性方程组
解线性方程组Ax=b
加粗的
方程组不是很大
PARDISO方法
direct solver,直接的方法,系统比较小解起来还是比较快的
较大的
Gauss-Seidel
(Damped)Jacobi
(Preconditioned) Krylov-subspace solver (conjugate gradients)
Solver之间也可以进行组合
A如何存储
Sparse matrix 稀疏矩阵
不存Matrix,其实是最高效的方法,计算其实包括很多从memory里拉取资源也是一种开销,其实很多情况一直不存只是算是很快的
Conjugate gradient方法
有共轭梯度无痛教程,其实还是很痛
迭代法求解 收敛就要看条件数、谱半径
矩阵的特征值、特征向量,一个矩阵作用在一个向量上只会让这个向量的长度发生改变,这个向量就是矩阵的特征向量,改变的倍数就是特征值
小条件数收敛的越快,大就慢需要更多的迭代次数
提高收敛速度还有一个暖启动,两个差别不是很大
通过PreCondition降低条件数
M取容易求逆的矩阵,对角阵容易求逆
Multigrid用的非常多,易于实现,效果好(收敛快)
多个格子合并成一个格子,建立一系列网格,小的网格可以使用直接解法
MGPCG
Multigrid preconditioned conjugate gradients
用来就做Precondition很好
解泊松方程都是使用MGPCG
欧拉法模拟
一般大家都比较喜欢看粘性比较小的湍流
无散流体体积可以保持的很好也就是不可压缩流体,需要很好的solver MPCG
Advection和projection就是重点
当有有散度的速度场被平均了,就会产生能量损失,称为数值粘性
流体界面的变化就是level set