软件定制开发

软件开发价格 OpenFOAM编程|极简03:建设一个求解器

发布日期:2024-08-09 06:55    点击次数:75
软件开发价格

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,因此在字典文献中不再需要指定量纲。

龙头:最近10期出号 06 04 02 01 03 07 03 03 01 05,其中奇数球开出7个,偶数球开出3个,本期推荐偶数球:04。

修改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的架构缠绵至极漂亮,将各式算法滚动为代码其实皆是膂力活儿资料。然则算法的推导就相比难了,不外万幸的是有那帮子搞纯表面的东谈主在为这事儿掉头发。

(完)

本站仅提供存储行状,扫数现实均由用户发布,如发现存害或侵权现实,请点击举报。

上一篇:软件开发公司 周末听一听养心名曲纯音乐,闭眼凝听,减弱样貌,静心舒徐!
下一篇:软件开发公司 居然胖东来!永辉超市火了 郑州门店首日营收增多14倍!