udf-使用经验总结

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

我接触UDF的时间不算长,2007年7月份开始看UDF的中文帮助,花了一周时间大体看完后,第一感觉:不难啊,至少不像以前别人给我讲的很高深的样子。然后就是UDF编程,直到10月底吧。然后用的时间就不多了。然后就是这两周,我马上就要研究生毕业了,可能这周结束后用UDF编程的可能性会很小了,所以想写点东西,给刚刚学UDF编程的人,希望对大家有用。对于UDF高手,估计是不用向下看了。

UDF框架

光看书,感觉UDF不难。看例子,有些看个四五遍之后才能差不多看懂。原来,得靠UDF帮助。我主要用的是fluent v6.3自带的html格式的帮助,里面东西很全,当然也包括UDF Manual。里面自带的search功能相当好,只是要注意用好+或-号(逻辑符号),另外,这个功能似乎有些浏览器支持不太好,不过基本上用IE不太容易出问题。

对于从零开始学习UDF,建议还是先看一下UDF中文帮助,我估计大家知道的都是马世虎翻译的那本吧,感觉挺好。(没想到马世虎跟我是校友,去年给安世亚太投过一份简历,他给我打过电话,当时一阵兴奋,呵呵。)

1. 对于只涉及到边界条件或物性等的UDF,一般用interpret就可以的,这些我觉得只需要根据例子改一下就是了。

$$ 对于要添加UDS方程的,相对难一点。我编程用的是三到五个UDS,几十个UDM。一开始编程时,没有头绪,后来看别人编的,才慢慢发现了一些基本思路。比如,可以用枚举定义UDS或UDM,这样用起来方便。

enum{

NP,

RHOH2O_Y_UP_X,

RHOH2O_Y_UP_Y,

RHOH2O_Y_UP_Z,

N_REQUIRED_UDS

};//枚举UDS变量名

对于UDM,则用N_REQUIRED_UDM代表个数。

2. 然后在INIT与ADJUST函数中,检查变量个数时则比较方便,如:

DEFINE_INIT(init_parameter,domain)

{

if (n_uds

Error("Not enough user defined scalars!(init)\n");

if (n_udm

Error("Not enough user defined memories(init)!\n");

initialise(domain);//代表初始化

}

DEFINE_A DJUST(adjust_compute,domain)

{

if (n_uds

Error("Not enough user defined scalars!(adjust)\n");

if (n_udm

Error("Not enough user defined memories(adjust)!\n");

update_parameter(domain);//代表主函数

}

3. 初始化时,则可:

cell_t c;

Thread *t;

int i;

thread_loop_c(t,d)

{

if(NNULLP(T HREA D_STORA GE(t,SV_UDS_I(NP)))&&NNULLP(T HREA D_STORA GE(t,SV_UDS_I(NP_R)))) //为各UDS提供存储空间

{

begin_c_loop(c, t)

{

for (i=0; i

C_UDSI(c,t,i) = 0.0;

}

end_c_loop(c, t);

}

if(NNULLP(T HREA D_STORA GE(t,SV_UDM_I)))

{

begin_c_loop(c, t)

{

for (i=0; i

C_UDMI(c,t,i) = 0.0;

}

end_c_loop(c, t);

}

}

4. 对于各UDM量,则可:

real udm_v;

udm_v=0;//用之前对变量进行初始化

...//UDM相关运行

C_UDM I(c,t,UDM_V)=udm_v;//把值输入给UDM,当然之前要对UDM_V进行定义

用UDM有个好处,一是可以在后处理中显示,二是传递变量相当方便,比如在ADJUST中计算的量用于源项或对流项等,用UDM可以直接调用。

5. 对于invalid number错误,很多时候是因为分母为零,如果习惯UDM初始化为零,则要注意避免零作分母,可以令其初始化不为零

或为零时不运算(第二种方法比较好)。

方程与计算

我编程计算的是两相流中一相凝结成核,需要用UDS方程来模拟其成核有关变量(不要来问我程序代码,呵呵)。我觉得对UDS变量控制方程搞清楚之后,这块一点儿也不难。一般变量的控制方程(Fluent能认识的),就是含有瞬态项(时间项),对流项,扩散项与源项。(方程如何处理fluent会自己弄的)对第一项,都有相应的宏来处理。

1. 对于对流项,比如关于phi的方程中的:rho*U*phi的散度,其中U为速度矢量,则fluent中需要知道的对流项则为rho*U.A,其中U.A

代表U与A的点积,A代表单元格的面积向量。对流是对面而言(2D的话则对线而言),对于边界,只有一边有单元格,而对于内部surface,则两边都有单元格,这时单元格编号从0到1。比如,对于内部边界,代码可以与下面类似:

real NV_VEC(psi),NV_VEC(A),flux1;//声明向量操作

c0=F_C0(f,t);

t0=F_C0_T HREA D(f,t);

F_A REA(A,f,t);//A的获得

c1=F_C1(f,t);

t1=F_C1_T HREA D(f,t);

NV_D(psi,=,C_UDMI(c0,t0,UPX),C_UDMI(c0,t0,UPY),C_UDMI(c0,t0,UPZ));

NV_D(psi,+=,C_UDMI(c1,t1,UPX),C_UDM I(c1,t1,UPY),C_UDMI(c1,t1,UPZ));

flux1=NV_DOT(psi,A)/2.0;

对于边界上,则可以只用单元格c0,t0处的值或用f,t处的值(代表直接在边界面上取值,前提是边界上有存储值)。

相关文档
最新文档