Sunday, May 4, 2008

DEFINE_ON_DEMAND

使用DEFINE_ON_DEMAND 宏可以定义一个按命令执行的UDF,这比让FLUENT 在计算过程中机械地调用UDF 优越的多。UDF 一旦被激活,可以立即被执行,不过,当求解器正在迭代的时候,函数是不可以调用的。注意,域指示器d 作为DEFINE_ON_DEMAND 的一个自变量,它的传送是明确的。所以,如果想在这个UDF 中使用域变量,那么首先需要使用FLUENT提供的Get_Domain 工具重新得到它。

例子

下面的这个名为on_demand_calc
UDF

  • 计算和输出关于当前数据场的温度最小值,最大值和平均值。
  • 然后,再计算一个温度函数


 

f(T)=(T-T_min)/(T_max-T_min)


 

并且把它存放到自定义内存位置0。一旦连接了这个UDF,关于f (T) 的这个场值将在FLUENT的后处理面板中的下拉菜单中变地可用。用户可以在自定义内存类中通过选择udm-0 选择这个场。如果在执行UDF 之后写了一个数据文件,那么这个自定义内存场将会保存到这个文件中。相应的源代码可以在FLUENT 中被通译或汇编。


 


 

/********************************************************************

UDF:计算温度场的函数并存放在自定义内存中。输出温度的最小值,最下值和平均值。

*********************************************************************/

#include "udf.h"

DEFINE_ON_DEMAND(on_demand_calc)

{

Domain *d; /*自从作为一个到DEFINE 宏的自变量,传布域指示器,
Domain数据类型代表了FLUENT中最高水平的数据结构。它充当了一个与网格中所有节点、面和单元线索组合相关的数据容器。*/

real trag = 0.; //定义变量并初始化

real tmax = 0.;

real tmin = 0.;

real temp,volume,vol_tot;

Thread *t: //Thread数据类型是 FLUENT中的数据结构。它充当了一个与它描述的单元或面的组合相关的数据容器。

cell_t c; /*cell_t是线索(thread)内单元标识符的数据类型。它是一个识别给定线索内单元的整数索引。face_t是线索内面标识符的数据类型。它是一个识别给定线索内面的整数索引。*/

d = Get_Domain(1); /*使用FLUENT 设备获得域,
获得控制区,
Get_Domain is a macro that retrieves the pointer to a domain */

/*轮循于域中的所有单元脉络*/

thread_loop_c(t,d) /* We require all cell threads to.. */

{

/*计算温度的最大值,最小值和体积平均值*/

/*轮循于所有的单元*/

begin_c_loop(c,t)

{

volume = C_VOLUME(c,t); /*获得单元体积*/

temp = C_T(c,t); /*获得单元温度*/

if (temp < tmin || tmin == 0.) tmin = temp;

if (temp > tmax || tmax == 0.) tmax = temp;

vol_tot += volume; //总体积

tavg += temp*volume; //温度关于体积积分

}

end_c_loop(c,t)

tavg /= vol_tot; //体积平均温度

printf("\n Tmin = %g Tmax = %g\n Tvag = %g\n",tmin,tmax,tavg);

/*计算温度函数,并存放在自定义内存中*/

/*(位置指标0) */

begin_c_loop(c,t)

{

temp = C_T(c,t);

C_UDMI(c,t,0) = (temp-tmin)/(tmax-tmin); //宏C_UDMI可以用在你的UDF 中去访问一个位于某个单元特殊用户定义内存的位置。 F_UDMIà面内的用户定义特殊内存。

}

end_c_loop(c,t)

}

}

名为on_demand_calc 的函数没有任何明确的自变量。在函数体内,首先函数所用的变量被定义和初始化。在宣布了函数变量之后,一个轮循宏被用来轮循过域中的每一个单元,一个轮循到另一个轮循,从而轮循过所有的单元。在轮循内部,总体积以及温度的最大值,最小值和体积上平均值得到了计算。这些计算结果被输出到FLUENT 的控制台。然后过每一个单元的第二次轮循用来计算函数f (T) ,并把这个函数存放在自定义内存的0 位置。

No comments: