How to plot flow data from an orifice in MATLAB without overlapping the plots?

  • Context: MATLAB 
  • Thread starter Thread starter JD_PM
  • Start date Start date
  • Tags Tags
    Data Matlab Plot
Join the discussion
Ask a follow-up here, or get your own question answered by working scientists, mathematicians and engineers — people, not an autocomplete.
Real named experts · corrections over time · the nuance an AI answer skips
2 replies · 3K views
JD_PM
Messages
1,125
Reaction score
156
TL;DR
I am aimed at overlapping the plots for the speed distribution over the vertical width profile (which is 0.015 m long; highlighted in red) for two downstream, horizontal distances [w.r.t. the orifice]: 0.01 m and 0.03 m.

How to modify my code such that it swaps all row data?
I am studying a flow going through an orifice.

I am aimed at overlapping the plots for the speed distribution over the vertical width profile (which is 0.015 m long; highlighted in red) for two downstream, horizontal distances [w.r.t. the orifice]: 0.01 m and 0.03 m.

Screenshot (186).png


The result should look as follows (the highest peak corresponds to 0.01m width profile)

1mm3mmOverlappingPlots.png

I have the data for both downstream distances (in csv format, here you can find it https://drive.google.com/drive/folders/1CgeDuCahVZvLXXkNkGWlPg8lSGyurmI3).

Let me create two tables, first related to 0.01m data and second to 0.03 m. For the sake of simplicity I only include three row data. The columns labeled - contain irrelevant data for this particular problem.

0.01m data

U0U1U2--XYZ
-0.0443263.0829e-050.001639411.5e-050.010-0.007485
-0.0886556.1659e-050.00327913e-050.010-0.00747
-0.132989.2489e-050.004918414.5e-050.010-0.007455

0.03m data

U0U1U2--XYZ
-0.11972-0.00036133-0.001235511.5e-050.030-0.007485
-0.23945-0.00072269-0.00247113e-050.030-0.00747
-0.35918-0.001084-0.003706615e-050.030-0.007455
Let's draw our attention to how to code this in MATLAB. The algorithm I have in mind is:

0) Optimize the given table: eliminate first and last rows (the velocity there is zero due to no-slip condition on the walls)

1) Read the velocity data from the csv table and compute the speed ##U = \sqrt{U_0^2 + U_1^2 + U_2^2}## for each data row.

2) Store the speed and width values in variables.

3) Repeat 2) and 3) for the other csv file.

4) Ready to plot.

I managed to write a code that works for the three-rows-of-data tables above

Matlab:
Ai = readtable("sampleData10mm.csv"); %step 0)
A = Ai(2:1000,:); %step 0)
fComr1 = A{1:1,"U_0"}; %step 1)
sComr1 = A{1:1,"U_1"}; %step 1)
tComr1 = A{1:1,"U_2"}; %step 1)
fComr2 = A{2:2,"U_0"}; %step 1)
sComr2 = A{2:2,"U_1"}; %step 1)
tComr2 = A{2:2,"U_2"}; %step 1)
fComr3 = A{3:3,"U_0"}; %step 1)
sComr3 = A{3:3,"U_1"}; %step 1)
tComr3 = A{3:3,"U_2"}; %step 1)

Ur1 = sqrt(fComr1^2 + sComr1^2 + tComr1^2); %step 1)
Ur2 = sqrt(fComr2^2 + sComr2^2 + tComr2^2); %step 1)
Ur3 = sqrt(fComr3^2 + sComr3^2 + tComr3^2); %step 1)

speed = [0;Ur1;Ur2;Ur3]; %step 2)
width = [0;A{1:1,"Points_2"}+0.0075;A{2:2,"Points_2"}+0.0075;A{3:3,"Points_2"}+0.0075]; %step 2); Note I added +0.0075 because we want to have data from 0 to 0.016 mm in the x axis

