对一个简单解释型udf程序的详细解释

合集下载

UDF的宏用法及相关算例

UDF的宏用法及相关算例

7 自定义函数(UDF)7.1,概述用户自定义函数(User-Defined Functions,即UDFs)可以提高FLUENT程序的标准计算功能。

它是用C语言书写的,有两种执行方式:interpreted型和compiled型。

Interpreted型比较容易使用,但是可使用代码(C语言的函数等)和运行速度有限制。

Compiled型运行速度快,而且也没有代码使用范围的限制,但使用略为繁琐。

我们可以用UDFs来定义:a)边界条件b)源项c)物性定义(除了比热外)d)表面和体积反应速率e)用户自定义标量输运方程f)离散相模型(例如体积力,拉力,源项等)g)代数滑流(algebraic slip)混合物模型(滑流速度和微粒尺寸)h)变量初始化i)壁面热流量j)使用用户自定义标量后处理边界条件UDFs能够产生依赖于时间,位移和流场变量相关的边界条件。

例如,我们可以定义依赖于流动时间的x方向的速度入口,或定义依赖于位置的温度边界。

边界条件剖面UDFs用宏DEFINE_PROFILE定义。

有关例子可以在5.1和6.1中找到。

源项UDFs可以定义除了DO辐射模型之外的任意输运方程的源项。

它用宏DEFINE_SOURCE 定义。

有关例子在5.2和6.2中可以找到。

物性UDFs可用来定义物质的物理性质,除了比热之外,其它物性参数都可以定义。

例如,我们可以定义依赖于温度的粘性系数。

它用宏DEFINE_PROPERTY定义,相关例子在6.3中。

反应速率UDFs用来定义表面或体积反应的反应速率,分别用宏DEFINE_SR_RA TE和DEFINE_VR_RATE定义,例子见6.4。

离散相模型用宏DEFINE_DPM定义相关参数,见5.4。

UDFs还可以对任意用户自定义标量的输运方程进行初始化,定义壁面热流量,或计算存贮变量值(用用户自定义标量或用户自定义内存量)使之用于后处理。

相关的应用见于5.3,5.5,5.6和5.7。

UDF

UDF

1.1什么是UDF?UDF是一种可以被加载到fluent求解器中的函数,以提高源代码的功能。

比如,你可以使用UDF定义你的边界条件,材料属性和流型源项,以及自定义模型参数,初始化一种算法或增强后处理进程。

UDF可以在任何文本里用C语言编写,然后源代码保存格式为“e.g., myudf.c”。

一个源文件可以包含一个或多个UDF,或者你可以定义多个源文件。

关于C语言编程的一些基本资料见附录A。

UDF是被fluent Inc提供的宏定义进行定义。

它们使用附加的宏代码,使fluent具有数据访问和执行其他任务的功能。

每一个UDF必须在源代码文件的开头包含“#include "udf.h"”,使得宏定义和fluent的其他宏及功能可以在运行的过程中被包含。

含有UDF的源文件可以在fluent里进行解释或编译。

对于解释型UDF,在一个单一的运算进程中,源文件被解释后在运行时直接加载。

而对于编译型UDF,这个过程包含2个步骤。

需要首先建立一个共享的对象代码库,然后将其加载到fluent中。

一旦被解释或编译,UDF将会在fluent界面中可见并可选择,然后通过在相应的控制面板中选择函数名称被连接到求解器中。

1.2为什么使用UDF?UDF可以让你自定义fluent来满足你的特殊模型需要。

UDF可以在多个应用中使用,下面列举的就是一些例子。

●定义边界条件,材料属性,表面和体积反应速率,fluent输运方程的源项,UDS输运方程的源项,扩散系数函数等。

●一次迭代的计算值的调整。

●初始化一种算法。

●UDF的异步执行。

●在迭代结束后执行,退出fluent或者加载编译UDF库。

●增强后处理。

●增强现有的fluent模型。

1.3局限性虽然在FLUENT的UDF功能可以解决广泛的应用,但是不可能解决所有的应用。

并不是所有的计算变量或fluent模型可以使用UDF。

比如比热值就不能被定义,这将需要额外的求解能力。

UDF第3章写UDF详解

UDF第3章写UDF详解

UDF 第3章写UDF本章主要概述了如何在FLUENT写UDF。

