用户自定义函数UDF中文详细讲解
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
局部变量
局部变量只用于单一的函数中。当函数调用
时,就被创建了,函数返回之后,这个变量 就不存在了,局部变量在函数内部(大括号 内 ) 声 明 。 在 下 面 的 例 子 中 , mu_lam 和 temp是局部变量。
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; }
FLUENT求解过程中UDFs的先后顺序
非 耦 合 求 解 器
耦 合 求 解 器
FLUENT 网格拓扑
单元(cell) 区域被分割成的控制容积 单元中心(cell center) FLUENT中场数据存储的地方 面(face) 单元(2D or 3D)的边界 边(edge) 面(3D)的边界 节点(node) 网格点 单元线索(cell thread) 在其中分配了材料数据和源项的单元组 面线索(face thread) 在其中分配了边界数据的 面组 节点线索(node thread) 节点组 区域(domain) 由网格定义的所有节点、面和单元线索的组
温度分布
Profile处理
((Temp point 26) (x 0.00E-03 2.00E-03 4.00E-03 6.00E-03 8.00E-03 1.00E-02 1.20E-02 1.40E-02 1.60E-02 1.80E-02 2.00E-02 2.20E-02 2.40E-02 2.60E-02 2.80E-02 3.00E-02 3.20E-02 3.40E-02 3.60E-02 3.80E-02 4.00E-02 4.20E-02 4.40E-02 4.60E-02 4.80E-02 5.00E-02 ) (y 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 0.00E+00 ) (t 3.49E+02 3.50E+02 3.50E+02 3.47E+02 3.46E+02 3.44E+02 3.41E+02 3.39E+02 3.36E+02 3.33E+02 3.31E+02 3.28E+02 3.26E+02 3.24E+02 3.22E+02 3.20E+02 3.19E+02 3.18E+02 3.17E+02 3.16E+02 3.16E+02 3.16E+02 3.15E+02 3.15E+02 3.15E+02 3.15E+02 ))
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面板)的下拉列表中变为可见的和可 选的。
UDF源文件中包含udf.h文件
#include "udf.h"
通过在你的UDF源文件中包含udf.h,编译过程中所 有的 DEFINE 宏的定义与源代码一起被包含进来。 udf.h 文件也为所有的 C 库函数头文件包含 #include 指示,与大部分头文件是针对 Fluent 提供的宏和函 数是一样的(例如,mem.h)。除非有另外的指示, 没必要在你的UDF中个别地包含这些头文件。
侧面与地面两处UDF
定义一个以上UΒιβλιοθήκη BaiduF
上壁面温度 温 度 抛 物 线 分 布 300K 绝 热 壁 面 温度: 315K
温度分布
UDF编写
#include "udf.h"
DEFINE_PROFILE(bottom_temperature, thread, position)
{ 程序1
}
DEFINE_PROFILE(side_temperature, thread, position) { 程序2 } DEFINE_PROFILE(inlet_velocity,thread,position) { 程序3。。。。。。 }
边界条件 材料性质 表面与体积反应速率 输运方程源项 用户标量输运方程(UDS) 调节每次迭代值 初始化流场 异步执行 后处理改善 模型改进(离散项模型,多相混合物模型,辐 射模型等)
UDF举例
上壁面温度 绝 热 壁 面 温度: 315K 300K 绝 热 壁 面
使用DEFINE Macros定义UDF
DEFINE_MACRONAME(udf_name, variables)
passed-in
这里括号内第一个自变量是你的UDF的名称。名称 自变量是情形敏感的必须用小写字母指定。 一旦函数被编译(和连接),你为你的 UDF 选择的 名字在 FLUENT 下拉列表中将变成可见的和可选的。 第二套输入到 DEFINE 宏的自变量是从 FLUENT 求 解器传递到你的函数的变量。
边界温度分布
左侧温度分布
下面温度分布
场温度分布
UDF编写-用C语言
注释 /* 这是刘某人讲课示范用的程序 */ 数据类型 Int:整型 Long:长整型 Real:实数 Float:浮点型 Double:双精度 Char:字符型
UDF解释函数在单精度算法中定义real类型为float型,在双精度算法宏定义 real为double型。因为解释函数自动作如此分配,所以使用在UDF中声明所有 的float和double数据变量时使用real数据类型是很好的编程习惯。
Profile处理要点
(和一般计算一样设置求解器,模型等)
Define-Profile-Read
(数据) Define-BoundaryCondition-所需设置的面 -Thermal-Temperature-Temp t (和一般计算一样,设置其它边值条件、初 值条件及求解与结果检查等)
UDF任务
返回值 修改自变量
返回值和修改自变量
修改FLUENT变量(不能作为自变量传递) 写信息到(或读取信息从)case或data文
件
返回值
DEFINE_PROPERTY(cell_viscosity, 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; } cell,
Function that Modify an Argument #include "udf.h"
#define K1 2.0e-2 #define K2 5. DEFINE_VR_RATE(user_rate, c, t, r, mole_weight, species_mf, rr, rr_t) { real s1 = species_mf[0]; real mw1 = mole_weight[0]; if (FLUID_THREAD_P(t) && THREAD_VAR(t).fluid.porous) *rr = K1*s1/pow((1.+K2*s1),2.0)/mw1; else *rr = 0.; }
用户自定义函数UDF
中文讲解
用户自定义函数
用户自定义函数或UDF
是用户自编的程序它 可以被动态的连接到Fluent 求解器上来提高 求解器性能用户自定义函数用C 语言编写使 用DEFINE 宏来定义UDFs 中可使用标准C 语言的库函数也可使用预定义宏Fluent Inc.提 供通过这些预定义宏可以获得Fluent 求解器 得到的数据
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 的函数不返回值由于它被声明 为空的数据类型。
Define-User
defined-Functions- (Interpreted Or Compiled)-编译 Define-BoundaryCondition-所需设置的面 -Thermal-Temperature-Bottom Temperature (和一般计算一样,设置其它边值条件、初 值条件及求解与结果检查等)
DEFINE_PROPERTY 返 回一个 udf.h 中指定的 real 数据类型。两个 real 变量 传入函数:通过函数计算 层 流 粘 度 mu_lam 的 值 , 其是温度 C_T(cell,thread) 的函数。根据单元体温度, 计 算 出 mu_lam , 在 函 数 结 尾 , mu_lam 值 被 返 回 。
F_CENTROID(x,f,thread);
y = x[0]; F_PROFILE(f,thread,position) = 315. + (y-.044)*(y-.044)/.044/.044*35.; }
end_f_loop(f, thread)
}
UDF设置边界温度处理要点
(和一般计算一样设置求解器,模型等)
合
Fluent数据类型
cell_t
face_t Thread Node Domain cell_t是线索(thread)内单元标识符的数据 类型。它是一个识别给定线索内单元的整数索 引。face_t是线索内面标识符的数据类型。它 是一个识别给定线索内面的整数索引。 Thread数据类型是FLUENT中的数据结构。它 充当了一个与它描述的单元或面的组合相关的 数据容器。 Node数据类型也是FLUENT中的数据结构。 它充当了一个与单元或面的拐角相关的数据容 器。 Domain数据类型代表了FLUENT中最高水平 的数据结构。它充当了一个与网格中所有节点、 面和单元线索组合相关的数据容器。
UDF处理温度
#include "udf.h"
DEFINE_PROFILE(bottom_temperature, thread, position)
{ real x[ND_ND]; real y; face_t f; begin_f_loop(f, thread) { /* this will hold the position vector */
UDF分类与区别
UDFs 使用时可以被当作解释函数或编译函数 解释函数在运行时读入并解释 编译UDFs 则在编译时被嵌入共享库中并与Fluent 连接 解释UDFs 用起来简单但是有源代码和速度方面的 限制不足。编译型UDFs 执行起来较快也没有源代 码限制但设置和使用较为麻烦
UDF的用途-满足用户个性化需求