UDF实例

UDF实例
UDF实例

第10章应用举例

本章包含了FLUENT中UDFs的应用例子。

10.1 边界条件

10.2源项

10.3物理属性

10.4反应速率(Reacting Rates)

10.5 用户定义标量(User_Defined Scalars)

10.1边界条件

这部分包含了边界条件UDFs的两个应用。两个在FLUENT中都是作为解释式UDFs被执行的。

10.1.1涡轮叶片的抛物线速度入口分布

要考虑的涡轮叶片显示在Figure 10.1.1中。非结构化网格用于模拟叶片周围的流场。区域从底部周期

性边界延伸到顶部周期性边界,左边是速度入口,右边是压力出口。

Figure 10.1.1: The Grid for the Turbine Vane Example

常数x速度应用于入口的流场与抛物线x速度应用于入口的流场作了比较。当采用分段线性分布的型线的应用是有效的对边界型线选择,多项式的详细说明只能通过用户定义函数来完成。

常数速度应用于流场入口的结果显示在Figure 10.1.2和Figure 10.1.3中。当流动移动到涡轮叶片周围时初始常速度场被扭曲。

Figure 10.1.2: Velocity Magnitude Contours for a Constant Inlet x Velocity

Figure 10.1.3: Velocity Vectors for a Constant Inlet x Velocity 现在入口x速度将用以下型线描述:

这里变量y在人口中心是0.0,在顶部和底部其值分别延伸到0745

。这样x速度在入口中心为20m/sec,

.0

在边缘为0。

UDF用于传入入口上的这个抛物线分布。C源代码(vprofile.c)显示如下。函数使用了Section 5.3中描述

的Fluent提供的求解器函数。

/***********************************************************************/

/* vprofile.c */

/* UDF for specifying steady-state velocity profile boundary condition */

/***********************************************************************/

#include "udf.h"

DEFINE_PROFILE(inlet_x_velocity, thread, position)

{

real x[ND_ND]; /* this will hold the position vector */

real y;

face_t f;

begin_f_loop(f, thread)

{

F_CENTROID(x,f,thread);

y = x[1];

F_PROFILE(f, thread, position) = 20. - y*y/(.0745*.0745)*20.;

}

end_f_loop(f, thread)

}

函数被命名为inlet_x_velocity,使用了DEFINE_PROFILE定义并且有两个自变量:thread 和position。Thread 是一个指向面的thread的指针,position是一个整数,它是每个循环(loop)内为变量设置的数值标签。

函数通过声名变量f作为face_t的数据类型。一维数组x和变量y被定义为real数据类型。循环宏用于循环区域内每个面来创建型线,或数据数组。每个循环内,F_CENTROIDS为带指标f的面输出面质心(数组x)的值,指标f在被thread指向的线(thread)上。存储在x[1]中的y坐标用于为变量y赋值,然后用于计算x

速度。这个值接着被分配到F_PROFILE,使用整数position(在你从Velocity Inlet面板中选择的UDF作为x 速度的边界条件的基础上通过求解器传递给它)来设置内存中x速度面值。

为了在FLUENT中使用这个解释式UDF,你必须首先编译它。(翻译得看不懂)

Define User-Defined

Functions Interpreted...

在Interpreted UDFs面板中,在Source File Name区域命名你的函数。如果必要,在CPP Command Name 区域输入你的C预处理程序类型和在Stack Size下输入堆栈大小。打开Display Assembly Listing在你的控制台窗口中能看到汇编列表,当函数编译时。点击Compile然后Close面板。

为了选择这个用户定义函数作为所选区域的速度边界条件,打开Velocity Inlet面板。

在X-Velocity下拉列表下,选择udf inlet_x_velocity,这个名字在上面已经命名给函数。这个函数将被使用,而不是出现在X-Velocity区域的0值(在这个例子中)。点OK接受这个新边界条件并关闭面板。

在求解运行到收敛之后,获得了一个修正的速度场如Figure 10.1.4 and 10.1.5所示。速度场在入口中心显示了最大值,到边缘上降为0。

Figure 10.1.4: Velocity Magnitude Contours for a Parabolic Inlet x Velocity

Figure 10.1.5: Velocity Vectors for a Parabolic Inlet x Velocity

10.1.2管内流动的瞬态速度入口分布

这个例子中,瞬时的周期性的速度边界条件使用UDF应用于管子的入口。速度形式为:

(10.1.1)管子长1m,半径为0.2m。假设充满密度为1kg/m3和粘度为5

?kg/m-s的空气。空气速度关于平衡值

2-

10

=的波动振幅为5m/s,频率为10rad/s。速度分布UDF(unsteady.c)的源代码显示如下。

20

m

v/

s

/**********************************************************************/

/* unsteady.c */

/* UDF for specifying a transient velocity profile boundary condition */

/**********************************************************************/

#include "udf.h"

DEFINE_PROFILE(unsteady_velocity, thread, position)

{

face_t f;

begin_f_loop(f, thread)

{

real t = RP_Get_Real("flow-time");

F_PROFILE(f, thread, position) = 20. + 5.0*sin(10.*t);

}

end_f_loop(f, thread)

}

函数被命名为unsteady_velocity,使用DEFINE_PROFILE macro定义。The utility

RP_Get_Real("flow-time")用于访问real流动时间,它被分配给变量t。(RP_Get_Real的详细内容见Section 6.9)。

在你编译这个UDF之前,你必须在Solver面板中指定为非稳态流动计算。

Define Models

Solver...

接下来你将打开Interpreted UDFs面板。在Source File Name下面的文本框内输入函数的名字,如果必要,还有你的C预处理程序的名字。打开Display Assembly Listing。点击Compile然后关闭面板。

Define User-Defined

Functions

Interpreted...

