热点资讯

你的位置:软件定制开发费用 > 软件定制开发 > 软件定制开发费用 OpenFOAM编程案例|14 SIMPLE算法

软件定制开发费用 OpenFOAM编程案例|14 SIMPLE算法


发布日期:2024-08-09 06:26    点击次数:84


软件定制开发费用

本案例演示诳骗OpenFOAM中的基础代码终了SIMPLE算法软件定制开发费用。

1 SIMPLE算法

关于不能压缩NS方程,不错示意为:

式中有4个待求物理量:。式中为开放压力(),为开放粘度。

方程求解有两个穷困问题需要经管:

莫得显式的压努力解方式。压力荫藏在动量方程中,与速率耦合在一谈动量方程的求解受到蚁合方程的拘谨,即从动量方程中求解得回的速率不一定大约闲静蚁合方程

SIMPLE算法领受底下的步调进行经管:

将动量方程写成矩阵方程的情势

式中,矩阵为诳骗有限体积法闹翻得回的方程统统矩阵。矩阵方程伸开成底下的样式:

矩阵的元素不错从任何一册CFD课本中得回。

将矩阵写成底下的情势

其中矩阵为矩阵的对角矩阵,即:

将式(5)代入式(3),可得回:

式(7)不错得回:

将式(8)代入蚁合方程式(1)可得回:

挪一下位置,式(9)不错写成底下的情势:

一区(01-12):上期一区开出3个奖号:05 07 10,最近10期一区开出奖号总数为:20个。本期关注1个一区号码:03。

大小比分析:上期前区奖号大小比0:5,最近10期前区大小比24:26,本期参考大小比3:2

方程(10)常被称为压力poisson方程,求解此泊松方程不错得回压力场。

得回压力场数据后诳骗式(8)计较速率场,之后反复迭代计较,直到残差达到条款。

SIMPLE算法计较经由中波及到的一些矩阵包括:

矩阵矩阵

由于矩阵为对角矩阵,因此其逆矩阵不错很容易计较得回:

矩阵2 圭臬终了

诳骗OpenFOAM中的基础代码终了Simple算法。

2.1 文献准备

诳骗底下的呐喊创建文献。

runfoamNewApp SIMPLEdemocd SIMPLEdemotouch createFields.H

程引言件结构如下图所示。

app

图片

2.2 圭臬代码

这里领受的是foamNewApp创建的程引言件结构,因此Make文献夹中的骨子保握默许即可。

头文献createFileds.H包含物理量的准备
 Info << "读取压力场" << endl;volScalarField p(    IOobject    (        "p",        runTime.timeName(),        mesh,        IOobject::MUST_READ,        IOobject::AUTO_WRITE    ),    mesh); // 界说一个标量p_old,用于存储迭代前的压力volScalarField p_old(    IOobject    (        "p_old",        runTime.timeName(),        mesh,        IOobject::NO_READ,        IOobject::NO_WRITE    ),    p); // 读取速率场UInfo << "读取速率场U" << endl;volVectorField U(    IOobject    (        "U",        runTime.timeName(),        mesh,        IOobject::MUST_READ,        IOobject::AUTO_WRITE    ),    mesh); // 界说通量场phiInfo << "创建通量场" << endl;surfaceScalarField phi(    IOobject    (        "phi",        runTime.timeName(),        mesh,        IOobject::NO_READ,        IOobject::AUTO_WRITE),    //默许值建树为范围面速率向量插值与面积向量点击    fvc::interpolate(U) & mesh.Sf()); // 读取输运参数IOdictionary transportProperties(    IOobject    (        "transportProperties",        runTime.constant(),        mesh,        IOobject::MUST_READ_IF_MODIFIED,        IOobject::NO_WRITE    )); dimensionedScalar nu(    "nu",    dimViscosity,    transportProperties); // 界说一个字典变量,软件定制开发费用用于参考压力的读写IOdictionary fvSolution(    IOobject    (        "fvSolution",        runTime.system(),        mesh,        IOobject::MUST_READ_IF_MODIFIED,        IOobject::NO_WRITE    )); 
