GAMES103.王华民.11.Incompressible Fluid Dynamics and Eulerian Fluids(2)
Navier-Stokes 方程
- Low-speed, Incompressible, Viscous Navier Stokes’ equations
- 低速、不可压缩、带有粘滞性的流体
NS 方程
- 流体速度场的更新:NS 方程
- 不可压缩条件(Incompressibility)
\[ \nabla\cdot\mathbf{u}=0 \]
- 动量(Momentum)
- 如何求解上述偏微分方程?
- Method of Characteristics:拆分 PDE 的不同部分,分步求解
求解 NS 方程
S1-External Acceleration
- 在这里我们先假设外部加速度只有重力加速度
\[ \dfrac{\partial{\mathbf{u}}}{\partial{t}}=\mathbf{g} \]
- 对所有的墙更新 \(u,v\)
\[ v_{i,j}^{new}\leftarrow v_{i,j}+\Delta tg \]
S2-Advection
\[ \dfrac{\partial{\mathbf{u}}}{\partial{t}}=-(\mathbf{u}\cdot\nabla)\mathbf{u} \]
- 展开如下
\[ (\mathbf{u}\cdot\nabla)\mathbf{u}= \begin{pmatrix} u\cdot\dfrac{\partial{u}}{\partial{x}} + v\cdot\dfrac{\partial{u}}{\partial{y}}\\ u\cdot\dfrac{\partial{v}}{\partial{x}} + v\cdot\dfrac{\partial{v}}{\partial{y}}\\ \end{pmatrix} \]
- 求解方式1:计算得到右边的值,然后类似于 S1 的方式求解
- 不稳定
- 原因:当时间步长 \(\Delta t\) 比较大的时候,估算得到的一阶导数不准确
advection
- 由于水分子的流动,\(t\) 时刻网格内的水分子不再是 \(t-\Delta t\) 时刻的水分子,因此需要用新的水分子的速度替换掉原来的速度
- 如上图所示,\(\mathbf{x}_1\) 位置的水分子是上一时刻在 \(\mathbf{x}_0\) 位置的水分子,因此需要使用 \(\mathbf{x}_0\) 位置水分子的速度 \(\mathbf{u}(\mathbf{x}_1)\) 替换掉 \(\mathbf{u}(\mathbf{x}_1)\)
- 拉格朗日方法没有这个问题,因为本身就是定义在粒子上的,这一时刻的粒子和上一时刻的粒子是同一个
Semi-Lagrangion Method
- 半拉格朗日方法
- 思路:对于一个点 \(\mathbf{x}_0\),推断上一个时刻这个点的位置
\(\mathbf{x}_1\),然后用 \(\mathbf{x}_1\) 的速度替换掉即可
- 下面的 comupte 就是利用双线性插值计算
- 对于交错网格,\(u,v\) 分开计算
- 细分:小步长精度更高
- 数值方法
- 边界问题:倒推之后发现在边界怎么办?
- clamp,不让它越界
- 是个稳定的方法,但是大的步长会有误差
- 误差表现为模糊(源自插值)
S3-Diffusion
\[ \dfrac{\partial{\mathbf{u}}}{\partial{t}}=\mu\Delta\mathbf{u} \]
- 分别对 \(u,v\) 做拉普拉斯平滑
- 大步长可能会不稳定(\(v\Delta t\) 太大)
- 使用小步长计算
- 可以使用隐式积分来做
- 比较复杂,利用小步长也能做出类似效果
S4-Pressure Projection
- 利用压强进行更新
\[ \dfrac{\partial{\mathbf{u}}}{\partial{t}}=-\nabla\mathbf{p} \]
- 压强定义在网格中心,因此表达起来很方便
压强
- 如何计算/更新 \(\mathbf{p}\)
- 压强产生的原因:流体是不可压缩的
- 因此从散度为 0 开始推导(\(\Delta\mathbf{u}^{new}=0\))
- 因此得到方程组,把所有的方程组联立求解线性系统
- 边界条件
- Dirichlet boundary (open) \(p_{i-1,j}=P\)
- Neumann boundary (close) \(p_{i-1,j}=p_{i,j}\)
- 真实的墙
- 求解得到 \(p\) 之后便能够计算得到速度 \(u,v\)
- pressure projection
- 利用压强对速度进行投影,使得更新之后的速度满足不可压缩的条件
参考实现
- Jos Stam. 1999. Stable Fluids. TOG (SIGGRAPH).
Air and Smoke
烟雾模拟
- 烟雾模拟的两个步骤
- Step 1:更新速度
- Step 2:更新其他物理量
- 烟雾:颜色、密度
- 可以利用 Semi-Lagrangian 的方法更新,理解和 advection 类似,这些物理量都是会被例子带着走的,因此可以通过找到之前的位置,使这个位置的物理量进行更新
- 边界
- 开放空间:Dirichlet boundaries
- 密闭空间(container):Neumann boundaries
水的模拟
- 水的模拟比较复杂
- 水是有形状的,我们实际上模拟的是水和空气的表面,但是我们实际上只会模拟水而不是一起模拟水和空气
- 水在整个过程中并不会占满整个空间,只会占据一部分空间,如何表达部分空间的占用?
- 水有自己一套表达的方式
表达方式
- Volume-of-fluid(VoF):体积的表达方式
- 划分为小格子,然后告诉你这个格子中被液体占据的百分比
- 不精准
- SDF:有向距离场
- 保存到水面的距离
更新方式
- Semi-Lagrangian
- Level set:对距离函数进行更新的一种方法
- 问题:volume loss issue
- 上面两种方法在模拟过程中水的体积会发生改变,因此需要修正
导出数据
- 如何将得到的体数据导出为 mesh 用于渲染
- marching cube
实现
流体仿真书籍
- Level Set Methods and Dynamic Implicit Surfaces.
- Osher and Fedkiw.