Fluent UDF【8】:编译型UDF
UDF除了可以以解释的方式外,其还可以以编译的方式被Fluent加载。解释型UDF只能使用部分C语言功能,而编译型UDF则可以全面使用C语言的所有功能。
1 编译型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(链接非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 C编译器
不管是使用GUI还是使用TUI方式编译UDF,都需要使用本机运行的操作系统以及C编译器。大多数的Linux操作系统上都已经集成了C编译器,但是如果是在Microsoft Windows系统上编译UDF,则在编译之前必须确保本机山刚已经安装了MicroSoft Visual Studio。 对于Linux机器,ANSYS Fluent支持任意符合ANSI标准的C编译器(如GCC)。
在进行UDF编译之前,需要设置编译环境,这通常可以通过修改UDF.bat文件来实现。如下图所示。
3 GUI方式编译UDF
利用GUI方式编译UDF源文件、构建共享库以及加载UDF库到Fluent中,可以采用以下步骤。
注意:在Windows系统下编译UDF,必须预先安装Visual Studio。在安装Visual Studio时,确保选择安装c++语言,这样才会安装C编译器。
- 确保要编译的UDF源文件与cas和dat文件在同一工作路径下。
- 读取(或创建)case文件
- 打开
Compiled UDFs
对话框。可通过树形菜单Parameters & Customization → User Defined Functions→Compiled...
启动该对话框。
- 在
Compiled UDF
对话框中点击按钮Add...
添加源文件和头文件 - 在
Library Name
后的文本框中输入共享库的名称,之后点击Build
按钮构建共享库。其间会弹出如下图所示的提示对话框。
可以选择无视,点击OK
按钮继续。
编译完成后会在TUI窗口出现如图所示的对话框。仔细检查提示信息,没有出现error则表示编译成功。图中出现有乱码,不知道是从Fluent哪个版本开始就出现这种情况。其实可以不用管。
点击
Load
按钮加载UDF
如果没有错误的话,加载完housing会在TUI窗口中出现如下图所示的对话框,其中会显示UDF宏名称。如下图中所示的velocity和domainInit。
4 TUI方式编译UDF
除了可以利用图形界面编译UDF外,Fluent还提供了利用TUI命令的方式编译UDF。利用TUI方式进行编译,能够允许用户调用一些非Fluent源文件之外的库文件。
使用TUI进行编译,通常首先需要创建好文件目录结构,之后编辑Makefile文件,利用makefile文件编译源文件。
windows系统与Linux系统的编译方式有些不同,这里主要描述Windows下的构建过程,linux系统后面再说。
4.1 创建文件目录结构
在windows系统中编译UDF,需要两个文件makefile_nt.udf
与user_nt.udf
。特别重要的是在user_nt.udf文件中指定源文件编译参数。构建文件目录结构采用以下步骤:
- 在当前工作目录下,创建新的文件夹存储UDF库。(例如创建文件夹libudf)
- 在libudf文件夹下创建新的文件夹,命名为
src
- 将所有UDF源文件放入src文件夹中
- 在libudf文件夹下创建架构文件夹。如64bit windows操作系统,则创建win64文件夹(路径libudf\win64)。
- 在架构文件(libudf\win64)下创建Fluent版本文件夹。如单精度2d版本则创建文件夹2d。一些版本信息如下表所示。
版本信息 | 文件夹名字 |
---|---|
单精度2d | 2d |
当精度3d | 3d |
双精度2d | 2ddp |
双精度3d | 3ddp |
单精度并行2d | 2d_node及2d_host |
单精度并行3d | 3d_node及3d_host |
双精度并行2d | 2ddp_node及2ddp_host |
双精度并行3d | 3ddp_node及3ddp_host |
注意:在编译并行UDF时,需要创建两个版本文件夹。
- 从Fluent安装路径中(如c:\ANSYS Inc\v180\fluent\fluent18.0.0\src\udf)拷贝文件
user_nt.udf
到所有的版本子文件夹中(如libudf\win64\3d) - 从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环境下的文件目录设置与此有些许差异。
4.2 编译文件
当文件目录设置完毕并且所有文件已经放置到指定位置后,就可以利用TUI来编译及构建UDF共享库了。
在windows系统中,采用以下步骤:
- 修改
user_nt.udf
文件。修改文件中的三个参数:CSOURCES、HSOURCES、VERSION以及PARALLEL_NODE
udf_nt.udf文件内容类似下图所示。
CSOURCES=:指定要编译的UDF源文件。在所有文件名前面加上前缀$(SRC)
。(多个文件可以连着写,如`$(SRC)udfexample1.c $(SRC)udfexample2.c
)
HSOURCES=:指定要编译的UDF头文件。同样在所有文件名前面加上$(SRC)
前缀。(多个文件可以连着写,如`$(SRC)udfexample1.h $(SRC)udfexample2.h
)
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文件。
- 利用Visual Studio命令行界面进入每一个版本文件夹(如libudf\win64\2d),输入
nmake
执行编译操作。若编译存在问题,可以在修改源文件后通过执行nmake clean
及nmake
重新编译。
更多CFD资料可微信扫描下方二维码关注微信公众号。
Fluent UDF【8】:编译型UDF的更多相关文章
- Fluent UDF【7】:解释型UDF
UDF宏有两种方式可以被Fluent所接受:编译和解释.其中有一些宏既可以被解释也可以被编译,而一些宏则只能被解释.有一些场合只接受编译后的UDF(如动网格中的一些宏),而有些场合既可以接受编译的UD ...
- UDF——文件编码造成UDF编译失败
有时候我们觉得我们的代码写得很正确的,但是在Fluent当中编译的时候一直编译不通过,提示我们错误,我们根据Fluent当中的错误提示去找到源代码中对应的行,却发现没有错误提示当中的问题,出现这个问题 ...
- GCC编译UDF和gdb调试UDF
Fluent版本:19.0 前面我们介绍过使用VS来编译和调试UDF,其实我们也可以用GCC来编译UDF.gdb调试UDF.本次介绍的方法更具有通用性,也适用于Linux下Fluent的UDF编译和调 ...
- in C#,编译型常量(const)和运行时常量(readonly)
readonly 关键字与 const 关键字不同. const 字段只能在该字段的声明中初始化. readonly 字段可以在声明或构造函数中初始化. 因此,根据所使用的构造函数, readonly ...
- UWP: 掌握编译型绑定 x:Bind
在 UWP 开发中,我们在进行数据绑定时,除了可以使用传统的绑定 Binding,也可以使用全新的 x:Bind,由于后者是在程序编译时进行初始化操作(不同于 Binding,它是在运行时创建.初始化 ...
- 解释型vs编译型 动态vs静态 强类型vs弱类型
------------------------------------------------------------ 释型.动态语言与静态语言.强类型语言与弱类型语言的区别 编译型和解释型 我们先 ...
- 编译型 解释型 C++工作原理
C++教程_w3cschool https://www.w3cschool.cn/cpp/ C++工作原理: C++语言的程序因为要体现高性能,所以都是编译型的.但其开发环境,为了方便测试,将调试环境 ...
- 【软考5】解释型 or 编译型
导读:在上篇博客中,我们了解到,目前的编码语言经过不断的发展,已经经历了机器语言--汇编语言--高级语言的过程.虽然我们的编码语言在不停的升级,但作为计算机来说,它始终是一个只能理解0和1构成的机器语 ...
- 为什么golang的开发效率高(编译型的强类型语言、工程角度高、在开发上的高效率主要来自于后发优势,编译快、避免趁编译时间找产品妹妹搭讪,既是强类型语言又有gc,只要通过编译,非业务毛病就很少了)
作者:阿猫链接:https://www.zhihu.com/question/21098952/answer/21813840来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出 ...
随机推荐
- 098实战 Job的调度
一:介绍 1.job调度 容量调度:Apache Hadoop的默认方式 公平调度:CDH版本的Hadoop的默认方式 2.公平调度 是一种资源分配方式,在yarn的整个生命周期中,所有的applic ...
- JAVA Socket通信 打造属于自己的网盘
近一个月没敲JAVA代码了,最近老师布置了一个写JAVA网盘的作业,总共花了十几个小时,总算写完了,debug真的累,感觉自己还是菜了,没有那种有一个想法就能马上用代码实现的能力....不扯了,下面开 ...
- 【Java并发核心七】计划任务ScheduleExecutorService
Java中定时任务Timer工具类提供了计划任务的实现,但是Timer工具类是以队列的方式来管理线程的,并不是以线程池的方式,这样在高并发的情况下,运行效率会有点低. ScheduleExecutor ...
- manjaro 配置 独立显卡驱动
参考 https://blog.csdn.net/weixin_42205310/article/details/81905293 尝试多次 只有这篇配置成功. ①先解决依赖sudo pacman - ...
- python-线程的暂停, 恢复, 退出
我们都知道python中可以是threading模块实现多线程, 但是模块并没有提供暂停, 恢复和停止线程的方法, 一旦线程对象调用start方法后, 只能等到对应的方法函数运行完毕. 也就是说一旦s ...
- C# 使用PrintDocument 绘制表格 完成 打印预览 DataTable
经过不断的Google与baidu,最终整理出来的打印类 主要是根据两个参考的类组合而成,稍微修改了一下,参考代码及来源见最后(其中一份是VB语言的) 其中遇到的一些问题也已经得到了解决(分页,打印预 ...
- FlarumChina SQL injection Vulnerability
First,We need to download our vulnerable program in GitHub links:https://github.com/skywalker512/Fla ...
- [COGS2554][SYZOJ247][福利]可持久化线段树
思路: 主席树模板. 注意内存的分配,原始的线段树有$2n$个结点,每次更新时最多增加$log(n)$个结点,总共有$q$次询问,所以存储结点的数组大小为$2N+q log(n)$. #include ...
- 早期(编译器)优化--Java语法糖的味道
1.泛型与类型擦除 泛型的本质是参数化类型的应用,也就是说所操作的数据类型被指定为一个参数.这种参数类型可以用在类.接口和方法的创建中,分别称为泛型类.泛型接口和泛型方法.在泛型没有出现之前,只能通过 ...
- C++构造函数初始化列表与构造函数中的赋值的区别
C++类中成员变量的初始化有两种方式:构造函数初始化列表和构造函数体内赋值. 一.内部数据类型(char,int……指针等) class Animal { public: Animal(int wei ...