Challenge

Week 7 - Simulation of a 1D Super-sonic nozzle flow simulation using Macormack Method

Aim: Simulation of a 1D Super-sonic nozzle flow simulation using Macormack Method.

In this challenge you are going to simulate the isentropic flow through a quasi 1D subsonic-supersonic nozzle. You will derive both the conservation and non-conservation forms of the governing equations and sovle them using the MacCormack's technique. You need to determine the steady-state temperature distribution for the flow-field variables and investigate the difference between the two forms of governing equations by comparing their solutions.

we need to show the following plots inside your report
1. Steady-state distribution of primitive variables inside the nozzle
2. Time-wise variation of the primitive variables
3. Variation of Mass flow rate distribution inside the nozzle at different time steps during the time-marching process
4. Comparison of Normalized mass flow rate distributions of both forms

Theory:

Introduction:Direct numerical stimulation of fluid flow through nozzle has always been a challenging problem and an area of immense interest for modern engineers. Converging-Diverging nozzle has been extensively used in a wide range of Industrial
applications ranging from steam turbines to rocket engine nozzles.

The condition for operation so that the nozzle produces supersonic flow is that the Mach number at throat should be equal to one. This condition is known as choked flow. As the fluid expands further in the diverging section, the fluid flow increases to supersonic velocities.(Mach Number>1).If the choke condition is not met, the nozzle simply acts as a Venturi tube and would produce subsonic flow even at the outlet. This paper uses an explicit finite difference scheme for numerical solution of fluid flow. This scheme is fully explicit and second order accurate in both time and space.

there for we have equation to solve this flow shown below:

for non consevation form:

continuty equation :

momentum equation

energy equation

for coservation form:

continuty equation

momentum equation

energy equation

For solving theis above the equation we have to use the macarmac method:

Maccarmack method:In computational fluid dynamics, the MacCormack method is a widely used discretization scheme for the numerical solution of hyperbolic partial differential equations. This second-order finite difference method was introduced by Robert W. MacCormack in 1969.The MacCormack method is elegant and easy to understand and program.

The MacCormack method is a variation of the two-step Lax–Wendroff scheme but is much simpler in application. To illustrate the algorithm, consider the following first order hyperbolic equation

Predictor step: In the predictor step, a "provisional" value of at time level (denoted by ) is estimated as follows.The above equation is obtained by replacing the spatial and temporal derivatives in the previous first order hyperbolic equation using forward differences.

Corrector step: In the corrector step, the predicted value is corrected according to the equation,

Note that the corrector step uses backward finite difference approximations for spatial derivative. The time-step used in the corrector step is in contrast to the used in the predictor step.

Replacing the term by the temporal average.

Main code:

% witting program for simulation of 1D NOZZEL SUPERSONIC FLO USING MACORMAC
% METHOD 
clear all
close all
clc

%defing the inputs 
%number of grids points
n=31;
x=linspace(0,3,n);
dx=x(2)-x(1);


gamma=1.4;

%numbers of time steps
nt=1400;
CFL=0.5;

%defing the function for non conservation form of simulation 
tic;
[mass_flow_rate_nc, presure_nc, mach_num_nc, rho_nc, v_nc, T_nc, rho_trottle_nc, v_trottle_nc, T_trottle_nc, mass_flow_rate_trottle_nc, presure_trottle_nc, mach_num_trottle_nc]=non_conservative_form_original(x,dx,n,gamma,nt,CFL)
time_elapsed=toc;
fprintf('time elapesed for non coservation form:%f',time_elapsed)
hold on 
%ploting the graphs
figure(3)
%for density
subplot(4,1,1)
plot(linspace(1,nt,1400),rho_trottle_nc,"Color","m");
ylabel("density")
legend({'density at trottle'})
title('timestep variation at trottle area-non conservation form')

%for tempreture 
subplot(4,1,2)
plot(linspace(1,nt,1400),T_trottle_nc,"Color","b");
ylabel("tempreture")
legend({'tempreture at trottle'})
title('timestep variation at trottle area-non conservation form')

% for presure
subplot(4,1,3)
plot(linspace(1,nt,1400),presure_trottle_nc,"Color","r");
ylabel("presure")
legend({'presure at trottle'})
title('timestep variation at trottle area-non conservation form')

%for mach number 
subplot(4,1,4)
plot(linspace(1,nt,1400),mach_num_trottle_nc,"Color","m");
xlabel('time step')
ylabel("mach nuber")
legend({'mach num at trottle'})
title('timestep variation at trottle area-non conservation form')


