cantera/samples/matlab/catcomb.m
Ray Speth 2528df0f75 Reorganized source tree structure
These changes make it unnecessary to copy header files around during
the build process, which tends to confuse IDEs and debuggers. The
headers which comprise Cantera's external C++ interface are now in
the 'include' directory.

All of the samples and demos are now in the 'samples' subdirectory.
2012-02-12 02:27:14 +00:00

237 lines
7 KiB
Matlab

% CATCOMB -- Catalytic combustion on platinum.
%
% This script solves a catalytic combustion problem. A stagnation flow
% is set up, with a gas inlet 10 cm from a platinum surface at 900
% K. The lean, premixed methane/air mixture enters at ~ 6 cm/s (0.06
% kg/m2/s), and burns catalytically on the platinum surface. Gas-phase
% chemistry is included too, and has some effect very near the
% surface.
%
% The catalytic combustion mechanism is from Deutschman et al., 26th
% Symp. (Intl.) on Combustion,1996 pp. 1747-1754
%
help catcomb;
%disp('press any key to start the simulation');
%pause;
clear all;
cleanup;
t0 = cputime; % record the starting time
% Parameter values are collected here to make it easier to modify
% them
p = oneatm; % pressure
tinlet = 300.0; % inlet temperature
tsurf = 900.0; % surface temperature
mdot = 0.06; % kg/m^2/s
transport = 'Mix'; % transport model
% We will solve first for a hydrogen/air case to
% use as the initial estimate for the methane/air case
% composition of the inlet premixed gas for the hydrogen/air case
comp1 = 'H2:0.05, O2:0.21, N2:0.78, AR:0.01';
% composition of the inlet premixed gas for the methane/air case
comp2 = 'CH4:0.095, O2:0.21, N2:0.78, AR:0.01';
% the initial grid, in meters. The inlet/surface separation is 10 cm.
initial_grid = [0.0 0.02 0.04 0.06 0.08 0.1]; % m
% numerical parameters
tol_ss = [1.0e-8 1.0e-14]; % [rtol atol] for steady-state problem
tol_ts = [1.0e-4 1.0e-9]; % [rtol atol] for time stepping
loglevel = 1; % amount of diagnostic output
% (0 to 5)
refine_grid = 1; % 1 to enable refinement, 0 to
% disable
%%%%%%%%%%%%%%% end of parameter list %%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%% create the gas object %%%%%%%%%%%%%%%%%%%%%%%%
%
% This object will be used to evaluate all thermodynamic, kinetic,
% and transport properties
%
% The gas phase will be taken from the definition of phase 'gas' in
% input file 'ptcombust.cti,' which is a stripped-down version of
% GRI-Mech 3.0.
gas = importPhase('ptcombust.cti','gas');
set(gas,'T',tinlet,'P',p,'X',comp1);
%%%%%%%%%%%%%%%% create the interface object %%%%%%%%%%%%%%%%%%
%
% This object will be used to evaluate all surface chemical production
% rates. It will be created from the interface definition 'Pt_surf'
% in input file 'ptcombust.cti,' which implements the reaction
% mechanism of Deutschmann et al., 1995 for catalytic combustion on
% platinum.
%
surf_phase = importInterface('ptcombust.cti','Pt_surf',gas);
setTemperature(surf_phase, tsurf);
% integrate the coverage equations in time for 1 s, holding the gas
% composition fixed to generate a good starting estimate for the
% coverages.
advanceCoverages(surf_phase, 1.0);
% The two objects we just created are independent of the problem
% type -- they are useful in zero-D simulations, 1-D simulations,
% etc. Now we turn to creating the objects that are specifically
% for 1-D simulations. These will be 'stacked' together to create
% the complete simulation.
%%%%%%%%%%%%%%%% create the flow object %%%%%%%%%%%%%%%%%%%%%%%
%
% The flow object is responsible for evaluating the 1D governing
% equations for the flow. We will initialize it with the gas
% object, and assign it the name 'flow'.
%
flow = AxisymmetricFlow(gas, 'flow');
% set some parameters for the flow
set(flow, 'P', p, 'grid', initial_grid, 'tol', tol_ss, 'tol-time', tol_ts);
%%%%%%%%%%%%%%% create the inlet %%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% The temperature, mass flux, and composition (relative molar) may be
% specified. This object provides the inlet boundary conditions for
% the flow equations.
%
inlt = Inlet('inlet');
% set the inlet parameters. Start with comp1 (hydrogen/air)
set(inlt, 'T', tinlet, 'MassFlux', mdot, 'X', comp1);
%%%%%%%%%%%%%% create the surface %%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
% This object provides the surface boundary conditions for the flow
% equations. By supplying object surface_phase as an argument, the
% coverage equations for its surface species will be added to the
% equation set, and used to compute the surface production rates of
% the gas-phase species.
%
surf = Surface('surface', surf_phase);
setTemperature(surf,tsurf);
%%%%%%%%%%%%% create the stack %%%%%%%%%%%%
%
% Once the component parts have been created, they can be assembled
% to create the 1D simulation.
%
sim1D = Stack([inlt, flow, surf]);
% set the initial profiles.
setProfile(sim1D, 2, {'u', 'V', 'T'}, [0.0 1.0 % z/zmax
0.06 0.0 % u
0.0 0.0 % V
tinlet tsurf]); % T
names = speciesNames(gas);
for k = 1:nSpecies(gas)
y = massFraction(inlt, k);
setProfile(sim1D, 2, names{k}, [0 1; y y]);
end
sim1D
%setTimeStep(fl, 1.0e-5, [1, 3, 6, 12]);
%setMaxJacAge(fl, 4, 5);
%%%%%%%%%%%%% solution %%%%%%%%%%%%%%%%%%%%
% start with the energy equation on
enableEnergy(flow);
% disable the surface coverage equations, and turn off all gas and
% surface chemistry
setCoverageEqs(surf, 'off');
setMultiplier(surf_phase, 0.0);
setMultiplier(gas, 0.0);
% solve the problem, refining the grid if needed
solve(sim1D, 1, refine_grid);
% now turn on the surface coverage equations, and turn the
% chemistry on slowly
setCoverageEqs(surf, 'on');
for iter=1:6
mult = 10.0^(iter - 6);
setMultiplier(surf_phase, mult);
setMultiplier(gas, mult);
solve(sim1D, 1, refine_grid);
end
% At this point, we should have the solution for the hydrogen/air
% problem. Now switch the inlet to the methane/air composition.
set(inlt,'X',comp2);
% set more stringent grid refinement criteria
setRefineCriteria(sim1D, 2, 100.0, 0.15, 0.2);
% solve the problem for the final time
solve(sim1D, loglevel, refine_grid);
% show the solution
sim1D
% save the solution
saveSoln(sim1D,'catcomb.xml','energy',['solution with energy' ...
' equation']);
%%%%%%%%%% show statistics %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
writeStats(sim1D);
elapsed = cputime - t0;
e = sprintf('Elapsed CPU time: %10.4g',elapsed);
disp(e);
%%%%%%%%%% make plots %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
clf;
subplot(3,3,1);
plotSolution(sim1D, 'flow', 'T');
title('Temperature [K]');
subplot(3,3,2);
plotSolution(sim1D, 'flow', 'u');
title('Axial Velocity [m/s]');
subplot(3,3,3);
plotSolution(sim1D, 'flow', 'V');
title('Radial Velocity / Radius [1/s]');
subplot(3,3,4);
plotSolution(sim1D, 'flow', 'CH4');
title('CH4 Mass Fraction');
subplot(3,3,5);
plotSolution(sim1D, 'flow', 'O2');
title('O2 Mass Fraction');
subplot(3,3,6);
plotSolution(sim1D, 'flow', 'CO');
title('CO Mass Fraction');
subplot(3,3,7);
plotSolution(sim1D, 'flow', 'CO2');
title('CO2 Mass Fraction');
subplot(3,3,8);
plotSolution(sim1D, 'flow', 'H2O');
title('H2O Mass Fraction');
subplot(3,3,9);
plotSolution(sim1D, 'flow', 'H2');
title('H2 Mass Fraction');