关于中科大讲稿版-第七章自定义函数_第1页
关于中科大讲稿版-第七章自定义函数_第2页
关于中科大讲稿版-第七章自定义函数_第3页
关于中科大讲稿版-第七章自定义函数_第4页
关于中科大讲稿版-第七章自定义函数_第5页
已阅读5页,还剩65页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第七定义UDFs物性定义(除了比热外离散相模型(例如体积力,拉力,源项等代数滑流(algebraicslip)混合物模型(滑流速度和微粒尺寸DODEFINE_SOURCE定义。有关例5.26.2UDFs可用来定义物质的物理性质,除了比热之外,其它物性参数都可以定义。例如,我们可以定义依赖于温度的粘性系数。它用宏DEFINE_SR_RATEDEFINE_VR_RATE6.4。离散相存量)5.3,5.5,5.6和5.7。UDFs有着广泛的应用,本文并不能一一叙述。如果在使用中遇到问题,可以联系FLUENT技术支部门要求帮助在此推荐一个上面有FLUENT论书写UDFsUDFsFLUENTCC将数学表达式转化成C语言源代码第三步编译调试C语言源代码步在FLUENTInterpretedCompiled型比CompiledUDFsFLUENT标代码库的连接。这些库的建立是基于特定计算机和特定FLUENT版本的,所以升级FLUENT版本后,就必须重新建立相应的库。相反,InterpretedUDFsC语言代码的。在这种情况下,FLUENTcase文件case文件时,FLUENT也会自动加载相应的函数。InterpretedUDFs具有较强UDFs,如果对运行速度要求不高,一般就采Interpreted型的。UDFsInterpretedCompiledUDFs InterpretedUDFs能够使用FLUENT提供的宏,间接存贮于FLUENT的变量,详2.10CompiledInterpretedUDFsCANSI-CFLUENT版本(2D3D)InterpretedUDFs第二写概Interpreted型和Compiled型用户自定义函数的过程和书写格式是一样的。主要的C语言的结合程度,CompiledCInterpreted型UDF格UDF定义恒定常数和包含库文件,分别由#DEFINE和#INCLUDE(2.3DEFINE_*UDF函数(2.4函数体部分(udf.h,sg.h,mem.h,prop.h,dpm.hudf.h是必不可少的,书写格式为#include“udf.h”SI单位制;函数体部分字母采用小写,InterpretedFLUENTC语言语法和函数。包含库库文件udf.hC简FluentDEFINE_开始,对它们的解释包含在udf.h文件中,所以需要包含库udf.h。为了方便使用,我们把对udf.hA中。UDFDEFINE_定义,括号列表中第一个参数代表函数名。例如inlet_x_velocity inlet_x_velocity有两个输入参数:thread和position,threadThread,position是个整数(见2.4.3UDFFLUENT相应的下拉列表内。如上述函inlet_x_velocity的函数,udf.h文件中对宏DEFINE_的解udf.hA#define voidname(Thread*t,int#definemacroreplacement-在编译前,C预处理器(cpp)先进行宏替代。例如voidinlet_x_velocity(Thread*thread,intvoid型的,所以不返回DEFINEUDFsDEFINEDEFINE_SOURCE定义的函数用来修改输运方程源项,DEFINE_PROPERTY定义的函2.52.6中详述。下A的简列。 数据类型的定C语言数据类型的补充,FLUENTThread,cell_t,face_t,Node和Thread是相应边界或网格区域的结构类型数据;cell_t表示单独一个控制体体积元,用来定义源项或物性;face_t对应于网格面,用来定义边界条件等;Node表示相应的网格节点;是一种结构,其中包含所有的threads,cells,faces和nodes。 Thread,cell_t,face_t,Node和要区分大小写通用宏及其定义DEFINEUDFsArgumentsReturn*该函数在每一步迭始前,即在求解输运方程前执行。可以用来修改调节流场量,计算积分或微分等。参数在执行时,传递给处理器,通知处理器该函数作用4.65.3,5.65.7ArgumentsReturnc,t,cell_t*t,int该函数定义的是组分扩散系数或者用户自定义标量输运方程的扩散系数,c格,t是指向网格线的指针,i表示第几种组分或第几个用户自定义标量(传递给处理器。5.3。ArgumentsReturnface_tf,Threadcell_tc,Thread*t0,realcid[],realcir[]该函数定义的是网格与邻近壁面之间扩散和辐射热流量。f表示壁面,tc0表示邻近壁面的网格,t0指向网格线。函数中需要给出热扩散系数(cid)(cir(qirqid=cid[0]+cid[1]×C_T(c0,t0)-cid[2]×F_T(ft)-cid[3]×pow(F_T(f,t)4)qir=cir[0]+cir[1]×C_T(c0,t0)-cir[2]×F_T(f,t)-cir[3]×pow(F_T(f,t),4)4.75.6。ArgumentsReturn*FLUENT默认的初始化之后执行。作用区域是全4.55.4.15.5。ArgumentsReturnFLUENTArgumentsReturncell_tc,Thread该函数定义边界条件。t指向定义边界条件的网格线,i用来表示边界的位置。函数在F_PROFILE(f,t,i)中,无返回值。4.15.1.1,5.1.2,5.1.3,5.3,6.1.16.1.2ArgumentsReturncell_tc,Thread该函数用来定义物质物性参数。c表示网格,tArgumentsReturnFILEcase和data文件。fp4.11,例子2.9.8。ArgumentsReturnrealc,realDO(DiscreteOrdinate)辐射模型中的散射相函数(radiationscatteringphasefunctionij向散射的辐射能量分数和前向散射因子(forwardscatteringfactor。ci和j向夹角的余弦值,散射的能量分数由函数返ArgumentsReturncell_tc*t,realdS[],intDO辐射模型之外,输运方程的源项。在计算中,函数需要扫描全场网格。c表示网格,t表示网格线,dS表示源项对所求输运方程的标量的偏导数,用于对源项的线性化;i4.25.2.1,5.2.2,ArgumentsReturnface_t*t,Reaction*r,real*mw,real*yi,real该函数定义表面化学反应速率。f表示面,t表示面的线,r是结构指针,表示化学反应;mwyi是个实型指针数组,mw存贮物质的分子量,yi存贮物质的质量分数,rr设4.8。ArgumentsReturnface_tf,Threadint该函数定义用户自定义标量输运方程(user-definedscalartransportequations)的对流通量。f,t分别表示所求通量的面和面的线,i表示第几个输运方程(有处理器传递给本函ArgumentsReturncell_t*t,int*apu,real该函数定义用户自定义标量输运方程的非稳态项。c表示网格,t表示网格线,i表示第几个输运方程。在FLUENT中,非稳态到RHS中,并以下面的方式离散:unsteady_term

ArgumentsReturncell_t*t,Reactionreal*yi,real该函数定义体积化学反应速率。c表示网格,t表示网格线,r表示结构指针,表示化学反应过程,mw指针数组指向存贮物质分子量的变量,yi指向物质的质量分数;rrrr_t4.86.4.1。离散相模型宏及其定义的函p,可以用它得到颗粒的性质和相关信息。下面是具体的宏定义。ArgumentReturn*p,int该函数用于定义除了重力和拉力之外的所有体积力。p为结构指针,i0,1,3分别4.45.4.2。ArgumentReturn*p,real该函数定义拉力系数CD,Re为Reynolds数,与颗粒直径和相对于液相速度有关。拉 18CDD D ArgumentReturn*p,Threadface_tf,real,realreal该函数定义颗粒撞击壁面湮灭或产生速率。t为撞击面的线,fnormal存贮撞击面的单位法向量;alpha中存贮颗粒轨道与撞击面的夹角;Vmag存贮颗粒速度大小,mdot存贮颗粒与壁面撞击率。函数无返回值,颗粒湮灭或产生的计算结果存贮在面变F_STORAGE_R(f,t,SV_DPMS_EROSION)F_STORAGE_R(f,t,SV_DPMS_ACCRETION)4.4。ArgumentReturniInjection该函数用于定义颗粒注入轨道时的物理性质。I是指针,指向颗粒产生时的轨道。对每DPM迭代前调用两次,在随后颗粒进入区域前每一次迭ArgumentReturn*p,int该函数定义液滴和燃烧颗粒的热和质量传输速率。p的意义如前所述,ci表示连续相1时表示耦合,0时表示不耦合。颗粒的性质随着液滴和颗粒2.6.6ArgumentReturnintFILE*p,ThreadPlane该函数可以得到颗粒通过某一平面(FLUENT14.10.6)时的相关变量。header10;fp为文件指针,指向读写相关信息的文件;p为结构指针,t指向颗粒所经过的网格线;plane为(dpm.hULLfp所指向的文件,函数无返回值。5.4.1ArgumentReturncell_tc,Thread*t,Tracked_Particle该函数用于定义离散相物质的物理性质。p为结构指针,c表示网格,t表示网格线。ArgumentReturncell_tc,Thread*t,intinitialize,Tracked_particle该函数用于更新与颗粒相关的变量或求它们在整个颗粒时间的积分。与颗粒相关P_USER_REAL(p,i)取出。c表示颗粒当前所处的网格,t为该网格线。initialize10。在计算变量对颗粒轨道的积分时,FLUENTFLUENTDPM面ArgumentReturncell_t*t,dpms_t*S,realstrength,DPM求解前的源项。c表示当前颗粒所在的网格,t为网格线,Sdpms_t,其中包含网格的源项。strength表示单位时间内流过的颗粒数目。pS4.4ArgumentReturn*p,intFLUENT默认的颗粒定律与用户自定义的颗粒定律之间,或不同的默认定律和自定义定律之间的开关函数。p为结构指针,ci1时,表示连续相与离散相耦合求解,0时表示不耦合求解。!Tracked_Particle,dpms_tFLUENT为相关模型定义的数据类型。具多相模型的宏及其定义的函Argumentcell_tc,Thread该函数用于定义代数滑流混合模型(algebraicslipmixturemodel)颗粒或液滴的直径。c为网格,t4.10。Argument*该函数用于定义代数滑流混合模型(algebraicslipmixturemodel)的滑流速度(slipvelocity4.9。UDF的场合,需要在一条特定的线上进行操作。为满足这种要求,首BoundaryConditionsID,然后就可用宏Lookup_Thread将指针指向该条线。在下面的例子中,CPrint_Thread_Face_CentroidsFLUENT的宏Lookup_Thread将指针指向特定的线,然后将线上所有面的质心坐标输入文件中。宏DEFINE_ON_DEMANDget_coords取出其中的两条线,并打印线上所有面的质#include“udf.h” FILEstatic ,int{ Thread fprintf(fout,“thread { }}{fout=fopen(“faces.out”,“w”); }函数介C语言函数体的定义是相同的。{realrealtemp=if(temp>288.)mu_lam=5.5e-elseif(temp>mu_lam=143.2135–0.49725*temp;mu_lam=return}InterpretedUDFs的限制Interpreted型书写函数体时并不能完全应用C语言函数,这面有过论述。此外,函数UDFsFLUENT的变量(不以参数形式传递casedatavoid型,就返回实型值。下面的例子分别说明不同功返回UDF#include“udf.h”{realrealtempC_T(cell,thread);/*temp存放网格的温度if(temp>288.)mu_lam=5.5e-elseif(temp>mu_lam=143.2135–0.49725*temp;mu_lam=returnmu_lam;/*mu_lam存放粘性系数值,函数返回该值}调节UDF#include {reals1=realmw1=if(FLUID_THREAD_P(thread)&&THREAD_VAR(thread).fluid.*rate=K1*s1/pow((1.+K2*s1),2.)/mw1;*rate=}user_rateif语句判断是否处于多孔介质区,仅在多孔介质区有返回变量值并调UDFswirl-velocity#include#defineOMEGA /*rotationalspeedofswirler#defineWEIGHT1.e20 /*weightingcoefficientsinlinearizedequation*/{realy=x[1];w_vel= /*linearw_velocityatthecellsource=WEIGHT*(w_vel–C_WSWIRL(cell,thread));dS[eqn]=-WEIGHT;return}user_swirlsource并且返回其值。函数的各项参数的意义2.5.10。调节FLUENT变FLUENTx#include“udf.h”{realx[ND_ND];realy;face_t{y=x[1];F_PROFILE(f,thread,position)=20.}}函数的参数position是个数字,标记每一步循环(loop)中被设置的变量。函数FLUENTF_PROFILE。读写datacase文#include“udf.h”intkount0;/* {kountprintf(“kount=}{printf(“WritingUDFdatatodatafile…\n”); /*将kountdata文件中*/}{printf(“ReadingUDFdatafromdatafile…\n”); /*从数据文件中kount值*/}上面有三个函数。如果迭代10次,则kount值为10,然后将当前值10存贮到数据文件中,如果下次将kount值读入FLUENT继续运算,则kount10的基础上增加。我们解法器函数(Solver概在很多情况下,UDFFLUENT所求解的变量及其导数(例如,速度,温度等网格和面几何性质(例如,面面积,网格体积,网格质心坐标等物质的物理性质(例如,密度,粘性系数,导热系数等 FLUENT提供的解法器函数,得到解法器中的数据。这里!InterpretedUDFFLUENT提供的解法器函数。CCB有三个参数:x,c和tc和t为输入参数,x辅助几何关Argumentcell_tc,Thread*tcell_tc,Threadface_tf,Thread网格坐标与面ArgumentC_VOLUME(crealx[ND_ND],cell_tc,Thread*trealx[ND_ND],face_tf,Thread*tA[ND_ND],face_tf,Thread*t c,Thread网格体积节点坐标与节点(网格)ArgumentNodexNodeyNodezNodexNodeyNodez下面列表中的函数只能在segregatedsolver中获取,耦合计算时不能的Argumentface_tf,Thread*tface_tf,Thread*tface_tf,Thread*tface_tf,Thread*tface_tf,Thread*tface_tf,Thread*tface_tf,Thread*tface_tf,Thread*tface_tf,Thread*t,intiface_tf,Threadu速度v速度w速度用户自定义标量intface_tf,Thread*t,inti(i表示第几个ArgumentArgumentcell_tc,Thread*t,inti,intu速度v速度w速度uu雷诺应力vv雷诺应力ww雷诺应力uv雷诺应力vw雷诺应力uwArgument压力梯度(i表示方向)密度梯度(i表示方向)Argumentbegin开始,endcell_tc;face_tf;Thread*t;begin_c_loop(c,{}end_c_loop(c, begin_f_loop(f,{}end_f_loop(f, thread_loop_c(t,{ /*遍历网格线thread_loop_f(t,{ /*遍历面上的线数据的可得UDF的时候,要保证出现在函数中的数据是能够从解法器上获得的。为了检0。Int /*当我们case文件时,就会装载相应的UDF。如果此时函数用到一个未初始化的ifelse语句。如果数据可得,就按照正常情况执行下去;否则,就停止运算。一设置面变量值F_PROFILEface_tThread /*frommem.hnvarFLUENTUDF。nvar是特定边界的数字。例如,与总压和总温相关的边界,nvar取值为0和1;与速度三个方向标量和静态温度相关的边界,nvar0,1,23。nvar nvarFLUENTDPMdpm.h中,变量p*p颗粒变量的 颗粒直径 (evaporatingspeciesindexinmixture) (devolatizingspeciesindexin (oxidizingspeciesindexin (combustionproductsspeciesindexinmixture) currentparticlelawindex nextparticlelawindex 用户自定义变量(i表示第几个)颗粒物性的 颗粒物质沸腾温度 颗粒物质反应热 颗粒物质炭化分数 t第三节编译连3.4InterpretedCompiledUDF概InterpretedCompiledUDF的区别以及各自的特点,在此不再累述。为了显示区别,FLUENTUDF的设置面板是不同的。Interpreted型面板有一个Compile按钮点击时就会对源文件进行编译Compiled型面板有一个open按钮,UDFDEFINE_udf.h文件中。udf.h文件存放的位置为srcudf.hsrcudf.h文件,因为该文件在udf.h文件,编译连接工作将无法进行。Interpreted本节介绍了如何编译InterpretedUDFs译之后case文件会记录编译过程FLUENT在case文件时会自动加载UDFs。将UDF的C源程序拷贝到当前工作 指定该文件的具体路径。如果使用并行运算,按照3.2.2设置;FLUENT(或建立)casevprofile.cDefine→User-图 InterpretedUDFs面SourceFileNameC源文件名(如vprofile.c。如果源文件不在当前工作下,则需要输入完整路径。CPPCommandNameC预处理程序名。如果安装了/contrib组件,则会出现默认的预处理程序名:cppWindowsNT用户,标准Close InterpretedUDFUDFsCWindowsNT系统网络并行运算 结如果我们使用的是WindowsNT系统的并行版FLUENT,就需要以特定的方式组织文 。3.2.1中的第一步必须以下面的步骤代替:Fluent.Incudf的可写子在udf下建立一个(Fluent.Inc\udf\myudfC源文件拷入其中,myudfFluent.Inc\udf\abcudfxyz 由于C源文件不在当前工 下,编译时需要输入文件路径。如fileserverFLUENT的计算机名。case文件,应保证其在当前工作DisplayAssemblyListing选项。InterpretedUDFs常见编译错C源文件如果不是在当前工作 如果将case文件拷贝到了其 CompiledCompiled在工 下建立相应 (见3.3.1UDFs并建立共享库(3.3.2( 下(3.3.3建 结UNIX和WindowsNT系统所 结构是不一样的,下面分别进行说明UNIX系UNIXCompiledUDFs需要两个文件:Makefilemakefile。makefile文件是可修改的,C源文件名就在其中设定。两文件所处的相关为:path为FLUENT安 ,5.x表示FLUENT版本下面的步骤概括介绍了结构的建立过程,从图3.3.13.3.1中的结构适用于两种版本:单精度2D2D并行运算。注意不需要向版本目图 结构说在当前工 下建立一 libudf拷贝Makefile.udf文件到1中建立 在1中建立 将C源文件(如udfexample.c)拷入 下把makefile.udf文件拷入 下,并命名为makefileFLUENTFLUENTirix6.5makefile3.3.2按照FLUENT版本结构建立相应的 2d3d:2d2d3d:2ddp2d3d:2d_node2d_host,3d_node2d3d:2ddp_node2ddp_host,3ddp_nodeWindowsNT系对于WindowsNT系统需要两个文件:makefile_nt.udf和user_nt.udf。C源文件需要修改文件user_nt.udf指定。下面的步骤概括介绍 结构的建立过程,可参考图3.3.2。3.3.22D2D图3.3.2Windows 结构说在当前工 下建立一 libudf在新 下建立名为 ,用于存放C源程序文件将C源程序(如udfexample)拷贝入 :WindowsNT系统建立ntx86 立ntalpha 在 或 下建立版本信 ntx86\2d2d3d:2d2d3d:2ddp2d3d:2d_node2d_host,3d_node2d3d:2ddp_node2ddp_host,3ddp_node将makefile_nt.udf和user_nt.udf拷入版本信息(如2d。对于并行版本需要将这两个文件分别拷入host和node 如2d_node和2d_host两文件在FLUENTpath为FLUENT安 。注意FLUENT版本更新升级后,需要把新版本makefile_nt.udfuser_nt.udfUNIXmakefile_nt.udfmakefile编译建立共享UNIXWindowsNTUNIX系在建立相应 结构和拷入源文件之后,就可以编译生成共享库文件编辑src 下的makefile文件,并设置参数:SOURCES=要进行编译的C源文件名FLUENT_INC=FLUENT安装路径makefileirix6.5makefileCFLAGS_IRIX6R10 -KPIC-ansi-fullwarn-0将-ansiCFLAGS_IRIX6R10 -KPIC-xansi-fullwarn-0 Make“FLUENT_ARCH=ultra”udfexample.clibudf.so。C源程序文件。WindowsNT系 及拷入C源文件之后,WindowsNT系统按照下面的步骤编译和建立user_nt.udfSOURCES=C原文件名。在文件名之前,需要前缀$(SRC)udfexaple.cudfexample2.cVERSION=2d,3d,2ddp,3ddp-none:单机-smpi:并行使用共享内存(对多处理器机器-vmpi:MPI-net:RSHD user_nt.udf文件user_nt.udf在MS-DOS操作符下进入到所建立 \libudf\ntx86\2d\如果编译出现问题使用nmakeclean清除。连接共享库到FLUENT中,将共享库连接使用。具体步FLUENT(或建立)case文件Define→User-图 CompiledUDFs面在LibraryName中输入库文件的 libudf,OpenFLUENT。解法器会自动找到相应的版本的共享库,一旦连接成功,将会在case文件中保存,下次case文件时会自动加载共编译CompiledUDFs时的常见错当共享库不在当前工 下的相 第四节FLUENT模型中使FLUENTUDFs。下面分别说明如何FLUENTUDFs。编译连接成功边界条件UDF之后,就可以在FLUENT中选择使用。例如,定义速度入口边界条件的UDF(inlet_x_velocity)可以在VelocityInlet面板(如下所示)中找到,选择OKFLUENT中使用。UDFsDEFINE_PROFILE2.5.6源UDFsFluidcell_x_sourceUDFUDFsDEFINE_SOURCE2.5.10UDFsMaterialUDF!UDFFLUENT限制计FLUENT求解。UDFsDEFINE_PROPERTY2.5.7UDFsDiscretePhaseModelDefine→Models→Discrete(scalarupdate)ScalarUpdateNumberofScalars中指定。2.6。UDFUser-DefineFunctionInitializationFunctionDefine→User-Defined→FunctionFLUENT2.5.4更新计算变量函数在User-DefineFunctionHooks面板的AdjustFunction4.5的2.5.1。seenooksalltuxunction中设2.5.如,可以改变热交换系数和温度的壁面定律(参见相应章节。User-DefineFunctionHooksVolumeReactionRateFunctionSurfaceReactionRateFunction2.5.11。AlgebraicSlipMixture模型SlipFunctionHooks3.23.3。读写casedata文读写case和data文件函数分别在User-DefineFunctionHooks面板的ReadCaseFunction,WriteCaseFunction,ReadDataFunction和WriteDataFunction中设定。四个函数由宏DEFINE_RW_FILE2.5.8。颗粒或液滴直MultiphaseModel可执行UDFExecuteUDFOnDemandDefine→User-Defined→ExecuteOnUDFDEFINE_ON_DEMAND2.5.5User-DefinesMemory面板中指定。Define→User-Defined→Memory定义了内存变量之后可以通过C_UDMI(c,t,i)和F_UDMI(f,t,i)i取0,1,2…,表示第几个内存变量每一个网格最多可以对应500个这样的内存变量以在UDF中使用。5.8。第五节UDFs实本章详细分析了UDFs的各种用法的实例,具体的应用将在第六章中分析。本章5.3,5.45.6的例Compiled型的,其它都是Interpreted型的。下面各节,给出了UDF所描述CC语言语法请参考相关书籍,FLUENT语法和函数请2.4.32.10,或者可以直接参照相应的*.h文件。UDFs涡轮叶片抛物型压力分布完全发展的湍流流动条件p(y)1.1105-0.1105

0.0745UDFC/*profile.c/*UDFforspecifyingasteady-statepressureprofileboundarycondition#include"udf.h"DEFINE_PROFILE(pressure_profile,thread,position){realx[ND_ND];/*thiswillholdthepositionvector*/realy;face_tf;begin_f_loop(f,thread){y=x[1];F_PROFILE(f,thread,position)=1.1e5-}end_f_loop(f,}pressure_profilexF_CENTROIDf的质心,loop循环position是边界网格面的标志,F_PROFILE中,FLUENT在计算过程中处理边界时,会取出所存贮的值。x[1]y,同理,x[0]x[2]分别对应x,y的值。完全发展的湍流流动条1/7

y1/vxvx,free

u u

Karman

4k3/2l

为w/w/Blasius

w

/ 1/f

free UDFsC/*UDFforspecifyingfully-developedprofileboundaryconditions#include"udf.h"#defineYMIN0.0/*constants*/#defineYMAX0.4064#defineUMEAN1.0#defineB1./7.#defineDELOVRH0.5#defineVISC1.7894e-05#defineCMU0.09#defineVKC/*profileforx-velocity*/DEFINE_PROFILE(x_velocity,thread,position){realy,del,h,x[ND_ND],ufree;/*variabledeclarations*/face_tf;h=YMAX-del=DELOVRH*h;ufree=UMEAN*(B+1.);begin_f_loop(f,thread){y=x[1];if(y<=F_PROFILE(f,thread,position)=ufree*pow(y/del,B);F_PROFILE(f,thread,position)=ufree*pow((h-}end_f_loop(f,}/*profileforkineticenergyDEFINE_PROFILE(k_profile,thread,{realy,del,h,ufree,x[ND_ND];realff,utau,knw,kinf;face_th=YMAX-del=DELOVRH*h;ufree=UMEAN*(B+1.);ff=0.045/pow(ufree*del/VISC,0.25);begin_f_loop(f,thread){if(y<=del)}end_f_loop(f,}/*profilefordissipationrateDEFINE_PROFILE(dissip_profile,thread,{realy,x[ND_ND],del,h,ufree;realff,utau,knw,kinf;realmix,kay;face_tf;h=YMAX-del=DELOVRH*h;ufree=UMEAN*(B+1.);ff=0.045/pow(ufree*del/VISC,0.25);begin_f_loop(f,thread){if(y<=del)if(VKC*y<0.085*del)mix=VKC*y;mix=0.085*del;}}正弦壁面温度分x300K400K,最右端300K,分布式为:T(x)300100sin UDFC

0.005/*UDFforspecifyingasinusoidaltemperatureprofileboundarycondition#include"udf.h"#definePIDEFINE_PROFILE(temperature_profile,thread,{realr[ND_ND];/*thiswillholdthepositionvector*/realx;face_tf;begin_f_loop(f,thread){x=r[0];F_PROFILE(f,thread,position)=}end_f_loop(f,}源UDFssource0.5C2yvx假设sourceSAvx ,A0.5C2

xxx

vx所以,UDFxsourceAvx

2AvxUDF必须给出源项对所求变量的直接导数,源项的导数用于对源项的线性化(见下一节UDFC源程序。/*UDFforspecifyinganx-momentumsourceterm#include"udf.h"#defineC2DEFINE_SOURCE(xmom_source,cell,thread,dS,{realx[ND_ND];realcon,C_CENTROID(x,cell,con=C2*0.5*C_R(cell,source=-con*fabs(C_U(cell,thread))*C_U(cell,thread);dS[eqn]=-2.*con*fabs(C_U(cell,thread));return}涡产S()

nb

S

)S

p,olda a

S

)S

p,oldS()1020

)S

pp,desired于该点变量取我们希望的 rsource1020r 源项的导数:ds=-1020UDF/*UDFforspecifyingaswirl-velocitysourceterm#include"udf.h"#defineOMEGA50./*rotationalspeedofswirler#defineWEIGHT1.e20/*weightingcoefficientsinlinearizedequation*/DEFINE_SOURCE(user_swirl,cell,thread,dS,eqn){realw_vel,x[ND_ND],y,source;C_CENTROID(x,cell,thread);y=w_vel=y*OMEGA;/*linearw-velocityatthecell*/source=WEIGHT*(w_vel-C_WSWIRL(cell,thread));dS[eqn]=-WEIGHT;return}C_WSWIRL(cell,thread)2D用户自定义标量FLUENT中的P-1UDFsPoissonDefine→Models→User-Defined/*ImplementationoftheP1modelusinguser-definedscalars#include"udf.h"#include"sg.h"#include"prop.h"/*Definewhichuser-definedscalarstouse.*/{staticrealabs_coeff=1.0;/*absorptioncoefficient*/staticrealscat_coeff=0.0;/*scatteringcoefficientstaticreallas_coeff=0.0;/*linear-anisotropicscatteringcoefficient*/staticrealepsilon_w=1.0;/*wallemissivity*/ {/*Makesurethereareenoughuserdefined-scalars.*/if(n_uds<N_REQUIRED_UDS)Internal_Error("notenoughuser-definedscalars}DEFINE_SOURCE(energy_source,c,t,dS,{dS[eqn]=-return-abs_coeff*(4.*SIGMA_SBC*pow(C_T(c,t),4.)-}DEFINE_SOURCE(p1_source,c,t,dS,{dS[eqn]=-returnabs_coeff*(4.*SIGMA_SBC*pow(C_T(c,t),4.)-}DEFINE_DIFFUSIVITY(p1_diffusivity,c,t,{return1./(3.*abs_coeff+(3.-}DEFINE_PROFILE(p1_bc,thread,{face_trealrealdG[ND_ND],dr0[ND_ND],es[ND_ND],ds,A_by_es;realaterm,alpha0,beta0,gamma0,Gsource,Ibw;realEw=epsilon_w/(2.*(2.-epsilon_w));Thread*t0=thread->t0;/*Donothingifareasaren'tcomputedyetornotnexttofluid.*/if(!Data_Valid_P()||!FLUID_THREAD_P(t0))return;begin_f_loop(f,thread){cell_tc0=F_C0(f,thread);At=NV_MAG(A);ifGsource=0.;/*ifgradientnotstoredyet*/gamma0=C_UDSI_DIFF(c0,t0,P1);alpha0=A_by_es/ds;beta0=Gsource/alpha0;aterm=alpha0*gamma0/At;Ibw=/*Specifytheradiativeheatflux.F_PROFILE(f,thread,position)=aterm*Ew/(Ew+aterm)*(4.*M_PI*Ibw-+}end_f_loop}INE_T用于检验用户自定义标量输运方程是否已经激活。由于只有一个用户自定义输运方程时为C_(cell,hread,0)以面枚举类型定义中使为零这样就可以使用C_I(cell,head,1)用户自定义的第一个标量输运方程求解标量。加入用户自定义输运方程之后,UDFsp1_diffusivityMaterials面板选择,p1_sourceenergy_sourceFluid面板选择,p1_bc可以在相应的边界条件面板中选FLUID_THREAD_P(t0)检测当前的网格线是否属于流体区域;BOUNDARY_FACE_GEOMETRY(f,thread,A,ds,es,A_by_es,dr0)facearea,cell,face)本节包含FLUENT离散相模型的三个UDFsUDFs,Compiled型以节约时间。本节的三个实例为:沿颗粒轨道的熔化指数(Melting沿颗粒轨道的熔化指数(Melting本例使用宏DPM_SCALAR_UPDATE定义的函数,计算沿颗粒轨道的熔化指数(MeltingIndex

indext10IndexNULL_P,((p)==NULL),检测参数是否为空值。/*UDFforcomputingthemeltingindexalongaparticletrajectory#include"udf.h"#include"sg.h"#include"dpm.h"staticrealviscosity_0;DEFINE_INIT(melt_setup,{/*ifmemoryfortheparticlevariabletitleshasnotbeenallocatedyet,doitnow*/if(NULLP(user_particle_vars))Init_User_Particle_Vars();/*nowsetthenameandlabel*/strcpy(user_particle_vars[0].label,"Melting}/*updatetheuserscalarvariables*/DEFINE_DPM_SCALAR_UPDATE(melting_index,cell,thread,initialize,p){cphase_state_t*c=&(p->cphase);if(initialize){/*thisistheinitializationcall,*p->user[0]containsthemeltingindex,initializeto*viscosity_0containstheviscosityatthestartofatimestep*/p->user[0]=0.;viscosity_0=c-}{/*useatrapezoidalruletointegratethemeltingindexp->user[0]+=P_DT(p)*.5*(1/viscosity_0+1/c-/*savecurrentfluidviscosityforstartofnextstep*/viscosity_0=c->mu;}}/*writemeltingindexwhensortingparticlesatsurfaces*/DEFINE_DPM_OUTPUT(melting_output,header,fp,p,thread,plane){charname[100];if(header){ifcxprintf(fp,"(%s%d)\n",plane->sort_file_name,11);cxprintf(fp,"(%10s%10s%10s%10s%10s%10s%10s""%10s%10s%10s%10s%s)\n",}{"((%10.6g%10.6g%10.6g%10.6g%10.6g%10.6g""%10.6g%10.6g%10.6g%10.6g%10.6g)%s)\n",p->state.pos[0],p->state.pos[1],p-p->state.V[0],p->state.V[1],p-p->state.diam,p->state.temp,p->flow_rate,p->state.time,p->user[0],name);}}带电颗粒的磁场/*UDFforcomputingthemagneticforceonachargedparticle#include"udf.h"#include#defineQ /*particleelectriccharge#defineBZ3.0 /*zcomponentofmagneticfield*/ /*fieldappliedatt=tstart/*Calculatemagneticforceonchargedparticle.Magnetic/*forceisparticlechargetimescrossproductofparticle/*velocitywithmagneticfield:Fx=q*bz*Vy,Fy=-q*bz*Vx*/DEFINE_DPM_BODY_FORCE(particle_body_force,p,i){floatbforce;{if(i==0)elseif(i==1)bforce=-}/*anaccelerationshouldbereturned*/return(bforce/P_MASS(p));}颗粒5.4.2/*UDFforcomputingparticledragcoefficient(18CdRe/24)/*curveassuggestedbyR.Clift,J.R.GraceandM.E.Weber/*"Bubbles,Drops,andParticles"(1978)#include"udf.h"#include"dpm.h"DEFINE_DPM_DRAG(particle_drag_force,Re,p){floatw,drag_force;if(Re<0.01){return(drag_force);}elseif(Re<{w=drag_force=18.0+2.367*pow(Re,0.82-0.05*w);return(drag_force);}/*Note:suggestedvalidrange20<Re<260{drag_force=18.0+3.483*pow(Re,0.6305);return(drag_force);}}DEFINE_INITFLUENTFLUENT/*UDFforinitializingflowfieldvariables#include"udf.h" {cell_tThread*thread;realxc[ND_ND];thread_loop_c(thread,{begin_c_loop_all{if(sqrt(ND_SUM(pow(xc[0]-pow(xc[1]-pow(xc[2]-0.5,2.)))<C_T(c,thread)=400.;C_T(c,thread)=}end_c_loop_all}}(2Dloop循环,能够扫描全场,给全场赋初始值。qid。qid=cid[0]+cid[1]×C_T(c0,t0)-cid[2]×F_T(f,t)-cid[3]×pow(F_T(f,t),qir=cir[0]+cir[1]×C_T(c0,t0)-cir[2]×F_T(ft)-cir[3]×pow(F_T(f,t),4)C语言源程序为:/*UDFforspecifyingthediffusiveheatfluxbetweenawallandneighboringcells#include"udf.h"staticrealh=0.;/*heattransfercoefficient(W/m^2C)*/ {/*Definetheheattransfercoefficient.*/h=120;}DEFINE_HEAT_FLUX(heat_flux,f,t,c0,t0,cid,{cid[0]=cid[1]=cid[2]=cid[3]=}使用用户自定义标量进行后DEFINE_ADJUST在每一步迭代执行前调用,所以可以在其中求解标量的微积分,/*UDFforcomputingthemagnitudeofthegradientofT^4#include"udf.h"/*Definewhichuser-definedscalarstouse.*/{ ,{Thread*t;cell_tc;face_tf;/*Makesurethereareenoughuser-definedscalars.*/if(n_uds<N_REQUIRED_UDS)Internal_Error("notenoughuser-definedscalars/*FillfirstUDSwithtemperatureraisedtofourthpower.*/thread_loop_c(t, {if(NULL!={begin_c_loop{realT=C_T(c,t);C_UDSI(c,t,T4)=pow(T,4.);}end_c_loop}}thread_loop_f {if(NULL!={begin_f_loop{realT=if(NULL!=THREAD_STORAGE(t,SV_T))T=F_T(f,t);elseif(NULL!=THREAD_STORAGE(t->t0,SV_T))T=C_T(F_C0(f,t),t->t0);F_UDSI(f,t,T4)=}end_f_loop}}/*FillsecondUDSwithmagnitudeofgradient.*/thread_loop_c(t,){if(NULL!=THREAD_STORAGE(t,SV_UDS_I(T4))&&NULL!=T_STORAGE_R_NV(t,SV_UDSI_G(T4))){begin_c_loop{C_UDSI(c,t,MAG_GRAD_T4)=}end_c_loop}}thread_loop_f(t,{if(NULL!=THREAD_STORAGE(t,SV_UDS_I(T4))&&NULL!=T_STORAGE_R_NV(t->t0,SV_UDSI_G(T4))){begin_f_loop{F_UDSI(f,t,MAG_GRAD_T4)=C_UDSI(F_C0(f,t),t-}end_f_loop}}}if(NULLTHREAD_STORAGE(t,SV_UDS_I(T4)))检测用户自定义标量中NULLT_STORAGE_R_NV(t,SV_UDSI_G(T4))检可执行本例名为demo_calc的UDF,计算打印当前数据库中的最低温度,最高温度和平均温

TTmax/*demand.c/*UDFtocalculatetemperaturefieldfunctionandstorein/*user-definedmemory.Alsoprintmin,max,avgtemperatures.#include"udf.h"extern*;{floattavg=0.;floattmax=0.;floattmin=0.;floattemp,volume,vol_tot;Thread*t;cell_t/*Loopoverallcellsinthe*/ {/*Computemax,min,volume-averagedtemperature*/{volume=C_VOLUME(c,t);/*getcellvolume*/temp=C_T(c,t);/*getcelltemperature*/if(temp<tmin||tmin==0.)tmin=temp;if(temp>tmax||tmax==0.)tmax=temp;vol_tot+=volume;tavg+=}tavg/=printf("\nTmin=%gTmax=%gTavg=/*Computetemperaturefunctionandstoreinuser-definedmemory/*(locationindex0)*/{temp=C_UDMI(c,t,0)=(temp-tmin)/(tmax-}}}loop第六节UDFs的应本章列举了UDFs的几个应用实例。在例子中,边界条件UDFs,源项UDFs,物理性质UDFs和反应速率UDFs应用于实际的相对较简单的物理模型。我们分析这些实例UDFsUDFs。UDFs的应Interpreted涡轮叶片速度分管道瞬态速度分涡轮叶片速度分如图6.1.1,涡轮周围流体网格采用三角无结构网格,定义涡轮腔体左端为速度,情况场速度的分布。图6.1.2和图6.1.3为恒定速度边界条件计算的结果。速度大小为20m/sec,可以看出恒定速度场在涡轮叶片周围产生变形。图 图 恒定速度条件下的速度大小分图 抛物型速度边界条件速度分布满足下面的关系式 vx20200.0745 度分布式速度大小为20m/sec,上下部值都为20m/sec。定义抛物型速度边界条件的C源程序如下/*vprofile.c/*UDFforspecifyingasteady-statevelocityprofileboundarycondition#include"udf.h"DEFINE_PROFILE(inlet_x_velocity,thread,{realx[ND_ND];/*thiswillholdthepositionvector*/realy;face_tf;begin_f_loop(f,thread){y=x[1];F_PROFILE(f,thread,position)=20.-}end_f_loop(f,}本例使用Interpreted型UDFs,按照前面相关章节叙述对C源程序进行编译连接,操作udfinlet_x_velocity,在计算的时候FLUENT就能按照抛物性速度边界条件进行计算,6.1.46.1.5。图 抛物型速度条件下的速度大小分图 管道瞬态速度分在本例中 速度满足关系式:vx205sin(10t),管道长1m,半径0.2m,道内流体为空气,密度1kg/m3,粘性系数2×10-5kg/m-s。速度分布与时间有关,随时间正弦变化。C源程序如下:/*unsteady.c/*UDFforspecifyingatransientvelocityprofileboundarycondition#include"udf.h"DEFINE_PROFILE(unsteady_velocity,thread,{face_tf;begin_f_loop(f,thread){realt=RP_Get_Real("flow-F_PROFILE(f,thread,position)=20.+}end_f_loop(f,}unsteady_velocityflow-time存贮流场当前历经时间,函数RP_GET_REAL得到当前时间,由于本例为非稳态问题,需要选择非稳态解法器,如下激InterpretedUDFsInterpretedUDFsUDF,在面板VelocityInletX-Velocityudfunsteady_velocityFLUENT默认Iterate面板进行迭代计算。20次,每次迭代前都要更新边界条件并且输出结果。60步之后,我们就可以检查压力出口的速度大小。如果要在计算过程中,查看相SurfaceMonitors面板:SurfaceMonitors1,monitor-1就可以使用了。我们可以输入新文件名代替monitor-1Plot,PrintWrite。EveryIteration,FlowTimeFlowTimeDefine…之后,出DefineSurfaceMonitorpressure–outlet-5。监测输出参数类型为平均值(verage,x轴取流动时间。FileXYPlotmonitor-1.out的图形。Filesadd…Plot6.1.6输出不同时刻本例压力出口的速度大图 20m/sec5m/sec的周期性分布。UDFs的应UDFsInterpreted添加管内流动源2D4m2m,液态金属(物性见表6.2.1)1mm/s290K0.5m之后,管道上壁开始对280K。为了模拟液态金属的凝固,当液态金属温度低于288K时,就添加动量方程的源项。在本例中,我们仅以液态金属的速度大小来表征是否凝288KxxSxCvx,x

x表 80005.5×10-3kg/m-Specific680J/kg-Thermal30W/m-UDFC#include"udf.h"#defineCON20.0DEFINE_SOURCE(cell_x_source,cell,thread,dS,{realif(C_T(cell,thread)<={/*sourcetermsource=-/*derivativeofsourcetermw.r.t.x-velocity.*/dS[eqn]=-CON;}source=dS[eqn]=0.;returnsource;}InterpretedUdfsFluid面板中的XMomentum下拉列表cell_x_xource。6.2.1,6.2.26.2.3图 图 图 UDFs的应UDFsInterpreted粘性系数与温度相关流体的对于暖流体(T288K)5.5×10-3kg/m-s,冷流体(T286K)粘性系数1.0kg/m-s,处于中间温度(286K≤T≤288K)的流体,粘性系数满足关系式 0.UDFC/*viscosity.c/*UDFforspecifyingatemperature-dependentviscosityproperty#include"udf.h"{realrealtemp=C_T(cell,thread);if(temp>288.)mu_lam=5.5e-3;elseif(temp>mu_lam=143.2135-0.49725*mu_lam=1.;returnmu_lam;}temp存放温度,mu_lamUDFs编译连接之后,可以Material面板中选择设置。6.3.1,6.3.26.3.30.0055kg/m-s6.3.26.2.1中的结果一样陡降为零,而是逐渐降图 图 图 UDFs的应UDFsCompiled体积a生成组分bR

K1X1K2X其中,Xaa的质量分数,K1K26.4.16英寸厚的多孔介质,反应发生在多空介质区。管道内组分有相同物理性质,密度1.0kg/m1.72×10-5kg/m-s。图 2D管道略a0.1m/s的速度从左端进入管道,经过多空介质区和管道空间,多孔介质区各5m-16.4.2的流场可以看出大多数流体是从管道空间流出的,经图 具有多空介质区的2D管道内的流线分6.4.3图6.4.3 具有多空介质区的2D管道内的速度矢量分布本例的C源程序为:/*rate.c/*UDFforspecifyingareactionrateinaporousmedia#include"udf.h"#defineK12.0e-2#defineK25.DEFINE_VR_RATE(user_rate,cell,thread,r,mole_weight,species_mf,rate,{reals1=realmw1=if(FLUID_THREAD_P(thread)&&*rate=K1*s1/pow((1.+K2*s1),2.0)/mw1;*rate=}THREAD_VAR(thread).fluid.porous用于检测当前网格是否属于多空介质区。CompiledUDFs面板打开共享库连接UDFsUser-DefinedFunctionHooks面板选择使用反应速率Define→User-Defined→Function6.4.4a的质量分数。a0ab;管道空间组a100a没有进行反应。图 具有多空介质区的2D管道内的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论