【答案】应助回帖
★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ... 歪歪_crazy: 金币+100, ★★★★★ 最佳答案 2016-12-01 17:05:41
引用回帖: 10楼 : Originally posted by
歪歪_crazy at 2016-12-01 10:27:57
首先,我试验了一下,确实如你所说的,DEFINE_SOURCE 是自带循环的,但是它的循环应该是针对每一个 cell ,也就是说没有一个 cell ,它会循环一次,而嵌在其中的 Loop 循环也会循环一次,并且每次循环得到的也是我先 ...
同学,我感觉你需要系统的学习一下C语言和UDF的编程了。。。。。
默认单相流domain只有1,多相流才需要用到更多的domain,如果你的Phases选项没开就不用考虑Get_Domain了,有问题可以仔细看看udf帮助里的Special Macros这节。我给你修改了一下程序,有问题再跟我说。
#include "udf.h"
// #define zone_ID 0 貌似没有编号为0的区域吧。。。
double P_out=0.;
DEFINE_ADJUST(TEG_adjust,domain) //定义里面有 domain,不用自己定义
{
Thread *t;
cell_t c;
// Domain *all; 没用,你的函数就是在定义的domain里用的
int Zone_ID=2; //两个ID有一个就够啦,不管你是全局变量还是局部变量,你又不会给他重新赋值,除非你要算多个区域的值,这里给个 2是随意定的,而且墙壁编号通常为2
face_t f;
real temp=0.,grad=0.,source=0.;
real a=0.,b=0.;
real u=0.,u_sum=0.,vol=0.,vol_sum=4.752*0.00001;
real r=0.,r_sum=0.,s=1.76*0.001;
real p=0.;
t=Lookup_Thread(domain,Zone_ID);
begin_c_loop (c,t)
{
temp=C_T(c,t);
vol=C_VOLUME(c,t);
grad=-0.0003*C_T_G(c,t)[0];/*0 for x,1 for y, 2 for z*/
a=-6.035*0.0001+6.270*0.000001*temp-1.571*0.00000001*temp*temp+1.260*0.00000000001*temp*temp*temp;
u=a*grad*vol/vol_sum;
u_sum+=u;
b=-7.188*0.0000001+6.926*0.000000001*temp-3.573*0.000000000001*temp*temp;
r=b*vol/s/s;
r_sum+=r;
}
end_c_loop (c,t) //开始和结束 至少一样啊。。。。
p=u_sum*u_sum/(2*r_sum);
P_out=p;//直接输出p不好么。。。。
Message("%g, %g %g\n", u_sum,r_sum,P_out);
}