国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Fluent UDF中調(diào)用Matlab矩陣運算函數(shù)(以二維插值為例)

這篇具有很好參考價值的文章主要介紹了Fluent UDF中調(diào)用Matlab矩陣運算函數(shù)(以二維插值為例)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Fluent UDF中經(jīng)常需要用到一些常見算法,例如插值、擬合、矩陣運算等等,這些在UDF中是沒有現(xiàn)成函數(shù)實現(xiàn)的,理論上需要我們自己去寫函數(shù)。另一方面我們又注意到這些運算恰恰是Matlab的強(qiáng)項,幾乎調(diào)用一個現(xiàn)成的函數(shù)就完成了目的。所以我們有什么辦法把Matlab函數(shù)給UDF直接調(diào)用呢?

這里提供一種借助于VC++ UDF Studio插件實現(xiàn)調(diào)用Matlab函數(shù)的方法,且編譯好以后的UDF庫拿到?jīng)]有安裝對應(yīng)Matlab版本的機(jī)器上仍然可以使用。以前硫酸亞銅博客(https://www.cnblogs.com/liusuanyatong/p/12128082.html)提供的方法是依賴于Matlab運行庫,編譯好的UDF庫如果拿到?jīng)]有安裝相應(yīng)Matlab版本機(jī)器上是沒法運行的。

???????? 前面博客文章已經(jīng)介紹過用VC++ UDF Studio插件實現(xiàn)調(diào)用誤差函數(shù)erf的例子(https://www.cnblogs.com/SuperUDF/articles/16114086.html)。但是該函數(shù)輸入?yún)?shù)是標(biāo)量,和矩陣輸入?yún)?shù)還是有所不同。所以,這里再以調(diào)用Matlab中的interp2二維插值函數(shù)為例來說明矩陣作為輸入?yún)?shù)時的使用過程。

1. 官網(wǎng)下載VC++ UDF Studio插件并安裝:VC++ UDF Studio,建議下載學(xué)術(shù)版(如想進(jìn)一步采購注冊,對高校老師學(xué)生比較優(yōu)惠)

matlab可以寫udf嗎,Fluent,UDF,matlab,矩陣,開發(fā)語言,c++matlab可以寫udf嗎,Fluent,UDF,matlab,矩陣,開發(fā)語言,c++

2.?安裝Visual Studio(插件2022R2開始支持VS2010~2019社區(qū),專業(yè)或旗艦版,建議安裝VS2010旗艦版), C++和C#一起安裝,對于64位Fluent還要勾選X64編譯器。

?matlab可以寫udf嗎,Fluent,UDF,matlab,矩陣,開發(fā)語言,c++

?3.?安裝Matlab 2014a ~ 2021b任一版本,必須勾選Matlab Coder,其它視自己喜好安裝。

?matlab可以寫udf嗎,Fluent,UDF,matlab,矩陣,開發(fā)語言,c++

4.?管理員權(quán)限打開桌面圖標(biāo),選擇需要的版本并勾選“調(diào)用Matlab”后會自動啟動Fluent,讀入case并點擊Fluent嵌入菜單中的“Start Visual Studio”子菜單。

?matlab可以寫udf嗎,Fluent,UDF,matlab,矩陣,開發(fā)語言,c++matlab可以寫udf嗎,Fluent,UDF,matlab,矩陣,開發(fā)語言,c++matlab可以寫udf嗎,Fluent,UDF,matlab,矩陣,開發(fā)語言,c++

5.?把自帶的matlab函數(shù)文件MatlabAdd.m改名為MatlabInterpolate.m,另外一個自動生成的文件MatlabFunctionTester.m是用來在Matlab中測試調(diào)試函數(shù)文件用的,下一步會介紹用法,這一步不用管。然后雙擊打開編輯MatlabInterpolate.m,輸入以下自定義Matlab函數(shù)體。?

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

matlab可以寫udf嗎,Fluent,UDF,matlab,矩陣,開發(fā)語言,c++??

6.?雙擊打開MatlabFunctionTester.m,輸入如下測試代碼,從而便于測試我們前面定義的MatlabInterpolate函數(shù)。

clear all
[X,Y]=meshgrid(-2:0.75:2); %6*6的均布網(wǎng)格,每隔0.75一個點
R=sqrt(X.^2+Y.^2)+1E-6; 
V=sin(R)./(R);  %每個網(wǎng)格點的對應(yīng)函數(shù)值
surf(X,Y,V);  %畫出曲面
xlim([-2 2]); %限制顯示x坐標(biāo)區(qū)域為[-2,2]
ylim([-2 2]); %限制顯示y坐標(biāo)區(qū)域為[-2,2]
Xi=0; %要插值點的x坐標(biāo)
Yi=0; %要插值點的y坐標(biāo)
Vi=MatlabInterpolate(X,Y,V,Xi,Yi); %Vi就是插值得到的x=0,y=0處的值

?7.?鼠標(biāo)右鍵在MatlabFunctionTester.m文件上單擊彈出菜單,選擇“用Matlab打開”,這樣就可以在Matlab里面一步一步調(diào)試我們定義的MatlabInterpolate函數(shù),排除錯誤后關(guān)閉Matlab。

matlab可以寫udf嗎,Fluent,UDF,matlab,矩陣,開發(fā)語言,c++

?matlab可以寫udf嗎,Fluent,UDF,matlab,矩陣,開發(fā)語言,c++

?畫出來的曲面和各矩陣值如下,插值運算得到Vi結(jié)果為0.9590。

matlab可以寫udf嗎,Fluent,UDF,matlab,矩陣,開發(fā)語言,c++matlab可以寫udf嗎,Fluent,UDF,matlab,矩陣,開發(fā)語言,c++matlab可以寫udf嗎,Fluent,UDF,matlab,矩陣,開發(fā)語言,c++

matlab可以寫udf嗎,Fluent,UDF,matlab,矩陣,開發(fā)語言,c++?matlab可以寫udf嗎,Fluent,UDF,matlab,矩陣,開發(fā)語言,c++

8.?點擊工具欄上“將.m文件轉(zhuǎn)為C/C++”按鈕,輸入?yún)?shù)均設(shè)為float類型(雙精度fluent時為double),設(shè)置矩陣尺寸請點擊“矩陣”按鈕,然后勾選“動態(tài)”并確定。注意:試用版沒法開啟“矩陣“作為輸入?yún)?shù),必須購買注冊后才能使用。

