ImageVerifierCode 换一换
格式:DOCX , 页数:27 ,大小:45.50KB ,
资源ID:12390198      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/12390198.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(fluent UDF第三章.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

fluent UDF第三章.docx

1、fluent UDF第三章UDF 第3章 写UDF本章主要概述了如何在FLUENT写UDF。3.1 概述3.2写解释式UDF的限制3.3 FLUENT中UDF求解过程的顺序3.4 FLUENT网格拓扑3.5 FLUENT数据类型3.6 使用DEFINE Macros定义你的UDF3.7在你的UDF源文件中包含udf.h文件3.8 定义你的函数中的变量3.9函数体3.10 UDF 任务3.11 为多相流应用写UDF3.12在并行中使用你的UDF3.1概述(Introduction)UDF是用来增强FLUENT代码的标准功能的,在写UDF之前,我们要明确以下几个基本的要求。首先,必须用C语言编写U

2、DF。必须使用FLUENT提供的DEFINE宏来定义UDF。UDF必须含有包含于源代码开始指示的udf.h文件;它允许为DEFINE macros和包含在编译过程的其它FLUENT提供的函数定义。UDF只使用预先确定的宏和函数从FLUENT求解器访问数据。通过UDF传递到求解器的任何值或从求解器返回到UDF的值,都指定为国际(SI)单位。总之,当写UDF时,你必须记住下面的FLUENT要求。UDF:1. 采用C语言编写。2. 必须为udf.h文件有一个包含声明。3. 使用Fluent.Inc提供的DEFINE macros来定义。4. 使用Fluent.Inc提供的预定义宏和函数来访问FLUE

3、NT求解器数据。5. 必须使返回到FLUENT求解器的所有值指定为国际单位。3.2写解释式UDF的限制(Restriction on Writing Interpreted UDF)无论UDF在FLUENT中以解释还是编译方式执行,用户定义C函数(说明在Section 3.1中)的基本要求是相同的,但还是有一些影响解释式UDF的重大编程限制。FLUENT解释程序不支持所有的C语言编程原理。解释式UDF不能包含以下C语言编程原理的任何一个:1. goto 语句。2. 非ANSI-C原型语法3. 直接的数据结构查询(direct data structure references)4. 局部结构的

4、声明5. 联合(unions)6. 指向函数的指针(pointers to functions)7. 函数数组。在访问FLUENT求解器数据的方式上解释式UDF也有限制。解释式UDF不能直接访问存储在FLUENT结构中的数据。它们只能通过使用Fluent提供的宏间接地访问这些数据。另一方面,编译式UDF没有任何C编程语言或其它注意的求解器数据结构的限制。3.3 FLUENT求解过程中UDF的先后顺序(Sequencing of UDF in the FLUENT Solution Process)当你开始写UDF代码的过程时(依赖于你写的UDF的类型),理解FLUENT求解过程中UDF调用的内

5、容或许是重要的。求解器中包含连接你写的用户定义函数的call-outs。知道FLUENT求解过程中迭代之内函数调用的先后顺序能帮助你在给定的任意时间内确定那些数据是当前的和有效的。分离式求解器在分离式求解器求解过程中(Figure 3.3.1),用户定义的初始化函数(使用DEFINE_INIT定义的)在迭代循环开始之前执行。然后迭代循环开始执行用户定义的调整函数(使用DEFINE_ADJUST定义的)。接着,求解守恒方程,顺序是从动量方程和后来的压力修正方程到与特定计算相关的附加标量方程。守恒方程之后,属性被更新(包含用户定义属性)。这样,如果你的模型涉及到气体定律,这时,密度将随更新的温度(

6、和压力 and/or 物质质量分数)而被更新。进行收敛或者附加要求的迭代的检查,循环或者继续或停止。Figure 3.3.1: 分离解算器的解程序耦合求解器在耦合求解器求解过程中(Figure 3.3.2),用户定义的初始化函数(使用DEFINE_INIT定义的)在迭代循环开始之前执行。然后,迭代循环开始执行用户定义的调整函数(使用DEFINE_ADJUST定义的)。接着,FLUENT求解连续、动量和(适合的地方)能量的控制方程和同时地一套物质输运或矢量方程。其余的求解步骤与分离式求解器相同(Figure 3.3.1)。Figure 3.3.2: Solution Procedure for

7、the Coupled Solver3.4 FLUENT 网格拓扑在我们开始讨论FLUENT特殊的数据类型之前,你必须理解网格拓扑学的术语因为FLUENT数据类型是为这些实体定义的。下面是显示在Figure 3.4.1中的网格实体的定义。 单元(cell) 区域被分割成的控制容积 单元中心(cell center) FLUENT中场数据存储的地方 面(face) 单元(2D or 3D)的边界 边(edge) 面(3D)的边界 节点(node) 网格点 单元线索(cell thread) 在其中分配了材料数据和源项的单元组 面线索(face thread) 在其中分配了边界数据的面组 节点线索

8、(node thread) 节点组 区域(domain) 由网格定义的所有节点、面和单元线索的组合Figure 3.4.1: Grid Terminology3.5 FLUENT数据类型除了标准的C语言数据类型如real, int 等可用于在你的UDF中定义数据外,还有几个FLUENT指定的与求解器数据相关的数据类型。这些数据类型描述了FLUENT中定义的网格的计算单位(见Figure 3.4.1)。使用这些数据类型定义的变量既有代表性地补充了DEFINE macros的自变量,也补充了其它专门的访问FLUENT求解器数据的函数。一些更为经常使用的FLUENT数据类型如下: cell_t fa

9、ce_t Thread Domain Nodecell_t是线索(thread)内单元标识符的数据类型。它是一个识别给定线索内单元的整数下标。face_t是线索内面标识符的数据类型。它是一个识别给定线索内面的整数下标。Thread数据类型是FLUENT中的数据结构。它充当了一个与它描述的单元或面的组合相关的数据容器。Node数据类型也是FLUENT中的数据结构。它充当了一个与单元或面的拐角相关的数据容器。Domain数据类型代表了FLUENT中最高水平的数据结构。它充当了一个与网格中所有节点、面和单元线索组合相关的数据容器。!注意,FLUENT中所有数据类型都是 情形敏感的(case-sens

10、itive)。3.6 使用DEFINE Macros定义你的UDFFluent.Inc为你提供了一套你必须使用它来定义你的UDF的预定义函数。这些定义UDF的函数在代码中作为宏执行,可在作为DEFINE(全部大写)宏的文献中查阅。对每个DEFINE 宏的完整描述和它的应用例子,可参考第四章。DEFINE宏的通用格式为:DEFINE_MACRONAME(udf_name, passed-in variables)这里括号内第一个自变量是你的UDF的名称。名称自变量是情形敏感的必须用小写字母指定。一旦函数被编译(和连接),你为你的UDF选择的名字在FLUENT下拉列表中将变成可见的和可选的。第二套

11、输入到DEFINE 宏的自变量是从FLUENT求解器传递到你的函数的变量。在下面的例子中,宏 DEFINE_PROFILE(inlet_x_velocity, thread, index)用两个从FLUENT传递到函数的变量thread和index定义了名字为inlet_x_velocity的分布函数。这些passed-in变量是边界条件区域的ID(作为指向thread的指针)而index确定了被存储的变量。一旦UDF被编译,它的名字(例如,inlet_x_velocity)将在FLUENT适当的边界条件面板(例如,Velocity Inlet面板)的下拉列表中变为可见的和可选的。!注意,所有

12、用于DEFINE宏的自变量必须放在你的源代码的同一行上。分割DEFINE的声明为几行可能导致编译错误。3.7在你的UDF源文件中包含udf.h文件(Including the udf.h File in Your UDF Source File)DEFINE 宏的定义位于称为udf.h(见附录A的列表)的头文件中。为了使DEFINE宏延伸到编译过程,你必须在你写的每个UDF源文件的开始包含udf.h文件。#include udf.h/* Always include udf.h when writing a UDF. It translates the DEFINE */* and other

13、 macros into C, which is what the compiler understands. */通过在你的UDF源文件中包含udf.h,编译过程中所有的DEFINE宏的定义与源代码一起被包含进来。udf.h文件也为所有的C库函数头文件包含#include指示,与大部分头文件是针对Fluent提供的宏和函数是一样的(例如,mem.h)。除非有另外的指示,没必要在你的UDF中个别地包含这些头文件。还有,当你编译你的UDF时,你不必放置udf.h的拷贝在你的当地目录下;一旦你的UDF被编译,FLUENT求解器会自动地从Fluent.Inc/fluent6.x/src/目录来读取u

14、df.h文件。举例从前面部分的宏DEFINE_PROFILE(inlet_x_velocity, thread, index)定义在udf.h文件中为#define DEFINE_PROFILE(name, t, i) void name(Thread *t, int i)在编译过程中延伸为void inlet_x_velocity(Thread *thread, int index)名字为inlet_x_velocity的函数不返回值由于它被声明为空的数据类型。3.8在你的函数中定义变量(Defining Variable in Your Function)在你的UDF源文件中包含了udf.

15、h头文件后,你必须定义真实的变量。使用把它们定义在所有函数之外的全局变量(如果它们被源文件中大部分或所有函数共享)是非常方便的。关于全局变量的信息见Section 2.5.3。局部于函数的任何变量必须在函数内声明。局部变量的信息见Section 2.5.2。3.9函数体(Functin Body)你的UDF源文件中的C函数体被包含在DEFINE声明之下的一对大括号内,显示在下面的例子中。在这个例子中,mu_lan和temp是局部变量。只有cell_viscosity函数认识它们。例子DEFINE_PROPERTY(cell_viscosity, cell, thread) real mu_la

16、m; 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;3.10 UDF任务(UDF Tasks)UDF可执行的任务有五种不同的类型:1. 返回值2. 修改自变量3. 返回值和修改自变量4. 修改FLUENT变量(不能作为自变量传递)5. 写信息到(或读取信息从)case或data文件函数能返回值,除非它们在udf.h文件中被定义为void。如果

17、它们不返回值,它们能修改自变量,修改存储在内存中的变量,或与case和data文件一起执行输入输出(I/O)任务。在Section 3.10.1-3.10.5中,提供了描述上面提到的五种不同的函数任务中每一种的UDF源代码例子。3.10.1 返回值的函数(Function that Return a Value)下面的UDF是一个返回值到FLUENT求解器的函数例子。名为cell_viscosity的函数计算了依赖温度的粘度值(mu_lam)并返回这个值到求解器。/*/* UDF that returns a value to the solver */* Specifies a temper

18、ature-dependent viscosity property */*/#include udf.hDEFINE_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;cell_viscosity使用了DEFINE_PROPERTY 宏(在S

19、ection 4.3.6中描述)来定义。DEFINE_PROPERTY返回一个udf.h中指定的real数据类型。两个real变量传入函数:通过函数计算的层流粘度mu_lam; 和C_T(cell,thread)的值,它是在考虑中的单元的温度值。温度值在它下降范围的基础上被检测,mu_lam的适当值被计算。在函数结尾,mu_lam的计算值被返回。3.10.2修改自变量的函数(Function that Modify an Argument)下面的UDF是一个修改一个自变量的函数的例子。名字为user_rate的函数为一个两种气态物质的的简单系统产生一个自定义的体积反应速率。Real指针rr作为

20、自变量传递给函数,指针指向的变量在函数内被修改。/*/* UDF that modifies one of its arguments */* Specifies a reaction rate in a porous medium */*/#include udf.h#define K1 2.0e-2#define K2 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_

21、P(t) & THREAD_VAR(t).fluid.porous) *rr = K1*s1/pow(1.+K2*s1),2.0)/mw1; else *rr = 0.;user_rate使用了DEFINE_VR _RATE宏(见Section 4.3.14)来定义。该函数执行一个当前考虑的单元是否在多孔区域的测试,这个反应速率只应用于多孔区域。real指针变量rr是一个传递给函数的自变量。UDF使用废弃操作符 * 分配反应速率值给废弃指针 *rr。指针rr指向的目标是设置反应速率。通过这个操作,存储在内存中这个指针上的字符的地址被改变了,不再是指针地址本身。(关于废弃指针的详细内容见3)。3

