吾生有涯 学海无涯
析模有界 知识无界

Fluent UDF|访问外部动态连接库

内容纲要

Fluent UDF采用的是C语言(C++其实也可以),但有时需要调用其他语言编写的功能代码,或想要使用一些遗留程序功能而又不想将其用C语言改写时,此时可以考虑将其封装编译为动态链接库,然后在UDF中调用动态链接库实现功能重用。

本文演示利用Fluent UDF调用外部动态链接库的过程。

https://www.programmersought.com/article/37373358218/

1 创建动态库

几乎所有编译型语言程序都可以被编译为动态库(如常见的C、C++、Fortran等)。

注意在windows系统中,动态库的扩展名为dll,而在linux系统中,动态库的扩展名为so,不管是哪种动态库,其调用方式都一样。

本文创建一个C语言编写的dll文件。本例的动态链接库在Visual Studio 2019中创建。

  • 启动VS2019创建一个空项目。VS提供了dll创建模板,这里简单起见不搞那么复杂。
  • 设置项目的一些基本信息,点击创建按钮创建
  • 如下图所示选择添加头文件
  • 指定头文件名为dlldemo.h
  • 在头文件dlldemo.h中添加下面的代码,声明一个函数add
extern "C" __declspec(dllexport) double add(double a, double b);

这里根据自己的实际需要进行编写。这里的extern "C"关键字是用来强制使用C编译器进行编译。其实不要这个也是可以的。

  • 创建一个源文件
  • 指定源文件名为dlldemo.cpp
  • 在源文件dlldemo.cpp中编写下面的代码
#include "dlldemo.h"
double add(double a, double b)
{
return a + b;
}
  • 设置生成方案为Release及x64,如下图所示。注意这里如果目标电脑为64位则设置为x64,否则使用默认x86
  • 鼠标右键选择解决方案模型树中的DllDemo,点击弹出菜单项属性进行设置
  • 如下图所示设置配置类型动态库(.dll)
  • 选择菜单生成→生成解决方案或直接按快捷键F6进行编译
  • 编译完毕后,查看项目文件夹夹x64/Release中的文件,如下图所示

这里有两个后面要用到的比较重要的文件:DllDemo.dll及DllDemo.lib

2 准备Fluent UDF

这里只是编写一个UDF宏用来测试调用上面的动态库,因此简单起见使用DEFINE_ON_DEMAND。

#include "udf.h"
extern double add(double a ,double b);
DEFINE_ON_DEMAND(dlltest)
{
double a = 2.0;
double b = 3.0;
double c = add(a,b);
Message0("hello Dll, The result is:%f",c);
}

将宏文件命名为testDll.c。

3 编译UDF

编译起来有点儿麻烦,这里采用UDF外部编译的方式。

下面的编译方式部分参考了这篇文章:https://www.programmersought.com/article/37373358218/

  • 找到Fluent安装目录下的makefile_nt.udf及user_nt.udf文件。可以使用文件搜索的方式去找,如下图所示
  • 将此文件拷贝到UDF源文件目录中,修改makefile_nt.udf文件名为makefile
  • 在源文件路径下创建目录结构
    • 在case文件夹下创建libudf文件夹
    • 在libudf文件夹中创建两个文件夹,分别命名为src及win64,将源文件testDll.c拷贝到文件夹src中
    • 在win64文件夹中创建文件夹2ddp_host与2ddp_node(这里根据目标case创建,若为双精度三维模型则创建3ddp文件夹)
    • 将前面的动态链接库文件DllDemo.dll及DllDemo.lib拷贝到UDF文件夹

UDF文件夹内的文件如下图所示。

文件夹结构如下图所示。

  • 将文件DllDemo.dll、DllDemo.lib、makefile、user_nt.udf同时拷贝到2ddp_host及2ddp_node(两个文件夹中同时存在这四个文件)

先编译2ddp_host文件夹。

  • 用记事本打开2ddp_host文件夹中的user_nt.udf文件

注:这里需要修改CSOURCES后面对应的源代码名;修改VERSION修改为2d_host

  • 用文本编辑器打开makefile文件,如下图所示添加代码CPP_LIB=DllDemo.lib
  • 如下图所示找到对应的代码行,对代码进行修改
  • 从开始菜单中启动x64 Native Tools Command Prompt for VS 2019,建议以管理员身份运行
  • 利用cd命令进入到2ddp_host文件夹下
  • 输入命令nmake进行编译,出现如下图所示提示即表示编译成功

注:编译期间可能会出现的一些错误提示:

  • 关于sed的错误,可以在网上自行下载sed.exe程序,然后将其路径放入环境变量path中
  • 关于resolve.exe的错误。可以将路径ANSYS Incv211fluentntbinwin64添加到环境变量path中
  • 关于FLUENT_INC环境变量未配置的错误。可以新建环境变量FLUENT_INC,并指定其值为Fluent安装路径ANSYS Incv211fluent

编译成功后2ddp_host文件夹中的文件内容如下图所示。

  • 相同的方式编译2ddp_node文件夹。这里makefile文件可以直接拷贝过去,而user_nt.def文件需要修改为下面的样子

编译完毕后2ddp_node文件夹中的文件如下所示。

此时编译工作完成。

4 测试

开启Fluent,工作路径设置为上面的工作路径。

  • 加载UDF
  • 可以看到UDF加载成功
  • 选择工具栏按钮Execute on Demand…,在打开的对话框中选择前面加载的UDF,如下图所示,可以看到运行后TUI窗口中输出了我们所有进行的计算信息

注:若Fluent在加载UDF的时候出现error code:126n的错误提示,此时可以将前面生成的DllDemo.dll文件拷贝到c:windowssystem32中。此错误有时出现有时不出现,原因不明。


相关文件:

提取码:jg8r

本文为微课堂课程Fluent】H 二次开发 新增补充课程,已购此课程的道友可以直接观看视频操作(或识别下方二维码直接进入视频)。

下方为手残党专用案例演示配套视频(建议不看):

本篇文章来源于微信公众号: CFD之道

赞(0) 打赏
版权声明:未经允许,请勿随意用于商业用途。
文章名称:《Fluent UDF|访问外部动态连接库》
文章链接:https://www.topcfd.cn/16091/
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。
分享到

说两句 抢沙发

评论前必须登录!

 

觉得文章有用就打赏一下文章作者吧

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫

登录

找回密码

注册