CFX計算環形葉柵時,圓柱面展開為平面的Matlab 程序

在CFD后處理過程中,有時需要將一個圓柱面上的參數展開為一個平面并導入到Tecplot中進行出云圖或流線圖,這就需要坐標變換,下面的程序就是采用matlab編寫的柱面展開程序。如果有建議,歡迎大家共同交流。

%% 壓力數據展開

% 數據讀取

clc

clear all

close all

cyl_data = csvread('cyl_data_Pre_50H.csv'); % 讀取CFX中Export的50%葉高的流道壓力數據(環形葉柵),數據先把文件開頭幾行非數據字符行刪掉

[m,n] = size(cyl_data);

cyl_x = cyl_data(:,1); % x坐標

cyl_y = cyl_data(:,2); % y坐標

cyl_z = cyl_data(:,3); % z坐標

data = cyl_data(:,4); % 壓力

pi = 3.1415926;

f_plane_data = fopen('plane_data_Pre_50H.dat', 'w');? % 新建數據文件保存展開為xy平面的數據,三列數據分別為:x坐標、y坐標、壓力。

% 進行坐標變化

for i = 1:m

? ? if abs(cyl_y(i))<0.0000001? &&? cyl_x(i)<0 % 避免z(i)特別小等于0時,atan(x(i)/z(i))計算出錯

? ? ? ? theta = -pi/2;

? ? elseif abs(cyl_y(i))<0.0000001? &&? cyl_x(i)>0? % 避免z(i)特別小等于0時,atan(x(i)/z(i))計算出錯

? ? ? ? theta = pi/2;

? ? elseif cyl_y(i)<0? &&? cyl_x(i)<0? % -90度~-180度

? ? ? ? theta = atan(x(i)/z(i)) - pi;

? ? elseif cyl_y(i)<0? &&? cyl_x(i)>0? % 90度~180度

? ? ? ? theta = atan(x(i)/z(i)) + pi;

? ? elseif cyl_y(i)>0? % -90度~90度

? ? ? ? theta = atan(cyl_x(i)/cyl_y(i));

? ? end

? ? L(i,1) = theta*sqrt(cyl_x(i)^2 + cyl_y(i)^2); % 弧長L

? ? fprintf(f_plane_data, '%.16f? ? ? ? %.16f? ? ? %.16f\n', L(i,1), cyl_z(i), data(i));

end

fclose(f_plane_data);

Mesh_XY = [L, cyl_z];

save Mesh_XY Mesh_XY % 保存數據的xy坐標為Mesh_XY.mat

save data data? % 保存壓力數據為data.mat

%% 葉片輪廓數據展開(由于Tecplot繪制云圖需要進行tranglate操作,所以需要定義葉片表面的輪廓線,在CFX中將50%葉高處的葉片輪廓線的xyz坐標導出為blade_50H.csv)

clc

clear all

close all

cyl_data = csvread('blade_50H.csv'); %CFX中將50%葉高處的葉片輪廓線的xyz坐標導出為blade_50H.csv

[m,n] = size(cyl_data);

cyl_x = cyl_data(:,1);

cyl_y = cyl_data(:,2);

cyl_z = cyl_data(:,3);

pi = 3.1415926;

f_plane_data = fopen('plane_blade_50H.dat', 'w'); %新建數據文件保存展開為xy平面的數據,二列數據分別為:x坐標、y坐標。

% 坐標變化

for i = 1:m

? ? if abs(cyl_y(i))<0.0000001? &&? cyl_x(i)<0 % 避免z(i)特別小等于0時,atan(x(i)/z(i))計算出錯

? ? ? ? theta = -pi/2;

? ? elseif abs(cyl_y(i))<0.0000001? &&? cyl_x(i)>0? % 避免z(i)特別小等于0時,atan(x(i)/z(i))計算出錯

? ? ? ? theta = pi/2;

? ? elseif cyl_y(i)<0? &&? cyl_x(i)<0? % -90度~-180度

? ? ? ? theta = atan(x(i)/z(i)) - pi;

? ? elseif cyl_y(i)<0? &&? cyl_x(i)>0? % 90度~180度

? ? ? ? theta = atan(x(i)/z(i)) + pi;

? ? elseif cyl_y(i)>0? % -90度~90度

? ? ? ? theta = atan(cyl_x(i)/cyl_y(i));

? ? end

? ? L(i,1) = theta*sqrt(cyl_x(i)^2 + cyl_y(i)^2); % 弧長L

? ? fprintf(f_plane_data, '%.16f? ? ? ? %.16f\n', L(i,1), cyl_z(i));

end

fclose(f_plane_data);

Boundry_XY = [L, cyl_z];

save Boundry_XY Boundry_XY % 保存數據的xy坐標為Boundry_XY.mat

%% 輸出為Tecplot的標準格式

load( 'Mesh_XY');

load( 'data');

load( 'Boundry_XY');

f_pre = fopen('Pre_Counter.dat.', 'w');

fprintf(f_pre, 'VARIABLES = "X", "Y", "P"\nZONE T = "mesh"\nI = 126372, J = 1, F = POINT\n');

for j = 1:126372 % 126372為cyl_data_Pre_50H.csv中數據點個數

? ? fprintf(f_pre, '%.16f %.16f %.16f\n', Mesh_XY(j, 1), Mesh_XY(j, 2), data(j, 1));

end

fprintf(f_pre, 'VARIABLES = "X", "Y", "Z"\nZONE T = "boundry0%d"\nI = 485, J = 1, F = POINT\n', i);

for j = 1:485 % 485為blade_50H.csv中數據點個數

? ? fprintf(f_pre, '%.16f %.16f 0\n', Boundry_XY(b, 1), Boundry_XY(b, 2));

end

fclose(f_pre);

最后將輸出的Pre_Counter.dat文件導入到tecplot中采用2D繪圖,再使用Data—>Tranglate,選擇boundry并complute,這樣就完成了柱面展開為平面的操作。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容