由UDF定义的正弦速度边界条件现在可选为入口区域的X-Velocity。在X-Velocity面板中,在X-Velocity区域右边的下拉列表中选择udf unsteady_velocity,并点击OK。

时间步参数在Iterate面板中设置。

Solve Iterate...

在这个例子中,使用了0.0314的Time Step Size,因此在入口速度一个完整的震荡周期内(2π)将完成20个时间步。在每个时间步内执行的迭代次数被限制为20。在求解的早期阶段这个迭代次数不足以获得收敛的流场,但是在通过几个时间步之后,很可能导致收敛的时间步。UDF Profile Update Interval被设置为1因此每次迭代速度都被更新。在完成了60个时间步之后(或3个周期),你可以检查跨越压力出口由振荡入口条件引起速度数量级。

为了在计算阶段收集这个信息,在开始迭代之前打开Surface Monitors面板。

Solve Monitors

Surface...

增加Surface Monitors的指标到1。这将使你定义monitor-1(如果需要,你可重命名,在Name下的文本输入框内)的参数。选择Plot,所以所选的数量将作为计算的收益被画出来。选择Print在控制台窗口来看所选数的变化值。选择Write,因而信息将被写入文件,它将被给一个名字为monitor-1.out。(如果你改变了monitor的名字,这个名字将用作输出文件的前缀)。

在Every下面,你可选择Iteration, Time Step, or Flow Time。为了监视每个时间步的结果,你应选择Time Step选项。通过点击Define...你可在Define Surface Monitor面板中指定被监视的数量。

在这个例子中,在Report Of下的下拉列表中选择Velocity... and Velocity Magnitude。报告的区域是pressure-outlet-5,,在Surfaces列表中选择它。Area-Weighted Average在Report Type的下拉列表中选择,Flow Time在X Axis的下拉列表中选择。

一旦完成了你要求的迭代次数,监视器应出现在所选绘图窗口中。作为选择,你可通过打开File XY Plot面板读入文件。

Plot File...

你可通过在Files下面的文本框中输入它的名字来读取输出文件和选择这个文件并点击Add....,然后点击Plot,你可获得Figure10.1.6的图形显示。

Figure 10.1.6: Average Velocity Magnitude at the Pressure Outlet

这个图精细地显示了速度以期望的振幅值5m/s围绕平衡值20m/s上下振荡。

10.2 源项

这部分包含了源项UDF的应用。在FLUENT中它是作为解释式UDF被执行的。

10.2.1给管道流动添加动量源项(Adding a Momentum Source to a Duct Flow)

当使用UDF模拟源项时,理解函数调用的内容是很重要的。当你增加了一个源项,它在单元上执行全局的循环时,FLUENT将调用你的函数。你的函数应只计算源项并返回它到求解器。

在这个例子中,动量源项将被添加到2D笛卡儿管道流动中。管道长4m, 宽2m,使用通过中心线的对称边界条件来模拟。液体金属(其属性列举在表10.2.1中)在290K温度下从左边以1mm/s的速度进入管道。在金属沿着管道前进了0.5m之后,它受到了冷壁面的冷却,壁面温度保持在280K。为了模拟金属的凝固,只要它的温度一降到288K以下,动量源项就应用于金属。动量源项是与速度的x分

v成比例的,并有相反的符号:

x

S x = - C v x(10.2.1)

这里C 是常数。当液体凝固时,它的运动将减小到0,模拟的是固体的形成。(在这个例子中,能量方程不能用来解决凝固潜热。速度场只能作为凝固区域指示来使用)。为了提高求解的稳定性和收敛性,求解器应线性化源项。为了能使求解器做到这点,你必须在你的UDF 中以导数的形式指定源项和求解变量之间的依赖关系。源项x S 只依赖于求解变量x v 。它关于x v 的导数为:

(10.2.2)

下面的UDF

/* UDF that adds momentum source term and derivative to duct flow */

/******************************************************************/

#include "udf.h"

#define CON 20.0

DEFINE_SOURCE(cell_x_source, cell, thread, dS, eqn)

{

real source;

if (C_T(cell,thread) <= 288.)

{

/* source term */

source = -CON*C_U(cell,thread);

/* derivative of source term w.r.t. x-velocity. */

dS[eqn] = -CON;

}

else

source = dS[eqn] = 0.;

return source;

}

这个函数,被命名为cell_x_source,使用了DEFINE_SOURCE被定义在单元上。方程10.2.1中常数C就是函数中的CON,它被赋值为20kg/m3-s,它导致了需要的源项的单位N/m3。单元的温度由C_T(cell, thread)返回。这个函数检测温度是否小于(或等于)288K。如果是,源项根据方程10.2.1计算(C_U返回单元的x速度值)。如果不是,源项设置为0.0。在函数的结尾,适当的源项值返回到FLUENT求解器。UDF以解释(见Section 7.2)的方式执行。

为了在计算中包含源项,你首先得激活Fluid面板中的Source Terms。

然后你可以为Mass, Momentum, and Energy(可通过移动滑动条看到)添加源项。(注,在其它应用中,其它问题变量的源项这时也变的有效)。为了给X Momentum选择用户定义源项,在下拉列表中选择udf cell_x_source并点OK。

一旦求解收敛,你可观察静态温度等值线来看当液态金属沿着管道运动时,壁面对它的冷却效应

(Figure 10.2.1)。

Figure 10.2.1: Temperature Contours Illustrating Liquid Metal Cooling

速度数量级等值线(Figure 10.2.2)显示了壁面附近冷却区域的液体逐渐静止到模拟凝固的发生。

Figure 10.2.2: Velocity Magnitude Contours Suggesting Solidification

通过流函数的线型等值线(Figure 102.3)凝固得到更进一步的显示。

Figure 10.2.3: Stream Function Contours Suggesting Solidification

在这种方式下为了更精确地预测液体的凝固,则需要能量源项,给出现在方程10.2.1中的常数 C 赋以更精确的值。

