Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion +combustiontoolbox/+common/@Constants/Constants.m
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@
E0 = 8.854187818e-12 % Vacuum permittivity [F/m]
ME = 9.10938356e-31 % Electron mass [kg]
release = 'v1.2.9' % Release version
date = '14 Jan 2026' % Release date
date = '15 Jan 2026' % Release date
end

end
4 changes: 2 additions & 2 deletions CITATION.cff
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@ message: "If you use this software, please cite it using these metadata."
type: misc
license: "GPL-3.0"
title: "Combustion Toolbox: A MATLAB-GUI based open-source tool for solving gaseous combustion problems"
version: 1.2.8
version: 1.2.9
doi: 10.5281/zenodo.5554911
date-released: 2026-01-08
date-released: 2026-01-15
url: "https://combustion-toolbox-website.readthedocs.io"
repository-code: "https://github.com/CombustionToolbox/combustion_toolbox"
abstract:
Expand Down
4 changes: 2 additions & 2 deletions CONTENTS.m
Original file line number Diff line number Diff line change
Expand Up @@ -51,11 +51,11 @@
%
% Cuadra, A., Huete, C., & Vera, M. (2026). Combustion Toolbox: A
% MATLAB-GUI based open-source tool for solving gaseous combustion
% problems. (v1.2.8). Zenodo. https://doi.org/10.5281/zenodo.5554911.
% problems. (v1.2.9). Zenodo. https://doi.org/10.5281/zenodo.5554911.
%
% @author: Alberto Cuadra Lara
%
% Last update Jan 14 2026
% Last update Jan 15 2026
% -------------------------------------------------------------------------
help CONTENTS.m

Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,7 @@ The framework also includes an intuitive **graphical user interface (GUI)**, wit
If you use the Combustion Toolbox in a publication, please cite it using the following references:

