UDF-自定义函数课件_第1页
UDF-自定义函数课件_第2页
UDF-自定义函数课件_第3页
UDF-自定义函数课件_第4页
UDF-自定义函数课件_第5页
已阅读5页,还剩60页未读 继续免费阅读

下载本文档

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

文档简介

1、2021/3/231用户自定义函数UDF2021/3/232用户自定义函数 用户自定义函数或UDF 是用户自编的程序它可以被动态的连接到Fluent 求解器上来提高求解器性能用户自定义函数用C 语言编写使用DEFINE 宏来定义UDFs 中可使用标准C 语言的库函数也可使用预定义宏Fluent Inc.提供通过这些预定义宏可以获得Fluent 求解器得到的数据2021/3/233UDF分类与区别 UDFs 使用时可以被当作解释函数解释函数或编译函数编译函数 解释函数解释函数在运行时读入并解释 编译编译UDFs 则在编译时被嵌入共享库中并与Fluent 连接解释解释UDFs 用起来简单但是有源代

2、码和速度方面的限制不足。编译型编译型UDFs 执行起来较快也没有源代码限制但设置和使用较为麻烦2021/3/234UDF的用途满足用户个性化需求 边界条件 材料性质 表面与体积反应速率 输运方程源项 用户标量输运方程(UDS) 调节每次迭代值 初始化流场 异步执行 后处理改善 模型改进(离散项模型,多相混合物模型,辐射模型等)2021/3/235UDF举例上壁面温度 300K绝热壁面绝热壁面温度: 315K温度分布2021/3/236Profile处理(Temp point 26)(x 0.00E-03 2.00E-03 4.00E-03 6.00E-03 8.00E-03 1.00E-02

3、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

4、 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+0

5、2 3.16E+02 3.16E+02 3.15E+02 3.15E+02 3.15E+02 3.15E+02 )2021/3/237Profile处理要点 (和一般计算一样设置求解器,模型等) DefineProfileRead (数据) DefineBoundaryCondition所需设置的面ThermalTemperatureTemp t (和一般计算一样,设置其它边值条件、初值条件及求解与结果检查等)2021/3/238UDF处理温度#include udf.hDEFINE_PRO, thread, position) real xND_ND;/* this will hold th

6、e position vector */ real y; face_t f; begin_f_loop(f, thread) F_CENTROID(x,f,thread); y = x0; F_PRO) = 315. + (y-.044)*(y-.044)/.044/.044*35.; end_f_loop(f, thread)2021/3/239UDF设置边界温度处理要点 (和一般计算一样设置求解器,模型等) DefineUser definedFunctions(Interpreted Or Compiled)编译 DefineBoundaryCondition所需设置的面ThermalT

7、emperatureBottom Temperature (和一般计算一样,设置其它边值条件、初值条件及求解与结果检查等)2021/3/2310侧面与地面两处UDF2021/3/2311定义一个以上UDF上壁面温度 300K温度抛物线分布绝热壁面温度: 315K温度分布2021/3/2312UDF编写#include udf.hDEFINE_PRO, thread, position) 程序1DEFINE_PRO, thread, position) 程序2 DEFINE_PRO)程序3。 2021/3/2313边界温度分布左侧温度分布 下面温度分布2021/3/2314场温度分布2021/3

8、/2315UDF编写用C语言 注释 /* 这是刘某人讲课示范用的程序 */ 数据类型数据类型 Int:整型 Long:长整型 Real:实数Float:浮点型 Double:双精度 Char:字符型 UDF解释函数在单精度算法中定义real类型为float型,在双精度算法宏定义real为double型。因为解释函数自动作如此分配,所以使用在UDF中声明所有的float和double数据变量时使用real数据类型是很好的编程习惯。 2021/3/2316局部变量局部变量 局部变量只用于单一的函数中。当函数调用时,就被创建了,函数返回之后,这个变量就不存在了,局部变量在函数内部(大括号内)声明。在

9、下面的例子中,mu_lam和temp是局部变量。 2021/3/2317DEFINE_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; 2021/3/2318FLUENT求解过程中UDFs的先后顺序非耦合求解器2021/3/2319耦合求解器

10、2021/3/2320FLUENT 网格拓扑 单元(cell) 区域被分割成的控制容积 单元中心(cell center) FLUENT中场数据存储的地方 面(face) 单元(2D or 3D)的边界 边(edge) 面(3D)的边界 节点(node) 网格点 单元线索(cell thread) 在其中分配了材料数据和源项的单元组 面线索(face thread) 在其中分配了边界数据的面组 节点线索(node thread) 节点组 区域(domain) 由网格定义的所有节点、面和单元线索的组合 2021/3/23212021/3/2322Fluent数据类型 cell_t face_t

