什么是对象注册(objectRegister)?

在OpenFOAM的一些资料中,常常提及objectRegister(对象注册).但对其引入的动机描述不是很清晰.比如下述资料中,概略地描述了其引入的动机(https://openfoamwiki.net/index.php/OpenFOAM_guide/objectRegistry):简化求解器与数据之间的通讯;

进一步查阅一些资料以后,我做了一些猜测:
1.网格是OpenFOAM中的基础,其他量都依附于网格.
前处理确定了一个主体网格,速度,压强这些量,被放置在这个网格的中心或者顶点上.
2.某些情况下,一个算例要用到多套网格系统.
比如一条鱼和一条潜水艇在海中运动,抽象为物理模型就是两个物体在某个计算域(一个已知流场)内做相对运动,我们既要在鱼上划分网格,也需要在潜艇上划分网格,还需要给整个海域划分一套网格.为了区分三套网格上的速度,我们就要把同名的变量(速度,压强,温度)分别关联到三套网格上,所以注册的意思就是关联.

请问我这个猜测是否正确?

objectRegistry 是一个具有层级关系的数据库,它存放了 OpenFOAM 中使用的相关的数据。它继承自 regIOobject.

classFoam_1_1objectRegistry__inherit__graph

代码级

 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

classFoam_1_1regIOobject__coll__graph

IOobject 则定义了某个对象的属性,支持隐性的 objectRegistry 管理,并提供了执行 I/O 流的架构。IOobject 的继承关系:
classFoam_1_1IOobject__inherit__graph

看了 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)

因此,我认为,

  1. 所有的基础应该是 runTime,然后才是 mesh
  2. 有了 mesh 之后,就可以定义场,比如 p, U 之类的,以及其他属性了
  3. p, U 及其他属性是与 mesh 关联的,因此,有几套网格,就应当有几套 p 和 U

参考文献

  1. https://www.openfoam.com/documentation/guides/latest/api/classFoam_1_1objectRegistry.html
  2. https://openfoamwiki.net/index.php/OpenFOAM_guide/objectRegistry