APeraGlobalCompany©PERAChinaANSYSFLUENT培训教材第七节:UDF安世亚太科技(北京)有限公司APeraGlobalCompany©PERAChina概要FLUENTUDF简介FLUENT数据结构和宏两个例子UDF支持APeraGlobalCompany©PERAChina简介什么是UDF?–UDF是用户自己用C语言写的一个函数,可以和FLUENT动态链接•标准C函数▪三角函数,指数,控制块,Do循环,文件读入/输出等•预定义宏▪允许获得流场变量,材料属性,单元几何信息及其他为什么使用UDFs?–标准的界面不能编程模拟所有需求:•定制边界条件,源项,反应速率,材料属性等•定制物理模型•用户提供的模型方程•调整函数•执行和需求函数•初始化APeraGlobalCompany©PERAChina可以使用UDF的位置User-DefinedPropertiesUser-DefinedBCsUserDefinedINITIALIZESegregatedPBCSExitLoopRepeatCheckConvergenceUpdatePropertiesSolveTurbulenceEquation(s)SolveSpeciesSolveEnergyInitializeBeginLoopDBCSSolveOtherTransportEquationsasrequiredSolver?SolveMassContinuity;UpdateVelocitySolveU-MomentumSolveV-MomentumSolveW-MomentumSolveMass&MomentumSolveMass,Momentum,Energy,SpeciesUser-definedADJUSTSourcetermsSourcetermsSourcetermsSourcetermsAPeraGlobalCompany©PERAChinaUDF数据结构(1)在UDF中,体域和面域通过Thread数据类型获得Thread是FLUENT定义的数据类型为了在thread(zone)中获得数据,我们需要提供正确的指针,并使用循环宏获得thread中的每个成员(cellorface)Fluid(cellthreadorzone)Boundary(facethreadorzone)DomainCellDomainCellsCellThreadfaceThreadFacesAPeraGlobalCompany©PERAChinaUDF数据结构(2)cell_t声明了识别单元的整型数据类型face_t声明了识别面的整型数据类型TypeVariableMeaningofthedeclarationDomain*d;disapointertodomainthreadThread*t;tisapointertothreadcell_tc;ciscellthreadvariableface_tf;fisafacethreadvariableNode*node;nodeisapointertoanode.Boundaryface-thread(boundary-faceensemble)Fluidcell-thread(control-volumeensemble)Internalface-thread(internal-faceensemble)associatedwithcell-threadsNodesAPeraGlobalCompany©PERAChinaUDF中的循环宏几个经常用到的循环宏为:–对域d中所有单元thread循环:thread_loop_c(ct,d){}–对域d中所有面thread循环:thread_loop_f(ft,d){}–对threadt中所有单元循环:begin_c_loop(c,t){…}end_c_loop(c,t)–对面thread中所有面循环begin_f_loop(f,f_thread){…}end_f_loop(f,f_thread)d:adomainpointerct,t:acellthreadpointerft,f_thread:afacethreadpointerc:acellthreadvariablef:afacethreadvariableAPeraGlobalCompany©PERAChina例子–抛物线分布的速度入口在二维弯管入口施加抛物线分布的速度x方向的速度定义为需要通过宏获得入口的中心点,通过另外一个宏赋予速度条件APeraGlobalCompany©PERAChina第1步–准备源代码DEFINE_PROFILE宏允许定义x_velocity函数–所有的UDFs以DEFINE_宏开始–x_velocity将在GUI中出现–thread和nvDEFINE_PROFILE宏的参数,分别用来识别域和变量–begin_f_loop宏通过thread指针,对所有的面f循环F_CENTROID宏赋单元位置向量给x[]F_PROFILE宏在面f上施加速度分量代码以文本文件保存inlet_bc.c#includeudf.hDEFINE_PROFILE(x_velocity,thread,nv){floatx[3];/*anarrayforthecoordinates*/floaty;face_tf;/*fisafacethreadindex*/begin_f_loop(f,thread){F_CENTROID(x,f,thread);y=x[1];F_PROFILE(f,thread,nv)=20.*(1.-y*y/(.0745*.0745));}end_f_loop(f,thread)}Headerfile“udf.h”mustbeincludedatthetopoftheprogrambythe#includecommandAPeraGlobalCompany©PERAChina第2步–解释或编译UDF编译UDF把UDF源码加入到源文件列表中点击Build进行编译和链接如果没有错误,点击Load读入库文件如需要,也可以卸载库文件/define/user-defined/functions/manage解释UDF把UDF源码加入到源文件列表中点击InterpretFLUENT窗口会出现语言如果没有错误,点击CloseDefineUser-DefinedFunctionsCompiledDefineUser-DefinedFunctionsInterpretedAPeraGlobalCompany©PERAChina解释vs.编译用户函数可以在运行时读入并解释,也可以编译形成共享库文件并和FLUENT链接解释vs.编译–解释•解释器是占用内存的一个大型程序•通过逐行即时执行代码•优势–不需要第三方编译器•劣势–解释过程慢,且占用内存–编译•UDF代码一次转换为机器语言•运行效率高.•创建共享库,和其他求解器链接•克服解释器的缺陷只有在没安装C编译器时使用解释方式APeraGlobalCompany©PERAChina第3步–在FLUENTGUI中hookUDF打开边界条件面板,选择你要施加UDF的边界把Constant改为udfx_velocity宏的名字为DEFINE_PROFILE中第一个参数APeraGlobalCompany©PERAChina第4步–运行可以在运行窗口中改变速度分布的更新间隔(默认为1)–这个设置控制了流场多久(迭代或时间步)更新一次运行calculationAPeraGlobalCompany©PERAChina结果左图为速度矢量图右图为入口的速度矢量图,注意速度分布是抛物线型的APeraGlobalCompany©PERAChina其他UDFHooks除了边界条件、源项、材料属性外,UDF还可用于–初始化•每次初始化执行一次–求解调整•每次迭代执行一次–壁面热流量•以传热系数方式定义流体侧的扩散和辐射热流量•应用于所有壁面–用户定义表面反应或体积反应–Case/data文件的读写•读入顺序必须和写出顺序一致–Execute-on-Demand功能•不参与求解迭代DefineUser-DefinedFunctionHooksAPeraGlobalCompany©PERAChina例2–定制初始化在球内设定初始温度600K球中心点位于(0.5,0.5,0.5),半径为0.25,其余区域为300K域指针通过变量传递到UDFthread_loop_c宏用来获得所有单元threads(zones),begin_c_loop宏获得每个单元thread中的单元#includeudf.h“DEFINE_INIT(my_init_function,domain){cell_tc;Thread*ct;realxc[ND_ND];thread_loop_c(ct,domain){begin_c_loop(c,ct){C_CENTROID(xc,c,ct);if(sqrt(ND_SUM(pow(xc[0]-0.5,2.),pow(xc[1]-0.5,2.),pow(xc[2]-0.5,2.)))0.25)C_T(c,ct)=600.;elseC_T(c,ct)=300.;}end_c_loop(c,ct)}}APeraGlobalCompany©PERAChinaDEFINE宏DEFINE宏的例子DEFINE_ADJUST(name,domain);generalpurposeUDFcalledeveryiterationDEFINE_INIT(name,domain);UDFusedtoinitializefieldvariablesDEFINE_ON_DEMAND(name);an‘execute-on-demand’functionDEFINE_RW_FILE(name,fp);customizereads/writestocase/datafilesDEFINE_PROFILE(name,thread,index);boundaryprofilesDEFINE_SOURCE(name,cell,thread,dS,index);equationsourcetermsDEFINE_HEAT_FLUX(name,face,thread,c0,t0,cid,cir);heatfluxDEFINE_PROPERTY(name,cell,thread);materialpropertiesDEFINE_DIFFUSIVITY(name,cell,thread,index);UDSandspeciesdiffusivitiesDEFINE_UDS_FLUX(name,face,thread,index);definesUDSfluxtermsDEFINE_UDS_UNSTEADY(name,cell,thread,index,apu,su);UDStransienttermsDEFINE_SR_RATE(name,face,thread,r,mw,yi,rr);surfacereactionratesDEFINE_VR_RATE(name,cell,thread,r,mw,yi,rr,rr_t);volumetricreactionratesDEFINE_SCAT_PHASE_FUNC(name,cell,face);scatteringphasefunctionforDOMDEFINE_DELTAT(name,domain);variabletimestepsizeforunsteadyproblemsDEFINE_TURBULENT_VISCOSITY(name,cell,thread);calculatesturbulentviscosityDEFINE_TURB_PREMIX_SOU