extension
基于Lattice Boltzmannn Method的流体模拟器实现卡门窝街 Karman Vortex Street
卡门涡街现象:穿过物体的尾部有一连串交替分布的漩涡.(一个顺时针、一个逆时针)
(流体力学中的重要现象)
eg:水流过桥墩、风吹过烟囱、风吹过岛屿
概念
拉格朗日视角(随波逐流)
粒子节点sensor随着流体材料一起移动
观察粒子所处位置与速度
描述:拉格朗日粒子、三角网格

欧拉视角(岿然不动)
sensor永远不移动
观察穿过该点的流体材料的速度。
描述:网格



弹簧质点系统 Mass-spring System
模拟布料、头发等弹性材料。

每一个红点即为一个质点,每条白线为一根弹簧,怎么连接弹簧决定了布料的性质
Spring stiffness:指标数值越大,越“刚性”,强直;反之,越塌软。
damping:阻尼,指标数值越小,系统会更灵活,“晃动”,反之更黏滞。
原理
胡克定律+牛顿第二定律

胡克定律:在弹性限度内,弹簧的伸长量或压缩量与作用力成正比。
F=-k
δ
\delta
δx
- F表示物体所受的弹性力,方向总是与位移方向相反。
- k表示物体的弹性系数,表示弹簧的刚度,单位为牛顿每米(N/m)。越大的 k表示弹簧越硬
- x 表示物体所产生的形变量,表示弹簧被拉伸或压缩的长度,单位为米(m)。
胡克定律仅在弹性限度内适用,超出这一范围,弹簧可能会发生永久变形或断裂。‘
牛顿第二定律:f=ma,图中fi表示质点i受到相邻质点作用的所有外力
时间积分器
公式:连续 vs 计算机:离散世界
离散化:dt ->
δ
\delta
δt
假定:在
δ
\delta
δt时间内,a恒定计算Vt+1;v恒定计算Xt+1

- 前向欧拉法:根据现有状态直接推测下一个状态
- semi-implicit Euler(常用):也是根据现有状态直接推测下一个状态,区别于Forward Euler:计算位置时,用的Vt+1
- Backward Euler:implicit
Implementing a mass-spring system with symplectic Euler

显式积分器 vs 隐式积分器
显式时间积分器:未来状态只依赖于过去的状态。 (递推)易爆炸,适用于m大k小的弹性系统
隐式时间积分器:未来状态不仅依赖于过去的状态,而且还依赖于未来的状态。 复杂,难以实现、进而难以优化

弹簧在弹性范围内的振动是简谐振动,弹簧受力和位移的关系又满足胡克定律
弹簧的固有频率f,求倒数后得到振动周期T,
δ
t
≤
\delta t \le
δt≤ cT

隐式时间积分器:



如何解线性系统!!!
Jacobi迭代 / Gauss-Seidel迭代
共轭梯度(对称正定的系统,不满足找变种)

Jacobi迭代:每次迭代都把一个未知数的一项换成一个值,满足某行线性等式方程。
并不总是收敛的。(谱半径(特征值模长最大值)小于1,则收敛。)
积分时间器的统一


如果有成千上万个弹性质点和弹簧,解决思路:
- 稀疏矩阵(Sparse matrices)
- 共轭梯度(Conjugate gradients)
- 预条件(Preconditioning)
- 物理模型上对精度和速度上的取舍,如取基于位置的物理(position-based dynamics, PBD)
Smoothed particle hydrodynamics,SPH
光滑粒子法是一种拉格朗日无网格粒子方法。
它利用核函数对物理问题进行近似处理,用离散的粒子来描述宏观连续分布微观仍为粒子的流体,而每个粒子则携带了其所在位置的流体的各种性质,如质量、密度、速度、能量等。
光滑粒子法由Lucy(1977)和Gingold & Monaghan(1977)相互独立地提出,用于处理天体物理问题。之后,光滑粒子法扩展应用到气体动力学、不可压缩、爆炸、固体力学和弹性体等领域。
每个粒子携带一些物理量,再用一个核函数去近似一个连续的场。

邻近粒子贡献更多,距离远(超过h)的贡献少=0。
一个粒子和周围以h为半径的粒子中间有弹簧,SPH遵循的不是弹簧的胡克定律,而是通过积分插值理论来近似连续场量的值和导数。SPH方法通过离散采样点(粒子)来模拟流体行为,每个粒子携带某些场量,并通过从相邻粒子的值加权平均来计算粒子处的场量。
weakly compressible SPH, WCSPH
材料导数:跟着粒子一起移动的导数。
压强和导数会影响粒子的速度,压强越大,会让周围粒子远离该粒子,从而保持自己的体积。

SPH中算梯度的公式:并不准确,但保持对称性,从而能使动量守恒。

总体计算流程

变种SPH

从粒子运动速度考察时间步长的限制 (CFL condition)

加速SPH
Neighborhood search:枚举所有粒子O(n^2)----> 距离不超过h的所有邻近粒子 O(n)

使用Taichi实现结果可视化
导出图像:
1 ti.GUI.show(filename):不仅可以在屏幕上显示 GUI 画布,还可以将 GUI 中的图像保存到指定文件filename。文件格式由filename中的后缀指定(jpg、png、bmp)
2.ti.tools.imwrite(pixels.to_numpy(), filename):可以导出 Taichi field(ti.Matrix.field,ti.Vector.field, ti.field)和 numpy 数组 np.ndarray。
导出视频:
需要安装 ffmpeg
ti.VideoManager 可以帮助你以 mp4 或 gif 格式导出结果。
video_manager = ti.tools.VideoManager(output_dir=result_dir, framerate=24, automatic_build=False)
for循环里:video_manager.write_frame(pixels_img)
完成导出: video_manager.make_video(gif=True, mp4=True)
将 PNG 图片转换为视频
创建一个 40 FPS 的视频:ti video -f 40
将视频转换为 GIF:
指定FPS:ti gif -i video.mp4 -f40 来创建一个 40 FPS 的 GIF 文件
&spm=1001.2101.3001.5002&articleId=143642262&d=1&t=3&u=79447b04e3224152893c54c47aa98016)
1万+

被折叠的 条评论
为什么被折叠?



