注:本文内容翻译自Fluent文档
并行计算中涉及到网格的分割,因此需要引入一些术语来区分网格中不同类型的单元和网格面。注意这些术语仅适用于并行代码。
1 分区网格中的网格类型
分区网格中主要包括两种类型的网格单元:内部单元与外部单元。内部单元完全存在与网格分区中,外部单元不包含在网格分区中,而是通过一个或多个相邻分区连接到交界面节点。
如果一个外部单元与一个内部单元共享一个网格面,那么它被称为一个规则的外部单元(Regular Exterior Cell)。如果外部单元只与内部单元共享一条边或一个节点,那么它被称为扩展的外部单元(Extended Exterior Cell)。一个计算节点上的外部单元对应于相邻计算节点上的相同内部单元。
当用户希望在并行网格中遍历网格单元时,这种分区边界上的单元复制就变得极为重要。有单独的宏用于便利内部网格单元、外部单元以及所有单元。有关详细信息,请参阅循环宏。
2 分区边界上的网格面
在一个分区网格中有三种类型的网格面:内部面(Interior Face)、边界面(Boundary Zone Face)和外部面(External Face)。内部面包含两个相邻的网格,其位于分区边界(Partition Boundary)上的内部面称之为分区边界面。边界面位于物理网格边界上,只有一个相邻的网格单元。外部面是属于外部单元的非分区边界面。外部面通常不用于并行UDF。
注意,每个分区边界面在相邻的计算节点上是重复的。这是必要的,这样每个计算节点都可以计算自己的面值。然而,当UDF涉及到在包含分区边界面的Thread中对数据求和的操作时,这种重复会导致face上的数据被计算两次。例如,如果UDF对一个网格中的所有面求和,那么当每个节点在其面上循环时,重复的分区边界面会被计算两次。因此,Fluent将每个相邻网格集合中的一个计算节点作为划分边界面的“principal”计算节点。换句话说,虽然每个面可以出现在一个或两个分区上,但它只能正式属于其中的一个。如果面f是当前计算节点上的principal面,则宏PRINCIPAL_FACE_P(f,t)返回TRUE。
3 PRINCIPAL_FACE_P宏
可以使用PRINCIPAL_FACE_P宏测试测试一个给定的网格面是否是Principal面,然后再将其包含到一个面循环求和中。在下面的示例源代码中,仅当面为Principal面时,它的面积才会添加到整个面积中。
注:PRINCIPAL_FACE_P宏只能用于编译型UDF中。
begin_f_loop(f,t)
if PRINCIPAL_FACE_P(f,t)
{
F_AREA(area,f,t);
total_area +=NV_MAG(area);
}
end_f_loop(f,t)
4 外部Thread数据存储
每个Thread将与其网格单元或网格面相关联的数据存储在一组数组中。例如,压力存储在一个数组中,单元格c的压力是通过访问该数组的元素c获得的。外部单元和面数据存储在每个Thread数据数组的末尾。对于单元Thread,常规外部单元的数据先于扩展外部单元的数据
本篇文章来源于微信公众号: CFD之道
评论前必须登录!
注册