From 762c776a09c23a80bb9cf8e020dbd141e516a659 Mon Sep 17 00:00:00 2001 From: mgashwinkumar <53496594+mgashwinkumar@users.noreply.github.com> Date: Wed, 3 Jun 2020 10:02:27 -0400 Subject: [PATCH] Add files via upload --- samples/matlab/General_Plug_Flow_Reactor.m | 105 +++++++++++++++++++++ samples/matlab/PFR_setup.m | 42 +++++++++ samples/matlab/PFR_solver.m | 48 ++++++++++ 3 files changed, 195 insertions(+) create mode 100644 samples/matlab/General_Plug_Flow_Reactor.m create mode 100644 samples/matlab/PFR_setup.m create mode 100644 samples/matlab/PFR_solver.m diff --git a/samples/matlab/General_Plug_Flow_Reactor.m b/samples/matlab/General_Plug_Flow_Reactor.m new file mode 100644 index 00000000000..aa6a7411c2c --- /dev/null +++ b/samples/matlab/General_Plug_Flow_Reactor.m @@ -0,0 +1,105 @@ +% General_Plug_Flow_Reactor(PFR) - to solve PFR equations for reactors +% +% This code snippet is to model a constant area and varying area +% (converging and diverging) nozzle as Plug Flow Reactor with given +% dimensions and an incoming gas. The pressure is not assumed to be +% constant here as opposed to the Python Version of the +% Plug Flow Reactor modelling. +% +% The governing equations used in this code can be referenced at: +% *S.R Turns, An Introduction to Combustion - Concepts and Applications, +% McGraw Hill Education, India, 2012, 206-210.* +% + +%% Setting the Gas +clear all +close all +clc + +%Temperature of gas +T0=1473; +%Pressure of gas +P0=4.47*101325; + +%Equivalence Ratio +Phi=0.2899; + +gas_calc = IdealGasMix('gri30.cti'); +ich4 = speciesIndex(gas_calc,'CH4'); +io2 = speciesIndex(gas_calc,'O2'); +in2 = speciesIndex(gas_calc,'N2'); +nsp = nSpecies(gas_calc); +x = zeros(nsp,1); +% Change the below values for different Phi values of methane Combustion +x(ich4,1) = Phi; +x(io2,1) = 2.0; +x(in2,1) = 7.52; +set(gas_calc,'T',T0,'P',P0,'MoleFractions',x); +gas_calc=equilibrate(gas_calc,'HP'); + +%% Calculation of properties along the reactor length +% The Dimensions and conditions of the reactor are given below + +% Inlet Area +A_in = 0.018; +% Exit Area +A_out = 0.003; +% Length of the reactor +L = 1.284*0.0254; +% The whole reactor is divided into n small reactors +n = 100; +% Mass flow rate into the reactor in Kg/s +mdot_calc = 1.125; +% k = -1 makes the solver solve for converging area. +% k = +1 makes the solver solve for diverging area. +% k = 0 makes the solver solve for constant cross sectional area +if A_in>A_out + k=-1; +elseif A_out>A_in + k=1; +else k=0; +end + +% The above values are passed on to the PFR function to solve for density, temperature and Mass fractions +dAdx = abs(A_in-A_out)/L; +[T_calc,rho_calc,x_calc,Y_calc] = PFR_setup(A_in,A_out,L,n,k,gas_calc,mdot_calc); +A_calc = A_in+k.*x_calc*dAdx; +for i=1:length(x_calc) + gas_after_solving_calc = gas_calc; + % The gas is set to the solved property values at each location + set(gas_after_solving_calc,'Temperature',T_calc(i),'Density',rho_calc(i),'MassFractions',Y_calc(i,:)); + % Velocity is calculated from Mass flow rate, Area and Density + vx_calc(i) = mdot_calc./(A_calc(i)*rho_calc(i)); + % Specific Gas Constant + R_calc(i) = 8314/meanMolecularWeight(gas_after_solving_calc); + % Mach No. is calculated from local velocity and local speed of sound + M_calc(i) = vx_calc(i)/soundspeed(gas_after_solving_calc); + % Pressure is calculated from density, temeprature and gas constant + P_calc(i) = rho_calc(i)*R_calc(i)*T_calc(i); +end + +%% Plotting +plot(x_calc,M_calc) +xlabel('X-Position (m)') +ylabel('Mach No') +title('Mach No Variation') +figure(2) +plot(x_calc,A_calc) +xlabel('X-Position (m)') +ylabel('Area(m^2)') +title('Reactor Profile') +figure(3) +plot(x_calc,T_calc) +xlabel('X-Position (m)') +ylabel('Temperature') +title('Temperature Variation') +figure(4) +plot(x_calc,rho_calc) +xlabel('X-Position (m)') +ylabel('Density (Kg/m^3)') +title('Density Variation') +figure(5) +plot(x_calc,P_calc) +xlabel('X-Position (m)') +ylabel('Pressure (Pa)') +title('Pressure Variation') diff --git a/samples/matlab/PFR_setup.m b/samples/matlab/PFR_setup.m new file mode 100644 index 00000000000..2aacb30229f --- /dev/null +++ b/samples/matlab/PFR_setup.m @@ -0,0 +1,42 @@ +function [T,rho,x,Y] = PFR_setup(A_in,A_out,L,n,k,gas,mdot) + +dAdx = abs(A_in-A_out)/L; +dx = L/n;% The whole length of the reactor is divided into n small lengths + +T(1) = temperature(gas); +P(1) = pressure(gas); +Y(1,:) = massFractions(gas); +rho(1) = density(gas); + +x = 0:dx:L; + +for i = 2:length(x) + + %Solver location indicator + Solving_current_reactor = i + Total_reactors = length(x) + nsp = nSpecies(gas); +%-------------------------------------------------------------------------- +%------The values of variables at previous location are given as initial--- +%------values to the current iteration and the limits of the current------- +%--------------reactor and the gas entering it are being set--------------- +%-------------------------------------------------------------------------- + init(1) = rho(i-1); + init(2) = T(i-1); + init(3:nsp+2) = Y(i-1,:); + limits = [x(i-1),x(i)]; + set(gas,'T',T(i-1),'Density',rho(i-1),'MoleFractions',Y(i-1,:)); + options = odeset('RelTol',1.e-10,'AbsTol',1e-10,'InitialStep',1e-8,'NonNegative',1); +%-------------------------------------------------------------------------- +%-------------------------------------------------------------------------- + % These values are passed onto the ode15s solver + [~,y] = ode15s(@PFR_solver,limits,init,options,gas,mdot,A_in,dAdx,k); + + T(i) =y(end,2); + rho(i)=y(end,1); + Y(i,:)=y(end,3:nsp+2); +end + + + +end diff --git a/samples/matlab/PFR_solver.m b/samples/matlab/PFR_solver.m new file mode 100644 index 00000000000..97bf3c4ae14 --- /dev/null +++ b/samples/matlab/PFR_solver.m @@ -0,0 +1,48 @@ +function [F] = PFR_solver(x,initial,gas,mdot,A_in,dAdx,k) + +rho = initial(1); +T = initial(2); +Y = initial(3:length(initial)); + +if k==1 + A = A_in+k*dAdx*x; +elseif k==-1 + A = A_in+k*dAdx*x; + dAdx = -dAdx; +else + A = A_in+k*dAdx*x; +end + +MW_mix = meanMolecularWeight(gas); +Ru = 8314; +R = Ru/MW_mix; +nsp = nSpecies(gas); +vx = mdot/(rho*A); +P = rho*R*T; + +% the gas is set to the corresponding properties during each iteration of the ode loop +set(gas,'Temperature',T,'Density',rho,'MassFractions',Y); + + +MW = molecularWeights(gas); +h = enthalpies_RT(gas).*R.*T; +w = netProdRates(gas); +Cp = cp_mass(gas); +%-------------------------------------------------------------------------- +%---F(1), F(2) and F(3:end) are the differential equations modelling the--- +%---density, temperature and mass fractions variations along a plug flow--- +%-------------------------reactor------------------------------------------ +%-------------------------------------------------------------------------- +F(1)=((1-R/Cp)*((rho*vx)^2)*(1/A)*(dAdx)... + + rho*R*sum(MW.*w.*(h-MW_mix*Cp*T./MW))/(vx*Cp) )... + / (P*(1+vx^2/(Cp*T)) - rho*vx^2); + +F(2) = (vx*vx/(rho*Cp))*F(1) + vx*vx*(1/A)*(dAdx)/Cp... + - (1/(vx*rho*Cp))*sum(h.*w.*MW); + +F(3:nsp+2) = w(1:nsp).*MW(1:nsp)./(rho*vx); + +F = F'; + +end +