?matlab可以寫udf嗎,Fluent,UDF,matlab,矩陣,開發(fā)語言,c++

?matlab可以寫udf嗎,Fluent,UDF,matlab,矩陣,開發(fā)語言,c++matlab可以寫udf嗎,Fluent,UDF,matlab,矩陣,開發(fā)語言,c++

?其中,Dyn*Dyn代表該矩陣行和列都是“動態(tài)尺寸”,例如第一個參數(shù)X轉(zhuǎn)換成C/C++代碼后就會表示為

const emxArray_real32_T *X

?其中,emxArray_real32_T是一個存放動態(tài)數(shù)組的結(jié)構(gòu)體,其定義為

struct emxArray_real32_T
{
  float *data;  //指向存放數(shù)據(jù)的數(shù)組
  int *size;    //存放維數(shù)的數(shù)組,實際就是兩個元素size[0]和size[1]
  int allocatedSize; //總的元素個數(shù),等于行數(shù)乘以列數(shù)
  int numDimensions; //數(shù)組的維數(shù),插件中永遠(yuǎn)是2,代表數(shù)組有行和列2個維數(shù)
  boolean_T canFreeData; //是否需要調(diào)用free來釋放由calloc或malloc開辟的data數(shù)組
};

?9.?等待片刻,轉(zhuǎn)換完成后,會自動將對應(yīng)的轉(zhuǎn)換得到的C++頭文件MatlabLibrary.h加入到UDF工程中。

matlab可以寫udf嗎,Fluent,UDF,matlab,矩陣,開發(fā)語言,c++

