搜档网
当前位置:搜档网 › UDF的宏用法及相关算例

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_RA TE定义,例子见6.4。离散相模型用宏DEFINE_DPM定义相关参数,见5.4。UDFs还可以对任意用户自定义标量的输运方程进行初始化,定义壁面热流量,或计算存贮变量值(用用户自定义标量或用户自定义内存量)使之用于后处理。相关的应用见于5.3,5.5,5.6和5.7。

UDFs有着广泛的应用,本文并不能一一叙述。如果在使用中遇到问题,可以联系FLUENT技术支部门要求帮助。在此推荐一个网站https://www.sodocs.net/doc/6c14935456.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的一些特性:

——独立于计算机结构;

——能够完全当作Compiled UDFs使用;

——不能与其它编译系统或用户库连接;

——只支持部分C语言,不能包含:goto语句,非ANSI-C语法,结构,联合,函数指针,函数数组等。

!Interpreted UDFs能够使用FLUENT提供的宏,间接引用存贮于FLUENT的变量,详见2.10。

2.Compiled UDFs

——运行速度比Interpreted UDFs快;

——能够完全于C语言结合;

——能够用任何兼容ANSI-C的编辑器编译;

——对不同FLUENT版本(2D或3D)需要建立不同的共享库;

——不一定能够当作Interpreted UDFs使用。

我们在使用中首先要根据具体情况,明确使用哪种UDFs,然后才能进一步去实现,在使用中要注意上面叙述的事项。

第二节书写UDFs

7.2.1 概述

书写Interpreted型和Compiled型用户自定义函数的过程和书写格式是一样的。主要的区别在于与C语言的结合程度,Compiled型能够完全使用C语言的语法,而Interpreted型只能使用其中一小部分,这在前面有过论述。

7.2.2 UDF 格式

通用的UDF格式由三部分组成:

1.定义恒定常数和包含库文件,分别由#DEFINE和#INCLUDE陈述(见2.3);

2.宏DEFINE_* 定义UDF函数(见2.4);

3.函数体部分(见2.9)

包含库有udf.h,sg.h,mem.h,prop.h,dpm.h等,其中udf.h是必不可少的,书写格式为#include “udf.h”;所有数值都应采用SI单位制;函数体部分字母采用小写,Interpreted型只能够包含FLUENT支持的C语言语法和函数。

7.2.3 包含库udf.h

库文件udf.h必须C函数开头包含。

7.2.4 定义函数

7.2.4.1 简介

Fluent 公司提供了一套宏,来帮助我们定义函数。这些宏都以DEFINE_开始,对它们的解释包含在udf.h文件中,所以我们必需要包含库udf.h。为了方便使用,我们把对udf.h文件中解释宏列在附录A中。

UDF使用宏DEFINE_定义,括号列表中第一个参数代表函数名。例如

DEFINE_PROFILE(inlet_x_velocity,thread,position)

定义了一个名为inlet_x_velocity的函数。

! 所有函数名必须小写

紧接着函数名的是函数的输入参数,如上函数inlet_x_velocity有两个输入参数:thread和position,thread是一个指针,指向数据类型Thread,position是个整数(见2.4.3)。

UDF编译和连接之后,函数名就会出现在FLUENT相应的下拉列表内。如上述函数,编译连接之后,就能在相应的边界条件面板内找到一个名为inlet_x_velocity的函数,选定之后就可以使用。

7.2.4.2 udf.h文件中对宏DEFINE_的解释

在udf.h文件中,对附录A的宏作了解释,例如:

#define DEFINE_PROFILE(name,t,I) void name(Thread *t,int i)

通用的宏解释格式为

#define macro replacement-text

在编译前,C预处理器(即cpp)先进行宏替代。例如

DEFINE_PROFILE(inlet_x_velocity,thread,position)

替代为

void inlet_x_velocity(Thread *thread,int position)

替代后的函数返回实型值或不返回任何值。如上述函数由于是void型的,所以不返回任何值。

7.2.4.3 宏DEFINE

宏DEFINE是用来定义UDFs的,可以分为三类:通用的,离散相的和多相的。从宏DEFINE下划线的后缀,我

如DEFINE_SOURCE定义的函数用来修改输运方程源项,DEFINE_PROPERTY定义的函数用来定义物质的物理性质。通用的宏在2.5详述,离散相和多相的分别在2.6中详述。下面是附录A的简列。

通用类型:

1.DEFINE_ADJUST

2.DEFINE_DIFFUSIVITY

3.DEFINE_HEAT_FLUX

4.DEFINE_INIT

5.DEFINE_ON_DEMAND

6.DEFINE_PROFILE

7.DEFINE_PROPERTY

8.DEFINE_RW_FILE

9.DEFINE_SCAT_PHASE_FUNC

10.DEFINE_SOURCE

11.DEFINE_SR_RATE

12.DEFINE_UDS_FLUX

13.DEFINE_UDS_UNSTEADY

14.DEFINE_VR_RATE

离散相模型:

1.DEFINE_DPM_BODY_FORCE

2.DEFINE_DPM_DRAG

3.DEFINE_DPM_EROSION

4.DEFINE_DPM_INJECTION_INIT

5.DEFINE_DPM_LAW

6.DEFINE_DPM_OUTPUT

7.DEFINE_DPM_PROPERTY

8.DEFINE_DPM_SCALAR_UPDA TE

9.DEFINE_DPM_SOURCE

10.DEFINE_DPM_SWITCH

多相模型:

1.DEFINE_DRIFT_DIAMETER

2.DEFINE_SLIP_VELOCITY

7.2.4.2 数据类型的定义

作为对C语言数据类型的补充,FLUENT定义了几种特殊的数据类型,最常用的是:Thread,cell_t,face_t,Node 和Domain。

Thread是相应边界或网格区域的结构类型数据;cell_t表示单独一个控制体体积元,用来定义源项或物性;face_t 对应于网格面,用来定义入口边界条件等;Node表示相应的网格节点;Domain是一种结构,其中包含所有的threads,cells,faces和nodes。

! Thread,cell_t,face_t,Node和Domain要区分大小写。

7.2.5 通用宏及其定义的函数

宏DEFINE用来定义UDFs,下面是通用宏的具体解释。

该函数在每一步迭代开始前,即在求解输运方程前执行。可以用来修改调节流场变量,计算积分或微分等。参数domain在执行时,传递给处理器,通知处理器该函数作用于整个流场的网格区域。

如何激活该函数请参见4.6,具体求解例子见5.3,5.6和5.7 。

该函数定义的是组分扩散系数或者用户自定义标量输运方程的扩散系数,c 代表网格,t 是指向网格线的指针,i 表示第几种组分或第几个用户自定义标量(传递给处理器)。函数返回的是实型数据。例子见5.3。

该函数定义的是网格与邻近壁面之间扩散和辐射热流量。f 表示壁面,t 指向壁面线,c0表示邻近壁面的网格,t0指向网格线。函数中需要给出热扩散系数(cid )和辐射系数(cir ),才能求出扩散热流量(qid )和辐射热流量(qir )。在计算时,FLUENT 按照下面的公式求解:

qid =cid[0]+cid[1]×C_T(c0, t0)-cid[2]×

F_T(f, t)-cid[3]×pow(F_T(f,t), 4) qir =cir[0]+cir[1]×C_T(c0, t0)-cir[2]×F_T(f, t)-cir[3]×pow(F_T(f,t), 4) 该函数无返回值。如何激活函数见4.7,例子见5.6。

该函数用于初始化流场变量,它在FLUENT 默认的初始化之后执行。作用区域是全场,无返回值。函数的激活见4.5,例子见5.4.1和5.5。

