Fluent版本:19.0 

前面我们介绍过使用VS来编译和调试UDF,其实我们也可以用GCC来编译UDF、gdb调试UDF。本次介绍的方法更具有通用性,也适用于Linux下Fluent的UDF编译和调试

首先我们介绍使用GCC来编译UDF

我习惯使用TDM-GCC,下载地址为:

http://tdm-gcc.tdragon.net/download

centos系统ANSYS totem安装教程_2d

下面就安装TDM-GCC

centos系统ANSYS totem安装教程_2d_02

centos系统ANSYS totem安装教程_3d_03

centos系统ANSYS totem安装教程_3d_04

centos系统ANSYS totem安装教程_双精度_05

centos系统ANSYS totem安装教程_2d_06

centos系统ANSYS totem安装教程_双精度_07

centos系统ANSYS totem安装教程_2d_08

centos系统ANSYS totem安装教程_3d_09

安装完TDM-GCC

centos系统ANSYS totem安装教程_3d_10

在TDM-GCC安装目录下查找gendef.exe,我的路径是I:\TDM-GCC-64\x86_64-w64-mingw32\bin

然后我们启动一个cmd窗口

centos系统ANSYS totem安装教程_2d_11

转到Fluent的库文件目录下,我的目录分别为:

I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\2d
 I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\2d_host
 I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\2d_node
 I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\2ddp
 I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\2ddp_host
 I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\2ddp_node
 I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\3d
 I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\3d_host
 I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\3d_node
 I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\3ddp
 I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\3ddp_host
 I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\3ddp_node
 I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\multiport\win64\mpi\shared
 I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\multiport\win64\net\shared
 我们以I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\2d

为例:

将cmd窗口转到目录下

centos系统ANSYS totem安装教程_3d_12

然后生成def文件

centos系统ANSYS totem安装教程_3d_13

centos系统ANSYS totem安装教程_双精度_14

然后根据def生成GCC能识别的库

centos系统ANSYS totem安装教程_2d_15

centos系统ANSYS totem安装教程_双精度_16

其余的目录根据上面的操作重复即可,注意一下

I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\2d_node
 I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\2ddp_node
 I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\3d_node
 I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\3ddp_node
 命令:
 "I:\TDM-GCC-64\x86_64-w64-mingw32\bin\gendef.exe" fl_mpi1900.exe
 生成def文件
 命令:
 dlltool --dllname fl_mpi1900.exe --def fl_mpi1900.def --output-lib fl_mpi1900.a
 生成GCC的库
 而
 I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\multiport\win64\mpi\shared
 I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\multiport\win64\net\shared
 命令:
 "I:\TDM-GCC-64\x86_64-w64-mingw32\bin\gendef.exe" mport.dll
 生成def文件
 命令:
 dlltool --dllname mport.dll --def mport.def --output-lib mport.a

生成GCC的库

注意:以上步骤只需要第一次进行操作,以后再编译的时候就无需重复上面的步骤了,可直接使用这些已经生成的库 

然后我们就可以编译UDF了(以二维双精度为例),但是UDF的写法必须按照下面的写法 

centos系统ANSYS totem安装教程_双精度_17

Fluent相关的头文件:

I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\2ddp
 I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\main
 I:\ Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\addon-wrapper
 I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\io
 I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\species
 I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\pbns
 I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\numerics
 I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\sphysics
 I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\storage
 I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\mphase
 I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\bc
 I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\models
 I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\material
 I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\amg
 I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\util
 I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\mesh
 I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\udf
 I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\ht
 I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\dx
 I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\turbulence
 I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\parallel
 I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\etc
 I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\ue
 I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\dpm
 I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\dbns
 I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\cortex\src
 I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\client\src
 I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\tgrid\src
 I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\multiport\src
 I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\multiport\mpi_wrapper\src

注意:此处需要注意一下:请务必严格按照上面的头文件顺序!

示例是二维双精度的UDF,所以是

I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\2ddp

 

如果是二维双精度并行UDF,那么就需要编译两次

对于host,那么就是

I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\2ddp_host

对于node,那么就是

I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\2ddp_node

 

如果是二维单精度就需要改变为:

I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\2d

 

如果是二维单精度并行UDF,那么就需要编译两次

对于host,那么就是

I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\2d_host

对于node,那么就是

I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\2d_node

 

如果是三维双精度就需要改变为:

I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\3ddp

 

如果是三维双精度并行UDF,那么就需要编译两次

对于host,那么就是

I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\3ddp_host

对于node,那么就是

I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\3ddp_node

 

如果是三维单精度就需要改变为:

I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\3d

 

如果是三维单精度并行UDF,那么就需要编译两次

对于host,那么就是

I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\3d_host

对于node,那么就是

I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\3d_node 

在cmd窗口转入UDF源代码所在目录,我的是N:\demo_case 

centos系统ANSYS totem安装教程_2d_18

然后输入下面的命令

centos系统ANSYS totem安装教程_2d_19

mkdir .\libudf\win64\2ddp && gcc -shared -o .\libudf\win64\2ddp\libudf.dll demo.c "I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\2ddp\fl1900.a" -I. -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\2ddp" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\main" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\addon-wrapper" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\io" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\species" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\pbns" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\numerics" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\sphysics" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\storage" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\mphase" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\bc" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\models" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\material" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\amg" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\util" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\util" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\mesh" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\udf" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\ht" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\dx" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\turbulence" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\parallel" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\etc" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\ue" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\dpm" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\dbns" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\cortex\src" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\client\src" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\tgrid\src" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\multiport\src" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\multiport\mpi_wrapper\src"

 简单解释一下上面的命令:

