内容纲要
本案例演示自定义类并利用自定义的类操纵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之道
评论前必须登录!
注册