Udf概述
输运方程
FLUENT求解器建立在有限容积法的基础上,将计算域离散为有限数目的控制体或是单元。网格单元是FLUENT中基本的计算单元,这些单元的守恒特征必须保证。也就是说普通输运方程,例如质量、动量、能量方程的积分形式可以应用到每个单元:
此处,是描述普通输运数量的变量,根据所求解的输运方程可取不同的值。下面是输运方程中可求解的子集
守恒与否需要知道通过单元边界的通量。因此需要计算出单元和面上的属性值。
单元(cell)、面(face)、区域(zone)和线(thread)
单元和面组成区域,区域可以由模型和区域的物理特征来标定,同时规定了计算域的物理组成。如入口面域的单元面可以被指定为velocity-inlet。
线(thread)是FLUENT数据结构的内部名称,可被用来指定一个区域。Thread结构可作为数据储存器来使用,这些数据对于它所表示的单元和面来说是公用的。
宏DEFINE_
宏是用来定义UDF的,简单说,它是Fluent和UDF程序的一个接口。只有通过宏,才能实现UDF与Fluent中信息的交互。宏分为三类:通用、离散相和多相、动网格。
常用宏介绍:
1、DEFINE_ADJUST
该宏定义的函数在每一步迭代开始前执行。利用它修改流场变量。在执行该宏定义的函数时,它的参数domain传递给处理器,说明该函数是作用于整个流场的网格区域。
enum函数2、DEFINE_DIFFUSIVITY
利用该宏定义函数修改组分扩散系数或者用户自定义标量输运方程的扩散系数。其中c代表单元网格,t是指向网络的指针,i表示第i种组分或第i个用户自定义标量(传递给处理器)。函数返回real型数据。
3、DEFINE_INIT
用以初始化流场变量,他在fluent默认的初始化之后执行。作用区域为全场,无返回值。
4、DEFINE_ON_DEMAND
定义函数不是在计算中有fluent自动调用,二是根据需要手工调用运行。
5、DEFINE_PROFILE
定义函数指定边界条件。T指向定义边界条件的网格线,i用来表示边界的位置。函数在执行时,需要循环扫遍所有的边界网格线,其值存储在F_PROFILE(f,t,i)中,无返回值。
6、DEFINE_PROPERTY
利用该宏定义的函数可以指定物质物性参数。C表示网格,t表示网格线,返回实型值。
7、DEFINE_RW_FILE
该宏用于读写case和data文件。其中,fp是指向所读写文件的指针。
8、DEFINE_SOURCE
利用该宏定义除DO辐射模型之外其他所有输运方程的源项。在实际计算中,函数需要扫遍全场网格。其中c表示网格,t表示网格线,dS表示源项对所求输运方程的标量的偏导数,用于对源项的线性化,i标志已定义源项对应的输运方程。
UDF预定义函数
Fluent已经预先定义了一些函数,通过这些函数可以从求解器中读写数据,从而达到UDF和Fluent标准求解器结合的目的。这些函数是定义在.件里的,例如mem.h。一般在UDF源程序的开头包含udf.件,就可以使用这些预定义的函数。这里的函数是广义的,包括函数和宏,只有在源文件appropriate.h中定义的才是真正的函数。如果使用的是Interpreted的UDF,则只能使用这些Fluent提供的函数。通过这些Fluent的预定义函数可以得到的变量有:
几何变量(坐标、面积、体积等)
网格和节点变量(节点的速度等)
溶液变量及其组合变量(速度、温度、湍流量等)
材料性质变量(密度、粘度、导电性等)
离散相模拟变量
Fluent自身有增加了几个数据类型:
Node:他表示相应的网格节点。
cell_t:单独一个控制体体积元,用来定义源项或物性。
face_t:它对应于网格面,用来定义入口边界条件等。
Thread:对应边界或网格区域的结构类型数据。
Domain:它是一种包含所有的threads、cells、faces、和nodes的结构。
上述结构区分大小写。
函数示例:
(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语言源代码表达出来
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论