最近自己也是在学相场格子Boltzmann方法,这篇笔记主要是在整理刚学到的内容。

控制方程

相场和表面张力

相场采用局部守恒性 Allen-Cahn 方程描述[1,2],其核心量为序参数 ϕ\phi 。控制方程为:

ϕt+(ϕu)=Mϕ(2ϕ(λn))\frac{\partial \phi}{\partial t} + \nabla \cdot (\phi \boldsymbol{u}) = M_{\phi} (\nabla^2\phi - \nabla\cdot(\lambda\boldsymbol{n}))

其中

  • MϕM_{\phi} 为迁移率 (mobility)。
  • n=ϕ/ϕ\boldsymbol{n}=\nabla\phi/\|\nabla\phi\| 是界面法向量。
  • λ=4(1ϕ)ϕ/W\lambda = 4(1-\phi)\phi/WWW 为界面厚度,通常可以取 5 个格子单位。

表面张力通常采用如下形式:

Fs=μϕϕ\boldsymbol{F}_s = \mu_\phi \nabla \phi

化学势 μϕ\mu_\phi 定义为:

μϕ=4βϕ(ϕ1)(ϕ0.5)k2ϕ.\mu_\phi = 4\beta\phi(\phi-1)(\phi-0.5) - k \nabla^2\phi.

kkβ\beta 取决于界面厚度 WW 和表面张力 σ\sigma

k=3σW/2,β=12σ/Wk = 3 \sigma W /2, \quad \beta = 12 \sigma / W

注: Open Access的文献[1]非常详尽地介绍了这一部分的推导,这里不做赘述。

流场

流场的控制方程组分为两个式子,这里我们简单讨论两种不可压流体的情况。

连续性方程为:

u=0,\nabla \cdot \boldsymbol{u} = 0,

Navier-Stokes方程为:

(ρu)t+(ρuu)=p+[μ(u+(u)T)]+F\begin{aligned} \frac{\partial (\rho\boldsymbol{u})}{\partial t} &+ \nabla \cdot (\rho \boldsymbol{u} \boldsymbol{u}) = - \nabla p\\ & + \nabla \cdot [\mu (\nabla\boldsymbol{u} + (\nabla\boldsymbol{u})^\mathrm{T})] + \mathbb{F} \end{aligned}

其中

  • ρ,u,p\rho, \boldsymbol{u}, p 分别为流场密度、速度和压强。
  • μ,ν\mu, \nu 分别为流体的动力粘度和运动粘度。 μ=ρν\mu = \rho\nu
  • 外力 F=Fs+G\mathbb{F} = \boldsymbol{F}_s + \boldsymbol{G}Fs\boldsymbol{F}_s 为表面张力, G\boldsymbol{G} 为其他体力 (如重力)。

描述两相流的双分布函数

相场

分布函数 fif_i 用于描述相场,其演化方程为:

fi(x+ciδt,t+δt)fi(x,t)=1τf[fi(x,t)fieq(x,t)]+Fi(x,t)δt(1)\begin{aligned} f_i (\boldsymbol{x} &+ \boldsymbol{c}_i \delta_t, t + \delta_t) - f_i (\boldsymbol{x}, t) =\\ &-\frac{1}{\tau_f} \left[f_i (\boldsymbol{x}, t) - f_i^{eq} (\boldsymbol{x}, t)\right] + F_i (\boldsymbol{x}, t) \delta_t \end{aligned} \tag{1}

其中,相场中的平衡态 fieqf_i^{eq} 用的是1阶截断的形式:

fieq=ωiϕ(1+ciucs2).f_i^{eq} = \omega_i \phi \left( 1 + \frac{\boldsymbol{c}_i \cdot \boldsymbol{u}}{c_s^2} \right).

式(1)里的作用力项 FiF_i 为:

Fi=(112τf)wics2ci[(ϕu)t+cs2λn].F_i = \left( 1 - \frac{1}{2 \tau_f} \right) \frac{w_i}{c_s^2} \boldsymbol{c}_i \cdot \left[ \frac{\partial (\phi \boldsymbol{u})}{\partial t} + c_s^2 \lambda \boldsymbol{n} \right].

松弛时间 τf\tau_f 由迁移率 MϕM_{\phi} 计算:

Mϕ=(τf12)cs2δtM_{\phi} = (\tau_f - \frac{1}{2}) c_s^2 \delta_t

序参数 (order parameter) ϕ\phi 是用于描述多相流的等效流体密度 ρ\rho 的参数。若记液相和气相密度分别为 ρl\rho_lρg\rho_g,则:

ρ=ϕρl+(1ϕ)ρg.\rho = \phi \rho_l + (1 - \phi) \rho_g .

而式(1)的模型中, ϕ\phi 可表示为: ϕ=ifi\displaystyle\phi=\sum_{i}f_{i} .

混合流体的运动粘度 ν\nu 同样可以由 ϕ\phi 进行分配,如上图所示。具体的计算方式包括:

(1)阶跃函数 ν(ϕ)={νg,ϕ<0.5νl,ϕ0.5\displaystyle\nu(\phi)=\begin{cases}\nu_g,&\phi < 0.5\\ \nu_l,&\phi \ge 0.5\end{cases} 。 其中 νg\nu_gνl\nu_l 分别为气相和液相的运动粘度。

(2)线性函数 ν(ϕ)=ϕνl+(1ϕ)νg\displaystyle\nu(\phi)=\phi\nu_{l}+(1-\phi)\nu_{g}

(3)倒数的线性形式:1ν(ϕ)=ϕνl+1ϕνg\displaystyle\frac{1}{\nu(\phi)}=\frac{\phi}{\nu_{l}}+\frac{1-\phi}{\nu_{g}}。这种形式具有二阶可导的特点。

流场

分布函数 gig_i 用于描述流场,其演化方程为:

gi(x+ciδt,t+δt)gi(x,t)=1τg[gi(x,t)gieq(x,t)]+Gi(x,t)δt(2)\begin{aligned} g_i (\boldsymbol{x} &+ \boldsymbol{c}_i \delta_t, t + \delta_t) - g_i (\boldsymbol{x}, t) =\\ &-\frac{1}{\tau_g} \left[g_i (\boldsymbol{x}, t) - g_i^{eq} (\boldsymbol{x}, t)\right] + G_i (\boldsymbol{x}, t) \cdot \delta_t \end{aligned} \tag{2}

局部平衡态 gieqg_i^{eq} 需要使用下面的版本,以保证速度场的无散性。

gieq={pcs2(ωi1)+ρsi(u),i=0pcs2ωi+ρsi(u),i0(3)g_i^{eq} = \begin{cases} \frac{p}{c_s^2} (\omega_i - 1) + \rho s_{i}(\boldsymbol{u}), & i = 0\\ \frac{p}{c_s^2} \omega_i + \rho s_{i}(\boldsymbol{u}), & i \neq 0\\ \end{cases} \tag{3}

其中

si(u)=[ciucs2+(ciu)22cs4uu2cs2]ωis_{i}(\boldsymbol{u}) = \left[ \frac{\boldsymbol{c}_i \cdot \boldsymbol{u}}{c_s^2} + \frac{(\boldsymbol{c}_i \cdot \boldsymbol{u})^2}{2 c_s^4} - \frac{\boldsymbol{u} \cdot \boldsymbol{u}}{2 c_s^2} \right] \cdot \omega_i

源项为

Gi(x,t)=(112τg)ωi[uρ+ciFcs2+uρ:(cicics2I)cs2]=(112τg)ωi[ciFcs2+(ρlρg)uϕ:(cici)cs2](4)\begin{aligned} G_i (\boldsymbol{x}, t) &= \left(1 - \frac{1}{2 \tau_g}\right) \omega_i \left[ \boldsymbol{u} \cdot \nabla \rho + \frac{\boldsymbol{c}_i \cdot \mathbb{F}}{c_s^2} + \frac{\boldsymbol{u} \nabla \rho: (\boldsymbol{c}_i \boldsymbol{c}_i - c_s^2 \boldsymbol{I})}{c_s^2} \right]\\ &= \left(1 - \frac{1}{2 \tau_g}\right) \omega_i \left[ \frac{\boldsymbol{c}_i \cdot \mathbb{F}}{c_s^2} + \frac{(\rho_l - \rho_g) \boldsymbol{u} \nabla\phi: (\boldsymbol{c}_i \boldsymbol{c}_i)}{c_s^2} \right] \end{aligned} \tag{4}

式(4)用到了 ρ=(ρlρg)ϕ\nabla \rho = (\rho_l - \rho_g) \nabla\phi 进行化简。

所以,宏观量的计算为:

ρu=δtF2+icigi,p=cs21ω0[i0gi+δt2uρ+ρs0(u)]=cs21ω0[i0gi+δt2(ρlρg)uϕ+ρs0(u)].(5)\begin{aligned} \rho \boldsymbol{u} &= \frac{\delta_t \mathbb{F}}{2} + \sum_{i} \boldsymbol{c}_i g_i ,\\ p &= \frac{c_s^2}{1 - \omega_0} \left[ \sum_{i \neq 0}{g_i} + \frac{\delta_t}{2} \boldsymbol{u} \cdot \nabla \rho + \rho s_{0}(\boldsymbol{u}) \right]\\ &= \frac{c_s^2}{1 - \omega_0} \left[ \sum_{i \neq 0}{g_i} + \frac{\delta_t}{2} (\rho_l - \rho_g)\boldsymbol{u} \cdot \nabla\phi + \rho s_{0}(\boldsymbol{u}) \right]. \end{aligned} \tag{5}

相场梯度

A=cs2τfδt\displaystyle\mathcal{A}=-c_s^2 \tau_f \delta_t, B=Mϕλδt\displaystyle\mathcal{B} = M_{\phi} \lambda \delta_t, 和 C=δt2ϕu+ici(fifieq)\displaystyle\mathcal{C} = \frac{\delta_t}{2}\phi\boldsymbol{u} + \sum_{i}{\boldsymbol{c}_i (f_i - f_i^{eq})}
则:

ϕ=CBA,ϕ=CA+B/ϕ.(6)\|\nabla\phi\| = \frac{-\|\mathcal{C}\|-\mathcal{B}}{\mathcal{A}} , \quad \nabla\phi = \frac{\mathcal{C}}{\mathcal{A} + \mathcal{B}/\|\nabla\phi\|}. \tag{6}

化学势 μϕ\mu_\phi2ϕ\nabla^2\phi 部分则用 ϕ\nabla\phi 的差分进行计算。

当然,也有完全使用差分的计算公式

{ϕ(x)=i0ωiciϕ(x+ciδt)/cs2δt,2ϕ(x)=i02ωi[ϕ(x+ciδt)ϕ(x)]/cs2δt2\begin{cases} \nabla\phi(\boldsymbol{x}) &= \sum_{i \neq 0} {\omega_i \boldsymbol{c}_i \phi(\boldsymbol{x} + \boldsymbol{c}_i \delta_t)} / {c_s^2 \delta_t} ,\\ \nabla^2\phi(\boldsymbol{x}) &= \sum_{i \neq 0} {2\omega_i [\phi(\boldsymbol{x} + \boldsymbol{c}_i \delta_t) - \phi(\boldsymbol{x})]} / {c_s^2 \delta_t^2} \end{cases}

绕过化学势的相场模型

值得一提的是,Tim Reis [3] 提出了一种不需要计算 2ϕ\nabla^2\phi 的相场LBM模型。该方法主要是修改了流场分布函数 gig_i 的平衡态和源项,所以这里只讲与流场相关的部分(相场部分可以看他的文章)。

定义表面张力为 Fs=T\boldsymbol{F}_s = \nabla\cdot\mathrm{T},其中毛细张量(capillary tensor) T\mathrm{T} 写作:

T=σ(Inn)δS\mathrm{T}=\sigma (\boldsymbol{I} - \boldsymbol{n}\boldsymbol{n}) \delta_{\mathrm{S}}

δSϕ\delta_{\mathrm{S}}\simeq\|\nabla\phi\| 是界面delta函数(surface delta function)。

Tim Reis 基于多尺度展开结果,把 T\mathrm{T} 的作用写进修正的平衡态分布函数里,

gieq=ωi[pcs2+ρciucs2+12cs4(ρuu+T):(cicics2I)],g_{i}^{eq}=\omega_i \left[ \frac{p}{c_s^2} + \rho \frac{\boldsymbol{c}_i \cdot \boldsymbol{u}}{c_s^2} + \frac{1}{2c_s^4}(\rho\boldsymbol{u}\boldsymbol{u}+\mathrm{T}):(\boldsymbol{c}_i \boldsymbol{c}_i - c_s^2 \boldsymbol{I}) \right],

这使得化学势 μϕ\mu_\phi 的计算被约去了,且外力项也仅剩一个重力 G\boldsymbol{G} 。在这种构造下,源项 GiG_i 也要被分为两部分

Gi=(112τg)[Ri(G)+Si]G_i = \left(1 - \frac{1}{2 \tau_g}\right) [R_i(\boldsymbol{G}) + S_i]

其中 Ri(G)R_i(\boldsymbol{G}) 为外力项

Ri=ωi(ciucs2+ciucs4ci)G,R_i = \omega_i \left( \frac{\boldsymbol{c}_i - \boldsymbol{u}}{c_s^2} + \frac{\boldsymbol{c}_i \cdot \boldsymbol{u}}{c_s^4} \boldsymbol{c}_i \right) \cdot \boldsymbol{G},

SiS_i 为修正项

{Si=(Γiωi)(ciu)ρΓi=(1+ciucs2+uu:(cicics2I)2cs4)ωi\begin{cases} S_i = (\Gamma_i - \omega_i) (\boldsymbol{c}_i - \boldsymbol{u}) \cdot \nabla\rho \\ \Gamma_i =\left( 1 + \frac{\boldsymbol{c}_i - \boldsymbol{u}}{c_s^2} + \frac{\boldsymbol{u}\boldsymbol{u}:(\boldsymbol{c}_i \boldsymbol{c}_i - c_s^2 \boldsymbol{I})}{2c_s^4} \right) \omega_i \end{cases}

宏观量的计算也要变成

{igi=pcs2δt2(u)ρigici=ρu+δt2G.\begin{cases} \sum_i g_i = \frac{p}{c_s^2} - \frac{\delta_t}{2} (\boldsymbol{u} \cdot \nabla)\rho \\ \sum_i g_i \boldsymbol{c}_i = \rho \boldsymbol{u} + \frac{\delta_t}{2} \boldsymbol{G} \end{cases}.

参考文献

带有 '※' 标记的文章意味着可通过免费渠道获得,如:开放获取 (Open Access);Research gate;arXiv预印本;Sci hub;作者主页等。

[1] ※ WANG H, YUAN X, LIANG H, et al. A brief review of the phase-field-based lattice Boltzmann method for multiphase flows[J]. Capillarity, 2019, 2(3): 33-52. DOI:10.26804/capi.2019.03.01.

[2] ※ LIANG H, XU J, CHEN J, et al. Phase-field-based lattice Boltzmann modeling of large-density-ratio two-phase flows[J]. Physical Review E, 2018, 97(3): 033309. DOI:10.1103/PhysRevE.97.033309.

[3] ※ REIS T. A lattice Boltzmann formulation of the one-fluid model for multiphase flow[J]. Journal of Computational Physics, 2022, 453: 110962. DOI:10.1016/j.jcp.2022.110962.

最近刚刚刷到一个叫 Mathlive 的库,突然一想 Hexo 也是把 Markdown 转成 html 的,那就尝试了一下 Mathlive 的效果。

导入

我只是在 Markdown 开头补了一个从 CDN 加载的 <script>,然后又从官方的script tag方式里面抄了一小段:

1
2
3
4
5
6
<script defer src="https://cdn.jsdelivr.net/npm/mathlive"></script>
<script>
window.addEventListener("DOMContentLoaded", () =>
MathLive.renderMathInDocument(),
);
</script>

尝试

从它的文档来看,支持的LaTeX命令好像挺多的。

math-span

输入:<math-span>e^{i\pi} + 1 = 0</math-span>
效果为:e^{i\pi} + 1 = 0

我也试了使用 $$e^{i\pi} + 1 = 0$$
结果得到 $$e^{i\pi} + 1 = 0$$

【注,用 $$ 得出的默认渲染结果是会自动跨行的,用 $ 无法渲染。】

math-field

输入(关于 styling 可以查看对应文档):

1
2
3
<math-field style="font-size:1rem; display: block">
x=\frac{-b\pm\sqrt{b^2-4ac}}{2a}
</math-field>

结果:

x=\frac{-b\pm\sqrt{b^2-4ac}}{2a}

一个简单的可视化 LaTeX 公式编辑器

详情参见 https://mathlive.io/mathfield/guides/interacting/

目前它比较简陋,仅在 PC 浏览器下的渲染效果较好。

html 实现
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<div>
<math-field id="formula" style="font-size:1.5rem; display: block; max-width:100%"> </math-field>
<textarea id="latex" autocapitalize="off" autocomplete="off" autocorrect="off" spellcheck="false" style="display: flex;width:100%"></textarea>
<script>
const mf = document.getElementById("formula");
const latex = document.getElementById("latex");
mf.addEventListener("input",(ev) => latex.value = mf.value);
latex.value = mf.value;
// Listen for changes in the "latex" text field,
// and reflect its value in the mathfield.
latex.addEventListener("input", (ev) =>
mf.setValue( ev.target.value, {silenceNotifications: true} )
);
</script>
</div>
0%