Skip to content

Commit 0d8c970

Browse files
Merge pull request #1094 from CombustionToolbox/develop
Add: include new CT-LIA module for solving shock-turbulence interaction problems using linear theory #991 and new display classes
2 parents 66915d4 + 7e5d94e commit 0d8c970

File tree

27 files changed

+3979
-48
lines changed

27 files changed

+3979
-48
lines changed

+combustiontoolbox/+core/@ChemicalSystem/setListSpecies.m

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@
132132
'C8H18_isooctane', 'CH', 'CH2', 'CH2CO_ketene', ...
133133
'CH2OH', 'CH3', 'CH3CHO_ethanal', 'CH3CN', ...
134134
'CH3COOH', 'CH3O', 'CH3OH', 'CH4', 'CN', 'COOH', 'H', ...
135-
'H2O2', 'HCCO', 'HCHO_formaldehy', 'HCN', 'HCO', ...
135+
'H2O2', 'HCCO', 'HCHO_formaldehy', 'HCN', 'HCO', 'HNO2', ...
136136
'HCOOH', 'HNC', 'HNCO', 'HNO', 'HO2', 'N', 'N2O', ...
137137
'NCO', 'NH', 'NH2', 'NH2OH', 'NH3', 'NO', 'NO2', ...
138138
'O', 'OCCN', 'OH', 'C3O2', 'C4N2', 'CH3CO_acetyl', ...
@@ -142,7 +142,7 @@
142142
'C4H8_tr2_butene', 'C4H9_i_butyl', 'C4H9_n_butyl', ...
143143
'C4H9_s_butyl', 'C4H9_t_butyl', 'C6H5OH_phenol', ...
144144
'C6H5O_phenoxy', 'C6H5_phenyl', 'C7H7_benzyl', ...
145-
'C7H8', 'C8H8_styrene', 'C10H8_naphthale','H2ObLb'};
145+
'C7H8', 'C8H8_styrene', 'C10H8_naphthale', 'H2ObLb'};
146146

