在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,这样就完成了柱面展开为平面的操作。