UDF的宏用法及相关算例 联系客服

发布时间 : 星期六 文章UDF的宏用法及相关算例更新完毕开始阅读6c9cff1c866fb84ae45c8df1

C_DIFF_EFF(c,t,i) C_ABS_COEFF(c,t) C_SCAT_COEFF(c,t) 有效组分扩散系数 吸收系数 散射系数 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_MASS(p) 颗粒质量

91

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_EVAP_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_MATERIAL(p) 颗粒指针 DPM_SWELLING_COEFF(p) 颗粒膨胀系数

DPM_EMISSIVITY(p) 辐射模型颗粒发射率 DPM_SCATT_FACTOR(p) 辐射模型颗粒散射因子 DPM_EVAPORATION_TEMPERATURE(p) 颗粒物质蒸发温度 DPM_BOILING_TEMPERATURE(p) 颗粒物质沸腾温度 DPM_LATENT_HEAT(p) 颗粒物质潜热 DPM_HEAT_OF_PYROLYSIS(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

本节介绍了如何编译Interpreted型UDFs。编译之后,case文件会记录编译过程,FLUENT在读取case文件时会

92

自动加载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…

(a) (b)

图3.2.1 Interpreted UDFs面板

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

在CPP Command Name中输入C预处理程序名。如果安装了/contrib组件,则会出现默认的预处理程序名:cpp。对于Windows NT用户,标准安装过程会自动安装默认的预处理程序。当然,我们还可以选择系统中其它的预处理程序。

Stack Size默认值取10000,如果我们处理的问题变量很多,10000个栈会溢出,则需要加大该值。 点击Compile键进行编译。如果选中Display Assembly Listing按钮,编译时会出现下面的信息提示:

(c) (d)

93

(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)中拷入任何文件,图中所示文件在编译时会自动生成。

94