?轉(zhuǎn)換后的C/C++函數(shù)原型為

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的具體數(shù)據(jù),C++語言是行優(yōu)先的,所以數(shù)據(jù)應(yīng)該是Matlab矩陣數(shù)據(jù)按照列優(yōu)先排列
		-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的具體數(shù)據(jù),C++語言是行優(yōu)先的,所以數(shù)據(jù)應(yīng)該是Matlab矩陣數(shù)據(jù)按照列優(yōu)先排列
		-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存儲坐標(biāo)x,y處對應(yīng)的散點值,即Matlab程序中的V

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

	for(int i=0;i<RowSize;i++)  // 填充坐標(biāo)x,y對應(yīng)的散點值
	{
		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; //指向定長一維數(shù)組X_data
	X.size = X_size; //指向定長二維數(shù)組X_size
	X.allocatedSize = X_size[0] * X_size[1]; //行數(shù)乘以列數(shù),MatlabInterpolate函數(shù)中實際并未用到,此行也可以不寫
	X.numDimensions = 2; //永遠(yuǎn)為2,代表二維數(shù)組,行和列,MatlabInterpolate函數(shù)中實際并未用到,此行也可以不寫
	X.canFreeData = false;  //因為X_data不是由calloc或malloc開辟的動態(tài)數(shù)組,所以不需要free,MatlabInterpolate函數(shù)中實際并未用到,此行也可以不寫

	Y.data = Y_data; //指向定長一維數(shù)組Y_data
	Y.size = Y_size; //指向定長二維數(shù)組Y_size
	Y.allocatedSize = Y_size[0] * Y_size[1]; //行數(shù)乘以列數(shù),MatlabInterpolate函數(shù)中實際并未用到,此行也可以不寫
	Y.numDimensions = 2; //永遠(yuǎn)為2,代表二維數(shù)組,行和列,MatlabInterpolate函數(shù)中實際并未用到,此行也可以不寫
	Y.canFreeData = false;  //因為Y_data不是由calloc或malloc開辟的動態(tài)數(shù)組,所以不需要free,MatlabInterpolate函數(shù)中實際并未用到,此行也可以不寫

	V.data = V_data; //指向定長一維數(shù)組V_data
	V.size = V_size; //指向定長二維數(shù)組V_size
	V.allocatedSize = V_size[0] * V_size[1]; //行數(shù)乘以列數(shù),MatlabInterpolate函數(shù)中實際并未用到,此行也可以不寫
	V.numDimensions = 2; //永遠(yuǎn)為2,代表二維數(shù)組,行和列,MatlabInterpolate函數(shù)中實際并未用到,此行也可以不寫
	V.canFreeData = false;  //因為V_data不是由calloc或malloc開辟的動態(tài)數(shù)組,所以不需要free,MatlabInterpolate函數(shù)中實際并未用到,此行也可以不寫

	float Xi=0, Yi=0; //插值的目標(biāo)x,y值
	float Vi=MatlabInterpolate(&X,&Y,&V, Xi,Yi); //調(diào)用Matlab插值函數(shù)
	Message0("The interpolated value at coordinate (0,0) is %g\n", Vi);
}

matlab可以寫udf嗎,Fluent,UDF,matlab,矩陣,開發(fā)語言,c++

如果出現(xiàn)INFINITY,NAN未聲明的標(biāo)識符的錯誤,那么請使用較高版本的Visual Studio,例如Visual Studio2015或更高。

matlab可以寫udf嗎,Fluent,UDF,matlab,矩陣,開發(fā)語言,c++

11.?執(zhí)行DEFINE宏,本例由于插值函數(shù)放在DEFINE_ON_DEMAND宏中,所以在Execute On Demand對話框里面手動執(zhí)行。

?matlab可以寫udf嗎,Fluent,UDF,matlab,矩陣,開發(fā)語言,c++matlab可以寫udf嗎,Fluent,UDF,matlab,矩陣,開發(fā)語言,c++

?12.?Fluent中運行結(jié)果如下,和前面直接Matlab里面的結(jié)果是一致的。

?matlab可以寫udf嗎,Fluent,UDF,matlab,矩陣,開發(fā)語言,c++文章來源地址http://www.zghlxwxcb.cn/news/detail-698531.html

