Fluent UDF中调用Matlab的贝塞尔函数

有小伙伴咨询在Fluent UDF中如何使用贝塞尔函数,常规情况下需要我们自己去写函数。但我们注意到Matlab提供了丰富的各种运算函数。我们有什么办法把Matlab中的贝塞尔函数给UDF直接调用呢?

这里提供一种借助于VC++ UDF Studio插件实现调用Matlab函数的方法,且编译好以后的UDF库拿到没有安装对应Matlab版本的机器上仍然可以使用。

1. 官网下载VC++ UDF Studio插件并安装:https://vcudfstudio.github.io/download_cn.html,建议下载学术版(如想进一步采购注册,对高校老师学生比较优惠)

 

 2. 安装Visual Studio(2022R2开始支持VS2010~2019社区、专业或旗舰版,建议安装VS2010旗舰版), C++和C#一起安装,对于64位Fluent还要勾选X64编译器。

 

 3. 安装Matlab 2014a ~ 2021b任一版本(贝塞尔函数可能需要Matlab 2016a以上),必须勾选Matlab Coder,其它视自己喜好安装。

 4. 管理员权限打开桌面图标,选择需要的版本并勾选“调用Matlab”后会自动启动Fluent,读入case并点击Fluent嵌入菜单中的“Start Visual Studio”子菜单。

    

 5. 把自带的matlab函数文件MatlabAdd.m改名为Matlabbesselj.m,另外一个自动生成的文件MatlabFunctionTester.m是用来在Matlab中测试调试函数文件用的,这里可以不用管。然后双击打开编辑Matlabbesselj.m,输入以下自定义Matlab函数体。因为这个函数很简单,肯定正确,所以不需要利用MatlabFunctionTester.m来调试它。

function [resultValue]= Matlabbesselj(n,Xvar)
    resultValue = besselj(n,Xvar);
end

其中,besselj(n,Xvar)是Matlab的内置贝塞尔函数, n是阶数,Xvar是一个标量或者数组,最后的运算结果是针对Xvar中的每一个数计算其贝塞尔函数值。

 点击工具栏上“将.m文件转为C/C++”按钮,输入参数“n”和“Xvar”均设为float或double类型,如果是注册版也可以将Xvar设为矩阵(Dyn*1),即行数为动态,列数是1,这样可以一次性计算多个值,然后点击“确定”开始转换。

 

 等待片刻,转换完成后,会自动将对应的转换得到的C/C++头文件MatlabLibrary.h加入到UDF工程中,

 

  6. 在udf_source.cpp文件中输入如下示例源代码,并点击“编译UDF”按钮直到编译通过。有任何错误提示,可以双击提示行直接定位到源码中的错误行。编译通过后按“UDF库加载到Fluent”按钮即可载入到Fluent中。

#include "udf.h"

extern "C"
{
  #include "MatlabLibrary.h"
};

DEFINE_ON_DEMAND(ComputeBessel)
{
    creal32_T result=    Matlabbesselj((float)2.0, (float)1.9);  // 调用Matlab中besselj函数
    Message0("2nd order of Bessel(1.9)=%g\n", result.re);
}

 

   其中,creal32_T实际上是一个结构体,代表复数类型,在文字上右键选择“Go to Definition”,可以看到其定义如下,其中re代表实部,im代表虚部。对实数输入参数,结果一般虚部为零,所以取实部即可。

typedef struct
 {
  real32_T re; //实部
  real32_T im; //虚部
} creal32_T;

 

如果出现INFINITY,NAN未声明的标识符的错误,那么请使用较高版本的Visual Studio,例如Visual Studio2015或更高。

 

 

 

7. 执行DEFINE宏,本例由于besselj函数放在DEFINE_ON_DEMAND宏中,所以在Execute On Demand对话框里面手动执行。

 

8.  运行结果如下,结果是正确的。

 

 

posted @ 2022-10-31 21:55  SuperUDF  阅读(295)  评论(0)    收藏  举报