资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,用户自定义函数,UDF,第1页,用户自定义函数,用户自定义函数或,UDF,是用户自编程序它能够被动态连接到,Fluent,求解器上来提升求解器性能用户自定义函数用,C,语言编写使用,DEFINE,宏来定义,UDFs,中可使用标准,C,语言库函数也可使用预定义宏,Fluent Inc.,提供经过这些预定义宏能够取得,Fluent,求解器得到数据,第2页,UDF分类与区分,UDFs,使用时能够被看成,解释函数,或,编译函数,解释函数,在运行时读入并解释,编译,UDFs,则在编译时被嵌入共享库中并与,Fluent,连接,解释,UDFs,用起来简单不过有源代码和速度方面限制不足。,编译型,UDFs,执行起来较快也没有源代码限制但设置和使用较为麻烦,第3页,UDF用途,满足用户个性化需求,边界条件,材料性质,表面与体积反应速率,输运方程源项,用户标量输运方程(UDS),调整每次迭代值,初始化流场,异步执行,后处理改进,模型改进(离散项模型,多相混合物模型,辐射模型等),第4页,UDF举例,上壁面温度 300K,绝热壁面,绝热壁面,温度:315K,温度分布,第5页,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),第6页,Profile处理关键点,(和普通计算一样设置求解器,模型等),DefineProfileRead(数据),DefineBoundaryCondition所需设置面ThermalTemperatureTemp t,(和普通计算一样,设置其它边值条件、初值条件及求解与结果检验等),第7页,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),第8页,UDF设置边界温度处理关键点,(和普通计算一样设置求解器,模型等),DefineUser definedFunctions(Interpreted Or Compiled)编译,DefineBoundaryCondition所需设置面ThermalTemperatureBottom Temperature,(和普通计算一样,设置其它边值条件、初值条件及求解与结果检验等),第9页,侧面与地面两处UDF,第10页,定义一个以上UDF,上壁面温度 300K,温度抛物线分布,绝热壁面,温度:315K,温度分布,第11页,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。,第12页,边界温度分布,左侧温度分布 下面温度分布,第13页,场温度分布,第14页,UDF编写用C语言,注释,/*这是刘某人讲课示范用程序 */,数据类型,Int,:整型,Long,:长整型,Real,:实数,Float:,浮点型,Double:,双精度,Char:,字符型,UDF,解释函数在单精度算法中定义,real,类型为,float,型,在双精度算法宏定义,real,为,double,型。因为解释函数自动作如此分配,所以使用在,UDF,中申明全部,float,和,double,数据变量时使用,real,数据类型是很好编程习惯。,第15页,局部变量,局部变量只用于单一函数中。当函数调用时,就被创建了,函数返回之后,这个变量就不存在了,局部变量在函数内部(大括号内)申明。在下面例子中,,mu_lam,和,temp,是局部变量。,第16页,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;,第17页,FLUENT,求解过程中,UDFs,先后次序,非耦合求解器,第18页,耦合求解器,第19页,FLUENT,网格拓扑,单元(,cell,)区域被分割成控制容积,单元中心(,cell center,),FLUENT,中场数据存放地方,面(,face,)单元(,2D or 3D,)边界,边(,edge,)面(,3D,)边界,节点(,node,)网格点,单元线索(,cell thread,),在其中分配了材料数据和源项单元组,面线索(,face thread,)在其中分配了边界数据面组,节点线索(,node thread,)节点组,区域(,domain,),由网格定义全部节点、面和单元线索组合,第20页,第21页,Fluent数据类型,cell_t,face_t,Thread,Node,Domain,cell_t,是线索(,thread,)内单元标识符数据类型。它是一个识别给定线索内单元整数索引。,face_t,是线索内面标识符数据类型。它是一个识别给定线索内面整数索引。,Thread,数据类型是,FLUENT,中数据结构。它充当了一个与它描述单元或面组合相关数据容器。,Node,数据类型也是,FLUENT,中数据结构。它充当了一个与单元或面拐角相关数据容器。,Domain,数据类型代表了,FLUENT,中最高水平数据结构。它充当了一个与网格中全部节点、面和单元线索组合相关数据容器。,第22页,使用,DEFINE Macros,定义,UDF,DEFINE_MACRONAME(udf_name,passed-in variables),这里括号内第一个自变量是你,UDF,名称。名称自变量是情形敏感必须用,小写字母,指定。,一旦函数被编译(和连接),你为你,UDF,选择名字在,FLUENT,下拉列表中将变成可见和可选。第二套输入到,DEFINE,宏自变量是从,FLUENT,求解器传递到你函数变量。,第23页,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,面板)下拉列表中变为可见和可选。,第24页,UDF,源文件中包含,udf.h,文件,#include udf.h,经过在你,UDF,源文件中包含,udf.h,,编译过程中全部,DEFINE,宏定义与源代码一起被包含进来。,udf.h,文件也为全部,C,库函数头文件包含,#include,指示,与大部分头文件是针对,Fluent,提供宏和函数是一样(比如,,mem.h,)。除非有另外指示,没必要在你,UDF,中个别地包含这些头文件。,第25页,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,函数不返回值因为它被申明为空数据类型。,第26页,UDF任务,返回值,修改自变量,返回值和修改自变量,修改,FLUENT,变量(不能作为自变量传递),写信息到(或读取信息从),case,或,data,文件,第27页,返回值,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,;,第28页,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.;,第29页,返回一个值和修改一个自变量函数,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,;,第30页,修改,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),第31页,写/读,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*/,第32页,DEFINE_ADJUST,功效及其使用方法,第33页,功效,DEFINE_ADJUST是一个用于调整和修改FLUENT变量通用宏。,能够用DEFINE_ADJUST来修改流动变量(如:速度,压力)并计算积分。,用来对某一标量在整个流场上积分,然后在该结果基础上调整边界条件。,在每一步迭代中都能够执行用DEFINE_ADJUST定义宏,并在解输运方程之前每一步迭代中调用它。,第34页,DEFINE_ADJUST(name,d),DEFINE_ADJUST有两个参变量:name和d。name是你所指定UDF名字。当你UDF编译并连接时,你FLUENT图形用户界面就会显示这个名字,此时你就能够选择它了。d是FLUENT解算器传给你UDF变量。,D是一个指向区域指针,调整函数被应用于这个区域上。区域变量提供了存取网格中全部单元和表面线程。对于多相流,由解算器传给函数区域指针是混合层区域指针。,DEFINE_ADJUST函数不返回任何值给解算器。,第35页,DEFINE_INIT,用DEFINE_INIT宏来定义一组解初始值。,DEFINE_INIT 完成和修补一样功效,只是它以另一个方式UDF来完成。,每一次初始化时DEFINE_INIT函数都会被执行一次,并在解算器完成默认初始化之后马上被调用。因为它是在流场初始化之后被调用,所以它最惯用于设定流动变量初值。,第36页,DEFINE_INIT(name,d),DEFINE_INIT有两个参变量:name和d。,name是你所指定UDF名字。当你UDF编译并连接时,你FLUENT图形用户界面就会显示这个名字,此时你就能够选择它了。,d是FLUENT解算器传给你UDF变量所作用计算区域,第37页,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),第38页,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),第39页,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,第40页,提取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,耗散率,第41页,速度导数,名称(参数),参数类型,返回值,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,第42页,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,层流扩散率,物性参数,第43页,循环宏,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),查询单元节点,第44页,UDF编译连接,Interpreted UDFs:,解释,UDF被编译成与体系结构无关中间代码或伪码。这一代码调用时是在内部模拟器或解释器上运行。与体系结构无关代码牺牲了程序性能,但其UDF可易于共享在不一样结构体系之间,即操作系统和FLUENT版本中。,Compiled UDFs:,编译后UDF由C语言系统编译器编译成当地目标码。这一过程须在FLUENT运行前完成。在FLUENT运行时会执行存放于共享库里目标码,这一过程称为“动态装载”。,第45页,Interpreted UDFs,第46页,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就行了.,第47页,Compiled UDFs,方法二,在Compiled UDF里,点add source codes,找到源程序,加入,然后build,再LOAD就行了。,(假如在在原来文件夹下已经有libudf文件夹,那你把它删了再进行上面步骤,或者你把libudf文件夹改成其它任何名字),第48页,Compiled UDFs关键点,设置比较严格,步骤繁琐,但计算效率高。,有些语句有改变(在UDF中,要在控制窗口显示一些值,比如说压力值,用Interpreted UDF时就得用printf语句,而在Compiled UDF时就得用Message语句,二者不能互用.,第49页,激活UDF,已计算值调整,第50页,激活模型明确,UDF,第51页,第52页,第53页,第54页,第55页,第56页,UDS,求解用户自定义标量输运方程,如电磁流体(用于自定义标量求解磁场),磁场对流体加速与阻尼用UDF加入方程中,第57页,标量输运基本理论,单相流动,对于任意标量,Fluent求解方程,UDS只能用于流体区域计算,多相流动,对于任意标量,Fluent求解方程,第58页,定常单相流求解方程,无对流通量,质量流率计算出对流通量,用户自定义通量,第59页,UDS求解过程,1、确定用户自定义标量数,Define-userdefined-scalars,最多50个,第60页,UDS求解过程(续),给定Flux Function,none,mass flow rate,user-defined function,(DEFINE_UDF_FLUX,第61页,UDS求解过程(续),设定Unsteady Function,none(default),user-defined function,(DEFINE_UDS_UNSTEADY),第62页,UDS求解过程(续),设定边界条件,Define-boundary conditions,第63页,UDS求解过程(续),(假如有源项)流体面板,define-boundary conditions-fluid,第64页,UDS求解过程(续),设定求解参数,给定初始值,计算,检验求解结果,scalar-n,Diffusion Coef.Of Scalar-n,第65页,User Defined Scalars,FLUENT,can solve generic transport equations for User Defined Scalars,k,:,User specifies:,Define,Models,User-Defined Scalars,Number of,User-Defined Scalars,Flux Function,F,i,DEFINE_UDS_FLUX(name,face,thread,index),A,case,statement must be used to define different flux functions for each UDS.,Example,Can be used to determine magnetic and/or electric field in a fluid zone.,k=1,N,scalars,第66页,User Defined Scalars(2),User must also specify:,Diffusivity,case,statement must be used to define diffusivities for each UDS.,Source terms,S,Boundary Conditions for each UDS.,Specified Flux,or,Specified Value,.,Define as constant or with UDF.,第67页,
展开阅读全文