,例子见5.8。 该函数定义边界条件。t 指向定义边界条件的网格线,i 用来表示边界的位置。函数在执行时,需要循环扫遍所有的边界网格线,值存贮在F_PROFILE(f ,

t ,i)中,无返回值。

选择使用本函数见4.1,例子见5.1.1,5.1.2,5.1.3,5.3,6.1.1和6.1.2。

该函数用来定义物质物性参数。c 表示网格,t 表示网格线,返回实型值。使用见4.3,例子见6.3.1。

该函数用于读写case 和data 文件。fp 是指向所读写文件的指针。使用见4.11,例子见2.9.8。 该函数定义DO (Discrete Ordinate )辐射模型中的散射相函数(radiation scattering phase function )。计算两个变量:从i 向到j 向 散射的辐射能量分数和前向散射因子(forward scattering factor

)。c 表示的是i 和j 向夹角的余弦值,散射的能量分数由函数返回,前向散射因子存贮在指针f 所指的变量中。处理器对每种物质,都会调用此函数,分别建立各物质的散射矩阵。

网格线,dS 表示源项对所求输运方程的标量的偏导数,用于对源项的线性化;i 标志所定义源项对应于哪个输运方程。使用见 4.2,例子见5.2.1,5.2.2,5.3,6.2.1。

该函数定义表面化学反应速率。f 表示面,t 表示面的线,r 是结构指针,表示化学反应;

mw 和yi 是个实型指针

数组,mw 存贮物质的分子量,yi 存贮物质的质量分数,rr 设置函数的一个相关参数。函数无返回值,使用见4.8。

该函数定义用户自定义标量输运方程(user-defined scalar transport equations )的对流通量。f ,t 分别表示所求通量的面和面的线,

i 表示第几个输运方程(有处理器传递给本函数)。

该函数定义用户自定义标量输运方程的非稳态项。c 表示网格,t 表示网格线,i 表示第几个输运方程。在FLUENT 中,非稳态项移到RHS 中,并以下面的方式离散:

方程右边第一项为apu ,第二项为su 。本函数无返回值。

该函数定义体积化学反应速率。c 表示网格,t 表示网格线,r 表示结构指针,表示化学反应过程,mw 指针数组

指向存贮物质分子量的变量,yi 指向物质的质量分数;rr 和rr_t 分别设置层流和湍流时函数相关参数。函数无返回值,使用见4.8,例子见6.4.1。

7.2.6 离散相模型宏及其定义的函数

离散模型(DPM )的宏定义的函数与通用宏所定义的函数书写格式是一样的。对于离散相需要强调结构指针p ,可以用它得到颗粒的性质和相关信息。下面是具体的宏定义。

该函数用于定义除了重力和拉力之外的所有体积力。p 为结构指针,i 可取0,1,3分别表示三个方向的体积力。函数返回的是加速度。使用见4.4,例子见5.4.2。

()()()11_--??+??-=????

?????--≈??-=?

n n n n t

V t V V t dV t term unsteady φρφρρφρφρφ

该函数定义拉力系数C D ,Re 为Reynolds 数,与颗粒直径和相对于液相速度有关。拉力定义为:

函数返回的值是18*C D *Re/24。使用见4.4,例子见5.4.3。

该函数定义颗粒撞击壁面湮灭或产生速率。t 为撞击面的线,

f 为撞击面;数组normal 存贮撞击面的单位法向量;alpha 中存贮颗粒轨道与撞击面的夹角;Vma

g 存贮颗粒速度大小,mdot 存贮颗粒与壁面撞击率。函数无返回值,颗粒湮灭或产生的计算结果存贮在面变量F_STORAGE_R(f ,t ,SV_DPMS_EROSION)和F_STORAGE_R(f ,t ,SV_DPMS_ACCRETION)中。使用见4.4。

该函数用于定义颗粒注入轨道时的物理性质。I 是指针,指向颗粒产生时的轨道。对每一次注入,该函数需要在第一步DPM 迭代前调用两次,在随后颗粒进入区域前每一次迭代中再调用一次。颗粒的初始化,诸如位置,直径和速度可以通过该函数设定。函数无返回值。

该函数定义液滴和燃烧颗粒的热和质量传输速率。p 的意义如前所述,ci

表示连续相和离散相是否耦合求解,取1时表示耦合,0时表示不耦合。颗粒的性质随着液滴和颗粒与其周围物质发生传热、传质而改变。函数无返回值。

该函数可以得到颗粒通过某一平面(见FLUENT 用户手册14.10.6)时的相关变量。header 在函数第一次调用时,设为1,以后都为0;fp 为文件指针,指向读写相关信息的文件;p 为结构指针,

t 指向颗粒所经过的网格线;plane 为 Plane 型结构指针(dpm.h ),如果颗粒不是穿过一个平面而是仅仅穿过网格表面,值取为NULL 。输出信息存贮于指针fp 所指向的文件,函数无返回值。

例子见5.4.1。

24Re

182

D

p

p D C D F ?=ρμ

该函数用于定义离散相物质的物理性质。p 为结构指针,c 表示网格,t 表示网格线。函数返回实型值。

该函数用于更新与颗粒相关的变量或求它们在整个颗粒寿命时间的积分。与颗粒相关的变量可用宏

P_USER_REAL(p ,i)取出。c 表示颗粒当前所处的网格,t 为该网格线。initialize 在初始调用本函数时,取为1,其后调用时,取为0。在计算变量对颗粒轨道的积分时,FLUENT 就调用本函数。存贮颗粒相关变量的数组大小需要在FLUENT 的DPM 面版上指定。函数无返回值。

函数的使用见4.4,例子见5.4.1。

该函数用于计算,给定网格中的颗粒在与质量、动量和能量交换项耦合DPM 求解前的源项。c 表示当前颗粒所在的网格,t 为网格线,S

为结构指针,指向源项结构dpms_t ,其中包含网格的源项。strength 表示单位时间内流过的颗粒数目。

p 为结构指针。函数求得的源项存贮于S 指定的变量中,无返回值。使用见4.4。

该函数是FLUENT 默认的颗粒定律与用户自定义的颗粒定律之间,或不同的默认定律和自定义定律之间的开关函数。p 为结构指针,ci 为1时,表示连续相与离散相耦合求解,0时表示不耦合求解。

!

参数类型中的Tracked_Particle ,dpms_t 等是FLUENT 为相关模型定义的数据类型。具体含义可以参见相应章节。 7.2.7 多相模型的宏及其定义的函数

t 为网格线。函数返回颗粒或液滴的直径。使用见4.10。 整个网格区域,无返回值。使用见4.9。 7.2.8 特定线的指针

在很多应用UDF 的场合,需要在一条特定的线上进行操作。为满足这种要求,首先,可以从Boundary Conditions 面板得到需要操作的线的ID ,然后就可用宏Lookup_Thread 将指针指向该条线。

在下面的例子中, C 语言函数Print_Thread_Face_Centroids 调用FLUENT 的宏Lookup_Thread 将指针指向特定的线,然后将线上所有面的质心坐标输入文件中。宏DEFINE_ON_DEMAND 定义的函数get_coords 取出其中的两条线,并打印线上所有面的质心坐标。

#include “udf.h ”

FILE *fout

static void

Print_Thread_Face_Centroids(Domain *domain,int id)

{

real FC[2];

face_t f;

Thread *t=Lookup_Thread(domain,id);

fprintf(fout, “thread id %d\n”,id);

begin_f_loop(f,,t)

{

F_CENTROID(FC,f,t);

fprintf(fout,“f%d %g %g %g\n”,f,FC[0],FC[1],FC[2]);

}

end_f_loop(f,t)

fprintf(fout,“\n”);

}

