Cell Field Variable Macros(单元场变量宏)
数据获取常用宏
除了前面提到的网格单元数据获取宏、网格面数据获取宏及节点数据获取宏外, 在数据获取方面, 还有几个非常常用的宏。编写 UDF 程序时, 经常与这些宏打交道。这些宏包括:
获取指定区域的 Thread
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
获取区域的 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
当一个面存在影子面时, 可以利用宏 THREAD_SHADOW 获取该面的影子的 Thread。
- 宏描述:THREAD_SHADOW(t)
- 宏参数:Thread *t
- 返回值:Thread *t
当宏参数所对应的面没有影子面时, 此宏返回 NULL。
DEFINE_DIFFUSIVITY 宏
Note that diffusivity UDFs (defined using DEFINE_DIFFUSIVITY) are called by FLUENT from within a loop on cell threads. Consequently, your UDF will not need to loop over cells in a thread since FLUENT is doing it outside of the function call. Your UDF will be required to compute the diffusivity only for a single cell and return the real value to the solver.