本文摘要(由AI生成):
本文介绍了Fluent并行UDF中用于描述网格的专有术语。在并行计算中,网格被分割成不同区域,并引入内部单元、外部单元、内部面、边界面和外部面等术语来区分。外部单元分为规则和扩展两种,与相邻计算节点上的内部单元相对应。并行UDF处理网格时需注意分区边界上的单元复 制,以及避免在求和操作中重复计算分区边界面。Fluent使用PRINCIPAL_FACE_P宏来识别和处理分区边界面,确保数据只被计算一次。此外,外部单元和面的数据存储在每个Thread数据数组的末尾。
本文描述Fluen并行UDF中独有的网格术语。
注:本文内容翻译自Fluent文档
并行计算中涉及到网格的分割,因此需要引入一些术语来区分网格中不同类型的单元和网格面。注意这些术语仅适用于并行代码。
分区网格中主要包括两种类型的网格单元:内部单元与外部单元。内部单元完全存在与网格分区中,外部单元不包含在网格分区中,而是通过一个或多个相邻分区连接到交界面节点。
如果一个外部单元与一个内部单元共享一个网格面,那么它被称为一个规则的外部单元(Regular Exterior Cell)。如果外部单元只与内部单元共享一条边或一个节点,那么它被称为扩展的外部单元(Extended Exterior Cell)。一个计算节点上的外部单元对应于相邻计算节点上的相同内部单元。
当用户希望在并行网格中遍历网格单元时,这种分区边界上的单元复 制就变得极为重要。有单独的宏用于便利内部网格单元、外部单元以及所有单元。有关详细信息,请参阅循环宏。
图1 分区网格中的网格类型
在一个分区网格中有三种类型的网格面:内部面(Interior Face)、边界面(Boundary Zone Face)和外部面(External Face)。内部面包含两个相邻的网格,其位于分区边界(Partition Boundary)上的内部面称之为分区边界面。边界面位于物理网格边界上,只有一个相邻的网格单元。外部面是属于外部单元的非分区边界面。外部面通常不用于并行UDF。
图2 分区边界上的网格面
注意,每个分区边界面在相邻的计算节点上是重复的。这是必要的,这样每个计算节点都可以计算自己的面值。然而,当UDF涉及到在包含分区边界面的Thread中对数据求和的操作时,这种重复会导致face上的数据被计算两次。例如,如果UDF对一个网格中的所有面求和,那么当每个节点在其面上循环时,重复的分区边界面会被计算两次。因此,Fluent将每个相邻网格集 合中的一个计算节点作为划分边界面的“principal”计算节点。换句话说,虽然每个面可以出现在一个或两个分区上,但它只能正式属于其中的一个。如果面f是当前计算节点上的principal面,则宏PRINCIPAL_FACE_P(f,t)返回TRUE。
可以使用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)
每个Thread将与其网格单元或网格面相关联的数据存储在一组数组中。例如,压力存储在一个数组中,单元格c的压力是通过访问该数组的元素c获得的。外部单元和面数据存储在每个Thread数据数组的末尾。对于单元Thread,常规外部单元的数据先于扩展外部单元的数据
图3 数据存储结构