3.1 概述3.2写解释式UDF的限制3.3 FLUENT中UDF求解过程的顺序3.4 FLUENT网格拓扑3.5 FLUENT数据类型3.6 使用DEFINE Macros定义你的UDF3.7在你的UDF源文件中包含udf.h文件3.8 定义你的函数中的变量3.9函数体3.10 UDF 任务3.11 为多相流应用写UDF3.12在并行中使用你的UDF3.1概述(Introduction)UDF是用来增强FLUENT代码的标准功能的,在写UDF之前,我们要明确以下几个基本的要求。

首先,必须用C语言编写UDF。

必须使用FLUENT提供的DEFINE宏来定义UDF。

UDF必须含有包含于源代码开始指示的udf.h文件;它允许为DEFINE macros和包含在编译过程的其它FLUENT提供的函数定义。

UDF只使用预先确定的宏和函数从FLUENT 求解器访问数据。

通过UDF传递到求解器的任何值或从求解器返回到UDF的值,都指定为国际(SI)单位。

总之,当写UDF时,你必须记住下面的FLUENT要求。

UDF:1.采用C语言编写。

2.必须为udf.h文件有一个包含声明。

3.使用Fluent.Inc提供的DEFINE macros来定义。

4.使用Fluent.Inc提供的预定义宏和函数来访问FLUENT求解器数据。

5.必须使返回到FLUENT求解器的所有值指定为国际单位。

3.2写解释式UDF的限制(Restriction on Writing Interpreted UDF)无论UDF在FLUENT中以解释还是编译方式执行,用户定义C函数(说明在Section 3.1中)的基本要求是相同的,但还是有一些影响解释式UDF的重大编程限制。

FLUENT解释程序不支持所有的C语言编程原理。

解释式UDF不能包含以下C语言编程原理的任何一个:1.goto 语句。

dolphinscheduler使用udf函数-概述说明以及解释

dolphinscheduler使用udf函数-概述说明以及解释

dolphinscheduler使用udf函数-概述说明以及解释1.引言1.1 概述Dolphinscheduler是一款分布式的开源工作流引擎,致力于解决数据处理的自动化调度问题。

它提供了丰富的功能和易于使用的界面,帮助用户简化工作流的设计和管理。

UDF(User Defined Function)函数是一种用户自定义函数,可以在Dolphinscheduler中实现对数据的自定义处理和计算,为用户提供了更强大和灵活的功能。

本文将探讨UDF函数在Dolphinscheduler中的作用以及如何使用UDF函数来提升工作流的功能和效率。

1.2文章结构文章结构部分的内容如下:1.2 文章结构本文将分为三个主要部分:引言、正文和结论。

- 引言部分将概述本文的背景和目的,引入读者对本文内容的整体认识。

- 正文部分将详细介绍Dolphinscheduler的简介、UDF函数在Dolphinscheduler中的作用以及UDF函数的使用方法。

- 结论部分将总结UDF函数对Dolphinscheduler的优势,展望未来的发展,并对整篇文章做出总结。

通过以上结构,读者可以全面了解和深入理解Dolphinscheduler中UDF函数的应用和优势。

1.3 目的:本文旨在介绍在Dolphinscheduler中使用UDF函数的方法和作用。

通过了解UDF函数在Dolphinscheduler中的作用,可以更好地利用其提供的功能来完成复杂的数据处理和分析任务。

同时,通过学习UDF函数的使用方法,可以帮助读者更加灵活地应用Dolphinscheduler来满足各种数据处理需求。

通过对UDF函数的全面了解,可以为用户提供更好的使用体验,提高工作效率,实现数据处理的自动化和智能化。

2.正文2.1 Dolphinscheduler简介Dolphinscheduler是一款开源的分布式工作流调度系统,旨在解决大数据环境下复杂任务的调度问题。

Fluent中的UDF详细中文教程

Fluent中的UDF详细中文教程

第一章.介绍本章简要地介绍了用户自定义函数(UDF)及其在Fluent中的用法。

在1.1到1.6节中我们会介绍一下什么是UDF;如何使用UDF,以及为什么要使用UDF,在1.7中将一步步的演示一个UDF例子。

