您好,欢迎访问三七文档
当前位置:首页 > IT计算机/网络 > 数据库 > 18-第十八章-FLUENT用户自定义函数
第18章用户自定义函数用户自定义函数(User-DefinedFunction,UDF)亦称自定义函数,它允许对FLUENT进行个性化设置,这对充分发掘FLUENT在功能上的潜力意义深远。本章比较详细地介绍了在FLUENT中怎样写、编译和使用UDF,并且还给出了有关UDF的例子。主要包括以下几个方面的内容:18.1概论18.2写用户自定义函数(UDF)18.3解释、编译及连接用户自定义函数(UDF)18.4用户自定义函数(UDF)举例18.1概论18.1.1什么是用户自定义函数(UDF)用户自定义函数(UDF)是用户使用C语言编写的函数,它可以被FLUENT求解器动态地加载,从而增强FLUENT软件的现有功能。UDF是使用Fluent.Inc提供的DEFINE宏定义的。所定义的函数使用由Fluent.Inc提供的预定义宏和函数从FLUENT求解器中访问数据。每一个UDF都要在程序的开头包含udf.h文件(#include”udf.h”),使得在程序编译过程中,DEFINE宏以及其它由FLUENT提供的宏和函数所定义的内容都能被引用。在FLUENT中,UDF作为解释的或编译的函数被执行。不论是UDF传送到求解器的值,还是被求解器返回到UDF的值,都必须使用国际单位制。UDF的特征可以概括如下:(1)是用C语言写成的。(2)必须有一个关于udf.h文件的包含声明。(3)必须使用由Fluent.Inc提供的DEFINE宏定义。(4)使用由Fluent.Inc提供的预定义宏和函数访问FLUENT求解器的数据。(5)作为解释的或编译的函数被执行。(6)计算中必须使用国际单位制。在FLUENT中,UDF可以执行各种不同任务。如果它们在udf.h文件中没有被定义为void,那么它们可以返回一个值。如果它们没有返回一个值,它们还可以修改一个哑元,或修改一个没有被作为哑元传递的变量,或者借助算例文件和数据文件执行输入输出任务。概括说,UDF能够完成下列任务:(1)返回一个值。(2)修改一个哑元。(3)返回一个值同时修改一个哑元。(4)修改一个没被作为一个哑元进行传递的变量。(5)从算例文件或数据文件中写入或读出信息。UDF可以使用C语言在任何文本编辑器中进行编辑,但是源文件只能以扩展名.c保存。通常源文件中只有一个UDF函数,但是也允许在一个文件中包含多个前后相连的UDF函数。源文件在FLUENT中既可以被解释也可以被编译。对于解释型的UDF,源文件(例如,pressure-profile.c)将直接被加载和解释。而对于编译型的UDF,则首先要建立一个共享的目标模块库,然后再把它加载到FLUENT中。一旦解释或编译了UDF,相应的UDF名字将会在FLUENT的图形界面中出现,并且在相应的面板中通过选择这个函数将其连接到一个求解器中。18.1.2使用UDF的原因UDF允许对FLUENT进行特殊设置以便满足建模的特殊需要。UDF可以用于各种实际应用,其中包括:(1)重新设置边界条件、材料特性、表面和体积反应速率、FLUENT输运方程中的源项,自定义标量(UDS)输运方程中的源项和扩散函数等等。(2)在每次迭代计算后调整计算结果。(3)解的初始化。(4)根据计算要求,非同步执行UDF。(5)加强后处理过程。(6)加强FLUENT中现有的物理模型(例如,离散相模型、多相混合物模型、离散点辐射模型)。18.1.3UDF的局限性在FLUENT中,虽然UDF的性能涉及到非常广的应用范围,但UDF不可能适用于每一个应用。毕竟不是所有的解变量或物理模型都可以被UDF访问。比如,比热值不能被修改,若要修改,则需要附带的求解器功能。如果对一个特定问题不能确定是否可以使用UDF来处理,那么可以联系有关技术支持工程师寻求帮助。18.1.4网格术语大部分UDF是从FLUENT求解器访问数据的。由于求解器数据是根据网格而定义的,因此在写一个UDF之前,需要掌握基本的网格术语。一个流场的网格是由大量控制体或者单元构成的。每个单元是由一组网格点(或节点),一个单元中心和包围这个单元的面定义的(如图18-1所示)。FLUENT使用内部数据结构定义网格的域,并将单元、单元面和网格中的节点按序排列,从而建立相邻单元之间的连通性。线程是FLUENT中数据结构的内部名称,它用来表示一个(边界或单元)区。单元线程是单元的组合,面线程是面的组合。域是FLUENT中数据结构的内部名称,它被用来表示网格中的节点、面和单元线程的组合。单元和单元面组成代表流场各个部分的区域(进口、出口、壁面、流动区域等等)。一个面围住的是一个还是两个单元(用c0和c1加以识别)取决于它是一个边界面还是一个内部面。如果是边界面,那么仅有c0存在(对于一个边界面,不定义c1)。如果是内部面,则需要同时定义c0和c1单元。一个面两侧的单元可以属于同一个单元线程,也可以属于另一个单元线程。图18-1:网格组分单元包含控制体的分离域单元中心存储单元数据的位置面一个单元的边界(2D或3D)边一个面的边界(3D)节点网格点单元网络单元的组合面网络面的组合节点网络节点的组合域节点,面和单元线程的组合18.2写用户定义函数(UDF)UDF是用FLUENT软件中提供的DEFINE宏加以定义的。本节将从以下几方面对DEFINE宏展开叙述:18.2.1:引言18.2.2:一般DEFINE宏18.2.3:物种模型的DEFINE宏18.2.4:多相的DEFINE宏18.2.5:动态网格的DEFINE宏18.2.6:DPMDEFINE宏18.2.1引言使用DEFINE宏定义UDFUDF是用FLUENT提供的函数声明语句来定义的,这些函数声明语句被包含在DEFINE宏中,而DEFINE宏的定义则包含在udf.h头文件里。DEFINE宏的一般格式是:DEFINE_MACRONAME(udf_name,passed-invariables)其中,圆括号内的第一个哑元是UDF的名字,名字必须用小写字母定义。DEFINE宏中的第二个哑元是从FLUENT求解器传送到UDF中的变量。例如宏:DEFINE_PROFILE(inlet_x_velocity,thread,index)定义了一个命名为inlet_x_velocity的型函数,另外的两个哑元,thread和index是将从FLUETN传送进这个函数的变量。这两个被传进的变量分别是边界区域的标示符(即指向边界单元线程的指针)和用来标明被存储变量的指标。一旦编译了这个UDF,函数名inlet_x_velocity将出现在VelocityInlet面板的下拉菜单中供用户选择。注意,一个DEFINE宏的所有自变量需要放置到源代码中的同一行。把这个DEFINE说明分成若干行将会导致编辑上的错误。在源文件中加入udf.h头文件udf.h头文件不仅包含DEFINE宏的定义,还包含C语言库函数头文件的#include编辑器指令,同时还包含其它由FLUENT提供的宏和函数的头文件(例如,mem.h),所以用户所写的每个UDF源代码的第一行必须是#include编辑器指令和udf.h文件,即:#include”udf.h”例如,在前面那个例子中,udf.h被包含在其源文件中,DEFINE_PROFILE(inlet_x_velocity,thread,index)则在编译过程中,这个宏将扩展为:voidinlet_x_velocity(Thread*thread,intindex)在用户编辑UDF时,不需要把udf.h的副本放到用户的当地目录中。一旦编辑了一个UDF,FLUENT求解器会自动地从系统目录中读入这个udf.h文件。把所有的函数原型放到一个头文件中是一个常规做法。所以,如果UDF利用自定义函数,那么附加的自定义头文件可能也需要放到udf.h中。所有DEFINE宏的定义都包含在udf.h头文件中。为了方便用户,把它们列在了附录A中。DEFINE宏的分类DEFINE宏基本上可分为五类:(1)一般求解器(2)物种模型(3)多相(4)动态网格模型(5)弥散相模型(DiscretePhaseModel,DPM)对每一种DEFINE宏,在讲解过程中大部分都附有一个UDF的源代码例子。不过,请注意,不是所有的例子都是一个完整的函数,因为有些函数不能作为FLUENT中的单机函数执行。举例的意图仅仅是示范DEFINE宏的应用。使用某个宏定义的UDF,在被通译或编译之后,在DEFINE宏的自变量中规定的函数名将会在FLUENT其对应的面板中变地可视与可选,那么将需要把UDF连接到FLUENT中。第18.3节详细的介绍了通译和编译及连接用户定义函数。18.2.2一般DEFINE宏一般DEFINE宏执行一般的求解函数,其中这些函数都是FLUENT中的独立模型。表18.2.2.1给出了一个关于DEFINE宏,DEFINE宏定义的函数,以及FLUENT中被激活的面板的快捷参考指导。每一个DEFINE宏的定义都被放在了udf.h头文件中。为方便读者,把它们列在了附录A中。一般DEFINE宏包括以下5种:(1)DEFINE_ADJUST(2)DEFINE_EXECUTE_AT_END(3)DEFINE_INIT(4)DEFINE_ON_DEMAND(5)DEFINE_RW_FILE表18-1:关于一般求解器DEFINE宏的快捷参考指导函数DEFINE宏激活的面板操作变量在迭代或时间步的最后执行初始化变量非同步执行读/写变量到case和date文件DEFINE_ADJUSTDEFINE_EXECUTE_AT_ENDDEFINE_INITDEFINE_ON_DEMANDDEFINE_RW_FILEUser-DefinedFunctionHooksUser-DefinedFunctionHooksUser-DefinedFunctionHooksExecuteOnDemandUser-DefinedFunctionHooks1.DEFINE_ADJUSTDEFINE_ADJUST是一个一般用途的宏,它用来调整或修改FLUENT的变量,且变量作为自变量而不被传送。例如,可以使用DEFINE_ADJUST修改流动变量(例如,速度,压力)和计算积分。也可以使用它对一个标量在一个域上进行积分,以及在积分结果的基础上对边界条件进行调整。一个使用DEFINE_ADJUST定义的函数在每步迭代都运行,并且这个函数是在输运方程被求解之前的每步迭代的开始时被调用。z应用宏:DEFINE_ADJUST(name,d)自变量类型:Domain*d函数返回:voidDEFINE_ADJUST中有两个自变量:name和d。name是由用户给出的UDF的名字。d是被传送到FLUENT求解器的自变量,它是域的一个指示器,其中校准函数在这个域上被使用。域自变量提供到网格中所有单元的和面的线程之途径。对于多相流动,被求解器传送到这个函数的域指示器是平均混合物的域指示器。z例子下面的这个名为my_dajust的UDF,使用DEFINE_ADJUST对湍流耗散在整个域上进行积分。然后在控制台窗口中输出积分值。每步迭代UDF都会被调用。在FLUENT中,这个UDF可以作为一个通译的或汇编的UDF被执行。/********************************************************************UDF:对湍流耗散进行积分,在控制台窗口输出积分值*********************************************************************/#include“udf.h”DEFINE_ADJUST(my_adjust,d){Thread*t;/*对耗散进行积分.*/realsum_diss=0.;cell_tc;thread_loop_c(t,d){begin_c_loop(c,t)sum_diss+=C_D(c,t)*C_VOLUME(C,T);end_c_loop(c,t)}pr
本文标题:18-第十八章-FLUENT用户自定义函数
链接地址:https://www.777doc.com/doc-4327015 .html