22、.10.3返回一个值和修改一个自变量的函数(Functions that Return a Value ans Modify an Argument)下面的UDF是一个修改它的自变量并返回一个值到FLUENT求解器的函数例子。名字为user_swirl的函数修改ds自变量,指定旋转速度源项并返回它到求解器。/*/* UDF that returns a value and modifies an argument */* Specifies a swirl-velocity source term */*/#include udf.h#define OMEGA 50. /* rotationa

23、l 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; C_CENTROID(x, cell, thread); y = x1; w_vel = y*OMEGA; /* linear w-velocity at the cell */ source = WEIGHT*(w_vel - C_WSWIRL(cel

24、l,thread); dSeqn = -WEIGHT; return source;user_swirl使用DEFINE_SOURCE宏来定义(在Section 4.3.8中描述)。DEFINE_SOURCE返回一个在udf.h中指定的数据类型。函数采用自变量ds(它是数组的名字)并设置由eqn指定的元素为关于速度(w_vel)导数的值。(这是z动量方程源项)。这个函数也计算了旋转速度源项的值source,并返回这个值到求解器。3.10.4修改FLUENT变量的函数下面的UDF是一个修改存储在内存中FLUENT变量的函数例子。名字为inlet_x_velocity的函数使用F_PROFILE(

25、a Fluent Inc. provided utility(应用程序)“Translate by 金山词霸”)来修改存储在内存中的x速度分布边界条件。/*/* UDF that modifies a FLUENT solver variable */* Specifies a steady-state velocity profile boundary condition */*/#include udf.hDEFINE_PROFILE(inlet_x_velocity, thread, index) real xND_ND; /* this will hold the position v

26、ector */ real y; face_t f; begin_f_loop(f, thread) F_CENTROID(x,f,thread); y = x1; F_PROFILE(f, thread, index) = 20. - y*y/(.0745*.0745)*20.; end_f_loop(f, thread)inlet_x_velocity使用DEFINE_PROFLIE宏来定义(在Section 4.3.5中描述)。它的自变量是thread和index。Thread是一个指向面线索的指针,而index是一个每个循环内为变量设置数值标签的整数。DEFINE_PROPERTY在u

27、df.h文件中一个返回void的数据类型。函数由声明变量f作为face_t数据类型开始。一维数组x和变量y是real 数据类型。循环宏用来在区域中每个面上循环以创建型线或数据数组。在每个循环内,F_CENTROID为含有index f的面输出面质心的值(数组 x),index f在由thread指向的线索上。存储在x1中的y坐标分配给变量y,它用于计算x速度。然后这个值分配给F_PROFILE, 它使用整数index(由求解器传递个它)来设置内存中面上的x速度值。3.10.5写入Case或Data文件或从中读取的函数(Functions that Write to or Read from a

28、 Case or Data File)下面的C源代码包含了写信息到data文件和读回它的函数例子。这是一个包含多个连接在一起的UDF的单个C文件例子。/*/* UDF that increment a variable, write it to a data file */ /* and read it back in */*/#include udf.hint kount = 0; /* define global variable kount */DEFINE_ADJUST(demo_calc, domain) kount+; printf(kount = %dn,kount);DEFIN

29、E_RW_FILE(writer, fp) printf(Writing UDF data to data file.n); fprintf(fp, %d,kount); /* write out kount to data file */DEFINE_RW_FILE(reader, fp) printf(Reading UDF data from data file.n); fscanf(fp, %d,&kount); /* read kount from data file */在顶部的列表中,整数kount被定义为全局的(由于它被源代码文件中的所有三个函数使用)并初始化为0。名字为demo_calc的第一个函数,使用DEFINE_SDJUST 宏来定义。(关于DEFINE_ADJUST的详细信息见Section 4.2.1)。在demo_calc中,kount的值每次迭代后增加因为

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1