11、Thread Node Domain cell_t是线索(thread)内单元标识符的数据类型。它是一个识别给定线索内单元的整数索引。face_t是线索内面标识符的数据类型。它是一个识别给定线索内面的整数索引。 Thread数据类型是FLUENT中的数据结构。它充当了一个与它描述的单元或面的组合相关的数据容器。 Node数据类型也是FLUENT中的数据结构。它充当了一个与单元或面的拐角相关的数据容器。 Domain数据类型代表了FLUENT中最高水平的数据结构。它充当了一个与网格中所有节点、面和单元线索组合相关的数据容器。2021/3/2323使用DEFINE Macros定义UDF DEFI

12、NE_MACRONAME(udf_name, passed-in variables) 这里括号内第一个自变量是你的UDF的名称。名称自变量是情形敏感的必须用小写字母小写字母指定。 一旦函数被编译(和连接),你为你的UDF选择的名字在FLUENT下拉列表中将变成可见的和可选的。第二套输入到DEFINE 宏的自变量是从FLUENT求解器传递到你的函数的变量。2021/3/2324 DEFINE_PRO, thread, index) 用两个从FLUENT传递到函数的变量thread和index定义了名字为inlet_x_velocity的分布函数。这些passed-in变量是边界条件区域的ID(

13、作为指向thread的指针)而index确定了被存储的变量。一旦UDF被编译,它的名字(例如,inlet_x_velocity)将在FLUENT适当的边界条件面板(例如,Velocity Inlet面板)的下拉列表中变为可见的和可选的。 2021/3/2325UDF源文件中包含udf.h文件 #include udf.h 通过在你的UDF源文件中包含udf.h,编译过程中所有的DEFINE宏的定义与源代码一起被包含进来。udf.h文件也为所有的C库函数头文件包含#include指示,与大部分头文件是针对F l u e n t 提 供 的 宏 和 函 数 是 一 样 的 ( 例如,mem.h)。

14、除非有另外的指示,没必要在你的UDF中个别地包含这些头文件。 2021/3/2326DEFINE_PRO, thread, index) 定义在udf.h文件中为 #define DEFINE_PRO, t, i) void name(Thread *t, int i) 在编译过程中延伸为 void inlet_x_velocity(Thread *thread, int index) 名字为inlet_x_velocity的函数不返回值由于它被声明为空的数据类型。 2021/3/2327UDF任务 返回值 修改自变量 返回值和修改自变量 修改FLUENT变量(不能作为自变量传递) 写信息到(

15、或读取信息从)case或data文件2021/3/2328返回值 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 28

16、6.) mu_lam = 143.2135 - 0.49725 * temp; else mu_lam = 1.; return mu_lam; 2021/3/2329Function that Modify an Argument判断单元是否在多孔区域,给多孔介质区域定义反应速率;real指针变量rr是一个传递 给 函 数 的 自 变 量 。UDF使用废弃操作符* 分配反应速率值给废弃指针*rr。指针rr指向的目标是设置反应速率。通过这个操作,存储在内存中这个指针上的字符的地址被改变了,不再是指针地址本身#include udf.h #define K1 2.0e-2 #define K2

17、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.; 2021/3/2330返回一个值和修改一个自变量的函数DEFINE_SOURCE返回一个在udf.h中指定的数据类型。函数采用自变量ds(它是数

18、组的名字)并设置由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;

19、C_CENTROID(x, cell, thread); y = x1; w_vel = y*OMEGA; /* linear w-velocity at the cell */ s o u r c e = W E I G H T * ( w _ v e l - C_WSWIRL(cell,thread); dSeqn = -WEIGHT; return source; 2021/3/2331修改FLUENT变量的函数函数由声明变量f作为face_t数据类型开始。一维数组x和变量y是real 数据类型。循环宏用来在区域中每个面上循环以创建型线或数据数组。在每个循环内,F_CENTROID为含有

20、index f的面输出面 质 心 的 值 ( 数 组x),index f在由thread指向的线索上。存储在x1中的y坐标分配给变量y,它用于计算x速度。然 后 这 个 值 分 配 给F_PROFILE, 它使用整数index(由求解器传递个它)来设置内存中面上的x速度值。DEFINE_PRO, 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_PROFIL

21、E(f, thread, index) = 20. - y*y/(.0745*.0745)*20.; end_f_loop(f, thread) 2021/3/2332写/读Case或Data文件在顶部整数kount被定义为全局的(由于它被源代码文件中的所有三个函数使 用 ) 并 初 始 化 为 0 。 名 字 为demo_ca lc的 第 一 个 函 数 ,使 用DEFINE_ADJUST 宏来定义。在demo_calc中,kount的值每次迭代后 增 加 因 为 每 次 迭 代 调 用DEFINE_ADJUST一次。名字为writer的第二个函数,使用DEFINE_RW_FILE宏来定义。

22、当保存数据文件时,它指示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

23、) kount+; printf(kount = %dn,kount); DEFINE_RW_, fp) printf(Writing UDF data to data file.n); fprintf(fp, %d,kount); /* write out kount to data file */ DEFINE_RW_, fp) printf(Reading UDF data from data file.n); fscanf(fp, %d,&kount); /* read kount from data file */ 2021/3/2333DEFINE_ADJUST功能及其使用

