Chapter One:
Overview
UDF特点
1.
用C语言写的
2.
必须包含udf.h的头文件
3.
必须使用Fluent公司提供的DEFINE宏命令,换句话说就是你用这个库,就得按照库中的要求来调用
4.
必须通过Fluent公司提供的预定义宏和函数来获取Fluent求解器的数据,这很容易理解,毕竟是一个商业软件,对数据方面肯定得做一些封装
5.
可通过解释(interpreted)和编译(compiled)两种方法调用UDF
6.
传给Fluent求解器的值必须全部是SI单位
UDF功能
1.
返回需要的值
2.
修改一些参数
3.
同时返回值和修改参数
4.
修改Fluent变量而不是直接直接通过一个参数传递
5.
将信息传入或读取case或者data文件中
UDF常见应用
1.
Customized设置边界条件、材料性质、面或者体反应速率、Fluent或者UDS输运方程的源项、发射率方程等等
2.
每一轮迭代过程中都可进行计算值的调整
3.
按特性要求初始化算例
4.
按需求分步进行UDF的运行
5.
扩展后处理的功能
6.
扩展已有的Fluent模型的模型
UDF限制
UDF并非是全能的,譬如比热容的值需要其他的求解器功能才能实现,在UDF中是不能修改的,建议通过网上查询或者有条件的购买正版软件进行技术咨询来确定相应功能是否可以实现
UDF实现方法
通过定义DEFINE宏来调用Fluent支持的外部可调用函数,即所有的UDF都需通过定义宏来实现;这些宏定义命令,即函数,都在udf.h这个库或者说头文件中,在第四章中有每个宏的说明、用法及案例。
这里先简单说一下DEFINE宏命令的统一调用格式:
DEFINE_MACRONAME(udf.name,pass-in variables)
即 DEFINE_宏名称(udf的名称,传入的参数)
需注意,此处宏命令都是由Fluent提供为大写,而udf的名称为我们自己提供,但这里必须是小写;另所有宏命令内的参数必须在同一行,否则会报错
例如:
DEFINE_PROFILE(inlet_x_velocity, thread, index)
定义了一个关于边界条件的宏,名称是inlet_x_velocity,有两个参数,thread 和 index
udf.h库的调用
若有过一定编程基础,应该了解库这个概念--将函数放到库里,供别人使用的一种方式。调用的时候把它所在的文件名用#include加到里面即可。Fluent官方人员考虑到求解器的功能,因此编写了udf.h这个库,故使用udf库中的函数即宏时,必须首先导入此库:
#include “udf.h”
我们来看一下实际运行中程序是如何编译的,举个栗子:
DEFINE_PROFILE(inlet_x_velocity,
thread, index)
编译后,实际上其内部是如下运行的:
void inlet_x_velocity(Thread
*thread, int index)
当然如果有其他的例如文件输入输出等需要,也可通过#include其他包来导入,以实现相应功能
解释和编译UDF
解释(interpret)方法:
1.
使用于多平台,这里多平台指多种配置的电脑、服务器
2.
所有的解释型程序都可以用编译的方法运行
3.
不需要额外的C语言编译器,既不需要装C语言编译器环境
4.
好用的同时增加了时间消耗,会比编译增加较多时间,在大批量的计算中是不推荐的
5.
在C语言代码的编程中一部分的限制,例如函数的数组、局部结构体的声明等等都不可以使用,具体可查UDF手册
6.
不能被连接到编译的系统或者用户库
7.
只能通过预定义宏来获取存储在Fluent结构中数据
编译(compile)方法:
1.
比解释方法快得多
2.
C语言编程没有任何限制
3.
在任何支持ANSI兼容的C语言编译器环境下都可运行
4.
若满足系统和编译器要求,则可以调用其他语言中的函数
5.
由于C语言编程的限制,有些代码在解释型方法中无法运行
故:
a.
对于较小的、直接的宏命令可选解释方法
b.
对于复杂函数:(1)有很大的CPU计算需要(2)需要访问共享库(library)推荐用编译方法
网格专有名词声明

图1.1
图1.2
cell-单元,控制体分散成的最小区域
cell center-单元区域的中心位置
face-二维或者三维单元的边界
edge-三维face的边界
node-网格节点
cell thread-单元的集合
face thread-face的集合
node thread-节点的集合
domain-节点、面以及单元线程(thread)的集合
Fluent设计了一套数据结构来描述网格区域,通过单元(cell)、单元的面(face)以及网格点,并建立相邻网格时间的连接来存储相应的信息。Thread是Fluent内部用来描述指定区域(边界或者容积)的数据结构。Domain则囊括了节点、面以及容积的所有thread,可视为它们的集合;所有的单元和单元面通常对应的物理结构的模型,譬如inlet,outlet,wall,fluid
region这种。需要注意一点,对应面如果是外边界,则只绑定一个单元(标识为c0),若是内部面,则绑定两个单元(标识为c0和c1)。
数据类型
除了C语言中通用的变量类型:real、int等,Fluent自身定义一系列的数据类型,这些都与求解器中的数据有关,主要是代表图1.1和图1.2中的计算单元。使用这些数据类型定义的变量主要是作为参数传给DEFINE宏或者其他可以获取Fluent求解器数据的特殊函数。下面简单介绍几个常用的数据类型:
cell_t-标识给定thread(集合)中的特定单元(cell)的序号,为一个整数
face_t-标识给定thread(集合)中的特定面(face)的序号,为一个整数
Thread-可视为一个存储着单元或者面所代表的集合中数据的容器,需要注意一下,多相流中的每一相都对应了一个Thread容器
Node-存储着单元或面角落处点的数据结构
Domain-存储着网格中节点、面以及单元thread的集合,对于单相流只有一个Domian,对于多相流,每一相都有一个Domain,并且,各相之间的接触(interaction)以及整个混合相(mixture)都分别有一个Domian,其中对于混合相(mixture)的Domian是最高层次的。
特别需要注意的是,对应不同的case宏命令中所需传入的参数是不一样的,需根据宏命令的功能特点,譬如:
DEFINE_PROPERTY(my_function,c,t)和DEFINE_UDS_FLUX(my_function,f,t,i) 无需传入Thread,直接应用于所有区域
DEFINE_ADJUST(my_function,d)作用于整个domain
DEFINE_PROFILE(my_function,thread,i)则只作用于连接(hooked)的边界
DEFINE_ON_DEMAND(myfunction)这种则直接无需传入任何参数
加载中,请稍候......