DEFINE_ON_DEMAND(get_coords)

{

fout = fopen(“faces.out”,“w”);

Printf_Thread_Face_Centroids(domain,2);

Printf_Thread_Face_Centroids(domain,4);

fclose(fout);

}

7.2.9 函数体

7.2.9.1 介绍

用户自定义函数体部分包含在紧跟着宏DEFINE_定义的大括弧内,如下例。这和标准C语言函数体的定义是相同的。

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;

}

7.2.9.2 Interpreted UDFs的限制性

Interpreted型书写函数体时并不能完全应用C语言函数,这在前面有过论述。此外,数量的单位制必须采用国际单位制。

7.2.9.3 函数的功能

UDFs执行五种功能:

1.返回变量值;

2.调节参数;

3.返回变量值并且调节参数;

4.调节FLUENT的变量(不以参数形式传递);

5.向case或data文件读写信息。

宏定义的函数返回类型如果不是void型,就返回实型值。下面的例子分别说明不同功能的函数。

下面的UDF计算与温度有关的粘性系数,并返回该值。

#include “udf.h”

DEFINE_PROPERTY(cell_viscosity,cell,thread)/*定义物性的宏*/

{

real mu_lam;

real temp = C_T(cell,thread);/*变量temp存放网格的温度*/

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;/*变量mu_lam存放粘性系数值,函数返回该值*/

}

7.2.9.5 调节参数

下面的UDF给出简单二元气相系统的体积反应速率。

#include “udf.h”

#define K1 2.0e-2

#define K2 5.

DEFINE_VR_RATE(user_rate,cell,thread,r,mole_weight,species_mf,rate,rr_t)

{

real s1 = species_mf[0];

real mw1 = mole_weight[0];

if (FLUID_THREAD_P(thread) && THREAD_V AR(thread) .fluid. porous)

*rate = K1*s1/pow((1.+K2*s1),2.)/mw1;

else

*rate = 0.;

}

函数名为user_rate,函数体中用if语句判断是否处于多孔介质区,仅在多孔介质区有化学反应。

7.2.9.6 返回变量值并调节参数

下面的UDF定义的是swirl-velocity的源项。

#include “udf.h”

#define OMEGA 50 /* rotational speed of swirler */

#define WEIGHT 1.e20 /* weighting coefficients in linearized equation */

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

{

real w_vel,x[ND_ND],y,source;

CENTROID(x,cell,thread);

y = x[1];

w_vel = y*OMEGA; /* linear w_velocity at the cell */

source = WEIGHT*(w_vel – C_WSWIRL(cell,thread));

dS[eqn] = -WEIGHT;

return source;

}

函数名为user_swirl,函数计算了变量source并且返回其值。函数的各项参数的意义参见2.5.10。

7.2.9.7 调节FLUENT变量

下面的函数调节存贮于内存的FLUENT变量,函数定义了x方向速度的边界条件。

#include “udf.h”

DEFINE_PROFILE(inlet_x_velocity,thread,position)

real x[ND_ND];

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)

}

函数的参数position是个数字标签,标记每一步循环(loop)中被设置的变量。函数调节的FLUENT变量

F_PROFILE。

7.2.9.8 读写data或case文件

下面的函数介绍了如何读写静态变量kount,如何计算静态变量请参见4.6。

#include “udf.h”

int kount = 0; /*定义静态变量kount*/

DEFINE_ADJUST(demo_calc,domain)

{

kount ++;

printf(“kount = %d\n”,kount);

}

DEFINE_RW_FILE(writer,fp)

{

printf(“Writing UDF data to data file…\n”);

fprintf(fp,”%d”,kount); /*将kount写入data文件中*/

}

DEFINE_RW_FILE(writer,fp)

{

printf(“Reading UDF data from data file…\n”);

fscanf(fp,“%d”,&kount); /*从数据文件中读取kount值*/

}

上面有三个函数。如果迭代10次,则kount值为10,然后将当前值10存贮到数据文件中,如果下次将kount值读入FLUENT继续运算,则kount将在10的基础上增加。我们可以存贮任意多的静态变量,不过读写顺序必须一致。

7.2.10 解法器函数(Solver Functions)

7.2.10.1 概述

在很多情况下,UDF需要得到FLUENT解法器中的数据。例如:

1.所求解的变量及其导数(例如,速度,温度等);

2.网格和面几何性质(例如,面面积,网格体积,网格质心坐标等);

3.物质的物理性质(例如,密度,粘性系数,导热系数等)。

! 我们可以取出比热,但是不能修改。

我们可以利用下一节所列FLUENT提供的解法器函数,得到解法器中的数据。这里所说的函数是从广义上讲的,因为其中包括函数和宏,只有在源文件appropriate.h中定义的才是真正的函数。

! 如果使用的是Interpreted 型的UDF,则只能使用这些FLUENT提供的解法器函数。

解法器函数可以与C函数一起在函数体中混合使用。为方便起见,一些最常用的C函数列在附录B中。

下面章节列出的函数中包括它们的参数,参数类型和返回值,还有对该函数说明的源文件。例如

C_CENTROID(x,c,t)

有三个参数:x,c和t,其中c和t为输入参数,x为输出参数,输出网格的坐标值。

7.2.10.4 节点坐标与节点(网格)速度

7.2.10.5 面变量

7.2.10.6 网格变量

