收藏 分销(赏)

用户自定义函数.pptx

上传人:丰**** 文档编号:12032821 上传时间:2025-08-31 格式:PPTX 页数:67 大小:1.31MB 下载积分:16 金币
下载 相关 举报
用户自定义函数.pptx_第1页
第1页 / 共67页
用户自定义函数.pptx_第2页
第2页 / 共67页


点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,用户自定义函数,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页,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服