MULES, CMULES and IMULES 测试
-
对流项永远是个大问题,在纯对流问题中,显性的高阶格式是无条件不稳定的。于是耗散非常严重的
upwind
依然人见人爱。但在某些情况下,变量的耗散会引起数值计算的不精准。尤其在界面捕获的俩相流中,相传输方程为纯对流方程,一阶空间离散格式会导致相界面的模糊,但是高阶格式除了会产生相变量的越界导致计算发散。今天没事测试了一下各种MULES,算例非常简单,标量对流传输。结果见图吧。
上图是中心差分无条件震荡(注意横坐标和时间点和下图都不同)
上图是MULES的迎风插值
上图是MULES+中心插值,型线挺好。
但是用复杂算例测试还是越界了 :big_mouth:
想看越界的可以算算tutorials/basic/scalarTransportFoam/
下面的pitzDaily
算例,把扩散系数设置为0. -
算例非常简单,就是1维对流问题。不过可以给你个思路制作求解器。改编
scalarTransportFoam
:#include "fvCFD.H" #include "simpleControl.H" #include "MULEStest.H" #include "FCT.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // int main(int argc, char *argv[]) { #include "setRootCase.H" #include "createTime.H" #include "createMesh.H" simpleControl simple(mesh); #include "createFields.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // Info<< "\nCalculating scalar transport\n" << endl; #include "CourantNo.H" while (simple.loop()) { Info<< "\n\nTime = " << runTime.timeName() << nl << endl; scalarField phiTout; while (simple.correctNonOrthogonal()) { phiT = phi * fvc::interpolate(T); phiTout = phiT.ref(); Info << "phiT before MULES " << phiTout << nl << nl; //MULEStest::explicitSolve(T, phi, phiT, 9, 0); FCT(T, phi, phiT, 9, 0); //fvScalarMatrix TEqn //( // fvm::ddt(T) // + fvc::div(phiT) //); //TEqn.relax(); //TEqn.solve(); } scalarField TOUTPUT = T.ref(); phiTout = phiT.ref(); Info << "\n\nT is " << TOUTPUT << nl; Info << "phiT after MULES " << phiTout << nl; runTime.write(); } //Info<< "End\n" << endl; return 0; }
通过MULES学习插值格式太复杂了