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文件时会自动加载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)
99
(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源文件不在当前工作目录下,编译时需要输入文件路径。如:
\\\\
3. 如果已有case文件,应保证其在当前工作目录下。
7.3.2.3 调试Interpreted UDFs
如果编译有错,在相应窗口中会出现错误信息。如果因为屏幕翻动无法看清,则应该关闭Display Assembly Listing选项。
100
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)中拷入任何文件,图中所示文件在编译时会自动生成。
101
图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)。
102
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 6. 将makefile_nt.udf和user_nt.udf拷入版本信息目录(如2d)。对于并行版本需要将
这两个文件分别拷入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文件的例子:
103