1.1 什么是UDF?1.2 为什么要使用UDF?1.3 UDF的局限1.4 Fluent5到Fluent6 UDF的变化1.5 UDF基础1.6 解释和编译UDF的比较1.7一个step-by-stepUDF例子1.1什么是UDF?用户自定义函数,或UDF,是用户自编的程序,它可以动态的连接到Fluent求解器上来提高求解器性能。

用户自定义函数用C语言编写。

使用DEFINE宏来定义。

UDF中可使用标准C语言的库函数,也可使用Fluent Inc.提供的预定义宏,通过这些预定义宏,可以获得Fluent求解器得到的数据。

UDF使用时可以被当作解释函数或编译函数。

解释函数在运行时读入并解释。

而编译UDF则在编译时被嵌入共享库中并与Fluent连接。

解释UDF用起来简单,但是有源代码和速度方面的限制不足。

编译UDF执行起来较快,也没有源代码限制,但设置和使用较为麻烦。

1.2为什么要使用UDF?一般说来,任何一种软件都不可能满足每一个人的要求,FLUENT也一样,其标准界面及功能并不能满足每个用户的需要。

UDF正是为解决这种问题而来,使用它我们可以编写FLUENT代码来满足不同用户的特殊需要。

当然,FLUENT的UDF并不是什么问题都可以解决的,在下面的章节中我们就会具体介绍一下FLUENT UDF的具体功能。

现在先简要介绍一下UDF的一些功能:z定制边界条件,定义材料属性,定义表面和体积反应率,定义FLUENT输运方程中的源项,用户自定义标量输运方程(UDS)中的源项扩散率函数等等。

z在每次迭代的基础上调节计算值z方案的初始化z(需要时)UDF的异步执行z后处理功能的改善z FLUENT模型的改进(例如离散项模型,多项混合物模型,离散发射辐射模型)由上可以看出FLUENT UDF并不涉及到各种算法的改善,这不能不说是一个遗憾。

UDF使用指南-1

UDF使用指南-1

UDF有多种功能,如:定制边界条件,定义材料属性,定义表面和体积反应率,定义Fluent 输运方程中的源项,用户自定义标量输运方程UDS中的源项扩散率函数等。

一、UDF基础1、Fluent的求解次序了解fluent的求解过程有助于理解UDF的调用过程,确定在给定的任意时间内哪些数据是当前的和有效的。

对于不同的求解器,其求解次序是不一样的。

在分离式求解器求解过程中,用户定义的初始化函数(使用DEFINE_INIT定义的)在迭代循环开始之前执行。

然后迭代循环开始执行用户定义的调整函数(使用DEFINE_ADJUST定义的)。

接着,求解守恒方程,顺序是从动量方程和后来的压力修正方程到与特定计算相关的附加标量方程。

守恒方程之后,属性被更新(包含用户定义属性)。

这样,如果模型涉及气体定律,这时,密度将随更新的温度(和压力、物质质量分数)而被更新,进行收敛或者附加要求的迭代的检查、循环或者继续或者停止。

在耦合求解器求解过程中,用户定义的初始化函数(使用DEFINE_INIT定义的)在迭代循环开始之前执行;然后迭代循环开始执行用户定义的调整函数(使用DEFINE_ADJUST定义的);接着,Fluent求解连续、动量和(适合的地方)能量的控制方程及相关的物质输运或矢量方程。

其余的求解步骤与分离式求解器相同。

2、Fluent网格拓扑①单元(cell):区域被分割成的控制体积②单元中心(cell center):Fluent中数据存储的地方③面(face):单元(二维或三维)的边界④边(edge):面(三维)的边界⑤节点(node):网格点⑥单元线索(cell thread):在其中分配了材料数据和源项的单元组⑦面线索(face thread):在其中分配了边界数据的面组⑧节点线索(node thread):节点组⑨区域(domain):由网格定义的所有节点、面和单元线索的组合3、Fluent的数据类型在编写UDF时,除了可以使用C语言数据类型外,还可以直接使用Fluent指定的与求解器数据相关的数据类型。

水沸腾算例UDF的详细解析

水沸腾算例UDF的详细解析