下面列表中的是网格变量,不像面变量,网格变量在耦合与非耦合计算中都能获取(available in both the segregated

7.2.10.7 循环宏

如果要实现扫描全场的网格就需要使用循环宏。下面给出两种类型的循环宏。一种以begin开始,end结束,用来扫描线上的所有网格和面;另一种用来扫描所有的线。

cell_t c;

face_t f;

Thread *t;

Domain *d;

begin_c_loop(c, t)

{

}

end_c_loop(c, t) /*循环遍历线上的所有网格*/

begin_f_loop(f, t)

{

}

end_f_loop(f, t) /*循环遍历线上的所有面*/

thread_loop_c(t, d)

{

} /*遍历网格线*/

thread_loop_f(t, d)

{

} /*遍历面上的线*/

7.2.10.8 数据的可得性

在书写UDF的时候,要保证出现在函数中的数据是能够从解法器上获得的。为了检验数据的这种可得性,我们可以使用函数Data_Valid_p,如果数据正确该函数返回值为1,否则返回0。

Int Data_Valid_P(); /*取自文件case.h*/

当我们读取case文件时,就会装载相应的UDF。如果此时函数用到一个未初始化的变量,诸如内部网格速度,计算就会发生错误。为了避免这种类型的错误发生,解法器会执行一条if else 语句。如果数据可得,就按照正常情况执行下去;否则,就停止运算。一旦流场初始化之后,函数会被重新激活,然后读取正确的数据运行。

7.2.10.9 设置面变量值的函数

宏F_PROFILE设置的是面上的变量值,该函数在设置边界面时使用。

face_t f;

Thread *t;

F_PROFILE(f,,t,,nvar) /* from mem.h */

函数中的参数nvar不需用户设定,而是由FLUENT解法器传递给UDF。nvar是特定边界的数字标签。例如,与总压和总温相关的入口边界,nvar取值为0和1;与速度三个方向标量和静态温度相关的边界,nvar取值为0,1,2

和3。

我们在定义边界条件面板定义边界条件时,解法器就设定nvar的值。

! 整型变量nvar是不能改变的,只能由FLUENT解法器传递。

7.2.11 DPM宏

下面列出的离散相模型的宏定义在源文件dpm.h中,变量p是指向结构Tracked_Particle的指针(Tracked_Particle *p)。

7.2.11.1 颗粒变量的宏

1.当前位置颗粒变量

P_DIAM(p) 颗粒直径

P_VEL(p)[i] 颗粒速度,i=0,1,2

P_T(p) 颗粒温度

P_RHO(p) 颗粒密度

P_TIME(p) 当前颗粒时间

P_DT(p) 颗粒时间步长

P_LF(p) 颗粒液相分数(只适用于湿燃烧颗粒)

P_VFF(p) 颗粒挥发性馏分(只适用于燃烧颗粒)

2.进入当前网格颗粒变量

P_DIAM0(p) 颗粒直径

P_VEL0(p)[i] 颗粒速度,i=0,1,2

P_T0(p) 颗粒温度

P_RHO0(p) 颗粒密度

P_MASS0(p) 颗粒质量

P_TIME0(p) 颗粒时间

P_LF0(p) 颗粒液相分数(只适用于湿燃烧颗粒)

3.刚注射入区域的颗粒变量

P_INIT_DIAM(p) 颗粒直径

P_INIT_MASS(p) 颗粒质量

P_INIT_RHO(p) 颗粒密度

P_INIT_TEMP(p) 颗粒温度

P_INIT_LF(p) 颗粒液相分数(只适用于湿燃烧颗粒)

P_EV AP_SPECIES_INDEX(p) 混合物蒸发组分数(evaporating species index in mixture)

P_DEVOL_SPECIES_INDEX(p) 混合物液化组分数(devolatizing species index in mixture)

P_OXID_SPECIES_INDEX(p) 混合物氧化物组分数(oxidizing species index in mixture)

P_PROD_SPECIES_INDEX(p) 混合物燃烧产物分数(combustion products species index in mixture) P_CURRENT_LAW(p) current particle law index

P_NEXT_LAW(p) next particle law index

P_USER_REAL(p,i) 用户自定义变量(i表示第几个)

7.2.11.2 颗粒物性的宏

P_MA TERIAL(p) 颗粒指针

DPM_SWELLING_COEFF(p) 颗粒膨胀系数

DPM_EMISSIVITY(p) 辐射模型颗粒发射率

DPM_SCA TT_FACTOR(p) 辐射模型颗粒散射因子

DPM_EV APORA TION_TEMPERA TURE(p) 颗粒物质蒸发温度

DPM_BOILING_TEMPERATURE(p) 颗粒物质沸腾温度

DPM_LATENT_HEAT(p) 颗粒物质潜热

DPM_HEAT_OF_PYROL YSIS(p) 颗粒物质分解热

DPM_HEAT_OF_REACTION(p) 颗粒物质反应热

DPM_VOLATILE_FRACTION(p) 颗粒物质挥发性馏分

DPM_CHAR_FRACTION(p) 颗粒物质炭化分数

DPM_SPECIFIC_HEAT(p,t) 颗粒物质在温度t时的比热

第三节编译连接UDFs

函数的编译与连接取决于使用的UDF是Interpreted型,还是Compiled型。下面3.3和3.4节也分别介绍了Interpreted 型和Compiled型UDF的编译和连接。

7.3.1 概述

我们在第一章就介绍过Interpreted型和Compiled型UDF的区别以及各自的特点,在此不再累述。为了显示区别,FLUENT中两种UDF的设置面板是不同的。Interpreted型面板有一个Compile按钮,点击时就会对源文件进行编译;Compiled型面板有一个open按钮,点击时会打开事先编译好的机器源代码库,然后连接运行。

UDF是用宏DEFINE_定义的,对宏的解释在udf.h文件中。udf.h文件存放的位置为path/Fluent.Inc/fluent5.x/src/udf.h,path为FLUENT安装路径。在编译的时候,编译器会自动到src目录下搜寻udf.h文件。注意,在更新src目录时不能移去udf.h文件,因为该文件在近期是无法更新的。如果系统搜寻不到udf.h文件,编译连接工作将无法进行。

7.3.2 Interpreted型UDFs

自动加载UDFs。

7.3.2.1 编译Interpreted型UDFs

一般,我们按照下面的步骤编译UDF:

1.将UDF的C源程序拷贝到当前工作目录,如果不在当前目录,则编译时需要指定该文件的具体路径。如果使用并行运算,按照3.2.2设置;

2.运行FLUENT程序;

3.读取(或建立)case文件;

4.在Interpreted UDFs面板编译UDF(例如,vprofile.c)。

Define→User-Defined→Functions→Interpreted…

图3.2.1 Interpreted UDFs面板

(a)在Source File Name中输入C源文件名(如vprofile.c)。如果源文件不在当前工作目录下,则需要输

入完整路径。

(b)在CPP Command Name中输入C预处理程序名。如果安装了/contrib组件,则会出现默认的预处理

程序名:cpp。对于Windows NT用户,标准安装过程会自动安装默认的预处理程序。当然,我们还

可以选择系统中其它的预处理程序。

(c)Stack Size默认值取10000,如果我们处理的问题变量很多,10000个栈会溢出,则需要加大该值。

(d)点击Compile键进行编译。如果选中Display Assembly Listing按钮,编译时会出现下面的信息提示:

(e)点击Close关闭。

!如果我们需要编译的Interpreted UDF不止一个,可以将UDFs写入单个C源文件,如all.c,然后以同样的方式进行编译连接就可以了。

7.3.2.2 Windows NT系统网络并行运算的目录结构

如果我们使用的是Windows NT系统的并行版FLUENT,就需要以特定的方式组织文件目录。3.2.1中的第一步必须以下面的步骤代替:

1.在Fluent.Inc目录下建立一个名为udf的可写子目录。

2.在目录udf下建立一个目录(例如,Fluent.Inc\udf\myudf),将C源文件拷入其中,如myudf目录下。如果多位用户使用,可以再建立其它目录(如Fluent.Inc\udf\abcudf 或xyz)。

! 由于C源文件不在当前工作目录下,编译时需要输入文件路径。如:

\\\Fluent.Inc\udf\myudf\example.c

fileserver表示安装FLUENT的计算机名。

3.如果已有case文件,应保证其在当前工作目录下。

7.3.2.3 调试Interpreted UDFs

如果编译有错,在相应窗口中会出现错误信息。如果因为屏幕翻动无法看清,则应该关闭Display Assembly Listing 选项。

7.3.2.4 Interpreted UDFs常见编译错误

C源文件如果不是在当前工作目录下,而在编译时没有指明具体路径,就会出现下面的错误:

如果将case文件拷贝到了其他目录,而没有将C源文件一起拷过去,会出现同样的错误。

7.3.3 Compiled型UDFs

一般,我们按照下面的步骤编译连接Compiled型UDFs:

1.在工作目录下建立相应的目录(见3.3.1);

2.编译UDFs并建立共享库(见3.3.2);

3.运行FLUENT;

4.读取(或建立)case文件(case文件如果事先以存在,应保证在当前工作目录下);

5.连接共享库到FLUENT执行(见3.3.3)。连接成功后,出现下面信息:

7.3.3.1 建立目录结构

UNIX和Windows NT系统所建目录结构是不一样的,下面分别进行说明。

UNIX系统

UNIX系统编译Compiled UDFs需要两个文件:Makefile和makefile。makefile文件是可修改的,C源文件名就在其中设定。两文件所处的相关目录为:

path/Fluent.Inc/fluent5.x/src/Makefile

path/Fluent.Inc/fluent5.x/src/makefile

path为FLUENT安装目录,5.x表示FLUENT版本。

下面的步骤概括介绍了目录结构的建立过程,从图3.3.1可以看得更清楚。图3.3.1中的目录结构适用于两种版本:单精度2D运算和单精度2D并行运算。注意不需要向版本目录(2d,2d_host,2d_node)中拷入任何文件,图中所示文件在编译时会自动生成。

图3.3.1 UNIX目录结构说明

1.在当前工作目录下建立一个目录用来存放库(如libudf)。

2.拷贝Makefile.udf文件到1中建立的目录下,并重新命名为Makefile。

3.在1中建立的目录(libudf)下,建立一个用于存放C源文件的目录,并命名为src。

4.将C源文件(如udfexample.c)拷入src目录下。

5.把makefile.udf文件拷入src目录下,并命名为makefile。

6.启动FLUENT,确认FLUENT版本结构。如果是irix6.5,需要修改makefile文件(见3.3.2)。

7.按照FLUENT版本结构建立相应的目录结构(如ultra/2d或ultra/3d等)。可能的版本有:

(a)单精度2d或3d:2d或3d

(b)双精度2d或3d:2ddp或3ddp

(c)单精度并行版2d或3d:2d_node和2d_host,3d_node和3d_host

(d)双精度并行版2d或3d:2ddp_node和2ddp_host,3ddp_node和3ddp_host

Windows NT系统

对于Windows NT系统需要两个文件:makefile_nt.udf和user_nt.udf。C源文件需要修改文件user_nt.udf指定。下面的步骤概括介绍了目录结构的建立过程,可参考图3.3.2。图3.3.2也只适用于两种版本:单精度2D运算和单精度2D并行运算。

图3.3.2 Windows NT目录结构说明

1.在当前工作目录下建立一个目录(如libudf)。

2.在新建目录下建立名为src目录,用于存放C源程序文件。

3.将C源程序(如udfexample)拷贝入src目录。

4.根据机器结构建立相应目录:Windows NT系统建立ntx86目录,DEC Alpha系统建立ntalpha目录。

5.在ntx86目录或ntalpah目录下建立版本信息目录(如ntx86\2d)。可能的FLUENT版本为:

(a)单精度2d或3d:2d或3d

(b)双精度2d或3d:2ddp或3ddp

(c)单精度并行版2d或3d:2d_node和2d_host,3d_node和3d_host

(d)双精度并行版2d或3d:2ddp_node和2ddp_host,3ddp_node和3ddp_host

和node目录(如2d_node和2d_host)。两文件在FLUENT中的位置:

path/Fluent.Inc/fluent5.x/src/makefile_nt.udf

path/Fluent.Inc/fluent5.x/src/user_nt.udf

path为FLUENT安装目录。注意FLUENT版本更新升级后,需要把新版本的makefile_nt.udf和user_nt.udf 拷入覆盖原来的文件,这和UNIX系统是不同的。

7.把文件makefile_nt.udf重新命名为makefile。

7.3.3.2 编译建立共享库

对于UNIX和Windows NT系统编译和建立共享库的方式是不同的,下面分别叙述:

UNIX系统

在建立相应的目录结构和拷入源文件之后,就可以编译生成共享库文件。

1.编辑src目录下的makefile文件,并设置参数:

SOURCES = 要进行编译的C源文件名

FLUENT_INC = FLUENT安装路径

下面是个makefile文件的例子:

2.如果版本结构是irix6.5,则需要进一步修改makefile文件。

(a)在文件中找到下面部分:

CFLAGS_IRIX6R10 = -KPIC -ansi -fullwarn -0 -n32

(b)将-ansi改为-xansi:

CFLAGS_IRIX6R10 = -KPIC -xansi -fullwarn -0 -n32

3.在库目录(如libudf)下,输入下面的语句,执行Makefile。

Make “FLUENT_ARCH=ultra”

系统显示信息:

当然,我们可以同时编译多个C源程序文件。

Windows NT系统

在建立相应目录及拷入C源文件之后,Windows NT系统按照下面的步骤编译和建立共享库。

1.编辑user_nt.udf文件,设置下面的参数:

SOURCES=要进行编译的C原文件名。在文件名之前,需要前缀$(SRC)

(如$(SRC)udfexample.c),对于多个源文件,文件之间要以空格间隔(如

$(SRC) udfexample1.c $(SRC) udfexample2.c)。

VERSION=所使用解法器版本,如2d,3d,2ddp,3ddp等。

PARALLEL_NODE=并行运算通讯库,可能的情况有:

-none:单机版

-smpi:并行使用共享内存(对多处理器机器)

-vmpi:使用MPI软件实现并行使用共享内存和网络

-net:使用RSHD软件并行使用网络通讯

! 并行运算注意修改所有的user_nt.udf文件

下面是user_nt.udf参数设置的例子:

2.在MS-DOS操作符下,进入到所建立目录(如\libudf\ntx86\2d\)下,执行命令nmake,如果编译出现问题使用nmake clean 清除。

7.3.3.3 连接共享库到FLUENT

按上一节编译并建立共享库之后,就可以在FLUENT中,将共享库连接使用。具体步骤如下:

1.运行FLUENT程序

2.读取(或建立)case文件

3.连接共享库到FLUENT

Define→User-Defined→Functions→Compiled…

图3.3.3 Compiled UDFs面板

(a)在Library Name中输入存储库文件的目录名(如libudf),如果不在当前工作目录下,需要输入路径。

(b)点击Open连接共享库到FLUENT。解法器会自动找到相应的版本的共享库,一旦连接成功,将会在case

文件中保存,下次读取case文件时会自动加载共享库。

7.3.3.4 编译连接Compiled UDFs时的常见错误

当共享库不在当前工作目录下的相应目录内时,或者取出case文件而与该case文件相关联的共享库已经移动时,会显示如下错误:

如果在新版本下读取旧版本的case文件,如在5.0.2中读取5.0.1版本的case文件,则会显示下面的错误:

第四节在FLUENT模型中使用UDFS

在编译连接成功之后,我们就可以在FLUENT模型中使用UDFs。下面分别说明如何在FLUENT各模型中使用UDFs。

7.4.1 边界条件

编译连接成功边界条件UDF之后,就可以在FLUENT中选择使用。例如,定义速度入口边界条件的UDF (inlet_x_velocity)可以在Velocity Inlet面板(如下所示)中找到,选择之后点击OK按钮就可以在FLUENT中使用。

边界条件UDFs由宏DEFINE_PROFILE定义,参见2.5.6。

7.4.2 源项

源项UDFs在Fluid面板中选择,如名为cell_x_source的源项UDF。

源项UDFs由宏DEFINE_SOURCE定义,参见2.5.10。

Fluent_UDF_第七章_UDF的编译与链接

第七章 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升级、操作系统改变了或者运行在不同的类型的计算机,必须重新编译这些库。

宏的使用方法

在这里总结宏的使用方法欢迎补充 1 条件include 如下 CODE #ifndef MAIN_H_ #define MAIN_H_ 其它内容 #endif 上面在看到头文件时会看到作用就是阻止这个头文件被多次include 多次include就会出现重复的定义情况所以需要在每个头文件中都使用这个定义 如果还不是很了解要怎样使用可以看看c的标准头文件如fcntl.h 2 条件编译 如下 CODE #ifdef _DEBUG printf("this debug info\n"); #endif 如果没有定义_DEBUG宏的话那么上面那一行是不会编译进去的 但是定义了_DEBUG后上面那行就会编译进去可以写个简单的程序测试 CODE #include int main() { #ifdef _DEBUG printf("hello world\n"); #else printf("no debug"); #endif return 0; } 第一次使用gcc -D_DEBUG main.c 第二次使用gcc main.c 运行两次的结果看 3 定义为某个值以便后面修改这个值时不用修改其它地方代码只要修改这个宏的定义就可以了

如一个软件的多语言版本等 如下 CODE #include #define PRINT_STR "你好DD" main(){ printf(PRINT_STR); return 0; } 编译时会把PRINT_STR代替成"你好DD" 以后想修改时就方便了 另外也可以定义为函数 #include #ifdef _DEBUG #define A(x) a(x) #else #define A(x) b(x) #endif int a(int x) { return x+1; } int b(int x){ return x+100; } int main(){ printf ("A(10) value is %d",A(10)); return 0; } [/code] 其实也可以定义成 #define A a 的 但是定义成A(x)后只有A后面带一个(x)类型的编译器才会执行替换比较安全可以保证只替换函数而不替换变量 第四个 可变参数宏

新代数控车床宏程序说明

一.用户宏程序的基本概念 用一组指令构成某功能,并且象子程序一样存储在存储器中,再把这些存储的功能由一个指令来代表,执行时只需写出这个代表指令,就可以执行其相应的功能。 在这里,所存储的一组指令叫做宏程序体(或用户宏程序),简称为用户宏。其代表指令称为用户宏命令,也称作宏程序调用指令。 用户宏有以下四个主要特征: 1)在用户用户宏程序中可以使用变量,即宏程序体中能含有复杂的表达式; 2)能够进行变量之间的各种运算; 3)可以用用户宏指令对变量进行赋值,就象许多高级语言中的带参函数或过程,实参能赋值给形参; 4)容易实现程序流程的控制。 使用用户宏时的主要方便之处在于由于可以用变量代替具体数值,因而在加工同一类的工件时.只得将实际的值赋予变量既可,而不需要对每个不同的零件都编一个程序。 二.基本书写格式 数控程序文档中,一般以“%”字符作为第一行的起头,该行将被视为标题行。当标题行含有关键字“@MACRO”时整个文档就会以系统所定义的MACRO语法处理。如果该行无“@MACRO”关键词此档案就会被视为一般ISO程序文档格式处理,此时将不能编写用户宏和使用其MACRO语法。而当书写ISO程序文档时标题行一般可以省略,直接书写数控程序。“@MACRO”关键词必须是大写字母。 对于程序的注释可以采用“//……”的形式,这和高级语言C++一样。 例一:MACRO格式文档 % @MACRO //用户宏程序文档,必须包含“@MACRO”关键词 IF @1 = 1 THEN G00 X100.; ELSE G00 Z100.; END_IF; M99; 例二:ISO格式文档 % 这是标题行,可当作档案用途说明,此行可有可无 G00 X100.; G00 Z100.; G00 X0; G00 Z0; M99;

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

