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

更新时间:2024-03-15 00:16:11 阅读: 评论:0

2024年3月15日发(作者:惨无人道的意思)

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库时,和该共享库相关

的东西都被存放到ca文件中。因此,只要读取ca文件,这个库会

自动地链接到FLUENT处理过程。同样地,一个已经经过解释的UDF文

件在运行时刻被编译,用户自定义的C函数的名称与内容将会被存放

到用户的ca文件中。只要读取这个ca文件,这些函数会被自动编

译。

注:已编译的UDF所用到的目标代码库必须适用于当前所使用的计算

机体系结构、操作系统以及FLUENT软件的可执行版本。一旦用户的

FLUENT升级、操作系统改变了或者运行在不同的类型的计算机,必须

重新编译这些库。

UDF必须用DEFINE宏进行定义,DEFINE宏的定义是在udf.h文件中。因

此,在用户编译UDF之前,udf.h文件必须被放到一个可被找到的路径,

或者放到当前的工作目录中。

udf.h文件放置在:

path

//fluent6.

+x

/src/udf.h

其中path是Fluent软件的安装目录,即目录。X代表了你

所安装的版本号。

通常情况下,用户不应该从安装默认目录中复制udf.h文件。编译器

先在当前目录中寻找该文件,如果没找到,编译器会自动到/src目录

下寻找。如果你升级了软件的版本,但是没有从你的工作目录中删除

旧版本的udf.h文件,你则不能访问到该文件的最新版本。在任何情

况下都不应该改变udf.h文件。

7.2 UDF解释

这一节介绍编译经过解释的UDF的步骤。一旦经过解释的UDF被编译,

用户自定义的C函数的名称与内容将会被存放到ca文件中。只要读

取这个ca文件,这些函数便会自动被编译。

编译被解释的UDF的一般程序如下:

1. 如果用户没有在网络Windows计算机上使用并行的FLUENT版本,则

需要确定UDF的C源码和ca文件与当前工作目录一致。具体步骤见

7.2.2节。

! 如果源码不在当前工作目录,则用户编译UDF时,用户必须在解释

UDF的控制面板里输入文件的完全路径,而不是只输入文件名。

2. 在当前工作目录下运行FLUENT。

3. 读取(或建立)ca文件。

4. 打开“Interpreted UDFs panel”,编译UDF(如vprofile.c)。

图7.2.1 解释的UDF的控制面板

(a) 在“Source File Name”下输入C源码的文件名(如vprofile.c)。

! 如果自定义的C源码不在工作目录中,用户必须输入完全的自定义

的C函数路径。

当写入ca文件时,自定义源码的名称(或源码的完全路径)会存放

到ca文件中。

(b) 在“CPP Command Name”指定为C的预处理程序。当然也有其它

有效的ANSI C预处理程序,包括gcc -E和cc –E。详细检查所用

的计算机系统管理。

(c) 如果自定义函数局部变量数不引起栈的溢出,则保持“Stack

Size”的默认值为1000。此时,所设 “Stack Size” 的数要远

远大于局部变量用的数。

(d) 选择“Display Asmbly Listing”,则当函数编译汇编码的清

单会出现在窗口的控制台内。这一选项会保存于ca文件,当用

户接着运行FLUENT时汇编码会自动显示。

(e) 如果用户使用“Fluent Inc”提供的C预处理程序,选择“U

Contributed CPP”。

(f) 点击“Compile”编译UDF。

自定义C程序的名称和内容会存入于所写的ca文件。只要编译UDF,

汇编码会出现在控制窗口,所示范例如下。

(g) 编译结束点击“Clo”。

! 如果在一次模拟中使用多于一个的UDF,用户需要将这些函数连接

在一个C文件中,例如all.c。然后用“Interpreted UDFs”面板编

译连接的文件。这些函数可以作为边界条件、源项及特性等。

7.2.2 基于Windows并行网络的目录结构

在基于Windows网络上使用并行FLUENT版本需要专门的方法组织用户

文件。具体步骤如下:

1. 在“”目录下创建一个名为“udf” 的可写子目录。

2. 在udf目录下创建子目录(如myudf),将UDF的C

源码存放于这个目录下。如果在同一串下多个用户运行工作,每

个用户在udf目录下创建自己的子目录(如

abcudf和xyzudf)。

! 因为源码不在当前工作目录下,所以在编译UDF时必须在

“Interpreted UDFs”面板中输入文件的完全路径。例如,编译

example.c文件时,输入如下:

myudfexample.c

应输入用户所安装FLUENT的计算机名(如myrver)。

