UDF第3章写UDF详解

发布时间 : 星期六 文章UDF第3章写UDF详解更新完毕开始阅读

节点(node) 网格点

单元线索(cell thread) 在其中分配了材料数据和源项的单元组 面线索(face thread) 在其中分配了边界数据的面组 节点线索(node thread) 节点组

区域(domain) 由网格定义的所有节点、面和单元线索的组合

Figure 3.4.1: Grid Terminology

3.5 FLUENT数据类型

除了标准的C语言数据类型如real, int 等可用于在你的UDF中定义数据外,还有几个FLUENT指定的与求解器数据相关的数据类型。这些数据类型描述了FLUENT中定义的网格的计算单位(见Figure 3.4.1)。使用这些数据类型定义的变量既有代表性地补充了DEFINE macros的自变量,也补充了其它专门的访问FLUENT求解器数据的函数。

一些更为经常使用的FLUENT数据类型如下: cell_t face_t Thread Domain Node

cell_t是线索(thread)内单元标识符的数据类型。它是一个识别给定线索内单元的整数下标。face_t是线索内面标识符的数据类型。它是一个识别给定线索内面的整数下标。

Thread数据类型是 FLUENT中的数据结构。它充当了一个与它描述的单元或面的组合相关的数据容器。

Node数据类型也是FLUENT中的数据结构。它充当了一个与单元或面的拐角相关的数据容器。

Domain数据类型代表了FLUENT中最高水平的数据结构。它充当了一个与网格中所有节点、面和单元线索组合相关的数据容器。

!!注意,FLUENT中所有数据类型都是 情形敏感的(case-sensitive)。 3.6 使用DEFINE Macros定义你的UDF

Fluent.Inc为你提供了一套你必须使用它来定义你的UDF的预定义函数。这些定义UDF的函数在代码中作为宏执行,可在作为DEFINE(全部大写)宏的文献中查阅。对每个DEFINE 宏的完整描述和它的应用例子,可参考第四章。

DEFINE宏的通用格式为:

DEFINE_MACRONAME(udf_name, passed-in variables)

这里括号内第一个自变量是你的UDF的名称。名称自变量是情形敏感的必须用小写字母指定。一旦函数被编译(和连接),你为你的UDF选择的名字在FLUENT下拉列表中将变成可见的和可选的。第二套输入到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面板)的下拉列表中变为可见的和可选的。 !!注意,所有用于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 \

/* Always include udf.h when writing a UDF. It 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的拷贝在你的当地目录下;一旦你的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头文件后,你必须定义真实的变量。使用把它们定义在所有函数之外的全局变量(如果它们被源文件中大部分或所有函数共享)是非常方便的。

关于全局变量的信息见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_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; }

3.10 UDF任务(UDF Tasks) UDF可执行的任务有五种不同的类型: 1. 返回值 2. 修改自变量 3. 返回值和修改自变量

4. 修改FLUENT变量(不能作为自变量传递) 5. 写信息到(或读取信息从)case或data文件

函数能返回值,除非它们在udf.h文件中被定义为void。如果它们不返回值,它们能修改自变量,修改存储在内存中的变量,或与case和data文件一起执行输入输出(I/O)任务。

联系合同范文客服:xxxxx#qq.com(#替换为@)