% steady sTATE simulation for primitive value for nom conservation form 
figure(4)

%for density
subplot(4,1,1)
plot(x,rho_nc,"Color","m");
ylabel("density")
legend({'density'})
title('timestep variation at trottle area-non conservation form')

%for tempreture 
subplot(4,1,2)
plot(x,T_nc,"Color","b");
ylabel("tempreture")
legend({'tempreture'})
title('timestep variation at trottle area-non conservation form')

% for presure
subplot(4,1,3)
plot(x,presure_nc,"Color","r");
ylabel("presure")
legend({'presure'})
title('timestep variation at trottle area-non conservation form')

%for mach number 
subplot(4,1,4)
plot(x,rho_nc,"Color","m");
xlabel('nozzel lenth')
ylabel("mach nuber")
legend({'mach num at trottle'})
title('timestep variation at trottle area-non conservation form')

% %defing the function for conservation form of simulation 
tic;
[mass_flow_rate_c, presure_c, mach_num_c, rho_c,v_c, T_c, rho_trottle_c, v_trottle_c, T_trottle_c, mass_flow_rate_trottle_c, presure_trottle_c, mach_num_trottle_c]=conservation_form(x,dx,n,gamma,nt,CFL);
time_elapsed_c=toc;
fprintf('time elapesed for coservation form:%f',time_elapsed_c)
hold on 

%plotting 
figure(5)
%for density
subplot(4,1,1)
plot(linspace(1,nt,1400),rho_trottle_c,'Color','m');
ylabel("density")
legend({'density at trottel'})
title('timestep variation at trottle area- conservation form')

%for tempreture 
subplot(4,1,2)
plot(linspace(1,nt,1400),T_trottle_c,'Color',"b");
ylabel("tempreture")
legend({'tempreture at trottle'})
title('timestep variation at trottle area- conservation form')

% for presure
subplot(4,1,3)
plot(linspace(1,nt,1400),presure_trottle_c,"Color","r");
ylabel("presure")
legend({'presure at trottle'})
title('timestep variation at trottle area- conservation form')

%for mach number 
subplot(4,1,4)
plot(linspace(1,nt,1400),mach_num_trottle_c,"Color","m");
xlabel('time step')
ylabel("mach nuber")
legend({'mach num at trottle'})
title('timestep variation at trottle area- conservation form')


% steady sTATE simulation for primitive value for nom conservation form 
figure(6)

%for density
subplot(4,1,1)
plot(x,rho_c,"Color","m");
ylabel("density")
legend({'density'})
title('timestep variation at trottle area- conservation form')



%for tempreture 
subplot(4,1,2)
plot(x,T_c,"Color","b");
ylabel("tempreture")
legend({'tempreture'})
title('timestep variation at trottle area-conservation form')

% for presure
subplot(4,1,3)
plot(x,presure_c,"Color","r");
ylabel("presure")
legend({'presure'})
title('timestep variation at trottle area- conservation form')

%for mach number 
subplot(4,1,4)
plot(x,mach_num_c,"Color","m");
xlabel('nozzel lenth')
ylabel("mach nuber")
legend({'mach num at trottle'})
title('timestep variation at trottle area- conservation form')


%camparing the plots of narmalization mass flow rte of both forms

figure(7)
hold on 
plot(x,mass_flow_rate_nc,'r','linewidth',2)
hold on 
plot(x,mass_flow_rate_c,'b','linewidth',2)
hold on 
grid on
legend('non conversion','conversion')
xlabel('lenght of the domain')
ylabel('mass flow rate')
title('camparison of narmalization mass flow rate of both forms')

function for consevation form:

%writting the function for non conservation form using macormac method 
function [mass_flow_rate_c, presure_c, mach_num_c, rho_c, v_c, T_c, rho_trottle_c, v_trottle_c, T_trottle_c, mass_flow_rate_trottle_c, presure_trottle_c, mach_num_trottle_c]=conservation_form(x,dx,n,gamma,nt,CFL)
%[mass_flow_rate_c, presure_c, mach_num_c, rho_c, v_c, T_c, rho_trottle_c, v_trottle_c, T_trottle_c, mass_flow_rate_trottle_c, presure_trottle_c, mach_num_trottle_c]=conservation_form(x,dx,n,gamma,nt,CFL);
%defining the intial boundry condition for density and tempreture
for m =1:n
    if(x(m) >=0 && x(m) <=0.5)
        rho_c(m)=1;
        T_c(m) =1;
    elseif (x(m) >=0.5 && x(m) <=1.5)
        rho_c(m)=1-0.366*(x(m)-0.5);
        T_c(m) =1-0.167*(x(m)-0.5);
    elseif  (x(m) >=1.5 && x(m) <=3.5)
         rho_c(m)=0.634-0.3879*(x(m)-1.5);
        T_c(m) =0.833-0.3507*(x(m)-1.5);
    end