10.3 物理属性(Physical Properties )

这部分包含了物理属性UDF 的应用。它在FLUENT 中以解释的UDF 方式被执行。

10.3.1通过温度依赖粘度的凝固(Solidification via a Temperature-Dependent Viscosity )

属性(和源项一样)的UDF 是从单元的内部循环中调用的。由于这个原因,指定属性的函数只需要计算单个单元的属性,然后返回值给FLUENT 求解器。

这个例子中的UDF 产生变粘度型线来模拟凝固,它应用于Section 10.2.1中给出的同样的问题。温暖(T>288K )流体的的粘度对液体有一个分子值(s m kg -?-/105.53),而更冷区域(K T 286<)的粘度有更大的值(1.0kg/m-s )。在中等温度范围内(K T K 288286≤≤),粘度在上面给出的两个值之间按线性分布:

(10.3.1)

这个模型的基础是假设液体冷却时很快地变为高粘性,它的速度降低,所以模拟的是凝固。这里,没有为能量场做修正以包含凝结潜热。UDF 的C 源代码显示如下。

/*********************************************************************/

/* UDF for specifying a temperature-dependent viscosity property */

/*********************************************************************/

#include "udf.h"

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;

}

函数被命名为cell_viscosity,使用了DEFINE_PROPERT定义在单元上。引入了两个real变量:temp,C_T(cell,thread)的值,和mu_lam, 由函数计算的层流粘度。温度值被检测了,在它的下降范围的基础上计算了适当的mu_lam值。在函数的结尾,mu_lam的计算值返回到求解器。

为了使用用户定义的属性,你将使用Materials面板。在Viscosity的下拉列表下,选择user-defined 选项。

一旦你选了这个选项,User-Defined Functions面板将打开,在其中你可选择合适的函数名字。这个例子中,只有一个是有效的,但在别的例子中,你可从中选择几个函数。(如果你需要编译多于一个的解释式UDF,这些函数应在编译前连接。详细内容见Section 7.2.1)。

这个模拟的结果相似于Section 10.2.1中得到的。Figure 10.3.1显示由于应用用户定义函数而导致的粘度场。粘度在很窄的范围内很快地从常数值0.0055变化到1.0kg/m-s。

速度场(Figure 10.3.2)证明响应于粘度的增加,液体流动减慢,这在预料之中。在这个模拟中,有一个大的“mushy”区域,在其中液体的运动逐渐减小。这是与第一个模拟的对比,在第一个模拟中应用了动量源项,在流体运动中观察到一个急剧的变化。

Figure 10.3.1: Laminar Viscosity Generated by a User-Defined Function

Figure 10.3.2: Contours of Velocity Magnitude Resulting from a User-Defined Viscosity

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

对一个简单解释型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)。其他都是变量。

Fluent UDF 中文教程UDF第7章 编译与链接

第七章UDF的编译与链接 编写好UDF件(详见第三章)后,接下来则准备编译(或链接)它。在7.2或7.3节中指导将用户编写好的UDF如何解释、编译成为共享目标库的UDF。 _ 第 7.1 节: 介绍 _ 第 7.2 节: 解释 UDF _ 第 7.3 节: 编译 UDF 7.1 介绍 解释的UDF和编译的UDF其源码产生途径及编译过程产生的结果代码是不同的。编译后的UDF由C语言系统的编译器编译成本地目标码。这一过程须在FLUENT运行前完成。在FLUENT运行时会执行存放于共享库里的目标码,这一过程称为“动态装载”。 另一方面,解释的UDF被编译成与体系结构无关的中间代码或伪码。这一代码调用时是在内部模拟器或解释器上运行。与体系结构无关的代码牺牲了程序性能,但其UDF可易于共享在不同的结构体系之间,即操作系统和FLUENT版本中。如果执行速度是所关心的,UDF文件可以不用修改直接在编译模式里运行。 为了区别这种不同,在FLUENT中解释UDF和编译UDF的控制面板其形式是不同的。解释UDF的控制面板里有个“Compile按钮”,当点击“Compile按钮”时会实时编译源码。编译UDF的控制面板里有个“Open 按钮”,当点击“Open按钮”时会“打开”或连接目标代码库运行

FLUENT(此时在运行FLUENT之前需要编译好目标码)。 当FLUENT程序运行中链接一个已编译好的UDF库时,和该共享库相关的东西都被存放到case文件中。因此,只要读取case文件,这个库会自动地链接到FLUENT处理过程。同样地,一个已经经过解释的UDF文件在运行时刻被编译,用户自定义的C函数的名称与内容将会被存放到用户的case文件中。只要读取这个case文件,这些函数会被自动编译。 注:已编译的UDF所用到的目标代码库必须适用于当前所使用的计算机体系结构、操作系统以及FLUENT软件的可执行版本。一旦用户的FLUENT升级、操作系统改变了或者运行在不同的类型的计算机,必须重新编译这些库。 UDF必须用DEFINE宏进行定义,DEFINE宏的定义是在udf.h文件中。因此,在用户编译UDF之前,udf.h文件必须被放到一个可被找到的路径,或者放到当前的工作目录中。 udf.h文件放置在: path/Fluent.Inc/fluent6.+x/src/udf.h 其中path是Fluent软件的安装目录,即Fluent.Inc目录。X代表了你所安装的版本号。 通常情况下,用户不应该从安装默认目录中复制udf.h文件。编译器先在当前目录中寻找该文件,如果没找到,编译器会自动到/src目录下寻找。如果你升级了软件的版本,但是没有从你的工作目录中删除旧版本的udf.h文件,你则不能访问到该文件的最新版本。在任何情

udf宏的功能

2.3. Model-Specific DEFINE Macros The DEFINE macros presented in this section are used to set parameters for a particular model in ANSYS Fluent. Table 2.2: Quick Reference Guide for Model-Specific DEFINE Functions – Table 2.6: Quick Reference Guide for Model-Specific DEFINE Functions MULTIPHASE ONLY provides a quick reference guide to the DEFINE macros, the functions they are used to define, and the dialog boxes where they are activated in ANSYS Fluent. Definitions of each DEFINE macro are listed in udf.h. For your convenience, they are listed in Appendix B. DEFINE_ANISOTROPIC_CONDUCTIVITY DEFINE_CHEM_STEP DEFINE_CPHI DEFINE_DIFFUSIVITY DEFINE_DOM_DIFFUSE_REFLECTIVITY DEFINE_DOM_SOURCE DEFINE_DOM_SPECULAR_REFLECTIVITY DEFINE_ECFM_SOURCE DEFINE_ECFM_SPARK_SOURCE DEFINE_EC_RATE DEFINE_EMISSIVITY_WEIGHTING_FACTOR DEFINE_FLAMELET_PARAMETERS DEFINE_ZONE_MOTION DEFINE_GRAY_BAND_ABS_COEFF DEFINE_HEAT_FLUX DEFINE_IGNITE_SOURCE DEFINE_NET_REACTION_RATE DEFINE_NOX_RATE DEFINE_PDF_TABLE DEFINE_PR_RATE DEFINE_PRANDTL UDFs DEFINE_PROFILE DEFINE_PROPERTY UDFs DEFINE_REACTING_CHANNEL_BC DEFINE_REACTING_CHANNEL_SOLVER DEFINE_SBES_BF DEFINE_SCAT_PHASE_FUNC DEFINE_SOLAR_INTENSITY DEFINE_SOLIDIFICATION_PARAMS DEFINE_SOOT_MASS_RATES DEFINE_SOOT_NUCLEATION_RATES DEFINE_SOOT_OXIDATION_RATE DEFINE_SOOT_PRECURSOR DEFINE_SOURCE DEFINE_SOX_RATE DEFINE_SPARK_GEOM (R14.5 spark model) DEFINE_SPECIFIC_HEAT DEFINE_SR_RATE DEFINE_THICKENED_FLAME_MODEL DEFINE_TRANS UDFs DEFINE_TRANSIENT_PROFILE DEFINE_TURB_PREMIX_SOURCE DEFINE_TURB_SCHMIDT UDF DEFINE_TURBULENT_VISCOSITY DEFINE_VR_RATE DEFINE_WALL_FUNCTIONS DEFINE_WSGGM_ABS_COEFF Table 2.2: Quick Reference Guide for Model-Specific DEFINE Functions Function DEFINE Macro Dialog Box Activated In anisotropic thermal conductivity DEFINE_ANISOTROPIC_CONDUCTIVITY Create/Edit Materials mixing constant DEFINE_CPHI User-Defined Function Hooks homogeneous net mass reaction rate for DEFINE_CHEM_STEP User-Defined Function Hooks all species, integrated over a time step

UDF(用户自定义特征)的创建和使用

UDF(用户自定义特征)的创建和使用 bysgjunfeng 1、什么是UDF? 2、UDF使用过程 2.1创建参照模型 2.2创建UDF 2.3放置UDF 3、替换UDF 4、UDF搭配族表的使用 1、什么是UDF? UDF即用户自定义特征。也就是说可以将数个特征组合起来形成一个新的自己定义的特征,并且会保存在UDF数据库中,随时调入。(类似于AutoCAD中的动态 块) 用户自定义特征用来复制相同或相近外形的特征组,此功能类似于“特征复制”,但又有所不同,功能上比较全面、灵活,但相应的步骤比较繁琐。因此,如果会用特征复制,特别是特征复制里的新参考,将会对此命令有所帮助。 UDF和特征复制的最大区别有以下两点: ●特征复制仅适用于当前的模型,而UDF可以适用与不同的模型。 ●特征复制的局部组无法用另一个局部组替换,而UDF可被另一个UDF替换 UDF的使用流程大体可分为三步:规划并创建参照模型——建立UDF——放置UDF,下面我们用一个简单的例子来说明如何使用UDF。 2、UDF使用过程 在使用UDF之前,首先要创建UDF,缺省时,Pro/ENGINEER将创建的UDF保存在当前工作目录中。为此,可创建UDF库目录,要访问Pro/ENGINEER 的UDF库目

录,可指定带置文件选项"pro_group_dir"的目录名。这样,每次插入UDF时将 自动打开该目录。 建立好参照模型后,单击单击"工具"(Tools)>"UDF 库"(UDF Library)。出现下 图所示UDF菜单 该对话框各选项含义如下: 创建 (Create):建立新的UDF并将其添加到UDF库。 修改 (Modify):修改现有的 UDF。如果有参照零件,系统将在单独的零件窗口 显示 UDF。 列表 (List):列出当前目录中的所有UDF文件,用于查看UDF信息。 数据库管理 (Dbms):管理当前UDF数据库。即对当前UDF数据库中的UDF进行保存、另存为、备份、重命名、拭除、清除、删除等操作。 集成 (Integrate):解决源 UDF 和目标 UDF 之间的差异。 以下以实例说明如何创建及使用UDF。 假定背景:在很多时候建立零件模型时,零件的粗坯都是一个长方体,并且要求该长方体关于基准平面左右前后对称(如下图所示),这就要求在草绘里绘制矩形时要多绘制两条中心线或多标两个尺寸。下面我们将演示如何将这样的长方体 作为UDF来使用。 本实例重在介绍UDF的使用过程,希望能起到抛砖引玉的作用,使大家在实际应

Fluent中的UDF详细中文教程(7)

