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

你可能感兴趣的:(经验)