不可压缩 Navier-Stokes 的制造解决方案 - 如何找到无散速度场?

计算科学 纳维斯托克斯 不可压缩 确认
2021-12-03 05:26:41

在制造解法 (MMS) 中,假设一个精确解,将其代入方程并计算相应的源项。然后将该解决方案用于代码验证。

对于不可压缩的 Navier-Stokes 方程,MMS 很容易导致连续性方程中的(非零)源项。但并非所有代码都允许连续性方程中的源项,因此对于这些代码,只有具有无散速度场的制造解才可以。我为一个域找到了这个例子Ω=[0,1]2

u1=cos(πx)sin(πy)u2=sin(πx)cos(πy)
在一般 3D 情况下,如何制造无散度速度场?

3个回答

使用向量流函数或取两个梯度的叉积。即: 其中是您选择的向量场,或 其中是您选择的两个标量场。

u=×A
A
u=f×g
fg

很难让速度既没有发散又规定了边界条件,但是只要您的代码允许您为边界条件设置任意函数,就应该没问题。

ETA:当然,你的动量方程必须接受一个强制函数,但我总是觉得强制动量方程比在连续方程的右手边添加一个更好。

这不是一个普遍的答案,但对于 Navier-Stokes 方程,有描述实际流动的制造解。例如,Kovasznay 流场是一种流行的选择:

http://link.springer.com/article/10.1007/BF00948290

原始参考资料是:Kovasznay LIG,“二维网格后面的层流”。过程。剑桥哲学。社会学杂志,第 44 页,1948 年。

这就是我通常做的。

定义流线函数:

Ψ=[ψxψyψz]

速度等于:

u=×Ψ=[ux=yψzzψyuy=zψxxψzuz=xψyyψx].

现在您可以选择任何合理的零平均压力并构造一个强制项。

我发布了和齐次边界条件的 SymPy 示例代码,享受:Ω=[0,1]3

 from sympy import *

 x,y,z = symbols('x y z')

 X = Matrix([[x],[y],[z]])

 psi = zeros(3,1)
 psi[0,0] = sin(2*pi*x)*y**2*(1-y)**2*z**2*(1-z)**2
 psi[2,0] = x**2*(1-x)**2*y**2*(1-y)**2*sin(2*pi*z)

 curl_psi = zeros(3,1)
 curl_psi[0] = diff(psi[2],X[1]) - diff(psi[1],X[2])
 curl_psi[1] = diff(psi[0],X[2]) - diff(psi[2],X[0])
 curl_psi[2] = diff(psi[1],X[0]) - diff(psi[0],X[1])