第七章 UDF的编译与链接 编写好UDF件(详见第三章)后,接下来则准备编译(或链接)它。在7.2或7.3节中指导将用户编写好的UDF如何解释、编译成为共享目标库的UDF。 _ 第 7.1 节: 介绍 _ 第 7.2 节: 解释 UDF _ 第 7.3 节: 编译 UDF 7.1 介绍 解释的UDF和编译的UDF其源码产生途径及编译过程产生的结果代码是不同的。编译后的UDF由C语言系统的编译器编译成本地目标码。这一过程须在FLUENT运行前完成。在FLUENT运行时会执行存放于共享库里的目标码,这一过程称为“动态装载”。 另一方面,解释的UDF被编译成与体系结构无关的中间代码或伪码。这一代码调用时是在内部模拟器或解释器上运行。与体系结构无关的代码牺牲了程序性能,但其UDF可易于共享在不同的结构体系之间,即操作系统和FLUENT版本中。如果执行速度是所关心的,UDF文件可以不用修改直接在编译模式里运行。 为了区别这种不同,在FLUENT中解释UDF和编译UDF的控制面板其形式是不同的。解释UDF的控制面板里有个“Compile按钮”,当点击“Compile按钮”时会实时编译源码。编译UDF的控制面板里有个“Open 按钮”,当点击“Open按钮” 时会“打开”或连接目标代码库运行

FLUENT(此时在运行FLUENT之前需要编译好目标码)。 当FLUENT程序运行中链接一个已编译好的UDF库时,和该共享库相关的东西都被存放到case文件中。因此,只要读取case文件,这个库会自动地链接到FLUENT处理过程。同样地,一个已经经过解释的UDF文件在运行时刻被编译,用户自定义的C函数的名称与内容将会被存放到用户的case文件中。只要读取这个case文件,这些函数会被自动编译。 注:已编译的UDF所用到的目标代码库必须适用于当前所使用的计算机体系结构、操作系统以及FLUENT软件的可执行版本。一旦用户的FLUENT升级、操作系统改变了或者运行在不同的类型的计算机,必须重新编译这些库。 UDF必须用DEFINE宏进行定义,DEFINE宏的定义是在udf.h文件中。因此,在用户编译UDF之前,udf.h文件必须被放到一个可被找到的路径,或者放到当前的工作目录中。 udf.h文件放置在: path/Fluent.Inc/fluent6.+x/src/udf.h 其中path是Fluent软件的安装目录,即Fluent.Inc目录。X代表了你所安装的版本号。 通常情况下,用户不应该从安装默认目录中复制udf.h文件。编译器先在当前目录中寻找该文件,如果没找到,编译器会自动到/src目录下寻找。如果你升级了软件的版本,但是没有从你的工作目录中删除旧版本的udf.h文件,你则不能访问到该文件的最新版本。在任何情

udf使用心得

我接触UDF的时间不算长,2007年7月份开始看UDF的中文帮助,花了一周时间大体看完后,第一感觉:不难啊,至少不像以前别人给我讲的很高深的样子。然后就是UDF编程,直到10月底吧。然后用的时间就不多了。然后就是这两周,我马上就要研究生毕业了,可能这周结束后用UDF编程的可能性会很小了,所以想写点东西,给刚刚学UDF编程的人,希望对大家有用。对于UDF高手,估计是不用向下看了。 UDF框架 光看书,感觉UDF不难。看例子,有些看个四五遍之后才能差不多看懂。原来,得靠UDF帮助。我主要用的是fluent v6.3自带的html格式的帮助,里面东西很全,当然也包括UDF Manual。里面自带的search功能相当好,只是要注意用好+或-号(逻辑符号),另外,这个功能似乎有些浏览器支持不太好,不过基本上用IE不太容易出问题。 对于从零开始学习UDF,建议还是先看一下UDF中文帮助,我估计大家知道的都是马世虎翻译的那本吧,感觉挺好。(没想到马世虎跟我是校友,去年给安世亚太投过一份简历,他给我打过电话,当时一阵兴奋,呵呵。) 对于只涉及到边界条件或物性等的UDF,一般用interpret就可以的,这些我觉得只需要根据例子改一下就是了。 $$ 对于要添加UDS方程的,相对难一点。我编程用的是三到五个UDS,几十个UDM。一开始编程时,没有头绪,后来看别人编的,才慢慢发现了一些基本思路。比如,可以用枚举定义UDS 或UDM,这样用起来方便。 enum{ NP, RHOH2O_Y_UP_X, RHOH2O_Y_UP_Y, RHOH2O_Y_UP_Z, N_REQUIRED_UDS };//枚举UDS变量名 对于UDM,则用N_REQUIRED_UDM代表个数。 然后在INIT与ADJUST函数中,检查变量个数时则比较方便,如: DEFINE_INIT(init_parameter,domain) { if (n_uds < N_REQUIRED_UDS) Error(”Not enough user defined scalars!(init)\n”); if (n_udm

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_RA TE定义,例子见6.4。离散相模型用宏DEFINE_DPM定义相关参数,见5.4。UDFs还可以对任意用户自定义标量的输运方程进行初始化,定义壁面热流量,或计算存贮变量值(用用户自定义标量或用户自定义内存量)使之用于后处理。相关的应用见于5.3,5.5,5.6和5.7。 UDFs有着广泛的应用,本文并不能一一叙述。如果在使用中遇到问题,可以联系FLUENT技术支部门要求帮助。在此推荐一个网站https://www.360docs.net/doc/fb3844103.html,,上面有FLUENT论坛,可进行相关询问和讨论。 7.1.1 书写UDFs的基本步骤 在使用UDFs处理FLUENT模型的过程中,我们一般按照下面五步进行: 1.概念上函数设计 2.使用C语言书写 3.编译调试C程序 4.执行UDF 5.分析与比较结果 第一步分析我们所处理的模型,目的是得到我们要书写的UDF的数学表达式。第二步将数学表达式转化成C语言源代码。第三步编译调试C语言源代码。第四步在FLUENT中执行UDF。最后一步,将所得到的结果与我们要求的进行比较,如果不满足要求,则需要重复上面的步骤,直到与我们期望的吻合为止。 7.1.2 Interpreted型与Compiled型比较 Compiled UDFs执行的是机器语言,这和FLUENT本身运行的方式是一样 的。一个叫做Makefile的过程能够激活C编辑器,编译我们的C语言代码,从而建立一个目标代码库,目标代码库中包含有高级C语言的低级机器语言诠释。在运行的时候,一个叫做“dynamic loading”的过程将目标代码库与FLUENT 连接。一旦连接之后,连接关系就会在case文件中与目标代码库一起保存,所以读入case文件时,FLUENT就会自动加载与目标代码库的连接。这些库的建立是基于特定计算机和特定FLUENT版本的,所以升级FLUENT版本后,就必须重新建立相应的库。 相反,Interpreted UDFs是在运行的时候直接装载编译C语言代码的。在这种情况下,生成的机器代码不依赖于计算机和FLUENT版本。编译后,函数信息将会保存在case文件中,所以读入case文件时,FLUENT也会自动加载相应的函数。Interpreted UDFs具有较强的可移植性,而且编译比较简单。对于简单的UDFs,如果对运行速度要求不高,一般就采用Interpreted型的。 下面列出的是两种UDFs的一些特性:

Fluent UDF教程

UDF中文教程

目录 第一章. 介绍 (4) 1.1什么是UDF? (4) 1.2为什么要使用UDF? (4) 1.3 UDF的局限 (5) 1.4Fluent5到Fluent6UDF的变化 (5) 1.5 UDF基础 (6) 1.6 解释和编译UDF的比较 (8) 1.7一个step-by-stepUDF例子 (9) 第二章.UDF的C语言基础 (16) 2.1引言 (16) 2.2注释你的C代码 (17) 2.3FLUENT的C数据类型 (17) 2.4常数 (17) 2.5变量 (17) 2.6自定义数据类型 (20) 2.7强制转换 (20) 2.8函数 (20) 2.9 数组 (20) 2.10指针 (21) 2.11 控制语句 (22) 2.12常用的C运算符 (24) 2.13 C库函数 (24) 2.14 用#define实现宏置换 (26) 2.15 用#include实现文件包含 (27) 2.16 与FORTRAN 的比较 (27) UDF 第3章写UDF (27) 3.1概述(Introduction) (28) 3.2写解释式UDF的限制 (28) 3.3 FLUENT求解过程中UDF的先后顺序 (29) 3.4 FLUENT 网格拓扑 (31) 3.5 FLUENT数据类型 (32) 3.6 使用DEFINE Macros定义你的UDF (33) 3.7在你的UDF源文件中包含udf.h文件 (34) 3.8在你的函数中定义变量 (34) 3.9函数体(Functin Body) (35) 3.10 UDF任务(UDF Tasks) (35) 3.11为多相流应用写UDF (41) 3.12在并行下使用你的UDF (50) 第四章DEFINE宏 (51) 4.1 概述 (51) 4.2 通用解算器DEFINE宏 (52) 4.3 模型指定DEFINE宏 (61)

udf-使用心得

对于只涉及到边界条件或物性等的UDF,一般用interpret就可以的,这些我觉得只需要根据例子改一下就是了。 $$ 对于要添加UDS方程的,相对难一点。我编程用的是三到五个UDS,几十个UDM。一开始编程时,没有头绪,后来看别人编的,才慢慢发现了一些基本思路。比如,可以用枚举定义UDS或UDM,这样用起来方便。 enum{ NP, RHOH2O_Y_UP_X, RHOH2O_Y_UP_Y, RHOH2O_Y_UP_Z, N_REQUIRED_UDS };//枚举UDS变量名 对于UDM,则用N_REQUIRED_UDM代表个数。 1. 然后在INIT与ADJUST函数中,检查变量个数时则比较方便,如: DEFINE_INIT(init_parameter,domain) { if (n_uds < N_REQUIRED_UDS) Error("Not enough user defined scalars!(init)\n"); if (n_udm

Fluent中的UDF详细中文教程(8)

第八章 在FLUENT中激活你的UDF 一旦你已经编译(并连接)了你的UDF,如第7章所述,你已经为在你的FLUENT模型中使用它做好了准备。根据你所使用的UDF,遵照以下各节中的指导。 z8.1节激活通用求解器UDF z8.2节激活模型明确UDF z8.3节激活多相UDF z8.4节激活DPM UDF 8.1 激活通用求解器UDF 本节包括激活使用4.2节中宏的UDF的方法。 8.1.1 已计算值的调整 一旦你已经使用7.2节和7.3节中概括的方法之一编译(并连接)了调整已计算值UDF,这一UDF在FLUENT中将成为可见的和可选择的。你将需要在User-Defined Function Hooks面板的Adjust Function下拉菜单(图8.1.1)中选择它。 调整函数(以DEFINE_ADJUST宏定义)在速度、压力及其它数量求解开始之前的一次迭代开始的时候调用。例如,它可以用于在一个区域内积分一个标量值,并根据这一结果调整边界条件。有关DEFINE_ADJUST宏的更多内容将4.2.1节。调整函数在什么地方适合求解器求解过程方面的信息见3.3节。 8.1.2 求解初始化 一旦你已经使用7.2节和7.3节中概括的方法之一编译(并连接)了求解初始化UDF,这一UDF在FLUENT中将成为可见的和可选择的。你将需要在User-Defined Function Hooks面板的Initialization Function下拉菜单(图8.1.1)中选择它。