3. 确定所建立的ca文件在当前工作目录下。

7.2.3 调试解释的UDF

编译UDF时出错信息会出现在控制窗口中。用户有可能因错误滚动太

快不能看到所用的出错信息。因此调试UDF时用户想关掉“Display

Asmbly Listing”。

如果在调试UDF的过程中一直打开“Interpreted UDFs”面板,由于

在独立窗口进行编辑,编译按钮则会不断重复编译。然后,直到无出

错信息调试和编译才会结束。

下面介绍一个出错例子,即在“Interpreted UDFs”控制面板中,编

译被解释过的UDF时指定了错误的源文件。上面曾介绍过如果仅仅从

当前工作目录下启动FLUENT,在“Interpreted UDFs”控制面板中键

入用户的C源码的文件名,则ca文件和C源码被指定于当前工作目录

下。如果用户编译的C源码与工作目录是不同的路径,用户必须输入C

源码所在的完整路径。否则会出现以下的错误信息:

gcc: vprofile.c: No such file or directory

gcc: No input files

Error: vprofile.c: line 1: syntax error.

如果编译UDF写完ca文件后,接着移动C源码到不同位置,会在接着

运行FLUENT的过程中产生同样的错误信息。

为了避免错误,只需要在“Interpreted UDFs”控制面板中的“Source

File Name”下输入完全的路径名,然后点击“Compile”。此时写ca

文件会保存C源码的新路径。

7.3 编译UDF

这一节介绍如何链接编译好的UDF。这一过程需要使用C编译器。大部

分UNIX的操作系统提供了C编译器。如果在PC机上运行,需要安装VC++

编译器(如微软C++、v6.0或更高的版本)。一旦编译好的UDF库文件

在FLUENT运行时链接到FLUENT处理过程,和共享库相关的东西会保存

到ca文件。因此,只要读取ca文件,编译的库文件会自动链接到

FLUENT处理过程。在控制窗口将会出现链接状态的报告如下:

Opening library "libp1/ultra/2d/"...

p1_adjust

energy_source

p1_source

p1_diffusivity

p1_bc

Done.

7.3.1 一般程序

编译和链接一个编译好的UDF的一般程序如下所示:

1. 在当前工作目录下,建立专门的目录结构(见7.3.2节)。

2. 编译用户的UDF和修建共享库(见7.3.3节)。

3. 在当前工作目录下运行FLUENT。

4. 读取(或建立)ca文件(确信ca文件在当前工作目录下)。

5. 链接共享库到FLUENT(见7.3.4节)。

7.3.2 建立目录结构

对于UNIX系统和Windows系统来说,目录结构是不同的。下面分别介

绍在两种系统下如何建立目录结构。

UNIX系统

对于UNIX系统下编译的UDF来说,和2两个

文件在编译UDF库被需要。makefile文件包含了用户自定义部分,在

这部分允许输入用户源函数和FLUENT的安装路径。这些文件的完整路

径如下:

path

//fluent6.

+x

/src/

path

//fluent6.

+x

/src/2

其中

path是用户直接安装

的路径,

x是用户安装

Fluent

本的相应数(如,

fluent6.0为0)。

! FLUENT安装后所释放的2文件名为。

下面介绍建立共享库所要求的目录结构。通过下面的例子来介绍目录

结构的建立,如图7.3.1所示。

图7.3.1 为编译好的UDF建立库目录的样本(UNIX)

需要注意的是在图7.3.1所示的目录结构为FLUENT的两种版本:二维

单精度串型和二维单精度平行。

!不要在目录(2d,2d host,等等)下存放任何文件。当编译用户库

(见7.3.3节)时,图7.3.1中所示的文件会自动存放。

1. 在当然工作目录下,创建一个储存用户库的目录(如libudf)。

2. 从以上所示目录下复制2到用户目录(如libudf),

且改名为Makefile。

3. 在用户创建的库目录下,建立一个储存用户源码、命名为src的源

码目录。

4. 复制用户源码(如udfexample.c)到所建的/src目录下。

5. 从以上所示目录下复制到用户的/src目录,并且命

名为makefile。

6. 鉴别FLUENT所运行的计算机的体系机构。

(a) 开始FLUENT程序。

(b) 向上滚动FLUENT的控制窗口到“Starting”信息处,鉴定FLUENT

的体系机构。

(c) 退出FLUENT程序。

! 如果体系机构是irix6.5,需要在makefile进行额外的修改。

7. 为体系机构所建不同版本下创建目录(如ultra/2d和ultra/3d)。

存在的版本如下所示:

