并行UDF代码中存在一些与串行代码不同的遍历宏。
并行分区网格由内部网格(Interior Cell)与外部网格(Exterior Cell)组成。Fluent提供了一组单元循环宏,用户可以使用它们来循环内部单元、外部单元、内部单元面与外部单元面。
图1 分区网格
宏 begin … end_c_loop_int可以在分区网格上遍历内部网格单元。它包含一个begin和end语句,在这些语句之间,可以依次对thread的每个内部单元格执行操作。宏被传递一个单元索引c和一个单元thread指针tc。
图2 内部网格
使用形式:
begin_c_loop_int(c,tc){ ...}end_c_loop_int(c,tc)
例如以下的示例代码:
real total_volume = 0.0;begin_c_loop_int(c,tc){ total_volume += C_VOLUME(c,tc);}end_c_loop_int(c,tc)
Fluent提供了3个宏用于遍历外部网格:
每个宏包含一个begin和end语句,在这些语句之间,可以依次对每个thread的外部单元执行操作。宏参数包括一个单元索引c和单元thread指针tc。
begin_c_loop_ext(c, tc){ ...}end_c_loop_ext(c,tc)
注:通常情况下并不需要使用外部网格遍历宏。
图3 外部网格
有两个宏可以用来遍历分区网格中的内部网格及部分或全部外部单元格:
图4 两个宏对应的两类网格
每个宏包含一个begin和end语句,在这些语句之间,可以依次对每个thread的内部及外部单元执行操作。宏参数包括一个单元索引c和单元thread指针tc。
begin_c_loop(c,tc){ ...}end_c_loop(c,tc)
示例代码:
real temp;begin_c_loop(c,tc){ temp = C_T(c,tc); C_UDMI(c,tc,0) = (temp - tmin) / (tmax - tmin);}end_c_loop(c,tc)
并行Fluent中包含两种面:内部网格面(Interior Face)以及边界面(Boundary Zone Face)。
图5 内部网格面与外部网格面
利用宏begin,end_f_loop可以遍历计算节点上的内部面以及边界面。此宏包含begin以及end语句,宏形式为:
begin_c_loop(f,tf){ ...}end_f_loop(f,tf)
注:UDF中还存在begin_f_loop_int和begin_f_loop_ext循环宏,它们分别遍历一个计算节点的内部面和外部面。_int形式等同于begin_c_loop_int。尽管这些宏存在,但它们在udf中没有实际应用,通常情况下不应该使用它们。
分区边界面(Partition boundary face)位于两个相邻计算节点之间的边界上,并且存在于两个计算节点上。因此,当执行一些计算时(如求和)分区边界面在一个面循环中会被计算两次。可以通过使用PRINCIPAL_FACE_P来测试当前节点是否是face循环宏中的face的主要计算节点来纠正。
begin_f_loop(f,tf)if PRINCIPAL_FACE_P(f,tf){ F_AREA(area,f,tf); total_area += NV_MAG(area); total_pres_a += NV_MAG(area)*F_P(f,tf);}end_f_loop(f,tf)total_area = PRF_GRSUM1(total_area);total_pres_a = PRF_GRSUM1(total_pres_a);
免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删