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

你可能感兴趣的:(CFX计算环形叶栅时,圆柱面展开为平面的Matlab 程序)