z single-precision rial 2D or 3D: 2d or 3d

z double-precision rial 2D or 3D: 2ddp or 3ddp

z single-precision parallel 2D or 3D: 2d_node and

2d_host or 3d_node and 3d_host

z double-precision parallel 2D or 3D: 2ddp_node and

2ddp_host or 3ddp_node and 3ddp_host

! 需要注意:不管计算节点的数量,用户必须为每个并行版本的求解

器(如在三维下有两个目录,二维双精度版本下有两个目录,等等)

创建两个调试目录。

!不要在目录(2d,2d host,等等)下存放任何文件。当编译用户库

(见7.3.3节)时,图7.3.1中所示的文件会自动存放。

Windows系统

对于Windows系统下编译的UDF来说,makefile_和ur_

两个文件在编译UDF库被需要。ur_文件中包含了用户自定义

部分,在这部分允许输入用户源函数及其它信息。

为了建立共享库所要求的目录结构,需要按照上面所讲的操作步骤进

行。通过下面的例子来介绍目录结构的建立,如图7.3.2所示。

需要注意的是在图7.3.2所示的目录结构为FLUENT的两种版本:二维

单精度串型和二维单精度并行。

图7.3.2 为编译好的UDF建立库目录的样本(Windows)

1. 在当前工作目录下,创建一个储存用户库的目录(如libudf)。

2. 在用户创建的库目录下,建立一个储存用户源码、命名为src的源

码目录。

3. 复制用户源码(如udfexample.c)到所建的/src目录下。

4. 建立所使用体系机构的目录,如基于Windows的Intel系统使用的

目录为ntx86。

5. 针对所用的体系机构建立不同版本的目录(如ntx862d)。存在

的版本如下所示:

z single-precision rial 2D or 3D: 2d or 3d

z double-precision rial 2D or 3D: 2ddp or 3ddp

z single-precision parallel 2D or 3D: 2d_node and

2d_host or 3d_node and 3d_host

z double-precision parallel 2D or 3D: 2ddp_node and

2ddp_host or 3ddp_node and 3ddp_host

! 需要注意:不管计算节点的数量,用户必须为每个并行版本的求解

器(如在三维下有两个目录,二维双精度版本下有两个目录,等等)

创建两个调试目录。

6.复制makefile_和ur_到相应版本所建的目录下,如

2d。

! 对于并行的版本来说,一定要复制这两个文件到主机和节点目录,

即如图7.3.2所示的2d_node and 2d_host目录。

这两个文件的完整路径如下:

path

ent6.

+x

srcmakefile_

path

ent6.

+x

srcur_

其中

path是用户直接安装

的路径,

x是用户安装

Fluent

本的相应数(如,

fluent6.0为0)。

! 确定makefile_和ur_为最新版本所用文件。如果安

装新的FLUENT 6版本,必须复制新的makefile_和

ur_到相应的创建目录。

7. 重命名makefile_为makefile。

7.3.3 编译和创建用户共享库

下面分别介绍UNIX和Windows系统下如何编译和创建共享库。

UNIX系统

在建立目录并存放文件到相应位置后,便能开始编译和创建共享库。

1. 在用户的src目录下编辑文件makefile,设置参数如下:

z SOURCES = 编译好的用户自定义函数

z FLUENT INC = 用户的安装路径

下面是一个makefile的例子:

#-----------------------------------------------------

------#

# makefile for ur defined functions.

#

#-----------------------------------------------------

------#

#-----------------------------------------------------

------#

# Ur modifiable ction.

#-----------------------------------------------------

------#

SOURCES= udfexample.c

FLUENT_INC= /path/

#-----------------------------------------------------

------#

# Build targets (do not modify below this line).

#-----------------------------------------------------

------#

.

.

2. 如果体系机构是irix6.5,还需要在makefile中进行附加变化。

(a) 找到makefile文件中找到下面的命令行

CFLAGS_IRIX6R10= -KPIC -ansi -fullwarn -O -n32

(b) 改变“-ansi”为“-xansi”,即

CFLAGS_IRIX6R10= -KPIC -xansi -fullwarn -O -n32

对于其它的体系机构不需要进行以上变动。

3. 在工作目录(如libudf)下,执行make命令,包含前一步(在7.3.2

节)确定的体系机构(如ultra),即

make "FLUENT ARCH=ultra"

控制窗口显示信息为:

# linking to ../../src/udfexample.c in ultra/2d

# linking to ../../src/makefile in ultra/2d

# building library in ultra/2d

# linking to ../../src/udfexample.c in ultra/3d

