icoFoam的一些细节问题
-
不是很理解你的意思,
adjustphi()
是用于对压力全部为Neumann边界条件的情况下,给定一个附加条件使得压力有解,这个附加条件通过adjustphi()
进行。// adjusts the inlet and outlet fluxes to obey continuity, which is necessary for creating a well-posed
// problem where a solution for pressure exists.这句话也就是要使得压力有解,有必要进行
adjustphi()
-
这里的UEqn.A和后面的UEqn.H是自动根据U的新值进行刷新的吗?
UEqn.A()
对应的为$A_p$在当前时内迭代中其为不变的,在进入下一个时间步更新;
UEqn.H()
对应的是icoFoam解析公式(15)右侧括号内的项,其中$A_n$为不变的但是UEqn.H()
是变化的;fvVectorMatrix UEqn ( fvm::ddt(U) + fvm::div(phi, U) - fvm::laplacian(nu, U) ); while (......) { solve(UEqn == .....) }
这段代码在
UEqn
后跟随的solve()
,就是把动量方程求解。但是并没有用到连续性方程。还是得需要求解压力修正方程和压力泊松方程。上述代码只是动量预测用。可有可无。P.S. 关于
ddtcorr
,需要码大量公式,择日补充。 -
有关
ddtphicorr
,简单来说是一种使得计算更精确的方法。在下面这篇文献中对增加ddtphicorr
和省略ddtphicorr
做了比较。在误差放大100倍的时候才可以对比。看这篇论文应该会有所启发:NOTE ON THE USE OF MOMENTUM INTERPOLATION METHOD FOR UNSTEADY FLOWS
在ville的论文里直接对
ddtphicorr
做了对比。误差均非常小。cfd-online一个讨论帖:http://www.cfd-online.com/Forums/openfoam-solving/60096-ddtphicorr.html
然而cfd-online的讨论大部分还是很具有挑战性。对比文献后我比较赞成eugene的看法。初步看了下文献,和代码还没具体的对上,但是确实是这种技术。以后有时间把公式和方程对应一下。 -
最近看到了一些资料,目前可以确定的是
ddtcorr()
的引入是由于:“非稳态问题的时间步长较小的时候,采用Rhie-chow插值仍然会导致压力波”。因此“求解和时间相关(尤其在小时间步长的时候),建议采用Choi提出的格式”。且“Rhie-chow插值求解的结果和松弛因子有关”参考《数值传热学》250页以及《流动与传热数值计算—若干问题的研究和探讨》,我会跟进Choi格式并和
ddtcorr()
对应一下。Note on the use of momentum interpolation method for unsteady flows, SK Choi - Numerical Heat Transfer: Part A: Applications, 1999 - Taylor & Francis
-
参考choi的论文,其引用Majumdar的文章表明"the resulting converged solution is relaxation factor dependent". 具体原理,还需研究。
我刚看了Yu bo的Discussion on momentum interpolation method for collocated grids of incompressible flow. Numerical Heat Transfer: Part B: Fundamentals,他也是说相关的。他们引用的Majumdar和Miller的文章。确认下?
Anyway,多研究研究,看看choi原理是怎么实现的。Choi那个论文很短。Yo bo师从陶院士?不一般啊。
-
@李东岳
我觉得关键点在于进行当前时间步Rhie-chow动量插值时上一时间步界面速度$\mathbf{U}_{f}^{n}$的计算,如果没有ddtcorr()
,$\mathbf{U}_{f}^{n}$只是简单通过相邻单元基于动量方程系数矩阵主对角元素加权平均得到,如果加了修正项,那么$\mathbf{U}_{f}^{n}$使用的就是上一时间步里基于动量插值得到的结果,所以在phiHbyA
的计算里需要修正界面的体积通量,下面的代码是EulerDdtScheme.C
527~545行(OpenFOAM 2.4.0)中的一部分fluxFieldType phiCorr ( phi.oldTime() - (mesh().Sf() & fvc::interpolate(U.oldTime())) );
- (mesh().Sf() & fvc::interpolate(U.oldTime()))
用于消去计算HbyA
时加上的体中心处的旧值。修正的原因是即便体中心处的速度场满足连续方程,基于动量方程系数矩阵主对角元素加权平均往面中心插值,时间步长越小,越倾向于简单算术平均,再加上非结构不规则网格等因素,很难再保证插值后的面速度场仍然保持0散度条件。
个人浅见,欢迎批评指正。 -