- ANSYS Fluent 二次开发指南
- 胡坤编著
- 3657字
- 2025-02-28 19:42:09
2.2 编译型UDF
编译型UDF的构建方式与ANSYS Fluent可执行文件自身的构建方式相同。在代码构建过程中,其利用一个名为Makefile的脚本文件来调用C编译器构建一个目标代码库。该对象库与其编译过程中所使用的Fluent版本及计算机体系结构相关。因此,若改变了计算机操作系统或Fluent版本,UDF对象库必须重新构建。UDF的编译过程通常涉及源代码的编译和加载两个步骤。
编译/构建过程需要一个或多个UDF的源文件(例如myudf.c),并将它们编译成对象文件(例如myudf.o或myudf.obj),之后将其构建成一个共享库(例如libudf.dll)与目标文件。
如果使用GUI方式编译源文件,则当用户单击“Compiled UDF”对话框中的“Build”按钮时,将执行编译/构建过程。Fluent软件将自动为用户基于在该会话期间运行的ANSYS Fluent的体系结构和版本(例如hpux11/2d)构建用户命名的共享库(例如libudf),并存储UDF对象文件。
如果使用TUI方式编译源文件,则首先必须设置共享库的目标文件夹,同时修改名为Makefile的脚本文件以指定源参数,然后执行Makefile文件实现源代码的编译与构建。使用TUI方式编译UDF具有允许从非ANSYS Fluent源文件派生的预处理对象文件链接到ANSYS Fluent的诸多优点,这些功能用GUI编译无法实现。
构建共享库(使用TUI或GUI)后,将UDF库加载到ANSYS Fluent中,然后再使用它。可以使用“Compiled UDFs”对话框中的“Load”按钮来执行此操作。加载完成后,共享库中包含的所有已编译的UDF将在ANSYS Fluent的图形对话框中变为可见和可选。
注 意
编译的UDF显示在ANSYS Fluent对话框中,相关联的UDF库名称由两个冒号“::”分隔。例如,与名为libudf的共享库相关联的名为rrate的编译UDF将出现在ANSYS Fluent对话框中,如rrate::libudf。此名称可以区分解释型UDF和编译型UDF。
如果在加载UDF库时写入case文件,则库将与case文件一起保存,并在之后读取该case 文件时自动加载。这种“动态加载”过程可以节省用户每次运行模拟时重新加载编译库的时间。
2.2.1 C编译器
不管是使用GUI还是使用TUI方式编译UDF,都需要使用本机运行的操作系统以及C编译器。大多数的Linux操作系统上都已经集成了C编译器,但是如果是在Microsoft Windows系统上编译UDF,则在编译之前必须确保本机上已经安装了MicroSoft Visual Studio。对于Linux机器,ANSYS Fluent支持任意符合ANSI标准的C编译器(如GCC)。
在进行UDF编译之前,需要设置编译环境,这通常可以通过修改UDF.bat文件来实现。如图2-3所示。

图2-3 Fluent环境设置
2.2.2 GUI方式编译UDF
利用GUI方式编译UDF源文件、构建共享库以及加载UDF库到Fluent中,可以采用以下步骤。
注 意
在Windows系统下编译UDF,必须预先安装Visual Studio。在安装Visual Studio时,确保选择安装C++语言,这样才会安装C编译器。
步骤1:确保要编译的UDF源文件与cas和dat文件在同一工作路径下。
步骤2:读取(或创建)case文件。
步骤3:打开Compiled UDFs对话框,如图2-4所示。可通过树形菜单Parameters & Customization→User Defined Functions→Compiled...启动该对话框。

图2-4 编译对话框
步骤4:在Compiled UDF对话框中点击按钮Add...添加源文件和头文件。
步骤5:在Library Name后的文本框中输入共享库的名称,之后点击Build按钮构建共享库。其间会弹出如图2-5所示的提示对话框。可以选择无视,点击OK按钮继续。

图2-5 提示对话框
编译完成后会在TUI窗口出现如图2-6所示的对话框。仔细检查提示信息,没有出现error则表示编译成功。图中出现有乱码,不知道是从Fluent哪个版本开始就出现这种情况,可以不用管。

图2-6 提示信息
步骤6:点击Load按钮加载UDF。如果没有错误,加载完housing会在TUI窗口中出现如图2-7所示的对话框,其中会显示UDF宏名称,如图中所示的velocity和domainInit。