【强烈推荐】水沸腾算例UDF的详细解析【强烈推荐】水沸腾算例UDF的详细解析#include "udf.h" /*包括常规宏*/#include "sg_mphase.h" /*包括体积分数宏*/#define T_SAT 373 /*定义饱和温度*/#define LAT_HT 1.e3 /*定义水蒸汽潜热*/DEFINE_SOURCE(liq_src, cell, pri_th, dS, eqn) /*定义液相源项*/{Thread *mix_th, *sec_th; /*混合相、第二相定义计算区域指针*/real m_dot_l; /*蒸发冷凝速率定义液相质量转移*/mix_th = THREAD_SUPER_THREAD(pri_th); /*指向混合区的主相即液相的指针*/ sec_th = THREAD_SUB_THREAD(mix_th, 1); /* 指向单相控制区的气相的指针*/if(C_T(cell, mix_th)>=T_SAT){m_dot_l = -0.1*C_VOF(cell, pri_th)*C_R(cell, pri_th)*fabs(C_T(cell, pri_th) - T_SAT)/T_SAT; /*如果液相单元的温度高于蒸发温度,液相向气相的质量转移*/dS[eqn] = -0.1*C_R(cell, pri_th)*fabs(C_T(cell, pri_th) - T_SAT)/T_SAT; /*定义源项对质量转移偏导*/}else {m_dot_l = 0.1*C_VOF(cell, sec_th)*C_R(cell, sec_th)*fabs(T_SAT-C_T(cell,mix_th))/T_SAT;dS[eqn] = 0.; /*于是气相向液相转移,所以液相的质量源项对质量转移的偏导为零*/}return m_dot_l;}DEFINE_SOURCE(vap_src, cell, sec_th, dS, eqn) /*定义气相源项*/{Thread * mix_th, *pri_th; /*混合相、第一相*/real m_dot_v;mix_th = THREAD_SUPER_THREAD(sec_th); /*指向混合区的第二相即气相的指针*/ pri_th = THREAD_SUB_THREAD(mix_th, 0); /*指向单相控制区的液相的指针,液相为主相*/if(C_T(cell, mix_th)>=T_SAT){m_dot_v = 0.1*C_VOF(cell, pri_th)*C_R(cell, pri_th)*fabs(C_T(cell, mix_th) - T_SAT)/T_SAT; /*如果混合区单元的温度高于蒸发温度,液相向气相的质量质量转移*/dS[eqn] = 0.; /*由于是液相向气相转移,所以气相的质量源项对来自液相的质量转移的偏导为零*/}else {m_dot_v = -0.1*C_VOF(cell, sec_th)*C_R(cell, sec_th)*fabs(T_SAT-C_T(cell,mix_th))/T_SAT;dS[eqn] = -0.1*C_R(cell, sec_th)*fabs(C_T(cell, sec_th) - T_SAT)/T_SAT; /*由于是气相向液相转移,所以气相的质量源项对自身的质量转移的偏导不为零*/}return m_dot_v;}DEFINE_SOURCE(enrg_src, cell, mix_th, dS, eqn) /*混合模型能量源项*/{Thread *pri_th, *sec_th;real m_dot;pri_th = THREAD_SUB_THREAD(mix_th, 0); /*指向混合区的液相的指针*/sec_th = THREAD_SUB_THREAD(mix_th, 1); /*指向混合区的气相的指针*/if(C_T(cell, mix_th)>=T_SAT){m_dot = -0.1*C_VOF(cell, pri_th)*C_R(cell, pri_th)*fabs(C_T(cell, pri_th) - T_SAT)/T_SAT; /*如果混合区的单元温度高于蒸发温度。

用户自定义函数UDF中文详细讲解

用户自定义函数UDF中文详细讲解

局部变量
局部变量只用于单一的函数中。当函数调用
时,就被创建了,函数返回之后,这个变量 就不存在了,局部变量在函数内部(大括号 内 ) 声 明 。 在 下 面 的 例 子 中 , 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.)
DEFINE_PROPERTY 返 回一个 udf.h 中指定的 real 数据类型。两个 real 变量 传入函数:通过函数计算 层 流 粘 度 mu_lam 的 值 , 其是温度 C_T(cell,thread) 的函数。根据单元体温度, 计 算 出 mu_lam , 在 函 数 结 尾 , mu_lam 值 被 返 回 。
用户自定义函数UDF
中文讲解
用户自定义函数
用户自定义函数或UDF
是用户自编的程序它 可以被动态的连接到Fluent 求解器上来提高 求解器性能用户自定义函数用C 语言编写使 用DEFINE 宏来定义UDFs 中可使用标准C 语言的库函数也可使用预定义宏Fluent Inc.提 供通过这些预定义宏可以获得Fluent 求解器 得到的数据
边界条件 材料性质 表面与体积反应速率 输运方程源项 用户标量输运方程(UDS) 调节每次迭代值 初始化流场 异步执行 后处理改善 模型改进(离散项模型,多相混合物模型,辐 射模型等)