蒸发过程UDF程序fluent

F l u e n t蒸发相变模拟U D F 经过几天的不懈折腾,终于找到一个较为完成的用于fluent蒸发相变模拟的udf的一个程序。而且注释相对完整。 #include "udf.h" //包括常规宏 #include "sg_mphase.h" // 包括体积分数宏CVOF(C,T) #define T_SAT 373 //定义蒸发温度100℃ #define LAT_HT 1.e3 //定义蒸发潜热J/Kg DEFINE_SOURCE(liq_src, cell, pri_th, dS, eqn) //液相质量源项UDF { Thread *mix_th, *sec_th; //定义计算区线指针 real m_dot_l; //定义液相质量转移 kg/(m2.s) 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, mix_th) - T_SAT)/T_SAT; dS[eqn] = -0.1*C_R(cell, pri_th)*fabs(C_T(cell, mix_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; }

对一个简单解释型udf程序的详细解释教学文稿

对一个简单解释型u d f程序的详细解释

精品资料 对一个简单解释型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表示边界上所有的网格面的集合)的指针*/ 仅供学习与交流,如有侵权请联系网站删除谢谢2

Excel宏和控件无法使用的解决方法

关于Excel宏和控件无法使用的解决方法. 有的时候,我们在打开含有宏或ActiveX控件的Excel文件时,无法正常使用宏和控件,总是出现如下的一些提示: 找不到指定的模块;内存溢出;宏被禁用;等等。或者,控件根本无法点击响应。 可以试试如下方法: 一、开启宏,降低宏安全等级,但对系统有潜在威胁。见“一、开启宏方法”。 二、如果还不行,则可能是Fm20.dll注册损坏引起的,可以重新注册。见“手动 注册Fm20.dll”。 一、开启宏方法: 1、Excel2003版本中操作步骤: (1)在Excel的菜单栏上依次单击“工具”——“宏”——“安全性”,打开下图所示的“安全性”对话框。 (2)在“安全级”选项卡中将宏的安全级别设置为“中”或“低”。其中推荐使用“中”级,这样的设置并不会降低您的安全性,您仍然对任意一个宏文件都拥有主动选择是否运行的权力。 在宏的安全性级别设置成功后,再次打开Excel程序文件时,会出现下图所示信息框,此时点击“启用宏”按钮即可使本程序正常运行:

