在OpenFOAM应用过程中,需要频繁的读写文件,如在计算之前需要读写各种字典文件以及边界条件数据,以及在计算过程中需要实时将计算结果数据写出到文件中。本案例演示编写程序读取指定文件中的相应内容以及将数据写入到文件的想要位置。
OpenFOAM中的文件读写,利用到IOdictionary
类以及文件操作相关的类。
先看代码再解释。
1 准备文件
利用下面的命令准备文件。
cd $FOAM_RUN
mkdir demo1
mkdir demo1/Make
cd demo1
touch demo1.C Make/files Make/options
如下图所示。
-
编辑files文件
demo1.C
EXE = demo1
-
编辑options文件
EXE_INC =
-I$(FOAM_SRC)/finiteVolume/lnInclude
-I$(FOAM_SRC)/meshTools/lnInclude
EXE_LIBS =
-lfiniteVolume
-lmeshTools
3 读取文件
-
编辑源文件 demo1.C
,编写下面的代码:
#include "fvCFD.H"
int main(int argc, char *argv[])
{
// 初始化案例
#include "setRootCase.H"
// 创建runTime时间对象与fvMesh网格对象
#include "createTime.H"
#include "createMesh.H"
// 定义一个word对象dicName,用来放置文件名称
// word类继承自string类,其就是一个字符串
const word dicName("customProperties");
// 定义一个IO对象,其包含了文件路径等信息
// mesh.time().constant()表示此文件在constant文件夹下
// 还可以利用mesh.time().controlDict()及mesh.time().system()分布进入control及system目录
IOobject dictIO(dicName, mesh.time().constant(), mesh, IOobject::MUST_READ);
// 创建一个字典对象
dictionary customDict = IOdictionary(dictIO);
// 从文件中查找关键字someWord并存放到someWord中
word someWord;
customDict.lookup("someWord") >> someWord;
// 查找一个名为someScalar的标量值
scalar someScalar(customDict.lookupOrDefault("someScalar", 1.0)) ;
//查找一个名为someList的列表
List someList(customDict.lookup("someList")) ;
// 查找一个名为someHashTable的表格
HashTable<vector, word> someHashTable(customDict.lookup("someHashTable"));
// 查找一个名为someBool的值
bool someBool(customDict.lookupOrDefault("someBool", true)) ;
// 输出读取的信息
Info << nl << "读取的数据为:" << nl
<< "someWord: " << someWord << nl
<< "someScalar: " << someScalar << nl
<< "someList: " << someList << nl
<< "someHashTable: " << someHashTable << nl
<< "someBool: " << someBool << nl << nl
<< endl;
return 0;
}
利用命令wmake
编译程序demo1.C,如下图所示。
可以看到程序能够成功编译。不过还不能运行,运行后如下图所示。
因为还没有准备好测试案例。
代码中需要用到一个名为customProperties
的字典文件。该文件中位于constant
文件夹下,这里准备的测试内容为:
FoamFile
{
version 2.0;
format ascii;
class dictionary;
location "constant";
object transportProperties;
}
// * * * * * * * * * * * * * * * * * * //
someWord myWord;
someScalar 0.01;
someBool on;
someList(0 1 2);
someHashTable
(
key0 (0 0 0)
key1 (1 0 0)
);
利用下面的命令从tutorials中拷贝一个案例文件到当前路径(如拷贝cavity)。
cp $FOAM_TUTORIALS/incompressible/icoFoam/cavity/cavity .
在cavity/constant
文件夹中添加文件customProperties
文件,并复制上面的内容。此时文件组织形式如下图所示。
运行下面的命令:
cd cavity
blockMesh
../demo1
运行结果如下图所示。
可以看到,程序顺利地读取到了数据。
需要注意的是,根据程序中的代码表示,该程序应该在OpenFOAM的案例目录中运行。
4 写入文件
往文件中写入数据要更简单一些,这里可以使用文件指针来实现。
如修改demo1.C文件代码如下所示:
#include "fvCFD.H"
int main(int argc, char *argv[])
{
// 初始化案例
#include "setRootCase.H"
// 创建runTime时间对象与fvMesh网格对象
#include "createTime.H"
#include "createMesh.H"
//创建一个文件夹
fileName outputDir = mesh.time().path()/"postProcessing";
mkDir(outputDir);
//定义一个文件指针
autoPtr outputFilePtr;
// 创建一个输出文件并打开该文件
outputFilePtr.reset(new OFstream(outputDir/"customOutputFile.txt"));
// 向文件中写入数据
outputFilePtr() << "------This is a header-----" << endl;
outputFilePtr() << "0 1 2 3 4 5" << endl;
// 准备一个HashTable数据,并将其写入到文件中
HashTable<vector, word> someHashTable;
someHashTable.insert("row 1", vector(1.0, 0, 0));
someHashTable.insert("row 2", vector(0, 1.0, 0));
someHashTable.insert("row 3", vector(0, 0, 1.0));
outputFilePtr() << someHashTable << endl;
Info << "---End---" << endl;
return 0;
}
编译并运行,如下图所示。
文件结构如下图所示。
打开customOutputFile.txt文件,查看其内容,如下图所示,可以看到数据顺利地写入到了文件中。
总体上来说,利用OpenFOAM进行文件读写还是比较容易的。
注:本系列的内容素材来自github,强烈建议手撸代码而非拷贝代码!
仓库地址:https://github.com/UnnamedMoose/BasicOpenFOAMProgrammingTutorials。
仓库所有者:Artur K Lidtke。”
(完)
本篇文章来源于微信公众号: CFD之道
评论前必须登录!
注册