请教porosityModel.C中diag()、source()和psi()的意思
-
在OpenFoam的多孔介质模型中,代码porosityModel.C定义了correct函数,其中提取了U方程的以下三项内容:
const volVectorField& U=UEqn.psi(); scalarField& Udiag= UEqn.diag(); vectorField& Usource=UEqn.source();
diag()
能够理解,应该是U方程系数矩阵的对角元素,那么source()
和psi()
呢?
李老师2012年在cfd-online里回复的一篇帖子里(The meanings of diag( ), source( ), psi( ) )提到source()
是代表系数矩阵的非对角元素
看了correct函数的代码也确实感觉source()
是非对角元素,那为什么非对角元素要取一个“源项”的名字呢?而且对于psi()
的意思也不太清楚。
关于多孔隙介质模型中源项的处理还有很多不理解的地方,希望能在这里向大神们多学习。 -
@东岳 在 请教porosityModel.C中diag()、source()和psi()的意思 中说:
感谢李老师的回复!
稍微有一点理解了,比如在icoFoam中这个源项是来自于上一个时间步的值:
\begin{equation}
S_{P}^{n}=\frac{V_{p}}{\Delta_{t}}U_{P}^{n}
\end{equation}
但如果是没有时间项的SIMPLE算法是不是这个源项UEqn.source()就没有值了呢?
主要是因为我的问题是在看porousSimpleFoam的代码时产生的。在porousSimpleFoam中的多孔隙模型DarcyForchheimer里面,源项的表达式为:
\begin{equation}
S=-(\mu d+\frac{\rho \left | U \right |}{2})U
\end{equation}
这一段代码应该是对应DarcyForchheimerTemplates.C中的apply()
函数:void Foam::porosityModels::DarcyForchheimer::apply ( scalarField& Udiag, vectorField& Usource, const scalarField& V, const RhoFieldType& rho, const scalarField& mu, const vectorField& U ) const { forAll(cellZoneIDs_, zoneI) { const tensorField& dZones = D_[zoneI]; const tensorField& fZones = F_[zoneI]; const labelList& cells = mesh_.cellZones()[cellZoneIDs_[zoneI]]; forAll(cells, i) { const label celli = cells[i]; const label j = this->fieldIndex(i); const tensor Cd = mu[celli]*dZones[j] + (rho[celli]*mag(U[celli]))*fZones[j]; const scalar isoCd = tr(Cd); Udiag[celli] += V[celli]*isoCd; Usource[celli] -= V[celli]*((Cd - I*isoCd) & U[celli]); } } }
代码的最后
Udiag[celli] += V[celli]*isoCd; Usource[celli] -= V[celli]*((Cd - I*isoCd) & U[celli]);
给
Udiag()
和Usource()
附了值,应该就是代表对U方程的修正,将源项的影响传入到U方程中,这样的理解是否正确?那在赋值之前,对于SIMPLE算法,Usoure()的值应该是为0的,是这样的吗? -
我没细看你这个代码,但是从
const tensor Cd = mu[celli]*dZones[j] + (rho[celli]*mag(U[celli]))*fZones[j]; const scalar isoCd = tr(Cd); Udiag[celli] += V[celli]*isoCd; Usource[celli] -= V[celli]*((Cd - I*isoCd) & U[celli]);
这几行来看,应该就是人工手动加的源项。对角部分
isoCd
和源项isoCd
部分可以抵消,但这样写可以增加对角占优那在赋值之前,对于SIMPLE算法,Usoure()的值应该是为0的,是这样的吗?
还需要确定是否有其他的源项。如果没有就是0
-
@东岳 在 请教porosityModel.C中diag()、source()和psi()的意思 中说:
这几行来看,应该就是人工手动加的源项。对角部分
isoCd
和源项isoCd
部分可以抵消,但这样写可以增加对角占优“对角部分
isoCd
和源项isoCd
部分可以抵消”,这句话还是不太懂,我还得再消化消化。
但今天试着输出了一些网格的Usource()
:
这是空间内存在多孔隙介质时的Usource()
值:
这是空间内无多孔隙介质时的Usource()
值:
发现确实没有多孔隙介质时Usource()
的值要小很多,已经接近0了。 -
时隔九个月,今天重新看这个帖子,终于搞清楚了,记录一下。
确实是像李老师说的那样,Usource()就是源项,这里是手动加的源项,之前一直以为是系数矩阵的非对角元。
Udiag()代表U方程的对角线元素,来自IduMatrix,而Usource()是源项矩阵,来自fvMatrix。上面的代码之所以会出现Udiag(),其实就是像李老师说的那样,是为了增加对角占优。而多孔隙模型的源项就是从Usource加入的:Usource[celli] -= V[celli]*((Cd - I*isoCd) & U[celli]);
这里Cd就是公式(2)中括号中的部分。