Fluent UDF中调用Matlab的微分方程求解函数

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里面的结果是一致的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值