UDF举例
上壁面温度 绝 热 壁 面 温度: 315K 300K 绝 热 壁 面
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

对一个简单解释型udf程序的详细解释
#include "udf.h"
/*udf.h是一个头文件,如果不写的话就不能使用fluent udf中的宏,函数等*/
DEFINE_PROFILE(pressure_profile, t, i)
/*是一个宏,本例中用来说明进口压力与垂直坐标变量(还可以是其他的变量)的关系。

pressure_profile 是函数名,可随意指定。

t的数据类型是Thread *t ,t 表示指向结构体thread(这里的thread表示边界上所有的网格面的集合)的指针。

i的数据类型是Int,表示边界的位置?或者说是什么每个循环内对位置变量(这里应该是质心的纵坐标)设置的数值标签*/
{
real x[ND_ND];
/* 定义了质心的三维坐标,数据类型为real*/
real y;
/*定义了一个变量y, 数据类型为real */
face_t f;
/*定义了一个变量f, 数据类型为face_t,也就是网格面的意思,即f代表一个网格单元的网格面*/
begin_f_loop(f, t)
/*表示遍寻网格面,它的意思是说在计算的时候,要扫描所定义边界的所有网格面,对每个网格面都要赋值,值存储在F_PROFILE(f, t, i)中*/ {
F_CENTROID(x,f,t);
/*一个函数,它的意思是读取每个网格面质心的二维坐标,并赋值给x。

x 为名称,接收三维坐标值。

f为网格面(因为这里只是取的面的二维坐标,所以为f,如果是网格单元的话,这里就为c)。

t为指向结构体thread(这里的thread 表示边界上所有的网格面的集合)的指针*/
y = x[1];
/*把质心的三维坐标的纵坐标的数值赋给y*/
F_PROFILE(f, t, i) = 1.1e5 - y*y/(.0745*.0745)*0.1e5;
/*赋给每个网格面的数值与网格质心纵坐标的关系。

其实就是赋给质心的速度值(这里只有大小)与质心纵坐标的函数关系,因为fluent在计算的时候是把数据存储到网格质心上的,所以网格质心的速度值就代表网格的速度值。

这里有了网格的质心纵坐标,然后有了质心速度值与纵坐标的函数关系,那么每个进口网格面的速度值也就知道了。

f依然代表网格面。

t表示指向结构体thread(这里的thread表示边界上所有的网格面的集合)的指针。

i每个循环内对位置变量(这里应该是质心的纵坐标)设置的数值标签*/
}
end_f_loop(f, t)/*结束循环*/
}
整体来看:包括两个宏:DEFINE_PROFILE(pressure_profile, t, i)和beginend_f_loop(f, t)。

两个函数:F_CENTROID(x,f,t)和F_PROFILE(f, t, i)。

其他都是变量。

求解思路为,首先看用到的宏,本例中用到的是DEFINE_PROFILE(name,t,i),它可以给进口或者边壁加载速度,温度,压力等变量。

然后我们知道了进口速度和进口纵坐标的关系,其实也就是每个网格面质心的速度值与质心纵坐标的关系。

这样就好了,现在的关键是如何得到每个网格质心的纵坐标的数值。

程序里是这样做的:首先通过F_CENTROID(x,f,t)函数得到质心的二维坐标并赋给x[ND_ND],然后利用y = x[1]函数得到质心的纵坐标。

;
得到了质心纵坐标以后,知道质心速度值与质心纵坐标的关系,再通过F_PROFILE(f, t, i)函数,就可以把由函数关系式得到的速度值赋给每个网格面的质心了。

注:1.real类型,在fluent单精度里为float,双精度里为double float。

2.beginend_f_loop(f, t)循环宏,相当于c语言中的循环语句。

因为上述都是说的对每一个网格面的赋值,而进口有很多网格面,所以就需要利用这个宏扫描所有的网格面,然后给所有的网格质心赋值。

相关文档
最新文档