diff --git a/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py b/aviary/subsystems/aerodynamics/gasp_based/gaspaero.py index 5c03c381a..48f49683b 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 @@ -740,6 +742,16 @@ 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'] @@ -833,6 +845,18 @@ 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) + # 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') @@ -998,9 +1022,25 @@ def compute(self, inputs, outputs): feintwf, areashieldwf, siwb, + fcffc, + fcfhtc, + fckic, + fcfnc, + fpylnd, + fcfstrc, + fcfvtc, + fcfwc, + fexcrt, + pct_excr, ) = inputs.values() # skin friction coeff at Re = 10**7 cf = 0.455 / 7**2.58 / (1 + 0.144 * mach**2) ** 0.65 + 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) @@ -1046,28 +1086,30 @@ 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 - # 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 + fef = fus_SA * cdfi * ffre * ff_fus + fe_fus_inc + few = ff_wing * wing_area * cdwi * fwre + # 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 # begin INTERFERENCE - get flat plate equivalent for wing-fuselage interference # wing profile drag coefficient cdw0 = few / wing_area # interference drag independent of shielded area feshieldwf = cdw0 * areashieldwf - feiwf = wing_fus_intf * (feintwf - feshieldwf) + feiwf = fckic * (wing_fus_intf * (feintwf - feshieldwf)) # end INTERFERENCE - # total flat plate equivalent area - # In GASP, nacelle is excluded. - fe = few + fef + fevt + feht + fen + feiwf + festrt + cd0_inc * wing_area + # Excrescence Drag + feexcr = fexcrt * pct_excr * (few + fef + fevt + feht + fen + festrt) - # wfob = cabin_width / wingspan - # siwb = 1 - 0.0088 * wfob - 1.7364 * wfob**2 - 2.303 * wfob**3 + 6.0606 * wfob**4 + # total flat plate equivalent 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 @@ -1366,6 +1408,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 @@ -1404,6 +1448,7 @@ 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.COMPRESSIBILITY_DRAG_FACTOR, units='unitless') # from aero setup self.add_input( @@ -1430,7 +1475,14 @@ 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.COMPRESSIBILITY_DRAG_FACTOR, + ], + method='cs', + ) def compute(self, inputs, outputs): ( @@ -1441,6 +1493,7 @@ def compute(self, inputs, outputs): supersonic_factor, lift_factor, zero_lift_factor, + fcmpc, cf, SA1, SA2, @@ -1463,7 +1516,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/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 diff --git a/aviary/utils/test/data/converter_test_BWB_GASP.csv b/aviary/utils/test/data/converter_test_BWB_GASP.csv index 6bd086b91..d2b6f55cd 100644 --- a/aviary/utils/test/data/converter_test_BWB_GASP.csv +++ b/aviary/utils/test/data/converter_test_BWB_GASP.csv @@ -25,18 +25,29 @@ 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 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: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 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,23 +201,7 @@ 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 -INGASP.FPYLND,1.15 -INGASP.FSA7C,0.85 INGASP.HBTP,0.465 INGASP.HIR,0.015 INGASP.HNCRU,41000 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 69158dadb..5f01fedf9 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -1286,6 +1286,15 @@ 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', + default_value=1.0, + desc='compressibility aero calibration factor', +) + add_meta_data( Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF, meta_data=_MetaData, @@ -1440,6 +1449,15 @@ 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', + default_value=1.0, + desc='excrescence aero drag factor', +) + add_meta_data( Aircraft.Design.EXTERNAL_SUBSYSTEMS_MASS, historical_name={ @@ -1470,6 +1488,15 @@ 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 (include technology factor INGASP.FCFFT)', +) + add_meta_data( Aircraft.Design.GROSS_MASS, meta_data=_MetaData, @@ -1492,6 +1519,15 @@ 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, @@ -1501,6 +1537,15 @@ "Aviary wouldn't be what it is today without his help.", ) +add_meta_data( + Aircraft.Design.INTERFERENCE_DRAG_FACTOR, + meta_data=_MetaData, + historical_name={'GASP': 'INGASP.FCKIC', 'FLOPS': None, 'LEAPS1': None}, + units='unitless', + default_value=1.0, + desc='interference aero calibration factor (including technology factor INGASP.FCKIT)', +) + # TODO expected types and default value? add_meta_data( Aircraft.Design.LAMINAR_FLOW_LOWER, @@ -1590,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', }, @@ -1669,6 +1714,15 @@ 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, @@ -1680,6 +1734,25 @@ 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, + 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, @@ -1741,6 +1814,15 @@ default_value=0.0, ) +add_meta_data( + Aircraft.Design.STRUT_DRAG_FACTOR, + meta_data=_MetaData, + historical_name={'GASP': 'INGASP.FCFVTC', 'FLOPS': None, 'LEAPS1': None}, + units='unitless', + default_value=1.0, + desc='strut aero calibration factor (including technology factor INGASP.FCFVTT)', +) + add_meta_data( Aircraft.Design.SUBSONIC_DRAG_COEFF_FACTOR, meta_data=_MetaData, @@ -1874,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, @@ -1910,6 +1992,15 @@ 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, @@ -1925,6 +2016,15 @@ 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, diff --git a/aviary/variable_info/variables.py b/aviary/variable_info/variables.py index aaadf2ef6..7015dadb3 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' @@ -137,10 +138,14 @@ 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_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' LAMINAR_FLOW_UPPER = 'aircraft:design:laminar_flow_upper' LANDING_TO_TAKEOFF_MASS_RATIO = 'aircraft:design:landing_to_takeoff_mass_ratio' @@ -154,12 +159,16 @@ 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' @@ -171,7 +180,9 @@ 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'