用户自定义函数
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Profile处理要点
• (和一般计算一样设置求解器,模型等) • Define-Profile-Read (数据) • Define-BoundaryCondition-所需设置的 面-Thermal-Temperature-Temp t • (和一般计算一样,设置其它边值条件、 初值条件及求解与结果检查等)
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.; }
• • • • • • • • • • 边界条件 材料性质 表面与体积反应速率 输运方程源项 用户标量输运方程(UDS) 调节每次迭代值 初始化流场 异步执行 后处理改善 模型改进(离散项模型,多相混合物模型,辐 射模型等)
UDF举例
上壁面温度 绝 热 壁 面 温度: 315K 300K
绝 热 壁 面
mu_lam = 143.2135 - 0.49725 * temp;
else mu_lam = 1.; return mu_lam; }
FLUENT求解过程中UDFs的先后顺序Biblioteka Baidu
非 耦 合 求 解 器
耦 合 求 解 器
FLUENT 网格拓扑
• • • • • • • 单元(cell) 区域被分割成的控制容积 单元中心(cell center) FLUENT中场数据存储的地方 面(face) 单元(2D or 3D)的边界 边(edge) 面(3D)的边界 节点(node) 网格点 单元线索(cell thread) 在其中分配了材料数据和源项的单元组 面线索(face thread) 在其中分配了边界数据的 面组 • 节点线索(node thread) 节点组 • 区域(domain) 由网格定义的所有节点、面和单元线索的组
UDF分类与区别
• UDFs 使用时可以被当作解释函数或编译函数 • 解释函数在运行时读入并解释 • 编译UDFs 则在编译时被嵌入共享库中并与 Fluent 连接 • 解释UDFs 用起来简单但是有源代码和速度方 面的限制不足。编译型UDFs 执行起来较快也 没有源代码限制但设置和使用较为麻烦
UDF的用途-满足用户个性化需求
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_PROPERTY 返 回一个 udf.h 中指定的 real 数据类型。两个 real 变量 传入函数:通过函数计算 层 流 粘 度 mu_lam 的 值 , 其是温度 C_T(cell,thread) 的函数。根据单元体温度, 计 算 出 mu_lam , 在 函 数 结 尾 , mu_lam 值 被 返 回 。
•
•
使用DEFINE Macros定义UDF
• DEFINE_MACRONAME(udf_name, passedin variables)
• 这里括号内第一个自变量是你的UDF的名称。 名称自变量是情形敏感的必须用小写字母指定。 • 一旦函数被编译(和连接),你为你的UDF选 择的名字在 FLUENT下拉列表中将变成可见的 和可选的。第二套输入到DEFINE 宏的自变量 是从FLUENT求解器传递到你的函数的变量。
UDF源文件中包含udf.h文件
• #include "udf.h" • 通过在你的UDF源文件中包含udf.h,编译过程 中所有的 DEFINE 宏的定义与源代码一起被包 含进来。udf.h文件也为所有的C库函数头文件 包 含 #include 指 示 , 与 大 部 分 头 文 件 是 针 对 Fluent 提 供 的 宏 和 函 数 是 一 样 的 ( 例 如 , mem.h)。除非有另外的指示,没必要在你的 UDF中个别地包含这些头文件。
用户自定义函数
UDF
用户自定义函数
• 用户自定义函数或UDF 是用户自编的程 序它可以被动态的连接到Fluent 求解器上 来提高求解器性能用户自定义函数用C 语言编写使用DEFINE 宏来定义UDFs 中 可使用标准C 语言的库函数也可使用预 定义宏Fluent Inc.提供通过这些预定义宏 可以获得Fluent 求解器得到的数据
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,
局部变量
• 局部变量只用于单一的函数中。当函数 调用时,就被创建了,函数返回之后, 这个变量就不存在了,局部变量在函数 内部(大括号内)声明。在下面的例子 中,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.)
合
Fluent数据类型
• cell_t • face_t •
cell_t是线索(thread)内单元标识符的数据 类型。它是一个识别给定线索内单元的整数索 引。face_t是线索内面标识符的数据类型。它 是一个识别给定线索内面的整数索引。 Thread Thread数据类型是FLUENT中的数据结构。它 充当了一个与它描述的单元或面的组合相关的 数据容器。 Node Node数据类型也是FLUENT中的数据结构。 它充当了一个与单元或面的拐角相关的数据容 Domain器。 Domain数据类型代表了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面板)的下拉列 表中变为可见的和可选的。
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 */
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设置边界温度处理要点
• (和一般计算一样设置求解器,模型等) • Define-User defined-Functions- (Interpreted Or Compiled)-编译 • Define-BoundaryCondition-所需设置的 面-Thermal-Temperature-Bottom Temperature • (和一般计算一样,设置其它边值条件、 初值条件及求解与结果检查等)
温度分布
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 ))
侧面与地面两处UDF
定义一个以上UDF
上壁面温度 温 度 抛 物 线 分 布 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。。。。。。 }
边界温度分布
左侧温度分布
下面温度分布
场温度分布
UDF编写-用C语言
• 注释 /* 这是刘某人讲课示范用的程序 */ • 数据类型 Int:整型 Long:长整型 Real:实数 Float:浮点型 Double:双精度 Char:字符型
UDF解释函数在单精度算法中定义real类型为float型,在双精度算法宏定义 real为double型。因为解释函数自动作如此分配,所以使用在UDF中声明所有的 float和double数据变量时使用real数据类型是很好的编程习惯。