发布日期: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版块中存在一些问题,这里懒得调试了。
”(本文罢了)
晴明节休假,休息!
本站仅提供存储管事,通盘实质均由用户发布,如发现存害或侵权实质,请点击举报。