求解初始化UDF使用DEFINE_INIT宏定义。细节见4.2.2节。 8.1.3 用命令执行UDF 一旦你已经使用7.2节和7.3节中概括的方法之一编译(并连接)了你的UDF,你可以在Execute UDF On Demand面板中选择它(图8.1.2),以在某个特定的时间执行这个UDF,而不是让FLUENT在整个计算中执行它。 点击Execute按纽让FLUENT立即执行它。 以命令执行的UDF用DEFINE_ON_COMMAND宏定义,更多细节见4.2.3节 8.1.4 从case和data文件中读出及写入 一旦你已经使用7.2节和7.3节中概括的方法之一编译(并连接)了一个将定制片段从case 和data文件中读出或写入的UDF,这一UDF在FLUENT中将成为可见的和可选择的。你将需要在User-Defined Function Hooks面板(图8.1.1)中选择它。

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定义你的UDF 3.7在你的UDF源文件中包含udf.h文件 3.8 定义你的函数中的变量 3.9函数体 3.10 UDF 任务 3.11 为多相流应用写UDF 3.12在并行中使用你的UDF 3.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 语句。 2.非ANSI-C原型语法 3.直接的数据结构查询(direct data structure references) 4.局部结构的声明 5.联合(unions) 6.指向函数的指针(pointers to functions) 7.函数数组。 在访问FLUENT求解器数据的方式上解释式UDF也有限制。解释式UDF不能直接访问存储在FLUENT结构中的数据。它们只能通过使用Fluent提供的宏间接地访问这些数据。另一方面,编译式UDF没有任何C编程语言或其它注意的求解器数据结构的限制。 3.3 FLUENT求解过程中UDF的先后顺序(Sequencing of UDF in the FLUENT Solution Process) 当你开始写UDF代码的过程时(依赖于你写的UDF的类型),理解FLUENT求解过程中UDF调用的内容或许是重要的。求解器中包含连接你写的用户定义函数的call-outs。知道FLUENT求解过程中迭代之内函数调用的先后顺序能帮助你在给定的任意时间内确定那些数据是当前的和有效的。 分离式求解器 在分离式求解器求解过程中(Figure 3.3.1),用户定义的初始化函数(使用DEFINE_INIT 定义的)在迭代循环开始之前执行。然后迭代循环开始执行用户定义的调整函数(使用DEFINE_ADJUST定义的)。接着,求解守恒方程,顺序是从动量方程和后来的压力修正方

Fluent_UDF_第八章_在FLUENT中激活你的UDF

第八章 在 FLUENT 中激活你的 UDF 一旦你已经编译(并连接)了你的 UDF ,如第 7章所述,你已经为在你的 FLUENT 模型中使用它做好了准备。根据你所使用的 UDF ,遵照以下各节中的 指导。 8.1节 8.2节 8.3节 8.4节 激活通用求解器 UDF 激活模型明确 UDF 激活多相 UDF 激活 DPM UDF 8.1 激活通用求解器 UDF 本节包括激活使用 4.2节中宏的 UDF 的方法。 8.1.1 已计算值的调整 一旦你已经使用 7.2节和 7.3节中概括的方法之一编译(并连接)了调整已 计算值 UDF ,这一 UDF 在 FLUENT 中将成为可见的和可选择的。你将需要在 User-Defined Function Hooks 面板的 Adjust Function 下拉菜单(图 8.1.1)中选 择它。 调整函数(以 DEFINE_ADJUST 宏定义)在速度、压力及其它数量求解开 始之前的一次迭代开始的时候调用。例如,它可以用于在一个区域内积分一个标 量值,并根据这一结果调整边界条件。有关 DEFINE_ADJUST 宏的更多内容将 4.2.1节。调整函数在什么地方适合求解器求解过程方面的信息见 3.3节。 8.1.2求解初始化 一旦你已经使用 7.2节和 7.3节中概括的方法之一编译(并连接)了求解初 始化 UDF ,这一 UDF 在 FLUENT 中将成为可见的和可选择的。你将需要在 User-Defined Function Hooks 面板的 Initialization Function 下拉菜单(图 8.1.1) 中选择它。

proe UDF的创建与使用

1、什么是UDF? 2、UDF使用过程 2.1创建参照模型 2.2创建UDF 2.3放置UDF 3、替换UDF 4、UDF搭配族表的使用 1、什么是UDF? UDF即用户自定义特征。也就是说可以将数个特征组合起来形成一个新的自己定义的特征,并且会保存在UDF数据库中,随时调入。(类似于AutoCAD中的动态块) 用户自定义特征用来复制相同或相近外形的特征组,此功能类似于“特征复制”,但又有所不同,功能上比较全面、灵活,但相应的步骤比较繁琐。因此,如果会用特征复制,特别是特征复制里的新参考,将会对此命令有所帮助。UDF和特征复制的最大区别有以下两点: ●特征复制仅适用于当前的模型,而UDF可以适用与不同的模型。 ●特征复制的局部组无法用另一个局部组替换,而UDF可被另一个UDF替换 UDF的使用流程大体可分为三步:规划并创建参照模型——建立UDF——放置UDF,下面我们用一个简单的例子来说明如何使用UDF。 2、UDF使用过程 在使用UDF之前,首先要创建UDF,缺省时,Pro/ENGINEER将创建的UDF 保存在当前工作目录中。为此,可创建UDF库目录,要访问Pro/ENGINEER 的UDF 库目录,可指定带置文件选项"pro_group_dir"的目录名。这样,每次插入UDF 时将自动打开该目录。

建立好参照模型后,单击单击"工具"(Tools)>"UDF 库"(UDF Library)。出现下图所示UDF菜单 该对话框各选项含义如下: 创建 (Create):建立新的UDF并将其添加到UDF库。 修改 (Modify):修改现有的 UDF。如果有参照零件,系统将在单独的零件窗口显示 UDF。 列表 (List):列出当前目录中的所有UDF文件,用于查看UDF信息。 数据库管理 (Dbms):管理当前UDF数据库。即对当前UDF数据库中的UDF 进行保存、另存为、备份、重命名、拭除、清除、删除等操作。 集成 (Integrate):解决源 UDF 和目标 UDF 之间的差异。 以下以实例说明如何创建及使用UDF。 假定背景:建立一个圆柱特征,如下图: 圆柱定位及尺寸!

