(6)循环宏
多数的UDF任务需要在一个线的所有单元和面上重复执行。比如,定义一个自定义轮廓函数会对一个面thread的所有单元和面进行循环。为了方便用户,Fluent向用户提供了一些循环宏工具(looping macro utilities)来执行对单元、面、节点和线的重复操作。 如果要实现扫描全场的网格就需要使用循环宏。Fluent的循环宏如下。 thread_loop_c:在一个domain中循环所有的cell线程。 thread_loop_f:在一个domain中循环所有的face线程。 beginend_c_loop:在一个cell线程中循环所有的cell。 beginend_f_loop:在一个face线程中循环所有的face。 c_face_loop:在一个cell中循环所有的face。 c_node_loop:在一个cell中循环所有的node。
循环宏大体可以分为两种类型:一种以begin开始,end结束,用来扫描线上的所有网格和面;一种用来扫描所有的线。大体结构如下: cell_t c;
face_t f; Thread*t; Domain*d;
begin_c_loop(c,t) {
}
end_c_loop(c,t) /*循环遍历线上的所有网格*/ begin_f_loop(f,t) { }
end_f_loop(f,t) /*循环遍历线上的所有面*/ thread_loop_c(t,d)
{
} /*遍历网格线*/ thread_loop_f(t,d) {
} /*遍历面上的线*/
UDF的C语言基础
1、FLUENT的C数据类型
FLUENT的UDF解释程序支持下面的C数据类型:
Int整型 Long长整型 Real实型 Float浮点型 Double双精度型 Char字符型
注意:UDF解释函数在单精度算法中定义real类型为float型,在双精度算法宏定义real为double型。因为解释函数自动作如此分配,所以使用在UDF中声明所有的float和double数据变量时使用real数据类型是很好的编程习惯。
2、常数
常数是表达式中所使用的绝对值,在C程序中用语句#dedine来定义。最简单的常数是十进制整数。包含小数点或者字母e的十进制数被看成浮点常数。按惯例,常数的声明一般都使用大写字母。如:#define YMIN0.0 #define WALL_ID 5 3、变量
变量或者对象保存在可以存储数值的内存中。每一个变量都有类型、名字和值。变量在使用之前必须在C程序中声明。
变量声明结构如下:数据类型+变量名。变量声明可以给定初值。局部变量在函数内部声明。全局变量在单一函数的外部定义,一般在预处理程序之后的文件开始处声明。
如果全局变量在某一源代码中声明,但是另一个源代码的某一文件需要用到它,那么必须在另一个文件中声明它是外部变量,声明时只要在最前面加上extern即可。如果有几个文件涉及到该变量,最方便的处理方法就是在头文件中加上extern的定义,然后在所有的.c文件中引用该头文件即可。外部变量只用于complied UDF。
静态变量。static声明对于全局变量和局部变量的影响是不一样的。静态局部变量在函数调用返回之后,该变量不会被破坏。静态全局变量在定义该变量的.c源文件之外对任何函数保持不可见。静态声明也可以用于函数,使该函数只对定义它的.c文件保持可见。
4、自定义数据类型
C还允许用结构和typedef创建自定义数据类型。如下: typedef struct list { int a; real b; int c; }
mylist; /*mylist为类型结构列表*/ mylist x,y,z; /*x,y,z为类型结构列表*/ 5、强制转换
强制转换数据类型,如: int x=1;
real y3.14159;
int z=x+((int)y); /*z=4*/ 6、函数
UDF的编写
步骤
1、分析实际问题的模型,得到UDF对应的数学模型。 2、将数学模型使用C语言源代码表达出来 3、编译调试UDF源程序 4、在Fluent中执行UDF
UDF基本格式
编写Interpreted型和Compiled型用户自定义函数的过程和书写格式是一样的。其主要区别在于与C语言的结合程度:Compiled型能完全使用C语言的语法,而Interpreted型只能使用其中一小部分。基本格式归为三部分
1、定义恒定常数和包含库文件,分别由#DEFINE和#INCLUDE陈述 2、使用宏DEFINE定义UDF函数
3、函数体部分
包含的库有udf.h、sg.h、mem.h、prop.h、dpm.h等,其中udf.h是必不可少的,书写格式为#include udf.h;所有数值都应采用SI单位制;函数体部分字母采用小写,Interpreted型只能采用Fluent支持的C语言语法和函数。
Fluent提供的宏都以DEFINE_开始,对它们的解释包含在udf.h文件中,所以必须要包含库udf.h。
UDF编译和连接之后,函数名就会出现在Fluent相应的下拉列表内。例如DEFINE_PROFILE(inlet_x_velocity,thread,position),编译连接之后,就能相应的边界条件面板内找到一个名为inlet_x_velocity的函数,选定之后就可以使用。
UDF实例
在圆管中,入口水流速通过以下公式描述: