Matlab中提供了丰富的函数可以供我们使用,但是要在Fluent UDF中直接利用它们却需要一定的技术手段。前面博客介绍过用Fluent UDF“静态模式”下调用Matlab的插值,贝塞尔函数等,参见
https://blog.csdn.net/SuperUDF/article/details/127624410
https://blog.csdn.net/SuperUDF/article/details/127460510
“静态模式”的优点是编译好的UDF库不依赖于Matlab运行库,在任何机器装有Fluent的Windows机器上都可以直接使用。然而该模式也有十分明显的缺点,那就是只支持部分Matlab函数。近期,正好有用户需要在Fluent UDF中调用Matlab的微分方程求解函数ode45,测试下来发现该函数正好不属于“静态模式”支持范围。因此,我们只能改用“动态模式”。所谓“动态模式”就是在UDF中动态链接Matlab的运行库,从而调用其中的函数。尽管依赖于Matlab的运行库,但优点是几乎支持所有Matlab函数,正好弥补了“静态模式”的不足。整个调用过程具体如下:
1. 官网下载VC++ UDF Studio插件并安装:VC++ UDF Studio,建议下载学术版(如想进一步采购注册,对高校老师学生比较优惠)
2. 安装Visual Studio(插件2022R2开始支持VS2010~2019社区,专业或旗舰版,这里建议安装VS2015)。此外,Common Tools for Visual C++和Microsoft Foundation Class (MFC)一起安装。
3. 安装Matlab 2014a ~ 2021b任一版本(推荐Matlab2018b和Fluent2023R2配合,其它版本可能存在冲突导致Matlab库初始化失败)。“动态模式”必须要求勾选Matlab Compiler,其它视自己喜好安装。
4. 打开桌面图标,选择需要的版本并勾选“调用Matlab”和“动态链接”后点“确定”会自动启动Fluent,读入case并点击Fluent嵌入菜单中的“Start Visual Studio”子菜单。(需要说明一下,“动态链接”只有注册版才能使用,试用版中处于禁用状态)
5. 把自带的matlab函数文件MatlabAdd.m改名为MatlabOdeSolve.m,另外一个自动生成的文件MatlabFunctionTester.m是用来在Matlab中测试调试函数文件用的,下一步会介绍用法,这一步不用管。然后双击打开编辑MatlabOdeSolve.m,输入以下自定义Matlab函数体。
function [out]= MatlabOdeSolve(y0)
tspan = [0 5]; %定义自变量的取值范围为0~5
%定义函数y’=2*t, t为自变量, 初始条件为y0, 使用ode45求解
[t,y] = ode45(@(t,y) 2*t, tspan, y0);
out=y(size(t,1),1); %获取y矩阵的最后一个值, 即y=t^2+C的[0~5]的积分, 结果应为25
end
6. 双击打开MatlabFunctionTester.m,输入如下测试代码,从而便于测试我们前面定义的MatlabOdeSolve函数。
clear all
y0=0; %输入初值为0
y1=MatlabOdeSolve(y0); %调用我们定义的ode求解函数
disp(y1) %显示输出返回值
7. 鼠标右键在MatlabFunctionTester.m文件上单击弹出菜单,选择“用Matlab打开”,这样就可以在Matlab里面一步一步调试我们定义的MatlabOdeSolve函数,排除错误后关闭Matlab。
在Matlab中调试运行发现用户定义的函数没有错误产生,且输出返回结果为25,和理论结果一致。
8. 前面确认了用户定义的Matlab函数没有问题,然后就点击工具栏上“将.m文件转为C/C++”按钮。
9. 等待片刻,转换完成后,会自动将对应的转换得到的C/C++头文件MatlabLibrary.h加入到UDF工程中。
10. 在udf_source.cpp文件中输入如下示例源代码,并点击“编译UDF”按钮直到编译通过。有任何错误提示,可以双击提示行直接定位到源码中的错误行进行修改直到编译通过。然后按“UDF库加载到Fluent”按钮即可把UDF库载入到Fluent中。
#include "udf.h"
#include "MatlabLibrary.h"
DEFINE_ON_DEMAND(Test_ode)
{
if (!MatlabLibraryInitialize()) //Matlab库初始化
{
Message0("MatlabLibraryInitialize error. Installing Matlab2018b with Fluent2023R2 may work.\n");
return;
}
real y0, y1;
y0=0; //输入初值为0
mwArray mwY0(1, 1, mxDOUBLE_CLASS); //声明双精度数组,尺寸为1*1,即标量
mwArray mwY1(1, 1, mxDOUBLE_CLASS);
mwY0.SetData(&y0, 1); //把y0的值赋给mwY0,总元素个数为1
MatlabOdeSolve(1, mwY1, mwY0); //调用用户定义的Matlab函数
y1 = mwY1.Get(1, 1); //从mwY1数组中获取双精度类型的输出值
Message0("output value y1 = %g\n", y1);
MatlabLibraryTerminate(); //不再使用Matlab库,所以关闭它
}
如果UDF库加载正常,则在Fluent的控制台界面会显示我们定义的Test_ode的宏的名字,如下图所示。
11. 执行DEFINE宏,本例由于插值函数放在DEFINE_ON_DEMAND宏中,所以在Execute On Demand对话框里面手动执行。
12. Fluent中运行结果如下,和前面直接Matlab里面的结果是一致的。