编写源文献SIMPLEdemo.C
#include "fvCFD.H" int main(int argc, char *argv[]){    // 查验案例文献结构    #include "setRootCase.H"    // 创建Time对象runTime    #include "createTime.H"    // 创建fvMesh对象mesh    #include "createMesh.H"    //包含前范围说的头文献    #include "createFields.H"     // 亚粗俗因子alpha,从fvSolution字典文献中读取    scalar alpha;    fvSolution.lookup("alpha") >> alpha;    // 参考压力所指定的网格    scalar pRefCell;    fvSolution.lookup("pRefCell") >> pRefCell;    // 参考压力值    scalar pRefValue;    fvSolution.lookup("pRefValue") >> pRefValue;     // 试着将读取的值输出到端正台(没什么用,可选)    Info << nl << "读取了以下参数:" << endl;    Info << "亚粗俗因子alpha = " << alpha << endl;    Info << "参考压力网格索引:" << pRefCell << endl;    Info << "参考压力值:" << pRefValue << endl;     // 主轮回    while (runTime.loop())    {        Info << nl << "Iteration:" << runTime.timeName() << endl;        // 界说动量方程        fvVectorMatrix UEqn(            fvm::div(phi, U) - fvm::laplacian(nu, U) == -fvc::grad(p));        // 诳骗面前的压力场数据求解动量方程,得回速率场        UEqn.solve();         // 动量方程写成矩阵方程为M*U=Nab(p),不错写成A*U-H=Nab(p)        // 得回A矩阵和H矩阵,贵重A矩阵为标量,H为矢量        volScalarField A = UEqn.A();        volVectorField H = UEqn.H();         // 计较A矩阵的逆矩阵,A为对角矩阵,其逆矩阵即是1/A        volScalarField A_inv = 1.0 / A;         // 界说向量场HbyA = A_inv * H        volVectorField HbyA = A_inv * H;         // 界说通量场        surfaceScalarField A_inv_flux = fvc::interpolate(A_inv);         // 求压力泊松方程        // 方程界说为Nab(A^-1 Nab(p)) = Nab.(A^-1 * H)        fvScalarMatrix pEqn(            fvm::laplacian(A_inv_flux, p) == fvc::div(HbyA));        // 建树参考压力        pEqn.setReference(pRefCell, pRefValue);        // 求解方程        pEqn.solve();         // 对求解得回的压力进行亚粗俗        p = alpha * p + (1.0 - alpha) * p_old;         // 证实新的压力场数据修正速率场U = A^-1 * H - A^-1 * Nab.(p)        U = A_inv * H - A_inv * fvc::grad(p);         // 更新通量phi        phi = fvc::interpolate(U) & mesh.Sf();         // 更新范围上的压力场与速率场        U.correctBoundaryConditions();        p.correctBoundaryConditions();         // 更新旧压力场        p_old = p;         // 将得回的物理场写入到文献中        runTime.write();    }     // * * * * * * * * * * * * * * * * * * * * * * //    Info << nl << runTime.printExecutionTime(Info);    Info << "End\n" << endl;     return 0;} 

诳骗wmake编译圭臬,确保编译经由中莫得诞妄信息,如下图所示。

图片

2.3 测试案例

案例领受2D计较模子,长度0.5 m,宽0.1 m,进口流速1 m/s,出口静压0 Pa,其他范围为无滑移壁面。案例的准备与旧例案例基本同样,这里仅需要在fvSolution中添加圭臬中所需的要津字。

system/fvSolution文献
FoamFile{    version     2.0;    format      ascii;    class       dictionary;    location    "system";    object      fvSolution;}// * * * * * * * * * * * * * * * * * * * //solvers{    p    {        solver          PCG;        preconditioner  DIC;        tolerance       1e-06;        relTol          0;    }     pFinal    {        $p;        relTol          0;    }     U    {        solver          smoothSolver;        smoother        symGaussSeidel;        tolerance       1e-04;        relTol          0;    }} // 亚粗俗因子alpha 0.01;// 界说参考压力的网格编号pRefCell 99;// 参考压力值pRefValue 0; 

计较恶果如下图所示。

图片

(本文已矣)

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