2、Excel2007版本中操作步骤: (1)依次单击Excel的Office按钮(2010版本为“文件”按钮)——“Excel选项”,打开下图所示的“Excel选项”选项卡,在左侧列表中选择“信任中心”,在右侧出现的窗口中点击“信任中心设置”按钮。 (2)打开“信任中心”选项卡,在左侧选择“宏设置”,在右侧出现的窗口中选择“禁用所有宏,并发出通知”选项,单击确定完成。 在宏的安全性级别设置成功后,再次打开Excel程序文件时,在信息栏会出现下图所示的警告信息,此时点击其中的“选项”按钮打开Office安全选项对话框,在其中选择“启用此内容”选项并确定即可使本程序正常运行。

使用Minitab宏(Marcro)的方法

注册登录加为收藏 设为首页 6SQ邮局 6SQ首页|文章资讯|品质论坛|质量家园|质量百科|品质人才|会员相册|工具条|培训咨询|软件销售 分栏模式淘宝网店论坛搜索6SQ统计插件签到台(送金币)帮助窄屏风格宽屏风格六西格玛品质论坛?品质软件?请教如何MINITAB中运行宏文件?6SQ制造业绿带认证班培训品质管理工具应用专业培训精益生产培训3~10天六西格玛/精益项目咨询培训 6SQ常见问题解答[必读]6SQ统计插件2.0下载hot!广告合作业务联系用支付宝快速充6SQ币 上海专业制作工装夹具治具检具6SQ官方QQ群信息一次交费,终身使用,vip会员Minitab应用培训3~5天 返回列表回复发帖 发新话题发布投票发布悬赏发布辩论发布活动发布视频发布商品victor2008 发短消息 加为好友 victor2008 (变革在我) 质量疯子 UID169830 帖子7397 精华1 积分6079 6SQ币60594 热心656 阅读权限100 来自广东注册时间2007-5-12 最后登录2010-4-14 昵称: 变革在我 黑带高级 6SQ币60594 热心656 发短消息 加为好友 个人空间 1# 打印字体大小: tT 发表于2007-10-26 16:25 | 只看该作者 请教如何MINITAB中运行宏文件? 本文来自:6sigma品质网https://www.sodocs.net/doc/6c14935456.html, 作者:victor2008 点击1771次原文:https://www.sodocs.net/doc/6c14935456.html,/viewthread.php?tid=159669 各位大师: 如何在MINITAB中运行宏文件啊,具体的操作步骤是怎样的啊,请指教啊! 收藏分享评分天行健,君子当自强不息! 加入铁杆会员,一次交费,终身使用,无阅读下载限制,详情查看 回复引用订阅TOP wit 发短消息 加为好友 wit UID24546 帖子1287 精华0 积分1268 6SQ币12675 热心43 阅读权限100 注册时间2004-7-12 最后登录2010-3-19 黑带初级 6SQ币12675 热心43 发短消息 加为好友 个人空间 2# 发表于2007-10-26 16:36 | 只看该作者从来没有用过。我也希望学习一下。 有人提供帮助吗? 6SQ统计插件for Excel 2.0下载 回复引用TOP