图2-7 编译完成信息
2.2.3 命令行方式编译UDF
除了可以利用图形界面编译UDF外,Fluent还提供了利用命令行命令的方式编译UDF。利用命令行方式进行编译,能够允许用户调用一些非Fluent源文件之外的库文件。采用该方式编译UDF,通常首先需要创建好文件目录结构,之后编辑makefile文件,利用makefile文件编译源文件。
(1)创建文件目录结构
在Windows系统中编译UDF,需要两个文件makefile_nt.udf与user_nt.udf。特别重要的是在user_nt.udf文件中指定源文件编译参数。构建文件目录结构采用以下步骤:
步骤1:在当前工作目录下,创建新的文件夹存储UDF库,例如创建文件夹libudf。
步骤2:在libudf文件夹下创建新的文件夹,命名为src。
步骤3:将所有UDF源文件放入src文件夹中。
步骤4:在libudf文件夹下创建架构文件夹。如64bit Windows操作系统,则创建win64文件夹,路径为libudf\win64。
步骤5:在架构文件(libudf\win64)下创建Fluent版本文件夹。如是单精度2d版本,则创建文件夹2d。一些版本信息如表2-1所示。文件路径如图2-8所示。
表2-1 版本及对应的文件夹


图2-8 文件路径
注 意
注意:在编译并行UDF时,需要创建两个版本文件夹。
步骤6:从Fluent安装路径中(如c:\ANSYS Inc\v180\fluent\fluent18.0.0\src\udf)拷贝文件user_nt.udf到所有的版本子文件夹中(如libudf\win64\3d)。
步骤7:从Fluent安装路径中(如c:\ANSYS Inc\v180\fluent\fluent18.0.0\src\udf)拷贝文件makefile_nt.udf到所有的版本子文件夹中(如libudf\win64\3d),并改名为makefile。
注 意
若在Fluent外部编译UDF,则需要添加环境变量FLUENT_INC、FLUENT_ARCH到user_nt.udf文件中。
Linux环境下的文件目录设置与此有些许差异。
(2)编译文件
当文件目录设置完毕并且所有文件已经放置到指定位置后,就可以利用TUI来编译及构建UDF共享库。在Windows系统中,采用以下步骤:
步骤1:修改user_nt.udf文件。修改文件中的四个参数:CSOURCES、HSOURCES、VERSION以及PARALLEL_NODE。user_nt.udf文件内容类似图2-9所示。
CSOURCES=:指定要编译的UDF源文件。在所有文件名前面加上前缀$(SRC)。多个文件可以连着写,如“(SRC)udfexample1.c(SRC)udfexample2.c”。
HSOURCES=:指定要编译的UDF头文件。同样在所有文件名前面加上$(SRC)前缀。多个文件可以连着写,如“(SRC)udfexample1.h(SRC)udfexample2.h”。

图2-9 文件内容
VERSION=:运行的求解器版本信息,与user_nt.udf文件所在文件夹保持一致。可输入的版本信息包括2d, 3d, 2ddp, 3ddp, 2d_host, 2d_node, 3d_host, 3d_node, 2ddp_host, 2ddp_node, 3ddp_host, or 3ddp_node。
PARALLEL_NODE=:指定并行通信库。指定为None表示采用串行,其他并行包括:ibmmpi(利用IBM MPI并行)、intel(利用intel MPI并行)以及msmpi(利用微软MPI)。在并行计算中需要同时设置host及node文件夹下的user_nt.udf文件。
步骤2:利用Visual Studio命令行界面进入每一个版本文件夹(如libudf\win64\2d),输入nmake执行编译操作。若编译存在问题,可以在修改源文件后通过执行nmake clean及nmake重新编译。
2.2.4 GCC方式编译UDF
(1)下载并安装GCC
Fluent UDF编译之所以需要依赖Visual Studio,主要原因是因为Fluent并未内置任何C编译器。当前用于C/C++的编译器较多,除了微软的MSVC(就是集成在Visual Studio中的编译器),比较有名的还有GCC/G++(基于GNU的C/C++编译器,在Linux系统下很流行)、ICC(Intel的C/C++编译器,针对Intel体系有特别优化)、Clang(近几年风头很火的C/C++编译器,基于BSD协议)、IBM XL C++(IBM的编译器,在IBM硬件及平台上表现优异)等。
Fluent UDF实质上也是一段完整的C代码,编译型UDF需要利用编译器将这段代码编译成动态链接库(.dll),方便在运行时加载。因此理论上来说任何一款完善的C/C++编译器都可以胜任这项工作。
GCC是Linux的主力C/C++编译工具,在Windows系统下也有一些基于GCC的编译工具,比较典型的如MinGW、MinGW-win64及TDM-GCC等。
下面描述采用TDM-GCC作为Fluent UDF编译器的基本过程。
进入TDM-GCC官网下载软件。根据操作系统选择不同版本的tdm-gcc进行下载,见图2-10。本书下载tdm64-gcc-5.1.0-2.exe。