mkdir .\libudf\win64\2ddp表示首先创建放置UDF生成文件的目录,否则后面直接编译的话,GCC不会自动生成目录从而造成编译出错

&&表示目录创建成功才能进行后面的命令

-o .\libudf\win64\2ddp\libudf.dll表示生成的UDF文件并且将其生成在前面生成的目录下

demo.c "I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\2ddp\fl1900.a"其中demo.c表示前面编写的UDF源代码,而后面这个是GCC需要连接的Fluent的库,我们这里是二维双精度,所以是

"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\2ddp\fl1900.a"

如果是二维单精度

"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\2d\fl1900.a"

如果是三维双精度

"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\3ddp\fl1900.a"

如果是三维单精度

"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\3d\fl1900.a"

编译完成 

centos系统ANSYS totem安装教程_双精度_20

我们打开Fluent 

centos系统ANSYS totem安装教程_2d_21

 

centos系统ANSYS totem安装教程_3d_22

centos系统ANSYS totem安装教程_3d_23

centos系统ANSYS totem安装教程_双精度_24

centos系统ANSYS totem安装教程_双精度_25

centos系统ANSYS totem安装教程_双精度_26

当然我们也可以用C++的方式来编译,只需要将UDF按照如下的方式来改写即可,上面编译的命令gcc改为g++即可 

接下来我们介绍如何使用gdb来调试UDF,原始的gdb是命令行来操作非常不方便

centos系统ANSYS totem安装教程_双精度_27

这里的gdb我们采用gdbgui,可以在浏览器中通过图形化界面的方式来对UDF程序进行调试

gdbgui下载地址:https://gdbgui.com/downloads.html

虽然gdbgui有打包好的exe包,但是这个包已经过时,无法用来调试UDF,所以我们采用python安装的方式安装最新的gdbgui

首先我们需要安装python,推荐anaconda,推荐从清华大学开源软件镜像站下载,下载链接:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/

我使用的版本是Anaconda2-4.1.1,当然也可以按照自己的需要来下载安装,安装过程不清楚的话,可参考:

然后打开cmd窗口,转入anaconda安装目录下的Scripts目录(我的是I:\Anaconda2\Scripts),如果不转到该目录下可能会安装出现问题 

centos系统ANSYS totem安装教程_3d_28

然后输入pip install gdbgui --upgrade命令

centos系统ANSYS totem安装教程_2d_29

安装完成

centos系统ANSYS totem安装教程_2d_30

我在用python3安装gdbgui的时候,maskupsafe可能会失败,只需要单独下载安装包本地安装即可,下载链接:

https://www.lfd.uci.edu/~gohlke/pythonlibs/,其他问题还可参考

在cmd当中输入gdbgui test命令

centos系统ANSYS totem安装教程_双精度_31

表示安装成功

接下来我们介绍如何使用gdbgui来调试UDF

首先我们编写如下的UDF源码:

centos系统ANSYS totem安装教程_双精度_32

然后我们转入算例目录,在cmd下输入下面的命令:

mkdir .\libudf\win64\2ddp && gcc -O0 -g -shared -o .\libudf\win64\2ddp\libudf.dll demo.c "I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\2ddp\fl1900.a" -I. -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\win64\2ddp" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\main" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\addon-wrapper" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\io" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\species" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\pbns" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\numerics" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\sphysics" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\storage" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\mphase" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\bc" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\models" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\material" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\amg" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\util" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\util" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\mesh" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\udf" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\ht" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\dx" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\turbulence" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\parallel" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\etc" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\ue" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\dpm" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\src\dbns" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\cortex\src" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\client\src" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\tgrid\src" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\multiport\src" -I"I:\Program Files\ANSYS Inc\v190\fluent\fluent19.0.0\multiport\mpi_wrapper\src"

注意:稍微解释一下上面这个命令的参数:

-O0表示不做任何优化,其实是默认选项,这里不写也可以,启用这个选项就是为了防止后面调试的错误。

 

-g 此参数是必须,用来产生供gdb调试用的可执行文件,否则无法用gdb进行调试。

我们启动Fluent

centos系统ANSYS totem安装教程_双精度_33

centos系统ANSYS totem安装教程_3d_34

centos系统ANSYS totem安装教程_2d_35

然后再返回cmd当中输入gdbgui

centos系统ANSYS totem安装教程_双精度_36

centos系统ANSYS totem安装教程_2d_37

打开任务管理器

centos系统ANSYS totem安装教程_2d_38

centos系统ANSYS totem安装教程_双精度_39

centos系统ANSYS totem安装教程_3d_40

我们也可以在Fluent当中使用TUI命令来查看PID号

centos系统ANSYS totem安装教程_3d_41

回到gdbgui打开的浏览器页面

centos系统ANSYS totem安装教程_3d_42

centos系统ANSYS totem安装教程_3d_43

centos系统ANSYS totem安装教程_双精度_44

centos系统ANSYS totem安装教程_双精度_45

centos系统ANSYS totem安装教程_双精度_46

centos系统ANSYS totem安装教程_双精度_47

我们返回Fluent当中

centos系统ANSYS totem安装教程_3d_48

然后我们又回到浏览器的gdbgui页面

centos系统ANSYS totem安装教程_2d_49

centos系统ANSYS totem安装教程_3d_50