吾生有涯 学海无涯
析模有界 知识无界

OpenFOAM编程案例|06 自定义类

内容纲要

本案例演示自定义类并利用自定义的类操纵OpenFOAM数据。

类是面向对象编程的基础结构,利用类可以很方便地实现代码复用和封装。本案例通过两个类的定义来演示C++中类的定义与调用过程。

1 文件结构

和前面的案例一样,我们先创建基础的文件结构,后面需要新的文件时再往里面添加。

利用下面的命令在run文件夹下创建案例文件。

cd $FOAM_RUN
mkdir demo6 && cd demo6
mkdir Make
touch 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.H
void customClass::meshOpFunction(fvMesh& mesh)
{
     Info << "Custom类得到的网格数量为:" << mesh.C().size() << endl;
     myInt_ = mesh.C().size();
}

3 创建新类

创建一个继承自IOdictionary类的新类myDict

  • 创建头文件derivedClass.H
#include "fvCFD.H"
#include 

// 采用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 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.C
derivedClass.C
demo6.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 cavity
blockMesh
../demo6

执行结果如下图所示。


(本文完毕)

本篇文章来源于微信公众号: CFD之道

赞(0) 打赏
版权声明:未经允许,请勿随意用于商业用途。
文章名称:《OpenFOAM编程案例|06 自定义类》
文章链接:https://www.topcfd.cn/18652/
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。
分享到

说两句 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者吧

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫

登录

找回密码

注册