网格运动与相对通量转换的问题
-
大家好,最近重新研究interFoam,关于动网格的处理有些困惑,希望大家指点。
若网格进行运动,首先interFoam.C中要运行如下内容:
if (correctPhi) { // 计算绝对通量 phi = mesh.Sf() & Uf(); // 求解pcorr,利用其修正phi,保证质量守恒 #include "correctPhi.H" // 绝对通量转换为相对通量 fvc::makeRelative(phi, U); mixture.correct(); }
这段代码所做的工作我在注释中标注出来了,不知道是否准确。我的第一个问题是,计算绝对通量为什么不是如下代码:
phi = fvc::interpolate(U) & mesh.Sf()
按我的理解,直接用Uf()访问的是上一迭代得出的面上速度,网格运动后其不一定与新网格面在一个平面了,而fvc::interpolate(U)是按照更新的网格插值得出的,这样貌似更合理些?
随后是求解相方程的内容,采用相对通量求解没有问题。
#include "alphaControls.H" #include "alphaEqnSubCycle.H" mixture.correct();
相方程求解后,我没有发现对rhoPhi采用类似makeRelative()的操作,即程序直接组建速度矩阵然后求解压力泊松方程,并在求解后才执行makeRelative(),位置在pEqn.H:70。这一点我没理解,为什么在动量方程的求解中未使用相对通量,而在求解后才显式地将phi转换为相对通量?
最后还有个小问题,在求解完压力方程后,将phi转化为相对值之前,即pEqn.H:67,程序还对面上速度进行了更新:
Uf() = fvc::interpolate(U); surfaceVectorField n(mesh.Sf()/mesh.magSf()); Uf() += n*(phi/mesh.magSf() - (n & Uf()));
后两句存在的意义是什么呢?尤其是最后一句,实在没想明白。
劳烦大家指点下,我哪里理解有误还是哪个地方知识储备不够,这三个问题困扰我好几天了,查了不少资料也没找到原因,谢谢!
-
面上速度本身就是相邻网格体心插值得到的吧。fvc:interpolate(U) 和 Uf()的区别是不是,只是,前一个时间步和后一个时间步的区别。
rhoPhi就是密度的通量吧。可能是密度比较容易出现间断点?也可能像上一个的区别,只是之前的和之后的?
这个区别好像就是显式的和隐式的区别。
最后一个问题,看起来像是在综合算Uf()的值。Uf()的变化由两部分组成,一部分是由于坐标的变化,一部分是由于自身的变化。就是物质导数。原地不动也会变的那部分叫本地导数,因为运动导致变化的那部分叫迁移导数。那三行,第一行就是迁移导数,后两行是在算本地导数,加上去。第二行是算面上速度原本的方向。本来那个方向乘以面上法向量就是该速度在面法向的投影。第三行就这个方向上的速度算对Uf方向的速度增量。怎么算的还看不出来。
-
@bestucan 你好,非常感谢你的回复,我其实周日晚上就看到了,受到很大启发,也还有些不懂的地方,所以思考了两天才回复。
第一个问题,我认为应该如你所说,是显式和隐式的区别;
第二个问题,我将ALE框架下的积分形式的方程手动离散了一下,发现和MULES或isoAdvector中对应的代码一致,用的是相对通量求解的,而rhoPhi也是用相对通量组建的,所以不需要再次进行makeRelative操作;
第三个问题,我还是没太明白,按照我的理解,fvc::intepolate(U)就应该直接是新的面上速度了。我认为最后一句是不是类似非正交修正的操作?(尤其是相邻网格体心连线没有经过面心的时候) -
@CFDngu 第三个更像是非正交修正的逆操作。
假设修非正交修正前的向量是x,那么修正的方程是
mesh.Sf()=x*mesh.magSf()
向量乘以面法向量等于在面法向上的分量那么x的表达式就是
x=mesh.Sf()/mesh.magSf()
这就是那个n的方向。n的方向就是网格体心的方向。即使网格原地不动,这个方向的向量也会发生作用。改变该网格的体心位置的数值。
n乘的这个
(phi/mesh.magSf() - (n & Uf()))
,第一项也是个类似的逆操作,像是把总的量里减去迁移造成的,就是当地向量造成的,再去乘当地向量的方向n最多猜这么多了