在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,這樣就完成了柱面展開為平面的操作。