岳阳逗巢电子商务有限公司-OpenFOAM编程|极简03:诞生一个求解器
你的位置:岳阳逗巢电子商务有限公司 > 拾音器 > OpenFOAM编程|极简03:诞生一个求解器
OpenFOAM编程|极简03:诞生一个求解器
发布日期:2024-06-30 23:34    点击次数:179

OpenFOAM编程|极简03:诞生一个求解器

OpenFOAM中预编译了大宗适用于多样应用场景的求解器,但只怕可能但愿向现存求解器中添加一些实质,或者基于新的盘考诞生新的求解器。本案例将演示奈何将温度的标量输运方程添加到icoFoam求解器。

通过诈欺OpenFOAM的现存功能过头私有的体紧缚构,达成此求解器只需要对现存代码进行少许的修改即可。

本案例中,温度被模拟为一个守恒的被迫标量,也便是说其不会影响流体的压力或速率,这种情况仅适用于温度变化相对较小的问题中。从速率场到温度的单向耦合通过温度方程中的对流项来讨论:

1 圭臬结构

求解器icoThermalFoam从icoFoam改编而来,因此先从solver目次中将icoFoam的源代码拷贝到使命目次。

诈欺底下的号召完成文献准备使命。

cd $FOAM_RUNmkdir Demo && cd Democp -r $FOAM_SOLVERS/incompressible/icoFoam icoThermalFoamcd icoThermalFoam

文献结构如下图所示。

图片

修改icoFoam.C的文献名为icoThermalFoam.C修改files文献的实质
icoThermalFoam.CEXE = $(FOAM_APPBIN)/icoThermalFoam

这里的$FOAM_APPBIN为环境变量,求解器编译到此位置后在全局均可径直调用。

2 修改头文献

求解器包含了一个createFields.H的头文献,该文献从OpenFOAM案例中读取多样字典文献来获得求解数据。本案例中需要从字典文献中获得参数DT以及T,其中DT为物性参数,T为场变量。

修改createFields.H头文献,在其中添加底下的代码:

// 从字典文献中读取DT,这里读的是物性参数,从transportProperties字典文献中读取dimensionedScalar DT(    "DT",  // 字典文献中关节字的称号,后头在案例字典中指定的关节字必须与一致    dimViscosity,   // 指定量纲,这里诈欺预置的量纲dimViscosity,也不错使用dimensionSet我方界说量纲    transportProperties   // 前范围说的transportProperties字典); // 读取各范围的温度数据,参照p文献Info << "Reading field T\n" << endl;// 界说标量场TvolScalarField T  (    // 创建IOobject对象行为标量场的参数,IOobject对象指定了标量的参数    IOobject    (        "T",      // 界说了文献名为T,后头准备案例文献时在0文献夹中需要有相应的T文献        runTime.timeName(),  // 文献位置        mesh,				// 注册对象        IOobject::MUST_READ,  // 指定数据必须读取,若0文献夹中莫得T文献,则报错        IOobject::AUTO_WRITE  // 指定数据自动写入,在源文献中的write()函数会将缱绻效果数据写入T文献中    ),    mesh);

这里是老例的文献读取,前边照旧讲过,就不细述了。

3 修改源文献

需要在源文献icoThermalFoam.C中写入限度方程。

由于温度T的输运方程与压力和速率是解耦的,因此不错将温度求目田在压力速率修正之后。

修改后的源文献为(文献前半部分莫得列出):

            #include "continuityErrs.H"            U = HbyA - rAU*fvc::grad(p);            U.correctBoundaryConditions();        }        //将温度限度方程加到这里        // --------------求解温度限度方程-------------------        solve        (            fvm::ddt(T) + fvm::div(phi,T) == fvm::laplacian(DT,T)        );        //------------------------------------------------        runTime.write();  // 将通盘指定为写入的物理场数据写入到文献中         runTime.printExecutionTime(Info);    }    Info<< "End\n" << endl;    return 0;}

修改收场后不错通过wmake编译圭臬。

编译收场后不错输入icoThermalFoam -help测试是否求解器是否粗略调用。如下图所示。