到了這里,關(guān)于Fluent UDF中調(diào)用Matlab矩陣運算函數(shù)(以二維插值為例)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • MATLAB-三維插值運算

    MATLAB-三維插值運算

    MATLAB中是支持三維及三維以上的高維插值的。三維插值的基本原理與一維插值和二維插值是一樣的,但三維插值是對三維函數(shù)進(jìn)行的插值。在MATLAB中,使用interp3函數(shù)實現(xiàn)插值,其調(diào)用格式如下。 vi= interp3(x,y,z,v,xi,yi,zi) %返回值 vi是三維插值網(wǎng)格(xi,yi,zi)上的函數(shù)值估計,其中

    2023年04月10日
    瀏覽(19)
  • MATLAB-拉格朗日插值運算

    MATLAB-拉格朗日插值運算

    在結(jié)點上給出結(jié)點基函數(shù),接著做該基函數(shù)的線性組合,組合的系數(shù)為結(jié)點的函數(shù)值,這種插值多項式稱為拉格朗日插值公式。通俗地說,就是通過平面上的兩個點確定一條直線。該插值方法是一種較為基礎(chǔ)的方法,同時該方法也較容易理解與實現(xiàn)。 拉格朗日插值多項式的表

    2024年02月06日
    瀏覽(15)
  • 7、hive shell客戶端與屬性配置、內(nèi)置運算符、函數(shù)(內(nèi)置運算符與自定義UDF運算符)

    7、hive shell客戶端與屬性配置、內(nèi)置運算符、函數(shù)(內(nèi)置運算符與自定義UDF運算符)

    1、apache-hive-3.1.2簡介及部署(三種部署方式-內(nèi)嵌模式、本地模式和遠(yuǎn)程模式)及驗證詳解 2、hive相關(guān)概念詳解–架構(gòu)、讀寫文件機(jī)制、數(shù)據(jù)存儲 3、hive的使用示例詳解-建表、數(shù)據(jù)類型詳解、內(nèi)部外部表、分區(qū)表、分桶表 4、hive的使用示例詳解-事務(wù)表、視圖、物化視圖、DDL

    2024年02月09日
    瀏覽(20)
  • MATLAB基礎(chǔ)操作,矩陣乘法、數(shù)組矩陣索引、最大最小運算符、零矩陣/隨機(jī)矩陣/單位矩陣的生成、log函數(shù)、Inf和NaN的含義,語句過長用連接符換行、邏輯運算符以及區(qū)別

    MATLAB基礎(chǔ)操作,矩陣乘法、數(shù)組矩陣索引、最大最小運算符、零矩陣/隨機(jī)矩陣/單位矩陣的生成、log函數(shù)、Inf和NaN的含義,語句過長用連接符換行、邏輯運算符以及區(qū)別

    提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助文檔 本文總結(jié)MATLAB編程時的一些基本操作,適用于新手小白,主要包括矩陣相乘、生成矩陣、矩陣基本操作、數(shù)組索引、最大最小操作符。 線性代數(shù)的兩個矩陣相乘:用符號 “ * ” 例如A*B得到A與B的矩陣相

    2024年02月04日
    瀏覽(107)
  • matlab 矩陣處理方法:縮放、插值、擬合、分塊...

    目錄 1. 縮放矩陣尺寸 2. 對矩陣進(jìn)行反距離權(quán)重插值填補(bǔ)nan值 3. 數(shù)據(jù)擬合 4. 數(shù)組大小超過限制(分塊處理) 在MATLAB中,可以使用 imresize 函數(shù)對矩陣進(jìn)行縮放尺寸操作。 imresize 函數(shù)用于調(diào)整圖像或矩陣的尺寸,可以按比例縮小或放大矩陣。 其中: A 是原始矩陣或圖像。 sca

    2024年02月11日
    瀏覽(20)
  • C++ 二維差分 二維前綴和逆運算 差分矩陣

    C++ 二維差分 二維前綴和逆運算 差分矩陣

    輸入一個 n 行 m 列的整數(shù)矩陣,再輸入 q 個操作,每個操作包含五個整數(shù) x1,y1,x2,y2,c ,其中 (x1,y1) 和 (x2,y2) 表示一個子矩陣的左上角坐標(biāo)和右下角坐標(biāo)。 每個操作都要將選中的子矩陣中的每個元素的值加上 c 。 請你將進(jìn)行完所有操作后的矩陣輸出。 輸入格式 第一行包含整數(shù)

    2024年02月21日
    瀏覽(24)
  • MATLAB插值函數(shù)interp1

    MATLAB插值函數(shù)interp1

    插值是離散函數(shù)逼近的重要方法,利用它可通過函數(shù)在有限個點處的取值狀況,估算出函數(shù)在其它點處的近似值。 插值可以實現(xiàn)對數(shù)據(jù)的平滑,或?qū)θ笔чg斷等部分的補(bǔ)償。 與擬合不同的是,插值要求曲線通過所有的已知數(shù)據(jù)。計算插值有兩種基本的方法: 對一個完整的數(shù)

    2024年02月12日
    瀏覽(16)
  • 數(shù)據(jù)結(jié)構(gòu)實驗之矩陣的運算器(二維數(shù)組)

    數(shù)據(jù)結(jié)構(gòu)實驗之矩陣的運算器(二維數(shù)組)

    實驗?zāi)康?掌握并學(xué)會運用數(shù)組及相關(guān)知識 掌握矩陣相關(guān)運算的代碼實現(xiàn) 學(xué)會小組的分工與合作 體會封裝的好處 實驗任務(wù)及要求 要求實現(xiàn)矩陣的計算器,能供用戶選擇不同菜單,進(jìn)而實現(xiàn)不同存儲形式及調(diào)用相應(yīng)計算的算法,并記錄運算過程。 運算程序主要包括:①矩陣的

    2024年01月15日
    瀏覽(19)
  • Python 二維矩陣加一個變量運算該如何避免 for 循環(huán)

    今天寫代碼的時候遇到了一個問題,比如我們需要做一個二維矩陣運算,其中一個矩陣是 2x2 的,另一個是 2x1 的。在這個二維矩陣中,其中各個參數(shù)會隨著一個參數(shù)變化,我們需要對這個變化的參數(shù)進(jìn)行采樣,那么我們可否不使用 for 循環(huán)來處理這一問題呢? 閱讀這一篇前,

    2024年02月19日
    瀏覽(26)
  • matlab 二維矩陣變成一維矩陣

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

    2024年02月11日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包