资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,用户自定义函数,UDF,用户自定义函数,用户自定义函数或,UDF,是用户自编的程序它可以被动态的连接到,Fluent,求解器上来提高求解器性能用户自定义函数用,C,语言编写使用,DEFINE,宏来定义,UDFs,中可使用标准,C,语言的库函数也可使用预定义宏,Fluent Inc.,提供通过这些预定义宏可以获得,Fluent,求解器得到的数据,UDF分类与区别,UDFs,使用时可以被当作,解释函数,或,编译函数,解释函数,在运行时读入并解释,编译,UDFs,则在编译时被嵌入共享库中并与,Fluent,连接,解释,UDFs,用起来简单但是有源代码和速度方面的限制不足。,编译型,UDFs,执行起来较快也没有源代码限制但设置和使用较为麻烦,UDF的用途,满足用户个性化需求,边界条件,材料性质,表面与体积反应速率,输运方程源项,用户标量输运方程(UDS),调节每次迭代值,初始化流场,异步执行,后处理改善,模型改进(离散项模型,多相混合物模型,辐射模型等),UDF举例,上壁面温度 300K,绝热壁面,绝热壁面,温度: 315K,温度分布,Profile处理,(Temp point 26),(x,0.00E-03 2.00E-03 4.00E-03 6.00E-03 8.00E-03 1.00E-02 1.20E-02 1.40E-02 1.60E-02 1.80E-02 2.00E-02 2.20E-02 2.40E-02 2.60E-02 2.80E-02 3.00E-02 3.20E-02 3.40E-02 3.60E-02 3.80E-02 4.00E-02 4.20E-02 4.40E-02 4.60E-02 4.80E-02 5.00E-02 ),(y,0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 ),(t,3.49E+02 3.50E+02 3.50E+02 3.47E+02 3.46E+02 3.44E+02 3.41E+02 3.39E+02 3.36E+02 3.33E+02 3.31E+02 3.28E+02 3.26E+02 3.24E+02 3.22E+02 3.20E+02 3.19E+02 3.18E+02 3.17E+02 3.16E+02 3.16E+02 3.16E+02 3.15E+02 3.15E+02 3.15E+02 3.15E+02 ),Profile处理要点,(和一般计算一样设置求解器,模型等),DefineProfileRead (数据),DefineBoundaryCondition所需设置的面ThermalTemperatureTemp t,(和一般计算一样,设置其它边值条件、初值条件及求解与结果检查等),UDF处理温度,#include udf.h,DEFINE_PROFILE(bottom_temperature, thread, position),real xND_ND;/* this will hold the position vector */,real y;,face_t f;,begin_f_loop(f, thread),F_CENTROID(x,f,thread);,y = x0;,F_PROFILE(f,thread,position) = 315. + (y-.044)*(y-.044)/.044/.044*35.;,end_f_loop(f, thread),UDF设置边界温度处理要点,(和一般计算一样设置求解器,模型等),DefineUser definedFunctions(Interpreted Or Compiled)编译,DefineBoundaryCondition所需设置的面ThermalTemperatureBottom Temperature,(和一般计算一样,设置其它边值条件、初值条件及求解与结果检查等),侧面与地面两处UDF,定义一个以上UDF,上壁面温度 300K,温度抛物线分布,绝热壁面,温度: 315K,温度分布,UDF编写,#include udf.h,DEFINE_PROFILE(bottom_temperature, thread, position),程序1,DEFINE_PROFILE(side_temperature, thread, position),程序2,DEFINE_PROFILE(inlet_velocity,thread,position),程序3。,边界温度分布,左侧温度分布 下面温度分布,场温度分布,UDF编写用C语言,注释,/* 这是刘某人讲课示范用的程序 */,数据类型,Int,:整型,Long,:长整型,Real,:实数,Float:,浮点型,Double:,双精度,Char:,字符型,UDF,解释函数在单精度算法中定义,real,类型为,float,型,在双精度算法宏定义,real,为,double,型。因为解释函数自动作如此分配,所以使用在,UDF,中声明所有的,float,和,double,数据变量时使用,real,数据类型是很好的编程习惯。,局部变量,局部变量只用于单一的函数中。当函数调用时,就被创建了,函数返回之后,这个变量就不存在了,局部变量在函数内部(大括号内)声明。在下面的例子中,,mu_lam,和,temp,是局部变量。,DEFINE_PROPERTY(cell_viscosity, cell, thread),real mu_lam;,real temp = C_T(cell, thread);,if (temp 288.),mu_lam = 5.5e-3;,else if (temp 286.),mu_lam = 143.2135 - 0.49725 * temp;,else mu_lam = 1.;,return mu_lam;,FLUENT,求解过程中,UDFs,的先后顺序,非耦合求解器,耦合求解器,FLUENT,网格拓扑,单元(,cell,) 区域被分割成的控制容积,单元中心(,cell center,),FLUENT,中场数据存储的地方,面(,face,) 单元(,2D or 3D,)的边界,边(,edge,) 面(,3D,)的边界,节点(,node,) 网格点,单元线索(,cell thread,),在其中分配了材料数据和源项的单元组,面线索(,face thread,) 在其中分配了边界数据的面组,节点线索(,node thread,) 节点组,区域(,domain,),由网格定义的所有节点、面和单元线索的组合,Fluent数据类型,cell_t,face_t,Thread,Node,Domain,cell_t,是线索(,thread,)内单元标识符的数据类型。它是一个识别给定线索内单元的整数索引。,face_t,是线索内面标识符的数据类型。它是一个识别给定线索内面的整数索引。,Thread,数据类型是,FLUENT,中的数据结构。它充当了一个与它描述的单元或面的组合相关的数据容器。,Node,数据类型也是,FLUENT,中的数据结构。它充当了一个与单元或面的拐角相关的数据容器。,Domain,数据类型代表了,FLUENT,中最高水平的数据结构。它充当了一个与网格中所有节点、面和单元线索组合相关的数据容器。,使用,DEFINE Macros,定义,UDF,DEFINE_MACRONAME(udf_name, passed-in variables),这里括号内第一个自变量是你的,UDF,的名称。名称自变量是情形敏感的必须用,小写字母,指定。,一旦函数被编译(和连接),你为你的,UDF,选择的名字在,FLUENT,下拉列表中将变成可见的和可选的。第二套输入到,DEFINE,宏的自变量是从,FLUENT,求解器传递到你的函数的变量。,DEFINE_PROFILE(inlet_x_velocity, thread, index),用两个从,FLUENT,传递到函数的变量,thread,和,index,定义了名字为,inlet_x_velocity,的分布函数。这些,passed-in,变量是边界条件区域的,ID,(作为指向,thread,的指针)而,index,确定了被存储的变量。一旦,UDF,被编译,它的名字(例如,,inlet_x_velocity,)将在,FLUENT,适当的边界条件面板(例如,,Velocity Inlet,面板)的下拉列表中变为可见的和可选的。,UDF,源文件中包含,udf.h,文件,#include udf.h,通过在你的,UDF,源文件中包含,udf.h,,编译过程中所有的,DEFINE,宏的定义与源代码一起被包含进来。,udf.h,文件也为所有的,C,库函数头文件包含,#include,指示,与大部分头文件是针对,Fluent,提供的宏和函数是一样的(例如,,mem.h,)。除非有另外的指示,没必要在你的,UDF,中个别地包含这些头文件。,DEFINE_PROFILE(inlet_x_velocity, thread, index),定义在,udf.h,文件中为,#,define DEFINE_PROFILE(name, t, i) void name(Thread *t, int i),在编译过程中延伸为,void inlet_x_velocity(Thread *thread, int index),名字为,inlet_x_velocity,的函数不返回值由于它被声明为空的数据类型。,UDF任务,返回值,修改自变量,返回值和修改自变量,修改,FLUENT,变量(不能作为自变量传递),写信息到(或读取信息从),case,或,data,文件,返回值,DEFINE_PROPERTY,返回一个,udf.h,中指定的,real,数据类型。两个,real,变量传入函数:通过函数计算层流粘度,mu_lam的值,其是温度C_T(cell,thread),的函数。根据单元体温度,计算出,mu_lam,,在函数结尾,,mu_lam,值被返回。,DEFINE_PROPERTY(cell_viscosity, cell, thread),real mu_lam;,real temp =,C_T(cell, thread),;,if (temp 288.),mu_lam = 5.5e-3;,else if (temp 286.),mu_lam = 143.2135 - 0.49725 * temp;,else,mu_lam = 1.;,return,mu_lam,;,Function that Modify an Argument,判断单元是否在多孔区域,给多孔介质区域定义反应速率;,real,指针变量,rr,是一个传递给函数的自变量。,UDF,使用废弃操作符,*,分配反应速率值给废弃指针,*rr,。指针,rr,指向的目标是设置反应速率。通过这个操作,存储在内存中这个指针上的字符的地址被改变了,不再是指针地址本身,#include udf.h,#define K1 2.0e-2,#define K2 5.,DEFINE_VR_RATE(user_rate, c, t, r, mole_weight, species_mf, rr, rr_t),real s1 = species_mf0;,real mw1 = mole_weight0;,if (FLUID_THREAD_P(t) & THREAD_VAR(t).fluid.porous),*rr = K1*s1/pow(1.+K2*s1),2.0)/mw1;,else,*rr = 0.;,返回一个值和修改一个自变量的函数,DEFINE_SOURCE,返回一个在,udf.h,中指定的数据类型。函数采用自变量,ds,(它是数组的名字)并设置由,eqn,指定的元素为关于速度(,w_vel,)导数的值。(这是,z,动量方程源项)。这个函数也计算了旋转速度源项的值,source,,并返回这个值到求解器。,#include udf.h,#define OMEGA 50. /* rotational speed of swirler */,#define WEIGHT 1.e20 /* weighting coefficients in linearized equation */,DEFINE_SOURCE(user_swirl, cell, thread, dS, eqn),real w_vel, xND_ND, y, source;,C_CENTROID(x, cell, thread);,y = x1;,w_vel = y*OMEGA; /* linear w-velocity at the cell */,source = WEIGHT*(w_vel - C_WSWIRL(cell,thread);,dSeqn = -WEIGHT;,return,source,;,修改,FLUENT,变量的函数,函数由声明变量,f,作为,face_t,数据类型开始。一维数组,x,和变量,y,是,real,数据类型。循环宏用来在区域中每个面上循环以创建型线或数据数组。在每个循环内,,F_CENTROID,为含有,index f,的面输出面质心的值(数组,x,),,index f,在由,thread,指向的线索上。存储在,x1,中的,y,坐标分配给变量,y,,它用于计算,x,速度。然后这个值分配给,F_PROFILE,它使用整数,index,(由求解器传递个它)来设置内存中面上的,x,速度值。,DEFINE_PROFILE(inlet_x_velocity, thread, index),real xND_ND;,/* this will hold the position vector */,real y;,face_t f;,begin_f_loop(f, thread),F_CENTROID(x,f,thread);,y = x1;,F_PROFILE(f, thread, index) = 20. - y*y/(.0745*.0745)*20.;,end_f_loop(f, thread),写/读,Case,或,Data,文件,在顶部整数,kount,被定义为全局的(由于它被源代码文件中的所有三个函数使用)并初始化为,0,。名字为,demo_calc,的第一个函数,使用,DEFINE_ADJUST,宏来定义。,在,demo_calc,中,,kount,的值每次迭代后增加因为每次迭代调用,DEFINE_ADJUST,一次。,名字为,writer,的第二个函数,使用,DEFINE_RW_FILE,宏来定义。当保存数据文件时,它指示,FLUENT,写当前,kount,值到数据文件。,名字为,reader,的第三个函数,当读取数据文件时,它指示,FLUENT,从这个数据文件中读取,kount,的值。,这三个函数一起工作如下。如果你运行,10,次迭代计算(,kount,将增加到值为,10,)并保存这个数据文件,当前,kount(10),的值被写入你的数据文件。如果你读这个数据返回到,FLUENT,并继续计算,,kount,将以值,10,开始随着每次迭代继续增加。,#include udf.h,int kount = 0; /* define global variable kount */,DEFINE_ADJUST(demo_calc, domain),kount+;,printf(kount = %dn,kount);,DEFINE_RW_FILE(writer, fp),printf(Writing UDF data to data file.n);,fprintf(fp, %d,kount); /* write out kount to data file */,DEFINE_RW_FILE(reader, fp),printf(Reading UDF data from data file.n);,fscanf(fp, %d, /* read kount from data file */,DEFINE_ADJUST,功能及其使用方法,功能,DEFINE_ADJUST是一个用于调节和修改FLUENT变量的通用宏。,可以用DEFINE_ADJUST来修改流动变量(如:速度,压力)并计算积分。,用来对某一标量在整个流场上积分,然后在该结果的基础上调节边界条件。,在每一步迭代中都可以执行用DEFINE_ADJUST定义的宏,并在解输运方程之前的每一步迭代中调用它。,DEFINE_ADJUST ( name, d),DEFINE_ADJUST有两个参变量:name和d。name是你所指定的UDF的名字。当你的UDF编译并连接时,你的FLUENT图形用户界面就会显示这个名字,此时你就可以选择它了。d是FLUENT解算器传给你的UDF的变量。,D是一个指向区域的指针,调节函数被应用于这个区域上。区域变量提供了存取网格中所有单元和表面的线程。对于多相流,由解算器传给函数的区域指针是混合层区域指针。,DEFINE_ADJUST函数不返回任何值给解算器。,DEFINE_INIT,用DEFINE_INIT宏来定义一组解的初始值。,DEFINE_INIT 完成和修补一样的功能,只是它以另一种方式UDF来完成。,每一次初始化时DEFINE_INIT函数都会被执行一次,并在解算器完成默认的初始化之后立即被调用。因为它是在流场初始化之后被调用的,所以它最常用于设定流动变量的初值。,DEFINE_INIT ( name, d),DEFINE_INIT有两个参变量:name和d。,name是你所指定的UDF的名字。当你的UDF编译并连接时,你的FLUENT图形用户界面就会显示这个名字,此时你就可以选择它了。,d是FLUENT解算器传给你的UDF的变量所作用的计算区域,DEFINE_INIT举例,下面的UDF名字是my_init_func,它在某一个解中初始化了流动变量。在解过程开始时它被执行了一次。它可以作为解释程序或者编译后的UDF在FLUENT中执行。,#include udf.h,DEFINE_INIT(my_init_function, domain),cell_t c;,Thread *t;,real xcND_ND;,/* loop over all cell threads in the domain */,thread_loop_c (t,domain),/* loop over all cells */,begin_c_loop_all (c,t),C_CENTROID(xc,c,t);,if (sqrt(ND_SUM(pow(xc0 - 0.5,2.),pow(xc1 - 0.5,2.),pow(xc2 - 0.5,2.) 0.25),C_T(c,t) = 400.;,else,C_T(c,t) = 300.;,end_c_loop_all (c,t),DEFINE_ON_DEMAND,#include udf.h,DEFINE_ON_DEMAND(on_demand_calc),Domain *d; /* declare domain pointer since it is not passed a */,/* argument to DEFINE macro */,real tavg = 0.;,real tmax = 0.;,real tmin = 0.;,real temp,volume,vol_tot;,Thread *t;,cell_t c;,d = Get_Domain(1); /* Get the domain using Fluent utility */,/* Loop over all cell threads in the domain */,thread_loop_c(t,d),/* Compute max, min, volume-averaged temperature */,/* Loop over all cells */,begin_c_loop(c,t),volume = C_VOLUME(c,t); /* get cell volume */,temp = C_T(c,t); /* get cell temperature */,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 Tavg = %gn,tmin,tmax,tavg);,/* Compute temperature function and store in user-defined memory*/,/*(location index 0) */,begin_c_loop(c,t),temp = C_T(c,t);,C_UDMI(c,t,0) = (temp-tmin)/(tmax-tmin);,end_c_loop(c,t),DEFINE,DEFINE_DELTAT,DEFINE_DIFFUSIVITY,DEFINE_HEAT_FLUX,DEFINE_NOX_RATE,DEFINE_PROFILE,DEFINE_PROPERTY,DEFINE_SCAT_PHASE_FUNC,DEFINE_SOURCE,DEFINE_SR_RATE,DEFINE_TURB_PREMIX_SOURCE,DEFINE_TURBULENT_VISCOSITY,DEFINE_UDS_FLUX,DEFINE_UDS_UNSTEADY,DEFINE_VR_RATE,提取Fluent中变量值,C,_,T(c,t)cell t c,Thread *t,温度,C,_,P(c,t)cell t c,Thread *t,压力,C,_,U(c,t)cell t c,Thread *t,u,方向的速度,C,_,V(c,t)cell t c,Thread *t,v,方向的速度,C,_,W(c,t)cell t c,Thread *t,w,方向的速度,C,_,H(c,t)cell t c,Thread *t,焓,C,_,YI(c,t,i)cell t c,Thread *t,int i,物质质量分数,C,_,K(c,t)cell t c,Thread *t,湍流运动能,C,_,D(c,t)cell t c,Thread *t,耗散率,速度导数,名称(参数),参数类型,返回值,C DUDX(c,t),cell t c,Thread *t,velocity derivative,C DUDY(c,t),cell t c,Thread *t,velocity derivative,C DUDZ(c,t),cell t c,Thread *t,velocity derivative,C DVDX(c,t),cell t c,Thread *t,velocity derivative,C DVDY(c,t),cell t c,Thread *t,velocity derivative,C DVDZ(c,t),cell t c,Thread *t,velocity derivative,C DWDX(c,t),cell t c,Thread *t,velocity derivative,C DWDY(c,t),cell t c,Thread *t,velocity derivative,C DWDZ(c,t),cell t c,Thread *t,velocity derivative,C_R(c,t),cell t c,Thread *t,密度,C_MU L(c,t),cell t c,Thread *t,层流粘性系数,C_MU T(c,t),cell t c,Thread *t,湍流粘性系数,C_MU EFF(c,t),cell t c,Thread *t,有效粘度,C_K_L(c,t),cell t c,Thread *t,层流热传导系数,C_K_T(c,t),cell t c,Thread *t,湍流热传导系数,C_K_ EFF(c,t),cell t c,Thread *t,有效热传导系数,C_CP(c,t),cell t c,Thread *t,比热,C_RGAS(c,t),cell t c,Thread *t,通用气体常数,C_DIFF L(c,t,i,j),cell t c,Thread *t,int i,int j,层流扩散率,物性参数,循环宏,6.2.1 Looping over Cell Threads in a Domain ( thread_loop_c),查询控制区的单元线,6.2.2 Looping over Face Threads in a Domain ( thread_loop_f),查询控制区的面,6.2.3 Looping over Cells in a Cell Thread ( begin.end_c_loop),查询单元线中的单元,6.2.4 Looping over Faces in a Face Thread ( begin.end_f_loop),查询面单元中的面,6.2.5 Looping over Faces on a Cell ( c_face_loop),查询单元面,6.2.6 Looping over Nodes of a Cell ( c_node_loop),查询单元节点,UDF编译连接,Interpreted UDFs:,解释的,UDF被编译成与体系结构无关的中间代码或伪码。这一代码调用时是在内部模拟器或解释器上运行。与体系结构无关的代码牺牲了程序性能,但其UDF可易于共享在不同的结构体系之间,即操作系统和FLUENT版本中。,Compiled UDFs :,编译后的UDF由C语言系统的编译器编译成本地目标码。这一过程须在FLUENT运行前完成。在FLUENT运行时会执行存放于共享库里的目标码,这一过程称为“动态装载”。,Interpreted UDFs,Compiled UDFs,方法一,在你case所在的目录下,建立libudf,在libudf下建立两个src和ntx86子目录,源程序(*.c)放进src;在ntx86下再建2d、2d_host、2d_node等,(2d)然后在2d文件夹下,把Fluent.Incfluent6. srcmakefile_nt.udf和Fluent.Inc fluent6. src user_nt.udf拷进去,将makefile_nt.udf重命名为makefile,接着修改user_nt.udf里的内容,要改成以下格式:,SOURCES = $(SRC)udfexample.c(源程序名字),VERSION = 2d(是二维还是三维) PARALLEL_NODE = none(有没有并行),最后点开始-程序-附件-命令提示符,进入DOS界面,访问libudfntx862d,然后敲nmake,这样就OK了.,然后在FLUENT里load这个libudf就行了.,Compiled UDFs,方法二,在Compiled UDF里,点add source codes,找到源程序,加入,然后build,再LOAD就行了。,(如果在在原来的文件夹下已经有libudf文件夹,那你把它删了再进行上面的步骤,或者你把libudf文件夹改成其它任何名字),Compiled UDFs要点,设置比较严格,步骤繁琐,但计算效率高。,有些语句有变化(在UDF中,要在控制窗口显示一些值,比如说压力值,用Interpreted UDF时就得用printf语句,而在Compiled UDF时就得用Message语句,二者不能互用.,激活UDF,已计算值的调整,激活模型明确,UDF,UDS,求解用户自定义标量输运方程,如电磁流体(用于自定义标量求解磁场),磁场对流体的加速与阻尼用UDF加入方程中,标量输运基本理论,单相流动,对于任意标量,Fluent求解方程,UDS只能用于流体区域计算,多相流动,对于任意标量,Fluent求解方程,定常单相流求解方程,无对流通量,质量流率计算出对流通量,用户自定义通量,UDS求解过程,1、确定用户自定义标量数,Define-userdefined-scalars,最多50个,UDS求解过程(续),给定Flux Function,none, mass flow rate, user-defined function,(DEFINE_UDF_FLUX,UDS求解过程(续),设定Unsteady Function,none (default), user-defined function,(DEFINE_UDS_UNSTEADY),UDS求解过程(续),设定边界条件,Define-boundary conditions,UDS求解过程(续),(如果有源项)流体面板,define-boundary conditions-fluid,UDS求解过程(续),设定求解参数,给定初始值,计算,检查求解结果,scalar-n,Diffusion Coef. Of Scalar-n,
展开阅读全文