图片

4 准备测试文献

从前边的源代码不错看出,求解器icoThermalFoam需要读入物性参数DT及场变量T。这里弃取修改OpenFOAM自带案例cavityClipped来进行测试。

诈欺底下的号召准备文献:

cp -r $FOAM_TUTORIALS/incompressible/icoFoam/cavity/cavity .cd cavitycd 0 && cp p T && cd ..blockMesh

案例文献结构如下图所示。

图片

修改constant/transportProperties文献
FoamFile{    version     2.0;    format      ascii;    class       dictionary;    object      transportProperties;}// * * * * * * * * * * * * * //nu              0.01;DT              0.001;  // 关节字DT与前边圭臬中的称号保握一致,这里不需要指定量纲(V9版块可能不同)

由于在createFileds.H头文献中读取DT时指定了量纲为dimViscosity,因此在字典文献中不再需要指定量纲。

修改0/T文献夹,指定温度范围值与运行值
FoamFile{        version         2.0;        format          ascii;        class           volScalarField;        location        "0";        object          T;}// 指定量纲与运行值dimensions              [0 0 0 1 0 0 0];internalField           uniform 300;// 指定范围条目boundaryField{        lid        {                type    fixedValue;                value   uniform 400;        }         fixedWalls        {                type    fixedValue;                value   uniform 300;        }         frontAndBack        {                type    empty;        }} 
修改system/fvSchemes指定碎裂样式
FoamFile{    version     2.0;    format      ascii;    class       dictionary;    object      fvSchemes;}// * * * * * * * * * * * * * * * // ddtSchemes{    default         Euler;} gradSchemes{    default         Gauss linear;} divSchemes{    default         none;    div(phi,U)      Gauss linear;    // ---添加温度方程碎裂样式---    div(phi,T)      Gauss linear;} laplacianSchemes{    default         Gauss linear orthogonal;} interpolationSchemes{    default         linear;} snGradSchemes{    default         orthogonal;}
修改system/fvSolution指定T方程的求解形态
FoamFile{    version     2.0;    format      ascii;    class       dictionary;    object      fvSolution;}// * * * * * * * * * * * * * * * * * // solvers{    p    {        solver          PCG;        preconditioner  DIC;        tolerance       1e-06;        relTol          0.05;    }     pFinal    {        $p;        relTol          0;    }     U    {        solver          smoothSolver;        smoother        symGaussSeidel;        tolerance       1e-05;        relTol          0;    }    // ---添加T方程求解形态-----    T    {        solver          smoothSolver;        smoother        symGaussSeidel;        tolerance       1e-05;        relTol          0;    }    //---------------------------} PISO{    nCorrectors     2;    nNonOrthogonalCorrectors 0;    pRefCell        0;    pRefValue       0;}
5 测试求解

测试文献准备收场后,不错在案例根目次下运行号召进行求解缱绻:

icoThermalFoam

缱绻收场后寻查效果,如下图所示。

图片

6 小结

追忆一下,诈欺OpenFOAM诞生一个新的求解器的基本圭臬包括:

从预置求解器中找一个最接近的求解器添加物性参数读写及物理场变量读写的代码添加限度方程

使用的时间主要肃穆:

物性参数指定范围条目指定添加的物理场的碎裂算法指定方程组求解形态指定

其他的就没什么了。本案例极为简便,仅为演示长途,不外复杂的求解器,其实套路也齐是同样的。

OpenFOAM高层编程其实照旧相比简便的,主若是熟识多样模板类的调用,搞澄清数据结构以及数据之间的调用相干基本上就能上手了。高层编程其实照旧属于应用范围,谈不上诞生,这部单干作并不难,实在难的是诞生底层算法而不是编写圭臬,OpenFOAM的架构瞎想独特漂亮,将多样算法转化为代码其实齐是膂力活儿长途。然而算法的推导就相比难了,不外万幸的是有那帮子搞纯表面的东说念主在为这事儿掉头发。

(完)

本站仅提供存储处事,通盘实质均由用户发布,如发现存害或侵权实质,请点击举报。