0. VS调试UDF简介
Fluent使用UDF时,可以使用VS进行编写代码,但只能在Fluent软件内编译,导致编写代码时无法查看是否存在错误,也无法使用关键词提示,更无法进行调试。
如何能让UDF的编写和普通C语言代码一样可以调试呢?通过本文的操作流程,可以实现UDF代码的关键词提示,错误提醒及代码Debug, 同时还可以实现无需配置环境变量即可实现UDF代码的编译。
1. UDF需要的文件
Fluent软件在编译UDF的过程会生成libudf文件夹(也可能是其他的名称,取决于Library Name)
这个文件夹下包含了两个文件夹,其中src为UDF源文件,win64为编译生成的文件。需要的就是win64文件夹下的文件。
Win64文件夹下有两个文件(并行),分别是host节点的文件和node节点的文件。两文件夹下内容相同,其中主要的就是libudf.dl、libudf.dl和libudf.dl文件。
我们需要使用VS生成这两个文件夹,并包含其中的文件
2. 提前写好UDF代码
这里提供提前写好的UDF代码,当然也可以设置好后重新再VS中编写
代码:
#include "udf.h"
DEFINE_ON_DEMAND(on_demand_calc)
{
Message("111\n");
Message("222\n");
Message("333\n");
}
3. 使用VS创建新项目
由于要生成两个文件夹,分别是host节点的文件和node节点的文件。因此需要两个项目,分别是host项目和node项目。
3.1 先创建host新项目
先创建host新项目,node项目在host基础上更改即可
Windows桌面向导
输入项目名称和位置,点击创建。这里的项目名称为2ddp_host,而解决方案名称为2ddp。后面再创建node项目时,可以将host项目和node项目放到一起。可参考“VS创建项目路径问题”
应用程序类型选择:动态链接库.dll,其他选项勾选空项目
右击源文件--添加:如果提前写好的UDF就添加现有项,把UDF导入进来。否则就添加新建项,新写UDF。UDF的写法这里不多赘述。
此时的UDF虽然导入进去,会出现红色波浪线,同时无法生成解决方案。
3.2 创建node项目
右击解决方案,添加--新建项目
点击windows桌面向导,下一步。
项目名称为2ddp_node,其他的和host项目设置相同
同样地,node节点也要添加源文件。这里的源文件和host的源文件完全一致。
这样设置之后,解决方案下面会包含两个项目文件夹
4. 配置调试环境
所谓的配置调试环境就是将UDF所需要的目录全部包含进去,这样UDF在调试的时候就能够识别到所有的头文件,从而不会出错。
配置过程类似EDEM API配置过程。
Host项目和node项目都需要配置环境,两者的配置方法相似,仅有一点区别。这里以host为例进行配置,node的配置区别下面也会讲解
4.1 右击项目名称--属性
4.2 属性页设置:Debug、x64
点击配置管理器
4.3 活动解决方案平台:x64
4.4 C/C++附加包含目录
这里要添加的目录主要是makefile_nt.udf文件中的目录。文件地址:D:\software\ANSYS2023R2\ANSYS Inc\v232\fluent\fluent23.2.0\src\udf
使用笔记本打开makefile_nt.udf文件,下图即为需要包含的目录。
在配置项目属性之前,我们首先需要熟悉makefile中常用的四个宏定义:
FLUENT_INC(FLUENT安装路径:本文中为D:\software\ANSYS2023R2\ANSYS Inc\v232\fluent)
FLUENT_ARCH(Fluent架构,有ntalpha、ntx86和win64三个值,本文中为win64)
VERSION(UDF版本,共2d、3d、2ddp、3ddp、2d_host、3d_host、2ddp_host、3ddp_host、2d_node、3d_node、2ddp_node、3ddp_node版本,本文以3ddp版本为例)
RELEASE(FLUENT版本号,本文为23.2.0)
这里的符号是为了确定包含目录的绝对地址的。实际上可以分为三类:
第一类:即第一个包含目录。根据自己模型的维数和精度来选择。
-I"$(FLUENT_INC)"\fluent$(RELEASE)\$(FLUENT_ARCH)\$(VERSION) \
第二类:就是这个文件夹下的几个src目录
第三类:最后一个目录-I"$(FLUENT_INC)"\include
注:添加包含目录需要严格按照makefile_nt.udf中包含的头文件顺序。
将上述目录全部包含之后,会发现源文件不再有波浪线。
但生成解决方案仍然会出错
注:
对于并行UDF(实际上从Fluent20.0之后的版本都是并行了),由于需要在libudf中生成两个文件2ddp_host和2ddp_node,因此需要创建两个项目。每个项目所包含的目录不同。主要区别就体现在第一个包含目录。
对于2ddp_host
D:\software\ANSYS2023R2\ANSYS Inc\v232\fluent\fluent23.2.0\win64\2ddp_host
对于2ddp_node
D:\software\ANSYS2023R2\ANSYS Inc\v232\fluent\fluent23.2.0\win64\2ddp_node
其他的保持相同即可
附加包含目录找不到tgrid/src,直接包含win64目录即可
5. 添加链接器
对2dd_host,需要把win64下的2ddp_host文件包含进去。根据模型维数和精度修改。
附加依赖项,把fl2320.lib添加进去
fl2320.lib即2ddp文件下的一个文件
再次生成解决方案,成功
对于node项目,需要把win64下的2ddp_node文件包含进去
附加依赖项,把fl_mpi2320.lib添加进去
6. 修改UDF代码
需要对UDF代码(源文件)进行修改,添加上几行代码。这里的修改需要对host和node项目的源文件都进行修改。
这里的修改是根据makefile_nt.udf文件进行修改的
其中
__declspec(dllexport) UDF_Data udf_data[] =
{
"on_demand_calc",(void(*)(void))on_demand_calc,UDF_TYPE_ON_DEMAND
};
__declspec(dllexport) int n_udf_data = sizeof(udf_data) / sizeof(UDF_Data);
on_demand_calc和on_demand_calc为DEFINE宏的名字;UDF_TYPE_ON_DEMAND需要根据使用的DEFINE宏来进行修改
注:
如果使用多个DEFINE宏怎么办???对于多个DEFINE宏,需要增加这个语句,并且以,分隔
可以正常编译并运行
7. 生成libudf文件
右击host项目--属性--常规--输出目录
在Configuration\后面添加libudf\win64\2ddp_host。会在解决方案目录下生成Debug\libudf\win64\2ddp_host
同理,node项目需要在Configuration\后面添加libudf\win64\2ddp_node。
把这个libudf复制到Fluent路径下
打开Fluent,编译栏不需要添加Source Files,在Library Name处输入libudf,然后点击load即可。Fluent文本输出栏出现宏名称则说明编译成功。
注:上述方法使得每次修改代码后生成的libudf都需要复制到Fluent文件夹下。我们可以修改VS生成的libudf位置,让其直接在Fluent文件下。
对2ddp_host文件
对2ddp_node文件
8. VS调试UDF
Fluent成功加载VS编译好的文件后,在VS中调试---附加到进程。
选择fl开头的程序,注意不要选择fluent.exe
在源文件中设置断点,单击代码行的最左边。或者添加监视
在FLuent中执行UDF会跳到VS界面。添加监视,右击某个变量可以添加监视,监测某个量的变化
对代码修改后,重新附加到进程,不需要重新选择程序
9. 保存模板
上面的流程比较繁琐,尤其是包含附加目录,可以将每种类型的项目都保存成模板,下次可以直接使用。
比如将2ddp_host保存成模板
下次使用可以直接从模板新建项目
10. VS创建项目路径问题
解决方案比项目高一级,一个解决方案下面可能有多个项目。
对于UDF并行问题,解决方案名称设置为2ddp或3ddp;项目名称分别设置为2ddp_host和3ddp_host。位置可与Fluent同一路径下,新建一个文件夹。不勾选”将解决方案和项目放在同一目录中”