在OpenFOAM的一些资料中,常常提及objectRegister(对象注册).但对其引入的动机描述不是很清晰.比如下述资料中,概略地描述了其引入的动机(https://openfoamwiki.net/index.php/OpenFOAM_guide/objectRegistry):简化求解器与数据之间的通讯;
进一步查阅一些资料以后,我做了一些猜测:
1.网格是OpenFOAM中的基础,其他量都依附于网格.
前处理确定了一个主体网格,速度,压强这些量,被放置在这个网格的中心或者顶点上.
2.某些情况下,一个算例要用到多套网格系统.
比如一条鱼和一条潜水艇在海中运动,抽象为物理模型就是两个物体在某个计算域(一个已知流场)内做相对运动,我们既要在鱼上划分网格,也需要在潜艇上划分网格,还需要给整个海域划分一套网格.为了区分三套网格上的速度,我们就要把同名的变量(速度,压强,温度)分别关联到三套网格上,所以注册的意思就是关联.
请问我这个猜测是否正确?
objectRegistry 是一个具有层级关系的数据库,它存放了 OpenFOAM 中使用的相关的数据。它继承自 regIOobject.
代码级
class objectRegistry
:
public regIOobject,
public HashTable<regIOobject*>
{
// Private Data
//- Master time objectRegistry
const Time& time_;
...
regIOobject 又是一个抽象类,继承自 IOobject,用来处理对象注册 objectRegistry。
regIOobject is an abstract class derived from IOobject to handle automatic object registration with the objectRegistry
IOobject 则定义了某个对象的属性,支持隐性的 objectRegistry 管理,并提供了执行 I/O 流的架构。IOobject 的继承关系:
看了 objectRegistry 的结构,来说说为什么需要 objectRegistry?
OpenFOAM 可以使用多种方法来求解场,因此,需要一个统一的框架来处理数据与求解器之间的通信。
任何时候需要处理模型数据里都会用到 objectRegistry。
一个 objectRegistry 本身就是一个 regIOobject,因此,它也可以是另一个 objectRegistry 的成员。这就出现了层级关系,比如说,一个 scalarTransportFoam 当其初始化时,就创建了 objectRegistry 层级关系,以出现的顺序来列出:[2]
runTime //Time (objectRegistry)
|-controlDict //IOdictionary (regIOobject)
`-mesh //fvMesh (objectRegistry)
|-fvSchemes //IOdictionary (regIOobject)
|-fvSolution //IOdictionary (regIOobject)
|-points //pointIOField (regIOobject)
|-faces //faceIOlist (regIOobject)
|-owner //labelIOlist (regIOobject)
|-neighbour //labelIOlist (regIOobject)
|-boundary //polyBoundaryMesh (regIOobject)
|-pointZones //pointZoneMesh (regIOobject)
|-faceZones //faceZoneMesh (regIOobject)
|-cellZones //cellZoneMesh (regIOobject)
|-T //volScalarField (regIOobject)
|-U //volVectorField (regIOobject)
`-transportProperties //IOdictionary (regIOobject)
因此,我认为,
- 所有的基础应该是 runTime,然后才是 mesh
- 有了 mesh 之后,就可以定义场,比如 p, U 之类的,以及其他属性了
- p, U 及其他属性是与 mesh 关联的,因此,有几套网格,就应当有几套 p 和 U
参考文献
- OpenFOAM: API Guide: objectRegistry Class Reference
- OpenFOAM guide/objectRegistry - OpenFOAMWiki