end

%defining for velocity
a=1+2.2*(x-1.5).^2;
v_c =0.59./(rho_c.*a);
presure_c=rho_c.*T_c;

% defining the trottle 
trottle = find(a==1);

% defing the initiel solution variabels 
U1 =rho_c.*a;
U2 =rho_c.*a.*v_c;
U3 =rho_c.*a.*(T_c./(gamma-1))+((gamma/2).*v_c.^2);

%defining the time loop


for k =1:nt

    %defining the time step

    dt =min(CFL.*dx./(sqrt(T_c)+v_c));

    %defing the old values 
    U1_old=U1;
    U2_old=U2;
    U3_old=U3;

    %calculating the flux

    F1=U2;
    F2=((U2.^2)./U1)+((gamma-1)/gamma)*(U3-(gamma/2)*((U2.^2)./U1));
    F3=((gamma*U2.*U3)./U1)-(gamma*(gamma-1)*((U2.^3)./(2*U1.^2)));

    % calculatinf the predector method 

    for j = 2:n-1

        % calculating the souse term
        J2(j)=(1/gamma)*rho_c(j)*T_c(j)*((a(j+1)-a(j))/dx);

        % continuty eqution 

        dU1_dt_p(j)=-((F1(j+1)-F1(j))/dx);

        % momentum equation 
         dU2_dt_p(j)=-((F2(j+1)-F2(j))/dx)+J2(j);
        

         %energy equation 
          dU3_dt_p(j)=-((F3(j+1)-F3(j))/dx);

          % updating the soluton vector 
          U1(j)=U1(j)+dU1_dt_p(j)*dt;
          U2(j)=U2(j)+dU2_dt_p(j)*dt;
          U3(j)=U3(j)+dU3_dt_p(j)*dt;
    end

    %updating the flux 
    F1=U2;
    F2=((U2.^2)./U1)+((gamma-1)/gamma)*(U3-(gamma*0.5*(U2.^2)./U1));
    F3=((gamma*U2.*U3)./U1)-((gamma*0.5*(gamma-1)*(U2.^3)./(U1.^2)));

   

    % know calculating for currector method
    for j=2:n-1

% calculating the souse term
        J2(j)=(1/gamma)*rho_c(j)*T_c(j)*((a(j)-a(j-1))/dx);

        % continuty eqution 

        dU1_dt_c(j)=-((F1(j)-F1(j-1))/dx);

        % momentum equation 
         dU2_dt_c(j)=-((F2(j)-F2(j-1))/dx)+J2(j);
        

         %energy equation 
          dU3_dt_c(j)=-((F3(j)-F3(j-1))/dx);

    end

    %computing the avarege value 

    dU1_dt_av=0.5*(dU1_dt_p+dU1_dt_c);
    dU2_dt_av=0.5*(dU2_dt_p+dU2_dt_c);
    dU3_dt_av=0.5*(dU3_dt_p+dU3_dt_c);

    % calculating the final solution 

    for m=2:n-1
        U1(m)=U1_old(m)+dU1_dt_av(m)*dt;
        U2(m)=U2_old(m)+dU2_dt_av(m)*dt;
        U3(m)=U3_old(m)+dU3_dt_av(m)*dt;
    end

    %appliying the boundry conditions 
    % at inlets 
    U1(1)=rho_c(1)*a(1);
    U2(1)=2*U2(2)-U2(3);
    v_c(1)=U2(1)./U1(1);
    U3(1)=U1(1)*((T_c(1)/(gamma-1))+((gamma/2)*(v_c(1)).^2));

    %at outlet
     U1(n)=2*U1(n-1)-U1(n-2);
     U2(n)=2*U2(n-1)-U2(n-2);
     U3(n)=2*U3(n-1)-U3(n-2);

     %final primitive value update
     rho_c=U1./a;
     v_c=U2./U1;
     T_c=(gamma-1)*((U3./U1)-(gamma/2)*(v_c).^2);

     % defing the mass flow rate 

        %defing the flow rate 
        mass_flow_rate_c = rho_c.*a.*v_c;
        presure_c = rho_c.*T_c;
        mach_num_c = (v_c./sqrt(T_c));

        % calculating the variables at trottle 
        rho_trottle_c(k) = rho_c(trottle);
        T_trottle_c(k) = T_c(trottle);
        v_trottle_c(k) = v_c(trottle);
        mass_flow_rate_trottle_c(k) =  mass_flow_rate_c(trottle);
        presure_trottle_c(k) = presure_c(trottle);
        mach_num_trottle_c(k) = mach_num_c(trottle);
       
         %comparing the non dimensional mass flow at different time step
         %plotting
         figure(2);

        if  k == 50
             plot(x,mass_flow_rate_c,'b','linewidth',1)
             hold on

        elseif k == 150
              plot(x,mass_flow_rate_c,'c','linewidth',1)
          hold on

        elseif k == 200
             plot(x,mass_flow_rate_c,'k','linewidth',1)
          hold on 

        elseif k == 400
             plot(x,mass_flow_rate_c,'g','linewidth',1)
           hold on

        elseif k == 800
             plot(x,mass_flow_rate_c,'m','linewidth',1)
             hold on
        end 

