学习笔记

OpenFOAM programming tutorial

  • foam为进入OPENFOAM文件夹的快捷命令;
  • app为进入application文件夹的快捷命令;
  • tut为进入tutorials文件夹的快捷命令; 关于icoFoam求解器 文件类型 头文件(header files) 位于主程序入口之前int main (int arg, char* argv[]) 包含不同类的定义; 集合在一起方便使用; 包含文件(include files) 通常为通用模块; Enforce consistent naming between executables, e.g. mesh, runTime ? 当地使用文件(Local implementation files) 例如createFields.H 主要代码
icoFoam 
#include "fvCFD.H"
#include "pisoControl.H"
int main(int argc, char *argv[])
{
    #include "setRootCaseLists.H"
    #include "createTime.H"
    #include "createMesh.H"

    pisoControl piso(mesh);

    #include "createFields.H"
    #include "initContinuityErrs.H"
    Info<< "\nStarting time loop\n" << endl;

函数入口 int main(int argc, char *argv[]) 其中int argc and char *argv[] 为参数个数以及实际运行过程中的实际参数;然后执行

#include "setRootCaseLists.H"
#include "createTime.H"
#include "createMesh.H"

上述文件均位于$FOAM_SRC/finiteVolume/lnInclude;

createFields.H 文件位于icoFoam文件夹,用于初始化求解器使用的变量;

#include "CourantNo.H" 

计算courant数; 然后定义动量方程并求解动量方程

while (runTime.loop())
    {
        Info<< "Time = " << runTime.timeName() << nl << endl;

        #include "CourantNo.H"

        // Momentum predictor

        fvVectorMatrix UEqn
        (
            fvm::ddt(U)
          + fvm::div(phi, U)
          - fvm::laplacian(nu, U)
        );

        if (piso.momentumPredictor())
        {
            solve(UEqn == -fvc::grad(p));
        }

        // --- PISO loop
        while (piso.correct())
        {
            volScalarField rAU(1.0/UEqn.A());
            volVectorField HbyA(constrainHbyA(rAU*UEqn.H(), U, p));
            surfaceScalarField phiHbyA
            (
                "phiHbyA",
                fvc::flux(HbyA)
              + fvc::interpolate(rAU)*fvc::ddtCorr(U, phi)
            );

adjustPhi(phiHbyA, U, p);

            // Update the pressure BCs to ensure flux consistency
            constrainPressure(p, U, phiHbyA, rAU);

            // Non-orthogonal pressure corrector loop
            while (piso.correctNonOrthogonal())
            {
                // Pressure corrector

                fvScalarMatrix pEqn
                (
                    fvm::laplacian(rAU, p) == fvc::div(phiHbyA)
                );

                pEqn.setReference(pRefCell, pRefValue);

                pEqn.solve(mesh.solver(p.select(piso.finalInnerIter())));

                if (piso.finalNonOrthogonalIter())
                {   phi = phiHbyA - pEqn.flux();
                }
            }

            #include "continuityErrs.H"

            U = HbyA - rAU*fvc::grad(p);
            U.correctBoundaryConditions();
        }

        runTime.write();//写入文件;

        Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
            << "  ClockTime = " << runTime.elapsedClockTime() << " s"
            << nl << endl;
    }

    Info<< "End\n" << endl;

    return 0;
}

然后做压力修正以及正交修正;求解结束。

#include “pisoControl.H”

查了一下pisoControl文件说明:PISO control class. Provides time-loop and PISO-loop control methods. No convergence checking is done. 没有收敛判断?那如何退出piso修正循环的呢?没有循环么?

 while (piso.correct())
{
..
}

piso.correct()返回值是什么? 在pisoControl.C中correct()函数定义如下:

 bool Foam::pisoControl::correct()
 {
     read();
    if (finalPISOIter())
     {
         corrPISO_ = 0;
         return false;
     }
 
     ++ corrPISO_;
 
     return true;
 }

在该函数中使用了finalPISOIter()作为最后一次PISO迭代的标志判断;在文件pisoControlI.H中定义,其定义如下:

inline bool Foam::pisoControl::finalPISOIter() const
 {
     return corrPISO_ >= nCorrPISO_;
 }

其中corrPISO为当前PISO修正;nCorrPISO为最大PISO修正;

而nCorrPISO是在pisoControl.C中通过成员函数读取

bool Foam::pisoControl::read()
 {
     if (!fluidSolutionControl::read())
     {
         return false;
     }
 
     const dictionary& solutionDict = dict();//dict()函数为返回求解字典Return the solution dictionary. 
 
     nCorrPISO_ = solutionDict.lookupOrDefault<label>("nCorrectors", 1);
 
     return true;
 }

读取fvSolution字典文件中的nCorrectors来定义,缺省值为1;以elbow案例为例,fvsolution字典文件如下:

PISO
{
    nCorrectors     2;
    nNonOrthogonalCorrectors 2;
}

本文总阅读量 ⤧  Next post openfoam学习笔记-2 ⤧  Previous post The flow through orifice