Fluent UDF中调用Matlab的微分方程求解函数
Matlab中提供了丰富的函数可以供我们使用,但是要在Fluent UDF中直接利用它们却需要一定的技术手段。前面博客介绍过用Fluent UDF“静态模式”下调用Matlab的插值,贝塞尔函数等,参见
https://www.cnblogs.com/SuperUDF/articles/16846008.html
https://www.cnblogs.com/SuperUDF/articles/16815895.html
“静态模式”的优点是编译好的UDF库不依赖于Matlab运行库,在任何机器装有Fluent的Windows机器上都可以直接使用。然而该模式也有十分明显的缺点,那就是只支持部分Matlab函数。近期,正好有用户需要在Fluent UDF中调用Matlab的微分方程求解函数ode45,测试下来发现该函数正好不属于“静态模式”支持范围。因此,我们只能改用“动态模式”。所谓“动态模式”就是在UDF中动态链接Matlab的运行库,从而调用其中的函数。尽管依赖于Matlab的运行库,但优点是几乎支持所有Matlab函数,正好弥补了“静态模式”的不足。整个调用过程具体如下:
1. 官网下载VC++ UDF Studio插件并安装:https://vcudfstudio.github.io/download_cn.html,建议下载学术版(如想进一步采购注册,对高校老师学生比较优惠)


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 (!mclInitializeApplication(NULL, 0)) //应用程序初始化 { Message("mclInitializeApplication error. Installing Matlab2018b with Fluent2023R2 may work.\n"); return; } 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库,所以关闭它 mclTerminateApplication(); }

如果UDF库加载正常,则在Fluent的控制台界面会显示我们定义的Test_ode的宏的名字,如下图所示。

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

12. Fluent中运行结果如下,和前面直接Matlab里面的结果是一致的。


浙公网安备 33010602011771号