end
%labeling 
xlabel('domain')
ylabel('mass flow rate conservation')
title('camparing the non dimensinal mass flow rate at diffrent time steps-conservation form ')
legend({'50th time step','150th time step','200th time step','400th time step','800th time step'})
grid on

function for non conservation form:

%writting the function for non conservation form using macormac method 
function [mass_flow_rate_nc, presure_nc, mach_num_nc, rho_nc, v_nc, T_nc, rho_trottle_nc, v_trottle_nc, T_trottle_nc, mass_flow_rate_trottle_nc, presure_trottle_nc, mach_num_trottle_nc]=non_conservative_form_original(x,dx,n,gamma,nt,CFL)


%defining the intial boundry condition
rho_nc=1 - 0.3146*x;
T_nc =1 - 0.2341*x;
v_nc=(0.1+1.09*x).*T_nc.^0.5;

%area of the nozzel

a = 1+2.2*(x-1.5).^2;

% defing trottle 
trottle = find(a==1);

%defing the time loop 
%defing the nodes 

for k =1:nt
    dt =min(CFL.*dx./(sqrt(T_nc)+v_nc));

    %defing the old values 

    rho_old=rho_nc;
    T_old=T_nc;
    v_old =v_nc;

    %know we have to solve  for pridictor method

    for j =2:n-1
        

        % simplifying the speciel terms there fore we have equation for continity momentum energy in that equation we are descritizing using forword scheme 
        dv_dx =(v_nc(j+1)-v_nc(j))./dx;
        drho_dx =(rho_nc(j+1)-rho_nc(j))./dx;
        dT_dx =(T_nc(j+1)-T_nc(j))./dx;
        dlog_a_dx =(log(a(j+1))-log(a(j)))./dx;

        % continuty equation 
        drho_dt_p(j)=-rho_nc(j)*dv_dx-rho_nc(j)*v_nc(j)*dlog_a_dx-v_nc(j)*drho_dx;

        %momemtum equation 

        dv_dt_p(j)=-v_nc(j)*dv_dx-(1/gamma)*(dT_dx+(T_nc(j)*drho_dx/rho_nc(j)));

        % energy equation 
        dT_dt_p(j)=-v_nc(j)*dT_dx-(gamma-1)*T_nc(j)*(dv_dx+v_nc(j)*dlog_a_dx);

        % updating the solution 
        rho_nc(j)=rho_nc(j)+drho_dt_p(j)*dt;
        v_nc(j)=v_nc(j)+dv_dt_p(j)*dt;
        T_nc(j)=T_nc(j)+dT_dt_p(j)*dt;
    end

    %know we have to define the equations fo currector methods 
    % simplifying the speciel terms there fore we have equation for continity momentum energy in that equation we are descritizing using backword scheme 
    for j=2:n-1
        dv_dx =(v_nc(j)-v_nc(j-1))./dx;
        drho_dx =(rho_nc(j)-rho_nc(j-1))./dx;
        dT_dx =(T_nc(j)-T_nc(j-1))./dx;
        dlog_a_dx =(log(a(j))-log(a(j-1)))./dx;

        % continuty equation 
        drho_dt_c(j)=-rho_nc(j)*dv_dx-rho_nc(j)*v_nc(j)*dlog_a_dx-v_nc(j)*drho_dx;

        %momemtum equation 

        dv_dt_c(j)=-v_nc(j)*dv_dx-(1/gamma)*(dT_dx+(T_nc(j)*drho_dx/rho_nc(j)));

        % energy equation 
        dT_dt_c(j)=-v_nc(j)*dT_dx-(gamma-1)*T_nc(j)*(dv_dx+v_nc(j)*dlog_a_dx);
    end


     

        % computing the averege vtime deravetion or averege solution 
        drho_dt_av =0.5.*(drho_dt_p+drho_dt_c);
        dv_dt_av =0.5.*(dv_dt_p+dv_dt_c);
        dT_dt_av =0.5.*(dT_dt_p+dT_dt_c);
        
        % final solution 
        for m=2:n-1
            rho_nc(m)=rho_old(m)+(drho_dt_av(m))*dt;
            v_nc(m)=v_old(m)+(dv_dt_av(m))*dt;
            T_nc(m)=T_old(m)+(dT_dt_av(m))*dt;
        end
        % appling the baoundry conditions 
        %AT INLET
        rho_nc(1)=1;
        v_nc(1)=2*v_nc(2)-v_nc(3);
        T_nc(1)=1;

        % at oulet 
        rho_nc(n)=2*rho_nc(n-1)-rho_nc(n-2);
        v_nc(n)=2*v_nc(n-1)-v_nc(n-2);
        T_nc(n)=2*T_nc(n-1)-T_nc(n-2);

        %defing the flow rate 
        mass_flow_rate_nc=rho_nc.*a.*v_nc;
        presure_nc=rho_nc.*T_nc;
        mach_num_nc=(v_nc./sqrt(T_nc));

        % calculating the variables at trottle 
        %trottle=find(a==1);
        
        rho_trottle_nc(k) = rho_nc(trottle);
        T_trottle_nc(k) = T_nc(trottle);
        v_trottle_nc(k) = v_nc(trottle);
        mass_flow_rate_trottle_nc(k) = mass_flow_rate_nc(trottle);
        presure_trottle_nc(k) = presure_nc(trottle);
        mach_num_trottle_nc(k) = mach_num_nc(trottle);

         %comparing the non dimensional mass flow at different time step
         %plotting
         figure(1);

        if  k == 50
             plot(x,mass_flow_rate_nc,'b','linewidth',1)
             hold on

        elseif k == 150
              plot(x,mass_flow_rate_nc,'c','linewidth',1)
          

        elseif k == 200
             plot(x,mass_flow_rate_nc,'m','linewidth',1)
          

        elseif k == 400
             plot(x,mass_flow_rate_nc,'r','linewidth',1)
           

        elseif k == 800
             plot(x,mass_flow_rate_nc,'k','linewidth',1)
        end 

