第七章自定义函数.docx
第七章自定义函数7.1,概述用户自定义函数(USerDefinedFunctions,即UDFS)可以提高FLUENT程序的标准计算功能。它是用C语言书写的,有两种执行方式:interpreted型和ComPiled型。InterPreted型比较容易使用,但是可使用代码(C语言的函数等)和运行速度有限制。ComPiled型运行速度快,而且也没有代码使用范围的限制,但使用略为繁琐。我们可以用UDFS来定义:a)边界条件b)源项c)物性定义(除了比热外)d)表面和体积反应速率e)用户自定义标量输运方程f)离散相模型(例如体积力,拉力,源项等)g)代数滑流(algebraicslip)混合物模型(滑流速度和微粒尺寸)h)变量初始化i)壁面热流量j)使用用户自定义标量后处理边界条件UDFS能够产生依赖于时间,位移和流场变量相关的边界条件。例如,我们可以定义依赖于流动时间的X方向的速度入口,或定义依赖于位置的温度边界。边界条件剖面UDFs用宏DEFINE_PROFILE定义。有关例子可以在5.1和6.1中找到。源项UDFS可以定义除了DO辐射模型之外的任意输运方程的源项。它用宏DEFINE.SOURCE定义。有关例子在5.2和6.2中可以找到。物性UDFS可用来定义物质的物理性质,除了比热之外,其它物性参数都可以定义。例如,我们可以定义依赖于温度的粘性系数。它用宏DEFINE.PROPERTY定义,相关例子在6.3中。反应速率UDFS用来定义表面或体积反应的反应速率,分别用宏DEFINE_SR_RATE和DEFlNE_VR_RATE定义,例子见6.4。离散相模型用宏DEFlNE_DPM定义相关参数,见5.4。UDFs还可以对任意用户自定义标量的输运方程进行初始化,定义壁面热流量,或计算存贮变量值(用用户自定义标量或用户自定义内存量)使之用于后处理。相关的应用见于5.3,5.5,5.6和5.7oUDFS有着广泛的应用,本文并不能一一叙述。如果在使用中遇到问题,可以联系FLUENT技术支部门要求帮助。在此推荐一个网站,上面有FLUENT论坛,可进行相关询问和讨论。7.1.1 书写UDFs的基本步骤在使用UDFs处理FLUENT模型的过程中,我们一般按照下面五步进行:1 .概念上函数设计2 .使用C语言书写3 .编译调试C程序4 .执行UDF5 .分析与比较结果第一步分析我们所处理的模型,目的是得到我们要书写的UDF的数学表达式。第二步将数学表达式转化成C语言源代码。第三步编译调试C语言源代码。第四步在FLUENT中执行UDF0最后一步,将所得到的结果与我们要求的进行比较,如果不满足要求,则需要重复上面的步骤,直到与我们期望的吻合为止。7.1.2 Interpreted型与Compiled型比较CompiledUDFs执行的是机器语言,这和FLUENT本身运行的方式是一样的。一个叫做Makefne的过程能够激活C编辑器,编译我们的C语言代码,从而建立一个目标代码库,目标代码库中包含有高级C语言的低级机器语言诠释。在运行的时候,一个叫做“dynamicloading"的过程将目标代码库与FLUENT连接。一旦连接之后,连接关系就会在case文件中与目标代码库一起保存,所以读入CaSe文件时,FLUENT就会自动加载与目标代码库的连接。这些库的建立是基于特定计算机和特定FLUENT版本的,所以升级FLUENT版本后,就必须重新建立相应的库。相反,InterpretedUDFs是在运行的时候直接装载编译C语言代码的。在这种情况下,生成的机器代码不依赖于计算机和FLUENT版本。编译后,函数信息将会保存在CaSe文件中,所以读入CaSe文件时,FLUENT也会自动加载相应的函数。InterPretedUDFs具有较强的可移植性,而且编译比较简单。对于简单的UDFs,如果对运行速度要求不高,一般就采用ImerPreted型的。下面列出的是两种UDFs的一些特性:1. InterpretedUDFs 独立于计算机结构; 能够完全当作CompiledUDFs使用; 不能与其它编译系统或用户库连接;一只支持部分C语言,不能包含:got。语句,非ANSIC语法,结构,联合,函数指针,函数数组等。!InterpretedUDFs能够使用FLUENT提供的宏,间接引用存贮于FLUENT的变量,详见2.10。2. CompiledUDFs运行速度比InterpretedUDFs快; 能够完全于C语言结合; 能够用任何兼容ANSI-C的编辑器编译; 对不同FLUENT版本(2D或3D)需要建立不同的共享库;不一定能够当作InterpretedUDFs使用。我们在使用中首先要根据具体情况,明确使用哪种UDFs,然后才能进一步去实现,在使用中要注意上面叙述的事项。第二节书写UDFs7.2.1 概述书写Interpreted型和Compiled型用户自定义函数的过程和书写格式是一样的。主要的区别在于与C语言的结合程度,Compiled型能够完全使用C语言的语法,而Interpreted型只能使用其中一小部分,这在前面有过论述。7.2.2 UDF格式通用的UDF格式由三部分组成:1 .定义恒定常数和包含库文件,分别由#DEFlNE和#INCLUDE陈述(见2.3);2 .宏DEFINE_*定义UDF函数(见2.4);3 .函数体部分(见2.9)包含库有Udf.h,sg.h,mem.h,prop.h,dpm.h等,其中Udf.h是必不可少的,书写格式为include“udf.h";所有数值都应采用Sl单位制;函数体部分字母采用小写,Interpreted型只能够包含FLUENT支持的C语言语法和函数。7.2.3 包含库udf.h库文件udf.h必须C函数开头包含。7.2.4 定义函数7.2.4.1 简介Fluent公司提供了一套宏,来帮助我们定义函数。这些宏都以DEFlNE一开始,对它们的解释包含在Udf.h文件中,所以我们必需要包含库Udf.h0为了方便使用,我们把对Udf.h文件中解释宏列在附录A中。UDF使用宏DEFlNE_定义,括号列表中第一个参数代表函数名。例如DEFlNE_PROFILE(inlet_x_velocity,thread,position)定义了一个名为inlet_x_velocity的函数。!所有函数名必须小写紧接着函数名的是函数的输入参数,如上函数inlet_xvelocity有两个输入参数:thread和POSitioithread是一个指针,指向数据类型Thread,POSition是个整数(见2.4.3)oUDF编译和连接之后,函数名就会出现在FLUENT相应的下拉列表内。如上述函数,编译连接之后,就能在相应的边界条件面板内找到一个名为inlet_x_velocity的函数,选定之后就可以使用。7.2.4.2 udf.h文件中对宏DEFINE_的解释在Udf.h文件中,对附录A的宏作了解释,例如:#defineDEFINE_PROFlLE(name,t,I)voidname(Thread*t,inti)通用的宏解释格式为#definemacroreplacement-text在编译前,C预处理器(即cpp)先进行宏替代。例如DEFINE_PROFILE(inlet_x_velocity,thread,position)替代为voidinlet_x_velocity(Thread*thread,intposition)替代后的函薮返回实型值或不返回任何值。如上述函数由于是void型的,所以不返回任何值。7.2.43 宏DEFINE宏DEFlNE是用来定义UDFS的,可以分为三类:通用的,离散相的和多相的。从宏DEFINE下划线的后缀,我们可以看出该宏是用来定义哪种类型函数的。如DEFINE_SOURCE定义的函数用来修改输运方程源项,DEFINE_PROPERTY定义的函数用来定义物质的物理性质。通用的宏在2.5详述,离散相和多相的分别在2.6中详述。下面是附录A的简列。通用类型:1.DEF1NE.ADJUST2.DEFINE.DIFFUSIVITY3.DEFINE_HEAT_FLUX4.Definejnit5.DEF1NE_ON_DEMAND6.DEFINE_PROFILE7.DEFINE_PROPERTY8.DEFINE_RW_FILE9.DEF1NE_SCAT_PHASE_FUNC10.DEFINE_SOURCE11.DEFINE_SR_RATE12.DEFlNEJJDS_FLUX13.DEFINEjJDSJJNSTEADY14.DEF1NE_VR_RATE离散相模型:1.DEFINE_DPM_BODY_FORCE2.DEF1NE_DPM_DRAG3.DEFINE_DPM_ER0S10N4.DEFlNE_DPMNJECTIoNNlT5.DEFlNE_DPM_LAW6.DEFINE_DPM_OUTPUT7.DEFINE_DPM_PROPERTY8.DEFINE_DPM_SCALAR_UPDATE9.DEFINE_DPM_SOURCE10.DEFINE_DPM_SWITCH多相模型:1.DEFINE_DRIFT_DIAMETER2.DEFINESLIPVELOCITY7.2.44 2数据类型的定义作为对C语言数据类型的补充,FLUENT定义了几种特殊的数据类型,最常用的是:Thread,cell,face,NodeDomainoThread是相应边界最网格应域的结构类型数据;CeILt表示单独一个控制体体积元,产来定义源项或物性;face对应于网格面,用来定义入口边界条件等;NOde表示相应的网格节点;Domain是一种结构,其中包含所有的threads,cells,faces和nodeso!Thread,cell,face,NOde和DOmain要区分大小写。7.2.5 通用宏及其定义的函数宏DEFINE用来定义UDFs,下面是通用宏的具体解释。7.2.5.1DEFINE.ADJUSTNameArgumentsArgumentsTypeReturnTypeDEFINE_ADJUSTdomainDomain*domainvoid该函数在每一步迭代开始前,即在求解输运方程前执行。可以用来修改调节流场变量,计算积分或微分等。参数domain在执行时,传递给处理器,通知处理器该函数作用于整个流场的网格区域。如何激活该函数请参见4.6,具体求解例子见5.3,5.6和5.7。7.2.5.2DEFlNE_DIFFUSIVITYNameArgumentsArgumentsTyPeReturnTypeDEFINE_DIFFUSIVITYc,t,icell_tc,Thread*t,intireal该函数定义的是组分扩散系数或者用户自定义标量输运方程的扩散系数,c代表网格,t是指向网格线的指针,i表示第几种组分或第几个用户自定义标量(传递给处理器)。函数返回的是实型数据。例子见5.3。7.2.5.3DEFINE_HEAT_FLUXNameArgumentsArgumentsTyPeReturnTypeDEFINE_HEAT_FLUXf,t,c,t,cid,cirface_tf,Thread*3cell_tc,Thread*t,realcid,realcirvoid该函数定义的是网格与邻近壁面之间扩散和辐射热流量。f表示壁面,t指向壁面线,cO表示邻近壁面的网格,t指向网格线。函数中需要给出热扩散系数(Cid)和辐射系数(cir),才能求出扩散热流量(qid)和辐射热流量(qir)。在计算时,FLUENT按照下面的公式求解:qid=cidf+cid1×C_T(cO,t)-cid2×F_T(f,t)-cid3Xpow(F_T(f,t),4)qir=cir0+cir1×C_T(cO,t)-cir2×F_T(f,t)-cir3×pow(F.T(f,t),4)该函数无返回值。如何激活函数见4.7,曲子见5.6。7.2.6 DefinejnitNameArgumentsArgumentsTypeReturnTyPeDefinejnitdomainDomain*domainvoid该函数用于初始化流场变量,它在FLUENT默认的初始化之后执行。作用区域是全场,无返回值。函数的激活见4.5,例子见5.4.1和5.5。7.2.7DEFINE_ON_DEMANDNameArgumentsArgumentsTypeReturnTypeDEFINE_ON_DEMANDvoid该函数不是在计算中由FLUENT自动调用,而是根据需要手工调节运行。如何执行见4.12,例子见5.8。7.2.8DEFINE.PROFILENameArgumentsArgumentsTypeReturnTypeDEFINE_PROFILEt,icell_tc,Thread*treal该函数定义边界条件0t指向定义边界条件的网格线,i用来表示边界的位置。函数在执行时,需要循环扫遍所有的边界网格线,值存贮在F_PR0FILE(f,t,i)中,无返回值。选择使用本函数见4.1,例子见5.1.1,5.1.2,5.1.3,5.3,6.1.1和6.1.2。7.2.9DEFINE-PROPERTYNameArgumentsArgumentsTypeReturnTypeDEFINE_PROPERTYC,tcell_tc,Thread*treal该函数用来定义物质物性参数。C表示网格,t表示网格线,返回实型值。使用见4.3,例子见631。7.2.10DEFINE_RW_FILENameArgumentsArgumentsTypeReturnTypeDEFINE_RW_FILEfpFILE*fpvoid该函数用于读写case和data文件。fp是指向所读写文件的指针。使用见4.11,例子见2.9.8。7.2.11DEFINE_SCAT_PHASE_FUNCNameArgumentsArgumentsTypeReturnTypeDEFINE_SCAT_PHASE_FUNCC,frealc,real*freal该函数定义DO(DiSCreteOrdinate)辐射模型中的散射相函数(radiationscatteringphasefunction)o计算两个变量:从i向到j向散射的辐射能量分数和前向散射因子(forwardscatteringfactor)。C表示的是i和j向夹角的余弦值,散射的能量分数由函数返回,前向散射因子存贮在指针f所指的变量中。处理器对每种物质,都会调用此函数,分别建立各物质的散射矩阵。7.2.12DEFINE.SOURCENameArgumentsArgumentsTjpeReturnTypeDEFINE_SOURCEc,3dS»icell_tc,Thread*3realdS,intireal该函数定义,除了Do辐射模型之外,输运方程的源项。在计算中,函数需要扫描全场网格。C表示网格,t表示网格线,dS表示源项对所求输运方程的标量的偏导数,用于对源项的线性化;i标志所定义源项对应于哪个输运方程。使用见4.2,例子见5.2.1,5.2.2,5.3,6.2.1。7.2.13DEFINE_SR_RATENameArgumentsArgumentsTyPeReturnTypeDEFINE_SR_RATEf,3r,mw,yi,rrface_tf,Thread*3Reaction*r,real*mw,real*yi,real*rrvoid该函数定义表面化学反应速率。f表示面,t表示面的线,r是结构指针,表示化学反应;mw和yi是个实型指针数组,mw存贮物质的分子量,yi存贮物质的质量分数,IT设置函数的一个相关参数。函数无返回值,使用见4.8。7.2.14DEFlNE_UDS_FLUXNameArgumentsArgumentsTypeReturnTypeDEFINE_UDS_FLUXf,t,iface_tf,Thread*3intireal该函数定义用户自定义标量输运方程(user-definedscalartransportequations)的对流通量。f,t分别表示所求通量的面和面的线,i表示第几个输运方程(有处理器传递给本函数)。7.2.15DEFINE_UDS_UNSTEADYNameArgumentsArgumentsTyPeReturnTypeDEFINE_UDS_UNSTEADYc,t,i9apu,sucell_tc,Thread*3inti,real*apu,real*suvoid该函数定义用户自定义标量输运方程的非稳态项。C表示网格,t表示网格线,i表示第几个输运方程。在FLUENT中,非稳态项移到RHS中,并以下面的方式离散:unsteady_term=-J(夕MV«()一仿。尸MzrMM方程右边第一项为apu,第二项为su。本函数无返回值。7.2.16DEFINEVRRATENameArgumentsArgumentsTypeReturnTypeDEFINE_VR_RATEc,t,r,mw,yi,rr,rr_tcell_tc,Thread*t,Reaction*r,real*mw,real*yi,real*rr,real*rr_tvoid该函数定义体积化学反应速率。C表示网格,t表示网格线,r表示结构指针,表示化学反应过程,mw指针数组指向存贮物质分子量的变量,yi指向物质的质量分数;rr和rr_t分别设置层流和湍流时函数相关参数。函数无返回值,使用见48,例子见6.4.1。7.2.6离散相模型宏及其定义的函数离散模型(DPM)的宏定义的函数与通用宏所定义的函数书写格式是一样的。对于离散相需要强调结构指针p,可以用它得到颗粒的性质和相关信息。下面是具体的宏定义。7.2.6.1DEFINE_DPM_BODY_FORCENameArgumentsArgumentTypeReturnTypeDEFINE_DPM_BODY_FORCEp,iTracked_Particle*p,intireal该函数用于定义除了重力和拉力之外的所有体积力。P为结构指针,i可取0,1,3分别表示三个方向的体积力。函数返回的是加速度。使用见4.4,例子见5.4.2。7.2.6.2DEFINE_DPM_DRAGNameArgumentsArgumentTypeReturnTyPeDEFINE_DPM_DRAGRe,pTracked-Particle*p,realRereal该函数定义拉力系数Co,Re为ReynOkIS数,与颗粒直径和相对于液相速度有关。拉力定义为:18CdReD=赤.卞函数返回的值是18*C0*Re240使用见4.4,例子见5.4.3。7.2.6.3DEFINE_DPM_EROSIONNameArgumentsArgumentTypeReturnTypeDEFINE_DPM_EROSIONp,3f,normal,alpha,Vmag,mdotTracked_Particle*p,Thread*t,face_tf,realalpha,realnormal,realVmag,realmdotvoid该函数定义颗粒撞击壁面湮灭或产生速率。t为撞击面的线,f为撞击面;数组normal存贮撞击面的单位法向量;alpha中存贮颗粒轨道与撞击面的夹角;Vmag存贮颗粒速度大小,mdot存贮颗粒与壁面撞击率。函数无返回值,颗粒湮灭或产生的计算结果存贮在面变量F_STORAGE_R(f,t,SV_DPMS_EROSION)和F_STORAGE_R(f,t,SV_DPMS_ACCRETION)中。使用见4.4。7.2.6.4DEFINE_DPM_INJECTIOUNITNameArgumentsArgumentTypeReturnTypeDEFINE_DPMJNJECTION_INITInjection*1void该函数用于定义颗粒注入轨道时的物理性质。I是指针,指向颗粒产生时的轨道。对每一次注入,该函数需要在第一步DPM迭代前调用两次,在随后颗粒进入区域前每一次迭代中再调用一次。颗粒的初始化,诸如位置,直径和速度可以通过该函数设定。函数无返回值。7.2.6.5DEFINE_DPM_LAWNameArgumentsArgumentTypeReturnTypeDEFINE_DPM_LAWp,ciTracked-Particle*p,intcivoid该函数定义液滴和燃烧颗粒的热和质量传输速率。P的意义如前所述,Ci表示连续相和离散相是否耦合求解,取1时表示耦合,0时表示不耦合。颗粒的性质随着液滴和颗粒与其周围物质发生传热、传质而改变。函数无返回值。2.6.6DEFINE_DPM_OUTPUTNameArgumentsArgumentTypeReturnTypeDEFINE_DPM_OUTPUTheader,f,p,pt,planeintheader,FILE*fp,Tracked_particle*p,Thread*3Plane*planevoid该函数可以得到颗粒通过某一平面(见FLUENT用户手册14.10.6)时的相关变量。header在函数第一次调用时,设为1,以后都为0;fp为文件指针,指向读写相关信息的文件;P为结构指针,t指向颗粒所经过的网格线;PIane为Plane型结构指针(dpm.h),如果颗粒不是穿过一个平面而是仅仅穿过网格表面,值取为NULL。输出信息存贮于指针fp所指向的文件,函数无返回值。例子见5.4.1。7.2.6.7DEFINE_DPM_PROPERTYNameArgumentsArgumentTyPeReturnTypeDEFINE_DPM_PROPERTYc,t,cell_tc,Thread*t,Tracked_Particle*Preal该函数用于定义离散相物质的物理性质。P为结构指针,c表示网格,t表示网格线。函数返回实型值。7.2.6.8DEFINE_DPM_SCALAR_UPDATENameArgumentsArgumentTypeReturnTypeDEFINE_DPM_SCALAR_UPDATEc,t,initialize,pCeiLtc,Thread*t,intinitialize)Tracked_particlepvoid该函数用于更新与颗粒相关的变量或求它们在整个颗粒寿命时间的积分。与颗粒相关的变量可用宏PjJSER_REAL(p,i)取出。C表示颗粒当前所处的网格,t为该网格线。initialize在初始调用本函数时,取为1,其后调用时,取为0。在计算变量对颗粒轨道的积分时,FLUENT就调用本函数。存贮颗粒相关变量的数组大小需要在FLUENT的DPM面版上指定。函数无返回值。函数的使用见4.4,例子见5.4.1。7.2.6.9DEFINE_DPM_SOURCENameArgumentsArgumentTypeReturnTypeDEFINE_DPM_SOURCEc,t,S,strength,Pcell_tc,Thread*t,dpms_t*S,realstrength,Tracked_Particle*pvoid该函数用于计算,给定网格中的颗粒在与质量、动量和能量交换项耦合DPM求解前的源项。C表示当前颗粒所在的网格,t为网格线,S为结构指针,指向源项结构dpms_t,其中包含网格的源项。strength表示单位时间内流过的颗粒数目。P为结构指针。函数求得的源项存贮于S指定的变量中,无返回值。使用见4.4。7.2.6.10DEFINE_DPM_SWITCHNameArgumentsArgumentTypeReturnTypeDEFINE_DPM_SWITCHp,ciTracked-Particle*p,intcivoid该函数是FLUENT默认的颗粒定律与用户自定义的颗粒定律之间,或不同的默认定律和自定义定律之间的开关函数。P为结构指针,Ci为1时,表示连续相与离散相耦合求解,0时表示不耦合求解。!参数类型中的Tracked-Particle,dpms_t等是FLUENT为相关模型定义的数据类型。具体含义可以参见相应章节。7.2.7多相模型的宏及其定义的函数7.2.7.1DEFINE_DRIFT_DIAMNameArgumentsArgumentTyperealDEFINE_DRIFT_DIAMC,tcell_tc,Thread*treal该函数用于定义代数滑流混合模型(algebraicslipmixturemodel)颗粒或液滴的直径。C为网格,t为网格线。函数返回颗粒或液滴的直径。使用见4.10。7.2.7.2DEFINE_SLIP_VELOCITYNameArgumentsArgumentTyPerealDEFINE_SLIP_VELOCITYdomainDomain*domainvoid该函数用于定义代数滑流混合模型(algebraicslipmixturemodel)的滑流速度(SliPVek)City)。该函数作用范围是整个网格区域,无返回值。使用见4.9。7.2.8 特定线的指针在很多应用UDF的场合,需要在一条特定的线上进行操作。为满足这种要求,首先,可以从BoUndaryCOndiIiOnS面板得到需要操作的线的ID,然后就可用宏LOokUPJThread将指针指向该条线。在下面的例子中,C语言函数Print_Thread_Face_Centroids调用FLUENT的宏LOokUPJThread将指针指向特定的瓯然后麻线E所有面的质心坐标输入文件中。宏DEFlNE_ON_DEMAND定义的函数get_coords取出其中的两条线,并打印线上所有面的质心坐标。#include"udf.h"externDomain*domainFILE*foutstaticvoidPrinl_Thread_Face_Cenlroids(Domain*domain,intid)realFC;face_tf;Thread*t=Lookup_Thread(domain>id);fprintf(fout,t4threadid%dn,id);begin.oop(f,'t)(F_CENTROID(FC,f,t);fprintf(fout,4f%d%g%g%gn”,f,FC0,FC1,FC2);)end_Lloop(f,t)fprintf(fout>"n");)DEFINE_ON_DEMAND(get_coords)(fout=fopenct,"w”);PrintL_Thread_Face_Centroids(domain,2);Printf_Thread_Face_Centroids(domain,4);fclose(fut);7.2.9 函数体7.2.9.1 介绍用户自定义函数体部分包含在紧跟着宏DEFlNE一定义的大括弧内,如下例。这和标准C语言函数体的定义是相同的。DEFlNE.PROPERTY(CeILViSCosily,cell,thread)(realmu_lam;realtemp=C_T(cell,thread);if(temp>288.)mu_lam=5.5e-3;elseif(temp>286.)mu_lam=143.2135-0.49725*temp;elsemu_lam=1.;7.2.9.2 InterpretedUDFs的限制性Interpreted型书写函数体时并不能完全应用C语言函数,这在前面有过论述。此外,数量的单位制必须采用国际单位制。7.2.93函数的功能UDFs执行五种功能:1 .返回变量值;2 .调节参数;3 .返回变量值并且调节参数;4 .调节FLUENT的变量(不以参数形式传递);5 .向case或data文件读写信息。宏定义的函数返回类型如果不是Void型,就返回实型值。下面的例子分别说明不同功能的函数。7.2.9.4 返回变量值下面的UDF计算与温度有关的粘性系数,并返回该值。#include"udf.h"DEFlNE.PROPERTY(CeILViSCosity,cell,thread)/*定义物性的宏*/(realmu_lam;realtemp=C_T(Cell,Ihread);/*变量temp存放网格的温度*/if(temp>288.)mu_lam=5.5e-3;elseif(temp>286.)mu_lam=143.2135-0.49725*temp;elsemu_lam=1.;returnmuam;/*变量muJam存放粘性系数值,函数返回该值*/7.2.9.5 调节参数下面的UDF给出简单二元气相系统的体积反应速率。#include''udf.h"#defineKl2.0e-2#defineK25.DEFINE_VR_RATE(user_rate,cell,thread,r,mole_weight,species_mf,rate,rr_t)realsi=species_mfO;realmwl=mole-weight0;if(FLUID_THREAD_P(thread)&&THREAD-VAR(Ihread).fluid,porous)*rate=K1*s1pow(l.+K2*sl),2.)mw1;else*rate=0.;)函数名为usejrate,函数体中用if语句判断是否处于多孔介质区,仅在多孔介质区有化学反应。7.2.9.6 返回变量值并调节参数下面的UDF定义的是swirl-velocity的源项。#include"udf.h''#defineOMEGA50*rotationalspeedofswirler*/#defineWEIGHTl.e20*weightingcoefficientsinlinearizedequation*/DEFlNE.SOURCE(USeJSWii,cell,thread,dS,eqn)(realw_vel,x|ND_ND,y,source;CENTROID(x,cell,thread);y=l;w_vel=y*OMEGA;*linearw_velocityatthecell*/source=WEIGHT*(w_vel-C.WSWIRL(cell,thread);dS(eqn=-WEIGHT;returnsource;)函数名为USeLSWir1,函数计算了变量SOUrCe并且返回其值。函数的各项参数的意义参见2.5.10。7.2.9.7 调节FLUENT变量下面的函数调节存贮于内存的FLUENT变量,函数定义了X方向速度的边界条件。#include''udf.h"DEFlNE_PROFILE(inlet_x_velocity>thread»position)(realxND_ND;realy;face_tf;begin_Moop(f>thread)(F_CENTROID(x,f,thread);y=;F.PROFILE(f,thread,position)=20.-y*y(.0745*.0745)*20;)end_fLloop(f,thread)函数的参数p。Sition是个数字标签,标记每一步循环(IOOP)中被设置的变量。函数调节的FLUENT变量F-PROFILEo7.2.9.8 读写data或case文件下面的函数介绍了如何读写静态变量kount,如何计算静态变量请参见4.6。#include"udf.h”intkount=0;/*定义静态变量kount*/DEFINE_ADJUST(demo_calc,domain)(kount+;Printf("kount=%dn,kount);)DEFINE_RW_FILE(writer,fp)(Printf("WritingUDFdatatodatafilen");fprintf(fp,''%d”,kount);*将kount写入data文件中*/DEFINE_RW_FILE(writer,fp)1Printf("ReadingUDFdatafromdatafilen");fscanf(fp,"%d“,&kount);*从数据文件中读取kount值*/上面有三个函数。如果迭代10次,则kount值为10,然后将当前值10存贮到数据文件中,如果下次将komt值读入FLUENT继续运算,则kount将在10的基础上增加。我们可以存贮任意多的静态变量,不过读写顺序必须一致。7.2.10解法器函数(SOlyerFIInCtiOnS)7.2.10.1 概述在很多情况下,UDF需要得到FLUENT解法器中的数据。例如:1 .所求解的变量及其导数(例如,速度,温度等);2 .网格和面几何性质(例如,面面积,网格体积,网格质心坐标等);3 .物质的物理性质(例如,密度,粘性系数,导热系数等)。!我们可以取出比热,但是不能修改。我们可以利用下一节所列FLUENT提供的解法器函数,得到解法器中的数据。这里所说的函数是从广义上讲的,因为其中包括函数和宏,只有在源文件appropriate.h中定义的才是真正的函数。!如果使用的是Interpreted型的UDF,则只