From c8e4023fa366b57e9abe4df59c9f6912da46d403 Mon Sep 17 00:00:00 2001 From: prmoko Date: Sat, 11 Jul 2026 14:29:04 -0400 Subject: [PATCH 01/11] Updated Jet Climb Requirements Added option '2' for climb requirements, aligning with the extrapolation approach outlined in Steiner et al. (2014). Optimum number of engines for transport aircraft employing electrically powered distributed propulsion. [Eqs. 4 and 5] --- +ConstraintDiagramPkg/Jet25_111.m | 7 ++++++- +ConstraintDiagramPkg/Jet25_119.m | 8 +++++++- +ConstraintDiagramPkg/Jet25_121a.m | 9 ++++++++- +ConstraintDiagramPkg/Jet25_121b.m | 7 ++++++- +ConstraintDiagramPkg/Jet25_121c.m | 7 ++++++- +ConstraintDiagramPkg/Jet25_121d.m | 7 ++++++- 6 files changed, 39 insertions(+), 6 deletions(-) diff --git a/+ConstraintDiagramPkg/Jet25_111.m b/+ConstraintDiagramPkg/Jet25_111.m index 2f97b4c7..195b2044 100644 --- a/+ConstraintDiagramPkg/Jet25_111.m +++ b/+ConstraintDiagramPkg/Jet25_111.m @@ -2,7 +2,7 @@ % % [FAR] = Jet25_111(W_S, T_W, Aircraft) % written by Paul Mokotoff, prmoko@umich.edu -% last updated: 30 mar 2026 +% last updated: 11 jul 2026 % % derive the constraints for takeoff climb with one engine inoperative. % @@ -72,6 +72,11 @@ % compute the climb gradient from a sigmoid curve G = ConstraintDiagramPkg.Sigmoid(Aircraft, 0.5026, -42.54, 0.7925, 1.198); +elseif (Type == 2) + + % extrapolate for any aircraft with more than 4 engines + G = 0.005 + 0.003 * NumEng; + else % throw an error diff --git a/+ConstraintDiagramPkg/Jet25_119.m b/+ConstraintDiagramPkg/Jet25_119.m index a99c3b39..a98bdd8d 100644 --- a/+ConstraintDiagramPkg/Jet25_119.m +++ b/+ConstraintDiagramPkg/Jet25_119.m @@ -2,7 +2,7 @@ % % [FAR] = Jet25_119(W_S, T_W, Aircraft) % written by Paul Mokotoff, prmoko@umich.edu -% last updated: 04 dec 2025 +% last updated: 11 jul 2026 % % derive the constraints for a balked landing climb with all engines % operative. @@ -61,6 +61,12 @@ % compute the climb gradient from a sigmoid curve G = ConstraintDiagramPkg.Sigmoid(Aircraft, 0, 0, 0, 3.2); +elseif (Type == 2) + + % extrapolate for any aircraft with more than 4 engines, but it will + % always remain the same here + G = 0.032; + else % throw an error diff --git a/+ConstraintDiagramPkg/Jet25_121a.m b/+ConstraintDiagramPkg/Jet25_121a.m index 2bc8406e..10f9c408 100644 --- a/+ConstraintDiagramPkg/Jet25_121a.m +++ b/+ConstraintDiagramPkg/Jet25_121a.m @@ -2,7 +2,7 @@ % % [FAR] = Jet25_121a(W_S, T_W, Aircraft) % written by Paul Mokotoff, prmoko@umich.edu -% last updated: 30 mar 2026 +% last updated: 11 jul 2026 % % derive the constraints for the transition segment climb. % @@ -72,6 +72,13 @@ % compute the climb gradient from a sigmoid curve G = ConstraintDiagramPkg.Sigmoid(Aircraft, 0.4999, -151.22, 0.7855, 0.001); +elseif (Type == 2) + + % extrapolate for any aircraft with more than 4 engines (only applies + % for >4 engines, but taking the maximum in case an aircraft with <=4 + % engines is being designed + G = max(0, -0.007 + 0.003 * NumEng); + else % throw an error diff --git a/+ConstraintDiagramPkg/Jet25_121b.m b/+ConstraintDiagramPkg/Jet25_121b.m index f29a1550..c1f72a62 100644 --- a/+ConstraintDiagramPkg/Jet25_121b.m +++ b/+ConstraintDiagramPkg/Jet25_121b.m @@ -2,7 +2,7 @@ % % [FAR] = Jet25_121b(W_S, T_W, Aircraft) % written by Paul Mokotoff, prmoko@umich.edu -% last updated: 30 mar 2026 +% last updated: 11 jul 2026 % % derive the constraints for the second segment climb. % @@ -72,6 +72,11 @@ % compute the climb gradient from a sigmoid curve G = ConstraintDiagramPkg.Sigmoid(Aircraft, 0.6024, -42.00, 0.7829, 2.398); +elseif (Type == 2) + + % extrapolate for any aircraft with more than 4 engines + G = 0.018 + 0.003 * NumEng; + else % throw an error diff --git a/+ConstraintDiagramPkg/Jet25_121c.m b/+ConstraintDiagramPkg/Jet25_121c.m index 88b6d105..f1d3b168 100644 --- a/+ConstraintDiagramPkg/Jet25_121c.m +++ b/+ConstraintDiagramPkg/Jet25_121c.m @@ -2,7 +2,7 @@ % % [FAR] = Jet25_121c(W_S, T_W, Aircraft) % written by Paul Mokotoff, prmoko@umich.edu -% last updated: 30 mar 2026 +% last updated: 11 jul 2026 % % derive the constraints for the enroute climb. % @@ -73,6 +73,11 @@ % compute the climb gradient from a sigmoid curve G = ConstraintDiagramPkg.Sigmoid(Aircraft, 0.5026, -42.54, 0.7925, 1.198); +elseif (Type == 2) + + % extrapolate for any aircraft with more than 4 engines + G = 0.005 + 0.003 * NumEng; + else % throw an error diff --git a/+ConstraintDiagramPkg/Jet25_121d.m b/+ConstraintDiagramPkg/Jet25_121d.m index 9658d0ef..a5bc051b 100644 --- a/+ConstraintDiagramPkg/Jet25_121d.m +++ b/+ConstraintDiagramPkg/Jet25_121d.m @@ -2,7 +2,7 @@ % % [FAR] = Jet25_121d(W_S, T_W, Aircraft) % written by Paul Mokotoff, prmoko@umich.edu -% last updated: 30 mar 2026 +% last updated: 11 jul 2026 % % derive the constraints for landing climb with one engine inoperative. % @@ -73,6 +73,11 @@ % compute the climb gradient from a sigmoid curve G = ConstraintDiagramPkg.Sigmoid(Aircraft, 0.6025, -41.75, 0.7830, 2.098); +elseif (Type == 2) + + % extrapolate for any aircraft with more than 4 engines + G = 0.015 + 0.003 * NumEng; + else % throw an error From 4f63c1371bbc28af7b796fcd71fca39881fb51d8 Mon Sep 17 00:00:00 2001 From: prmoko Date: Sat, 11 Jul 2026 14:32:36 -0400 Subject: [PATCH 02/11] Updated OEIMultiplier Use an n/(n-1) multiplier for requirement type '2'. --- +ConstraintDiagramPkg/OEIMultiplier.m | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/+ConstraintDiagramPkg/OEIMultiplier.m b/+ConstraintDiagramPkg/OEIMultiplier.m index d04e6d5b..e322cb16 100644 --- a/+ConstraintDiagramPkg/OEIMultiplier.m +++ b/+ConstraintDiagramPkg/OEIMultiplier.m @@ -2,7 +2,7 @@ % % [k] = OEIMultiplier(Aircraft) % written by Paul Mokotoff, prmoko@umich.edu -% last updated: 04 mar 2026 +% last updated: 11 jul 2026 % % return the appropriate multiplier for engine inoperative conditons, % either based on a discrete number of engines installed or a percent @@ -21,7 +21,7 @@ Type = Aircraft.Settings.ConstraintType; % check the multiplier type -if (Type == 0) +if ((Type == 0) || (Type == 2)) % get the number of engines Neng = Aircraft.Specs.Propulsion.NumEngines; From 1c35fdc5d194347ae79d68d837a18d4a9af45991 Mon Sep 17 00:00:00 2001 From: prmoko Date: Sat, 11 Jul 2026 14:34:35 -0400 Subject: [PATCH 03/11] Updated ElysianE9X Added an extra option for picking climb gradients for a constraint diagram. --- +ConstraintDiagramPkg/+ConstraintSpecsPkg/ElysianE9X.m | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/+ConstraintDiagramPkg/+ConstraintSpecsPkg/ElysianE9X.m b/+ConstraintDiagramPkg/+ConstraintSpecsPkg/ElysianE9X.m index 668855d0..31d61aba 100644 --- a/+ConstraintDiagramPkg/+ConstraintSpecsPkg/ElysianE9X.m +++ b/+ConstraintDiagramPkg/+ConstraintSpecsPkg/ElysianE9X.m @@ -2,7 +2,7 @@ % % [] = ElysianE9X() % written by Paul Mokotoff, prmoko@umich.edu -% last updated: 30 mar 2026 +% last updated: 11 jul 2026 % % create a constraint diagram for a battery electric aircraft % representative of the Elysian E9X. @@ -141,8 +141,9 @@ %% RUN THE CONSTRAINT ANALYSIS %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% determine which constraints to use (0 = 14 CFR 25; 1 = novel) -Aircraft.Settings.ConstraintType = 0; +% determine which constraints to use (0 = 14 CFR 25; 1 = novel; 2 = Steiner +% et al. [extrapolate exiting reg's for >4 engine aircraft]) +Aircraft.Settings.ConstraintType = 2; % create a constraint diagram ConstraintDiagramPkg.ConstraintDiagram(Aircraft); From 8aa40aa1123ae0bdd433f62dc24e8d41666af208 Mon Sep 17 00:00:00 2001 From: prmoko Date: Mon, 13 Jul 2026 12:49:22 -0400 Subject: [PATCH 04/11] Parameterized Lapse Rate Replaced the fixed lapse rates in each function with a parametric one defined by the user in the Constraint Specification File. --- +ConstraintDiagramPkg/JetCeil.m | 9 ++++++--- +ConstraintDiagramPkg/JetCrs.m | 9 ++++++--- +ConstraintDiagramPkg/JetDiv.m | 9 ++++++--- 3 files changed, 18 insertions(+), 9 deletions(-) diff --git a/+ConstraintDiagramPkg/JetCeil.m b/+ConstraintDiagramPkg/JetCeil.m index 298cd3d2..357f719e 100644 --- a/+ConstraintDiagramPkg/JetCeil.m +++ b/+ConstraintDiagramPkg/JetCeil.m @@ -2,7 +2,7 @@ % % [FAR] = JetCeil(W_S, T_W, Aircraft) % written by Paul Mokotoff, prmoko@umich.edu -% last updated: 16 sep 2025 +% last updated: 13 jul 2026 % % derive the constraints for service ceiling. % @@ -37,6 +37,9 @@ ReqType = Aircraft.Specs.TLAR.ReqType; CrsMach = Aircraft.Specs.Performance.Vels.Crs; +% get the lapse rate +LapseRate = Aircraft.Specs.Propulsion.LapseRate.Ceil; + %% EVALUATE THE CONSTRAINT %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -55,7 +58,7 @@ if (ReqType == 0) % use the metabook's equation - FAR = (2 * sqrt(CD0 / pi / e / AR) + G) / RhoRatio ^ 0.6 - T_W; + FAR = (2 * sqrt(CD0 / pi / e / AR) + G) / RhoRatio ^ LapseRate - T_W; elseif (ReqType == 1) @@ -83,7 +86,7 @@ end % use Mattingly's equation for service ceiling - FAR = 1 ./ RhoRatio ^ 0.6 .* (q .* CD0 ./ W_S + W_S ./ q ./ (pi * AR * e) + G) - T_W; + FAR = 1 ./ RhoRatio ^ LapseRate .* (q .* CD0 ./ W_S + W_S ./ q ./ (pi * AR * e) + G) - T_W; else diff --git a/+ConstraintDiagramPkg/JetCrs.m b/+ConstraintDiagramPkg/JetCrs.m index 5c9f8110..820b250b 100644 --- a/+ConstraintDiagramPkg/JetCrs.m +++ b/+ConstraintDiagramPkg/JetCrs.m @@ -2,7 +2,7 @@ % % [FAR] = JetCrs(W_S, T_W, Aircraft) % written by Paul Mokotoff, prmoko@umich.edu -% last updated: 04 sep 2025 +% last updated: 13 jul 2026 % % derive the constraints for cruise performance. % @@ -36,6 +36,9 @@ Mcrs = Aircraft.Specs.Performance.Vels.Crs; zcrs = Aircraft.Specs.Performance.Alts.Crs; % keep in SI units for ComputeFltCon +% get the lapse rate +LapseRate = Aircraft.Specs.Propulsion.LapseRate.Crs; + % get the requirement type ReqType = Aircraft.Specs.TLAR.ReqType; @@ -84,7 +87,7 @@ else % requirement is thrust-based, account for engine lapsing - FAR = (q .* CD0 ./ W_S + W_S ./ (q .* pi .* AR .* e)) ./ RhoRatio ^ 0.6 - T_W; + FAR = (q .* CD0 ./ W_S + W_S ./ (q .* pi .* AR .* e)) ./ RhoRatio ^ LapseRate - T_W; end @@ -94,7 +97,7 @@ CL = W_S ./ q; % use a different equation - FAR = q ./ W_S .* (CD0 + CL .^ 2 ./ (pi * AR * e)) ./ RhoRatio ^ 0.1 - T_W; + FAR = q ./ W_S .* (CD0 + CL .^ 2 ./ (pi * AR * e)) ./ RhoRatio ^ LapseRate - T_W; else diff --git a/+ConstraintDiagramPkg/JetDiv.m b/+ConstraintDiagramPkg/JetDiv.m index 3409ea4f..2a898e28 100644 --- a/+ConstraintDiagramPkg/JetDiv.m +++ b/+ConstraintDiagramPkg/JetDiv.m @@ -2,7 +2,7 @@ % % [FAR] = JetDiv(W_S, T_W, Aircraft) % written by Paul Mokotoff, prmoko@umich.edu -% last updated: 04 dec 2025 +% last updated: 13 jul 2026 % % derive the constraints for diversion (cruise) performance. % @@ -36,6 +36,9 @@ Mcrs = Aircraft.Specs.Performance.Vels.Div; zcrs = Aircraft.Specs.Performance.Alts.Div; % keep in SI units for ComputeFltCon +% get the lapse rate +LapseRate = Aircraft.Specs.Propulsion.LapseRate.Div; + % get the requirement type ReqType = Aircraft.Specs.TLAR.ReqType; @@ -84,7 +87,7 @@ else % requirement is thrust-based, account for engine lapsing - FAR = (q .* CD0 ./ W_S + W_S ./ (q .* pi .* AR .* e)) ./ RhoRatio ^ 0.6 - T_W; + FAR = (q .* CD0 ./ W_S + W_S ./ (q .* pi .* AR .* e)) ./ RhoRatio ^ LapseRate - T_W; end @@ -94,7 +97,7 @@ CL = W_S ./ q; % use a different equation - FAR = q ./ W_S .* (CD0 + CL .^ 2 ./ (pi * AR * e)) ./ RhoRatio ^ 0.2 - T_W; + FAR = q ./ W_S .* (CD0 + CL .^ 2 ./ (pi * AR * e)) ./ RhoRatio ^ LapseRate - T_W; else From f9ccb6b0f7107d6205d7af2918fe0a0ba0c57ad7 Mon Sep 17 00:00:00 2001 From: prmoko Date: Mon, 13 Jul 2026 12:52:46 -0400 Subject: [PATCH 05/11] Updated ElysianE9X Added parametric lapse rates for the respective constraints. Removed extra plotting code. --- .../+ConstraintSpecsPkg/ElysianE9X.m | 32 +++---------------- 1 file changed, 5 insertions(+), 27 deletions(-) diff --git a/+ConstraintDiagramPkg/+ConstraintSpecsPkg/ElysianE9X.m b/+ConstraintDiagramPkg/+ConstraintSpecsPkg/ElysianE9X.m index 31d61aba..29264977 100644 --- a/+ConstraintDiagramPkg/+ConstraintSpecsPkg/ElysianE9X.m +++ b/+ConstraintDiagramPkg/+ConstraintSpecsPkg/ElysianE9X.m @@ -2,7 +2,7 @@ % % [] = ElysianE9X() % written by Paul Mokotoff, prmoko@umich.edu -% last updated: 11 jul 2026 +% last updated: 13 jul 2026 % % create a constraint diagram for a battery electric aircraft % representative of the Elysian E9X. @@ -137,6 +137,10 @@ % number of engines [2024 paper] Aircraft.Specs.Propulsion.NumEngines = 8; +% lapse rate exponent correction factor for cruise/diversion/etc. +Aircraft.Specs.Propulsion.LapseRate.Crs = 0.10; +Aircraft.Specs.Propulsion.LapseRate.Div = 0.28; + %% RUN THE CONSTRAINT ANALYSIS %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -148,31 +152,5 @@ % create a constraint diagram ConstraintDiagramPkg.ConstraintDiagram(Aircraft); -% add the existing sizing point -hold on -scatter(Aircraft.Specs.Aero.W_S.SLS * 9.81 / 1000, 1 / (Aircraft.Specs.Power.P_W.SLS / 9.81 * 1000), 48, "o", "MarkerEdgeColor", [0, 0.251, 0.478], "MarkerFaceColor", [0, 0.251, 0.478]); - -% format the axis sizes -xlim([0, 8]); -ylim([0, 0.2]); -axis square - -% turn on gridlines -grid on - -% get the axis object -A = gca; - -% set the grid to be semi-transparent and move it to the top -A.GridAlpha = 0.5; -A.Layer = "top"; - -% add minor gridlines -A.XMinorGrid = "on"; -A.YMinorGrid = "on"; - -% increase font size -set(gca, "FontSize", 28); - end \ No newline at end of file From ef4839eddb88f3b0bf11242eb0a771d8c3dd10d0 Mon Sep 17 00:00:00 2001 From: prmoko Date: Mon, 13 Jul 2026 15:01:35 -0400 Subject: [PATCH 06/11] Updated SUSAN Updated inputs for SUSAN's constraint diagram. --- .../+ConstraintSpecsPkg/SUSAN.m | 60 +++++++++++-------- 1 file changed, 35 insertions(+), 25 deletions(-) diff --git a/+ConstraintDiagramPkg/+ConstraintSpecsPkg/SUSAN.m b/+ConstraintDiagramPkg/+ConstraintSpecsPkg/SUSAN.m index cfa98c52..e221c15d 100644 --- a/+ConstraintDiagramPkg/+ConstraintSpecsPkg/SUSAN.m +++ b/+ConstraintDiagramPkg/+ConstraintSpecsPkg/SUSAN.m @@ -2,7 +2,7 @@ % % [] = SUSAN() % written by Paul Mokotoff, prmoko@umich.edu -% last updated: 25 sep 2025 +% last updated: 13 jul 2026 % % create a constraint diagram for NASA's SUSAN aircraft. % @@ -28,7 +28,7 @@ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % aircraft class -Aircraft.Specs.TLAR.Class = "Turbofan"; +Aircraft.Specs.TLAR.Class = "Turboprop"; % CFR regulations to certify Aircraft.Specs.TLAR.CFRPart = 25; @@ -41,19 +41,21 @@ % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% altitudes -Aircraft.Specs.Performance.Alts.Crs = UnitConversionPkg.ConvLength(40000, "ft", "m"); -Aircraft.Specs.Performance.Alts.Srv = UnitConversionPkg.ConvLength(42000, "ft", "m"); +% altitudes [cruise from economy mission outlined in 2024 paper; service +% ceiling estimated] +Aircraft.Specs.Performance.Alts.Crs = UnitConversionPkg.ConvLength(37000, "ft", "m"); +Aircraft.Specs.Performance.Alts.Srv = UnitConversionPkg.ConvLength(40000, "ft", "m"); -% stall speed +% stall speed [based on wing loading from 2024 paper] Aircraft.Specs.Performance.Vels.Stl = sqrt(2 * 634 * 9.81 / 2 / 1.225); -% cruise mach number +% cruise mach number [2024 paper, Tab. 5] Aircraft.Specs.Performance.Vels.Crs = 0.775; -% runway lengths and obstacle clearances -Aircraft.Specs.Performance.TOFL = 2750; -Aircraft.Specs.Performance.LFL = 2750; +% runway lengths and obstacle clearances [Boeing 737-800 MAX airport +% planning manual] +Aircraft.Specs.Performance.TOFL = 2040; +Aircraft.Specs.Performance.LFL = 1700; Aircraft.Specs.Performance.ObstLen = UnitConversionPkg.ConvLength(1000, "ft", "m"); % multiplicative factors for OEI conditions @@ -61,13 +63,13 @@ Aircraft.Specs.Performance.MaxCont = 1 / 0.94; % design specific excess power loss -Aircraft.Specs.Performance.PsLoss = 0.7689; % mean for twin-engine aircraft +Aircraft.Specs.Performance.PsLoss = 0.9171; % mean for twin-engine aircraft -% landing weight as a fraction of MTOW (computed from baseline) +% landing weight as a fraction of MTOW (computed from FAST simulations) Aircraft.Specs.Performance.Wland_MTOW = 0.8411; % requirement type (0 = Roskam; 1 = Mattingly, 2 = de Vries et al.) -Aircraft.Specs.TLAR.ReqType = 0; +Aircraft.Specs.TLAR.ReqType = 2; % constraints to use Aircraft.Specs.Performance.ConstraintFuns = ["Jet25_111"; "Jet25_119"; "Jet25_121a"; "Jet25_121b"; "Jet25_121c"; "Jet25_121d"; "JetCrs"; "JetLFL"; "JetTOFL"]; @@ -83,18 +85,19 @@ % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% wing loading +% wing loading [2024 paper] Aircraft.Specs.Aero.W_S.SLS = 634; -% wing properties -Aircraft.Specs.Aero.AR = 11.22091; +% wing properties [2024 paper] +Aircraft.Specs.Aero.AR = 9.44; -% lift coefficients (from Chau & Duensing and FINCH) -Aircraft.Specs.Aero.CL.Crs = 0.61; -Aircraft.Specs.Aero.CL.Tko = 2.0; -Aircraft.Specs.Aero.CL.Lnd = 3.5; +% lift coefficients [cruise lift coefficient from 2024 paper, others are +% estimated based DEP tech. improvements] +Aircraft.Specs.Aero.CL.Crs = 1.0; % given as 0.61 in 2024 paper, but need maximum CL for the constraint diagram +Aircraft.Specs.Aero.CL.Tko = 2.5; +Aircraft.Specs.Aero.CL.Lnd = 3.0; -% parasite drag coefficients (computed) +% parasite drag coefficients (computed from Raymer) Aircraft.Specs.Aero.CD0.Crs = 0.0176; Aircraft.Specs.Aero.CD0.Tko = 0.0626; % cruise CD0 + 0.045 Aircraft.Specs.Aero.CD0.Lnd = 0.1076; % cruise CD0 + 0.090 @@ -112,7 +115,7 @@ % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% MTOW +% MTOW [2024 paper] Aircraft.Specs.Weight.MTOW = UnitConversionPkg.ConvMass(190890, "lbm", "kg"); % ---------------------------------------------------------- @@ -124,12 +127,19 @@ % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% thrust-weight ratio +% thrust-weight ratio [2024 paper] Aircraft.Specs.Propulsion.T_W.SLS = 0.298; -% number of engines +% number of engines [for appropriate FARs] Aircraft.Specs.Propulsion.NumEngines = 2; +% lapse rate [estimated] +Aircraft.Specs.Propulsion.LapseRate.Crs = 0.35; + +% alternatively, a power-weight ratio [assumed takoeff airspeed as the +% "characteristic speed" to avoid singularities] +Aircraft.Specs.Power.P_W.SLS = (Aircraft.Specs.Propulsion.T_W.SLS * 1.21 * Aircraft.Specs.Performance.Vels.Stl) * 9.81 / 1000; + %% RUN THE CONSTRAINT ANALYSIS %% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -142,6 +152,6 @@ % add the existing sizing point hold on -scatter(Aircraft.Specs.Aero.W_S.SLS, Aircraft.Specs.Propulsion.T_W.SLS, 48, "o", "MarkerEdgeColor", "red", "MarkerFaceColor", "red"); +scatter(Aircraft.Specs.Aero.W_S.SLS * 9.81 / 1000, 1 / (Aircraft.Specs.Power.P_W.SLS / 9.81 * 1000), 48, "o", "MarkerEdgeColor", "red", "MarkerFaceColor", "red"); end \ No newline at end of file From ab9dbcaa7c08f674e17fe5dc1421ff2821315d77 Mon Sep 17 00:00:00 2001 From: prmoko Date: Wed, 22 Jul 2026 09:09:03 -0400 Subject: [PATCH 07/11] Updated WindmillDrag If any theoretical drag coefficients are less than 0 (due to poor extrapolation), then set them to 0. --- +AerodynamicsPkg/WindmillDrag.m | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/+AerodynamicsPkg/WindmillDrag.m b/+AerodynamicsPkg/WindmillDrag.m index 9a83a5e2..faa9d2c1 100644 --- a/+AerodynamicsPkg/WindmillDrag.m +++ b/+AerodynamicsPkg/WindmillDrag.m @@ -2,7 +2,7 @@ % % [Aircraft] = WindmillDrag(Aircraft) % written by Paul Mokotoff, prmoko@umich.edu -% last updated: 05 jan 2026 +% last updated: 22 jul 2026 % % estimate the windmilling drag from any failed engines. % @@ -99,6 +99,9 @@ ThrCD(isnan(ThrCD)) = 0; DelCD(isnan(DelCD)) = 0; +% if there are any theoretical drag coefficients less than 0, convert them to zero +ThrCD(ThrCD <= 0) = 0; + % compute the adjusted drag coefficient TotCD = ThrCD - DelCD; From d0cb788a68d395782b3c16515a8e64101b0ca646 Mon Sep 17 00:00:00 2001 From: prmoko Date: Wed, 22 Jul 2026 09:10:17 -0400 Subject: [PATCH 08/11] Updated TrimDrag Instead of assuming that the turbofan/turboprop engine thrust is lost, get the actual thrust lost from the propulsion system size. This generalizes the prior code to accommodate losses from heterogeneously-sized propulsion systems. --- +AerodynamicsPkg/TrimDrag.m | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/+AerodynamicsPkg/TrimDrag.m b/+AerodynamicsPkg/TrimDrag.m index 1c484ac1..18930b4b 100644 --- a/+AerodynamicsPkg/TrimDrag.m +++ b/+AerodynamicsPkg/TrimDrag.m @@ -2,7 +2,7 @@ % % [dCD0] = TrimDrag(Aircraft) % written by Paul Mokotoff, prmoko@umich.edu -% last updated: 08 jan 2026 +% last updated: 22 jul 2026 % % estimate the trim drag from any failed engines. % @@ -38,18 +38,24 @@ % return an array of zeros dCD0 = zeros(npnt, 1); - + % exit the program return end +% get the component +icomp = Aircraft.Mission.History.SI.Power.Windmill(SegBeg); + +% get the number of sources +nsrc = length(Aircraft.Specs.Propulsion.PropArch.SrcType); + %% PRE-PROCESSING %% %%%%%%%%%%%%%%%%%%%% % get the SLS thrust -Tsls = Aircraft.Specs.Propulsion.Engine.DesignThrust; +Tsls = Aircraft.Specs.Propulsion.SLSThrust(icomp - nsrc); % get the moment arm between the fuselage and most outboard engine Arm = Aircraft.Specs.Aero.Fuse.DistToEng; From 209f5455515a946e973952fa8436d8868321185c Mon Sep 17 00:00:00 2001 From: prmoko Date: Wed, 22 Jul 2026 09:13:00 -0400 Subject: [PATCH 09/11] Updated SUSAN Constraint Diagram Specification Added different failure modes and their corresponding specific excess power loss fractions. --- +ConstraintDiagramPkg/+ConstraintSpecsPkg/SUSAN.m | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/+ConstraintDiagramPkg/+ConstraintSpecsPkg/SUSAN.m b/+ConstraintDiagramPkg/+ConstraintSpecsPkg/SUSAN.m index e221c15d..13bc5e6d 100644 --- a/+ConstraintDiagramPkg/+ConstraintSpecsPkg/SUSAN.m +++ b/+ConstraintDiagramPkg/+ConstraintSpecsPkg/SUSAN.m @@ -2,7 +2,7 @@ % % [] = SUSAN() % written by Paul Mokotoff, prmoko@umich.edu -% last updated: 13 jul 2026 +% last updated: 22 jul 2026 % % create a constraint diagram for NASA's SUSAN aircraft. % @@ -63,7 +63,10 @@ Aircraft.Specs.Performance.MaxCont = 1 / 0.94; % design specific excess power loss -Aircraft.Specs.Performance.PsLoss = 0.9171; % mean for twin-engine aircraft +% 0.9171 - mean SEP loss for twin-engine aircraft +% 0.0720 - lose a single distributed propulsor (most outboard) +% 0.3426 - lose the aft turbofan engine +Aircraft.Specs.Performance.PsLoss = 0.3426; % landing weight as a fraction of MTOW (computed from FAST simulations) Aircraft.Specs.Performance.Wland_MTOW = 0.8411; From a68217c6475e9d856549e0c12defcbd742af79d2 Mon Sep 17 00:00:00 2001 From: prmoko Date: Wed, 22 Jul 2026 09:40:44 -0400 Subject: [PATCH 10/11] Updated E9X and SUSAN Constraint Diagram Specifications Added references to the papers that the information was extracted from. --- .../+ConstraintSpecsPkg/ElysianE9X.m | 13 ++++++++++++- +ConstraintDiagramPkg/+ConstraintSpecsPkg/SUSAN.m | 7 ++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/+ConstraintDiagramPkg/+ConstraintSpecsPkg/ElysianE9X.m b/+ConstraintDiagramPkg/+ConstraintSpecsPkg/ElysianE9X.m index 29264977..ac0b95c0 100644 --- a/+ConstraintDiagramPkg/+ConstraintSpecsPkg/ElysianE9X.m +++ b/+ConstraintDiagramPkg/+ConstraintSpecsPkg/ElysianE9X.m @@ -2,11 +2,22 @@ % % [] = ElysianE9X() % written by Paul Mokotoff, prmoko@umich.edu -% last updated: 13 jul 2026 +% last updated: 22 jul 2026 % % create a constraint diagram for a battery electric aircraft % representative of the Elysian E9X. % +% data was extracted from the following papers, published in 2024 and 2025: +% 1) de Vries, R., Wolleswinkel, R. E., Hoogreef, M., & Vos, R. (2024). +% A new perspective on battery-electric aviation, part II: +% Conceptual design of a 90-seater. In AIAA Scitech 2024 Forum +% (p. 1490). https://doi.org/10.2514/6.2024-1490 +% +% 2) de Vries, R., Wolleswinkel, R. E., Exalto, J., van den Berg, P., +% Vos, R., & Hoogreef, M. (2025). Conceptual Redesign of a 90-Seater +% Battery-Electric Aircraft. In AIAA AVIATION FORUM AND ASCEND 2025 +% (p. 3153). https://doi.org/10.2514/6.2025-3153 +% % INPUTS: % none % diff --git a/+ConstraintDiagramPkg/+ConstraintSpecsPkg/SUSAN.m b/+ConstraintDiagramPkg/+ConstraintSpecsPkg/SUSAN.m index 13bc5e6d..f491b01f 100644 --- a/+ConstraintDiagramPkg/+ConstraintSpecsPkg/SUSAN.m +++ b/+ConstraintDiagramPkg/+ConstraintSpecsPkg/SUSAN.m @@ -4,7 +4,12 @@ % written by Paul Mokotoff, prmoko@umich.edu % last updated: 22 jul 2026 % -% create a constraint diagram for NASA's SUSAN aircraft. +% create a constraint diagram for NASA's SUSAN aircraft. information was +% extracted from the following paper: +% +% Chau, T., & Duensing, J. (2024). Conceptual Design of the Hybrid-Electric +% Subsonic Single Aft Engine (SUSAN) Electrofan Transport Aircraft. In AIAA +% SciTech 2024 Forum (p. 1326). https://doi.org/10.2514/6.2024-1326 % % INPUTS: % none From a5f6d091a3ec307fe0e766aa45d6d26fc1fa3ad0 Mon Sep 17 00:00:00 2001 From: prmoko Date: Wed, 22 Jul 2026 09:41:03 -0400 Subject: [PATCH 11/11] Updated README Included other parameters that were not previously listed for modeling. --- +ConstraintDiagramPkg/README.m | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/+ConstraintDiagramPkg/README.m b/+ConstraintDiagramPkg/README.m index 8d237121..dde5c717 100644 --- a/+ConstraintDiagramPkg/README.m +++ b/+ConstraintDiagramPkg/README.m @@ -26,7 +26,7 @@ % Michael Tsai % Vaibhav Rau % -% README last updated: 06 Oct 2025 +% README last updated: 22 July 2026 % % ------------------------------------------------------------------------- % @@ -176,11 +176,19 @@ % MTOW - maximum takeoff weight % % Propulsion -% T_W.SLS - thrust-to-weight ratio at sea-level, used for turbofan -% aircraft +% T_W.SLS - thrust-to-weight ratio at sea-level, used for +% turbofan aircraft % -% NumEngines - number of engines installed (used for 14 CFR 25 climb -% gradients) +% NumEngines - number of engines installed (used for 14 CFR 25 +% climb gradients) +% +% LapseRate.Crs - engine lapse rate during cruise (or at cruise +% altitude) +% +% LapseRate.Div - engine lapse rate during a diversion (or at the +% corresponding altitude) +% +% LapseRate.Ceil - engine lapse rate at the service ceiling % % Power % P_W.SLS - power-to-weight ratio at sea-level, used for turboprop or @@ -195,6 +203,8 @@ % a) 0 - climb gradients from 14 CFR 25 % b) 1 - climb gradients as a function of the specific % excess power loss +% c) 2 - climb gradients as a function of the number +% of propulsors installed on the aircraft % % ------------------------------------------------------------------------- %