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.udfuser_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 cleannmake重新编译。

更多CFD资料可微信扫描下方二维码关注微信公众号。

Fluent UDF【8】:编译型UDF的更多相关文章

  1. Fluent UDF【7】:解释型UDF

    UDF宏有两种方式可以被Fluent所接受:编译和解释.其中有一些宏既可以被解释也可以被编译,而一些宏则只能被解释.有一些场合只接受编译后的UDF(如动网格中的一些宏),而有些场合既可以接受编译的UD ...

  2. UDF——文件编码造成UDF编译失败

    有时候我们觉得我们的代码写得很正确的,但是在Fluent当中编译的时候一直编译不通过,提示我们错误,我们根据Fluent当中的错误提示去找到源代码中对应的行,却发现没有错误提示当中的问题,出现这个问题 ...

  3. GCC编译UDF和gdb调试UDF

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

  4. in C#,编译型常量(const)和运行时常量(readonly)

    readonly 关键字与 const 关键字不同. const 字段只能在该字段的声明中初始化. readonly 字段可以在声明或构造函数中初始化. 因此,根据所使用的构造函数, readonly ...

  5. UWP: 掌握编译型绑定 x:Bind

    在 UWP 开发中,我们在进行数据绑定时,除了可以使用传统的绑定 Binding,也可以使用全新的 x:Bind,由于后者是在程序编译时进行初始化操作(不同于 Binding,它是在运行时创建.初始化 ...

  6. 解释型vs编译型 动态vs静态 强类型vs弱类型

    ------------------------------------------------------------ 释型.动态语言与静态语言.强类型语言与弱类型语言的区别 编译型和解释型 我们先 ...

  7. 编译型 解释型 C++工作原理

    C++教程_w3cschool https://www.w3cschool.cn/cpp/ C++工作原理: C++语言的程序因为要体现高性能,所以都是编译型的.但其开发环境,为了方便测试,将调试环境 ...

  8. 【软考5】解释型 or 编译型

    导读:在上篇博客中,我们了解到,目前的编码语言经过不断的发展,已经经历了机器语言--汇编语言--高级语言的过程.虽然我们的编码语言在不停的升级,但作为计算机来说,它始终是一个只能理解0和1构成的机器语 ...

  9. 为什么golang的开发效率高(编译型的强类型语言、工程角度高、在开发上的高效率主要来自于后发优势,编译快、避免趁编译时间找产品妹妹搭讪,既是强类型语言又有gc,只要通过编译,非业务毛病就很少了)

    作者:阿猫链接:https://www.zhihu.com/question/21098952/answer/21813840来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出 ...

随机推荐

  1. C语言 提取double的每一位

    #include<stdio.h> int main() { double x = 256.141592654; ; //整数部分 while(n) //整数部分输出 { ; n /= ; ...

  2. Java Web 之javabeans

    Java遇见HTML——JSP篇之JavaBeans: http://www.cnblogs.com/Qian123/p/5277425.html

  3. Linux 之 Makefile 报错

    1. 在make命令后出现这种错误提示,是提示第4行没有分隔符. 例如: 1 target:prerequisites ...... 4 command …… 改为: 1 target:prerequ ...

  4. Mac电脑如何设置DHCP

    通过设置MAC电脑的DHCP服务器可以为局域网内的其它设备自动分配IP地址,还能把物理地址和IP地址绑定起来,限制IP地址的获取.   OS X 10.11或以上版本已内置DHCP服务器软件,即boo ...

  5. Solidworks实例学习

    1. 扫描绘制 2. 拉伸切除1 3. 拉伸切除2 4. 旋转切除1 5. 旋转切除2 6. 基准面构建 7. 扫描薄壁 8. 放样1 9. 放样2 10. 放样3  

  6. Android Studio 使用过程遇到的坑

    最近在尝试Android Studio打Jar的包,然而事实并不是想象的那么简单,so,写多个坑的解决,以备不时之需. 1.Error:Execution failed for task ':app: ...

  7. 轻松学C#----第二篇笔记

    第二篇: 分析下第一篇的代码,见下图: 2.同其他语言一样,C#语言在编写时也遵守一定的语法规范. A.标识符(identify):指为方法.变量.其他任何用户自定义项指定的名称.标识符必须遵循一定的 ...

  8. 简单的三道shell例题

    problem: 1. 输入一个ip列表文件,文件每行为以tab键分隔的两列,分别为一个ip段的起始ip和结束ip,ip均为点分形式.要求将该文件中各ip段包含的每一个有效ip以非点分形式输出到一个文 ...

  9. C# abstract virtual override new finally java final finalize

    virtual:声明虚方法.可以被其派生类所重写的.重写方法需要使用override或者new关键字. override:覆盖原方法.可对重写virtual.override.abstract进行重写 ...

  10. Oracle 11g透明网关连接Sqlserver 2000(转)

    Oracle 11g透明网关连接Sqlserver 2000: http://www.cnblogs.com/lightnear/archive/2013/02/03/2890858.html 透明网 ...