OpenFOAM-v2006重叠网格挖洞问题研究以及overset代码解析(三)vals是什么?

上一篇解决了PATCH对应算例里哪一种patch的问题,结论就是wall这一类边界被重叠网格的程序指定为PATCH了,也就是说,vals[i1]的类别如果对应了wall这一类patch,那么该元就会被识别为hole。现在,需要厘清vals是什么,从何而来,以及i1遍历的对象是什么,如何使其挖到边缘附近。

左图是overlaps的输入,右边是markPatchesAsHole的传参。对应如下:

const boundBox& bb —— srcPatchBb

const labelVector& nDivs —— zoneDivs

const PackedList<2>& vals —— srcPatchTypes

const treeBoundBox& subBb —— cBb

const unsigned int val —— patchCellType::PATCH

注意到,overlaps中val是未被使用的,而是直接用patchCellType::PATCH来判定,应该是想更清晰一些。这里vals对应的是srcPatchTypes,这一参数在markPatchesAsHole里是这样的:

const PackedList<2>& srcPatchTypes = patchParts[srcI];

这里就有很多陌生的东西了。涉及到数据类型PackedList<2> 还有patchParts,还有srcI。这些都不知道是什么东西。从update()那里找markPatchesAsHole的传参:

可以知道,srcI是一个label(下标啦),由meshParts限定范围。meshParts是这样设置的:

 也就是说,有多少个zone,就有多少个meshParts,其为一个PtrList,即指向类型<T>。在圆柱绕流算例里,只有一个zone,也就是说meshParts只有一个元素,srcI只有1。如果srcI只有1,那么srcPatchParts就直接等于patchParts。

 然后是patchParts:

 也就是说,vals直接对应patchPatrs,它是PtrList<PackedList<2>>类型的数据。PackedList<2>是A dynamically allocatable list of packed unsigned integers(压缩无符号整数的动态可分配列表),那么patchParts就是一类列表类型的的指针列表了(好复杂,不能理解)。我们看patchParts是怎么被设置的:

 又有一个新的patchDivisions,它是这样计算的:

怎么理解这个divisions呢? 中文的意思是分开。默认情况下,它是由体元总数的n次方根决定的,这里n为网格的维度。如果算例是2维的,那么就是体元总数的平方根。并在第三维度上把对应位置的division设置为1,举例如下:

这里,nCells为19949,开平方根就是141,对应上方voxel(141 141 1),因为z方向是空的,这里设置成1。

综上,可以知道patchParts就是一个nZone x nDivisions的列表,vals就是其中一个zone的nDivisions列表,其中存放了nDivisions个网格量,且可以读取type进行判定。

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片