udf编译的经验总结

转帖 udf编译的经验总结 关于:"nmake"不是内部命令或外部命令,也不是可运行程序 我在编译UDF时出现如下错误: Error: Floating point error: divide by zero Error Object: () > "nmake"不是内部命令或外部命令,也不是可运行程序 Error Object: () Error: open_udf_library:系统找不到指定目录 Error: Floating point error: divide by zero Error Object: () 我原来装的时turbo c/c++编译器,可能时环境变量没有设好的缘故。换用vc++6.0以后就没有这个问题了,另外,我用的是fluent6.2.16,希望遇到同样问题的同学借鉴一下,呵 呵。 udf编译的经验总结1)安装vc时候,只要选择了“环境变量”这一项,就不需要在“我 的电脑 > 属性 > 高级 > 环境变量”中 更改“include”“lib”“path”变量的值,保持默认状态即可; 2)如果是fluent6.1以上的版本,读入你的case文件,只要在 define->user-defined->functions->complied中, add你的udf源文件(*.c)和“udf.h”头文件,然后确定用户共享库(library name)的 名称,按“build”,就 相当于nmake用户共享库;在这一步中常出现的错误: (a)(system "move user_nt.udf libudf\ntx86\2d")0 (system "copy C:\Fluent.Inc\fluent6.1.22\src\makefile_nt.udf libudf\ntx86\2d\makefile")已复制 1 个文件。 (chdir "libudf")() (chdir "ntx86\2d")() 'nmake' 不是内部或外部命令,也不是可运行的程序 或批处理文件。 'nmake' 不是内部或外部命令,也不是可运行的程序

数控宏程序的使用方法

数控宏程序的使用方法 Document serial number【KK89K-LLS98YT-SS8CB-SSUT-SST108】

数控宏程序的使用方法一、A类宏程序 1)变量的定义和替换 #i=#j 编程格式 G65 H01 P#i Q#j 例 G65 H01 P#101 Q1005; (#101=1005) G65 H01 P#101 Q-#112;(#101=-#112) 2)加法 #i=#j+#k 编程格式 G65 H02 P#i Q#j R#k 例 G65 H02 P#101 Q#102 R#103;(#101=#102+#103) 3)减法 #i=#j-#k 编程格式 G65 H03 P#i Q#j R#k 例 G65 H03 P#101 Q#102 R#103;(#101=#102-#103) 4)乘法#i=#j×#k 编程格式 G65 H04 P#i Q#j R#k 例 G65 H04 P#101 Q#102 R#103;(#101=#102×#103) 5)除法 #i=#j / #k 编程格式 G65 H05 P#i Q#j R#k 例 G65 H05 P#101 Q#102 R#103;(#101=#102/#103) 6)平方根 #i= 编程格式 G65 H21 P#i Q#j 例 G65 H21 P#101 Q#102;(#101= ) 7)#i=│#j│ 编程格式 G65 H22 P#i Q#j 例 G65 H22 P#101 Q#102;(#101=│#102│) 8)复合平方根1 #i= 编程格式 G65 H27 P#i Q#j R#k 例 G65 H27 P#101 Q#102 R#103;( #101= 9)复合平方根2 #i= 编程格式 G65 H28 P#i Q#j R#k 例 G65 H28 P#101 Q#102 R#103 1)逻辑或 #i=#j OR #k 编程格式 G65 H11 P#i Q#j R#k 例 G65 H11 P#101 Q#102 R#103;(#101=#102 OR #103) 2)逻辑与 #i=#j AND #k

宏业软件地使用方法

宏业软件的使用方法 软件常见问题解答 1、清单定额地区人工费如何调整? 答:①在[综合单价计算模板]界面模板内定义好地区人工费调整费率;②切换到[清单/计价表],选择定义模板计算并应用于计价表所有定额数据对象。注意:地区人工费调整不能直接在[清单/计价表]中对定额进行整体系数换算处理,这样将对调整系数作为措施项目及规费取费基础。 2、做定额预结算时,工程造价让利如何处理? 答:①单位工程[费用汇总表]中,在“工程造价”行后添加工程造价优惠行,计算公式则为原“工程造价”行“费用编号*费率”,再在“费率”列录入让利费率值自动计算出结果;②将添加的工程造价优惠行标记为工程造价行(利用标记当前行为工程造价行功能)。 3、定额预结算方式按实费用如何计算? 答:在[费用汇总表]中已有的按实计算费用行下添加其费用子目,再编辑其费用名称、计算公式;若需打印出计算式,则需要再在最后“[打印]计算公式”列输入详细计算表达式。 4、派生费用计算有几种方式,分部派生费在定额计价方式与清单计价方式各如何应用? 答:派生费用对不同数据对象计算分定措(在定额上计算派生费用)、项措(在清单项目上计算派生费用)及措1…(在段落结构上计算派生费用);定额计价方式下计算的派生费用直接汇总表“费用汇总表”相应数据中,清单计价方式下:定措、项措均直接汇入相应项目费用中,措1…一般是调用到措施项目清单中。 5、在[清单/计价表]中进行定额人工费换算处理与在[综合单价计算模板]设置费率处理的区别 答:前者直接进入到定额人工费中,适用于定额上规定的系数换算处理;后者不汇入定额人工费中,适用于地区人工费调整,并不作为措施项目及规费的取费基础。 6、定额计价方式做预结算时,怎样整体调整分部工程量?

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

fluent UDF第二章

第二章.UDF的C语言基础 本章介绍了UDF的C语言基础 2.1引言 2.2注释你的C代码 2.3FLUENT中的C数据类型 2.4常数 2.5变量 2.6自定义数据类型 2.7强制转换 2.8函数 2.9数组 2.10指针 2.11声明 2.12常用C操作符 2.13C库函数 2.14用#define实现宏置换 2.15用#include实现文件包含 2.16与FORTRAN比较 2.1引言 本章介绍了C语言的一些基本信息,这些信息对处理FLUENT的UDF很有帮助。本章首先假定你有一些编程经验而不是C语言的初级介绍。本章不会介绍诸如while-do循环,联合,递归,结构以及读写文件的基础知识。如果你对C语言不熟悉可以参阅C语言的相关书籍。 2.2注释你的C代码 熟悉C语言的人都知道,注释在编写程序和调试程序等处理中是很重要的。注释的每一行以“/*”开始,后面的是注释的文本行,然后是“*/”结尾 如:/* This is how I put a comment in my C program */ 2.3FLUENT的C数据类型 FLUENT的UDF解释程序支持下面的C数据类型: Int:整型 Long:长整型 Real:实数 Float:浮点型 Double:双精度 Char:字符型

