热点资讯

你的位置:软件定制开发费用 > 软件定制开发 > 软件开发资讯 OpenFOAM编程案例|16 颗粒追踪

软件开发资讯 OpenFOAM编程案例|16 颗粒追踪


发布日期:2024-08-09 07:58    点击次数:115


本案例演示欺诈OpenFOAM编程达成颗粒追踪并绘画颗粒轨迹。

1 文献结构

欺诈底下的号召创建文献结构。

runfoamNewApp demo16

文献结构如下图所示。

图片

app开发2 方法源码

本案例只需要一个源文献demo16.C,其本色如下。

 #include "fvCFD.H" /*界说一个函数,用于写入包含由点列表界说的单条多段线的vtk文献。推敲vtk文献形式步调,请参阅:https://vtk.org/wp-content/uploads/2015/04/file-formats.pdf*/void saveTrajectoryToVtk(DynamicList<point> &path, fvMesh &mesh){    Info << endl         << "将颗粒旅途写入到VTK文献" << endl;     // 创建一个文献夹用于存放VTK文献    fileName VTK_dir = mesh.time().path() / "VTK";    mkDir(VTK_dir);     // 创建文献指针    autoPtr<OFstream> vtkFilePtr;    vtkFilePtr.reset(new OFstream(VTK_dir / "particle_path.vtk"));     // 写入文献头    vtkFilePtr() << "# vtk DataFile Version 2.0" << endl                 << "particle_path" << endl                 << "ASCII" << endl                 << "DATASET POLYDATA" << endl;    vtkFilePtr() << nl;     // 写入点头部    vtkFilePtr() << "POINTS " << path.size() << " DOUBLE" << endl;    //  写入点坐标    forAll(path, ipt)    {        vtkFilePtr() << path[ipt].x() << "  " << path[ipt].y() << "  " << path[ipt].z() << endl;    }    vtkFilePtr() << nl;     // 写入线的头部与列表    vtkFilePtr() << "LINES 1 " << path.size() + 1 << endl;    vtkFilePtr() << path.size() << endl;    forAll(path, ipt)    {        vtkFilePtr() << ipt << endl;    }     Info << tab << "vtk文献写入完成!" << endl;} // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // int main(int argc, char *argv[]){#include "setRootCase.H"#include "createTime.H"#include "createMesh.H"     instantList times = runTime.times(); //取得扫数的时间    runTime.setTime(times.last(), 0);    //设立现同样刻为临了一个时间点    Info << nl << "使用的数据时刻为:" << runTime.timeName() << endl;     // 读取速率场U    Info << nl << "读取速率场" << endl;    volVectorField U(        IOobject(            "U",            runTime.timeName(),            mesh,            IOobject::MUST_READ,            IOobject::NO_WRITE),        mesh);     // 界说颗粒的运转位置,这里苟简起见界说了一个固定坐标    point particle(0.01, 0.11875, 0);     //准备粒子位置列表和几个标量变量来存储其总行程时间和距离    DynamicList<point> particlePositions;    scalar timeTaken(0);    scalar distanceTravelled(0);     // 添加运飘摇位置到颗粒位置列表中    particlePositions.append(particle);    // 找到无质料颗粒场合的网格,欺诈网格流速来细目颗粒的下一个位置    label cellID = mesh.findCell(particle);    Info << nl << "运转颗粒位于网格 " << cellID << " 中" << endl;     // 形式其他的变量    vector curPos = particle;    vector newPos(0, 0, 0);    label iterCount(1);    const label maxIters(100);     Info << nl << "出手颗粒追踪" << endl;    while (cellID != -1)    {        vector velocity = U[cellID];                   //取得网格的速率        scalar charLen = Foam::cbrt(mesh.V()[cellID]); //取得网格的特征尺寸        scalar dt = charLen / mag(velocity);           //取得特征时间步长         newPos = curPos + velocity * dt; //盘算取得新的颗粒位置         scalar dist = mag(newPos - curPos); //取得颗粒在现同样间步的位移         // 输出信息        Info << nl << "Lagrangian time step: " << iterCount << nl             << tab << "current position = " << curPos << nl             << tab << "new position = " << newPos << nl             << tab << "local distance travelled = " << dist << nl             << tab << "local time taken = " << dt << nl             << tab << "currently reciding cell no. = " << cellID << endl;         // 将数据添加到列表中        distanceTravelled += dist;        timeTaken += dt;        particlePositions.append(newPos);        curPos = newPos;        iterCount++;         cellID = mesh.findCell(curPos);        if (iterCount > maxIters)        {            FatalErrorInFunction << "达到最大的追踪时间步数!" << abort(FatalError);        }    }     if (cellID == -1) //颗粒离开盘算域    {        Info << "颗粒离开盘算区域!" << endl             << "颗粒运行的总距离:" << distanceTravelled << nl             << "颗粒停留时间:" << timeTaken << endl;    }     // 写入文献    saveTrajectoryToVtk(particlePositions, mesh);     // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //     Info << nl;    runTime.printExecutionTime(Info);     Info << "End\n"         << endl;     return 0;} 
3 测试方法

本方法是一个后责罚方法,在案例求解完了后使用。

测试案例盘算取得的速率场。

图片

在案例根旅途下扩充方法demo16,成果如下图所示。

图片

此时在根目次下创建了一个VTK文献夹,其中包含文献particle_path.vtk。

图片

欺诈paraview读取vtk文献检察轨迹,软件开发公司如下图所示。

图片

(完了)

大小分析:上期奖号大小比为11:9,走势基本平衡,近7期开奖大小比例为74:66,大号总体走势较热,本期预计大小比维持上期状态软件开发资讯,关注大小比11:9。

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