Fluent UDF中调用Matlab矩阵运算函数(以二维插值为例)

这篇具有很好参考价值的文章主要介绍了Fluent UDF中调用Matlab矩阵运算函数(以二维插值为例)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Fluent UDF中经常需要用到一些常见算法,例如插值、拟合、矩阵运算等等,这些在UDF中是没有现成函数实现的,理论上需要我们自己去写函数。另一方面我们又注意到这些运算恰恰是Matlab的强项,几乎调用一个现成的函数就完成了目的。所以我们有什么办法把Matlab函数给UDF直接调用呢?

这里提供一种借助于VC++ UDF Studio插件实现调用Matlab函数的方法,且编译好以后的UDF库拿到没有安装对应Matlab版本的机器上仍然可以使用。以前硫酸亚铜博客(https://www.cnblogs.com/liusuanyatong/p/12128082.html)提供的方法是依赖于Matlab运行库,编译好的UDF库如果拿到没有安装相应Matlab版本机器上是没法运行的。

         前面博客文章已经介绍过用VC++ UDF Studio插件实现调用误差函数erf的例子(https://www.cnblogs.com/SuperUDF/articles/16114086.html)。但是该函数输入参数是标量,和矩阵输入参数还是有所不同。所以,这里再以调用Matlab中的interp2二维插值函数为例来说明矩阵作为输入参数时的使用过程。

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

matlab可以写udf吗,Fluent,UDF,matlab,矩阵,开发语言,c++matlab可以写udf吗,Fluent,UDF,matlab,矩阵,开发语言,c++

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

 matlab可以写udf吗,Fluent,UDF,matlab,矩阵,开发语言,c++

 3. 安装Matlab 2014a ~ 2021b任一版本,必须勾选Matlab Coder,其它视自己喜好安装。

 matlab可以写udf吗,Fluent,UDF,matlab,矩阵,开发语言,c++

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

 matlab可以写udf吗,Fluent,UDF,matlab,矩阵,开发语言,c++matlab可以写udf吗,Fluent,UDF,matlab,矩阵,开发语言,c++matlab可以写udf吗,Fluent,UDF,matlab,矩阵,开发语言,c++

5. 把自带的matlab函数文件MatlabAdd.m改名为MatlabInterpolate.m,另外一个自动生成的文件MatlabFunctionTester.m是用来在Matlab中测试调试函数文件用的,下一步会介绍用法,这一步不用管。然后双击打开编辑MatlabInterpolate.m,输入以下自定义Matlab函数体。 

function [resultValue]= MatlabInterpolate(X,Y,V,Xi,Yi)
 resultValue=interp2(X,Y,V,Xi,Yi);
end

matlab可以写udf吗,Fluent,UDF,matlab,矩阵,开发语言,c++  

6. 双击打开MatlabFunctionTester.m,输入如下测试代码,从而便于测试我们前面定义的MatlabInterpolate函数。

clear all
[X,Y]=meshgrid(-2:0.75:2); %6*6的均布网格,每隔0.75一个点
R=sqrt(X.^2+Y.^2)+1E-6; 
V=sin(R)./(R);  %每个网格点的对应函数值
surf(X,Y,V);  %画出曲面
xlim([-2 2]); %限制显示x坐标区域为[-2,2]
ylim([-2 2]); %限制显示y坐标区域为[-2,2]
Xi=0; %要插值点的x坐标
Yi=0; %要插值点的y坐标
Vi=MatlabInterpolate(X,Y,V,Xi,Yi); %Vi就是插值得到的x=0,y=0处的值

 7. 鼠标右键在MatlabFunctionTester.m文件上单击弹出菜单,选择“用Matlab打开”,这样就可以在Matlab里面一步一步调试我们定义的MatlabInterpolate函数,排除错误后关闭Matlab。

matlab可以写udf吗,Fluent,UDF,matlab,矩阵,开发语言,c++

 matlab可以写udf吗,Fluent,UDF,matlab,矩阵,开发语言,c++

 画出来的曲面和各矩阵值如下,插值运算得到Vi结果为0.9590。

matlab可以写udf吗,Fluent,UDF,matlab,矩阵,开发语言,c++matlab可以写udf吗,Fluent,UDF,matlab,矩阵,开发语言,c++matlab可以写udf吗,Fluent,UDF,matlab,矩阵,开发语言,c++

matlab可以写udf吗,Fluent,UDF,matlab,矩阵,开发语言,c++ matlab可以写udf吗,Fluent,UDF,matlab,矩阵,开发语言,c++

8. 点击工具栏上“将.m文件转为C/C++”按钮,输入参数均设为float类型(双精度fluent时为double),设置矩阵尺寸请点击“矩阵”按钮,然后勾选“动态”并确定。注意:试用版没法开启“矩阵“作为输入参数,必须购买注册后才能使用。

 matlab可以写udf吗,Fluent,UDF,matlab,矩阵,开发语言,c++

 matlab可以写udf吗,Fluent,UDF,matlab,矩阵,开发语言,c++matlab可以写udf吗,Fluent,UDF,matlab,矩阵,开发语言,c++

 其中,Dyn*Dyn代表该矩阵行和列都是“动态尺寸”,例如第一个参数X转换成C/C++代码后就会表示为

const emxArray_real32_T *X

 其中,emxArray_real32_T是一个存放动态数组的结构体,其定义为

struct emxArray_real32_T
{
  float *data;  //指向存放数据的数组
  int *size;    //存放维数的数组,实际就是两个元素size[0]和size[1]
  int allocatedSize; //总的元素个数,等于行数乘以列数
  int numDimensions; //数组的维数,插件中永远是2,代表数组有行和列2个维数
  boolean_T canFreeData; //是否需要调用free来释放由calloc或malloc开辟的data数组
};

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

matlab可以写udf吗,Fluent,UDF,matlab,矩阵,开发语言,c++

 转换后的C/C++函数原型为

float MatlabInterpolate(const emxArray_real32_T *X, const emxArray_real32_T *Y, const emxArray_real32_T *V, float Xi, float Yi);

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

#include "udf.h"

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

#define MATRIX_SIZE 6

DEFINE_ON_DEMAND(Interpolate)
{
	int X_size[2]={MATRIX_SIZE, MATRIX_SIZE}; //X_size指定X_data的尺寸,本例为6*6矩阵
	int Y_size[2]={MATRIX_SIZE, MATRIX_SIZE}; //Y_size指定Y_data的尺寸,本例为6*6矩阵
	int V_size[2]={MATRIX_SIZE, MATRIX_SIZE}; //V_size指定V_data的尺寸,本例为6*6矩阵

	float X_data[]={   // X_data的具体数据,C++语言是行优先的,所以数据应该是Matlab矩阵数据按照列优先排列
		-2.0,-2.0,-2.0,-2.0,-2.0,-2.0,
		-1.25, -1.25,-1.25,-1.25,-1.25,-1.25,
		-0.5,-0.5,-0.5,-0.5,-0.5,-0.5,
		0.25,0.25,0.25,0.25,0.25,0.25,
		1.0,1.0,1.0,1.0,1.0,1.0,
		1.75,1.75,1.75,1.75,1.75,1.75
	};

	float Y_data[]={   // Y_data的具体数据,C++语言是行优先的,所以数据应该是Matlab矩阵数据按照列优先排列
		-2.0,-1.25,-0.5,0.25,1.0,1.75,
		-2.0,-1.25,-0.5,0.25,1.0,1.75,
		-2.0,-1.25,-0.5,0.25,1.0,1.75,
		-2.0,-1.25,-0.5,0.25,1.0,1.75,
		-2.0,-1.25,-0.5,0.25,1.0,1.75,
		-2.0,-1.25,-0.5,0.25,1.0,1.75
	};

	float V_data[MATRIX_SIZE*MATRIX_SIZE];  // V_data存储坐标x,y处对应的散点值,即Matlab程序中的V

	int RowSize=X_size[0]; // 获得矩阵的行尺寸
	int ColSize=X_size[1]; // 获得矩阵的列尺寸

	for(int i=0;i<RowSize;i++)  // 填充坐标x,y对应的散点值
	{
		for(int j=0;j<ColSize;j++)
		{
			float Radius = sqrt(pow(X_data[i*RowSize+j],2)+pow(Y_data[i*RowSize+j],2))+1E-6; //即Matlab程序中的R
			V_data[i*RowSize+j]=sin(Radius)/Radius;
		}
	}
	
	emxArray_real32_T X, Y, V;
	X.data = X_data; //指向定长一维数组X_data
	X.size = X_size; //指向定长二维数组X_size
	X.allocatedSize = X_size[0] * X_size[1]; //行数乘以列数,MatlabInterpolate函数中实际并未用到,此行也可以不写
	X.numDimensions = 2; //永远为2,代表二维数组,行和列,MatlabInterpolate函数中实际并未用到,此行也可以不写
	X.canFreeData = false;  //因为X_data不是由calloc或malloc开辟的动态数组,所以不需要free,MatlabInterpolate函数中实际并未用到,此行也可以不写

	Y.data = Y_data; //指向定长一维数组Y_data
	Y.size = Y_size; //指向定长二维数组Y_size
	Y.allocatedSize = Y_size[0] * Y_size[1]; //行数乘以列数,MatlabInterpolate函数中实际并未用到,此行也可以不写
	Y.numDimensions = 2; //永远为2,代表二维数组,行和列,MatlabInterpolate函数中实际并未用到,此行也可以不写
	Y.canFreeData = false;  //因为Y_data不是由calloc或malloc开辟的动态数组,所以不需要free,MatlabInterpolate函数中实际并未用到,此行也可以不写

	V.data = V_data; //指向定长一维数组V_data
	V.size = V_size; //指向定长二维数组V_size
	V.allocatedSize = V_size[0] * V_size[1]; //行数乘以列数,MatlabInterpolate函数中实际并未用到,此行也可以不写
	V.numDimensions = 2; //永远为2,代表二维数组,行和列,MatlabInterpolate函数中实际并未用到,此行也可以不写
	V.canFreeData = false;  //因为V_data不是由calloc或malloc开辟的动态数组,所以不需要free,MatlabInterpolate函数中实际并未用到,此行也可以不写

	float Xi=0, Yi=0; //插值的目标x,y值
	float Vi=MatlabInterpolate(&X,&Y,&V, Xi,Yi); //调用Matlab插值函数
	Message0("The interpolated value at coordinate (0,0) is %g\n", Vi);
}

matlab可以写udf吗,Fluent,UDF,matlab,矩阵,开发语言,c++

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

matlab可以写udf吗,Fluent,UDF,matlab,矩阵,开发语言,c++

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

 matlab可以写udf吗,Fluent,UDF,matlab,矩阵,开发语言,c++matlab可以写udf吗,Fluent,UDF,matlab,矩阵,开发语言,c++

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

 matlab可以写udf吗,Fluent,UDF,matlab,矩阵,开发语言,c++文章来源地址https://www.toymoban.com/news/detail-698531.html

到了这里,关于Fluent UDF中调用Matlab矩阵运算函数(以二维插值为例)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MATLAB-三维插值运算

    MATLAB中是支持三维及三维以上的高维插值的。三维插值的基本原理与一维插值和二维插值是一样的,但三维插值是对三维函数进行的插值。在MATLAB中,使用interp3函数实现插值,其调用格式如下。 vi= interp3(x,y,z,v,xi,yi,zi) %返回值 vi是三维插值网格(xi,yi,zi)上的函数值估计,其中

    2023年04月10日
    浏览(30)
  • MATLAB-拉格朗日插值运算

    在结点上给出结点基函数,接着做该基函数的线性组合,组合的系数为结点的函数值,这种插值多项式称为拉格朗日插值公式。通俗地说,就是通过平面上的两个点确定一条直线。该插值方法是一种较为基础的方法,同时该方法也较容易理解与实现。 拉格朗日插值多项式的表

    2024年02月06日
    浏览(40)
  • 7、hive shell客户端与属性配置、内置运算符、函数(内置运算符与自定义UDF运算符)

    1、apache-hive-3.1.2简介及部署(三种部署方式-内嵌模式、本地模式和远程模式)及验证详解 2、hive相关概念详解–架构、读写文件机制、数据存储 3、hive的使用示例详解-建表、数据类型详解、内部外部表、分区表、分桶表 4、hive的使用示例详解-事务表、视图、物化视图、DDL

    2024年02月09日
    浏览(45)
  • MATLAB基础操作,矩阵乘法、数组矩阵索引、最大最小运算符、零矩阵/随机矩阵/单位矩阵的生成、log函数、Inf和NaN的含义,语句过长用连接符换行、逻辑运算符以及区别

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 本文总结MATLAB编程时的一些基本操作,适用于新手小白,主要包括矩阵相乘、生成矩阵、矩阵基本操作、数组索引、最大最小操作符。 线性代数的两个矩阵相乘:用符号 “ * ” 例如A*B得到A与B的矩阵相

    2024年02月04日
    浏览(73)
  • matlab 矩阵处理方法:缩放、插值、拟合、分块...

    目录 1. 缩放矩阵尺寸 2. 对矩阵进行反距离权重插值填补nan值 3. 数据拟合 4. 数组大小超过限制(分块处理) 在MATLAB中,可以使用 imresize 函数对矩阵进行缩放尺寸操作。 imresize 函数用于调整图像或矩阵的尺寸,可以按比例缩小或放大矩阵。 其中: A 是原始矩阵或图像。 sca

    2024年02月11日
    浏览(31)
  • C++ 二维差分 二维前缀和逆运算 差分矩阵

    输入一个 n 行 m 列的整数矩阵,再输入 q 个操作,每个操作包含五个整数 x1,y1,x2,y2,c ,其中 (x1,y1) 和 (x2,y2) 表示一个子矩阵的左上角坐标和右下角坐标。 每个操作都要将选中的子矩阵中的每个元素的值加上 c 。 请你将进行完所有操作后的矩阵输出。 输入格式 第一行包含整数

    2024年02月21日
    浏览(52)
  • MATLAB插值函数interp1

    插值是离散函数逼近的重要方法,利用它可通过函数在有限个点处的取值状况,估算出函数在其它点处的近似值。 插值可以实现对数据的平滑,或对缺失间断等部分的补偿。 与拟合不同的是,插值要求曲线通过所有的已知数据。计算插值有两种基本的方法: 对一个完整的数

    2024年02月12日
    浏览(33)
  • 数据结构实验之矩阵的运算器(二维数组)

    实验目的 掌握并学会运用数组及相关知识 掌握矩阵相关运算的代码实现 学会小组的分工与合作 体会封装的好处 实验任务及要求 要求实现矩阵的计算器,能供用户选择不同菜单,进而实现不同存储形式及调用相应计算的算法,并记录运算过程。 运算程序主要包括:①矩阵的

    2024年01月15日
    浏览(37)
  • Python 二维矩阵加一个变量运算该如何避免 for 循环

    今天写代码的时候遇到了一个问题,比如我们需要做一个二维矩阵运算,其中一个矩阵是 2x2 的,另一个是 2x1 的。在这个二维矩阵中,其中各个参数会随着一个参数变化,我们需要对这个变化的参数进行采样,那么我们可否不使用 for 循环来处理这一问题呢? 阅读这一篇前,

    2024年02月19日
    浏览(34)
  • matlab 二维矩阵变成一维矩阵

    1、一维变二维: https://blog.csdn.net/qq_40584593/article/details/90691276 reshape 2、a(:)即可 https://jingyan.baidu.com/article/d45ad148dc221b29552b80ec.html

    2024年02月11日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包