最新proe UDF的创建与使用

p r o e U D F的创建 与使用

1、什么是UDF? 2、UDF使用过程 2.1创建参照模型 2.2创建UDF 2.3放置UDF 3、替换UDF 4、UDF搭配族表的使用 1、什么是UDF? UDF即用户自定义特征。也就是说可以将数个特征组合起来形成一个新的自己定义的特征,并且会保存在UDF数据库中,随时调入。(类似于AutoCAD中的动态块) 用户自定义特征用来复制相同或相近外形的特征组,此功能类似于“特征复制”,但又有所不同,功能上比较全面、灵活,但相应的步骤比较繁琐。因此,如果会用特征复制,特别是特征复制里的新参考,将会对此命令有所帮助。 UDF和特征复制的最大区别有以下两点: 特征复制仅适用于当前的模型,而UDF可以适用与不同的模型。

特征复制的局部组无法用另一个局部组替换,而UDF可被另一个UDF替换UDF的使用流程大体可分为三步:规划并创建参照模型——建立UDF——放置UDF,下面我们用一个简单的例子来说明如何使用UDF。 2、UDF使用过程 在使用UDF之前,首先要创建UDF,缺省时,Pro/ENGINEER将创建的UDF保存在当前工作目录中。为此,可创建UDF库目录,要访问Pro/ENGINEER 的UDF库目录,可指定带置文件选项"pro_group_dir"的目录名。这样,每次插入UDF时将自动打开该目录。 建立好参照模型后,单击单击"工具"(Tools)>"UDF 库"(UDF Library)。出现下图所示UDF菜单 该对话框各选项含义如下: 创建 (Create):建立新的UDF并将其添加到UDF库。 修改 (Modify):修改现有的 UDF。如果有参照零件,系统将在单独的零件窗口显示 UDF。

UDF实例

第10章应用举例 本章包含了FLUENT中UDFs的应用例子。 10.1 边界条件 10.2源项 10.3物理属性 10.4反应速率(Reacting Rates) 10.5 用户定义标量(User_Defined Scalars) 10.1边界条件 这部分包含了边界条件UDFs的两个应用。两个在FLUENT中都是作为解释式UDFs被执行的。 10.1.1涡轮叶片的抛物线速度入口分布 要考虑的涡轮叶片显示在Figure 10.1.1中。非结构化网格用于模拟叶片周围的流场。区域从底部周期 性边界延伸到顶部周期性边界,左边是速度入口,右边是压力出口。 Figure 10.1.1: The Grid for the Turbine Vane Example 常数x速度应用于入口的流场与抛物线x速度应用于入口的流场作了比较。当采用分段线性分布的型线的应用是有效的对边界型线选择,多项式的详细说明只能通过用户定义函数来完成。 常数速度应用于流场入口的结果显示在Figure 10.1.2和Figure 10.1.3中。当流动移动到涡轮叶片周围时初始常速度场被扭曲。 Figure 10.1.2: Velocity Magnitude Contours for a Constant Inlet x Velocity

Figure 10.1.3: Velocity Vectors for a Constant Inlet x Velocity 现在入口x速度将用以下型线描述:

这里变量y在人口中心是0.0,在顶部和底部其值分别延伸到0745 。这样x速度在入口中心为20m/sec, .0 在边缘为0。 UDF用于传入入口上的这个抛物线分布。C源代码(vprofile.c)显示如下。函数使用了Section 5.3中描述 的Fluent提供的求解器函数。 /***********************************************************************/ /* vprofile.c */ /* UDF for specifying steady-state velocity profile boundary condition */ /***********************************************************************/ #include "udf.h" DEFINE_PROFILE(inlet_x_velocity, thread, position) { real x[ND_ND]; /* this will hold the position vector */ real y; face_t f; begin_f_loop(f, thread) { F_CENTROID(x,f,thread); y = x[1]; F_PROFILE(f, thread, position) = 20. - y*y/(.0745*.0745)*20.; } end_f_loop(f, thread) } 函数被命名为inlet_x_velocity,使用了DEFINE_PROFILE定义并且有两个自变量:thread 和position。Thread 是一个指向面的thread的指针,position是一个整数,它是每个循环(loop)内为变量设置的数值标签。 函数通过声名变量f作为face_t的数据类型。一维数组x和变量y被定义为real数据类型。循环宏用于循环区域内每个面来创建型线,或数据数组。每个循环内,F_CENTROIDS为带指标f的面输出面质心(数组x)的值,指标f在被thread指向的线(thread)上。存储在x[1]中的y坐标用于为变量y赋值,然后用于计算x

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指定的与求解器数据相关的数据类型。常用的Fluent数据类型如下。 cell_t是线索内单元标示符的数据类型,是一个识别给定线索内单元的整数索引。face_t是线索内面标示符的数据类型,是一个识别给定线索内面的整数索引。Thread是单元或面的组合相关的数据容器。Node是单元或面的拐角相关的数据容器。Domain是Fluent中最高水平的数据结构,是一个与网格中所有节点、面和单元线索组合相关的数据容器。 二、UDF中访问Fluent变量的宏 (一)访问单元的宏 1、访问单元流体变量的宏 在Fluent中可以用来访问单元上流体变量的宏在表1中列出,注意加了_G、_RG、_M1和_M2这些下标的单元格温度的宏,可以应用于表1中除单元格压力(C_P)的所有求解器的变量中。这些下标表示的是矢量梯度、改造的矢量梯度、前一次的步长和前两次的步长。而对于单元格压力,它的矢量梯度和相应的分量是使用C_DP得到的,而不是C_P_G。

相关主题
相关文档
最新文档