在OpenFOAM中,我们用函数divDevReff
与 divDevRhoReff
来计算剪切应力。
1.函数名称含义
下面,解释这两个函数名称的由来:
∇
⋅
τ
=
∇
⋅
σ
d
e
v
\nabla \cdot \tau=\nabla \cdot \sigma^{dev}
∇⋅τ=∇⋅σdev
关于这个公示的推导可查看Cauchy应力张量、剪切力张量与压力的关系。
div
:散度(divergence);dev
:每个二阶张量都可分解为dev
部分(deviatoric)和hyd
部分(hydrostatic);R
:雷诺时均(Reynolds-Average Simulation);eff
:有效的(effective)流动方式,包括 层流(laminar)或湍流(turbulent);rho
:取决于流体密度是否发生变化。
由此,不难判断divDevReff
用于不可压缩流体,divDevRhoReff
用于可压缩流体 。
2.不可压缩流
2.1代码解读
对于turbulence->divDevReff(U)
,即操作对象turbulence
通过指针调用名为divDevReff(U)
的函数。该函数声明如下:
(文件位置:)
tmp<fvVectorMatrix>laminar::divDevReff(volVectorField &U) const
{
Return
(
-fvm::laplacian(nuEff(), U)
-fvc::div(nuEff()*dev(T(fvc::grad(U))))
)
}
注意:计算过程中,采用的是运动粘度。方程一部分用了隐式(fvm),而另一部分用了显式(fvc)。此外,还调用了一个名为dev()
的函数:
//- Return the deviatoric part of a tensor
template<class Cmpt>
inline Tensor<Cmpt> dev(const Tensor<Cmpt>& t)
{
return t - SphericalTensor<Cmpt>::oneThirdI*tr(t);
}
(文件位置:$FOAM_SRC/turbulenceModel/incompressible/RAS/laminar/laminar.C)
2.2函数方程
关于函数dev()
,可以简单地理解为一个矩阵的dev
(deviatoric part)部分:
A
d
e
v
=
A
−
A
h
y
d
=
A
−
1
3
t
r
(
A
)
I
\mathbf A^{dev}=\mathbf A-\mathbf A^{hyd}=\mathbf A-\frac13 tr(\mathbf A)\mathbf I
Adev=A−Ahyd=A−31tr(A)I
函数dev()
的参数为速度场的转置梯度矩阵:
A
=
[
∇
U
]
T
\mathbf A =[\nabla \mathbf U]^T
A=[∇U]T
我们对代码进行重写:
-fvm::laplacian(nuEff(), U)
=
−
∇
⋅
(
ν
e
f
f
(
∇
U
)
)
-\nabla\cdot\left(\nu^{eff}(\nabla \mathbf U)\right)
−∇⋅(νeff(∇U))
-fvc::div(nuEff()*dev(T(fvc::grad(U))))
=
−
∇
⋅
(
ν
e
f
f
∗
d
e
v
(
(
∇
U
)
T
)
)
-\nabla\cdot\left(\nu^{eff}*dev((\nabla \mathbf U)^T)\right)
−∇⋅(νeff∗dev((∇U)T))
d e v ( ( ∇ U ) T ) = ( ∇ U ) T − 1 3 t r ( ( ∇ U ) T ) I dev((\nabla \mathbf U)^T)=(\nabla \mathbf U)^T-\frac 13 tr((\nabla \mathbf U)^T)\mathbf I dev((∇U)T)=(∇U)T−31tr((∇U)T)I
将上述代码整合在一起,有:
−
∇
⋅
R
e
f
f
=
−
∇
⋅
(
ν
e
f
f
(
∇
U
)
)
−
∇
⋅
(
ν
e
f
f
[
(
∇
U
)
T
−
1
3
t
r
(
(
∇
U
)
T
)
I
]
)
-\nabla\cdot \mathbf R^{eff}=-\nabla\cdot\left(\nu^{eff}(\nabla \mathbf U)\right)-\nabla\cdot \left(\nu^{eff} \left[ (\nabla \mathbf U)^T-\frac 13 tr((\nabla \mathbf U)^T)\mathbf I \right] \right)
−∇⋅Reff=−∇⋅(νeff(∇U))−∇⋅(νeff[(∇U)T−31tr((∇U)T)I])
整理,可得:
−
∇
⋅
R
e
f
f
=
−
∇
⋅
(
ν
e
f
f
[
∇
U
+
(
∇
U
)
T
−
1
3
t
r
(
(
∇
U
)
T
)
I
]
)
-\nabla\cdot \mathbf R^{eff}=-\nabla\cdot \left( \nu^{eff} \left[ \nabla \mathbf U+(\nabla \mathbf U)^T-\frac 13 tr((\nabla \mathbf U)^T)\mathbf I \right] \right)
−∇⋅Reff=−∇⋅(νeff[∇U+(∇U)T−31tr((∇U)T)I])
根据CFD张量公式
t
r
(
∇
U
)
I
=
t
r
(
(
∇
U
)
T
)
I
=
(
∇
⋅
U
)
I
\mathrm{tr}\left(\nabla\mathbf{U}\right)\mathbf I=\mathrm{tr}\left((\nabla\mathbf{U})^{\mathrm{T}}\right)\mathbf I=\left(\nabla\cdot\mathbf{U}\right)\bf I
tr(∇U)I=tr((∇U)T)I=(∇⋅U)I
对于不可压缩流连续性方程
∇
⋅
U
=
0
\nabla\cdot \mathbf U=0
∇⋅U=0,则:
−
∇
⋅
R
e
f
f
=
−
∇
⋅
(
ν
e
f
f
[
∇
U
+
(
∇
U
)
T
]
)
=
−
∇
⋅
(
2
ν
e
f
f
[
1
2
(
∇
U
+
(
∇
U
)
T
)
]
⏟
‘
形
变
率
D
‘
)
=
∇
⋅
τ
-\nabla\cdot \mathbf R^{eff}=-\nabla\cdot \left( \nu^{eff} \left[ \nabla \mathbf U+(\nabla \mathbf U)^T \right] \right)=-\nabla\cdot \left( 2\nu^{eff} \underbrace{\left[\frac12 \left( \nabla \mathbf U+(\nabla \mathbf U)^T \right) \right] }_{`形变率 \mathbf D`} \right)=\nabla\cdot \tau
−∇⋅Reff=−∇⋅(νeff[∇U+(∇U)T])=−∇⋅⎝⎜⎜⎛2νeff‘形变率D‘
[21(∇U+(∇U)T)]⎠⎟⎟⎞=∇⋅τ
对于不可压缩流, 1 3 t r ( ( ∇ U ) T ) \frac 13 tr((\nabla \mathbf U)^T) 31tr((∇U)T) 应该恒等于零,是可以忽略的,但考虑到连续性不可能百分百为零,这里我们将其作为误差引入进去。
3.可压缩流
对于可压缩流,调用turbulence->divDevRhoReff(U)
函数。该函数包含关键字Rho
,这说明在计算可压缩流的剪切应力时,需要考虑由密度变化引起的膨胀粘度项。
3.1代码解读
函数divDevRhoReff(U)
tmp<fvVectorMatrix>laminar::divDevRhoReff(volVectorField &U) const
{
Return
(
-fvm::laplacian(muEff(), U)
-fvc::div(muEff()*dev2(T(fvc::grad(U))))
)
}
注意,这里我们应用的是dev2()
函数,这种新函数的代码如下:
//- Return the deviatoric part of a tensor
template<class Cmpt>
inline Tensor<Cmpt> dev(const Tensor<Cmpt>& t)
{
return t - SphericalTensor<Cmpt>::twoThirdI*tr(t);
}
3.2 函数方程
关于函数dev2()
,可以理解为一个矩阵减去两次hyd
部分
A
d
e
v
2
=
A
−
2
A
h
y
d
=
A
−
2
3
t
r
(
A
)
I
\mathbf A^{dev2}=\mathbf A-2\mathbf A^{hyd}=\mathbf A-\frac23 tr(\mathbf A)\mathbf I
Adev2=A−2Ahyd=A−32tr(A)I
经整理(方法同上),其方程为:
−
∇
⋅
R
e
f
f
=
−
∇
⋅
(
2
ν
e
f
f
[
1
2
(
∇
U
+
(
∇
U
)
T
)
]
⏟
‘
形
变
率
D
‘
−
2
3
μ
e
f
f
(
∇
⋅
U
)
I
)
=
∇
⋅
τ
-\nabla\cdot \mathbf R^{eff}=-\nabla\cdot \left( 2\nu^{eff} \underbrace{\left[\frac12 \left( \nabla \mathbf U+(\nabla \mathbf U)^T \right) \right] }_{`形变率 \mathbf D`}-\frac23\mu^{eff}(\nabla \cdot \mathbf U)\mathbf I \right)=\nabla\cdot \tau
−∇⋅Reff=−∇⋅⎝⎜⎜⎛2νeff‘形变率D‘
[21(∇U+(∇U)T)]−32μeff(∇⋅U)I⎠⎟⎟⎞=∇⋅τ