图2-10 下载位置
TDM-GCC的安装较为简单,双击后一路Next即可。
安装完毕后,可打开命令提示符窗口或PowerShell,在其中输入g++,若显示如图2-11所示信息,表示安装成功。若出现g++不是内部或外部命令之类的提示,则表示未安装好,此时可能需要将TDM-GCC的安装路径添加到环境变量Path中。

图2-11 测试GCC的安装
在TDM-GCC安装文件夹中找到可执行文件gendef.exe所在路径,如本机安装路径为D:\TDM-GCC-64\x86_64-w64-mingw32\bin,将该路径添加到环境变量的Path中,如图2.12所示。

图2-12 添加环境变量
注 意
添加环境变量的目的只是为了方便后面调用。不添加的话后面调用时需要使用gendef.exe的完整路径。
(2)生成库文件
① 命令行中利用cd命令进入到Fluent的库文件目录。这些文件夹包含C:\Program Files\ANSYS Inc\v201\fluent\fluent20.1.0\win64\下的所有文件夹以及C:\Program Files\ANSYS Inc\v201\fluent\fluent20.1.0\multiport\win64下的所有文件夹。
这些文件夹如下:
C:\Program Files\ANSYS Inc\V201\fluent\fluent20.1.0\win64\2d C:\Program Files\ANSYS Inc\V201\fluent\fluent20.1.0\win64\2d_host C:\Program Files\ANSYS Inc\V201\fluent\fluent20.1.0\win64\2d_node C:\Program Files\ANSYS Inc\V201\fluent\fluent20.1.0\win64\2ddp C:\Program Files\ANSYS Inc\V201\fluent\fluent20.1.0\win64\2ddp_host C:\Program Files\ANSYS Inc\V201\fluent\fluent20.1.0\win64\2ddp_node C:\Program Files\ANSYS Inc\V201\fluent\fluent20.1.0\win64\3d C:\Program Files\ANSYS Inc\V201\fluent\fluent20.1.0\win64\3d_host C:\Program Files\ANSYS Inc\V201\fluent\fluent20.1.0\win64\3d_node C:\Program Files\ANSYS Inc\V201\fluent\fluent20.1.0\win64\3ddp C:\Program Files\ANSYS Inc\V201\fluent\fluent20.1.0\win64\3ddp_host C:\Program Files\ANSYS Inc\V201\fluent\fluent20.1.0\win64\3ddp_node C:\Program Files\ANSYS Inc\V201\fluent\fluent20.1.0\multiport\win64\mpi\shared C:\Program Files\ANSYS Inc\V201\fluent\fluent20.1.0\multiport\win64\net\shared
以2d文件夹为例,利用以下命令生成def文件:
cd ”C:\Program Files\ANSYS Inc\v201\fluent\fluent20.1.0\win64\2d” gendef fl2010.exe
然而有时候会出错,出现如图2-13所示提示,主要原因在于文件权限所致。

图2-13 创建def文件错误提示
注 意
这里ANSYS安装到了系统盘C盘,由于Win10系统对C盘的保护,默认情况下系统盘中的文件夹是没有写操作权限的。而这里需要在当前文件夹中创建def文件,因此会操作失败。若ANSYS安装在非系统盘,则不会出现这个问题。
解决权限问题后生成def文件如图2-14所示。

图2-14 创建def文件成功
② 运行以下命令生成a文件,如图2-15所示。
dlltool --dllname fl2010.exe --def fl2010.def --output-lib fl2010.a

图2-15 创建a文件
注 意
这里需要花费较长时间。
此时2d文件夹下多出了一个文件名为fl2010.a的文件,如图2-16所示。