注意:UDF解释函数在单精度算法中定义real类型为float型,在双精度算法宏定义real为double型。因为解释函数自动作如此分配,所以使用在UDF中声明所有的float和double 数据变量时使用real数据类型是很好的编程习惯。 2.4常数 常数是表达式中所使用的绝对值,在C程序中用语句#define来定义。最简单的常数是十进制整数(如:0,1,2)包含小数点或者包含字母e的十进制数被看成浮点常数。按惯例,常数的声明一般都使用大写字母。例如,你可以设定区域的ID或者定义YMIN和YMAX 如下:#define WALL_ID 5 #define YMIN 0.0 #define YMAX 0.4064 2.5变量 变量或者对象保存在可以存储数值的内存中。每一个变量都有类型、名字和值。变量在使用之前必须在C程序中声明。这样,计算机才会提前知道应该如何分配给相应变量的存储类型。 2.5.1声明变量 变量声明的结构如下:首先是数据类型,然后是具有相应类型的一个或多个变量的名字。变量声明时可以给定初值,最后面用分号结尾。变量名的头字母必须是C所允许的合法字符,变量名字中可以有字母,数字和下划线。需要注意的是,在C程序中,字母是区分大小写的。下面是变量声明的例子: int n; /*声明变量n为整型*/ int i1, i2; /*声明变量i1和i2为整型*/ float tmax = 0.; /* tmax为浮点型实数,初值为0 */ real average_temp = 0.0; /* average_temp为实数,赋初值为0.1*/ 2.5.2局部变量 局部变量只用于单一的函数中。当函数调用时,就被创建了,函数返回之后,这个变量就不存在了,局部变量在函数内部(大括号内)声明。在下面的例子中,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.;

word中使用宏命令速排版的方法

word中使用宏命令速排版的方法 一、首先录制宏命令 1、打开一个WORD文档,文档中如果有文字,可使下面的过程看到效果。 2、执行录制宏命令:选择菜单\工具\宏\录制宏命令,在打开的对话框中,填上:宏名框中填上表示该宏命令的作用,例如:去掉多余的空格,去掉多余的空行,去掉多余的手工换行符,去掉多余的段落标记符,排版字体为宋体字号为四号颜色为黑色等等。点对话框中的确定按钮。 3、全选所有文字:按CTRL+A, 或者按下鼠标左键不松手,从文件首行拖到最后一行,或者选择:菜单\编辑\全选。 4、执行排版: 去掉全部多余的空格:选择菜单\编辑\替换\在查找框中按一个空格,在替换框中不加任何符号,点全部替换按钮两次。 去掉多余的手工换行符:选择菜单\编辑\替换\在查找框中填上手工换行符,方法是按CTRL+6,再字母L,或者点按钮高级选项,展开后,点特殊字符按钮,在其中点手动换行符.在替换框中填上段落标记,方法是按CTRL+6,再按字母P,或者点按钮高级选项,展开后,点特殊字符按钮,在其中点段落标记.再按确定按钮两次. 去掉多余的段落标记:选择菜单\编辑\替换\在查找框中填上两个段落标记,方法是按CTRL+6,再字母P,连续两次,出现^P^P,,或者点按钮高级选项,展开后,点特殊字符按钮,在其中点段落标记两次.在替换框中填上段落标记,方法是按 CTRL+6,再按字母P,或者点按钮高级选项,展开后,点特殊字符按钮,在其中点段落标记.再按确定按钮两次. 更换字体:在快捷菜单栏中,点字体对话框,例如:宋体. 更换字号:在快捷菜单栏中,点字号对话框,例如;四号字. 更换字的颜色:在快捷菜单栏中,点字体颜色,在打开的颜色选择对话框中,点选合适的颜色,也可用菜单\格式\字体,在对话框中,把所有的这些项,全部一次更换好. 更换段落间距等:打开菜单\格式\段落\在对话框中,将常规、缩进、间距设置好,再按确定,一般情况如下图设置。

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的使用过程,希望能起到抛砖引玉的作用,使大家在实际应

EXCEL重要宏应用,序号的使用方法

EXCEL重要宏应用,序号的使用方法 EXCEL重要宏应用,序号的使用方法 (1) 1 序号 (2) 1.1 . 希望在B列输入内容,A列就自动进行编号 (2) 1.2 . 隐藏行连续 (2) 2 安全 (2) 2.1 . 保护工作表 (2) 3 宏 (2) 3.1 . 批量将工作表转换为独立工作簿 (2) 3.2 . 一键汇总各分表数据到总表 (3) 3.3 . 一键将总表数据拆分为多个分表 (4) 3.4 . 汇总多个工作簿的数据到总表 (6) 3.5 . 按一列中的部门拆分成工作簿 (8) 3.6 . 按一列中的部门拆分成工作簿 (10) 3.7 . 将同一工作簿中的所有工作表合并到一个工作表中 (12) 3.7.1 代码1 (12) 3.7.2 代码2 (13) 3.8 . 把一个工作簿中的所有表单合并成一个表单,怎么去掉重复的表头、标题行?方法如下: (13) 3.8.1 代码1 (13) 3.8.2 代码2 (13) 3.9 . 将需要合并的工作簿文件放置在一个文件夹中,并新建一个工作簿 (14)

1 序号 1.1 . 希望在B列输入内容,A列就自动进行编号 在A2单元格中输入公式:=IF(B2="","",COUNTA($B$2:B2)) 1.2 . 隐藏行连续 在A2单元格输入公式:=IF(B2="","",SUBTOTAL(103,$B$2:B2)) 2 安全 2.1 . 保护工作表 按 Ctrl+G,打开定位条件对话框,选择定位到“公式”; 2、按Ctrl+1,打开单元格设置对话框,在“保护”选项下,勾选“隐藏”和“锁定”; 3、在“审阅”选项下的“保护工作表”中设置撤销保护的密码,确定,即可达到隐藏公式的效果。 3 宏 3.1 . 批量将工作表转换为独立工作簿 Sub Newbooks() 'EH技术论坛。VBA编程学习与实践。看见星光 Dim sht As Worksheet, strPath$ With Application.FileDialog(msoFileDialogFolderPicker) '选择保存工作薄的文件路径 If .Show Then strPath = .SelectedItems(1) '读取选择的文件路径 Else Exit Sub

浅谈数控编程中的宏程序

浅谈数控编程中的宏程序 江苏经贸技师学院王军歌 [摘要] 随着现代制造技术的发展和数控机床的日益普及,数控加工在我国得到广泛的应用,数控加工中很重要的一部分就是编程,从CAD/CAM软件出现以后,人们过分依赖CAD/CAM软件,使得无论程序大小,加工难易编程人员习惯使用各种CAD/CAM软件,而把手工编程遗忘了,尤其是博大精深的宏程序。宏程序在数控编程中不应该被遗忘,而是应该很好的使用,它有着自动编程软件不可取代的优势。 [关键词] 数控编程宏程序CAD/CAM 数控加工 一.引言 在CAD/CAM软件普遍存在的今天,手工编程的应用空间日趋减小,数控世界有一种说法很流行“宏程序已经没有什么用”,其实任何数控系统都有很多指令在一般情况下用不着,那他们是否也没有用呢?这显然不对,对宏程序也是如此,原因只是大家对宏程序不熟悉,往往误以为宏程序深不可测而已,在实际工作中,宏程序确实也有广泛的应用空间,并且能够方便手工编程,锻炼操作者的编程能力,帮助操作者更加深入的了解自动编程的本质。 二.认识宏程序 在一般的程序编制中程序字为常量,一个程序只能描述一个几何形状,当工件形状没有发生改变但是尺寸发生改变时,就没有办法了,只能重新进行编程,缺乏灵活性和适用性。当我们所要加工的零件如果形状没有发生变化只是尺寸发生了一定的变化的情况时,我们只需要在程序中给要发生变化的尺寸加上几个变量再加上必要的计算公式就可以了,当尺寸发生变化时只要改变这几个变量的赋值参数就可以了。 它是利用对变量的赋值和表达式来进行对程序的编辑的,这种有变量的程序叫宏程序。 三.宏程序与自动编程的比较 自动编程有自动编程的好处,但是自动编程也有其不利于加工方面的问题,在加工不规律的曲面时利用自动编程确实是很好,但是在加工有规律的曲面时就不见得了,加工有规律的工件的时候用宏程序加工要比用自动编程软件要强的

相关主题