周二. 9 月 16th, 2025

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

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

1 文件结构

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

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

cd $FOAM_RUNmkdir 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.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.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

执行结果如下图所示。

(本文完毕)

Avatar photo

作者 UU 13723417500

友情提示:现在网络诈骗很多,做跨境电商小心被骗。此号发布内容皆为转载自其它媒体或企业宣传文章,相关信息仅为传递更多信息之目的,不代表本网观点,亦不代表本网站赞同其观点或证实其内容的真实性。---无意冒犯,如有侵权请联系13723417500删除!

声明本文由该作者发布,如有侵权请联系删除。内容不代表本平台立场!

发表回复

服务平台
跨境人脉通
选品平台
U选Market
展会&沙龙
群通天下