上一篇的结尾提出了3个问题。回答这些问题能帮助我理解OpenFOAM重叠网格的执行过程。
首先我们来看第一个问题:PATCH对应哪一类patch?
看到cellCellStencil.H文件,里面有PATCH的定义:
在这里,PATCH的值设为1,后面注释可以翻译为靠近非耦合边界。这是一类patch-Cell的类型,其他两类为other和overset。下面是cellType,即体元的类型,有三类:calculated,对应不重叠的区域,此区域体元正常处理;interpolated,插值,这部分体元需要插值处理;hole,洞元,不处理。以圆柱重叠网格为例,下图给出了对应区域:
如上图,红色对应值为2,即hole区域;蓝色对应0值,为不处理的区域;绿色对应1值,为需要插值处理的区域。左图是背景网格的,右图是圆柱层网格的。可以看到,背景网格所挖的洞仅在圆柱内一圈,然后是两层的插值层,代表背景网格内部的洞与外部的网格之间有一层新的边界,这一层边界是人为产生的,需要进行插值计算,即从圆柱层往下插值赋值来实现。而看到圆柱网格,没有进行挖洞处理,在网格外层有两层插值元,这是网格本身就有的,也是需要背景网格往上插值赋值到这两层来计算。圆柱网格内部蓝色的是进行正常的计算。
然而tecplot只能查看体元的值,对patch是没办法查看的。我需要知道什么样的patch会被定义成PATCH,而什么会被定义成OVERSET,这似乎对挖洞的识别过程非常重要。
OpenFOAM里patch是什么样的一个概念呢?patch可以理解为一个面,由一组face面元组合而成,一般作为边界,并在计算时赋予属性,如速度入口、压强出口、壁面条件等等。face既包括外部的边界面,也包括内部面。而patch则一般指边界面,且由很多face组成。
在圆柱绕流这一算例中,圆柱的patch有三类:wall即圆柱面,overset即最外层网格面和empty即前后面(二维算例)。
那么问题来了,程序是什么时候开始将这些边界的patch分类并赋值的呢?我怀疑,wall对应的边界patch,被定义成PATCH,而overset类patch则定义成OVERSET,empty等则是OTHER。那么,从判据来看,程序只挖wall附近的洞,似乎是讲得通的。
在inverseDistanceCellCellStencil.C的第158行找到markBoundary函数,字面意思就是标记边界用的。markBoundary在每次update中都会进行。看它如何定义PATCH:
在这一段程序中,先是遍历所有的patch(pbm),然后进行一次if判定。判定内容是constrainType,是属于fvPatch空间的,上官网搜一下,其解释是“return true if the given type is a constraint type”。constraint是约束的意思,一般的constraint boundary在OpenFOAM里指cyclic,cyclicAMI,empty,symmetry,wedge,overset等等,可以在etc/caseDic/setConstraintTypes看看。在这里,这个if判定如果不是约束性条件,则执行下面的代码。那么,一般的边界如patch、wall就会落到这里进行了。后面的就不用看,可以推断wall这一类patch被指定为PATCH了。
后面则是将overset的patch指定为OVERSET,也是十分易懂。
综上,PATCH对应于除了overset、empty之外的patch,在圆柱绕流这个算例中,wall被指定为PATCH,overset被指定为OVERSET,empty默认为OTHER。
暂无评论内容