OpenFOAM中使用字典和IOobject类实现输入输出操作

OpenFOAM中使用字典和IOobject类实现输入输出操作


编译自:http://openfoamwiki.net/index.php/Input/Output_operations_using_dictionaries_and_the_IOobject_class


OpenFOAM中很多输入输出的操作都是使用IOobject类来实现的,其头文件说明了它的功能:


IOobject定义了对象的一些由objectRegistry隐式管理时所需要的属性,同时还提供了基础性的输入/输出流。一个IOobject

对象在构造的时候需要六个参数:对象名称,类名称,实例路径,一个objectRegistry的引用,以及描述读写方式的参数。


1 IOobject的构造函数

IOobject类有两种构造函数

  • 从对象名称,实例路径,objectRegistry引用和读写设置来构造。
 
IOobject  	
(  
    const word &   	 	name,
    const word &  		instance,
    const objectRegistry &  	registry,
    readOption  		r = NO_READ,
    writeOption  		w = NO_WRITE,
    bool  			registerObject = true
)
  • 从对象名称,实例路径,位置,objectRegistry引用和读写设置来构造。
 
IOobject  	
(
    const word &   	 	name,
    const word &  		instance,
    const fileName &  		local,
    const objectRegistry &  	registry,
    readOption  		r = NO_READ,
    writeOption  		w = NO_WRITE,
    bool  			registerObject = true
)

在阅读以上的代码片段时,请注意word是从string派生出来的,fileName也是从string派生出来的。除此之外,Time和polyMesh

是从objectRegistry继承而来。 因此,作为polyMesh的派生类,fvMesh同样也是objectRegistry非直接继承的派生类。


2 读设置选项

读设置选项定义了对象在构造和显示调用读操作时的行为:

  • MUST_READ
 在对象构造时必须从Istream中读取,如果Istream不存在或者不能读取时会产生一个错误信息。
  • READ_IF_PRESENT
 如果Istream存在,则读取对象,否则不读取。仅仅在Istream存在但是不可读取的情况下才会产生错误信息。
  • NO_READ
 不读取对象


3 写设置选项

写选项定义了对象在析构和显式调用读操作时的行为。

  • AUTO_WRITE
 当objectRegistry要求写的时候会自动写。
  • NO_WRITE
 在对象析构的时候不会自动写,但是可以显式调用写操作。


4 IOobject和字典

字典在声明的同时可以使用IOobject进行读取。通常,一个字典的内容是设置信息时,其读设置选项会设置成MUST_READ,而写设置

选项则设置为NO_WRITE以防设置信息被错误的覆盖。例如通常用来读取输运性质的transportProperties字典的定义:

 
IOdictionary transportProperties
(
     IOobject
     (
          "transportProperties",
          runTime.constant(),
          mesh,
          IOobject::MUST_READ,
          IOobject::NO_WRITE
     )
);

本例中使用了第一种构造函数,其中:

  • "transportProperties" 是含有字典的文件名称。
  •  runTime.constant()实例路径,给出字典的位置,在本例中存在于算例的constant路径下。
  •  objectRegistry为mesh(前面提过polyMesh和fvMesh都是是objectRegistry的派生类)。


IOobject和场

类似于字典,对于场数据的读写设置同样也可以通过IOobject类来实现。对于各种类型的场来说,调用的语法甚至都是相同的,可以

参见下面的例子。如果我们想定义一个名字叫做T的volScalarField场,并将其每个时间点计算的场数据保存下来,并放在以时间点命

名的路径下,可以这样实现:

 
volScalarField T
(
    IOobject
    (
        "T",
        runTime.timeName(),
        mesh,
        IOobject::MUST_READ,
        IOobject::AUTO_WRITE
    ),
    mesh
);

其中:

  • "T" 为文件名。
  • runTime.timeName()实例路径,这里是告诉OpenFOAM将每个文件存在以运行时间为名称的路径下面。
  • mesh是所需的objectRegistry。
  • 读/写设置选项设置为MUST_READ和AUTO_WRITE以便OpenFOAM可以读取场数据并自动保存。如果不需要读场数据,则需要将MUST_READ
  • 改为NO_READ。
  • 7
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
icoFoam 求解器名称 |-createFields.H 场变量的声明和初始化 ————————————————————————————————————————————— Info<< "Reading transportProperties\n" << endl; //屏幕提示读入参数控制文件,等价于 C++std::cout //声明属性字典对象,该对象由 constant 文件夹下的“transportProperties”初始化创建。 IOdictionary transportProperties ( IOobject //其实IOobject,顾名思义就是输入输出对象,它完成的是一个桥梁的作用,即连接要构造的及硬盘的相应文件。这可以通过其成员函数objectStream()了解到,当完成了“搭桥”之后,便可通过这一成员函数返回硬盘文件对应的输入流,从而从输入流读入将要构造的的相关信息// ( "transportProperties", // 文件名称 runTime.constant(), // 文件位置,case/constant mesh, // 网格对象 IOobject::MUST_READ_IF_MODIFIED, //如果更改,必须读入 IOobject::NO_WRITE // 不对该文件进行写操作 ) ); //字典查询黏性,以便初始化带有单位的标量 dimensionedScalar nu ( transportProperties.lookup("nu") ); //屏幕提示创建压力场 Info<< "Reading field p\n" << endl; //创建压力场 volScalarField p //声明一个带单位的标量场,网格心存储变量。 ( IOobject // IOobject主要从事输入输出控制 ( "p", // 压力场初始文件名称 runTime.timeName(), // 文件位置,由case的system/controlDict的startTime控制 //

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值