【ACCESS精品源码栏目提醒】:本文主要为网学会员提供“UDF中文帮助 - 生活指南”,希望对需要UDF中文帮助 - 生活指南网友有所帮助,学习一下!
第一章. 介绍 本章简要地介绍了用户自定义函数UDF及其在Fluent中的用法。
在1.1到1.6节中我们会介绍一下什么是UDF如何使用UDF以及为什么要使用UDF在1.7中将一步步的演示一个UDF例子。
1.1 什么是UDF 1.2 为什么要使用UDF 1.3 UDF的局限 1.4 Fluent5到Fluent6 UDF的变化 1.5 UDF基础 1.6 解释和编译UDF的比较 1.7一个step-by-stepUDF例子 1.1什么是UDF 用户自定义函数或UDF是用户自编的程序它可以动态的连接到Fluent求解器上来提高求解器性能。
用户自定义函数用C语言编写。
使用DEFINE宏来定义。
UDF中可使用标准C语言的库函数也可使用Fluent Inc.提供的预定义宏通过这些预定义宏可以获得Fluent求解器得到的数据。
UDF使用时可以被当作解释函数或编译函数。
解释函数在运行时读入并解释。
而编译UDF则在编译时被嵌入共享库中并与Fluent连接。
解释UDF用起来简单但是有源代码和速度方面的限制不足。
编译UDF执行起来较快也没有源代码限制但设置和使用较为麻烦。
1.2为什么要使用UDF 一般说来任何一种软件都不可能满足每一个人的要求FLUENT也一样其标准界面及功能并不能满足每个用户的需要。
UDF正是为解决这种问题而来使用它我们可以编写FLUENT代码来满足不同用户的特殊需要。
当然FLUENT的UDF并不是什么问题都可以解决的在下面的章节中我们就会具体介绍一下FLUENT UDF的具体功能。
现在先简要介绍一下UDF的一些功能 定制边界条件定义材料属性定义表面和体积反应率定义FLUENT输运方程中的源项用户自定义标量输运方程UDS中的源项扩散率函数等等。
在每次迭代的基础上调节计算值 方案的初始化 需要时UDF的异步执行 后处理功能的改善 FLUENT模型的改进例如离散项模型多项混合物模型离散发射辐射模型 由上可以看出FLUENT UDF并不涉及到各种算法的改善这不能不说是一个遗憾。
当然为了源代码的保密我们还是可以理解这样的做法的。
其实如果这些代码能够部分开放哪怕就一点点我想FLUENT会像LINUX一样发展更为迅速使用更为广泛。
遗憾的是从目前来看这只是一种幻想。
什么时候中国人可以出自己的
精品 1.3 UDF的局限 尽管UDF在FLUENT中有着广泛的用途但是并非所有的情况都可以使用UDF。
UDF并不能访问所有的变量和FLUENT模型。
例如它不能调节比热值调节该值需要使用求解器的其它功能。
如果您不知道是否可以用UDF解决某个特定的问题您可以求助您的技术支持。
1.4 Fluent5到Fluent6UDF的变化 如果你有FLUENT5的UDF编程经验请注意在FLUENT6种的下列变化 ?? FLUENT6中加入了大量的通用多相模型。
When one of these general multiphase models is enabled storage must be set aside for the mixture as well as the individual phases. This functionality is manifested in the code through the use of additional thread and domain data structures. Consequently some predefined macros have been added that allow
access to data contained within mixture-level and phase-level domain and thread structures. See Section 3.11 for details on writing UDF for multiphase applications. If you have a FLUENT 5 UDF with an external domain declaration that you want to use in FLUENT 6 then the extern statement must be replaced by a call to the Get_Domain utility and assignment to a Domain pointer as shown below. The Fluent-provided utility Get_Domain1 returns the pointer to the mixture-level domain. See Section 6.5.1 for more details on Get_Domain. Example extern Domain domain DEFINE_ON_DEMANDmy_udf ... is to be replaced by DEFINE_ON_DEMANDmy_udf Domain domain domain Get_Domain1 ... The macro C_VOF accesses volume fraction values from the FLUENT solver. C_VOFc pti has two arguments c and pti. c is the cell identifier. pti is the pointer to the corresponding phase-level thread for the ith phase where i is the phase_domain_index. For example C_VOFcpti can be used to return the volume fraction of the ith phase fluid at cell c. The pointer pti can also be retrieved using THREAD_SUB_THREAD discussed in Section 6.5.4 using i as an argument. ?? For compiled UDF the makefile called Makefile.udf that was provided in previous FLUENT releases has been renamed to makefile.udf2. See Section 7.3.2 for more details. ?? For multiphase flow problems you will need to supply your own user-defined scalar flux function instead of using the default function provided by FLUENT. ?? DEFINE_PROPERTY is to be used to define UDF for particle or droplet diameter for the mixture model previously the Algebraic Slip Mixture Model ASMM instead of the DEFINE_DRIFT_DIAM macro. 1.5 UDF基础 ?? 1.5.1输运方程 ?? 1.5.2单元Cells面区域Zones和线Threads ?? 1.5.3操作 ?? 1.5.4求解器数据 ?? 1.5.5运行 1.5.1输运方程 FLUENT 求解器建立在有限容积法的基础上这种方法将计算域离散为有限数目的控制体或是单元。
网格单元是FLUENT 中基本的计算单元这些单元的守恒特性必须保证。
也就是说普通输运方程例如质量动量能量方程的积分形式可以应用到每个单元 1.5.1此处 是描述普通输运数量的变量a general transportable quantity根据所求解的输运方程它可取不同的值。
下面是在输运方程中可求解的的子集。
Transport Equation Variable for continuity 1 x momentum velocity u y momentum velocity v z momentum velocity w energy enthalpy h turbulent kinetic energyk turbulent dissipation rate species transport mass fraction of species Y i守恒与否需要知道通过单元边界的通量。
因此需计算出单元和面上的属性值properties。
1.5.2单元Cells面区域Zones和线Threads 单元和单元面被组合为一些区域zones这些区域规定了计算域例如入口出口壁面的物理组成physical components。
当用户使用FLUENT 中的UDF 时用户的UDF 可调用流体区域或是边界区域的计算变量solution variables。
UDF需要获得适当的变量比如说是区域参考a zone reference和单元ID以便标定各个单元。
区域A zone是一群单元或单元面的集合它可以由模型和区域的物理特征比如入口出口壁面流体区域来标定。
例如一些被指定为面域a face zone的单元面可以被指定为velocity-inlet 类型由此速度也就可指定了。
线A thread是FLUENT 数据结构的内部名称可被用来指定一个区域。
Thread 结构可作为数据储存器来使用这些数据对于它所表示的单元和面来说是公用的The Thread structure acts as a container for data that is common to the group of cells or faces that it represents。
1.5.3操作 多数的UDF任务需要在一个线的所有单元和面上重复执行。
比如定义一个自定义轮廓函数a custom profile function则会对一个面线上in a face thread的所有单元和面进行循环。
为了用户方便 Fluent Inc.向用户提供了一些循环宏工具looping macro utilities来执行对单元面节点nodes和线threads的重复操作。
例如单元循环宏Cell-looping macros 可以对给定单元线上的所有单元进行循环操作loop over cells in a given cell thread allowing
access to all of the cells。
而面循环宏Face-looping macros则可调用所有给定面线a given face thread的面。
Fluent提供的循环工具请见Chapter 6。
在某些情况下UDF 需要对某个变量操作而这个变量恰恰又不能直接被当作变量来传递调用。
比如如果用户使用DEFINE_ADJUST宏来定义UDF求解器将不会向它传递thread指针。
这种情况下用户函数需要用Fluent提供的宏来调用线指针thread pointer。
见Chapter 6。
1.5.4求解器数据 通过FLUENT用户界面将C 函数它已被编译和连接连接到求解器上可实现调用求解器变量。
一旦UDF和求解器正确连接无论何时函数都可调用求解器数据。
这些数据将会被作为用户变量自动地传递给UDF。
注意所有的求解器变量不管是求解器传递给UDF的还是UDF传递给求解器的都使用SI单位。
1.5.5运行 UDF将会在预定时刻被FLUENT调用 。
但是也可对它们进行异步执行使用DEFINE_ON_DEMAND宏还可在需要时on demand执行。
详情请见4.2.3 1.6 解释和编译UDF的比较 编译UDF和FLUENT的构建方式一样。
脚本Makefile 被用来调用C编译器来构建一个当地目标代码库a native object code library。
目标代码库包含高级C语言源代码的机器语言翻译。
代码库在FLUENT 运行时由“动态加载”dynamic loading过程连接到FLUENT上。
连接后与共享库的联系the association with the shared library将会被保存在用户的case文件中这样当FLUENT以后再读入case文件时此编译库将会与FLUENT 自动连接。
这些库是针对计算机的体系结构和一定版本的FLUENT使用的。
所以当FLUENT更新或计算机操作系统改变或是在不同类型的机器上运行时这些库必须重新构建。
而解释UDF则是在运行时直接从C语言源代码编译和装载compiled and loaded directly from the C source code。
在FLUENT运行中源代码被编译为中介的独立于物理结构的使用C预处理程序的机器代码an intermediate architecture-independent machine code。
当UDF 被调用时机器代码由内部仿真器an internal emulator或注释器interpreter执行。
注释器不具备标准C编译器的所有功能它不支持C语言的某些原理elements。
所以在使用 interpreted UDF 时有语言限制见3.2。
例如interpreted UDF 不能够通过废弃结构dereferencing structures来获得FLUENT 数据。
要获得数据结构必须使用由FLUENT 提供的预定义宏。
另一个例子是FLUENT interpreter 不能识别指针数组。
这些功能必须由compiled UDF 来执行。
编译后用户的C函数名称和内容将会被储存在case文件中。
函数将会在读入case文件时被自动编译。
独立于物理结构的代码的外层This extra layer of architecture-independent code可能会导致执行错误a performance penalty但却可使UDF共享不同的物理结构操作系统和Fluent版本。
如果运行速度较慢UDF不用被调节就可以编译代码的形式in compiled mode运行。
FLUENT 中的compiled 和interpreted UDF 请见Chapter 7。
选择interpreted UDF或是compiled UDF时注意以下内容 ?? Interpreted UDF o 对其它平台是便捷的portable。
o 可作为compiled UDF来运行。
o 不需C编译器。
o 比compiled UDF慢 。
o 需要较多的代码。
o 在使用C语言上有限制。
o 不能与编译系统或用户库compiled system or user libraries连接。
o 只能使用预定义宏来获得FLUENT结构中的数据。
见Chapters 5和6。
?? Compiled UDF o 比interpreted UDF运行快。
o 在使用C语言上不存在限制。
o 可用任何ANSI-compliant C 编译器编译。
o 能调用以其他语言编写的函数 specifics are system- and compiler-dependent。
o 机器物理结构需要用户建立FLUENT 2D or 3D 的每个版本的共享库a shared library for each version of FLUENT 2D or 3D needed for your machine architecture。
o 如果包含有注释器interpreter不能处理得C语言元素则不能作为interpreted UDF 运行。
总的来说当决定使用那种类型的UDF 时 ?? 使用interpreted UDF作为简单的函数 ?? 使用compiled UDF作为复杂的函数这些函数 o 对CPU有较大要求例如每次运行时在每个单元上均须调用的属性UDFa property UDF。
o 需要使用编译库require
access to a compiled library。
1.7一个step-by-stepUDF例子 编辑UDF 代码并且在用户的FLUENT 模型中有效使用它须遵循以下七个基本步骤 1. 定义用户模型。
2. 编制C 语言源代码。
3. 运行FLUENT 读入并设置case文件。
4. 编译或注释Compile or interpretC语言源代码。
5. 在FLUENT中激活UDF。
6. 开始计算。
7. 分析计算结果并与期望值比较。
在开始解决问题前用户必须使用UDF 定义希望解决的问题Step 1。
例如加入用户希望使用UDF来定义一个用户化的边界条件a customized boundary profile 。
用户首先需要定义一系列数学方程来描述这个条件。
接下来用户需要将这些数学方程概念设计conceptual design用C语言写成一个函数Step 2。
用户可用文本编辑器来完成这一步。
以.c为后缀名来把这个文件保存在工作路径下。
写完C语言函数后用户即可运行FLUENT并且读入或设置case文件Step 3。
对语言源代码进行注释编译和调试interpret compile and debug并在FLUENT中激活用户函数 Step 5。
最后 运行计算Step 6分析结果并与期望值比较。
Step 7。
根据用户对结果的分析可将上述整个过程重复几次。
具体如下。
Step 1: 定义用户模型 生成和使用UDF 的第一步是定义用户的模型方程。
如图Figure1.7.1所示的涡轮叶片。
模拟叶片周围的流场使用了非结构化网格。
计算域由底端的周期性边界 a periodic boundary on the bottom 延伸到顶端的相同部分an identical one on the top速度入口在左边压力出口在右边。
Figure 1.7.1: The Grid for the Turbine Vane Example 文中对入口x速度为常数分布和抛物线分布的流场进行了比较。
分段线性的分布可由边界场选项得到the application of a profile using a piecewise-linear profile is available with the boundary profiles option而多项式分布则只能使用用户自定义函数得到。
进口速度为常数20 m/s的结果如图和所示。
当流动沿着涡轮叶片进行时初始速度场被改变了。
Figure 1.7.2: Velocity Magnitude Contours for a Constant Inlet x Velocity Figure 1.7.3: Velocity Vectors for a Constant Inlet x Velocity 假定现在要设涡轮叶片入口速度x不是一常数值其分布如下 变量y 在入口中心处为在入口上部和下部则分别为0.0745 m 而入口中心处的x速度为20 m/s 边界上为。
用户可用UDF 描述这一分布并将它应运到FLUENT模型中来解决这类问题。
Step 2: 编制C 语言源代码。
选定方程定义UDF 后用户可用任意文本编辑器来书写语言代码。
以扩展名.c 保存源代码文件保存到工作路径下。
关于UDF 的书写请参考Chapter 。
下面是一个怎样在UDF中应用方程的例子。
UDF的功能由主要的DEFINE 宏the leading DEFINE macro来定义。
此处DEFINE_PROFILE 宏用来表示下面的代码旨在给求解器提供边界的轮廓信息。
书中将在以后部分讨论其它的DEFINE宏。
// / udfexample.c / / UDF for specifying a steady-state velocity profile boundary condition / // include quotudf.hquot DEFINE_PROFILEinlet_x_velocity thread index real xND_ND / this will hold the position vector / real y face_t f begin_f_loopf thread F_CENTROIDxfthread y x1 F_PROFILEf thread index 20. - yy/.0745.074520. end_f_loopf thread DEFINE_PROFILE 宏的第一个变量inlet_x_velocity 用来定义速度入口面板中的函数。
名称可任意指定。
在给定的边界区域上的所有单元面identified by f in the face loop上将会使用函数的这个方程。
当用户在FLUENT 用户界面选定UDF作为边界条件时将会自动定义线thread。
下标由begin_f_loop应用程序自动定义。
UDF 中begin_f_loop 被用来形成对边界区域上所有单元面的循环loop through all cell faces in the boundary zone。
对于每个面面的质心the face centroid的坐标可由F_CENTROID 宏来获得。
抛物线方程中用到了y 坐标y 速度值通过F_PROFILE 宏来返回给面。
begin_f_loop宏和F_PROFILE宏都是FLUENT提供的宏。
详情请见Chapter 。
Step 3: 运行FLUENT 读入并设置case文件 建立UDF后用户开始设置FLUENT。
1. 在工作路径下启动FLUENT。
2. 读入或设置case文件如果case文件以前设置过请确认它是否被保存在了工作路径下。
Step 4: 编译或注释Compile or interpretC语言源代码 这部分将例中的源代码作为interpreted UDF 来编译。
注意这个例子不可应用于Windows 的并行网络Windows parallel networks。
完整的编译和连接UDF 请见Chapter 。
1. 确认UDF 的case 文件如果以前设置过和C语言源代码在工作路径下。
2. 用Interpreted UDF面板编译UDF 例如 udfexample.c 。
Define User-Defined Functions Interpreted... Figure 1.7.4: The Interpreted UDF Panela 在Source File Name下键入C语言源代码文件 例如 udfexample.c 。
如果用户源代码不在目前工作路径下则在编译UDF时需在Interpreted UDF面板中间如文件完整的路径。
b 在CPP Command Name 一栏里选择C预处理器。
c Stack Size 缺省设置为10000。
如果用户函数的局部变量数目大于10000将会导致堆栈溢出。
这种情况下应将Stack Size设置为比局部变量大的数。
d 点击Compile 编译UDF。
存储case文件时C语言代码的名称和内容将会储存在case文件中。
如果Interpreted UDF面板中的Display Assembly Listing选项被选中当编译进行时控制台窗口中将会显示汇编语言代码。
另外此选项将会被存储在case文件中当以后用户在执行FLUENT任务时控制台窗口中将会编译时一样显示汇编语言代码。
inlet_x_velocity: .local.pointer thread r0 .local.int nv r1 0 .local.end 0 save .local.int f r3 1 push.int 0 .local.pointer x r4 3 begin.data 8 bytes 0 bytes initialized: 7 save . . . . 156 pre.inc.int f r3 158 pop.int 159 b .L3 22 .L2: 161 restore 162 restore 163 ret.v 注意如果编译失败FLUENT 将会给出错误信息请调试程序。
详见7.2.3。
e 编译结束后点击Close。
此例中的UDF源代码也可作为compiled UDF运行。
Step 5: 在FLUENT中激活UDF 编译连接完UDF后FLUENT用户界面面板中将会看到UDF。
此例中可在Velocity Inlet面板中选择UDF。
Define Boundary Conditions... 在X-Velocity下拉列表中选择udf inlet_x_velocity此名称是由例中的函数给定的。
一旦选中UDF将会替代X-Velocity中的0 值进行运算。
点击OK接受新的边界条件关闭面板。
Step 6: 开始计算 运算方式和以前一样。
Solve Iterate... Step 7: 分析计算结果并与期望值比较 计算收敛后获得一个修正的速度场。
Figure1.7.5为入口x速度为抛物线分布的速度等值线可与Figure 1.7.2所示的入口速度为常数20 m/sec 的流场比较。
常数条件下流动在涡轮叶片周围变形distorted。
入口抛物线分布在入口中心处为最大值边缘上为0。
Figure 1.7.5: Velocity Magnitude Contours for a Parabolic Inlet x Velocity 第二章.UDF的C语言基础 本章介绍了UDF的C语言基础 2.1引言 2.2注释你的C代码 2.3FLUENT中的C数据类型 2.4常数 2.5变量 2.6自定义数据类型 2.7强制转换 2.8函数 2.9数组 2.10指针 2.11声明 2.12常用C操作符 2.13C库函数 2.14用define实现宏置换 2.15用include实现文件包含 2.16与FORTRAN比较 2.1引言 本章介绍了C语言的一些基本信息这些信息对处理FLUENT的UDF很有帮助。
本章首先假定你有一些编程经验而不是C语言的初级介绍。
本章不会介绍诸.