图2-16 生成新文件
③ 对win64文件夹中的所有子文件夹执行上面的操作。确保所有win64文件夹中的子文件中均包含有def文件及a文件。
需要注意,对于以下文件目录:
c:\Program Files\ANSYS Inc\v201\fluent\fluent20.1.0\win64\2d_node c:\Program Files\ANSYS Inc\v201\fluent\fluent20.1.0\win64\2ddp_node c:\Program Files\ANSYS Inc\v201\fluent\fluent20.1.0\win64\3d_node c:\Program Files\ANSYS Inc\v201\fluent\fluent20.1.0\win64\3ddp_node
使用命令:
gendef fl_mpi2010.exe dlltool --dllname fl_mpi2010.exe --def fl_mpi2010.def --output-lib fl_mpi2010.a
对于以下路径:
c:\Program Files\ANSYS Inc\v201\fluent\fluent20.1.0\multiport\win64\mpi\shared c:\Program Files\ANSYS Inc\v201\fluent\fluent20.1.0\multiport\win64\net\shared
使用命令:
gendef mport.dll dlltool --dllname mport.dll --def mport.def --output-lib mport.a
(3)编译UDF
编译UDF所需的头文件如下:
c:\Program Files\ANSYS Inc\v201\fluent\fluent20.1.0\win64\2d c:\Program Files\ANSYS Inc\v201\fluent\fluent20.1.0\src\main c:\ Program Files\ANSYS Inc\v201\fluent\fluent20.1.0\src\addon-wrapper c:\Program Files\ANSYS Inc\v201\fluent\fluent20.1.0\src\io c:\Program Files\ANSYS Inc\v201\fluent\fluent20.1.0\src\species c:\Program Files\ANSYS Inc\v201\fluent\fluent20.1.0\src\pbns c:\Program Files\ANSYS Inc\v201\fluent\fluent20.1.0\src\numerics c:\Program Files\ANSYS Inc\v201\fluent\fluent20.1.0\src\sphysics c:\Program Files\ANSYS Inc\v201\fluent\fluent20.1.0\src\storage c:\Program Files\ANSYS Inc\v201\fluent\fluent20.1.0\src\mphase c:\Program Files\ANSYS Inc\v201\fluent\fluent20.1.0\src\bc c:\Program Files\ANSYS Inc\v201\fluent\fluent20.1.0\src\models c:\Program Files\ANSYS Inc\v201\fluent\fluent20.1.0\src\material c:\Program Files\ANSYS Inc\v201\fluent\fluent20.1.0\src\amg c:\Program Files\ANSYS Inc\v201\fluent\fluent20.1.0\src\util c:\Program Files\ANSYS Inc\v201\fluent\fluent20.1.0\src\mesh c:\Program Files\ANSYS Inc\v201\fluent\fluent20.1.0\src\udf c:\Program Files\ANSYS Inc\v201\fluent\fluent20.1.0\src\ht c:\Program Files\ANSYS Inc\v201\fluent\fluent20.1.0\src\dx c:\Program Files\ANSYS Inc\v201\fluent\fluent20.1.0\src\turbulence c:\Program Files\ANSYS Inc\v201\fluent\fluent20.1.0\src\parallel c:\Program Files\ANSYS Inc\v201\fluent\fluent20.1.0\src\etc c:\Program Files\ANSYS Inc\v201\fluent\fluent20.1.0\src\ue c:\Program Files\ANSYS Inc\v201\fluent\fluent20.1.0\src\dpm c:\Program Files\ANSYS Inc\v201\fluent\fluent20.1.0\src\dbns C:\Program Files\ANSYS Inc\v201\fluent\fluent20.1.0\src\acoustics c:\Program Files\ANSYS Inc\v201\fluent\fluent20.1.0\cortex\src c:\Program Files\ANSYS Inc\v201\fluent\fluent20.1.0\client\src c:\Program Files\ANSYS Inc\v201\fluent\fluent20.1.0\tgrid\src c:\Program Files\ANSYS Inc\v201\fluent\fluent20.1.0\multiport\src c:\Program Files\ANSYS Inc\v201\fluent\fluent20.1.0\multiport\mpi_wrapper\src
进入UDF源代码所在路径,如E:\demo。执行以下命令:


若要编译并行版,则需要创建两个文件夹,如2d并行版需要创建文件夹2d_host与2d_node。
编译完成后在相应文件夹中生成libudf.dll文件,如图2-17所示。

图2-17 编译完成