# linking to ../../src/makefile in ultra/3d

# building library in ultra/3d

以上面的makefile为例,用户自定义函数udfexample.c被编译和存放

于版本所指定的共享库中,如在图7.3.1中所示的2d,

2d_host和2d_node。虽然在这个例子中只用了一个C函数,但是用户

在“SOURCES = in the makefile”下可通过空格分隔多个源文件。

Windows系统

在建立目录并存放文件到相应位置后,便能开始编译和创建共享库。

1. 用文本文件编译ur_文件,设置参数为:

z SOURCES =编译好的用户自定义函数。在每个文件前加前缀

$(SRC),如 一个函数为$(SRC)udfexample.c,两个函数

为$(SRC)udfexample.c $ (SRC)udfexample2.c)。

z VERSION =所用版本,即如图7.3.2所示2d,3d,2ddp,3ddp,

2d host,2d node,3d host,3d node,2ddp host,2ddp node,

3ddp host,或3ddp node。

z PARALLEL NODE =并行连接库。对于求解器的一系列版本无指

定的并行连接库。可能的输入为:

-{ none: rial

-{ smpi: parallel using shared memory (for

multiprocessor machines)

-{ vmpi: parallel using shared memory or network with

vendor MPI software

-{ net: parallel using network communicator with

RSHD software

! 如果使用的是并行求解器,需要复制两个ur_文件(一个

是主目录的,一个是节点目录),并且指定两个文件适当的SOURCE,

VERSION, and PARALLEL NODE。

下面给出ur_文件的一个例子:

对于指定多个用户定义函数只需要在SOURCES下输入它们,并用空格

分开即可。

2. 在MS-DOS 命令提示窗口,键入nmake建立目录,如

libudfntx862d。

需要注意的是如果创建存在问题,通过键入nmake clean来进行完

整的重建。

7.3.4 连接共享库到FLUENT可执行文件

按照7.3.3小节所示的unix或windows环境下的步骤编译共享库后,就

可以将其连接到FLUENT程序中。将共享库连接到FLUENT程序中的步骤

如下:

1. 从当前工作目录下启动FLUENT。

2. 读取(或设置)ca文件。(确认此ca文件保存在当前的工作

目录下。)

3. 连接共享库到FLUENT执行文件中。

(a) 如果共享库保存在当前工作目录中,在Library Name对话框中

输入相对路径(例如, libudf), 否则输入完整路径,(例如,

~myhome/myfiles/libudf).

!注意,如果存放共享库的目录不在当前的工作目录或其子目录下,

一定要输入完整的路径名。

(b) 单击Open按钮,这会将共享库连接到FLUENT执行文件中。求

解器会自动搜索相应的结构格式和版本。一旦共享库连接到

FLUENT执行文件以及ca文件被写入以后,此连接关系就被保存

在ca文件中。因此,无论何时将ca文件读入FLURENT,此共

享库都会被自动连接。

7.3.5 编译和连接共享库时常见的错误

指定库的名称

仅当从当前的工作目录下运行FLUENT并且共享库的目录是当前工作

目录的子目录时,才可以在Compiled UDFs 面板上直接输入共享库的

目录(例如libudf)。如果被使用的共享库不在上述位置上,连接此共

享库时,必须提供其完整的路径。否则会出现以下错误:

Opening library "libudf/ultra/3d/"...

Error: open_udf_library: couldn't open library:

libudf/ultra/3d/

如果将共享库移至其他的位置,而要读入的ca文件又包含此共享库

的连接,也会出现上述错误信息。

解决方法

为了解决这个问题,可以在Library Name in the Compiled UDFs 面

板上输入共享库的完整路径,然后单击Open按钮。虽然同样的错误信

息仍将出现,但是新的路径会保存在ca文件中。重新读入ca文件

就会得到正确的连接。

使用不同版本的FLUENT

如果采用一个版本的FLUENT(例如6.0.1)编译UDF,而试图采用另一个

不同的版本(例如6.0.2)读入ca文件时,会出现以下错误:

Error: open_udf_library: library version 6.0.1 incompatible

with solver version 6.0.2

解决办法

用新版本的FLUENT重新编译UDF,然后再次读入ca文件。

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

本文发布于:2024-03-15 00:16:11,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/zhishi/a/1710432971161012.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:Fluent中的UDF详细中文教程(7).doc

本文 PDF 下载地址:Fluent中的UDF详细中文教程(7).pdf

标签:文件   目录   编译
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 实用文体写作网旗下知识大全大全栏目是一个全百科类宝库! 优秀范文|法律文书|专利查询|