fluent_udf_第三章_编写udf

上传人:小** 文档编号:93548480 上传时间:2019-07-23 格式:PDF 页数:27 大小:583.07KB
返回 下载 相关 举报
fluent_udf_第三章_编写udf_第1页
第1页 / 共27页
fluent_udf_第三章_编写udf_第2页
第2页 / 共27页
fluent_udf_第三章_编写udf_第3页
第3页 / 共27页
fluent_udf_第三章_编写udf_第4页
第4页 / 共27页
fluent_udf_第三章_编写udf_第5页
第5页 / 共27页
点击查看更多>>
资源描述

《fluent_udf_第三章_编写udf》由会员分享,可在线阅读,更多相关《fluent_udf_第三章_编写udf(27页珍藏版)》请在金锄头文库上搜索。

1、第第 3 章章 编写编写 UDF 第第 3 章章 编写编写 UDF 本章包含了 FLUENT 中如何写 UDFs 的概述。 3.1 概述 3.2 写解释式 UDFs 的限制 3.3 FLUENT 中 UDFs 求解过程的顺序 3.4 FLUENT 网格拓扑 3.5 FLUENT 数据类型 3.6 使用 DEFINE Macros 定义你的 UDF 3.7 在你的 UDF 源文件中包含 udf.h 文件 3.8 定义你的函数中的变量 3.9 函数体 3.10 UDF 任务 3.11 为多相流应用写 UDFs 3.12 在并行中使用你的 UDF 3.1 概述(概述(Introduction) 在你

2、开始编写将挂到 FLUENT 代码以增强其标准特征的 UDF 之前,你必须 知道几个基本的要求。首先,UDFs 必须用 C 语言编写。它们必须使用 FLUENT 提供的 DEFINE macros 来定义。UDFs 必须含有包含于源代码开始指示的 udf.h 文件;它允许为 DEFINE macros 和包含在编译过程的其它 FLUENT 提供的函数 定义。 UDFs 只使用预先确定的宏和函数从 FLUENT 求解器访问数据。 通过 UDF 传递到求解器的任何值或从求解器返回到 UDF 的,都指定为国际(SI)单位。 总之,当写 UDF 时,你必须记住下面的 FLUENT 要求。 UDFs:

3、1. 采用 C 语言编写。 2. 必须为 udf.h 文件有一个包含声明。 3. 使用 Fluent.Inc 提供的 DEFINE macros 来定义。 4. 使用 Fluent.Inc 提供的预定义宏和函数来访问 FLUENT 求解器数据。 5. 必须使返回到 FLUENT 求解器的所有值指定为国际单位。 3.2 写解释式写解释式 UDFs 的限制(的限制(Restriction on Writing Interpreted UDFs) 第第 3 章章 编写编写 UDF 无论 UDFs 在 FLUENT 中以解释还是编译方式执行,用户定义 C 函数(说明在 Section 3.1 中)的基

4、本要求是相同的,但还是有一些影响解释式 UDFs 的重大编 程限制。FLUENT 解释程序不支持所有的 C 语言编程原理。解释式 UDFs 不能 包含以下 C 语言编程原理的任何一个: 1. goto 语句。 2. 非 ANSI-C 原型语法 3. 直接的数据结构查询(direct data structure references) 4. 局部结构的声明 5. 联合(unions) 6. 指向函数的指针(pointers to functions) 7. 函数数组。 在访问 FLUENT 求解器数据的方式上解释式 UDFs 也有限制。 解释式 UDFs 不能 直接访问存储在 FLUENT 结

5、构中的数据。它们只能通过使用 Fluent 提供的宏间 接地访问这些数据。 另一方面, 编译式 UDFs 没有任何 C 编程语言或其它注意的 求解器数据结构的限制。 3.3 FLUENT求解过程中求解过程中UDFs的先后顺序 (的先后顺序 (Sequencing of UDFs in the FLUENT Solution Process) 当你开始写 UDF 代码的过程时(依赖于你写的 UDF 的类型) ,理解 FLUENT 求 解过程中 UDFs 调用的内容或许是重要的。 求解器中包含连接你写的用户定义函 数的 call-outs。 知道 FLUENT 求解过程中迭代之内函数调用的先后顺序

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

7、循环或者继续或停止。 第第 3 章章 编写编写 UDF Figure 3.3.1: Solution Procedure for the Segregated Solver 耦合求解器耦合求解器 在耦合求解器求解过程中(Figure 3.3.2),用户定义的初始化函数(使用 DEFINE_INIT 定义的)在迭代循环开始之前执行。然后,迭代循环开始执行用 户定义的调整函数 (使用 DEFINE_ADJUST 定义的) 。 接着, FLUENT 求解连续、 动量和(适合的地方)能量的控制方程和同时地一套物质输运或矢量方程。其余 的求解步骤与分离式求解器相同(Figure 3.3.1) 。 Fig

8、ure 3.3.2: Solution Procedure for the Coupled Solver 第第 3 章章 编写编写 UDF 3.4 FLUENT 网格拓扑网格拓扑 在我们开始讨论 FLUENT 特殊的数据类型之前,你必须理解网格拓扑学的术语 因为 FLUENT 数据类型是为这些实体定义的。下面是显示在 Figure 3.4.1 中的网 格实体的定义。 单元(cell) 区域被分割成的控制容积 单元中心(cell center) FLUENT 中场数据存储的地方 面(face) 单元(2D or 3D)的边界 边(edge) 面(3D)的边界 节点(node) 网格点 单元线索(

9、cell thread) 在其中分配了材料数据和源项的单元组 第第 3 章章 编写编写 UDF 面线索(face thread) 在其中分配了边界数据的面组 节点线索(node thread) 节点组 区域(domain) 由网格定义的所有节点、面和单元线索的组合 Figure 3.4.1: Grid Terminology 3.5 FLUENT 数据类型(数据类型(FLUENT Data Types) 除了标准的 C 语言数据类型如 real, int 等可用于在你的 UDF 中定义数据外,还 有几个 FLUENT 指定的与求解器数据相关的数据类型。这些数据类型描述了 FLUENT 中定义的

10、网格的计算单位(见 Figure 3.4.1) 。使用这些数据类型定义的 变量既有代表性地补充了 DEFINE macros 的自变量,也补充了其它专门的访问 FLUENT 求解器数据的函数。 一些更为经常使用的 FLUENT 数据类型如下: cell_t face_t 第第 3 章章 编写编写 UDF Thread Domain Node cell_t 是线索(thread)内单元标识符的数据类型。它是一个识别给定线索内单 元的整数索引。face_t 是线索内面标识符的数据类型。它是一个识别给定线索内 面的整数索引。 Thread 数据类型是 FLUENT 中的数据结构。它充当了一个与它描述

11、的单元或面 的组合相关的数据容器。 Node 数据类型也是 FLUENT 中的数据结构。它充当了一个与单元或面的拐角相 关的数据容器。 Domain 数据类型代表了 FLUENT 中最高水平的数据结构。它充当了一个与网格 中所有节点、面和单元线索组合相关的数据容器。 ! !注意,FLUENT 中所有数据类型都是 情形敏感的(case-sensitive) 。 3.6 使用使用 DEFINE Macros 定义你的定义你的 UDF(Defining Your UDF Using DEFINE Macros) Fluent.Inc 为你提供了一套你必须使用它来定义你的 UDF 的预定义函数。这些定

12、 义 UDFs 的函数在代码中作为宏执行,可在作为 DEFINE(全部大写)宏的文献中 查阅。对每个 DEFINE 宏的完整描述和它的应用例子,可参考第四章。 DEFINE 宏的通用格式为: DEFINE_MACRONAME(udf_name, passed-in variables) 这里括号内第一个自变量是你的 UDF 的名称。名称自变量是情形敏感的必须用 小写字母指定。 一旦函数被编译 (和连接) , 你为你的 UDF 选择的名字在 FLUENT 下拉列表中将变成可见的和可选的。第二套输入到 DEFINE 宏的自变量是从 FLUENT 求解器传递到你的函数的变量。 在下面的例子中,宏 D

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

14、于 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

15、translates the DEFINE */ /* and other macros into C, which is what the compiler understands. */ 通过在你的 UDF 源文件中包含 udf.h, 编译过程中所有的 DEFINE 宏的定义与源 代码一起被包含进来。udf.h 文件也为所有的 C 库函数头文件包含#include 指示, 与大部分头文件是针对 Fluent 提供的宏和函数是一样的(例如,mem.h) 。除非 有另外的指示,没必要在你的 UDF 中个别地包含这些头文件。 还有,当你编译你的 UDF 时,你不必放置 udf.h 的拷贝在你的当

16、地目录下;一旦 你的 UDF 被编译,FLUENT 求解器会自动地从 Fluent.Inc/fluent6.x/src/目录来读 取 udf.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.h 头文件后, 你必须定义真实的变量。 使用把它

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 管理学资料

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号