上一篇解决了overlaps中vals是什么的问题,现在回头看看overlaps这个函数:
判定vals[i1]==patchCellType::PATCH的含义就清楚了,就是当下的zone的第i1个单元的类型如果是PATCH的话,对应的元就会被判定为hole。看i1的定义是一个index的返回量,index是这样的:
这个很好理解,相当于把一个三维的数组存放在一个一维的数组中,那么nDivs就是每一列对应的长度。现在可研究第三个问题了,i1的遍历范围是怎么样的?这是一个三层的for循环,ijk的范围就是从minid到maxid。而这两者是由index3进行返回,这里放一下index3的定义:
它返回的是一个labelVector。bb是一个boundBox类型,只有max和min。span是长度(max-min)。subBb——cBb是一个treeBoundBox类型(八叉树边框),官网描述是这样的:
cBb由函数CellBb返回:
网格mesh里的第i个cell(celli),对应若干个faces,而每个face有若干点points,取各个面的最大最小值,就是取这个体元的最大最小值,也就是外切方框bb。bb有6个元素,即三个方向的最大最小值。也就是说,每一个cBb,都对应着这个体元的外切方框的八叉树类型值。
而bb是srcPatchBb,来自patchBb[srcI],,patchBb在update()里读取:
这里有判定是否出现searchBox指定。我们默认不设置这个searchBox,毕竟全局box效果也很好了。meshBb来自procBb。procBb是并行用的,对每一个并行的范围设定一个box,这样,每一个处理器就不用搜索全局而是只搜索它们自己的领域了。
换句话说,bb是一个比较大的范围(每个计算小区的范围),cBb是体元的范围,那么maxId和minId就是说,其体元所在的计算小区的相对位置ref/d,再乘对应的nDivs,然后再取整。
结合上一篇,可以知道,i1的范围对应的是一个体元所在的nDivs的一个boundBox,其maxId和minId就是这个体元对应的index范围。再结合前面的内容,可以知道这一版overset的挖洞机制了:如果在一个体元的boundBox内,与另一层网格的PATCH所对应的boundBox有重合的地方,那么这个体元就会被判定为hole。它的原理绕开了繁琐的坐标位置判定,利用每个体元都有的位置框作为中介,来判定不同网格之间的位置关系,真是妙哉!我想,重叠网格的精髓就是boundBox吧。
暂无评论内容