上一篇解决了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进行判定。
暂无评论内容