在制造解法 (MMS) 中,假设一个精确解,将其代入方程并计算相应的源项。然后将该解决方案用于代码验证。
对于不可压缩的 Navier-Stokes 方程,MMS 很容易导致连续性方程中的(非零)源项。但并非所有代码都允许连续性方程中的源项,因此对于这些代码,只有具有无散速度场的制造解才可以。我为一个域找到了这个例子
在一般 3D 情况下,如何制造无散度速度场?
在制造解法 (MMS) 中,假设一个精确解,将其代入方程并计算相应的源项。然后将该解决方案用于代码验证。
对于不可压缩的 Navier-Stokes 方程,MMS 很容易导致连续性方程中的(非零)源项。但并非所有代码都允许连续性方程中的源项,因此对于这些代码,只有具有无散速度场的制造解才可以。我为一个域找到了这个例子
使用向量流函数或取两个梯度的叉积。即: 其中是您选择的向量场,或 其中和是您选择的两个标量场。
很难让速度既没有发散又规定了边界条件,但是只要您的代码允许您为边界条件设置任意函数,就应该没问题。
ETA:当然,你的动量方程必须接受一个强制函数,但我总是觉得强制动量方程比在连续方程的右手边添加一个更好。
这不是一个普遍的答案,但对于 Navier-Stokes 方程,有描述实际流动的制造解。例如,Kovasznay 流场是一种流行的选择:
http://link.springer.com/article/10.1007/BF00948290
原始参考资料是:Kovasznay LIG,“二维网格后面的层流”。过程。剑桥哲学。社会学杂志,第 44 页,1948 年。
这就是我通常做的。
定义流线函数:
速度等于:
现在您可以选择任何合理的零平均压力并构造一个强制项。
我发布了和齐次边界条件的 SymPy 示例代码,享受:
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])