147147
case {'AIR', 'DISSOCIATED AIR'}
148148
listSpecies = {'CO2', 'CO', 'O2', 'N2', 'Ar', 'O', 'O3', ...

+combustiontoolbox/+equilibrium/@EquilibriumSolver/EquilibriumSolver.m

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,6 @@
4444
root_T0 = 3000 % Temperature guess [K] if it's outside previous range - root finding method
4545
FLAG_EXTRAPOLATE = true % Flag indicating linear extrapolation of the polynomials fits
4646
FLAG_FAST = true % Flag indicating use guess composition of the previous computation
47-
FLAG_TCHEM_FROZEN = false % Flag to consider a thermochemically frozen gas (calorically perfect gas)
48-
FLAG_FROZEN = false % Flag to consider a calorically imperfect gas with frozen chemistry
4947
FLAG_EOS = false % Flag to use non-ideal Equation of States (EoS)
5048
FLAG_RESULTS = true % Flag to print results
5149
FLAG_TIME = true % Flag to print elapsed time
@@ -65,6 +63,8 @@
6563
defaultProblemType = 'TP';
6664
defaultPlotConfig = combustiontoolbox.utils.display.PlotConfig();
6765
defaultCaloricGasModel = combustiontoolbox.core.CaloricGasModel.imperfect;
66+
defaultFLAG_TCHEM_FROZEN = false;
67+
defaultFLAG_FROZEN = false;
6868

6969
% Parse input arguments
7070
p = inputParser;
@@ -88,8 +88,8 @@
8888
addParameter(p, 'root_T0', obj.root_T0, @(x) isnumeric(x) && x > 0);
8989
addParameter(p, 'FLAG_EXTRAPOLATE', obj.FLAG_EXTRAPOLATE, @(x) islogical(x));
9090
addParameter(p, 'FLAG_FAST', obj.FLAG_FAST, @(x) islogical(x));
91-
addParameter(p, 'FLAG_TCHEM_FROZEN', obj.FLAG_TCHEM_FROZEN, @(x) islogical(x));
92-
addParameter(p, 'FLAG_FROZEN', obj.FLAG_FROZEN, @(x) islogical(x));
91+
addParameter(p, 'FLAG_TCHEM_FROZEN', defaultFLAG_TCHEM_FROZEN, @(x) islogical(x));
92+
addParameter(p, 'FLAG_FROZEN', defaultFLAG_FROZEN, @(x) islogical(x));
9393
addParameter(p, 'FLAG_EOS', obj.FLAG_EOS, @(x) islogical(x));
9494
addParameter(p, 'FLAG_RESULTS', obj.FLAG_RESULTS, @(x) islogical(x));
9595
addParameter(p, 'FLAG_TIME', obj.FLAG_TIME, @(x) islogical(x));
@@ -119,8 +119,6 @@
119119
obj.root_T0 = p.Results.root_T0;
120120
obj.FLAG_EXTRAPOLATE = p.Results.FLAG_EXTRAPOLATE;
121121
obj.FLAG_FAST = p.Results.FLAG_FAST;
122-
obj.FLAG_TCHEM_FROZEN = p.Results.FLAG_TCHEM_FROZEN;
123-
obj.FLAG_FROZEN = p.Results.FLAG_FROZEN;
124122
obj.FLAG_EOS = p.Results.FLAG_EOS;
125123
obj.FLAG_RESULTS = p.Results.FLAG_RESULTS;
126124
obj.FLAG_TIME = p.Results.FLAG_TIME;
@@ -133,7 +131,7 @@
133131
warning(['The flags ''FLAG_TCHEM_FROZEN'' and ''FLAG_FROZEN'' are deprecated. ', ...
134132
'Please use the ''caloricGasModel'' parameter with values from the CaloricGasModel enumeration instead.']);
135133

136-
obj.caloricGasModel = obj.caloricGasModel.fromFlag(obj.FLAG_TCHEM_FROZEN, obj.FLAG_FROZEN);
134+
obj.caloricGasModel = obj.caloricGasModel.fromFlag(p.Results.FLAG_TCHEM_FROZEN, p.Results.FLAG_FROZEN);
137135
end
138136

139137
end

+combustiontoolbox/+rocket/@RocketSolver/RocketSolver.m

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,6 @@
6767

6868
if sum(contains(p.UsingDefaults, 'equilibriumSolver'))
6969
obj.equilibriumSolver.caloricGasModel = p.Results.caloricGasModel;
70-
obj.equilibriumSolver.FLAG_TCHEM_FROZEN = p.Results.FLAG_TCHEM_FROZEN;
71-
obj.equilibriumSolver.FLAG_FROZEN = p.Results.FLAG_FROZEN;
7270
obj.equilibriumSolver.tolMoles = p.Results.tolMoles;
7371
end
7472

@@ -84,7 +82,7 @@
8482
warning(['The flags ''FLAG_TCHEM_FROZEN'' and ''FLAG_FROZEN'' are deprecated. ', ...
8583
'Please use the ''caloricGasModel'' parameter with values from the CaloricGasModel enumeration instead.']);
8684

87-
obj.equilibriumSolver.caloricGasModel = obj.equilibriumSolver.caloricGasModel.fromFlag(obj.equilibriumSolver.FLAG_TCHEM_FROZEN, obj.equilibriumSolver.FLAG_FROZEN);
85+
obj.equilibriumSolver.caloricGasModel = obj.equilibriumSolver.caloricGasModel.fromFlag(p.Results.FLAG_TCHEM_FROZEN, p.Results.FLAG_FROZEN);
8886
end
8987

9088
end

+combustiontoolbox/+shockdetonation/@DetonationSolver/DetonationSolver.m

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -112,8 +112,6 @@
112112

113113
if sum(contains(p.UsingDefaults, 'equilibriumSolver'))
114114
obj.equilibriumSolver.caloricGasModel = p.Results.caloricGasModel;
115-
obj.equilibriumSolver.FLAG_TCHEM_FROZEN = p.Results.FLAG_TCHEM_FROZEN;
116-
obj.equilibriumSolver.FLAG_FROZEN = p.Results.FLAG_FROZEN;
117115
obj.equilibriumSolver.tolMoles = p.Results.tolMoles;
118116
end
119117

@@ -132,7 +130,7 @@
132130
warning(['The flags ''FLAG_TCHEM_FROZEN'' and ''FLAG_FROZEN'' are deprecated. ', ...
133131
'Please use the ''caloricGasModel'' parameter with values from the CaloricGasModel enumeration instead.']);
134132

135-
obj.equilibriumSolver.caloricGasModel = obj.equilibriumSolver.caloricGasModel.fromFlag(obj.equilibriumSolver.FLAG_TCHEM_FROZEN, obj.equilibriumSolver.FLAG_FROZEN);
133+
obj.equilibriumSolver.caloricGasModel = obj.equilibriumSolver.caloricGasModel.fromFlag(p.Results.FLAG_TCHEM_FROZEN, p.Results.FLAG_FROZEN);
136134
end
137135

138136
end

+combustiontoolbox/+shockdetonation/@JumpConditionsSolver/JumpConditionsSolver.m

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,6 @@
129129
parse(p, varargin{:});
130130

131131
% Set parameters
132-
obj.caloricGasModel = p.Results.caloricGasModel;
133132
obj.equilibriumSolver = p.Results.equilibriumSolver;
134133
obj.shockSolver = p.Results.shockSolver;
135134
obj.tolGammas1 = p.Results.tolGammas1;
@@ -147,9 +146,8 @@
147146
obj.plotConfig = p.Results.plotConfig;
148147

149148
if sum(contains(p.UsingDefaults, 'equilibriumSolver'))
150-
obj.equilibriumSolver.FLAG_TCHEM_FROZEN = p.Results.FLAG_TCHEM_FROZEN;
151-
obj.equilibriumSolver.FLAG_FROZEN = p.Results.FLAG_FROZEN;
152149
obj.equilibriumSolver.FLAG_FAST = p.Results.FLAG_FAST;
150+
obj.equilibriumSolver.caloricGasModel = p.Results.caloricGasModel;
153151
end
154152

155153
if sum(contains(p.UsingDefaults, 'shockSolver'))
@@ -167,9 +165,11 @@
167165
warning(['The flags ''FLAG_TCHEM_FROZEN'' and ''FLAG_FROZEN'' are deprecated. ', ...
168166
'Please use the ''caloricGasModel'' parameter with values from the CaloricGasModel enumeration instead.']);
169167

170-
obj.equilibriumSolver.caloricGasModel = obj.equilibriumSolver.caloricGasModel.fromFlag(obj.equilibriumSolver.FLAG_TCHEM_FROZEN, obj.equilibriumSolver.FLAG_FROZEN);
168+
obj.equilibriumSolver.caloricGasModel = obj.equilibriumSolver.caloricGasModel.fromFlag(p.Results.FLAG_TCHEM_FROZEN, p.Results.FLAG_FROZEN);
171169
end
172170

171+
% Assign equilibriumSolver to shockSolver
172+
obj.shockSolver.equilibriumSolver = obj.equilibriumSolver;
173173
end
174174

175175
function value = get.MIN_MACH(obj)
@@ -278,7 +278,7 @@
278278
jumpConditions = getJumpData(obj);
279279

280280
% Solve Gammas (calorically perfect gas)
281-
if obj.caloricGasModel.isPerfect()
281+
if obj.equilibriumSolver.caloricGasModel.isPerfect()
282282
[jumpConditions.Gammas1, jumpConditions.Gammas2, jumpConditions.Gammas3] = obj.getGammasPerfect(jumpConditions.gamma1, jumpConditions.M1);
283283

284284
% Interpolate results into a smaller grid
@@ -450,7 +450,7 @@ function printTime(obj)
450450
% Get properties
451451
rho1 = [mixArray1.rho]; rho2 = [mixArray2.rho];
452452
p1 = [mixArray1.p]; p2 = [mixArray2.p];
453-
T1 = [mixArray1.p]; T2 = [mixArray2.p];
453+
T1 = [mixArray1.T]; T2 = [mixArray2.T];
454454
M1 = [mixArray1.mach]; M2 = [mixArray2.mach];
455455
a1 = [mixArray1.sound]; a2 = [mixArray2.sound];
456456
u1 = [mixArray1.u]; u2 = [mixArray2.uShock];

+combustiontoolbox/+shockdetonation/@ShockSolver/ShockSolver.m

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,6 @@
106106

107107
if sum(contains(p.UsingDefaults, 'equilibriumSolver'))
108108
obj.equilibriumSolver.caloricGasModel = p.Results.caloricGasModel;
109-
obj.equilibriumSolver.FLAG_TCHEM_FROZEN = p.Results.FLAG_TCHEM_FROZEN;
110-
obj.equilibriumSolver.FLAG_FROZEN = p.Results.FLAG_FROZEN;
111109
end
112110

113111
% Miscellaneous
@@ -120,7 +118,7 @@
120118
warning(['The flags ''FLAG_TCHEM_FROZEN'' and ''FLAG_FROZEN'' are deprecated. ', ...
121119
'Please use the ''caloricGasModel'' parameter with values from the CaloricGasModel enumeration instead.']);
122120

123-
obj.equilibriumSolver.caloricGasModel = obj.equilibriumSolver.caloricGasModel.fromFlag(obj.equilibriumSolver.FLAG_TCHEM_FROZEN, obj.equilibriumSolver.FLAG_FROZEN);
121+
obj.equilibriumSolver.caloricGasModel = obj.equilibriumSolver.caloricGasModel.fromFlag(p.Results.FLAG_TCHEM_FROZEN, p.Results.FLAG_FROZEN);
124122
end
125123

126124
end
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
classdef (Abstract) ShockTurbulenceModel < handle
2+
% The :mat:class:`ShockTurbulenceModel` abstract class defines the interface
3+
% for modeling turbulence amplification across a shock wave interacting with
4+
% weak turbulence using linear interaction analysis. It serves as the base class
5+
% for specific shock–turbulence interaction models.
6+
%
7+
% Uptream turbulence can be comprised of the following type of disturbances:
8+
% * vortical (shockTurbulenceModelVortical)
9+
% * acoustic (shockTurbulenceModelAcoustic)
10+
% * vortical + entropic (shockTurbulenceModelVorticalEntropic)
11+
% * vortical + entropic + acoustic (shockTurbulenceModelCompressible)
12+
%
13+
% These models are based on our previous theoretical work [1]
14+
% and have been extended to multi-component mixtures [2-4] using the
15+
% Combustion Toolbox [5].
16+
%
17+
% References:
18+
% [1] Huete, C., Cuadra, A., Vera, M., Urzay, & J. (2021). Thermochemical
19+
% effects on hypersonic shock waves interacting with weak turbulence.
20+
% Physics of Fluids 33, 086111 (featured article). DOI: 10.1063/5.0059948.
21+
%
22+
% [2] Cuadra, A., Vera, M., Di Renzo, M., & Huete, C. (2023). Linear Theory
23+
% of Hypersonic Shocks Interacting with Turbulence in Air. In 2023 AIAA
24+
% SciTech Forum, National Harbor, USA. DOI: 10.2514/6.2023-0075.
25+
%
26+
% [3] Cuadra, A., Williams, C. T., Di Renzo, M. & Huete, C. (2024). Compressibility
27+
% and vibrational-excitation effects in hypersonic shock-turbulence interaction.
28+
% Tech. Rep. Summer Program Proceedings, Center for Turbulence Research,
29+
% Stanford University.
30+
%
31+
% [4] Cuadra, A., Di Renzo, M., Hoste, J. J. O., Williams, C. T., Vera, M., & Huete, C. (2025).
32+
% Review of shock-turbulence interaction with a focus on hypersonic flow. Physics of Fluids, 37(4).
33+
% DOI: 10.1063/5.0255816.
34+
%
35+
% [5] Cuadra, A., Huete, C., Vera, M. (2022). Combustion Toolbox:
36+
% A MATLAB-GUI based open-source tool for solving gaseous
37+
% combustion problems. Zenodo. DOI: 10.5281/zenodo.5554911.
38+
39+
properties
40+
problemType % Type of problem ('compressible', 'vortical', 'vortical_entropic', 'acoustic')
41+
averages % A structure with computed averages
42+
dimensions % Number of dimensions (2D or 3D turbulence)
43+
integrator % Integrator object for numerical integration
44+
end
45+
46+
properties (Access = protected)
47+
pdf % Probability density function (PDF) for the turbulence model
48+
end
49+
50+
methods
51+
52+
function obj = ShockTurbulenceModel(varargin)
53+
% Constructor for ShockTurbulenceModel
54+
55+
% Default values
56+
defaultProblemType = 'vortical';
57+
defaultDimensions = 3;
58+
defaultIntegrator = combustiontoolbox.utils.math.Integrator();
59+
60+
% Parse inputs
61+
p = inputParser;
62+
addOptional(p, 'problemType', defaultProblemType, @(x) ischar(x) && any(strcmpi(x, {'compressible', 'vortical', 'vortical_entropic', 'acoustic'})));
63+
addParameter(p, 'dimensions', defaultDimensions, @(x) isnumeric(x) && isscalar(x) && (x >= 1 || x <= 3));
64+
addParameter(p, 'integrator', defaultIntegrator, @(x) isa(x, 'combustiontoolbox.utils.math.Integrator'));
65+
parse(p, varargin{:});
66+
67+
% Set properties
68+
obj.problemType = p.Results.problemType;
69+
obj.dimensions = p.Results.dimensions;
70+
obj.integrator = p.Results.integrator;
71+
end
72+
73+
end
74+
75+
76+
methods (Abstract)
77+
averages = getAverages(obj, varargin)
78+
obj = setPDF(obj)
79+
end
80+
81+
methods (Access = protected)
82+
83+
function value = integrate(obj, fun, a, b, varargin)
84+
% Integrate a function fun from a to b using the Integrator class
85+
%
86+
% Args:
87+
% fun (function): Function handle to be integrated
88+
% a (float): Lower limit of integration
89+
% b (float): Upper limit of integration
90+
%
91+
% Returns:
92+
% value(float): result of the integration
93+
94+
value = obj.integrator.integrate(fun, a, b, varargin{:});
95+
end
96+
97+
end
98+
99+
end

0 commit comments

Comments
 (0)