24、方法 2021/3/2334功能 DEFINE_ADJUST是一个用于调节和修改FLUENT变量的通用宏。 可以用DEFINE_ADJUST来修改流动变量(如:速度,压力)并计算积分。 用来对某一标量在整个流场上积分,然后在该结果的基础上调节边界条件。 在每一步迭代中都可以执行用DEFINE_ADJUST定义的宏,并在解输运方程之前的每一步迭代中调用它。2021/3/2335DEFINE_ADJUST ( name, d) DEFINE_ADJUST有两个参变量:name和d。name是你所指定的UDF的名字。当你的UDF编译并连接时,你的FLUENT图形用户界面就会显示这个名字,此时你就可以

25、选择它了。d是FLUENT解算器传给你的UDF的变量。 D是一个指向区域的指针,调节函数被应用于这个区域上。区域变量提供了存取网格中所有单元和表面的线程。对于多相流,由解算器传给函数的区域指针是混合层区域指针。 DEFINE_ADJUST函数不返回任何值给解算器。2021/3/2336DEFINE_INIT 用DEFINE_INIT宏来定义一组解的初始值。 DEFINE_INIT 完成和修补一样的功能,只是它以另一种方式UDF来完成。 每一次初始化时DEFINE_INIT函数都会被执行一次,并在解算器完成默认的初始化之后立即被调用。因为它是在流场初始化之后被调用的,所以它最常用于设定流动变量的

26、初值。2021/3/2337DEFINE_INIT ( name, d) DEFINE_INIT有两个参变量:name和d。 name是你所指定的UDF的名字。当你的UDF编译并连接时,你的FLUENT图形用户界面就会显示这个名字,此时你就可以选择它了。 d是FLUENT解算器传给你的UDF的变量所作用的计算区域2021/3/2338DEFINE_INIT举例举例 下面的UDF名字是my_init_func,它在某一个解中初始化了流动变量。在解过程开始时它被执行了一次。它可以作为解释程序或者编译后的UDF在FLUENT中执行。#include udf.h DEFINE_INIT(my_init

27、_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

28、,t) = 300.; end_c_loop_all (c,t) 2021/3/2339DEFINE_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

29、 = 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 tem

30、perature */ 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_

31、T(c,t); C_UDMI(c,t,0) = (temp-tmin)/(tmax-tmin); end_c_loop(c,t) 2021/3/2340DEFINE 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

32、 DEFINE_UDS_UNSTEADY DEFINE_VR_RATE 2021/3/2341提取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 物质质

33、量分数 C_K(c,t)cell t c, Thread *t 湍流运动能 C_D(c,t)cell t c, Thread *t 耗散率2021/3/2342速度导数名称(参数)名称(参数)参数类型参数类型返回值返回值C DUDX(c,t)cell t c, Thread *tvelocity derivativeC DUDY(c,t)cell t c, Thread *tvelocity derivativeC DUDZ(c,t)cell t c, Thread *tvelocity derivativeC DVDX(c,t)cell t c, Thread *tvelocity deri

34、vativeC DVDY(c,t)cell t c, Thread *tvelocity derivativeC DVDZ(c,t)cell t c, Thread *tvelocity derivativeC DWDX(c,t)cell t c, Thread *tvelocity derivativeC DWDY(c,t)cell t c, Thread *tvelocity derivativeC DWDZ(c,t)cell t c, Thread *tvelocity derivative2021/3/2343 C_R(c,t)cell t c, Thread *t密度C_MU L(c

35、,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

36、 c, Thread *t, int i,int j层流扩散率 物性参数2021/3/2344循环宏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

37、 ( 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) 查询单元节点 2021/3/2345UDF编译连接 Interpreted UDFs:解释的UDF被编译成与体系结构无关的中间代码或伪码。这一代码调用时是在内部模拟器或解释器上运行。与体系结构无关的代码牺牲了程序性能,但其UDF可易于共享在不同的结构体系之间,即操作系统和FLUENT版本中。 Compiled UDFs :编译后的U

38、DF由C语言系统的编译器编译成本地目标码。这一过程须在FLUENT运行前完成。在FLUENT运行时会执行存放于共享库里的目标码,这一过程称为“动态装载”。 2021/3/2346Interpreted UDFs2021/3/2347Compiled UDFs方法一在你case所在的目录下,建立libudf在libudf下建立两个src和ntx86子目录源程序(*.c)放进src;在ntx86下再建2d、2d_host、2d_node等(2d)然后在2d文件夹下,把Fluent.Incfluent6. srcmake和Fluent.Inc fluent6. src user_nt.udf拷进去,将make重命名为makefile接着修改user_nt.udf里的内容,要改成以下格式: SOURCES = $(SRC)udfexample.c(源程序名字) VERSION = 2d(是二维还是三维) PARALLEL_NODE = none(有没有并行)

温馨提示

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

评论

0/150

提交评论