你的位置:软件定制开发多少钱 > 软件开发公司 > 软件定制开发 OpenFOAM编程案例|09 创建functionObject

软件定制开发 OpenFOAM编程案例|09 创建functionObject

发布日期:2024-08-09 06:00    点击次数:193

本案例演示编程终了一个在臆度打算时进行数据处分的动态库步调。

1 创建文献结构

不错诳骗用具foamNewFunctionObject创建一个functionObjects用具。本案例演示创建一个在臆度打算时赢得某范围流量信息的functionObject。

小程序开发

选拔底下的号令:

runmkdir demo9 && cd demo9foamNewFunctionObject pipeCalccd pipeCalc

步调自动创建一个pipeCalc的文献夹,其内结构如下所示。

图片

2 编写代码

这里Make文献夹中的实质保执默许即可,步调仍是帮咱们准备好了。只需要编写头文献与源文献即可。

1 三区分析(三区划分:一区01-12段12码,二区13-24段12码,三区25-35段11码)

上期龙头开出05,与前期相比点位上升,本期预测龙头点位不变,参考05;

编写头文献pipeCalc.H
#ifndef pipeCalc_H#define pipeCalc_H #include "fvMeshFunctionObject.H"#include "Switch.H"#include "fvc.H"#include "volFieldsFwd.H"#include "logFiles.H"#include "addToMemberFunctionSelectionTable.H"// * * * * * * * * * * * * * * * * * * * * * * * //namespace Foam{    namespace functionObjects    {     // 接收自fvMeshFunctionObject与logFiles类        // 加基类logFiles不是必须的        class pipeCalc            : public fvMeshFunctionObject,              public logFiles         {        private:            word name_;            bool active_;            word UName_;            word faceZoneName_;            label faceZoneLabel_;            const labelList &faces_;             pipeCalc(const pipeCalc &);            void operator=(const pipeCalc &);         protected :            enum fileID            {                MAIN_FILE = 0            };             wordList createFileNames(const dictionary &dict) const;            virtual void writeFileHeader();         public:            //- 运行时类型,在案例的字典文献中必须与之对应            TypeName("pipeCalc");             //- 从Time及dictionary对象进行构造            pipeCalc(const word &name,const Time &runTime,const dictionary &dict);            //- 析构函数            virtual ~pipeCalc();                              virtual const word& name() const {return name_;}             //- 读取数据            virtual bool read(const dictionary &dict);             //- 迭代时本质一些操作,本案例不需要            virtual bool execute();             //- 在工夫迭代罢了后本质一些操作,软件定制开发本案例不需要            virtual bool end();             //- 写入数据            virtual bool write();             virtual void timeSet();             virtual void updateMesh(const mapPolyMesh &){}            virtual void movePoints(const polyMesh&) {}        };    } }  // * * * * * * * * * * * * * * * * * * * // #endif
裁剪源文献pipeCalc.C
#include "pipeCalc.H"#include "Time.H"#include "fvMesh.H"#include "addToRunTimeSelectionTable.H" namespace Foam{    namespace functionObjects    {        defineTypeNameAndDebug(pipeCalc, 0);        addToRunTimeSelectionTable(functionObject, pipeCalc, dictionary);    }}// 终了函数createFileNamesFoam::wordList Foam::functionObjects::pipeCalc::createFileNames(const dictionary &dict) const{    DynamicList<word> names(1);    const word objectType(dict.lookup("type"));    names.append(objectType);    return names;}// 诳骗函数writeFileHeader写入文献头信息void Foam::functionObjects::pipeCalc::writeFileHeader(){    writeHeader(file(), "Flow rate through face zone");    writeHeaderValue(file(), "Face Zone name", faceZoneName_);    writeCommented(file(), "Time[s] | Flow rate [m3s-1]");    file() << endl;}// 构造函数进行成员变量运改革Foam::functionObjects::pipeCalc::pipeCalc(    const word &name,    const Time &runTime,    const dictionary &dict)    : fvMeshFunctionObject(name, runTime, dict),      logFiles(obr_, name),      name_(name),      active_(true),      UName_("U"),       faceZoneName_(dict.lookup("faceZoneName")),      faceZoneLabel_(mesh_.faceZones().findZoneID(faceZoneName_)),      faces_(mesh_.faceZones()[faceZoneLabel_]){    read(dict);     resetNames(createFileNames(dict));    if (active_)    {        Info << "完成运改革" << type() << ": " << name_ << nl << endl;    }} Foam::functionObjects::pipeCalc::~pipeCalc(){}// 读取字典文献信息bool Foam::functionObjects::pipeCalc::read(const dictionary &dict){    if (active_)    {        UName_ = dict.lookupOrDefault<word>("UName", "U");    }     return true;} bool Foam::functionObjects::pipeCalc::execute(){    if (active_)    {    }    return true;} bool Foam::functionObjects::pipeCalc::end(){    if (active_)    {        execute();    }    return true;} void Foam::functionObjects::pipeCalc::timeSet(){}// 赢得信息并写入到文献bool Foam::functionObjects::pipeCalc::write(){    if (active_)    {        // 得到速率向量        const volVectorField &U = obr_.lookupObject<volVectorField>(UName_);        // 得到网格面上的速率        surfaceVectorField Uface = fvc::interpolate(U);         scalar flowRate(0.0);        forAll(faces_,faceI)        {            // 得到指定范围面上的流量。流量就是速率向量与面积向量的点积            flowRate += Uface[faces_[faceI]] & mesh_.Sf()[faces_[faceI]];             }     // 进行并行约简       reduce(flowRate, sumOp<scalar>());    // 将约简后的数据输出       Info << "Total flow rate " << flowRate << " through "            << returnReduce(faces_.size(), sumOp<label>()) << " faces" << nl << endl;         if (Pstream::master())        {            logFiles::write();            file() << obr_.time().value() << tab << flowRate << endl;        }    }     return true;}

通过wmake编译后如下图所示。

图片

编译生成的动态库被摈弃在$FOAM_USER_LIBBIN文献夹中。

3 测试

修改案例的system/constrolDict文献

FoamFile{    version     2.0;    format      ascii;    class       dictionary;    location    "system";    object      controlDict;}// * * * * * * * * * * * * * * * * * * * * //application     simpleFoam;startFrom       latestTime;startTime       0;stopAt          endTime;endTime         10;deltaT          1;writeControl    runTime;writeInterval   50;purgeWrite      1;writeFormat     binary;writePrecision  6;writeCompression off;timeFormat      general;timePrecision   6;runTimeModifiable true; // 添加底下的语句functions{    pipeCalculator    {        //加载库        libs ("libpipeCalcFunctionObject.so");        //指定对象类型,需要与步调中所界说的TypeName保执一致        type pipeCalc;        //步调需要读取裂缝字faceZoneName与UName           faceZoneName planeFaceZone;        UName U;        // 指定数据输出模式与写出隔断        writeInterval timeStep;        writeInterval 1;    }} 

测试文献夹中本质号令./Allrun运行案例。

图片

此时在案例目次下生成文献postProcessing/pipeCalculator/0/pipeCalc.dat,翻开该文献,其实质如下所示。

图片

文献中包含两列实质,折柳为工夫与流量。

注:底下的例子在v9版块下通过。在com版块中存在一些问题,这里懒得调试了。

(本文罢了)

晴明节休假,休息!

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