From 81408df0e3173c2c6cf0370067e17bf54ec0faf7 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 8 Apr 2026 13:08:52 -0400 Subject: [PATCH 01/21] add a few drag factors and aero technology factors --- .../test/data/converter_test_BWB_GASP.csv | 24 ++-- aviary/variable_info/variable_meta_data.py | 119 ++++++++++++++++++ aviary/variable_info/variables.py | 12 ++ 3 files changed, 143 insertions(+), 12 deletions(-) diff --git a/aviary/utils/test/data/converter_test_BWB_GASP.csv b/aviary/utils/test/data/converter_test_BWB_GASP.csv index 6bd086b91..c792632ff 100644 --- a/aviary/utils/test/data/converter_test_BWB_GASP.csv +++ b/aviary/utils/test/data/converter_test_BWB_GASP.csv @@ -29,14 +29,26 @@ aircraft:design:cruise_altitude,41000.0,ft aircraft:design:drag_coefficient_increment,0.00025,unitless aircraft:design:drag_divergence_shift,0.025,unitless aircraft:design:emergency_equipment_mass,100.0,lbm +aircraft:design:fuselage_aero_tech_factor,0.93,unitless +aircraft:design:fuselage_drag_factor,0.885,unitless aircraft:design:gross_mass,150000.0,lbm +aircraft:design:horizontal_tail_aero_tech_factor,0.926,unitless +aircraft:design:horizontal_tail_drag_factor,0.75,unitless +aircraft:design:interference_aero_tech_factor,1.0,unitless +aircraft:design:interference_drag_factor,1.0,unitless aircraft:design:mach,0.8,unitless aircraft:design:max_structural_speed,402.5,mi/h +aircraft:design:nacelle_aero_tech_factor,0.95,unitless +aircraft:design:nacelle_drag_factor,1.15,unitless aircraft:design:part25_structural_category,3.0,unitless aircraft:design:range,3500.0,NM aircraft:design:static_margin,0.05,unitless aircraft:design:structural_mass_increment,0.0,lbm aircraft:design:type,BWB,unitless +aircraft:design:vertical_tail_aero_tech_factor,0.926,unitless +aircraft:design:vertical_tail_drag_factor,0.9,unitless +aircraft:design:wing_aero_tech_factor,0.926,unitless +aircraft:design:wing_drag_factor,0.906,unitless aircraft:design:wing_loading,70.0,lbf/ft**2 aircraft:electrical:system_mass_per_passenger,11.45,lbm aircraft:engine:additional_mass_fraction,0.04373,unitless @@ -190,18 +202,6 @@ INGASP.DCDSE,0.001 INGASP.DYR,12 INGASP.EL_FLGC,8 INGASP.EMCRU,0.8 -INGASP.FCFFC,0.885 -INGASP.FCFFT,0.93 -INGASP.FCFHTC,0.75 -INGASP.FCFHTT,0.926 -INGASP.FCFNC,1.15 -INGASP.FCFNT,0.95 -INGASP.FCFVTC,0.9 -INGASP.FCFVTT,0.926 -INGASP.FCFWC,0.906 -INGASP.FCFWT,0.926 -INGASP.FCKIC,1 -INGASP.FCKIT,1 INGASP.FCMPC,1 INGASP.FCSF,2.5 INGASP.FEXCRT,0.8 diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index 588ece73c..4258f8840 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -1470,6 +1470,26 @@ default_value=0.0, ) +add_meta_data( + Aircraft.Design.Fuselage_AREO_TECH_FACTOR, + meta_data=_MetaData, + historical_name={'GASP': ['INGASP.FCFFT'], 'FLOPS': None, 'LEAPS1': None}, + units='unitless', + option=True, + default_value=1.0, + desc='fuselage aero technology factor', +) + +add_meta_data( + Aircraft.Design.Fuselage_DRAG_FACTOR, + meta_data=_MetaData, + historical_name={'GASP': ['INGASP.FCFFC'], 'FLOPS': None, 'LEAPS1': None}, + units='unitless', + option=True, + default_value=1.0, + desc='fuselage drag factor', +) + add_meta_data( Aircraft.Design.GROSS_MASS, meta_data=_MetaData, @@ -1492,6 +1512,26 @@ default_value=0.0, ) +add_meta_data( + Aircraft.Design.HorizontalTail_AREO_TECH_FACTOR, + meta_data=_MetaData, + historical_name={'GASP': ['INGASP.FCFHTT'], 'FLOPS': None, 'LEAPS1': None}, + units='unitless', + option=True, + default_value=1.0, + desc='horizontal tail aero technology factor', +) + +add_meta_data( + Aircraft.Design.HorizontalTail_DRAG_FACTOR, + meta_data=_MetaData, + historical_name={'GASP': ['INGASP.FCFHTC'], 'FLOPS': None, 'LEAPS1': None}, + units='unitless', + option=True, + default_value=1.0, + desc='horizontal tail drag factor', +) + add_meta_data( Aircraft.Design.IJEFF, meta_data=_MetaData, @@ -1501,6 +1541,26 @@ "Aviary wouldn't be what it is today without his help.", ) +add_meta_data( + Aircraft.Design.INTERFERENCE_AERO_TECH_FACTOR, + meta_data=_MetaData, + historical_name={'GASP': ['INGASP.FCKIT'], 'FLOPS': None, 'LEAPS1': None}, + units='unitless', + option=True, + default_value=1.0, + desc='interference aero technology factor', +) + +add_meta_data( + Aircraft.Design.INTERFERENCE_DRAG_FACTOR, + meta_data=_MetaData, + historical_name={'GASP': ['INGASP.FCKIC'], 'FLOPS': None, 'LEAPS1': None}, + units='unitless', + option=True, + default_value=1.0, + desc='interference drag factor', +) + # TODO expected types and default value? add_meta_data( Aircraft.Design.LAMINAR_FLOW_LOWER, @@ -1669,6 +1729,25 @@ default_value=0, ) +add_meta_data( + Aircraft.Design.Nacelle_AREO_TECH_FACTOR, + meta_data=_MetaData, + historical_name={'GASP': ['INGASP.FCFNT'], 'FLOPS': None, 'LEAPS1': None}, + units='unitless', + option=True, + default_value=1.0, + desc='nacelle aero technology factor', +) +add_meta_data( + Aircraft.Design.Nacelle_DRAG_FACTOR, + meta_data=_MetaData, + historical_name={'GASP': ['INGASP.FCFNC'], 'FLOPS': None, 'LEAPS1': None}, + units='unitless', + option=True, + default_value=1.0, + desc='nacelle drag factor', +) + add_meta_data( Aircraft.Design.PART25_STRUCTURAL_CATEGORY, meta_data=_MetaData, @@ -1910,6 +1989,26 @@ default_value=False, ) +add_meta_data( + Aircraft.Design.VerticalTail_AREO_TECH_FACTOR, + meta_data=_MetaData, + historical_name={'GASP': ['INGASP.FCFVTT'], 'FLOPS': None, 'LEAPS1': None}, + units='unitless', + option=True, + default_value=1.0, + desc='vertical tail aero technology factor', +) + +add_meta_data( + Aircraft.Design.VerticalTail_DRAG_FACTOR, + meta_data=_MetaData, + historical_name={'GASP': ['INGASP.FCFVTC'], 'FLOPS': None, 'LEAPS1': None}, + units='unitless', + option=True, + default_value=1.0, + desc='vertical tail drag factor', +) + add_meta_data( Aircraft.Design.WETTED_AREAS, meta_data=_MetaData, @@ -1925,6 +2024,26 @@ desc='table of component wetted areas', ) +add_meta_data( + Aircraft.Design.Wing_AREO_TECH_FACTOR, + meta_data=_MetaData, + historical_name={'GASP': ['INGASP.FCFWT'], 'FLOPS': None, 'LEAPS1': None}, + units='unitless', + option=True, + default_value=1.0, + desc='wing aero technology factor', +) + +add_meta_data( + Aircraft.Design.Wing_DRAG_FACTOR, + meta_data=_MetaData, + historical_name={'GASP': ['INGASP.FCFWC'], 'FLOPS': None, 'LEAPS1': None}, + units='unitless', + option=True, + default_value=1.0, + desc='wing drag factor', +) + add_meta_data( Aircraft.Design.WING_LOADING, meta_data=_MetaData, diff --git a/aviary/variable_info/variables.py b/aviary/variable_info/variables.py index 7c7bcb6f9..d5c60fca0 100644 --- a/aviary/variable_info/variables.py +++ b/aviary/variable_info/variables.py @@ -139,8 +139,14 @@ class Design: EMPTY_MASS_MARGIN_SCALER = 'aircraft:design:empty_mass_margin_scaler' EXTERNAL_SUBSYSTEMS_MASS = 'aircraft:design:external_subsystems_mass' FINENESS = 'aircraft:design:fineness' + Fuselage_AREO_TECH_FACTOR = 'aircraft:design:fuselage_aero_tech_factor' + Fuselage_DRAG_FACTOR = 'aircraft:design:fuselage_drag_factor' GROSS_MASS = 'aircraft:design:gross_mass' + HorizontalTail_AREO_TECH_FACTOR = 'aircraft:design:horizontal_tail_aero_tech_factor' + HorizontalTail_DRAG_FACTOR = 'aircraft:design:horizontal_tail_drag_factor' IJEFF = 'ijeff' + INTERFERENCE_AERO_TECH_FACTOR = 'aircraft:design:interference_aero_tech_factor' + INTERFERENCE_DRAG_FACTOR = 'aircraft:design:interference_drag_factor' LAMINAR_FLOW_LOWER = 'aircraft:design:laminar_flow_lower' LAMINAR_FLOW_UPPER = 'aircraft:design:laminar_flow_upper' LANDING_TO_TAKEOFF_MASS_RATIO = 'aircraft:design:landing_to_takeoff_mass_ratio' @@ -154,6 +160,8 @@ class Design: MACH = 'aircraft:design:mach' MAX_FUSELAGE_PITCH_ANGLE = 'aircraft:design:max_fuselage_pitch_angle' MAX_STRUCTURAL_SPEED = 'aircraft:design:max_structural_speed' + Nacelle_AREO_TECH_FACTOR = 'aircraft:design:nacelle_aero_tech_factor' + Nacelle_DRAG_FACTOR = 'aircraft:design:nacelle_drag_factor' PART25_STRUCTURAL_CATEGORY = 'aircraft:design:part25_structural_category' RANGE = 'aircraft:design:range' SMOOTH_MASS_DISCONTINUITIES = 'aircraft:design:smooth_mass_discontinuities' @@ -171,7 +179,11 @@ class Design: TYPE = 'aircraft:design:type' ULF_CALCULATED_FROM_MANEUVER = 'aircraft:design:ulf_calculated_from_maneuver' USE_ALT_MASS = 'aircraft:design:use_alt_mass' + VerticalTail_AREO_TECH_FACTOR = 'aircraft:design:vertical_tail_aero_tech_factor' + VerticalTail_DRAG_FACTOR = 'aircraft:design:vertical_tail_drag_factor' WETTED_AREAS = 'aircraft:design:wetted_areas' + Wing_AREO_TECH_FACTOR = 'aircraft:design:wing_aero_tech_factor' + Wing_DRAG_FACTOR = 'aircraft:design:wing_drag_factor' WING_LOADING = 'aircraft:design:wing_loading' ZERO_LIFT_DRAG_COEFF_FACTOR = 'aircraft:design:zero_lift_drag_coeff_factor' From 24dcf5b72bae584aa7f659aa6a29fe411f5b52fc Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 8 Apr 2026 13:51:35 -0400 Subject: [PATCH 02/21] minor update --- aviary/variable_info/variable_meta_data.py | 10 +++++----- aviary/variable_info/variables.py | 14 +++++++------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index 4258f8840..946d17ba4 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -1471,7 +1471,7 @@ ) add_meta_data( - Aircraft.Design.Fuselage_AREO_TECH_FACTOR, + Aircraft.Design.Fuselage_AERO_TECH_FACTOR, meta_data=_MetaData, historical_name={'GASP': ['INGASP.FCFFT'], 'FLOPS': None, 'LEAPS1': None}, units='unitless', @@ -1513,7 +1513,7 @@ ) add_meta_data( - Aircraft.Design.HorizontalTail_AREO_TECH_FACTOR, + Aircraft.Design.HorizontalTail_AERO_TECH_FACTOR, meta_data=_MetaData, historical_name={'GASP': ['INGASP.FCFHTT'], 'FLOPS': None, 'LEAPS1': None}, units='unitless', @@ -1730,7 +1730,7 @@ ) add_meta_data( - Aircraft.Design.Nacelle_AREO_TECH_FACTOR, + Aircraft.Design.Nacelle_AERO_TECH_FACTOR, meta_data=_MetaData, historical_name={'GASP': ['INGASP.FCFNT'], 'FLOPS': None, 'LEAPS1': None}, units='unitless', @@ -1990,7 +1990,7 @@ ) add_meta_data( - Aircraft.Design.VerticalTail_AREO_TECH_FACTOR, + Aircraft.Design.VerticalTail_AERO_TECH_FACTOR, meta_data=_MetaData, historical_name={'GASP': ['INGASP.FCFVTT'], 'FLOPS': None, 'LEAPS1': None}, units='unitless', @@ -2025,7 +2025,7 @@ ) add_meta_data( - Aircraft.Design.Wing_AREO_TECH_FACTOR, + Aircraft.Design.Wing_AERO_TECH_FACTOR, meta_data=_MetaData, historical_name={'GASP': ['INGASP.FCFWT'], 'FLOPS': None, 'LEAPS1': None}, units='unitless', diff --git a/aviary/variable_info/variables.py b/aviary/variable_info/variables.py index d5c60fca0..e115f053a 100644 --- a/aviary/variable_info/variables.py +++ b/aviary/variable_info/variables.py @@ -139,11 +139,11 @@ class Design: EMPTY_MASS_MARGIN_SCALER = 'aircraft:design:empty_mass_margin_scaler' EXTERNAL_SUBSYSTEMS_MASS = 'aircraft:design:external_subsystems_mass' FINENESS = 'aircraft:design:fineness' - Fuselage_AREO_TECH_FACTOR = 'aircraft:design:fuselage_aero_tech_factor' + Fuselage_AERO_TECH_FACTOR = 'aircraft:design:fuselage_aero_tech_factor' Fuselage_DRAG_FACTOR = 'aircraft:design:fuselage_drag_factor' GROSS_MASS = 'aircraft:design:gross_mass' - HorizontalTail_AREO_TECH_FACTOR = 'aircraft:design:horizontal_tail_aero_tech_factor' - HorizontalTail_DRAG_FACTOR = 'aircraft:design:horizontal_tail_drag_factor' + HorizontalTail_AERO_TECH_FACTOR = 'aircraft:design:horizontaltail_aero_tech_factor' + HorizontalTail_DRAG_FACTOR = 'aircraft:design:horizontaltail_drag_factor' IJEFF = 'ijeff' INTERFERENCE_AERO_TECH_FACTOR = 'aircraft:design:interference_aero_tech_factor' INTERFERENCE_DRAG_FACTOR = 'aircraft:design:interference_drag_factor' @@ -160,7 +160,7 @@ class Design: MACH = 'aircraft:design:mach' MAX_FUSELAGE_PITCH_ANGLE = 'aircraft:design:max_fuselage_pitch_angle' MAX_STRUCTURAL_SPEED = 'aircraft:design:max_structural_speed' - Nacelle_AREO_TECH_FACTOR = 'aircraft:design:nacelle_aero_tech_factor' + Nacelle_AERO_TECH_FACTOR = 'aircraft:design:nacelle_aero_tech_factor' Nacelle_DRAG_FACTOR = 'aircraft:design:nacelle_drag_factor' PART25_STRUCTURAL_CATEGORY = 'aircraft:design:part25_structural_category' RANGE = 'aircraft:design:range' @@ -179,10 +179,10 @@ class Design: TYPE = 'aircraft:design:type' ULF_CALCULATED_FROM_MANEUVER = 'aircraft:design:ulf_calculated_from_maneuver' USE_ALT_MASS = 'aircraft:design:use_alt_mass' - VerticalTail_AREO_TECH_FACTOR = 'aircraft:design:vertical_tail_aero_tech_factor' - VerticalTail_DRAG_FACTOR = 'aircraft:design:vertical_tail_drag_factor' + VerticalTail_AERO_TECH_FACTOR = 'aircraft:design:verticaltail_aero_tech_factor' + VerticalTail_DRAG_FACTOR = 'aircraft:design:verticaltail_drag_factor' WETTED_AREAS = 'aircraft:design:wetted_areas' - Wing_AREO_TECH_FACTOR = 'aircraft:design:wing_aero_tech_factor' + Wing_AERO_TECH_FACTOR = 'aircraft:design:wing_aero_tech_factor' Wing_DRAG_FACTOR = 'aircraft:design:wing_drag_factor' WING_LOADING = 'aircraft:design:wing_loading' ZERO_LIFT_DRAG_COEFF_FACTOR = 'aircraft:design:zero_lift_drag_coeff_factor' From 582a0ccf993a4db3f40daf10efe007571e689428 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 8 Apr 2026 15:00:58 -0400 Subject: [PATCH 03/21] modified drag factors for fuselage, nacelle, horizontal tail, vertical tail, strut, and wing --- .../aerodynamics/gasp_based/gaspaero.py | 53 +++++++++++++++---- .../test/data/converter_test_BWB_GASP.csv | 10 ++-- aviary/variable_info/variable_meta_data.py | 32 ++++++++--- aviary/variable_info/variables.py | 2 + 4 files changed, 77 insertions(+), 20 deletions(-) diff --git a/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py b/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py index 5c03c381a..c85d4c444 100644 --- a/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py +++ b/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py @@ -740,6 +740,20 @@ def initialize(self): self.options.declare('num_nodes', default=1, types=int) add_aviary_option(self, Aircraft.Engine.NUM_ENGINES) add_aviary_option(self, Aircraft.Wing.HAS_STRUT) + # drag factors + add_aviary_option(self, Aircraft.Design.Fuselage_DRAG_FACTOR) + add_aviary_option(self, Aircraft.Design.HorizontalTail_DRAG_FACTOR) + add_aviary_option(self, Aircraft.Design.INTERFERENCE_DRAG_FACTOR) + add_aviary_option(self, Aircraft.Design.Nacelle_DRAG_FACTOR) + add_aviary_option(self, Aircraft.Design.VerticalTail_DRAG_FACTOR) + add_aviary_option(self, Aircraft.Design.Wing_DRAG_FACTOR) + # aero technology factos + add_aviary_option(self, Aircraft.Design.Fuselage_AERO_TECH_FACTOR) + add_aviary_option(self, Aircraft.Design.HorizontalTail_AERO_TECH_FACTOR) + add_aviary_option(self, Aircraft.Design.INTERFERENCE_AERO_TECH_FACTOR) + add_aviary_option(self, Aircraft.Design.Nacelle_AERO_TECH_FACTOR) + add_aviary_option(self, Aircraft.Design.VerticalTail_AERO_TECH_FACTOR) + add_aviary_option(self, Aircraft.Design.Wing_AERO_TECH_FACTOR) def setup(self): nn = self.options['num_nodes'] @@ -999,8 +1013,30 @@ def compute(self, inputs, outputs): areashieldwf, siwb, ) = inputs.values() + # drag factors + fcfft = self.options[Aircraft.Design.Fuselage_DRAG_FACTOR] + fcfhtt = self.options[Aircraft.Design.HorizontalTail_DRAG_FACTOR] + self.options[Aircraft.Design.INTERFERENCE_DRAG_FACTOR] + fcfnt = self.options[Aircraft.Design.Nacelle_DRAG_FACTOR] + fcfstrt = self.options[Aircraft.Design.STRUT_DRAG_FACTOR] + fcfvtt = self.options[Aircraft.Design.VerticalTail_DRAG_FACTOR] + fcfwt = self.options[Aircraft.Design.Wing_DRAG_FACTOR] + # aero technology factors + fcffc = self.options[Aircraft.Design.Fuselage_AERO_TECH_FACTOR] + fcfhtc = self.options[Aircraft.Design.HorizontalTail_AERO_TECH_FACTOR] + self.options[Aircraft.Design.INTERFERENCE_AERO_TECH_FACTOR] + fcfnc = self.options[Aircraft.Design.Nacelle_AERO_TECH_FACTOR] + fcfstrc = self.options[Aircraft.Design.STRUT_AERO_TECH_FACTOR] + fcfvtc = self.options[Aircraft.Design.VerticalTail_AERO_TECH_FACTOR] + fcfwc = self.options[Aircraft.Design.Wing_AERO_TECH_FACTOR] # skin friction coeff at Re = 10**7 cf = 0.455 / 7**2.58 / (1 + 0.144 * mach**2) ** 0.65 + cdfi = fcffc * fcfft * cf + cdhti = fcfhtc * fcfhtt * cf + cdni = fcfnc * fcfnt * cf + cdstrti = fcfstrc * fcfstrt * cf + cdvti = fcfvtc * fcfvtt * cf + cdwi = fcfwc * fcfwt * cf t = cs.abs(np.tan(deg2rad(sweep_c4))) yale05 = (1 - taper_ratio) / (1 + taper_ratio) @@ -1046,13 +1082,13 @@ def compute(self, inputs, outputs): # flat plate equivalent areas # GASP uses different values of cf for wing, nacelle, fuselage, etc. - fef = fus_SA * cf * ffre * ff_fus + fe_fus_inc - few = ff_wing * wing_area * cf * fwre + fef = fus_SA * cdfi * ffre * ff_fus + fe_fus_inc + few = ff_wing * wing_area * cdwi * fwre # TODO replace 2 with num_engines - fen = 2 * ff_nac * nacelle_area * cf * fnre - fevt = ff_vtail * vtail_area * cf * fvtre - feht = ff_htail * htail_area * cf * fhtre - festrt = strut_fus_intf * strut_wing_area_ratio * wing_area * cf * fstrtre + fen = 2 * ff_nac * nacelle_area * cdni * fnre + fevt = ff_vtail * vtail_area * cdvti * fvtre + feht = ff_htail * htail_area * cdhti * fhtre + festrt = strut_fus_intf * strut_wing_area_ratio * wing_area * cdstrti * fstrtre # begin INTERFERENCE - get flat plate equivalent for wing-fuselage interference # wing profile drag coefficient @@ -1063,12 +1099,9 @@ def compute(self, inputs, outputs): # end INTERFERENCE # total flat plate equivalent area - # In GASP, nacelle is excluded. + # In GASP, nacelle is excluded. It's kepy here because nacelle dimension is done in premission. fe = few + fef + fevt + feht + fen + feiwf + festrt + cd0_inc * wing_area - # wfob = cabin_width / wingspan - # siwb = 1 - 0.0088 * wfob - 1.7364 * wfob**2 - 2.303 * wfob**3 + 6.0606 * wfob**4 - # wing-free profile drag coefficient cdpo = (fe - few) / wing_area diff --git a/aviary/utils/test/data/converter_test_BWB_GASP.csv b/aviary/utils/test/data/converter_test_BWB_GASP.csv index c792632ff..1e494d086 100644 --- a/aviary/utils/test/data/converter_test_BWB_GASP.csv +++ b/aviary/utils/test/data/converter_test_BWB_GASP.csv @@ -32,8 +32,8 @@ aircraft:design:emergency_equipment_mass,100.0,lbm aircraft:design:fuselage_aero_tech_factor,0.93,unitless aircraft:design:fuselage_drag_factor,0.885,unitless aircraft:design:gross_mass,150000.0,lbm -aircraft:design:horizontal_tail_aero_tech_factor,0.926,unitless -aircraft:design:horizontal_tail_drag_factor,0.75,unitless +aircraft:design:horizontaltail_aero_tech_factor,0.926,unitless +aircraft:design:horizontaltail_drag_factor,0.75,unitless aircraft:design:interference_aero_tech_factor,1.0,unitless aircraft:design:interference_drag_factor,1.0,unitless aircraft:design:mach,0.8,unitless @@ -44,9 +44,11 @@ aircraft:design:part25_structural_category,3.0,unitless aircraft:design:range,3500.0,NM aircraft:design:static_margin,0.05,unitless aircraft:design:structural_mass_increment,0.0,lbm +aircraft:design:strut_aero_tech_factor,0.926,unitless +aircraft:design:strut_drag_factor,0.9,unitless aircraft:design:type,BWB,unitless -aircraft:design:vertical_tail_aero_tech_factor,0.926,unitless -aircraft:design:vertical_tail_drag_factor,0.9,unitless +aircraft:design:verticaltail_aero_tech_factor,0.926,unitless +aircraft:design:verticaltail_drag_factor,0.9,unitless aircraft:design:wing_aero_tech_factor,0.926,unitless aircraft:design:wing_drag_factor,0.906,unitless aircraft:design:wing_loading,70.0,lbf/ft**2 diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index 946d17ba4..a574ea4d3 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -1487,7 +1487,7 @@ units='unitless', option=True, default_value=1.0, - desc='fuselage drag factor', + desc='fuselage aero calibration factor', ) add_meta_data( @@ -1529,7 +1529,7 @@ units='unitless', option=True, default_value=1.0, - desc='horizontal tail drag factor', + desc='horizontal tail aero calibration factor', ) add_meta_data( @@ -1558,7 +1558,7 @@ units='unitless', option=True, default_value=1.0, - desc='interference drag factor', + desc='interference aero calibration factor', ) # TODO expected types and default value? @@ -1745,7 +1745,7 @@ units='unitless', option=True, default_value=1.0, - desc='nacelle drag factor', + desc='nacelle aero calibration factor', ) add_meta_data( @@ -1820,6 +1820,26 @@ default_value=0.0, ) +add_meta_data( + Aircraft.Design.STRUT_AERO_TECH_FACTOR, + meta_data=_MetaData, + historical_name={'GASP': ['INGASP.FCFVTT'], 'FLOPS': None, 'LEAPS1': None}, + units='unitless', + option=True, + default_value=1.0, + desc='strut aero technology factor', +) + +add_meta_data( + Aircraft.Design.STRUT_DRAG_FACTOR, + meta_data=_MetaData, + historical_name={'GASP': ['INGASP.FCFVTC'], 'FLOPS': None, 'LEAPS1': None}, + units='unitless', + option=True, + default_value=1.0, + desc='strut aero calibration factor', +) + add_meta_data( Aircraft.Design.SUBSONIC_DRAG_COEFF_FACTOR, meta_data=_MetaData, @@ -2006,7 +2026,7 @@ units='unitless', option=True, default_value=1.0, - desc='vertical tail drag factor', + desc='vertical tail aero calibration factor', ) add_meta_data( @@ -2041,7 +2061,7 @@ units='unitless', option=True, default_value=1.0, - desc='wing drag factor', + desc='wing aero calibration factor', ) add_meta_data( diff --git a/aviary/variable_info/variables.py b/aviary/variable_info/variables.py index e115f053a..b07dbde7e 100644 --- a/aviary/variable_info/variables.py +++ b/aviary/variable_info/variables.py @@ -168,6 +168,8 @@ class Design: STATIC_MARGIN = 'aircraft:design:static_margin' STRUCTURAL_MASS_INCREMENT = 'aircraft:design:structural_mass_increment' STRUCTURE_MASS = 'aircraft:design:structure_mass' + STRUT_AERO_TECH_FACTOR = 'aircraft:design:strut_aero_tech_factor' + STRUT_DRAG_FACTOR = 'aircraft:design:strut_drag_factor' SUBSONIC_DRAG_COEFF_FACTOR = 'aircraft:design:subsonic_drag_coeff_factor' SUPERSONIC_DRAG_COEFF_FACTOR = 'aircraft:design:supersonic_drag_coeff_factor' SYSTEMS_AND_EQUIPMENT_MASS = 'aircraft:design:systems_and_equipment_mass' From fd0d2837e40baea1eeddbb0cba865a685c5ad45f Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 8 Apr 2026 15:26:32 -0400 Subject: [PATCH 04/21] minor update --- aviary/subsystems/aerodynamics/gasp_based/gaspaero.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py b/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py index c85d4c444..6d635ac7a 100644 --- a/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py +++ b/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py @@ -745,6 +745,7 @@ def initialize(self): add_aviary_option(self, Aircraft.Design.HorizontalTail_DRAG_FACTOR) add_aviary_option(self, Aircraft.Design.INTERFERENCE_DRAG_FACTOR) add_aviary_option(self, Aircraft.Design.Nacelle_DRAG_FACTOR) + add_aviary_option(self, Aircraft.Design.STRUT_DRAG_FACTOR_DRAG_FACTOR) add_aviary_option(self, Aircraft.Design.VerticalTail_DRAG_FACTOR) add_aviary_option(self, Aircraft.Design.Wing_DRAG_FACTOR) # aero technology factos @@ -752,6 +753,7 @@ def initialize(self): add_aviary_option(self, Aircraft.Design.HorizontalTail_AERO_TECH_FACTOR) add_aviary_option(self, Aircraft.Design.INTERFERENCE_AERO_TECH_FACTOR) add_aviary_option(self, Aircraft.Design.Nacelle_AERO_TECH_FACTOR) + add_aviary_option(self, Aircraft.Design.STRUT_AERO_TECH_FACTOR) add_aviary_option(self, Aircraft.Design.VerticalTail_AERO_TECH_FACTOR) add_aviary_option(self, Aircraft.Design.Wing_AERO_TECH_FACTOR) From 64e9244c0ecc712b2e0e37e73655626b2a232726 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 8 Apr 2026 15:56:40 -0400 Subject: [PATCH 05/21] fixed a typo --- aviary/subsystems/aerodynamics/gasp_based/gaspaero.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py b/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py index 6d635ac7a..5e2f61468 100644 --- a/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py +++ b/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py @@ -745,7 +745,7 @@ def initialize(self): add_aviary_option(self, Aircraft.Design.HorizontalTail_DRAG_FACTOR) add_aviary_option(self, Aircraft.Design.INTERFERENCE_DRAG_FACTOR) add_aviary_option(self, Aircraft.Design.Nacelle_DRAG_FACTOR) - add_aviary_option(self, Aircraft.Design.STRUT_DRAG_FACTOR_DRAG_FACTOR) + add_aviary_option(self, Aircraft.Design.STRUT_DRAG_FACTOR) add_aviary_option(self, Aircraft.Design.VerticalTail_DRAG_FACTOR) add_aviary_option(self, Aircraft.Design.Wing_DRAG_FACTOR) # aero technology factos From 76f9738180efda97fb0cf99ee3c1b8951956af02 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 8 Apr 2026 17:09:22 -0400 Subject: [PATCH 06/21] added interference factors --- aviary/subsystems/aerodynamics/gasp_based/gaspaero.py | 6 +++--- aviary/subsystems/aerodynamics/gasp_based/interference.py | 1 + 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py b/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py index 5e2f61468..70e562a1b 100644 --- a/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py +++ b/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py @@ -1018,7 +1018,7 @@ def compute(self, inputs, outputs): # drag factors fcfft = self.options[Aircraft.Design.Fuselage_DRAG_FACTOR] fcfhtt = self.options[Aircraft.Design.HorizontalTail_DRAG_FACTOR] - self.options[Aircraft.Design.INTERFERENCE_DRAG_FACTOR] + fckit = self.options[Aircraft.Design.INTERFERENCE_DRAG_FACTOR] fcfnt = self.options[Aircraft.Design.Nacelle_DRAG_FACTOR] fcfstrt = self.options[Aircraft.Design.STRUT_DRAG_FACTOR] fcfvtt = self.options[Aircraft.Design.VerticalTail_DRAG_FACTOR] @@ -1026,7 +1026,7 @@ def compute(self, inputs, outputs): # aero technology factors fcffc = self.options[Aircraft.Design.Fuselage_AERO_TECH_FACTOR] fcfhtc = self.options[Aircraft.Design.HorizontalTail_AERO_TECH_FACTOR] - self.options[Aircraft.Design.INTERFERENCE_AERO_TECH_FACTOR] + fckic = self.options[Aircraft.Design.INTERFERENCE_AERO_TECH_FACTOR] fcfnc = self.options[Aircraft.Design.Nacelle_AERO_TECH_FACTOR] fcfstrc = self.options[Aircraft.Design.STRUT_AERO_TECH_FACTOR] fcfvtc = self.options[Aircraft.Design.VerticalTail_AERO_TECH_FACTOR] @@ -1097,7 +1097,7 @@ def compute(self, inputs, outputs): cdw0 = few / wing_area # interference drag independent of shielded area feshieldwf = cdw0 * areashieldwf - feiwf = wing_fus_intf * (feintwf - feshieldwf) + feiwf = fckic * fckit * (wing_fus_intf * (feintwf - feshieldwf)) # end INTERFERENCE # total flat plate equivalent area diff --git a/aviary/subsystems/aerodynamics/gasp_based/interference.py b/aviary/subsystems/aerodynamics/gasp_based/interference.py index e40998f84..e60226993 100644 --- a/aviary/subsystems/aerodynamics/gasp_based/interference.py +++ b/aviary/subsystems/aerodynamics/gasp_based/interference.py @@ -325,6 +325,7 @@ def setup(self): ) +# This component is not used class WingFuselageInterferenceMission(om.ExplicitComponent): """ This calculates an additional flat plate drag area due to general aerodynamic interference for wing-fuselage interference From 06dc250fdc2999349b97d189e71439e8d812f89c Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 8 Apr 2026 19:27:13 -0400 Subject: [PATCH 07/21] added compressibility factor --- aviary/subsystems/aerodynamics/gasp_based/gaspaero.py | 4 +++- aviary/utils/test/data/converter_test_BWB_GASP.csv | 2 +- aviary/variable_info/variable_meta_data.py | 10 ++++++++++ aviary/variable_info/variables.py | 1 + 4 files changed, 15 insertions(+), 2 deletions(-) diff --git a/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py b/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py index 70e562a1b..2f0f86a23 100644 --- a/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py +++ b/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py @@ -1425,6 +1425,7 @@ class DragCoefClean(om.ExplicitComponent): def initialize(self): self.options.declare('num_nodes', default=1, types=int) + add_aviary_option(self, Aircraft.Design.COMPRESSIBILITY_DRAG_FACTOR) def setup(self): nn = self.options['num_nodes'] @@ -1483,6 +1484,7 @@ def compute(self, inputs, outputs): SA6, SA7, ) = inputs.values() + fcmpc = self.options[Aircraft.Design.COMPRESSIBILITY_DRAG_FACTOR] mach_div = SA1 + SA2 * CL + div_drag_supercrit @@ -1498,7 +1500,7 @@ def compute(self, inputs, outputs): # induced drag cdi = SA7 * CL**2 - CD = cd0 * zero_lift_factor + cdi * lift_factor + delcdm + CD = cd0 * zero_lift_factor + cdi * lift_factor + fcmpc * delcdm # scale drag idx_sup = np.where(mach >= 1.0) diff --git a/aviary/utils/test/data/converter_test_BWB_GASP.csv b/aviary/utils/test/data/converter_test_BWB_GASP.csv index 1e494d086..2ae7aed1b 100644 --- a/aviary/utils/test/data/converter_test_BWB_GASP.csv +++ b/aviary/utils/test/data/converter_test_BWB_GASP.csv @@ -25,6 +25,7 @@ aircraft:crew_and_payload:uld_mass_per_passenger,0.0667,lbm aircraft:crew_and_payload:water_mass_per_occupant,3.0,lbm aircraft:design:cg_delta,0.25,unitless aircraft:design:cockpit_control_mass_coefficient,16.5,unitless +aircraft:design:compressibility_drag_factor,1.0,unitless aircraft:design:cruise_altitude,41000.0,ft aircraft:design:drag_coefficient_increment,0.00025,unitless aircraft:design:drag_divergence_shift,0.025,unitless @@ -204,7 +205,6 @@ INGASP.DCDSE,0.001 INGASP.DYR,12 INGASP.EL_FLGC,8 INGASP.EMCRU,0.8 -INGASP.FCMPC,1 INGASP.FCSF,2.5 INGASP.FEXCRT,0.8 INGASP.FPYLND,1.15 diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index a574ea4d3..337baa4c3 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -1286,6 +1286,16 @@ default_value=0.0, ) +add_meta_data( + Aircraft.Design.COMPRESSIBILITY_DRAG_FACTOR, + meta_data=_MetaData, + historical_name={'GASP': 'INGASP.FCMPC', 'FLOPS': None, 'LEAPS1': None}, + units='unitless', + option=True, + default_value=1.0, + desc='compressibility aero calibration factor', +) + add_meta_data( Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF, meta_data=_MetaData, diff --git a/aviary/variable_info/variables.py b/aviary/variable_info/variables.py index b07dbde7e..b92226390 100644 --- a/aviary/variable_info/variables.py +++ b/aviary/variable_info/variables.py @@ -125,6 +125,7 @@ class Design: CG_DELTA = 'aircraft:design:cg_delta' CHARACTERISTIC_LENGTHS = 'aircraft:design:characteristic_lengths' COCKPIT_CONTROL_MASS_COEFFICIENT = 'aircraft:design:cockpit_control_mass_coefficient' + COMPRESSIBILITY_DRAG_FACTOR = 'aircraft:design:compressibility_drag_factor' COMPUTE_HTAIL_VOLUME_COEFF = 'aircraft:design:compute_htail_volume_coeff' COMPUTE_VTAIL_VOLUME_COEFF = 'aircraft:design:compute_vtail_volume_coeff' CRUISE_ALTITUDE = 'aircraft:design:cruise_altitude' From baed0074b671b8f063855ac09881919afc5810a6 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 8 Apr 2026 20:32:31 -0400 Subject: [PATCH 08/21] added Aircraft.Design.PYLON_DRAG_FACTOR --- aviary/subsystems/aerodynamics/gasp_based/gaspaero.py | 4 +++- aviary/utils/test/data/converter_test_BWB_GASP.csv | 2 +- .../data/converter_test_large_single_aisle_1_GASP.csv | 2 +- aviary/variable_info/variable_meta_data.py | 11 +++++++++++ aviary/variable_info/variables.py | 1 + 5 files changed, 17 insertions(+), 3 deletions(-) diff --git a/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py b/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py index 2f0f86a23..9da6173d0 100644 --- a/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py +++ b/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py @@ -745,6 +745,7 @@ def initialize(self): add_aviary_option(self, Aircraft.Design.HorizontalTail_DRAG_FACTOR) add_aviary_option(self, Aircraft.Design.INTERFERENCE_DRAG_FACTOR) add_aviary_option(self, Aircraft.Design.Nacelle_DRAG_FACTOR) + add_aviary_option(self, Aircraft.Design.PYLON_DRAG_FACTOR) add_aviary_option(self, Aircraft.Design.STRUT_DRAG_FACTOR) add_aviary_option(self, Aircraft.Design.VerticalTail_DRAG_FACTOR) add_aviary_option(self, Aircraft.Design.Wing_DRAG_FACTOR) @@ -1020,6 +1021,7 @@ def compute(self, inputs, outputs): fcfhtt = self.options[Aircraft.Design.HorizontalTail_DRAG_FACTOR] fckit = self.options[Aircraft.Design.INTERFERENCE_DRAG_FACTOR] fcfnt = self.options[Aircraft.Design.Nacelle_DRAG_FACTOR] + fpylnd = self.options[Aircraft.Design.PYLON_DRAG_FACTOR] fcfstrt = self.options[Aircraft.Design.STRUT_DRAG_FACTOR] fcfvtt = self.options[Aircraft.Design.VerticalTail_DRAG_FACTOR] fcfwt = self.options[Aircraft.Design.Wing_DRAG_FACTOR] @@ -1087,7 +1089,7 @@ def compute(self, inputs, outputs): fef = fus_SA * cdfi * ffre * ff_fus + fe_fus_inc few = ff_wing * wing_area * cdwi * fwre # TODO replace 2 with num_engines - fen = 2 * ff_nac * nacelle_area * cdni * fnre + fen = fpylnd * 2 * ff_nac * nacelle_area * cdni * fnre fevt = ff_vtail * vtail_area * cdvti * fvtre feht = ff_htail * htail_area * cdhti * fhtre festrt = strut_fus_intf * strut_wing_area_ratio * wing_area * cdstrti * fstrtre diff --git a/aviary/utils/test/data/converter_test_BWB_GASP.csv b/aviary/utils/test/data/converter_test_BWB_GASP.csv index 2ae7aed1b..6c5a55b48 100644 --- a/aviary/utils/test/data/converter_test_BWB_GASP.csv +++ b/aviary/utils/test/data/converter_test_BWB_GASP.csv @@ -42,6 +42,7 @@ aircraft:design:max_structural_speed,402.5,mi/h aircraft:design:nacelle_aero_tech_factor,0.95,unitless aircraft:design:nacelle_drag_factor,1.15,unitless aircraft:design:part25_structural_category,3.0,unitless +aircraft:design:pylon_drag_factor,1.15,unitless aircraft:design:range,3500.0,NM aircraft:design:static_margin,0.05,unitless aircraft:design:structural_mass_increment,0.0,lbm @@ -207,7 +208,6 @@ INGASP.EL_FLGC,8 INGASP.EMCRU,0.8 INGASP.FCSF,2.5 INGASP.FEXCRT,0.8 -INGASP.FPYLND,1.15 INGASP.FSA7C,0.85 INGASP.HBTP,0.465 INGASP.HIR,0.015 diff --git a/aviary/utils/test/data/converter_test_large_single_aisle_1_GASP.csv b/aviary/utils/test/data/converter_test_large_single_aisle_1_GASP.csv index c1432b7ab..a41ed8c4f 100644 --- a/aviary/utils/test/data/converter_test_large_single_aisle_1_GASP.csv +++ b/aviary/utils/test/data/converter_test_large_single_aisle_1_GASP.csv @@ -30,6 +30,7 @@ aircraft:design:gross_mass,175400.0,lbm aircraft:design:mach,0.8,unitless aircraft:design:max_structural_speed,402.5,mi/h aircraft:design:part25_structural_category,3.0,unitless +aircraft:design:pylon_drag_factor,1.0,unitless aircraft:design:range,3675.0,NM aircraft:design:static_margin,0.03,unitless aircraft:design:structural_mass_increment,0.0,lbm @@ -182,7 +183,6 @@ INGASP.DCDSE,-1 INGASP.DYR,12 INGASP.EMCRU,0.8 INGASP.FCSF,2.5 -INGASP.FPYLND,1 INGASP.HBTP,0.333 INGASP.HIR,0.015 INGASP.HNCRU,37500 diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index 337baa4c3..102fe6c65 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -1748,6 +1748,7 @@ default_value=1.0, desc='nacelle aero technology factor', ) + add_meta_data( Aircraft.Design.Nacelle_DRAG_FACTOR, meta_data=_MetaData, @@ -1769,6 +1770,16 @@ desc='part 25 structural category', ) +add_meta_data( + Aircraft.Design.PYLON_DRAG_FACTOR, + meta_data=_MetaData, + historical_name={'GASP': ['INGASP.FPYLND'], 'FLOPS': None, 'LEAPS1': None}, + units='unitless', + option=True, + default_value=1.0, + desc='pylon aero calibration factor', +) + add_meta_data( Aircraft.Design.RANGE, meta_data=_MetaData, diff --git a/aviary/variable_info/variables.py b/aviary/variable_info/variables.py index b92226390..3d5286ba8 100644 --- a/aviary/variable_info/variables.py +++ b/aviary/variable_info/variables.py @@ -164,6 +164,7 @@ class Design: Nacelle_AERO_TECH_FACTOR = 'aircraft:design:nacelle_aero_tech_factor' Nacelle_DRAG_FACTOR = 'aircraft:design:nacelle_drag_factor' PART25_STRUCTURAL_CATEGORY = 'aircraft:design:part25_structural_category' + PYLON_DRAG_FACTOR = 'aircraft:design:pylon_drag_factor' RANGE = 'aircraft:design:range' SMOOTH_MASS_DISCONTINUITIES = 'aircraft:design:smooth_mass_discontinuities' STATIC_MARGIN = 'aircraft:design:static_margin' From cb394e017d4dfbc563e2ecd2bb554ebe63f1baf4 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Thu, 9 Apr 2026 15:11:29 -0400 Subject: [PATCH 09/21] added excrescence drag --- .../aerodynamics/gasp_based/gaspaero.py | 40 +++++++++++-------- .../test/data/converter_test_BWB_GASP.csv | 2 +- aviary/variable_info/variable_meta_data.py | 20 ++++++++++ aviary/variable_info/variables.py | 2 + 4 files changed, 47 insertions(+), 17 deletions(-) diff --git a/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py b/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py index 9da6173d0..1025cf509 100644 --- a/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py +++ b/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py @@ -749,6 +749,8 @@ def initialize(self): add_aviary_option(self, Aircraft.Design.STRUT_DRAG_FACTOR) add_aviary_option(self, Aircraft.Design.VerticalTail_DRAG_FACTOR) add_aviary_option(self, Aircraft.Design.Wing_DRAG_FACTOR) + add_aviary_option(self, Aircraft.Design.EXCRESCENCE_DRAG_FACTOR) + add_aviary_option(self, Aircraft.Design.PERCENT_EXCRESCENCE_DRAG) # aero technology factos add_aviary_option(self, Aircraft.Design.Fuselage_AERO_TECH_FACTOR) add_aviary_option(self, Aircraft.Design.HorizontalTail_AERO_TECH_FACTOR) @@ -1017,22 +1019,24 @@ def compute(self, inputs, outputs): siwb, ) = inputs.values() # drag factors - fcfft = self.options[Aircraft.Design.Fuselage_DRAG_FACTOR] - fcfhtt = self.options[Aircraft.Design.HorizontalTail_DRAG_FACTOR] - fckit = self.options[Aircraft.Design.INTERFERENCE_DRAG_FACTOR] - fcfnt = self.options[Aircraft.Design.Nacelle_DRAG_FACTOR] + fcffc = self.options[Aircraft.Design.Fuselage_DRAG_FACTOR] + fcfhtc = self.options[Aircraft.Design.HorizontalTail_DRAG_FACTOR] + fckic = self.options[Aircraft.Design.INTERFERENCE_DRAG_FACTOR] + fcfnc = self.options[Aircraft.Design.Nacelle_DRAG_FACTOR] fpylnd = self.options[Aircraft.Design.PYLON_DRAG_FACTOR] - fcfstrt = self.options[Aircraft.Design.STRUT_DRAG_FACTOR] - fcfvtt = self.options[Aircraft.Design.VerticalTail_DRAG_FACTOR] - fcfwt = self.options[Aircraft.Design.Wing_DRAG_FACTOR] + fcfstrc = self.options[Aircraft.Design.STRUT_DRAG_FACTOR] + fcfvtc = self.options[Aircraft.Design.VerticalTail_DRAG_FACTOR] + fcfwc = self.options[Aircraft.Design.Wing_DRAG_FACTOR] + fexcrt = self.options[Aircraft.Design.EXCRESCENCE_DRAG_FACTOR] + pct_excr = self.options[Aircraft.Design.PERCENT_EXCRESCENCE_DRAG] # aero technology factors - fcffc = self.options[Aircraft.Design.Fuselage_AERO_TECH_FACTOR] - fcfhtc = self.options[Aircraft.Design.HorizontalTail_AERO_TECH_FACTOR] - fckic = self.options[Aircraft.Design.INTERFERENCE_AERO_TECH_FACTOR] - fcfnc = self.options[Aircraft.Design.Nacelle_AERO_TECH_FACTOR] - fcfstrc = self.options[Aircraft.Design.STRUT_AERO_TECH_FACTOR] - fcfvtc = self.options[Aircraft.Design.VerticalTail_AERO_TECH_FACTOR] - fcfwc = self.options[Aircraft.Design.Wing_AERO_TECH_FACTOR] + fcfft = self.options[Aircraft.Design.Fuselage_AERO_TECH_FACTOR] + fcfhtt = self.options[Aircraft.Design.HorizontalTail_AERO_TECH_FACTOR] + fckit = self.options[Aircraft.Design.INTERFERENCE_AERO_TECH_FACTOR] + fcfnt = self.options[Aircraft.Design.Nacelle_AERO_TECH_FACTOR] + fcfstrt = self.options[Aircraft.Design.STRUT_AERO_TECH_FACTOR] + fcfvtt = self.options[Aircraft.Design.VerticalTail_AERO_TECH_FACTOR] + fcfwt = self.options[Aircraft.Design.Wing_AERO_TECH_FACTOR] # skin friction coeff at Re = 10**7 cf = 0.455 / 7**2.58 / (1 + 0.144 * mach**2) ** 0.65 cdfi = fcffc * fcfft * cf @@ -1102,9 +1106,13 @@ def compute(self, inputs, outputs): feiwf = fckic * fckit * (wing_fus_intf * (feintwf - feshieldwf)) # end INTERFERENCE + # Excrescence Drag + feexcr = fexcrt * pct_excr * (few + fef + fevt + feht + fen + festrt) + # total flat plate equivalent area - # In GASP, nacelle is excluded. It's kepy here because nacelle dimension is done in premission. - fe = few + fef + fevt + feht + fen + feiwf + festrt + cd0_inc * wing_area + # In GASP, nacelle is excluded. It's kept here because nacelle dimension is + # done in premission and hence does not size. + fe = few + fef + fevt + feht + fen + feiwf + festrt + cd0_inc * wing_area + feexcr # wing-free profile drag coefficient cdpo = (fe - few) / wing_area diff --git a/aviary/utils/test/data/converter_test_BWB_GASP.csv b/aviary/utils/test/data/converter_test_BWB_GASP.csv index 6c5a55b48..d8a8d20bd 100644 --- a/aviary/utils/test/data/converter_test_BWB_GASP.csv +++ b/aviary/utils/test/data/converter_test_BWB_GASP.csv @@ -30,6 +30,7 @@ aircraft:design:cruise_altitude,41000.0,ft aircraft:design:drag_coefficient_increment,0.00025,unitless aircraft:design:drag_divergence_shift,0.025,unitless aircraft:design:emergency_equipment_mass,100.0,lbm +aircraft:design:excrescence_drag_factor,0.8,unitless aircraft:design:fuselage_aero_tech_factor,0.93,unitless aircraft:design:fuselage_drag_factor,0.885,unitless aircraft:design:gross_mass,150000.0,lbm @@ -207,7 +208,6 @@ INGASP.DYR,12 INGASP.EL_FLGC,8 INGASP.EMCRU,0.8 INGASP.FCSF,2.5 -INGASP.FEXCRT,0.8 INGASP.FSA7C,0.85 INGASP.HBTP,0.465 INGASP.HIR,0.015 diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index c9b180b2d..da2a37cd7 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -1450,6 +1450,16 @@ default_value=0.0, ) +add_meta_data( + Aircraft.Design.EXCRESCENCE_DRAG_FACTOR, + meta_data=_MetaData, + historical_name={'GASP': ['INGASP.FEXCRT'], 'FLOPS': None, 'LEAPS1': None}, + units='unitless', + option=True, + default_value=1.0, + desc='excrescence aero drag factor', +) + add_meta_data( Aircraft.Design.EXTERNAL_SUBSYSTEMS_MASS, historical_name={ @@ -1770,6 +1780,16 @@ desc='part 25 structural category', ) +add_meta_data( + Aircraft.Design.PERCENT_EXCRESCENCE_DRAG, + meta_data=_MetaData, + historical_name={'GASP': ['INGASP.PCT_EXCR'], 'FLOPS': None, 'LEAPS1': None}, + units='unitless', + option=True, + default_value=0.0, + desc='percentage of excrescence drag as of fuselage, wing, nacelle, (winglet), empennage and strut', +) + add_meta_data( Aircraft.Design.PYLON_DRAG_FACTOR, meta_data=_MetaData, diff --git a/aviary/variable_info/variables.py b/aviary/variable_info/variables.py index fa26c78c1..f8a3882f0 100644 --- a/aviary/variable_info/variables.py +++ b/aviary/variable_info/variables.py @@ -138,6 +138,7 @@ class Design: EMPTY_MASS = 'aircraft:design:empty_mass' EMPTY_MASS_MARGIN = 'aircraft:design:empty_mass_margin' EMPTY_MASS_MARGIN_SCALER = 'aircraft:design:empty_mass_margin_scaler' + EXCRESCENCE_DRAG_FACTOR = 'aircraft:design:excrescence_drag_factor' EXTERNAL_SUBSYSTEMS_MASS = 'aircraft:design:external_subsystems_mass' FINENESS = 'aircraft:design:fineness' Fuselage_AERO_TECH_FACTOR = 'aircraft:design:fuselage_aero_tech_factor' @@ -164,6 +165,7 @@ class Design: Nacelle_AERO_TECH_FACTOR = 'aircraft:design:nacelle_aero_tech_factor' Nacelle_DRAG_FACTOR = 'aircraft:design:nacelle_drag_factor' PART25_STRUCTURAL_CATEGORY = 'aircraft:design:part25_structural_category' + PERCENT_EXCRESCENCE_DRAG = 'aircraft:design:percent_excrescence_drag' PYLON_DRAG_FACTOR = 'aircraft:design:pylon_drag_factor' RANGE = 'aircraft:design:range' SMOOTH_MASS_DISCONTINUITIES = 'aircraft:design:smooth_mass_discontinuities' From 0dbd1553d7afbf8d975c2076d5cb8f173bc5ccf5 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Thu, 9 Apr 2026 16:32:43 -0400 Subject: [PATCH 10/21] added Aircraft.Design.INDUCED_DRAG_FACTOR --- aviary/subsystems/aerodynamics/gasp_based/gaspaero.py | 4 +++- aviary/utils/test/data/converter_test_BWB_GASP.csv | 2 +- aviary/variable_info/variable_meta_data.py | 10 ++++++++++ aviary/variable_info/variables.py | 1 + 4 files changed, 15 insertions(+), 2 deletions(-) diff --git a/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py b/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py index 1025cf509..3c2dbd313 100644 --- a/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py +++ b/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py @@ -1436,6 +1436,7 @@ class DragCoefClean(om.ExplicitComponent): def initialize(self): self.options.declare('num_nodes', default=1, types=int) add_aviary_option(self, Aircraft.Design.COMPRESSIBILITY_DRAG_FACTOR) + add_aviary_option(self, Aircraft.Design.INDUCED_DRAG_FACTOR) def setup(self): nn = self.options['num_nodes'] @@ -1495,6 +1496,7 @@ def compute(self, inputs, outputs): SA7, ) = inputs.values() fcmpc = self.options[Aircraft.Design.COMPRESSIBILITY_DRAG_FACTOR] + fsa7c = self.options[Aircraft.Design.INDUCED_DRAG_FACTOR] mach_div = SA1 + SA2 * CL + div_drag_supercrit @@ -1508,7 +1510,7 @@ def compute(self, inputs, outputs): # profile drag cd0 = SA5 + SA6 * cf # induced drag - cdi = SA7 * CL**2 + cdi = fsa7c * SA7 * CL**2 CD = cd0 * zero_lift_factor + cdi * lift_factor + fcmpc * delcdm diff --git a/aviary/utils/test/data/converter_test_BWB_GASP.csv b/aviary/utils/test/data/converter_test_BWB_GASP.csv index d8a8d20bd..dc3c053f8 100644 --- a/aviary/utils/test/data/converter_test_BWB_GASP.csv +++ b/aviary/utils/test/data/converter_test_BWB_GASP.csv @@ -36,6 +36,7 @@ aircraft:design:fuselage_drag_factor,0.885,unitless aircraft:design:gross_mass,150000.0,lbm aircraft:design:horizontaltail_aero_tech_factor,0.926,unitless aircraft:design:horizontaltail_drag_factor,0.75,unitless +aircraft:design:induced_drag_factor,0.85,unitless aircraft:design:interference_aero_tech_factor,1.0,unitless aircraft:design:interference_drag_factor,1.0,unitless aircraft:design:mach,0.8,unitless @@ -208,7 +209,6 @@ INGASP.DYR,12 INGASP.EL_FLGC,8 INGASP.EMCRU,0.8 INGASP.FCSF,2.5 -INGASP.FSA7C,0.85 INGASP.HBTP,0.465 INGASP.HIR,0.015 INGASP.HNCRU,41000 diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index da2a37cd7..28d8c64dc 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -1561,6 +1561,16 @@ "Aviary wouldn't be what it is today without his help.", ) +add_meta_data( + Aircraft.Design.INDUCED_DRAG_FACTOR, + meta_data=_MetaData, + historical_name={'GASP': ['INGASP.FSA7C'], 'FLOPS': None, 'LEAPS1': None}, + units='unitless', + option=True, + default_value=1.0, + desc='induced drag factor', +) + add_meta_data( Aircraft.Design.INTERFERENCE_AERO_TECH_FACTOR, meta_data=_MetaData, diff --git a/aviary/variable_info/variables.py b/aviary/variable_info/variables.py index f8a3882f0..77ab832ea 100644 --- a/aviary/variable_info/variables.py +++ b/aviary/variable_info/variables.py @@ -147,6 +147,7 @@ class Design: HorizontalTail_AERO_TECH_FACTOR = 'aircraft:design:horizontaltail_aero_tech_factor' HorizontalTail_DRAG_FACTOR = 'aircraft:design:horizontaltail_drag_factor' IJEFF = 'ijeff' + INDUCED_DRAG_FACTOR = 'aircraft:design:induced_drag_factor' INTERFERENCE_AERO_TECH_FACTOR = 'aircraft:design:interference_aero_tech_factor' INTERFERENCE_DRAG_FACTOR = 'aircraft:design:interference_drag_factor' LAMINAR_FLOW_LOWER = 'aircraft:design:laminar_flow_lower' From 3e0335dc8614090311b73b201b9a8bde60d4e3f2 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Thu, 9 Apr 2026 23:18:03 -0400 Subject: [PATCH 11/21] removed a TODO and convert it to warning --- aviary/subsystems/aerodynamics/gasp_based/gaspaero.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py b/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py index 3c2dbd313..a0626d1d6 100644 --- a/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py +++ b/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py @@ -372,7 +372,9 @@ def compute(self, inputs, outputs): delta = (static_margin + delta_cg) * h_tail_moment - # TODO handle xt < 0? + if h_tail_moment.real < 0.0: + if verbosity > Verbosity.BRIEF: + warnings.warn(f'Aircraft.HorizontalTail.MOMENT_RATIO is {h_tail_moment}.') xt = 1 / h_tail_moment art = AR * bbar**2 / sbar From a440662c004404347f514e29d83ea3ac0ec7ecc8 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Fri, 10 Apr 2026 12:49:48 -0400 Subject: [PATCH 12/21] update the new parameter --- .../aerodynamics/gasp_based/gaspaero.py | 80 ++++++++++++------- aviary/variable_info/variable_meta_data.py | 11 --- 2 files changed, 53 insertions(+), 38 deletions(-) diff --git a/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py b/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py index a0626d1d6..1ac1f62b9 100644 --- a/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py +++ b/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py @@ -743,7 +743,6 @@ def initialize(self): add_aviary_option(self, Aircraft.Engine.NUM_ENGINES) add_aviary_option(self, Aircraft.Wing.HAS_STRUT) # drag factors - add_aviary_option(self, Aircraft.Design.Fuselage_DRAG_FACTOR) add_aviary_option(self, Aircraft.Design.HorizontalTail_DRAG_FACTOR) add_aviary_option(self, Aircraft.Design.INTERFERENCE_DRAG_FACTOR) add_aviary_option(self, Aircraft.Design.Nacelle_DRAG_FACTOR) @@ -854,6 +853,26 @@ def setup(self): desc='SIWB: curve fitting correction factor for Oswald efficiency', ) + # drag factors + add_aviary_input(self, Aircraft.Design.Fuselage_DRAG_FACTOR) + add_aviary_input(self, Aircraft.Design.HorizontalTail_DRAG_FACTOR) + add_aviary_input(self, Aircraft.Design.INTERFERENCE_DRAG_FACTOR) + add_aviary_input(self, Aircraft.Design.Nacelle_DRAG_FACTOR) + add_aviary_input(self, Aircraft.Design.PYLON_DRAG_FACTOR) + add_aviary_input(self, Aircraft.Design.STRUT_DRAG_FACTOR) + add_aviary_input(self, Aircraft.Design.VerticalTail_DRAG_FACTOR) + add_aviary_input(self, Aircraft.Design.Wing_DRAG_FACTOR) + add_aviary_input(self, Aircraft.Design.EXCRESCENCE_DRAG_FACTOR) + add_aviary_input(self, Aircraft.Design.PERCENT_EXCRESCENCE_DRAG) + # aero technology factos + add_aviary_input(self, Aircraft.Design.Fuselage_AERO_TECH_FACTOR) + add_aviary_input(self, Aircraft.Design.HorizontalTail_AERO_TECH_FACTOR) + add_aviary_input(self, Aircraft.Design.INTERFERENCE_AERO_TECH_FACTOR) + add_aviary_input(self, Aircraft.Design.Nacelle_AERO_TECH_FACTOR) + add_aviary_input(self, Aircraft.Design.STRUT_AERO_TECH_FACTOR) + add_aviary_input(self, Aircraft.Design.VerticalTail_AERO_TECH_FACTOR) + add_aviary_input(self, Aircraft.Design.Wing_AERO_TECH_FACTOR) + # outputs self.add_output('SA1', units='unitless', shape=nn, desc='SA1: drag param') self.add_output('SA2', units='unitless', shape=nn, desc='SA2: drag param') @@ -1019,26 +1038,24 @@ def compute(self, inputs, outputs): feintwf, areashieldwf, siwb, + fcffc, + fcfhtc, + fckic, + fcfnc, + fpylnd, + fcfstrc, + fcfvtc, + fcfwc, + fexcrt, + pct_excr, + fcfft, + fcfhtt, + fckit, + fcfnt, + fcfstrt, + fcfvtt, + fcfwt, ) = inputs.values() - # drag factors - fcffc = self.options[Aircraft.Design.Fuselage_DRAG_FACTOR] - fcfhtc = self.options[Aircraft.Design.HorizontalTail_DRAG_FACTOR] - fckic = self.options[Aircraft.Design.INTERFERENCE_DRAG_FACTOR] - fcfnc = self.options[Aircraft.Design.Nacelle_DRAG_FACTOR] - fpylnd = self.options[Aircraft.Design.PYLON_DRAG_FACTOR] - fcfstrc = self.options[Aircraft.Design.STRUT_DRAG_FACTOR] - fcfvtc = self.options[Aircraft.Design.VerticalTail_DRAG_FACTOR] - fcfwc = self.options[Aircraft.Design.Wing_DRAG_FACTOR] - fexcrt = self.options[Aircraft.Design.EXCRESCENCE_DRAG_FACTOR] - pct_excr = self.options[Aircraft.Design.PERCENT_EXCRESCENCE_DRAG] - # aero technology factors - fcfft = self.options[Aircraft.Design.Fuselage_AERO_TECH_FACTOR] - fcfhtt = self.options[Aircraft.Design.HorizontalTail_AERO_TECH_FACTOR] - fckit = self.options[Aircraft.Design.INTERFERENCE_AERO_TECH_FACTOR] - fcfnt = self.options[Aircraft.Design.Nacelle_AERO_TECH_FACTOR] - fcfstrt = self.options[Aircraft.Design.STRUT_AERO_TECH_FACTOR] - fcfvtt = self.options[Aircraft.Design.VerticalTail_AERO_TECH_FACTOR] - fcfwt = self.options[Aircraft.Design.Wing_AERO_TECH_FACTOR] # skin friction coeff at Re = 10**7 cf = 0.455 / 7**2.58 / (1 + 0.144 * mach**2) ** 0.65 cdfi = fcffc * fcfft * cf @@ -1094,8 +1111,9 @@ def compute(self, inputs, outputs): # GASP uses different values of cf for wing, nacelle, fuselage, etc. fef = fus_SA * cdfi * ffre * ff_fus + fe_fus_inc few = ff_wing * wing_area * cdwi * fwre - # TODO replace 2 with num_engines - fen = fpylnd * 2 * ff_nac * nacelle_area * cdni * fnre + # Replaced 2 with total_num_engines. Need to check. See issue #1080 + total_num_engines = sum(self.options[Aircraft.Engine.NUM_ENGINES]) + fen = fpylnd * total_num_engines * ff_nac * nacelle_area * cdni * fnre fevt = ff_vtail * vtail_area * cdvti * fvtre feht = ff_htail * htail_area * cdhti * fhtre festrt = strut_fus_intf * strut_wing_area_ratio * wing_area * cdstrti * fstrtre @@ -1437,8 +1455,6 @@ class DragCoefClean(om.ExplicitComponent): def initialize(self): self.options.declare('num_nodes', default=1, types=int) - add_aviary_option(self, Aircraft.Design.COMPRESSIBILITY_DRAG_FACTOR) - add_aviary_option(self, Aircraft.Design.INDUCED_DRAG_FACTOR) def setup(self): nn = self.options['num_nodes'] @@ -1453,6 +1469,8 @@ def setup(self): add_aviary_input(self, Aircraft.Design.SUPERSONIC_DRAG_COEFF_FACTOR, units='unitless') add_aviary_input(self, Aircraft.Design.LIFT_DEPENDENT_DRAG_COEFF_FACTOR, units='unitless') add_aviary_input(self, Aircraft.Design.ZERO_LIFT_DRAG_COEFF_FACTOR, units='unitless') + add_aviary_input(self, Aircraft.Design.INDUCED_DRAG_FACTOR, units='unitless') + add_aviary_input(self, Aircraft.Design.COMPRESSIBILITY_DRAG_FACTOR, units='unitless') # from aero setup self.add_input( @@ -1479,7 +1497,15 @@ def setup_partials(self): cols=ar, method='cs', ) - self.declare_partials('CD', [Aircraft.Design.DRAG_DIVERGENCE_SHIFT], method='cs') + self.declare_partials( + 'CD', + [ + Aircraft.Design.DRAG_DIVERGENCE_SHIFT, + Aircraft.Design.INDUCED_DRAG_FACTOR, + Aircraft.Design.COMPRESSIBILITY_DRAG_FACTOR, + ], + method='cs', + ) def compute(self, inputs, outputs): ( @@ -1490,6 +1516,8 @@ def compute(self, inputs, outputs): supersonic_factor, lift_factor, zero_lift_factor, + fsa7c, + fcmpc, cf, SA1, SA2, @@ -1497,8 +1525,6 @@ def compute(self, inputs, outputs): SA6, SA7, ) = inputs.values() - fcmpc = self.options[Aircraft.Design.COMPRESSIBILITY_DRAG_FACTOR] - fsa7c = self.options[Aircraft.Design.INDUCED_DRAG_FACTOR] mach_div = SA1 + SA2 * CL + div_drag_supercrit diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index 28d8c64dc..ab6292618 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -1291,7 +1291,6 @@ meta_data=_MetaData, historical_name={'GASP': 'INGASP.FCMPC', 'FLOPS': None, 'LEAPS1': None}, units='unitless', - option=True, default_value=1.0, desc='compressibility aero calibration factor', ) @@ -1455,7 +1454,6 @@ meta_data=_MetaData, historical_name={'GASP': ['INGASP.FEXCRT'], 'FLOPS': None, 'LEAPS1': None}, units='unitless', - option=True, default_value=1.0, desc='excrescence aero drag factor', ) @@ -1505,7 +1503,6 @@ meta_data=_MetaData, historical_name={'GASP': ['INGASP.FCFFC'], 'FLOPS': None, 'LEAPS1': None}, units='unitless', - option=True, default_value=1.0, desc='fuselage aero calibration factor', ) @@ -1547,7 +1544,6 @@ meta_data=_MetaData, historical_name={'GASP': ['INGASP.FCFHTC'], 'FLOPS': None, 'LEAPS1': None}, units='unitless', - option=True, default_value=1.0, desc='horizontal tail aero calibration factor', ) @@ -1566,7 +1562,6 @@ meta_data=_MetaData, historical_name={'GASP': ['INGASP.FSA7C'], 'FLOPS': None, 'LEAPS1': None}, units='unitless', - option=True, default_value=1.0, desc='induced drag factor', ) @@ -1586,7 +1581,6 @@ meta_data=_MetaData, historical_name={'GASP': ['INGASP.FCKIC'], 'FLOPS': None, 'LEAPS1': None}, units='unitless', - option=True, default_value=1.0, desc='interference aero calibration factor', ) @@ -1774,7 +1768,6 @@ meta_data=_MetaData, historical_name={'GASP': ['INGASP.FCFNC'], 'FLOPS': None, 'LEAPS1': None}, units='unitless', - option=True, default_value=1.0, desc='nacelle aero calibration factor', ) @@ -1805,7 +1798,6 @@ meta_data=_MetaData, historical_name={'GASP': ['INGASP.FPYLND'], 'FLOPS': None, 'LEAPS1': None}, units='unitless', - option=True, default_value=1.0, desc='pylon aero calibration factor', ) @@ -1886,7 +1878,6 @@ meta_data=_MetaData, historical_name={'GASP': ['INGASP.FCFVTC'], 'FLOPS': None, 'LEAPS1': None}, units='unitless', - option=True, default_value=1.0, desc='strut aero calibration factor', ) @@ -2075,7 +2066,6 @@ meta_data=_MetaData, historical_name={'GASP': ['INGASP.FCFVTC'], 'FLOPS': None, 'LEAPS1': None}, units='unitless', - option=True, default_value=1.0, desc='vertical tail aero calibration factor', ) @@ -2110,7 +2100,6 @@ meta_data=_MetaData, historical_name={'GASP': ['INGASP.FCFWC'], 'FLOPS': None, 'LEAPS1': None}, units='unitless', - option=True, default_value=1.0, desc='wing aero calibration factor', ) From fcdfae7da3ad4da3fb6de615cee4783bccbd84a7 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 14 Apr 2026 11:54:04 -0400 Subject: [PATCH 13/21] add a comment --- aviary/subsystems/aerodynamics/gasp_based/gaspaero.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py b/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py index 1ac1f62b9..0ddf2684c 100644 --- a/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py +++ b/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py @@ -1431,6 +1431,8 @@ def compute(self, inputs, outputs): cd0 = SA5 + SA6 * cf # induced drag + # fsa7c is not applied to SA7 here based on GASP logic. + # Hopefully dCL_flaps_coef and CDI_factor cover the “FSA7C” correction. cdi = SA7 * (CL - dCL_flaps_coef * dCL_flaps_model) ** 2 / CDI_factor # ground effects - direct increment to CD From f98503d5bb2dc10fedb066fb2d007db8af6d450d Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 20 Apr 2026 19:49:26 -0400 Subject: [PATCH 14/21] removed technology factors and combined them into drag calibration factors --- .../aerodynamics/gasp_based/gaspaero.py | 42 ++----- .../test/data/converter_test_BWB_GASP.csv | 21 ++-- aviary/variable_info/variable_meta_data.py | 117 +++--------------- aviary/variable_info/variables.py | 8 -- 4 files changed, 34 insertions(+), 154 deletions(-) diff --git a/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py b/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py index 0ddf2684c..48f49683b 100644 --- a/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py +++ b/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py @@ -752,14 +752,6 @@ def initialize(self): add_aviary_option(self, Aircraft.Design.Wing_DRAG_FACTOR) add_aviary_option(self, Aircraft.Design.EXCRESCENCE_DRAG_FACTOR) add_aviary_option(self, Aircraft.Design.PERCENT_EXCRESCENCE_DRAG) - # aero technology factos - add_aviary_option(self, Aircraft.Design.Fuselage_AERO_TECH_FACTOR) - add_aviary_option(self, Aircraft.Design.HorizontalTail_AERO_TECH_FACTOR) - add_aviary_option(self, Aircraft.Design.INTERFERENCE_AERO_TECH_FACTOR) - add_aviary_option(self, Aircraft.Design.Nacelle_AERO_TECH_FACTOR) - add_aviary_option(self, Aircraft.Design.STRUT_AERO_TECH_FACTOR) - add_aviary_option(self, Aircraft.Design.VerticalTail_AERO_TECH_FACTOR) - add_aviary_option(self, Aircraft.Design.Wing_AERO_TECH_FACTOR) def setup(self): nn = self.options['num_nodes'] @@ -864,14 +856,6 @@ def setup(self): add_aviary_input(self, Aircraft.Design.Wing_DRAG_FACTOR) add_aviary_input(self, Aircraft.Design.EXCRESCENCE_DRAG_FACTOR) add_aviary_input(self, Aircraft.Design.PERCENT_EXCRESCENCE_DRAG) - # aero technology factos - add_aviary_input(self, Aircraft.Design.Fuselage_AERO_TECH_FACTOR) - add_aviary_input(self, Aircraft.Design.HorizontalTail_AERO_TECH_FACTOR) - add_aviary_input(self, Aircraft.Design.INTERFERENCE_AERO_TECH_FACTOR) - add_aviary_input(self, Aircraft.Design.Nacelle_AERO_TECH_FACTOR) - add_aviary_input(self, Aircraft.Design.STRUT_AERO_TECH_FACTOR) - add_aviary_input(self, Aircraft.Design.VerticalTail_AERO_TECH_FACTOR) - add_aviary_input(self, Aircraft.Design.Wing_AERO_TECH_FACTOR) # outputs self.add_output('SA1', units='unitless', shape=nn, desc='SA1: drag param') @@ -1048,22 +1032,15 @@ def compute(self, inputs, outputs): fcfwc, fexcrt, pct_excr, - fcfft, - fcfhtt, - fckit, - fcfnt, - fcfstrt, - fcfvtt, - fcfwt, ) = inputs.values() # skin friction coeff at Re = 10**7 cf = 0.455 / 7**2.58 / (1 + 0.144 * mach**2) ** 0.65 - cdfi = fcffc * fcfft * cf - cdhti = fcfhtc * fcfhtt * cf - cdni = fcfnc * fcfnt * cf - cdstrti = fcfstrc * fcfstrt * cf - cdvti = fcfvtc * fcfvtt * cf - cdwi = fcfwc * fcfwt * cf + cdfi = fcffc * cf + cdhti = fcfhtc * cf + cdni = fcfnc * cf + cdstrti = fcfstrc * cf + cdvti = fcfvtc * cf + cdwi = fcfwc * cf t = cs.abs(np.tan(deg2rad(sweep_c4))) yale05 = (1 - taper_ratio) / (1 + taper_ratio) @@ -1123,7 +1100,7 @@ def compute(self, inputs, outputs): cdw0 = few / wing_area # interference drag independent of shielded area feshieldwf = cdw0 * areashieldwf - feiwf = fckic * fckit * (wing_fus_intf * (feintwf - feshieldwf)) + feiwf = fckic * (wing_fus_intf * (feintwf - feshieldwf)) # end INTERFERENCE # Excrescence Drag @@ -1471,7 +1448,6 @@ def setup(self): add_aviary_input(self, Aircraft.Design.SUPERSONIC_DRAG_COEFF_FACTOR, units='unitless') add_aviary_input(self, Aircraft.Design.LIFT_DEPENDENT_DRAG_COEFF_FACTOR, units='unitless') add_aviary_input(self, Aircraft.Design.ZERO_LIFT_DRAG_COEFF_FACTOR, units='unitless') - add_aviary_input(self, Aircraft.Design.INDUCED_DRAG_FACTOR, units='unitless') add_aviary_input(self, Aircraft.Design.COMPRESSIBILITY_DRAG_FACTOR, units='unitless') # from aero setup @@ -1503,7 +1479,6 @@ def setup_partials(self): 'CD', [ Aircraft.Design.DRAG_DIVERGENCE_SHIFT, - Aircraft.Design.INDUCED_DRAG_FACTOR, Aircraft.Design.COMPRESSIBILITY_DRAG_FACTOR, ], method='cs', @@ -1518,7 +1493,6 @@ def compute(self, inputs, outputs): supersonic_factor, lift_factor, zero_lift_factor, - fsa7c, fcmpc, cf, SA1, @@ -1540,7 +1514,7 @@ def compute(self, inputs, outputs): # profile drag cd0 = SA5 + SA6 * cf # induced drag - cdi = fsa7c * SA7 * CL**2 + cdi = SA7 * CL**2 CD = cd0 * zero_lift_factor + cdi * lift_factor + fcmpc * delcdm diff --git a/aviary/utils/test/data/converter_test_BWB_GASP.csv b/aviary/utils/test/data/converter_test_BWB_GASP.csv index dc3c053f8..d2b6f55cd 100644 --- a/aviary/utils/test/data/converter_test_BWB_GASP.csv +++ b/aviary/utils/test/data/converter_test_BWB_GASP.csv @@ -31,30 +31,23 @@ aircraft:design:drag_coefficient_increment,0.00025,unitless aircraft:design:drag_divergence_shift,0.025,unitless aircraft:design:emergency_equipment_mass,100.0,lbm aircraft:design:excrescence_drag_factor,0.8,unitless -aircraft:design:fuselage_aero_tech_factor,0.93,unitless -aircraft:design:fuselage_drag_factor,0.885,unitless +aircraft:design:fuselage_drag_factor,0.82305,unitless aircraft:design:gross_mass,150000.0,lbm -aircraft:design:horizontaltail_aero_tech_factor,0.926,unitless -aircraft:design:horizontaltail_drag_factor,0.75,unitless -aircraft:design:induced_drag_factor,0.85,unitless -aircraft:design:interference_aero_tech_factor,1.0,unitless +aircraft:design:horizontaltail_drag_factor,0.6945,unitless aircraft:design:interference_drag_factor,1.0,unitless +aircraft:design:lift_dependent_drag_coeff_factor,0.85,unitless aircraft:design:mach,0.8,unitless aircraft:design:max_structural_speed,402.5,mi/h -aircraft:design:nacelle_aero_tech_factor,0.95,unitless -aircraft:design:nacelle_drag_factor,1.15,unitless +aircraft:design:nacelle_drag_factor,1.0925,unitless aircraft:design:part25_structural_category,3.0,unitless aircraft:design:pylon_drag_factor,1.15,unitless aircraft:design:range,3500.0,NM aircraft:design:static_margin,0.05,unitless aircraft:design:structural_mass_increment,0.0,lbm -aircraft:design:strut_aero_tech_factor,0.926,unitless -aircraft:design:strut_drag_factor,0.9,unitless +aircraft:design:strut_drag_factor,0.8334,unitless aircraft:design:type,BWB,unitless -aircraft:design:verticaltail_aero_tech_factor,0.926,unitless -aircraft:design:verticaltail_drag_factor,0.9,unitless -aircraft:design:wing_aero_tech_factor,0.926,unitless -aircraft:design:wing_drag_factor,0.906,unitless +aircraft:design:verticaltail_drag_factor,0.8334,unitless +aircraft:design:wing_drag_factor,0.838956,unitless aircraft:design:wing_loading,70.0,lbf/ft**2 aircraft:electrical:system_mass_per_passenger,11.45,lbm aircraft:engine:additional_mass_fraction,0.04373,unitless diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index ab6292618..5f01fedf9 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -1452,7 +1452,7 @@ add_meta_data( Aircraft.Design.EXCRESCENCE_DRAG_FACTOR, meta_data=_MetaData, - historical_name={'GASP': ['INGASP.FEXCRT'], 'FLOPS': None, 'LEAPS1': None}, + historical_name={'GASP': 'INGASP.FEXCRT', 'FLOPS': None, 'LEAPS1': None}, units='unitless', default_value=1.0, desc='excrescence aero drag factor', @@ -1488,23 +1488,13 @@ default_value=0.0, ) -add_meta_data( - Aircraft.Design.Fuselage_AERO_TECH_FACTOR, - meta_data=_MetaData, - historical_name={'GASP': ['INGASP.FCFFT'], 'FLOPS': None, 'LEAPS1': None}, - units='unitless', - option=True, - default_value=1.0, - desc='fuselage aero technology factor', -) - add_meta_data( Aircraft.Design.Fuselage_DRAG_FACTOR, meta_data=_MetaData, - historical_name={'GASP': ['INGASP.FCFFC'], 'FLOPS': None, 'LEAPS1': None}, + historical_name={'GASP': 'INGASP.FCFFC', 'FLOPS': None, 'LEAPS1': None}, units='unitless', default_value=1.0, - desc='fuselage aero calibration factor', + desc='fuselage aero calibration factor (include technology factor INGASP.FCFFT)', ) add_meta_data( @@ -1529,23 +1519,13 @@ default_value=0.0, ) -add_meta_data( - Aircraft.Design.HorizontalTail_AERO_TECH_FACTOR, - meta_data=_MetaData, - historical_name={'GASP': ['INGASP.FCFHTT'], 'FLOPS': None, 'LEAPS1': None}, - units='unitless', - option=True, - default_value=1.0, - desc='horizontal tail aero technology factor', -) - add_meta_data( Aircraft.Design.HorizontalTail_DRAG_FACTOR, meta_data=_MetaData, - historical_name={'GASP': ['INGASP.FCFHTC'], 'FLOPS': None, 'LEAPS1': None}, + historical_name={'GASP': 'INGASP.FCFHTC', 'FLOPS': None, 'LEAPS1': None}, units='unitless', default_value=1.0, - desc='horizontal tail aero calibration factor', + desc='horizontal tail aero calibration factor (including technology factor INGASP.FCFHTT)', ) add_meta_data( @@ -1557,32 +1537,13 @@ "Aviary wouldn't be what it is today without his help.", ) -add_meta_data( - Aircraft.Design.INDUCED_DRAG_FACTOR, - meta_data=_MetaData, - historical_name={'GASP': ['INGASP.FSA7C'], 'FLOPS': None, 'LEAPS1': None}, - units='unitless', - default_value=1.0, - desc='induced drag factor', -) - -add_meta_data( - Aircraft.Design.INTERFERENCE_AERO_TECH_FACTOR, - meta_data=_MetaData, - historical_name={'GASP': ['INGASP.FCKIT'], 'FLOPS': None, 'LEAPS1': None}, - units='unitless', - option=True, - default_value=1.0, - desc='interference aero technology factor', -) - add_meta_data( Aircraft.Design.INTERFERENCE_DRAG_FACTOR, meta_data=_MetaData, - historical_name={'GASP': ['INGASP.FCKIC'], 'FLOPS': None, 'LEAPS1': None}, + historical_name={'GASP': 'INGASP.FCKIC', 'FLOPS': None, 'LEAPS1': None}, units='unitless', default_value=1.0, - desc='interference aero calibration factor', + desc='interference aero calibration factor (including technology factor INGASP.FCKIT)', ) # TODO expected types and default value? @@ -1674,7 +1635,7 @@ Aircraft.Design.LIFT_DEPENDENT_DRAG_COEFF_FACTOR, meta_data=_MetaData, historical_name={ - 'GASP': None, + 'GASP': 'INGASP.FSA7C', 'FLOPS': 'MISSIN.FCDI', # '~DRGFCT.FCDI', 'LEAPS1': 'aircraft.outputs.L0_aerodynamics.induced_drag_coeff_fact', }, @@ -1753,23 +1714,13 @@ default_value=0, ) -add_meta_data( - Aircraft.Design.Nacelle_AERO_TECH_FACTOR, - meta_data=_MetaData, - historical_name={'GASP': ['INGASP.FCFNT'], 'FLOPS': None, 'LEAPS1': None}, - units='unitless', - option=True, - default_value=1.0, - desc='nacelle aero technology factor', -) - add_meta_data( Aircraft.Design.Nacelle_DRAG_FACTOR, meta_data=_MetaData, - historical_name={'GASP': ['INGASP.FCFNC'], 'FLOPS': None, 'LEAPS1': None}, + historical_name={'GASP': 'INGASP.FCFNC', 'FLOPS': None, 'LEAPS1': None}, units='unitless', default_value=1.0, - desc='nacelle aero calibration factor', + desc='nacelle aero calibration factor (including technology factor INGASP.FCFNT)', ) add_meta_data( @@ -1786,7 +1737,7 @@ add_meta_data( Aircraft.Design.PERCENT_EXCRESCENCE_DRAG, meta_data=_MetaData, - historical_name={'GASP': ['INGASP.PCT_EXCR'], 'FLOPS': None, 'LEAPS1': None}, + historical_name={'GASP': 'INGASP.PCT_EXCR', 'FLOPS': None, 'LEAPS1': None}, units='unitless', option=True, default_value=0.0, @@ -1796,7 +1747,7 @@ add_meta_data( Aircraft.Design.PYLON_DRAG_FACTOR, meta_data=_MetaData, - historical_name={'GASP': ['INGASP.FPYLND'], 'FLOPS': None, 'LEAPS1': None}, + historical_name={'GASP': 'INGASP.FPYLND', 'FLOPS': None, 'LEAPS1': None}, units='unitless', default_value=1.0, desc='pylon aero calibration factor', @@ -1863,23 +1814,13 @@ default_value=0.0, ) -add_meta_data( - Aircraft.Design.STRUT_AERO_TECH_FACTOR, - meta_data=_MetaData, - historical_name={'GASP': ['INGASP.FCFVTT'], 'FLOPS': None, 'LEAPS1': None}, - units='unitless', - option=True, - default_value=1.0, - desc='strut aero technology factor', -) - add_meta_data( Aircraft.Design.STRUT_DRAG_FACTOR, meta_data=_MetaData, - historical_name={'GASP': ['INGASP.FCFVTC'], 'FLOPS': None, 'LEAPS1': None}, + historical_name={'GASP': 'INGASP.FCFVTC', 'FLOPS': None, 'LEAPS1': None}, units='unitless', default_value=1.0, - desc='strut aero calibration factor', + desc='strut aero calibration factor (including technology factor INGASP.FCFVTT)', ) add_meta_data( @@ -2015,7 +1956,7 @@ add_meta_data( Aircraft.Design.TYPE, meta_data=_MetaData, - historical_name={'GASP': ['INGASP.IHWB'], 'FLOPS': ['OPTION.IFITE'], 'LEAPS1': None}, + historical_name={'GASP': 'INGASP.IHWB', 'FLOPS': ['OPTION.IFITE'], 'LEAPS1': None}, units='unitless', types=AircraftTypes, option=True, @@ -2051,23 +1992,13 @@ default_value=False, ) -add_meta_data( - Aircraft.Design.VerticalTail_AERO_TECH_FACTOR, - meta_data=_MetaData, - historical_name={'GASP': ['INGASP.FCFVTT'], 'FLOPS': None, 'LEAPS1': None}, - units='unitless', - option=True, - default_value=1.0, - desc='vertical tail aero technology factor', -) - add_meta_data( Aircraft.Design.VerticalTail_DRAG_FACTOR, meta_data=_MetaData, - historical_name={'GASP': ['INGASP.FCFVTC'], 'FLOPS': None, 'LEAPS1': None}, + historical_name={'GASP': 'INGASP.FCFVTC', 'FLOPS': None, 'LEAPS1': None}, units='unitless', default_value=1.0, - desc='vertical tail aero calibration factor', + desc='vertical tail aero calibration factor (including technology factor INGASP.FCFVTT)', ) add_meta_data( @@ -2085,23 +2016,13 @@ desc='table of component wetted areas', ) -add_meta_data( - Aircraft.Design.Wing_AERO_TECH_FACTOR, - meta_data=_MetaData, - historical_name={'GASP': ['INGASP.FCFWT'], 'FLOPS': None, 'LEAPS1': None}, - units='unitless', - option=True, - default_value=1.0, - desc='wing aero technology factor', -) - add_meta_data( Aircraft.Design.Wing_DRAG_FACTOR, meta_data=_MetaData, - historical_name={'GASP': ['INGASP.FCFWC'], 'FLOPS': None, 'LEAPS1': None}, + historical_name={'GASP': 'INGASP.FCFWC', 'FLOPS': None, 'LEAPS1': None}, units='unitless', default_value=1.0, - desc='wing aero calibration factor', + desc='wing aero calibration factor (including technology factor INGASP.FCFWT)', ) add_meta_data( diff --git a/aviary/variable_info/variables.py b/aviary/variable_info/variables.py index 77ab832ea..7015dadb3 100644 --- a/aviary/variable_info/variables.py +++ b/aviary/variable_info/variables.py @@ -141,14 +141,10 @@ class Design: EXCRESCENCE_DRAG_FACTOR = 'aircraft:design:excrescence_drag_factor' EXTERNAL_SUBSYSTEMS_MASS = 'aircraft:design:external_subsystems_mass' FINENESS = 'aircraft:design:fineness' - Fuselage_AERO_TECH_FACTOR = 'aircraft:design:fuselage_aero_tech_factor' Fuselage_DRAG_FACTOR = 'aircraft:design:fuselage_drag_factor' GROSS_MASS = 'aircraft:design:gross_mass' - HorizontalTail_AERO_TECH_FACTOR = 'aircraft:design:horizontaltail_aero_tech_factor' HorizontalTail_DRAG_FACTOR = 'aircraft:design:horizontaltail_drag_factor' IJEFF = 'ijeff' - INDUCED_DRAG_FACTOR = 'aircraft:design:induced_drag_factor' - INTERFERENCE_AERO_TECH_FACTOR = 'aircraft:design:interference_aero_tech_factor' INTERFERENCE_DRAG_FACTOR = 'aircraft:design:interference_drag_factor' LAMINAR_FLOW_LOWER = 'aircraft:design:laminar_flow_lower' LAMINAR_FLOW_UPPER = 'aircraft:design:laminar_flow_upper' @@ -163,7 +159,6 @@ class Design: MACH = 'aircraft:design:mach' MAX_FUSELAGE_PITCH_ANGLE = 'aircraft:design:max_fuselage_pitch_angle' MAX_STRUCTURAL_SPEED = 'aircraft:design:max_structural_speed' - Nacelle_AERO_TECH_FACTOR = 'aircraft:design:nacelle_aero_tech_factor' Nacelle_DRAG_FACTOR = 'aircraft:design:nacelle_drag_factor' PART25_STRUCTURAL_CATEGORY = 'aircraft:design:part25_structural_category' PERCENT_EXCRESCENCE_DRAG = 'aircraft:design:percent_excrescence_drag' @@ -173,7 +168,6 @@ class Design: STATIC_MARGIN = 'aircraft:design:static_margin' STRUCTURAL_MASS_INCREMENT = 'aircraft:design:structural_mass_increment' STRUCTURE_MASS = 'aircraft:design:structure_mass' - STRUT_AERO_TECH_FACTOR = 'aircraft:design:strut_aero_tech_factor' STRUT_DRAG_FACTOR = 'aircraft:design:strut_drag_factor' SUBSONIC_DRAG_COEFF_FACTOR = 'aircraft:design:subsonic_drag_coeff_factor' SUPERSONIC_DRAG_COEFF_FACTOR = 'aircraft:design:supersonic_drag_coeff_factor' @@ -186,10 +180,8 @@ class Design: TYPE = 'aircraft:design:type' ULF_CALCULATED_FROM_MANEUVER = 'aircraft:design:ulf_calculated_from_maneuver' USE_ALT_MASS = 'aircraft:design:use_alt_mass' - VerticalTail_AERO_TECH_FACTOR = 'aircraft:design:verticaltail_aero_tech_factor' VerticalTail_DRAG_FACTOR = 'aircraft:design:verticaltail_drag_factor' WETTED_AREAS = 'aircraft:design:wetted_areas' - Wing_AERO_TECH_FACTOR = 'aircraft:design:wing_aero_tech_factor' Wing_DRAG_FACTOR = 'aircraft:design:wing_drag_factor' WING_LOADING = 'aircraft:design:wing_loading' ZERO_LIFT_DRAG_COEFF_FACTOR = 'aircraft:design:zero_lift_drag_coeff_factor' From 42552b306cb684d62ff95c345defffb34416d29e Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 21 Apr 2026 12:22:53 -0400 Subject: [PATCH 15/21] removed drag factors as options --- aviary/subsystems/aerodynamics/gasp_based/gaspaero.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py b/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py index 48f49683b..0524f9f97 100644 --- a/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py +++ b/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py @@ -742,16 +742,6 @@ def initialize(self): self.options.declare('num_nodes', default=1, types=int) add_aviary_option(self, Aircraft.Engine.NUM_ENGINES) add_aviary_option(self, Aircraft.Wing.HAS_STRUT) - # drag factors - add_aviary_option(self, Aircraft.Design.HorizontalTail_DRAG_FACTOR) - add_aviary_option(self, Aircraft.Design.INTERFERENCE_DRAG_FACTOR) - add_aviary_option(self, Aircraft.Design.Nacelle_DRAG_FACTOR) - add_aviary_option(self, Aircraft.Design.PYLON_DRAG_FACTOR) - add_aviary_option(self, Aircraft.Design.STRUT_DRAG_FACTOR) - add_aviary_option(self, Aircraft.Design.VerticalTail_DRAG_FACTOR) - add_aviary_option(self, Aircraft.Design.Wing_DRAG_FACTOR) - add_aviary_option(self, Aircraft.Design.EXCRESCENCE_DRAG_FACTOR) - add_aviary_option(self, Aircraft.Design.PERCENT_EXCRESCENCE_DRAG) def setup(self): nn = self.options['num_nodes'] From 6f8cf485ae8bb668e84597be27ce0663dd801fb2 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 21 Apr 2026 12:23:58 -0400 Subject: [PATCH 16/21] combined drag factors and technology factorsin fortran_to_aviary --- aviary/utils/fortran_to_aviary.py | 74 +++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/aviary/utils/fortran_to_aviary.py b/aviary/utils/fortran_to_aviary.py index 9803ffd78..c0f36e890 100644 --- a/aviary/utils/fortran_to_aviary.py +++ b/aviary/utils/fortran_to_aviary.py @@ -800,6 +800,80 @@ def update_gasp_options(vehicle_data, verbosity=Verbosity.BRIEF): except: pass + # Friction factors (combine drag factor and technology factor into one factor) + round_position = 6 + if Aircraft.Design.Fuselage_DRAG_FACTOR in input_values: + drag_scaler = input_values.get_val(Aircraft.Design.Fuselage_DRAG_FACTOR, 'unitless')[0] + try: + tech_factor = unused_values.get_item('INGASP.FCFFT')[0][0] + unused_values.delete('INGASP.FCFFT') + except: + tech_factor = 1.0 + drag_scaler = round(drag_scaler * tech_factor, round_position) + input_values.set_val(Aircraft.Design.Fuselage_DRAG_FACTOR, [drag_scaler], 'unitless') + + if Aircraft.Design.HorizontalTail_DRAG_FACTOR in input_values: + drag_scaler = input_values.get_val(Aircraft.Design.HorizontalTail_DRAG_FACTOR, 'unitless')[ + 0 + ] + try: + tech_factor = unused_values.get_item('INGASP.FCFHTT')[0][0] + unused_values.delete('INGASP.FCFHTT') + except: + tech_factor = 1.0 + drag_scaler = round(drag_scaler * tech_factor, round_position) + input_values.set_val(Aircraft.Design.HorizontalTail_DRAG_FACTOR, [drag_scaler], 'unitless') + + if Aircraft.Design.INTERFERENCE_DRAG_FACTOR in input_values: + drag_scaler = input_values.get_val(Aircraft.Design.INTERFERENCE_DRAG_FACTOR, 'unitless')[0] + try: + tech_factor = unused_values.get_item('INGASP.FCKIT')[0][0] + unused_values.delete('INGASP.FCKIT') + except: + tech_factor = 1.0 + drag_scaler = round(drag_scaler * tech_factor, round_position) + input_values.set_val(Aircraft.Design.INTERFERENCE_DRAG_FACTOR, [drag_scaler], 'unitless') + + if Aircraft.Design.Nacelle_DRAG_FACTOR in input_values: + drag_scaler = input_values.get_val(Aircraft.Design.Nacelle_DRAG_FACTOR, 'unitless')[0] + try: + tech_factor = unused_values.get_item('INGASP.FCFNT')[0][0] + unused_values.delete('INGASP.FCFNT') + except: + tech_factor = 1.0 + drag_scaler = round(drag_scaler * tech_factor, round_position) + input_values.set_val(Aircraft.Design.Nacelle_DRAG_FACTOR, [drag_scaler], 'unitless') + + if Aircraft.Design.STRUT_DRAG_FACTOR in input_values: + drag_scaler = input_values.get_val(Aircraft.Design.STRUT_DRAG_FACTOR, 'unitless')[0] + try: + tech_factor = unused_values.get_item('INGASP.FCFVTT')[0][0] + unused_values.delete('INGASP.FCFVTT') + except: + tech_factor = 1.0 + drag_scaler = round(drag_scaler * tech_factor, round_position) + input_values.set_val(Aircraft.Design.STRUT_DRAG_FACTOR, [drag_scaler], 'unitless') + + if Aircraft.Design.VerticalTail_DRAG_FACTOR in input_values: + drag_scaler = input_values.get_val(Aircraft.Design.VerticalTail_DRAG_FACTOR, 'unitless')[0] + try: + tech_factor = unused_values.get_item('INGASP.FCFVTT')[0][0] + unused_values.delete('INGASP.FCFVTT') + except: + tech_factor = 1.0 + drag_scaler = round(drag_scaler * tech_factor, round_position) + input_values.set_val(Aircraft.Design.VerticalTail_DRAG_FACTOR, [drag_scaler], 'unitless') + + if Aircraft.Design.Wing_DRAG_FACTOR in input_values: + drag_scaler = input_values.get_val(Aircraft.Design.Wing_DRAG_FACTOR, 'unitless')[0] + try: + tech_factor = unused_values.get_item('INGASP.FCFWT')[0][0] + unused_values.delete('INGASP.FCFWT') + except: + tech_factor = 1.0 + drag_scaler = round(drag_scaler * tech_factor, round_position) + input_values.set_val(Aircraft.Design.Wing_DRAG_FACTOR, [drag_scaler], 'unitless') + # Variables required by GASP, but no default values are provided in GASP missing_vars = [] if Aircraft.Wing.ZERO_LIFT_ANGLE not in input_values: From 980c8f58f249ce15d54d31e1d3aac12e396ec6f4 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 21 Apr 2026 12:25:34 -0400 Subject: [PATCH 17/21] update data for change in fortran_to_aviary --- aviary/utils/test/data/converter_test_BWB_GASP.csv | 1 - 1 file changed, 1 deletion(-) diff --git a/aviary/utils/test/data/converter_test_BWB_GASP.csv b/aviary/utils/test/data/converter_test_BWB_GASP.csv index d2b6f55cd..ce8320102 100644 --- a/aviary/utils/test/data/converter_test_BWB_GASP.csv +++ b/aviary/utils/test/data/converter_test_BWB_GASP.csv @@ -44,7 +44,6 @@ aircraft:design:pylon_drag_factor,1.15,unitless aircraft:design:range,3500.0,NM aircraft:design:static_margin,0.05,unitless aircraft:design:structural_mass_increment,0.0,lbm -aircraft:design:strut_drag_factor,0.8334,unitless aircraft:design:type,BWB,unitless aircraft:design:verticaltail_drag_factor,0.8334,unitless aircraft:design:wing_drag_factor,0.838956,unitless From 044249380c5f384c8fe0644336127581ef547a10 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 21 Apr 2026 12:26:03 -0400 Subject: [PATCH 18/21] fixed a typo --- aviary/variable_info/variable_meta_data.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index 5f01fedf9..add9aae21 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -1494,7 +1494,7 @@ historical_name={'GASP': 'INGASP.FCFFC', 'FLOPS': None, 'LEAPS1': None}, units='unitless', default_value=1.0, - desc='fuselage aero calibration factor (include technology factor INGASP.FCFFT)', + desc='fuselage aero calibration factor (including technology factor INGASP.FCFFT)', ) add_meta_data( @@ -1817,10 +1817,10 @@ add_meta_data( Aircraft.Design.STRUT_DRAG_FACTOR, meta_data=_MetaData, - historical_name={'GASP': 'INGASP.FCFVTC', 'FLOPS': None, 'LEAPS1': None}, + historical_name={'GASP': 'INGASP.FCFSTRC', 'FLOPS': None, 'LEAPS1': None}, units='unitless', default_value=1.0, - desc='strut aero calibration factor (including technology factor INGASP.FCFVTT)', + desc='strut aero calibration factor (including technology factor INGASP.FCFSTRT)', ) add_meta_data( From 99bcaf4374e453e7530ddae786a8656558ae2fd0 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 21 Apr 2026 13:34:47 -0400 Subject: [PATCH 19/21] changes based on Jason's request --- .../aerodynamics/gasp_based/gaspaero.py | 14 +- aviary/utils/fortran_to_aviary.py | 42 +++--- .../test/data/converter_test_BWB_GASP.csv | 12 +- aviary/variable_info/variable_meta_data.py | 126 +++++++++--------- aviary/variable_info/variables.py | 14 +- 5 files changed, 103 insertions(+), 105 deletions(-) diff --git a/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py b/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py index 0524f9f97..d2b67be67 100644 --- a/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py +++ b/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py @@ -836,14 +836,14 @@ def setup(self): ) # drag factors - add_aviary_input(self, Aircraft.Design.Fuselage_DRAG_FACTOR) - add_aviary_input(self, Aircraft.Design.HorizontalTail_DRAG_FACTOR) + add_aviary_input(self, Aircraft.Fuselage.DRAG_FACTOR) + add_aviary_input(self, Aircraft.HorizontalTail.DRAG_FACTOR) add_aviary_input(self, Aircraft.Design.INTERFERENCE_DRAG_FACTOR) - add_aviary_input(self, Aircraft.Design.Nacelle_DRAG_FACTOR) - add_aviary_input(self, Aircraft.Design.PYLON_DRAG_FACTOR) - add_aviary_input(self, Aircraft.Design.STRUT_DRAG_FACTOR) - add_aviary_input(self, Aircraft.Design.VerticalTail_DRAG_FACTOR) - add_aviary_input(self, Aircraft.Design.Wing_DRAG_FACTOR) + add_aviary_input(self, Aircraft.Nacelle.DRAG_FACTOR) + add_aviary_input(self, Aircraft.Nacelle.PYLON_DRAG_FACTOR) + add_aviary_input(self, Aircraft.Strut.DRAG_FACTOR) + add_aviary_input(self, Aircraft.VerticalTail.DRAG_FACTOR) + add_aviary_input(self, Aircraft.Wing.DRAG_FACTOR) add_aviary_input(self, Aircraft.Design.EXCRESCENCE_DRAG_FACTOR) add_aviary_input(self, Aircraft.Design.PERCENT_EXCRESCENCE_DRAG) diff --git a/aviary/utils/fortran_to_aviary.py b/aviary/utils/fortran_to_aviary.py index c0f36e890..4209f65b5 100644 --- a/aviary/utils/fortran_to_aviary.py +++ b/aviary/utils/fortran_to_aviary.py @@ -802,27 +802,25 @@ def update_gasp_options(vehicle_data, verbosity=Verbosity.BRIEF): # Friction factors (combine drag factor and technology factor into one factor) round_position = 6 - if Aircraft.Design.Fuselage_DRAG_FACTOR in input_values: - drag_scaler = input_values.get_val(Aircraft.Design.Fuselage_DRAG_FACTOR, 'unitless')[0] + if Aircraft.Fuselage.DRAG_FACTOR in input_values: + drag_scaler = input_values.get_val(Aircraft.Fuselage.DRAG_FACTOR, 'unitless')[0] try: tech_factor = unused_values.get_item('INGASP.FCFFT')[0][0] unused_values.delete('INGASP.FCFFT') except: tech_factor = 1.0 drag_scaler = round(drag_scaler * tech_factor, round_position) - input_values.set_val(Aircraft.Design.Fuselage_DRAG_FACTOR, [drag_scaler], 'unitless') + input_values.set_val(Aircraft.Fuselage.DRAG_FACTOR, [drag_scaler], 'unitless') - if Aircraft.Design.HorizontalTail_DRAG_FACTOR in input_values: - drag_scaler = input_values.get_val(Aircraft.Design.HorizontalTail_DRAG_FACTOR, 'unitless')[ - 0 - ] + if Aircraft.HorizontalTail.DRAG_FACTOR in input_values: + drag_scaler = input_values.get_val(Aircraft.HorizontalTail.DRAG_FACTOR, 'unitless')[0] try: tech_factor = unused_values.get_item('INGASP.FCFHTT')[0][0] unused_values.delete('INGASP.FCFHTT') except: tech_factor = 1.0 drag_scaler = round(drag_scaler * tech_factor, round_position) - input_values.set_val(Aircraft.Design.HorizontalTail_DRAG_FACTOR, [drag_scaler], 'unitless') + input_values.set_val(Aircraft.HorizontalTail.DRAG_FACTOR, [drag_scaler], 'unitless') if Aircraft.Design.INTERFERENCE_DRAG_FACTOR in input_values: drag_scaler = input_values.get_val(Aircraft.Design.INTERFERENCE_DRAG_FACTOR, 'unitless')[0] @@ -834,45 +832,45 @@ def update_gasp_options(vehicle_data, verbosity=Verbosity.BRIEF): drag_scaler = round(drag_scaler * tech_factor, round_position) input_values.set_val(Aircraft.Design.INTERFERENCE_DRAG_FACTOR, [drag_scaler], 'unitless') - if Aircraft.Design.Nacelle_DRAG_FACTOR in input_values: - drag_scaler = input_values.get_val(Aircraft.Design.Nacelle_DRAG_FACTOR, 'unitless')[0] + if Aircraft.Nacelle.DRAG_FACTOR in input_values: + drag_scaler = input_values.get_val(Aircraft.Nacelle.DRAG_FACTOR, 'unitless')[0] try: tech_factor = unused_values.get_item('INGASP.FCFNT')[0][0] unused_values.delete('INGASP.FCFNT') except: tech_factor = 1.0 drag_scaler = round(drag_scaler * tech_factor, round_position) - input_values.set_val(Aircraft.Design.Nacelle_DRAG_FACTOR, [drag_scaler], 'unitless') + input_values.set_val(Aircraft.Nacelle.DRAG_FACTOR, [drag_scaler], 'unitless') - if Aircraft.Design.STRUT_DRAG_FACTOR in input_values: - drag_scaler = input_values.get_val(Aircraft.Design.STRUT_DRAG_FACTOR, 'unitless')[0] + if Aircraft.Strut.DRAG_FACTOR in input_values: + drag_scaler = input_values.get_val(Aircraft.Strut.DRAG_FACTOR, 'unitless')[0] try: - tech_factor = unused_values.get_item('INGASP.FCFVTT')[0][0] - unused_values.delete('INGASP.FCFVTT') + tech_factor = unused_values.get_item('INGASP.FCFSTRT')[0][0] + unused_values.delete('INGASP.FCFSTRT') except: tech_factor = 1.0 drag_scaler = round(drag_scaler * tech_factor, round_position) - input_values.set_val(Aircraft.Design.STRUT_DRAG_FACTOR, [drag_scaler], 'unitless') + input_values.set_val(Aircraft.Strut.DRAG_FACTOR, [drag_scaler], 'unitless') - if Aircraft.Design.VerticalTail_DRAG_FACTOR in input_values: - drag_scaler = input_values.get_val(Aircraft.Design.VerticalTail_DRAG_FACTOR, 'unitless')[0] + if Aircraft.VerticalTail.DRAG_FACTOR in input_values: + drag_scaler = input_values.get_val(Aircraft.VerticalTail.DRAG_FACTOR, 'unitless')[0] try: tech_factor = unused_values.get_item('INGASP.FCFVTT')[0][0] unused_values.delete('INGASP.FCFVTT') except: tech_factor = 1.0 drag_scaler = round(drag_scaler * tech_factor, round_position) - input_values.set_val(Aircraft.Design.VerticalTail_DRAG_FACTOR, [drag_scaler], 'unitless') + input_values.set_val(Aircraft.VerticalTail.DRAG_FACTOR, [drag_scaler], 'unitless') - if Aircraft.Design.Wing_DRAG_FACTOR in input_values: - drag_scaler = input_values.get_val(Aircraft.Design.Wing_DRAG_FACTOR, 'unitless')[0] + if Aircraft.Wing.DRAG_FACTOR in input_values: + drag_scaler = input_values.get_val(Aircraft.Wing.DRAG_FACTOR, 'unitless')[0] try: tech_factor = unused_values.get_item('INGASP.FCFWT')[0][0] unused_values.delete('INGASP.FCFWT') except: tech_factor = 1.0 drag_scaler = round(drag_scaler * tech_factor, round_position) - input_values.set_val(Aircraft.Design.Wing_DRAG_FACTOR, [drag_scaler], 'unitless') + input_values.set_val(Aircraft.Wing.DRAG_FACTOR, [drag_scaler], 'unitless') # Variables required by GASP, but no default values are provided in GASP missing_vars = [] diff --git a/aviary/utils/test/data/converter_test_BWB_GASP.csv b/aviary/utils/test/data/converter_test_BWB_GASP.csv index ce8320102..321f70de0 100644 --- a/aviary/utils/test/data/converter_test_BWB_GASP.csv +++ b/aviary/utils/test/data/converter_test_BWB_GASP.csv @@ -31,22 +31,16 @@ aircraft:design:drag_coefficient_increment,0.00025,unitless aircraft:design:drag_divergence_shift,0.025,unitless aircraft:design:emergency_equipment_mass,100.0,lbm aircraft:design:excrescence_drag_factor,0.8,unitless -aircraft:design:fuselage_drag_factor,0.82305,unitless aircraft:design:gross_mass,150000.0,lbm -aircraft:design:horizontaltail_drag_factor,0.6945,unitless aircraft:design:interference_drag_factor,1.0,unitless aircraft:design:lift_dependent_drag_coeff_factor,0.85,unitless aircraft:design:mach,0.8,unitless aircraft:design:max_structural_speed,402.5,mi/h -aircraft:design:nacelle_drag_factor,1.0925,unitless aircraft:design:part25_structural_category,3.0,unitless -aircraft:design:pylon_drag_factor,1.15,unitless aircraft:design:range,3500.0,NM aircraft:design:static_margin,0.05,unitless aircraft:design:structural_mass_increment,0.0,lbm aircraft:design:type,BWB,unitless -aircraft:design:verticaltail_drag_factor,0.8334,unitless -aircraft:design:wing_drag_factor,0.838956,unitless aircraft:design:wing_loading,70.0,lbf/ft**2 aircraft:electrical:system_mass_per_passenger,11.45,lbm aircraft:engine:additional_mass_fraction,0.04373,unitless @@ -71,6 +65,7 @@ aircraft:furnishings:mass_scaler,40.0,lbm aircraft:fuselage:aftbody_mass_per_unit_area,5.0,lbm/ft**2 aircraft:fuselage:aisle_width,22.0,inch aircraft:fuselage:delta_diameter,5.0,ft +aircraft:fuselage:drag_factor,0.82305,unitless aircraft:fuselage:flat_plate_area_increment,0.25,ft**2 aircraft:fuselage:height_to_width_ratio,0.2597,unitless aircraft:fuselage:lift_coefficient_ratio_body_to_wing,0.35,unitless @@ -86,6 +81,7 @@ aircraft:fuselage:tail_fineness,1.75,unitless aircraft:fuselage:wetted_area_ratio_aftbody_to_total,0.2,unitless aircraft:fuselage:wetted_area_scaler,1.0001,unitless aircraft:horizontal_tail:aspect_ratio,1.705,unitless +aircraft:horizontal_tail:drag_factor,0.6945,unitless aircraft:horizontal_tail:mass_coefficient,0.124,unitless aircraft:horizontal_tail:moment_ratio,0.5463,unitless aircraft:horizontal_tail:sweep,45.0,deg @@ -104,10 +100,12 @@ aircraft:landing_gear:tail_hook_mass_scaler,1.0,unitless aircraft:landing_gear:total_mass_scaler,1.0,unitless aircraft:nacelle:clearance_ratio,0.2,unitless aircraft:nacelle:core_diameter_ratio,1.2205,unitless +aircraft:nacelle:drag_factor,1.0925,unitless aircraft:nacelle:fineness,1.3588,unitless aircraft:nacelle:form_factor,1.2,unitless aircraft:nacelle:mass_specific,2.5,lbm/ft**2 aircraft:nacelle:percent_diam_buried_in_fuselage,0.0,unitless +aircraft:nacelle:pylon_drag_factor,1.15,unitless aircraft:strut:area_ratio,0.0,unitless aircraft:strut:attachment_location,0.0,ft aircraft:strut:attachment_location_dimensionless,0.0,unitless @@ -116,6 +114,7 @@ aircraft:strut:fuselage_interference_factor,1.0,unitless aircraft:strut:mass_coefficient,0.0,unitless aircraft:strut:thickness_to_chord,0.0,unitless aircraft:vertical_tail:aspect_ratio,1.705,unitless +aircraft:vertical_tail:drag_factor,0.8334,unitless aircraft:vertical_tail:mass_coefficient,0.119,unitless aircraft:vertical_tail:moment_ratio,5.2615,unitless aircraft:vertical_tail:sweep,35.0,deg @@ -125,6 +124,7 @@ aircraft:vertical_tail:volume_coefficient,0.015,unitless aircraft:wing:aspect_ratio,10.0,unitless aircraft:wing:center_distance,0.463,unitless aircraft:wing:choose_fold_location,True,unitless +aircraft:wing:drag_factor,0.838956,unitless aircraft:wing:flap_chord_ratio,0.2,unitless aircraft:wing:flap_deflection_landing,25.0,deg aircraft:wing:flap_deflection_takeoff,15.0,deg diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index add9aae21..0de85c88d 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -1488,15 +1488,6 @@ default_value=0.0, ) -add_meta_data( - Aircraft.Design.Fuselage_DRAG_FACTOR, - meta_data=_MetaData, - historical_name={'GASP': 'INGASP.FCFFC', 'FLOPS': None, 'LEAPS1': None}, - units='unitless', - default_value=1.0, - desc='fuselage aero calibration factor (including technology factor INGASP.FCFFT)', -) - add_meta_data( Aircraft.Design.GROSS_MASS, meta_data=_MetaData, @@ -1519,15 +1510,6 @@ default_value=0.0, ) -add_meta_data( - Aircraft.Design.HorizontalTail_DRAG_FACTOR, - meta_data=_MetaData, - historical_name={'GASP': 'INGASP.FCFHTC', 'FLOPS': None, 'LEAPS1': None}, - units='unitless', - default_value=1.0, - desc='horizontal tail aero calibration factor (including technology factor INGASP.FCFHTT)', -) - add_meta_data( Aircraft.Design.IJEFF, meta_data=_MetaData, @@ -1714,15 +1696,6 @@ default_value=0, ) -add_meta_data( - Aircraft.Design.Nacelle_DRAG_FACTOR, - meta_data=_MetaData, - historical_name={'GASP': 'INGASP.FCFNC', 'FLOPS': None, 'LEAPS1': None}, - units='unitless', - default_value=1.0, - desc='nacelle aero calibration factor (including technology factor INGASP.FCFNT)', -) - add_meta_data( Aircraft.Design.PART25_STRUCTURAL_CATEGORY, meta_data=_MetaData, @@ -1744,15 +1717,6 @@ desc='percentage of excrescence drag as of fuselage, wing, nacelle, (winglet), empennage and strut', ) -add_meta_data( - Aircraft.Design.PYLON_DRAG_FACTOR, - meta_data=_MetaData, - historical_name={'GASP': 'INGASP.FPYLND', 'FLOPS': None, 'LEAPS1': None}, - units='unitless', - default_value=1.0, - desc='pylon aero calibration factor', -) - add_meta_data( Aircraft.Design.RANGE, meta_data=_MetaData, @@ -1814,15 +1778,6 @@ default_value=0.0, ) -add_meta_data( - Aircraft.Design.STRUT_DRAG_FACTOR, - meta_data=_MetaData, - historical_name={'GASP': 'INGASP.FCFSTRC', 'FLOPS': None, 'LEAPS1': None}, - units='unitless', - default_value=1.0, - desc='strut aero calibration factor (including technology factor INGASP.FCFSTRT)', -) - add_meta_data( Aircraft.Design.SUBSONIC_DRAG_COEFF_FACTOR, meta_data=_MetaData, @@ -1992,15 +1947,6 @@ default_value=False, ) -add_meta_data( - Aircraft.Design.VerticalTail_DRAG_FACTOR, - meta_data=_MetaData, - historical_name={'GASP': 'INGASP.FCFVTC', 'FLOPS': None, 'LEAPS1': None}, - units='unitless', - default_value=1.0, - desc='vertical tail aero calibration factor (including technology factor INGASP.FCFVTT)', -) - add_meta_data( Aircraft.Design.WETTED_AREAS, meta_data=_MetaData, @@ -2016,15 +1962,6 @@ desc='table of component wetted areas', ) -add_meta_data( - Aircraft.Design.Wing_DRAG_FACTOR, - meta_data=_MetaData, - historical_name={'GASP': 'INGASP.FCFWC', 'FLOPS': None, 'LEAPS1': None}, - units='unitless', - default_value=1.0, - desc='wing aero calibration factor (including technology factor INGASP.FCFWT)', -) - add_meta_data( Aircraft.Design.WING_LOADING, meta_data=_MetaData, @@ -3565,6 +3502,15 @@ default_value=0.0, ) +add_meta_data( + Aircraft.Fuselage.DRAG_FACTOR, + meta_data=_MetaData, + historical_name={'GASP': 'INGASP.FCFFC', 'FLOPS': None, 'LEAPS1': None}, + units='unitless', + default_value=1.0, + desc='fuselage aero calibration factor (including technology factor INGASP.FCFFT)', +) + add_meta_data( Aircraft.Fuselage.FINENESS, meta_data=_MetaData, @@ -4053,6 +3999,15 @@ default_value=0.0, ) +add_meta_data( + Aircraft.HorizontalTail.DRAG_FACTOR, + meta_data=_MetaData, + historical_name={'GASP': 'INGASP.FCFHTC', 'FLOPS': None, 'LEAPS1': None}, + units='unitless', + default_value=1.0, + desc='horizontal tail aero calibration factor (including technology factor INGASP.FCFHTT)', +) + add_meta_data( Aircraft.HorizontalTail.FINENESS, meta_data=_MetaData, @@ -4670,6 +4625,15 @@ multivalue=True, ) +add_meta_data( + Aircraft.Nacelle.DRAG_FACTOR, + meta_data=_MetaData, + historical_name={'GASP': 'INGASP.FCFNC', 'FLOPS': None, 'LEAPS1': None}, + units='unitless', + default_value=1.0, + desc='nacelle aero calibration factor (including technology factor INGASP.FCFNT)', +) + add_meta_data( Aircraft.Nacelle.FINENESS, meta_data=_MetaData, @@ -4779,6 +4743,15 @@ multivalue=True, ) +add_meta_data( + Aircraft.Nacelle.PYLON_DRAG_FACTOR, + meta_data=_MetaData, + historical_name={'GASP': 'INGASP.FPYLND', 'FLOPS': None, 'LEAPS1': None}, + units='unitless', + default_value=1.0, + desc='pylon aero calibration factor', +) + add_meta_data( Aircraft.Nacelle.SURFACE_AREA, meta_data=_MetaData, @@ -5169,6 +5142,15 @@ 'it is given non-dimensionally. In GASP this depended on STRUT', ) +add_meta_data( + Aircraft.Strut.DRAG_FACTOR, + meta_data=_MetaData, + historical_name={'GASP': 'INGASP.FCFSTRC', 'FLOPS': None, 'LEAPS1': None}, + units='unitless', + default_value=1.0, + desc='strut aero calibration factor (including technology factor INGASP.FCFSTRT)', +) + add_meta_data( Aircraft.Strut.FUSELAGE_INTERFERENCE_FACTOR, meta_data=_MetaData, @@ -5301,6 +5283,15 @@ default_value=0.0, ) +add_meta_data( + Aircraft.VerticalTail.DRAG_FACTOR, + meta_data=_MetaData, + historical_name={'GASP': 'INGASP.FCFVTC', 'FLOPS': None, 'LEAPS1': None}, + units='unitless', + default_value=1.0, + desc='vertical tail aero calibration factor (including technology factor INGASP.FCFVTT)', +) + add_meta_data( Aircraft.VerticalTail.FINENESS, meta_data=_MetaData, @@ -5862,6 +5853,15 @@ default_value=0.0, ) +add_meta_data( + Aircraft.Wing.DRAG_FACTOR, + meta_data=_MetaData, + historical_name={'GASP': 'INGASP.FCFWC', 'FLOPS': None, 'LEAPS1': None}, + units='unitless', + default_value=1.0, + desc='wing aero calibration factor (including technology factor INGASP.FCFWT)', +) + add_meta_data( Aircraft.Wing.ENG_POD_INERTIA_FACTOR, meta_data=_MetaData, diff --git a/aviary/variable_info/variables.py b/aviary/variable_info/variables.py index 7015dadb3..23c4fa210 100644 --- a/aviary/variable_info/variables.py +++ b/aviary/variable_info/variables.py @@ -141,9 +141,7 @@ class Design: EXCRESCENCE_DRAG_FACTOR = 'aircraft:design:excrescence_drag_factor' EXTERNAL_SUBSYSTEMS_MASS = 'aircraft:design:external_subsystems_mass' FINENESS = 'aircraft:design:fineness' - Fuselage_DRAG_FACTOR = 'aircraft:design:fuselage_drag_factor' GROSS_MASS = 'aircraft:design:gross_mass' - HorizontalTail_DRAG_FACTOR = 'aircraft:design:horizontaltail_drag_factor' IJEFF = 'ijeff' INTERFERENCE_DRAG_FACTOR = 'aircraft:design:interference_drag_factor' LAMINAR_FLOW_LOWER = 'aircraft:design:laminar_flow_lower' @@ -159,16 +157,13 @@ class Design: MACH = 'aircraft:design:mach' MAX_FUSELAGE_PITCH_ANGLE = 'aircraft:design:max_fuselage_pitch_angle' MAX_STRUCTURAL_SPEED = 'aircraft:design:max_structural_speed' - Nacelle_DRAG_FACTOR = 'aircraft:design:nacelle_drag_factor' PART25_STRUCTURAL_CATEGORY = 'aircraft:design:part25_structural_category' PERCENT_EXCRESCENCE_DRAG = 'aircraft:design:percent_excrescence_drag' - PYLON_DRAG_FACTOR = 'aircraft:design:pylon_drag_factor' RANGE = 'aircraft:design:range' SMOOTH_MASS_DISCONTINUITIES = 'aircraft:design:smooth_mass_discontinuities' STATIC_MARGIN = 'aircraft:design:static_margin' STRUCTURAL_MASS_INCREMENT = 'aircraft:design:structural_mass_increment' STRUCTURE_MASS = 'aircraft:design:structure_mass' - STRUT_DRAG_FACTOR = 'aircraft:design:strut_drag_factor' SUBSONIC_DRAG_COEFF_FACTOR = 'aircraft:design:subsonic_drag_coeff_factor' SUPERSONIC_DRAG_COEFF_FACTOR = 'aircraft:design:supersonic_drag_coeff_factor' SYSTEMS_AND_EQUIPMENT_MASS = 'aircraft:design:systems_and_equipment_mass' @@ -180,9 +175,7 @@ class Design: TYPE = 'aircraft:design:type' ULF_CALCULATED_FROM_MANEUVER = 'aircraft:design:ulf_calculated_from_maneuver' USE_ALT_MASS = 'aircraft:design:use_alt_mass' - VerticalTail_DRAG_FACTOR = 'aircraft:design:verticaltail_drag_factor' WETTED_AREAS = 'aircraft:design:wetted_areas' - Wing_DRAG_FACTOR = 'aircraft:design:wing_drag_factor' WING_LOADING = 'aircraft:design:wing_loading' ZERO_LIFT_DRAG_COEFF_FACTOR = 'aircraft:design:zero_lift_drag_coeff_factor' @@ -308,6 +301,7 @@ class Fuselage: CROSS_SECTION = 'aircraft:fuselage:cross_section' DELTA_DIAMETER = 'aircraft:fuselage:delta_diameter' DIAMETER_TO_WING_SPAN = 'aircraft:fuselage:diameter_to_wing_span' + DRAG_FACTOR = 'aircraft:fuselage:drag_factor' FINENESS = 'aircraft:fuselage:fineness' FLAT_PLATE_AREA_INCREMENT = 'aircraft:fuselage:flat_plate_area_increment' FOREBODY_MASS = 'aircraft:fuselage:forebody_mass' @@ -349,6 +343,7 @@ class HorizontalTail: ASPECT_RATIO = 'aircraft:horizontal_tail:aspect_ratio' AVERAGE_CHORD = 'aircraft:horizontal_tail:average_chord' CHARACTERISTIC_LENGTH = 'aircraft:horizontal_tail:characteristic_length' + DRAG_FACTOR = 'aircraft:horizontal_tail:drag_factor' FINENESS = 'aircraft:horizontal_tail:fineness' FORM_FACTOR = 'aircraft:horizontal_tail:form_factor' LAMINAR_FLOW_LOWER = 'aircraft:horizontal_tail:laminar_flow_lower' @@ -403,6 +398,7 @@ class Nacelle: CHARACTERISTIC_LENGTH = 'aircraft:nacelle:characteristic_length' CLEARANCE_RATIO = 'aircraft:nacelle:clearance_ratio' CORE_DIAMETER_RATIO = 'aircraft:nacelle:core_diameter_ratio' + DRAG_FACTOR = 'aircraft:nacelle:drag_factor' FINENESS = 'aircraft:nacelle:fineness' FORM_FACTOR = 'aircraft:nacelle:form_factor' LAMINAR_FLOW_LOWER = 'aircraft:nacelle:laminar_flow_lower' @@ -411,6 +407,7 @@ class Nacelle: MASS_SCALER = 'aircraft:nacelle:mass_scaler' MASS_SPECIFIC = 'aircraft:nacelle:mass_specific' PERCENT_DIAM_BURIED_IN_FUSELAGE = 'aircraft:nacelle:percent_diam_buried_in_fuselage' + PYLON_DRAG_FACTOR = 'aircraft:nacelle:pylon_drag_factor' SURFACE_AREA = 'aircraft:nacelle:surface_area' TOTAL_WETTED_AREA = 'aircraft:nacelle:total_wetted_area' WETTED_AREA = 'aircraft:nacelle:wetted_area' @@ -449,6 +446,7 @@ class Strut: ATTACHMENT_LOCATION_DIMENSIONLESS = 'aircraft:strut:attachment_location_dimensionless' CHORD = 'aircraft:strut:chord' DIMENSIONAL_LOCATION_SPECIFIED = 'aircraft:strut:dimensional_location_specified' + DRAG_FACTOR = 'aircraft:strut:drag_factor' FUSELAGE_INTERFERENCE_FACTOR = 'aircraft:strut:fuselage_interference_factor' LENGTH = 'aircraft:strut:length' MASS = 'aircraft:strut:mass' @@ -463,6 +461,7 @@ class VerticalTail: ASPECT_RATIO = 'aircraft:vertical_tail:aspect_ratio' AVERAGE_CHORD = 'aircraft:vertical_tail:average_chord' CHARACTERISTIC_LENGTH = 'aircraft:vertical_tail:characteristic_length' + DRAG_FACTOR = 'aircraft:vertical_tail:drag_factor' FINENESS = 'aircraft:vertical_tail:fineness' FORM_FACTOR = 'aircraft:vertical_tail:form_factor' LAMINAR_FLOW_LOWER = 'aircraft:vertical_tail:laminar_flow_lower' @@ -506,6 +505,7 @@ class Wing: CONTROL_SURFACE_AREA_RATIO = 'aircraft:wing:control_surface_area_ratio' DETAILED_WING = 'aircraft:wing:detailed_wing' DIHEDRAL = 'aircraft:wing:dihedral' + DRAG_FACTOR = 'aircraft:wing:drag_factor' ENG_POD_INERTIA_FACTOR = 'aircraft:wing:eng_pod_inertia_factor' EXPOSED_AREA = 'aircraft:wing:exposed_area' FINENESS = 'aircraft:wing:fineness' From d5bf2db51f870be599f971fe14df548bec9ad84b Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 21 Apr 2026 13:55:11 -0400 Subject: [PATCH 20/21] minor updates --- .../test/data/converter_test_large_single_aisle_1_GASP.csv | 2 +- aviary/variable_info/variable_meta_data.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/aviary/utils/test/data/converter_test_large_single_aisle_1_GASP.csv b/aviary/utils/test/data/converter_test_large_single_aisle_1_GASP.csv index a41ed8c4f..0f42ad7bf 100644 --- a/aviary/utils/test/data/converter_test_large_single_aisle_1_GASP.csv +++ b/aviary/utils/test/data/converter_test_large_single_aisle_1_GASP.csv @@ -30,7 +30,6 @@ aircraft:design:gross_mass,175400.0,lbm aircraft:design:mach,0.8,unitless aircraft:design:max_structural_speed,402.5,mi/h aircraft:design:part25_structural_category,3.0,unitless -aircraft:design:pylon_drag_factor,1.0,unitless aircraft:design:range,3675.0,NM aircraft:design:static_margin,0.03,unitless aircraft:design:structural_mass_increment,0.0,lbm @@ -91,6 +90,7 @@ aircraft:nacelle:core_diameter_ratio,1.25,unitless aircraft:nacelle:fineness,2.0,unitless aircraft:nacelle:form_factor,1.5,unitless aircraft:nacelle:mass_specific,3.0,lbm/ft**2 +aircraft:nacelle:pylon_drag_factor,1.0,unitless aircraft:strut:area_ratio,0.0,unitless aircraft:strut:attachment_location,0.0,ft aircraft:strut:attachment_location_dimensionless,0.0,unitless diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index 0de85c88d..de8ca804f 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -1714,7 +1714,7 @@ units='unitless', option=True, default_value=0.0, - desc='percentage of excrescence drag as of fuselage, wing, nacelle, (winglet), empennage and strut', + desc='excrescence drag as percentage of fuselage, wing, nacelle, (winglet), empennage and strut', ) add_meta_data( From 454624c55ad0a86c67caf749105564ca78e317fc Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 21 Apr 2026 14:36:21 -0400 Subject: [PATCH 21/21] added drag factors to setup_partials() in AeroGeom --- .../subsystems/aerodynamics/gasp_based/gaspaero.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py b/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py index d2b67be67..4f8a6a953 100644 --- a/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py +++ b/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py @@ -967,6 +967,19 @@ def setup_partials(self): 'drag_loss_due_to_shielded_wing_area', ] self.declare_partials('SA5', most_params, method='cs') + drag_factors = [ + Aircraft.Fuselage.DRAG_FACTOR, + Aircraft.HorizontalTail.DRAG_FACTOR, + Aircraft.Design.INTERFERENCE_DRAG_FACTOR, + Aircraft.Nacelle.DRAG_FACTOR, + Aircraft.Nacelle.PYLON_DRAG_FACTOR, + Aircraft.Strut.DRAG_FACTOR, + Aircraft.VerticalTail.DRAG_FACTOR, + Aircraft.Wing.DRAG_FACTOR, + Aircraft.Design.EXCRESCENCE_DRAG_FACTOR, + Aircraft.Design.PERCENT_EXCRESCENCE_DRAG, + ] + self.declare_partials('SA5', drag_factors, method='cs') self.declare_partials( 'SA6', [Aircraft.Wing.FORM_FACTOR, Aircraft.Wing.AVERAGE_CHORD], method='cs' )