OpenFOAM编程案例|06 自定义类
发布日期:2024-07-22 07:35 点击次数:181
本案例演示自定义类并利用自定义的类操纵OpenFOAM数据。
类是面向对象编程的基础结构,利用类可以很方便地实现代码复用和封装。本案例通过两个类的定义来演示C++中类的定义与调用过程。
1 文件结构和前面的案例一样,我们先创建基础的文件结构,后面需要新的文件时再往里面添加。
利用下面的命令在run文件夹下创建案例文件。
cd $FOAM_RUNmkdir demo6 && cd demo6mkdir Maketouch demo6.C Make/files Make/options
命令执行完毕后,文件结构如下所示。
图片
2 创建customClass类为了符合大型C++程序的特征,这里类定义时将其头文件与源文件分开。
创建头文件customClass.H,其内容为:#include "fvCFD.H" class customClass{private: label myInt_; // 成员变量public: customClass(); // 构造函数 ~customClass(); // 析构函数 // 定义一个get函数,用于获取成员变量的值 inline label get() const {return myInt_;} // 定义set函数设置成员变量的值 inline void set(label newInt){myInt_= newInt;} // 定义函数,const表示此函数不会对成员变量进行修改 label basicFunction() const; // 大结构作为参数时通常使用引用,这样效率更高 void meshOpFunction(fvMesh& mesh);};创建源文件customClass.C
#include "customClass.H" // 构造函数,初始化customClass::customClass(){ myInt_ = 0;} // 析构函数用于释放内存,这里可以保持为空customClass::~customClass(){}// 实现basicFunction函数label customClass::basicFunction() const{ Info << "调用函数basicFunction()" << endl; return myInt_ * 2;}// 实现meshOpFunction函数// 此函数使用了fvMesh类,因此在使用此函数之前记得先包含头文件createMesh.Hvoid customClass::meshOpFunction(fvMesh& mesh){ Info << "Custom类得到的网格数量为:" << mesh.C().size() << endl; myInt_ = mesh.C().size();}3 创建新类
创建一个继承自IOdictionary类的新类myDict。
创建头文件derivedClass.H#include "fvCFD.H"#include <sstream>// 采用public继承方式class myDict : public IOdictionary{ public: myDict(const IOobject & ioObj); ~myDict(); void printTokensInTheDict() const; };创建源文件derivedClass.C
#include "derivedClass.H" myDict::myDict(const IOobject &ioObj) : IOdictionary(ioObj) //利用基类进行初始化{}myDict::~myDict(){}// 实现printTokensInTheDict函数// 这个函数输出字典关键字中的一些字符串void myDict::printTokensInTheDict() const{ // 利用基类的tokens()函数 List<token> characters(this->tokens()); std::stringstream ss; ss << "Tokens in the file:"; forAll(characters,i) { if(characters[i].isWord()) { ss << "\n" << tab << characters[i].wordToken(); } } Info << ss.str().c_str() << endl;}4 源文件
在源文件demo6.C中输入代码。
#include "fvCFD.H"#include "customClass.H"#include "derivedClass.H" int main(int argc, char *argv[]){ #include "setRootCase.H" #include "createTime.H" #include "createMesh.H" customClass customInstance; Info << "默认值为:" << customInstance.get() << endl; customInstance.set(20); Info << "新值为:" << customInstance.get() << endl; customInstance.basicFunction(); customInstance.meshOpFunction(mesh); Info << "现在新值为:" << customInstance.get() << endl; myDict myTransportProperties( IOobject( "transportProperties", runTime.constant(), mesh, IOobject::MUST_READ_IF_MODIFIED, IOobject::NO_WRITE)); dimensionedScalar nu( "nu", dimViscosity, myTransportProperties); Info << "创建粘度标量:" << nu << endl; myTransportProperties.printTokensInTheDict(); Info << "End" << endl << endl; runTime.printExecutionTime(Info); return 0;}5 编译程序
修改Make文件夹中的文件。
修改files文件,注意源文件的放置顺序customClass.CderivedClass.Cdemo6.C EXE = demo6修改options文件
EXE_INC = \ -I$(LIB_SRC)/finiteVolume/lnInclude \ -I$(LIB_SRC)/meshTools/lnInclude EXE_LIBS = \ -lfiniteVolume \ -lmeshTools
编译程序。
图片
5 测试程序案例只是利用了网格,因此随便找个测试案例即可。
cp -r $FOAM_TUTORIALS/incompressible/icoFoam/cavity/cavity .cd cavityblockMesh../demo6
执行结果如下图所示。
图片
(本文完毕)
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报。