* *Cuadra, A., Huete, C., & Vera, M. (2026). Combustion Toolbox: An open-source thermochemical code for gas-and condensed-phase problems involving chemical equilibrium. Computer Physics Communications 320, 110004. [doi:10.1016/j.cpc.2025.110004.](https://doi.org/10.1016/j.cpc.2025.110004).*
* *Cuadra, A., Huete, C., & Vera, M. (2026). Combustion Toolbox: A MATLAB-GUI based open-source tool for solving gaseous combustion problems. Version 1.2.8. Zenodo. [doi:10.5281/zenodo.5554911](https://doi.org/10.5281/zenodo.5554911).*
* *Cuadra, A., Huete, C., & Vera, M. (2026). Combustion Toolbox: A MATLAB-GUI based open-source tool for solving gaseous combustion problems. Version 1.2.9. Zenodo. [doi:10.5281/zenodo.5554911](https://doi.org/10.5281/zenodo.5554911).*

It can be handy the BibTeX format:

Expand All @@ -57,7 +57,7 @@ It can be handy the BibTeX format:
title = "{{Combustion Toolbox: A MATLAB-GUI based open-source tool for solving gaseous combustion problems}}",
author = {A. Cuadra and C. Huete and M. Vera},
year = {2026},
note = {Version 1.2.8},
note = {Version 1.2.9},
doi = {https://doi.org/10.5281/zenodo.5554911}
}
```
484 changes: 460 additions & 24 deletions gui/combustion_toolbox.m

Large diffs are not rendered by default.

Binary file modified gui/combustion_toolbox_app.mlapp
Binary file not shown.
107 changes: 85 additions & 22 deletions gui/utils/gui_CalculateButtonPushed.m
Original file line number Diff line number Diff line change
Expand Up @@ -46,33 +46,33 @@
propertyR4 = gui_get_prop(app.PR4.Value);
additionalInputsR = [additionalInputsR, 'mach', propertyR4];
case {'SHOCK_OBLIQUE', 'SHOCK_POLAR_R'}
propertyR4 = gui_get_prop(app.PR4.Value);
propertyR5 = gui_get_prop(app.PR5.Value);
propertyP5 = gui_get_prop(app.PP5.Value);

if ~isempty(propertyR5)
FLAG_BETA = true;
additionalInputsR = [additionalInputsR, 'mach', propertyR4, 'beta', propertyR5];
else
FLAG_THETA = true;
additionalInputsR = [additionalInputsR, 'mach', propertyR4, 'theta', propertyP5];
end
propertyR4 = gui_get_prop(app.PR4.Value);
propertyR5 = gui_get_prop(app.PR5.Value);
propertyP5 = gui_get_prop(app.PP5.Value);

if ~isempty(propertyR5)
FLAG_BETA = true;
additionalInputsR = [additionalInputsR, 'mach', propertyR4, 'beta', propertyR5];
else
FLAG_THETA = true;
additionalInputsR = [additionalInputsR, 'mach', propertyR4, 'theta', propertyP5];
end

case {'DET_OVERDRIVEN', 'DET_UNDERDRIVEN', 'DET_OVERDRIVEN_R', 'DET_UNDERDRIVEN_R', 'DET_POLAR'}
propertyR3 = gui_get_prop(app.PR3.Value);
additionalInputsR = [additionalInputsR, 'driveFactor', propertyR3];
case {'DET_OBLIQUE', 'DET_POLAR_R'}
propertyR3 = gui_get_prop(app.PR3.Value);
propertyR4 = gui_get_prop(app.PR4.Value);
propertyP4 = gui_get_prop(app.PP4.Value);

if ~isempty(propertyR4)
FLAG_BETA = true;
additionalInputsR = [additionalInputsR, 'driveFactor', propertyR3, 'beta', propertyR4];
else
FLAG_THETA = true;
additionalInputsR = [additionalInputsR, 'driveFactor', propertyR3, 'theta', propertyP4];
end
propertyR3 = gui_get_prop(app.PR3.Value);
propertyR4 = gui_get_prop(app.PR4.Value);
propertyP4 = gui_get_prop(app.PP4.Value);

if ~isempty(propertyR4)
FLAG_BETA = true;
additionalInputsR = [additionalInputsR, 'driveFactor', propertyR3, 'beta', propertyR4];
else
FLAG_THETA = true;
additionalInputsR = [additionalInputsR, 'driveFactor', propertyR3, 'theta', propertyP4];
end
case {'ROCKET'}
propertyP1 = gui_get_prop(app.PP1.Value);
propertyR3 = gui_get_prop(app.PR3.Value);
Expand All @@ -96,6 +96,21 @@
FLAG_ARATIO = true;
end

case {'SHOCKTURBULENCE_VORTICAL', 'SHOCKTURBULENCE_ACOUSTIC'}
propertyP1 = 0; propertyP2 = 0;
propertyR4 = gui_get_prop(app.PR4.Value);
additionalInputsR = [additionalInputsR, 'mach', propertyR4];
case {'SHOCKTURBULENCE_VORTICAL_ENTROPIC'}
propertyP1 = 0;
propertyP2 = gui_get_prop(app.PP1.Value);
propertyR4 = gui_get_prop(app.PR4.Value);
additionalInputsR = [additionalInputsR, 'mach', propertyR4, 'chi', propertyP2];
case {'SHOCKTURBULENCE_COMPRESSIBLE'}
propertyP1 = gui_get_prop(app.PP1.Value);
propertyP2 = gui_get_prop(app.PP2.Value);
propertyP6 = gui_get_prop(app.PP6.Value);
propertyR4 = gui_get_prop(app.PR4.Value);
additionalInputsR = [additionalInputsR, 'mach', propertyR4, 'eta', propertyP1, 'chi', propertyP2, 'etaVorticity', propertyP6];
otherwise
propertyP1 = propertyR1;
propertyP2 = propertyR2;
Expand Down Expand Up @@ -175,6 +190,8 @@
problemType = strrep(problemType, '_BETA', '');
% Select solver
solver = set(app.shockSolver, 'problemType', problemType, 'FLAG_RESULTS', FLAG_RESULTS);
% Turn off FLAG_RESULTS of subsolvers
solver.equilibriumSolver.FLAG_RESULTS = false;
% Solve problem
[mixArray1, mixArray2] = solver.solveArray(mixArray1);
% Set output
Expand All @@ -187,6 +204,8 @@
problemType = strrep(problemType, '_THETA', '');
% Select solver
solver = set(app.shockSolver, 'problemType', problemType, 'FLAG_RESULTS', FLAG_RESULTS);
% Turn off FLAG_RESULTS of subsolvers
solver.equilibriumSolver.FLAG_RESULTS = false;
% Solve problem
[mixArray1, mixArray2, mixArray3] = solver.solveArray(mixArray1);
% Set output
Expand All @@ -200,6 +219,8 @@
problemType = strrep(problemType, '_THETA', '');
% Select solver
solver = set(app.shockSolver, 'problemType', problemType, 'FLAG_RESULTS', FLAG_RESULTS);
% Turn off FLAG_RESULTS of subsolvers
solver.equilibriumSolver.FLAG_RESULTS = false;
% Solve problem
[mixArray1, mixArray2, mixArray3, mix4Array] = solver.solveArray(mixArray1);
% Set output
Expand All @@ -212,6 +233,8 @@
problemType = strrep(problemType, '_BETA', '');
% Select solver
solver = set(app.shockSolver, 'problemType', problemType, 'FLAG_RESULTS', FLAG_RESULTS);
% Turn off FLAG_RESULTS of subsolvers
solver.equilibriumSolver.FLAG_RESULTS = false;
% Solve problem
[mixArray1, mixArray2, mixArray3, mix4Array, mix5Array] = solver.solveArray(mixArray1);
% Set output
Expand All @@ -224,6 +247,8 @@
problemType = strrep(problemType, '_THETA', '');
% Select solver
solver = set(app.shockSolver, 'problemType', problemType, 'FLAG_RESULTS', FLAG_RESULTS);
% Turn off FLAG_RESULTS of subsolvers
solver.equilibriumSolver.FLAG_RESULTS = false;
% Solve problem
[mixArray1, mixArray2, mixArray3, mix4Array, mix5Array, mix6Array] = solver.solveArray(mixArray1);
% Set output
Expand All @@ -234,6 +259,8 @@
case {'DET', 'DET_OVERDRIVEN', 'DET_UNDERDRIVEN', 'DET_POLAR'}
% Select solver
solver = set(app.detonationSolver, 'problemType', problemType, 'FLAG_RESULTS', FLAG_RESULTS);
% Turn off FLAG_RESULTS of subsolvers
solver.equilibriumSolver.FLAG_RESULTS = false;
% Solve problem
[mixArray1, mixArray2] = solver.solveArray(mixArray1);
% Set output
Expand All @@ -247,6 +274,8 @@
problemType = strrep(problemType, '_THETA', '');
% Select solver
solver = set(app.detonationSolver, 'problemType', problemType, 'FLAG_RESULTS', FLAG_RESULTS);
% Turn off FLAG_RESULTS of subsolvers
solver.equilibriumSolver.FLAG_RESULTS = false;
% Solve problem
[mixArray1, mixArray2, mixArray3] = solver.solveArray(mixArray1);
% Set output
Expand All @@ -257,6 +286,8 @@
case {'DET_POLAR_LIMITRR'}
% Select solver
solver = set(app.detonationSolver, 'problemType', problemType, 'FLAG_RESULTS', FLAG_RESULTS);
% Turn off FLAG_RESULTS of subsolvers
solver.equilibriumSolver.FLAG_RESULTS = false;
% Solve problem
[mixArray1, mixArray2, mixArray3, mixArray4] = solver.solveArray(mixArray1);
% Set output
Expand All @@ -269,6 +300,8 @@
problemType = strrep(problemType, '_BETA', '');
% Select solver
solver = set(app.detonationSolver, 'problemType', problemType, 'FLAG_RESULTS', FLAG_RESULTS);
% Turn off FLAG_RESULTS of subsolvers
solver.equilibriumSolver.FLAG_RESULTS = false;
% Solve problem
[mixArray1, mixArray2, mixArray3, mixArray4, mixArray5] = solver.solveArray(mixArray1);
% Set output
Expand All @@ -277,7 +310,10 @@
solver.plotConfig.plotProperties = {'T', 'rho', 'h', 'e', 'g', 'cp', 's', 'gamma_s', 'sound', 'uShock'};
solver.plotConfig.plotPropertiesBasis = {[], [], 'mi', 'mi', 'mi', 'mi', 'mi', [], [], []};
case {'DET_POLAR_R_THETA'}
% Select solver
solver = set(app.detonationSolver, 'problemType', problemType, 'FLAG_RESULTS', FLAG_RESULTS);
% Turn off FLAG_RESULTS of subsolvers
solver.equilibriumSolver.FLAG_RESULTS = false;
% Solve problem
[mixArray1, mixArray2, mixArray3, mixArray4, mixArray5, mixArray6] = solver.solveArray(mixArray1);
% Set output
Expand All @@ -288,6 +324,8 @@
case {'ROCKET_IAC'}
% Select solver
solver = set(app.rocketSolver, 'problemType', problemType, 'FLAG_RESULTS', FLAG_RESULTS);
% Turn off FLAG_RESULTS of subsolvers
solver.equilibriumSolver.FLAG_RESULTS = false;
% Solve problem
[mixArray1, mixArray2, mixArray3] = solver.solveArray(mixArray1);
% Set output
Expand All @@ -301,6 +339,8 @@
problemType = strrep(problemType, '_ARATIO', '');
% Select solver
solver = set(app.rocketSolver, 'problemType', problemType, 'FLAG_RESULTS', FLAG_RESULTS);
% Turn off FLAG_RESULTS of subsolvers
solver.equilibriumSolver.FLAG_RESULTS = false;
% Solve problem
[mixArray1, mixArray2, mixArray3, mixArray4] = solver.solveArray(mixArray1);
% Set output
Expand All @@ -316,6 +356,8 @@
case {'ROCKET_FAC'}
% Select solver
solver = set(app.rocketSolver, 'problemType', problemType, 'FLAG_RESULTS', FLAG_RESULTS);
% Turn off FLAG_RESULTS of subsolvers
solver.equilibriumSolver.FLAG_RESULTS = false;
% Solve problem
[mixArray1, mixArray2, mixArray3, mixArray4] = solver.solveArray(mixArray1);
% Set output
Expand All @@ -329,6 +371,8 @@
problemType = strrep(problemType, '_ARATIO', '');
% Select solver
solver = set(app.rocketSolver, 'problemType', problemType, 'FLAG_RESULTS', FLAG_RESULTS);
% Turn off FLAG_RESULTS of subsolvers
solver.equilibriumSolver.FLAG_RESULTS = false;
% Solve problem
[mixArray1, mixArray2, mixArray3, mixArray4, mixArray5] = solver.solveArray(mixArray1);
% Set output
Expand All @@ -341,6 +385,22 @@
% Set plot properties
solver.plotConfig.plotProperties = {'T', 'rho', 'h', 'e', 'g', 'cp', 's', 'gamma_s', 'sound', 'u', 'I_sp', 'I_vac'};
solver.plotConfig.plotPropertiesBasis = {[], [], 'mi', 'mi', 'mi', 'mi', 'mi', [], [], [], [], []};
case {'SHOCKTURBULENCE_VORTICAL', 'SHOCKTURBULENCE_VORTICAL_ENTROPIC', 'SHOCKTURBULENCE_ACOUSTIC', 'SHOCKTURBULENCE_COMPRESSIBLE'}
% Select solver
solver = set(app.shockTurbulenceSolver, 'problemType', strrep(problemType, 'SHOCKTURBULENCE_', ''), 'FLAG_RESULTS', FLAG_RESULTS);
% Turn off FLAG_RESULTS of subsolvers
solver.equilibriumSolver.FLAG_RESULTS = false;
solver.shockSolver.FLAG_RESULTS = false;
solver.jumpConditionsSolver.FLAG_RESULTS = false;
% Solve problem
[resultsLIA, mixArray1, mixArray2] = solver.solve(mixArray1);

% Set output
varargout = {resultsLIA, mixArray1, mixArray2};

% Set plot properties
solver.plotConfig.plotProperties = {'K', 'R11', 'RTT', 'Ka', 'Kr', 'enstrophy', 'kolmogorovLengthRatio'};
solver.plotConfig.plotPropertiesBasis = {[], [], [], [], [], [], []};
otherwise
error('Problem type %s is not found', problemType);
end
Expand All @@ -351,6 +411,9 @@
% Save results
if contains(problemType, 'ROCKET')
[results, app.temp_results] = save_results(app, problemType, varargout{:});
elseif contains(problemType, 'SHOCKTURBULENCE')
results = save_results(app, problemType, mixArray1, mixArray2);
app.temp_results = results;
else
[results, app.temp_results] = save_results(app, problemType, mixArray1, varargout{end});
end
Expand Down
Loading