Bi = readtable("sampleData30mm.csv"); %step 3)
B = Bi(2:1000,:); %step 3)
fComr1_30mm = B{1:1,"U_0"};  %step 3)
sComr1_30mm = B{1:1,"U_1"};  %step 3)
tComr1_30mm = B{1:1,"U_2"};  %step 3)
fComr2_30mm = B{2:2,"U_0"};  %step 3)
sComr2_30mm = B{2:2,"U_1"};  %step 3)
tComr2_30mm = B{2:2,"U_2"};  %step 3)
fComr3_30mm = B{3:3,"U_0"};  %step 3)
sComr3_30mm = B{3:3,"U_1"};  %step 3)
tComr3_30mm = B{3:3,"U_2"};  %step 3)
Ur1_30mm = sqrt(fComr1_30mm^2 + sComr1_30mm^2 + tComr1_30mm^2); %step 3)
Ur2_30mm = sqrt(fComr2_30mm^2 + sComr2_30mm^2 + tComr2_30mm^2); %step 3)
Ur3_30mm = sqrt(fComr3_30mm^2 + sComr3_30mm^2 + tComr3_30mm^2); %step 3)
speed_30mm = [0;Ur1_30mm;Ur2_30mm;Ur3_30mm]; %step 3)
width_30mm = [0;B{1:1,"Points_2"}+0.0075;B{2:2,"Points_2"}+0.0075;B{3:3,"Points_2"}+0.0075]; %step 3)

figure %step 4)
plot(width,width_30mm,speed,speed_30mm) %step 4)
legend({'0.01 m', '0.03 m'},'Location','northwest') %step 4)
xlabel('width [m]') %step 4)
ylabel('U magnitude [m/s]') %step 4)
axis square; %step 4)
grid on; %step 4)

The issue I have is that I do not see how to write a code that does it for the 1000 rows. I guess there has to be a way of automatizing the whole process...

I am quite sure the code can be written more efficiently (it's my first MATLAB code ever!), so please feel to add suggestions :)

Thank you! :biggrin:

PS: Shout out to the Moderation Staff for asking me to write more details! :smile:
 
on Phys.org
this looks pretty straight-forward. i'll give you an idea, maybe not the whole clean code, but enough to point you to a viable solution

i use structs fairly often for things like this, though probably not the most efficient.

Matlab:
data=struct(); %creates struct
for i=1:length(A);   %from 1 to size of table
data(1).u0(i)=A{i:i,"U_0"};    %speeds at first line
data(1).u1(i)=A{i:i,"U_1"};
data(1).u2(i)=A{i:i,"U_2"};
data(2).u0(i)=B{i:i,"U_0"};    %speeds at second line
data(2).u1(i)=B{i:i,"U_1"};
data(2).u2(i)=B{i:i,"U_2"};
data(1).mag=(data(1).u0(i)^2+data(1).u1(i)^2+data(1).u2(i)^2)^.5   %calculates magnitude for every point
data(2).mag=(data(2).u0(i)^2+data(2).u1(i)^2+data(2).u2(i)^2)^.5

data(1).z(i)=A{i:i,"Z"};   %gathers the z points into a vector

end
plot(data(1).z, data(1).mag);
hold on
plot(data(1).z, data(2).mag);

edit:
--------
Honestly, it's pretty quick and easy to do this all in excel...
 
Last edited by a moderator:
Reply
  • Like
Likes   Reactions: JD_PM
Nice, thank you! I am not familiar with structs so I will definitely learn from it.

Let me share the code I got so far

Matlab:
clc
close all
clear all
warning('OFF', 'MATLAB:table:ModifiedAndSavedVarnames')

%step 0
Ai = readtable("sampleData10mm.csv");
Bi = readtable("sampleData30mm.csv");
A = Ai(2:1000,:);
B = Bi(2:1000,:);

%step 1
fCom_10mm = A{:,"U_0"};
sCom_10mm = A{:,"U_1"};
tCom_10mm = A{:,"U_2"};
width_10mm = A{:,"Points_2"};
U_10mm = sqrt(fCom_10mm.^2 + sCom_10mm.^2 + tCom_10mm.^2);
%refined_width_10mm = [0;A(:,"Points_2")+0.0075];
%refined_width_10mm = A{:,"Points_2"+0.0075};

%step 2
fCom_30mm = B{:,"U_0"};
sCom_30mm = B{:,"U_1"};
tCom_30mm = B{:,"U_2"};
width_30mm = B{:,"Points_2"};
U_30mm = sqrt(fCom_30mm.^2 + sCom_30mm.^2 + tCom_30mm.^2);
%refined_width_30mm = [0;B(:,"Points_2")+0.0075];
%refined_width_30mm = B{:,"Points_2" + 0.0075};

%step 3
figure
plot(width_10mm,U_10mm,width_30mm,U_30mm)
%plot(refined_width_10mm,U_10mm,refined_width_30mm,U_30mm)
legend({'0.01 m', '0.03 m'},'Location','northwest')
xlabel('width [m]')
ylabel('U magnitude [m/s]')
axis square;
grid on;

Which yields

Screenshot (189).png


I am almost there. I am working on how to get the zero at the x-axis y-axis intersection:

Screenshot (190).png