end
%labeling 
xlabel('domain')
ylabel('mass flow rate non conservation')
title('camparing the non dimensinal mass flow rate at diffrent time steps-non conservation form ')
legend({'50th time step','150th time step','200th time step','400th time step','800th time step'})
grid on

Explanetion:

  • first we have to start the program by writting by writting the clear all,close all,clc
  • then we have so solve the equations by using the maccormack mathed for both conservation and non consevation method
  • then we have to plot the graph for all the defferent variabels

output:1

explanetion: in the above figure here we are plotting the mass flow rate againts the different time step and variation of this values are exactly same as shown in andreson book.

output:2

explanation:in the above fogure its showing the variation of non consarvation mass flow rate againt the diffrent time steps and the variation is same as shown in anderson book.

output:3

explanetion:in the above figure its showing the variation of density,time,velocity and mach number at trottle with respect the given time step.

output:4

explanetion:in the above figure its shown that the varion of variables with respect to the nozzel lenth of the non conservation form.

output:5

explanetion:in the above figure its shown that the varion of variables with respect to the nozzel lenth of the conservation form.

output:6

explanetion:in the above figure its shown that the varion of variables with respect to the nozzel lenth of the conservation form.

output:7

explanetion: the above figure shows the mass flow rate comparition of conservation and non conservation form.

Your portfolio, next

Ship work like this
in your own course.

Talk to a career counsellor

Free 20-minute call. We'll map the right course to where you want to work.

By submitting you agree to our Terms and Privacy Policy.

Talk to a career counsellor

Free 20-minute call. We'll map the right course to where you want to work.

By submitting you agree to our Terms and Privacy Policy.