除了前面提到的网格单元数据获取宏、网格面数据获取宏及节点数据获取宏外,在数据获取方面,还有几个非常常用的宏。编写UDF程序时,经常与这些宏打交道。这些宏包括:
-
Loookup_Thread
-
THREAD_ID
-
Get_Domain
-
F_PROFILE
-
THREAD_SHADOW
Thread是UDF中一种非常重要的数据结构,有时常常需要获取某个边界的Thread进行其他操作,此时可以利用宏Lookup_Thread实现。
-
宏描述:Lookup_Thread(d,id)
-
宏参数:Domain *d, int id
-
返回值:Thread *t
id值可以从边界条件面板中获取得到,如下图所示。
获取某个zone的ID之后,就可以对该区域进行操作了。下面的例程是获取ID为1的边界上各网格面中心节点坐标。
#include "udf.h"
DEFINE_ADJUST(print_f_centroids, domain) { real FC[2]; face_t f; int ID = 1; Thread *thread = Lookup_Thread(domain, ID); begin_f_loop(f, thread) { F_CENTROID(FC,f,thread);
printf("x= %f,y= %f", FC[0], FC[1]); } end_f_loop(f,thread) }
获取区域的ID可以使用宏THREAD_ID来实现。
-
宏描述:THREAD_ID(t)
-
宏参数:Thread *t
-
返回值:返回相应Thread的对应ID值,int类型
调用形式:
int zone_id = THREAD_ID(t);
获取区域指针可以通过宏Get_Domain来实现。
当区域的指针无法通过宏参数传递进来时,可以使用宏Get_Domain来获取指定id的区域的指针,利用DEFINE_ON_DEMAND宏中。
-
宏描述:Get_Domain(id)
-
宏参数:int id
-
返回值:Domain *d
注意:对于单相流,id值为1;对于多相流,id值为大于1的整数。
多相流中的id值可以在Phase对话框中查看,如下图所示。
下面是一个例程:
DEFINE_ON_DEMAND(my_udf) { Domain *mixture_domain; mixture_domain = Get_Domain(1); Domain *subdomain; subdomain = Get_Domain(2); ... }
设置边界值可以利用宏F_PROFILE来实现。
-
宏描述:F_PROFILE(f,t,i)
-
宏参数:face_t f, Thread *t, int i
-
返回值:void,此宏没有返回值
此宏后两个参数通过Fluent传入,第一个参数通过循环宏得到。如下例程:
#include "udf.h"DEFINE_PROFILE(pressure_profile,t,i) { real x[ND_ND]; real y; face_t f; begin_f_loop(f,t) { F_CENTROID(x,f,t); y = x[1]; F_PROFILE(f,t,i) = 1.1e5 - y*y; } end_f_loop(f,t) }
当一个面存在影子面时,可以利用宏THREAD_SHADOW获取该面的影子的Thread。
-
宏描述:THREAD_SHADOW(t)
-
宏参数:Thread *t
-
返回值:Thread *t
当宏参数所对应的面没有影子面时,此宏返回NULL。
本篇文章来源于微信公众号: CFD之道
评论前必须登录!
注册