diff --git a/aviary/docs/getting_started/onboarding_level3.ipynb b/aviary/docs/getting_started/onboarding_level3.ipynb index f710cf9c2..73bee3977 100644 --- a/aviary/docs/getting_started/onboarding_level3.ipynb +++ b/aviary/docs/getting_started/onboarding_level3.ipynb @@ -337,7 +337,8 @@ "\n", "traj.link_phases([\"climb\", \"cruise\", \"descent\"], [\"time\", av.Dynamic.Vehicle.MASS, av.Dynamic.Mission.DISTANCE], connected=strong_couple)\n", "\n", - "param_vars = [av.Aircraft.Nacelle.CHARACTERISTIC_LENGTH,\n", + "param_vars = [av.Aircraft.Engine.SCALE_FACTOR,\n", + " av.Aircraft.Nacelle.CHARACTERISTIC_LENGTH,\n", " av.Aircraft.Nacelle.FINENESS,\n", " av.Aircraft.Nacelle.LAMINAR_FLOW_LOWER,\n", " av.Aircraft.Nacelle.LAMINAR_FLOW_UPPER,\n", @@ -451,6 +452,7 @@ "\n", "# Set initial default values for all LEAPS aircraft variables.\n", "varnames = [\n", + " av.Aircraft.Engine.SCALE_FACTOR,\n", " av.Aircraft.Wing.MAX_CAMBER_AT_70_SEMISPAN,\n", " av.Aircraft.Wing.SWEEP,\n", " av.Aircraft.Wing.TAPER_RATIO,\n", @@ -698,7 +700,7 @@ ], "metadata": { "kernelspec": { - "display_name": "Python 3 (ipykernel)", + "display_name": "aviary", "language": "python", "name": "python3" }, diff --git a/aviary/docs/user_guide/examples_of_the_same_mission_at_different_UI_levels.ipynb b/aviary/docs/user_guide/examples_of_the_same_mission_at_different_UI_levels.ipynb index be08a70b0..0f9f7fd6b 100644 --- a/aviary/docs/user_guide/examples_of_the_same_mission_at_different_UI_levels.ipynb +++ b/aviary/docs/user_guide/examples_of_the_same_mission_at_different_UI_levels.ipynb @@ -425,6 +425,7 @@ "# Set initial default values for any variables that have\n", "# different defaults in premission and mission.\n", "varnames = [\n", + " av.Aircraft.Engine.SCALE_FACTOR,\n", " av.Aircraft.Wing.AREA,\n", " av.Aircraft.Wing.MAX_CAMBER_AT_70_SEMISPAN,\n", " av.Aircraft.Wing.SWEEP,\n", diff --git a/aviary/mission/flops_based/ode/landing_eom.py b/aviary/mission/flops_based/ode/landing_eom.py index 1ebf06ec4..718198c7d 100644 --- a/aviary/mission/flops_based/ode/landing_eom.py +++ b/aviary/mission/flops_based/ode/landing_eom.py @@ -196,7 +196,6 @@ def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None): alpha0 = aviary_options.get_val(Mission.Takeoff.ANGLE_OF_ATTACK_RUNWAY, 'rad') t_inc = aviary_options.get_val(Mission.Takeoff.THRUST_INCIDENCE, 'rad') - total_num_engines = aviary_options.get_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES) mass = inputs[Dynamic.Vehicle.MASS] lift = inputs[Dynamic.Vehicle.LIFT] @@ -234,7 +233,6 @@ def compute_partials(self, inputs, J, discrete_inputs=None): alpha0 = aviary_options.get_val(Mission.Takeoff.ANGLE_OF_ATTACK_RUNWAY, 'rad') t_inc = aviary_options.get_val(Mission.Takeoff.THRUST_INCIDENCE, 'rad') - total_num_engines = aviary_options.get_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES) mass = inputs[Dynamic.Vehicle.MASS] lift = inputs[Dynamic.Vehicle.LIFT] diff --git a/aviary/mission/gasp_based/ode/test/test_landing_eom.py b/aviary/mission/gasp_based/ode/test/test_landing_eom.py index 8ae2830df..f32941eac 100644 --- a/aviary/mission/gasp_based/ode/test/test_landing_eom.py +++ b/aviary/mission/gasp_based/ode/test/test_landing_eom.py @@ -157,7 +157,7 @@ def test_case1(self): prob.setup(check=False, force_alloc_complex=True) partial_data = prob.check_partials(out_stream=None, method="cs") - assert_check_partials(partial_data, atol=2e-11, rtol=1e-12) + assert_check_partials(partial_data, atol=1e-10, rtol=1e-12) class GroundRollTestCase(unittest.TestCase): diff --git a/aviary/models/N3CC/N3CC_data.py b/aviary/models/N3CC/N3CC_data.py index a3452f39d..dcc746392 100644 --- a/aviary/models/N3CC/N3CC_data.py +++ b/aviary/models/N3CC/N3CC_data.py @@ -186,34 +186,20 @@ filename = get_path('models/engines/turbofan_22k.deck') inputs.set_val(Aircraft.Engine.DATA_FILE, filename) -engine_mass = 6293.8 -engine_mass_units = 'lbm' -inputs.set_val(Aircraft.Engine.MASS, engine_mass, engine_mass_units) -inputs.set_val( - Aircraft.Engine.REFERENCE_MASS, - engine_mass, - engine_mass_units) -scaled_sls_thrust = 22200.5 -scaled_sls_thrust_units = 'lbf' -inputs.set_val( - Aircraft.Engine.SCALED_SLS_THRUST, scaled_sls_thrust, scaled_sls_thrust_units) -inputs.set_val( - Aircraft.Engine.REFERENCE_SLS_THRUST, scaled_sls_thrust, scaled_sls_thrust_units) +inputs.set_val(Aircraft.Engine.MASS, 6293.8, 'lbm') +inputs.set_val(Aircraft.Engine.REFERENCE_MASS, 6293.8, 'lbm') +inputs.set_val(Aircraft.Engine.SCALE_FACTOR, 0.99997747798473) inputs.set_val(Aircraft.Engine.THRUST_REVERSERS_MASS_SCALER, 0.0) -num_engines = 2 -inputs.set_val(Aircraft.Engine.NUM_ENGINES, num_engines) -num_fuselage_engines = 0 -inputs.set_val(Aircraft.Engine.NUM_FUSELAGE_ENGINES, num_fuselage_engines) -num_wing_engines = num_engines -inputs.set_val(Aircraft.Engine.NUM_WING_ENGINES, num_wing_engines) +inputs.set_val(Aircraft.Engine.NUM_ENGINES, 2) +inputs.set_val(Aircraft.Engine.NUM_FUSELAGE_ENGINES, 0) +inputs.set_val(Aircraft.Engine.NUM_WING_ENGINES, 2) inputs.set_val(Aircraft.Engine.WING_LOCATIONS, 0.289682918) inputs.set_val(Aircraft.Engine.SCALE_MASS, True) inputs.set_val(Aircraft.Engine.MASS_SCALER, 1.15) inputs.set_val(Aircraft.Engine.SCALE_PERFORMANCE, True) inputs.set_val(Aircraft.Engine.SUBSONIC_FUEL_FLOW_SCALER, 1.0) inputs.set_val(Aircraft.Engine.SUPERSONIC_FUEL_FLOW_SCALER, 1.0) -inputs.set_val( - Aircraft.Engine.FUEL_FLOW_SCALER_CONSTANT_TERM, 0.0) +inputs.set_val(Aircraft.Engine.FUEL_FLOW_SCALER_CONSTANT_TERM, 0.0) inputs.set_val(Aircraft.Engine.FUEL_FLOW_SCALER_LINEAR_TERM, 1.0) inputs.set_val(Aircraft.Engine.CONSTANT_FUEL_CONSUMPTION, 0.0, units='lb/h') inputs.set_val(Aircraft.Engine.ADDITIONAL_MASS_FRACTION, 0.0) @@ -396,36 +382,26 @@ outputs.set_val(Aircraft.Paint.MASS, 0.0, 'lbm') -outputs.set_val( - Aircraft.Propulsion.TOTAL_SCALED_SLS_THRUST, - scaled_sls_thrust * num_engines, scaled_sls_thrust_units) +inputs.set_val(Aircraft.Engine.SCALED_SLS_THRUST, 22200.5, 'lbf') +inputs.set_val(Aircraft.Engine.REFERENCE_SLS_THRUST, 22200.5, 'lbf') +outputs.set_val(Aircraft.Propulsion.TOTAL_SCALED_SLS_THRUST, 22200.5 * 2, 'lbf') outputs.set_val(Aircraft.Propulsion.TOTAL_ENGINE_OIL_MASS, 110.0, 'lbm') -outputs.set_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES, num_engines) +outputs.set_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES, 2) -outputs.set_val(Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES, num_wing_engines) +outputs.set_val(Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES, 2) -outputs.set_val(Aircraft.Propulsion.TOTAL_NUM_FUSELAGE_ENGINES, num_fuselage_engines) +outputs.set_val(Aircraft.Propulsion.TOTAL_NUM_FUSELAGE_ENGINES, 0) outputs.set_val(Aircraft.Propulsion.TOTAL_ENGINE_CONTROLS_MASS, 0.0, 'lbm') - -outputs.set_val(Aircraft.Engine.SCALE_FACTOR, 1.0) # Not printed in FLOPS, but total mass matches outputs.set_val(Aircraft.Engine.POD_MASS, 6619.27529209, 'lbm') outputs.set_val(Aircraft.Engine.MASS, 12587./2.0, 'lbm') outputs.set_val(Aircraft.Engine.ADDITIONAL_MASS, 0.0, 'lbm') outputs.set_val(Aircraft.Propulsion.TOTAL_MISC_MASS, 0.0, 'lbm') -thrust_reversers_mass = 0. -thrust_reversers_mass_units = 'lbm' -outputs.set_val( - Aircraft.Engine.THRUST_REVERSERS_MASS, - thrust_reversers_mass, thrust_reversers_mass_units) -outputs.set_val( - Aircraft.Propulsion.TOTAL_THRUST_REVERSERS_MASS, - thrust_reversers_mass, thrust_reversers_mass_units) -outputs.set_val( - Aircraft.Propulsion.TOTAL_ENGINE_MASS, - engine_mass * num_engines, engine_mass_units) +outputs.set_val(Aircraft.Engine.THRUST_REVERSERS_MASS, 0, 'lbm') +outputs.set_val(Aircraft.Propulsion.TOTAL_THRUST_REVERSERS_MASS, 0, 'lbm') +outputs.set_val(Aircraft.Propulsion.TOTAL_ENGINE_MASS, 6293.8 * 2, 'lbm') outputs.set_val(Aircraft.VerticalTail.CHARACTERISTIC_LENGTH, 11.25, 'ft') outputs.set_val(Aircraft.VerticalTail.FINENESS, 0.1000) diff --git a/aviary/models/large_single_aisle_1/large_single_aisle_1_FLOPS_data.py b/aviary/models/large_single_aisle_1/large_single_aisle_1_FLOPS_data.py index 5ec622a3f..2aef2be7a 100644 --- a/aviary/models/large_single_aisle_1/large_single_aisle_1_FLOPS_data.py +++ b/aviary/models/large_single_aisle_1/large_single_aisle_1_FLOPS_data.py @@ -160,6 +160,7 @@ inputs.set_val(Aircraft.Engine.NUM_WING_ENGINES, 2) inputs.set_val(Aircraft.Engine.THRUST_REVERSERS_MASS_SCALER, 0.0) inputs.set_val(Aircraft.Engine.WING_LOCATIONS, 15.8300 / (117.83 / 2)) +inputs.set_val(Aircraft.Engine.SCALE_FACTOR, 1.0) inputs.set_val(Aircraft.Engine.SCALE_MASS, True) inputs.set_val(Aircraft.Engine.MASS_SCALER, 1.15) inputs.set_val(Aircraft.Engine.SCALE_PERFORMANCE, True) @@ -357,11 +358,10 @@ outputs.set_val(Aircraft.Engine.POD_MASS, 9000, 'lbm') outputs.set_val(Aircraft.Engine.ADDITIONAL_MASS, 0.0, 'lbm') outputs.set_val(Aircraft.Propulsion.TOTAL_MISC_MASS, 648.83, 'lbm') -outputs.set_val(Aircraft.Engine.SCALE_FACTOR, 1.0) outputs.set_val(Aircraft.Propulsion.TOTAL_STARTER_MASS, 560.39, 'lbm') - outputs.set_val(Aircraft.Propulsion.TOTAL_THRUST_REVERSERS_MASS, 0, 'lbm') outputs.set_val(Aircraft.Engine.THRUST_REVERSERS_MASS, 0, 'lbm') +outputs.set_val(Aircraft.Engine.SCALED_SLS_THRUST, 28928.1, 'lbf') outputs.set_val(Aircraft.Propulsion.TOTAL_ENGINE_MASS, 7400 * 2, 'lbm') diff --git a/aviary/models/large_single_aisle_2/large_single_aisle_2_FLOPS_data.py b/aviary/models/large_single_aisle_2/large_single_aisle_2_FLOPS_data.py index 889dbc855..0ab7c51f4 100644 --- a/aviary/models/large_single_aisle_2/large_single_aisle_2_FLOPS_data.py +++ b/aviary/models/large_single_aisle_2/large_single_aisle_2_FLOPS_data.py @@ -159,25 +159,15 @@ 'models/engines/turbofan_24k_1.deck') inputs.set_val(Aircraft.Engine.DATA_FILE, filename) -engine_mass = 8071.35 -engine_mass_units = 'lbm' -inputs.set_val(Aircraft.Engine.MASS, engine_mass, engine_mass_units) -inputs.set_val( - Aircraft.Engine.REFERENCE_MASS, - engine_mass, - engine_mass_units) -scaled_sls_thrust = 27301.0 -scaled_sls_thrust_units = 'lbf' +inputs.set_val(Aircraft.Engine.MASS, 8071.35, 'lbm') +inputs.set_val(Aircraft.Engine.REFERENCE_MASS, 8071.35, 'lbm') +inputs.set_val(Aircraft.Engine.REFERENCE_SLS_THRUST, 27301.0, 'lbf') +inputs.set_val(Aircraft.Engine.SCALE_FACTOR, 1.0) inputs.set_val(Aircraft.Engine.SCALED_SLS_THRUST, - scaled_sls_thrust, scaled_sls_thrust_units) -inputs.set_val( - Aircraft.Engine.REFERENCE_SLS_THRUST, scaled_sls_thrust, scaled_sls_thrust_units) -num_engines = 2 -inputs.set_val(Aircraft.Engine.NUM_ENGINES, num_engines) -num_fuselage_engines = 0 -inputs.set_val(Aircraft.Engine.NUM_FUSELAGE_ENGINES, num_fuselage_engines) -num_wing_engines = 2 -inputs.set_val(Aircraft.Engine.NUM_WING_ENGINES, num_wing_engines) + 27301.0, 'lbf') +inputs.set_val(Aircraft.Engine.NUM_ENGINES, 2) +inputs.set_val(Aircraft.Engine.NUM_FUSELAGE_ENGINES, 0) +inputs.set_val(Aircraft.Engine.NUM_WING_ENGINES, 2) inputs.set_val(Aircraft.Engine.THRUST_REVERSERS_MASS_SCALER, 1.0) inputs.set_val(Aircraft.Engine.SCALE_MASS, True) inputs.set_val(Aircraft.Engine.MASS_SCALER, 1.15) @@ -185,8 +175,7 @@ inputs.set_val(Aircraft.Engine.SCALE_FACTOR, 1.0) inputs.set_val(Aircraft.Engine.SUBSONIC_FUEL_FLOW_SCALER, 1.0) inputs.set_val(Aircraft.Engine.SUPERSONIC_FUEL_FLOW_SCALER, 1.0) -inputs.set_val( - Aircraft.Engine.FUEL_FLOW_SCALER_CONSTANT_TERM, 0.0) +inputs.set_val(Aircraft.Engine.FUEL_FLOW_SCALER_CONSTANT_TERM, 0.0) inputs.set_val(Aircraft.Engine.FUEL_FLOW_SCALER_LINEAR_TERM, 0.0) inputs.set_val(Aircraft.Engine.CONSTANT_FUEL_CONSUMPTION, 0.0, units='lbm/h') inputs.set_val(Aircraft.Engine.ADDITIONAL_MASS_FRACTION, 0.0) @@ -314,13 +303,11 @@ outputs.set_val(Aircraft.Furnishings.MASS, 14690., 'lbm') -avg_diameter = (13.0208 + 12.33) / 2 -avg_diameter_units = 'ft' -outputs.set_val(Aircraft.Fuselage.AVG_DIAMETER, avg_diameter, avg_diameter_units) +outputs.set_val(Aircraft.Fuselage.AVG_DIAMETER, (13.0208 + 12.33) / 2, 'ft') outputs.set_val(Aircraft.Fuselage.CHARACTERISTIC_LENGTH, 124.75, 'ft') outputs.set_val( Aircraft.Fuselage.CROSS_SECTION, - pi * (avg_diameter / 2.0)**2.0, 'ft**2') + pi * (12.6754 / 2.0)**2.0, 'ft**2') outputs.set_val(Aircraft.Fuselage.DIAMETER_TO_WING_SPAN, 0.112598) outputs.set_val(Aircraft.Fuselage.FINENESS, 9.8419) outputs.set_val(Aircraft.Fuselage.LENGTH_TO_DIAMETER, 9.841898) @@ -348,13 +335,11 @@ outputs.set_val(Aircraft.Nacelle.WETTED_AREA, np.array([228.34]), 'ft**2') outputs.set_val(Aircraft.Paint.MASS, 582.3, 'lbm') - outputs.set_val( Aircraft.Propulsion.TOTAL_SCALED_SLS_THRUST, - scaled_sls_thrust * num_engines, scaled_sls_thrust_units) + 27301.0 * 2, 'lbf') -total_num_engines = num_engines -outputs.set_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES, total_num_engines) +outputs.set_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES, 2) ctrls_mass = 0.26 * 2 * 27301.0**0.5 # 85.92 ctrls_mass_units = 'lbm' @@ -368,30 +353,21 @@ outputs.set_val(Aircraft.Propulsion.TOTAL_ENGINE_OIL_MASS, 125.42, 'lbm') -outputs.set_val(Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES, num_wing_engines) +outputs.set_val(Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES, 2) -outputs.set_val(Aircraft.Propulsion.TOTAL_NUM_FUSELAGE_ENGINES, num_fuselage_engines) +outputs.set_val(Aircraft.Propulsion.TOTAL_NUM_FUSELAGE_ENGINES, 2) -outputs.set_val( - Aircraft.Propulsion.TOTAL_ENGINE_MASS, - engine_mass * num_engines, engine_mass_units) +outputs.set_val(Aircraft.Propulsion.TOTAL_ENGINE_MASS, 16143., 'lbm') outputs.set_val(Aircraft.Engine.MASS, 16143./2.0, 'lbm') outputs.set_val(Aircraft.Engine.POD_MASS, 10350, 'lbm') outputs.set_val(Aircraft.Engine.ADDITIONAL_MASS, 0.0, 'lbm') outputs.set_val(Aircraft.Propulsion.TOTAL_MISC_MASS, 550.4, 'lbm') -outputs.set_val(Aircraft.Engine.SCALE_FACTOR, 1.0) outputs.set_val( Aircraft.Propulsion.TOTAL_STARTER_MASS, 11.0 * 2 * 0.82**0.32 * 7.0**1.6, 'lbm') -thrust_reversers_mass = 1856.4 -thrust_reversers_mass_units = 'lbm' -outputs.set_val( - Aircraft.Propulsion.TOTAL_THRUST_REVERSERS_MASS, - thrust_reversers_mass, thrust_reversers_mass_units) -outputs.set_val( - Aircraft.Engine.THRUST_REVERSERS_MASS, - thrust_reversers_mass, thrust_reversers_mass_units) +outputs.set_val(Aircraft.Propulsion.TOTAL_THRUST_REVERSERS_MASS, 1856.4, 'lbm') +outputs.set_val(Aircraft.Engine.THRUST_REVERSERS_MASS, 1856.4, 'lbm') outputs.set_val(Aircraft.VerticalTail.CHARACTERISTIC_LENGTH, 11.30, 'ft') outputs.set_val(Aircraft.VerticalTail.FINENESS, 0.1375) diff --git a/aviary/models/large_single_aisle_2/large_single_aisle_2_altwt_FLOPS_data.py b/aviary/models/large_single_aisle_2/large_single_aisle_2_altwt_FLOPS_data.py index 322332a86..2829d6858 100644 --- a/aviary/models/large_single_aisle_2/large_single_aisle_2_altwt_FLOPS_data.py +++ b/aviary/models/large_single_aisle_2/large_single_aisle_2_altwt_FLOPS_data.py @@ -160,7 +160,8 @@ inputs.set_val(Aircraft.Engine.DATA_FILE, filename) inputs.set_val(Aircraft.Engine.MASS, 8071.35, 'lbm') inputs.set_val(Aircraft.Engine.REFERENCE_MASS, 8071.35, 'lbm') -inputs.set_val(Aircraft.Engine.SCALED_SLS_THRUST, 27301.0, 'lbf') +inputs.set_val(Aircraft.Engine.SCALED_SLS_THRUST, 28928.1, 'lbf') +inputs.set_val(Aircraft.Engine.SCALE_FACTOR, 1.0) inputs.set_val(Aircraft.Engine.REFERENCE_SLS_THRUST, 27301.0, 'lbf') inputs.set_val(Aircraft.Engine.NUM_ENGINES, 2) inputs.set_val(Aircraft.Engine.NUM_FUSELAGE_ENGINES, 0) @@ -346,6 +347,7 @@ outputs.set_val(Aircraft.Paint.MASS, 582.3, 'lbm') outputs.set_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES, 2) +inputs.set_val(Aircraft.Engine.SCALED_SLS_THRUST, 27301.0, 'lbf') outputs.set_val( Aircraft.Propulsion.TOTAL_SCALED_SLS_THRUST, 27301.0 * 2, 'lbf') @@ -368,7 +370,6 @@ outputs.set_val(Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES, 2) outputs.set_val(Aircraft.Engine.MASS, 16143./2.0, 'lbm') outputs.set_val(Aircraft.Engine.ADDITIONAL_MASS, 0.0, 'lbm') -outputs.set_val(Aircraft.Engine.SCALE_FACTOR, 1.0) outputs.set_val(Aircraft.Propulsion.TOTAL_ENGINE_MASS, 8071.35 * 2, 'lbm') outputs.set_val(Aircraft.VerticalTail.CHARACTERISTIC_LENGTH, 11.30, 'ft') diff --git a/aviary/models/large_single_aisle_2/large_single_aisle_2_detailwing_FLOPS_data.py b/aviary/models/large_single_aisle_2/large_single_aisle_2_detailwing_FLOPS_data.py index 7711d695f..d35f76bec 100644 --- a/aviary/models/large_single_aisle_2/large_single_aisle_2_detailwing_FLOPS_data.py +++ b/aviary/models/large_single_aisle_2/large_single_aisle_2_detailwing_FLOPS_data.py @@ -147,25 +147,16 @@ 'models/engines/turbofan_24k_1.deck') inputs.set_val(Aircraft.Engine.DATA_FILE, filename) -engine_mass = 8071.35 -engine_mass_units = 'lbm' -inputs.set_val(Aircraft.Engine.MASS, engine_mass, engine_mass_units) +inputs.set_val(Aircraft.Engine.MASS, 8071.35, 'lbm') +inputs.set_val(Aircraft.Engine.REFERENCE_MASS, 8071.35, 'lbm') +inputs.set_val(Aircraft.Engine.SCALE_FACTOR, 1.0) +inputs.set_val(Aircraft.Engine.REFERENCE_SLS_THRUST, 27301.0, 'lbf') inputs.set_val( - Aircraft.Engine.REFERENCE_MASS, - engine_mass, - engine_mass_units) -scaled_sls_thrust = 27301.0 -scaled_sls_thrust_units = 'lbf' -inputs.set_val( - Aircraft.Engine.SCALED_SLS_THRUST, scaled_sls_thrust, scaled_sls_thrust_units) -inputs.set_val( - Aircraft.Engine.REFERENCE_SLS_THRUST, scaled_sls_thrust, scaled_sls_thrust_units) -num_engines = 2 -inputs.set_val(Aircraft.Engine.NUM_ENGINES, num_engines) -num_fuselage_engines = 0 -inputs.set_val(Aircraft.Engine.NUM_FUSELAGE_ENGINES, num_fuselage_engines) -num_wing_engines = num_engines -inputs.set_val(Aircraft.Engine.NUM_WING_ENGINES, num_wing_engines) + Aircraft.Engine.SCALED_SLS_THRUST, 27301.0, 'lbf') +inputs.set_val(Aircraft.Engine.SCALED_SLS_THRUST, 27301.0, 'lbf') +inputs.set_val(Aircraft.Engine.NUM_ENGINES, 2) +inputs.set_val(Aircraft.Engine.NUM_FUSELAGE_ENGINES, 0) +inputs.set_val(Aircraft.Engine.NUM_WING_ENGINES, 2) inputs.set_val(Aircraft.Engine.WING_LOCATIONS, 0.28131) inputs.set_val(Aircraft.Engine.THRUST_REVERSERS_MASS_SCALER, 1.0) inputs.set_val(Aircraft.Engine.SCALE_MASS, True) @@ -173,8 +164,7 @@ inputs.set_val(Aircraft.Engine.SCALE_PERFORMANCE, True) inputs.set_val(Aircraft.Engine.SUBSONIC_FUEL_FLOW_SCALER, 1.0) inputs.set_val(Aircraft.Engine.SUPERSONIC_FUEL_FLOW_SCALER, 1.0) -inputs.set_val( - Aircraft.Engine.FUEL_FLOW_SCALER_CONSTANT_TERM, 0.0) +inputs.set_val(Aircraft.Engine.FUEL_FLOW_SCALER_CONSTANT_TERM, 0.0) inputs.set_val(Aircraft.Engine.FUEL_FLOW_SCALER_LINEAR_TERM, 0.0) inputs.set_val(Aircraft.Engine.CONSTANT_FUEL_CONSUMPTION, 0.0, units='lbm/h') inputs.set_val(Aircraft.Engine.ADDITIONAL_MASS_FRACTION, 0.0) @@ -186,7 +176,6 @@ inputs.set_val(Aircraft.Engine.GEOPOTENTIAL_ALT, False) inputs.set_val(Aircraft.Engine.INTERPOLATION_METHOD, 'slinear') - # Vertical Tail # --------------------------- inputs.set_val(Aircraft.VerticalTail.NUM_TAILS, 1) @@ -345,17 +334,13 @@ outputs.set_val(Aircraft.Paint.MASS, 582.3, 'lbm') -dist_thrust_factor = scaled_sls_thrust - outputs.set_val( Aircraft.Propulsion.TOTAL_SCALED_SLS_THRUST, - scaled_sls_thrust * num_engines, scaled_sls_thrust_units) - -outputs.set_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES, num_engines) + 27301.0 * 2, 'lbf') -dist_count_factor = num_engines +outputs.set_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES, 2) -engine_ctrls_mass = 0.26 * dist_count_factor * dist_thrust_factor**0.5 # 85.92 +engine_ctrls_mass = 0.26 * 2 * 27301.0**0.5 # 85.92 engine_ctrls_mass_units = 'lbm' outputs.set_val( Aircraft.Engine.CONTROLS_MASS, engine_ctrls_mass, engine_ctrls_mass_units) @@ -365,18 +350,17 @@ outputs.set_val(Aircraft.Propulsion.TOTAL_ENGINE_OIL_MASS, 125.42, 'lbm') -outputs.set_val(Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES, num_wing_engines) +outputs.set_val(Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES, 2) -outputs.set_val(Aircraft.Propulsion.TOTAL_NUM_FUSELAGE_ENGINES, num_fuselage_engines) +outputs.set_val(Aircraft.Propulsion.TOTAL_NUM_FUSELAGE_ENGINES, 0) outputs.set_val( - Aircraft.Propulsion.TOTAL_ENGINE_MASS, engine_mass * num_engines, engine_mass_units) + Aircraft.Propulsion.TOTAL_ENGINE_MASS, 16143., 'lbm') outputs.set_val(Aircraft.Engine.MASS, 16143./2.0, 'lbm') outputs.set_val(Aircraft.Engine.POD_MASS, 10350, 'lbm') outputs.set_val(Aircraft.Engine.ADDITIONAL_MASS, 0.0, 'lbm') outputs.set_val(Aircraft.Propulsion.TOTAL_MISC_MASS, 550.4, 'lbm') -outputs.set_val(Aircraft.Engine.SCALE_FACTOR, 1.0) outputs.set_val( Aircraft.Propulsion.TOTAL_STARTER_MASS, 11.0 * 2 * 0.82**0.32 * 7.0**1.6, 'lbm') diff --git a/aviary/models/multi_engine_single_aisle/multi_engine_single_aisle_data.py b/aviary/models/multi_engine_single_aisle/multi_engine_single_aisle_data.py index f5773cf40..eae17282f 100644 --- a/aviary/models/multi_engine_single_aisle/multi_engine_single_aisle_data.py +++ b/aviary/models/multi_engine_single_aisle/multi_engine_single_aisle_data.py @@ -11,10 +11,10 @@ # Overall Aircraft # --------------------------- -inputs.set_val(Aircraft.Design.BASE_AREA, 0., 'ft**2') +inputs.set_val(Aircraft.Design.BASE_AREA, 0.0, 'ft**2') inputs.set_val(Aircraft.Design.EMPTY_MASS_MARGIN_SCALER, 0.00514) inputs.set_val(Aircraft.Design.LANDING_TO_TAKEOFF_MASS_RATIO, 0.84) -inputs.set_val(Mission.Design.GROSS_MASS, 174200., 'lbm') +inputs.set_val(Mission.Design.GROSS_MASS, 174200.0, 'lbm') inputs.set_val(Aircraft.Design.USE_ALT_MASS, False) inputs.set_val(Aircraft.Design.LIFT_DEPENDENT_DRAG_COEFF_FACTOR, 1.0) inputs.set_val(Aircraft.Design.SUBSONIC_DRAG_COEFF_FACTOR, 1.0) @@ -54,17 +54,17 @@ inputs.set_val(Aircraft.CrewPayload.NUM_PASSENGERS, 162, units='unitless') inputs.set_val(Aircraft.CrewPayload.NUM_TOURIST_CLASS, 150) -inputs.set_val(Aircraft.CrewPayload.BAGGAGE_MASS_PER_PASSENGER, 35., 'lbm') +inputs.set_val(Aircraft.CrewPayload.BAGGAGE_MASS_PER_PASSENGER, 35.0, 'lbm') inputs.set_val(Aircraft.CrewPayload.CARGO_CONTAINER_MASS_SCALER, 1.0) inputs.set_val(Aircraft.CrewPayload.NUM_FLIGHT_ATTENDANTS, 5) inputs.set_val(Aircraft.CrewPayload.NUM_FLIGHT_CREW, 2) inputs.set_val(Aircraft.CrewPayload.FLIGHT_CREW_MASS_SCALER, 1.0) inputs.set_val(Aircraft.CrewPayload.NUM_GALLEY_CREW, 1) -inputs.set_val(Aircraft.CrewPayload.MISC_CARGO, 4077., 'lbm') +inputs.set_val(Aircraft.CrewPayload.MISC_CARGO, 4077.0, 'lbm') inputs.set_val(Aircraft.CrewPayload.NON_FLIGHT_CREW_MASS_SCALER, 1.0) -inputs.set_val(Aircraft.CrewPayload.PASSENGER_SERVICE_MASS_SCALER, 1.) -inputs.set_val(Aircraft.CrewPayload.MASS_PER_PASSENGER, 165., 'lbm') -inputs.set_val(Aircraft.CrewPayload.WING_CARGO, 0., 'lbm') +inputs.set_val(Aircraft.CrewPayload.PASSENGER_SERVICE_MASS_SCALER, 1.0) +inputs.set_val(Aircraft.CrewPayload.MASS_PER_PASSENGER, 165.0, 'lbm') +inputs.set_val(Aircraft.CrewPayload.WING_CARGO, 0.0, 'lbm') # Electrical # --------------------------- @@ -117,7 +117,7 @@ # Hydraulics # --------------------------- -inputs.set_val(Aircraft.Hydraulics.SYSTEM_PRESSURE, 3000., 'psi') +inputs.set_val(Aircraft.Hydraulics.SYSTEM_PRESSURE, 3000.0, 'psi') inputs.set_val(Aircraft.Hydraulics.MASS_SCALER, 1.0) # Instruments @@ -149,8 +149,7 @@ inputs.set_val(Aircraft.Propulsion.MISC_MASS_SCALER, 1.0) # Engine 1: turbofan_28k -filename = get_path( - 'models/engines/turbofan_28k.deck') +filename = get_path('models/engines/turbofan_28k.deck') engine_1_inputs = AviaryValues() engine_1_inputs.set_val(Aircraft.Engine.DATA_FILE, filename) @@ -234,7 +233,8 @@ inputs.set_val(Aircraft.Wing.ASPECT_RATIO, 9.42519) inputs.set_val(Aircraft.Wing.BENDING_MATERIAL_MASS_SCALER, 1.0) inputs.set_val( - Aircraft.Wing.CHORD_PER_SEMISPAN_DIST, np.array([0.4441, 0.2313, 0.0729])) + Aircraft.Wing.CHORD_PER_SEMISPAN_DIST, np.array([0.4441, 0.2313, 0.0729]) +) inputs.set_val(Aircraft.Wing.COMPOSITE_FRACTION, 0.0) inputs.set_val(Aircraft.Wing.CONTROL_SURFACE_AREA_RATIO, 0.333) inputs.set_val(Aircraft.Wing.GLOVE_AND_BAT, 0.0, 'ft**2') @@ -254,8 +254,7 @@ inputs.set_val(Aircraft.Wing.SWEEP, 25.03, 'deg') inputs.set_val(Aircraft.Wing.TAPER_RATIO, 0.237343146184852) inputs.set_val(Aircraft.Wing.THICKNESS_TO_CHORD, 0.131732727515702) -inputs.set_val( - Aircraft.Wing.THICKNESS_TO_CHORD_DIST, np.array([0.145, 0.115, 0.104])) +inputs.set_val(Aircraft.Wing.THICKNESS_TO_CHORD_DIST, np.array([0.145, 0.115, 0.104])) inputs.set_val(Aircraft.Wing.ULTIMATE_LOAD_FACTOR, 3.75) inputs.set_val(Aircraft.Wing.VAR_SWEEP_MASS_PENALTY, 0) inputs.set_val(Aircraft.Wing.MASS, 15548, 'lbm') @@ -266,7 +265,7 @@ # Mission # --------------------------- inputs.set_val(Mission.Summary.CRUISE_MACH, 0.785) # was 0.82 -inputs.set_val(Mission.Design.RANGE, 2960., 'NM') +inputs.set_val(Mission.Design.RANGE, 2960.0, 'NM') inputs.set_val(Mission.Summary.FUEL_FLOW_SCALER, 1.0) inputs.set_val(Mission.Constraints.MAX_MACH, 0.82) # TODO investigate the origin of these values (taken from benchmark tests) @@ -281,7 +280,7 @@ # TODO: should this be a user input or should it be hard coded somewhere assuming it will # never change? -inputs.set_val(Mission.Takeoff.ROLLING_FRICTION_COEFFICIENT, .0175) +inputs.set_val(Mission.Takeoff.ROLLING_FRICTION_COEFFICIENT, 0.0175) # lbf TODO: where should this get connected from? inputs.set_val(Mission.Design.THRUST_TAKEOFF_PER_ENG, 24555.5, 'lbf') @@ -295,21 +294,21 @@ # OUTPUTS # --------------------------- -outputs.set_val(Aircraft.Design.EMPTY_MASS, 92023., 'lbm') +outputs.set_val(Aircraft.Design.EMPTY_MASS, 92023.0, 'lbm') outputs.set_val(Aircraft.Design.EMPTY_MASS_MARGIN, 0.0, 'lbm') -outputs.set_val(Aircraft.Design.OPERATING_MASS, 97992., 'lbm') -outputs.set_val(Aircraft.Propulsion.MASS, 16118., 'lbm') -outputs.set_val(Aircraft.Design.STRUCTURE_MASS, 50736., 'lbm') -outputs.set_val(Aircraft.Design.SYSTEMS_EQUIP_MASS, 25169., 'lbm') +outputs.set_val(Aircraft.Design.OPERATING_MASS, 97992.0, 'lbm') +outputs.set_val(Aircraft.Propulsion.MASS, 16118.0, 'lbm') +outputs.set_val(Aircraft.Design.STRUCTURE_MASS, 50736.0, 'lbm') +outputs.set_val(Aircraft.Design.SYSTEMS_EQUIP_MASS, 25169.0, 'lbm') outputs.set_val(Aircraft.Design.TOTAL_WETTED_AREA, 8275.86, 'ft**2') -outputs.set_val(Aircraft.Design.ZERO_FUEL_MASS, 135848., 'lbm') -outputs.set_val(Mission.Design.FUEL_MASS, 45352., 'lbm') +outputs.set_val(Aircraft.Design.ZERO_FUEL_MASS, 135848.0, 'lbm') +outputs.set_val(Mission.Design.FUEL_MASS, 45352.0, 'lbm') -outputs.set_val(Aircraft.AirConditioning.MASS, 1602., 'lbm') +outputs.set_val(Aircraft.AirConditioning.MASS, 1602.0, 'lbm') outputs.set_val(Aircraft.AntiIcing.MASS, 208.85, 'lbm') -outputs.set_val(Aircraft.APU.MASS, 1142., 'lbm') +outputs.set_val(Aircraft.APU.MASS, 1142.0, 'lbm') outputs.set_val(Aircraft.Avionics.MASS, 1652.6, 'lbm') @@ -318,14 +317,14 @@ outputs.set_val(Aircraft.Canard.WETTED_AREA, 0.0, 'ft**2') outputs.set_val(Aircraft.Canard.MASS, 0.0, 'lbm') -outputs.set_val(Aircraft.CrewPayload.BAGGAGE_MASS, 7436., 'lbm') -outputs.set_val(Aircraft.CrewPayload.CARGO_MASS, 0., 'lbm') -outputs.set_val(Aircraft.CrewPayload.CARGO_CONTAINER_MASS, 1400., 'lbm') +outputs.set_val(Aircraft.CrewPayload.BAGGAGE_MASS, 7436.0, 'lbm') +outputs.set_val(Aircraft.CrewPayload.CARGO_MASS, 0.0, 'lbm') +outputs.set_val(Aircraft.CrewPayload.CARGO_CONTAINER_MASS, 1400.0, 'lbm') outputs.set_val(Aircraft.CrewPayload.FLIGHT_CREW_MASS, 450.0, 'lbm') outputs.set_val(Aircraft.CrewPayload.NON_FLIGHT_CREW_MASS, 465.0, 'lbm') outputs.set_val(Aircraft.CrewPayload.PASSENGER_SERVICE_MASS, 3022.74805809, 'lbm') -outputs.set_val(Aircraft.CrewPayload.PASSENGER_MASS, 30420., 'lbm') -outputs.set_val(Aircraft.CrewPayload.TOTAL_PAYLOAD_MASS, 37856., 'lbm') +outputs.set_val(Aircraft.CrewPayload.PASSENGER_MASS, 30420.0, 'lbm') +outputs.set_val(Aircraft.CrewPayload.TOTAL_PAYLOAD_MASS, 37856.0, 'lbm') outputs.set_val(Aircraft.Electrical.MASS, 2464.0, 'lbm') @@ -334,23 +333,25 @@ outputs.set_val(Aircraft.Fins.MASS, 0.0, 'lbm') -outputs.set_val(Aircraft.Furnishings.MASS, 15517., 'lbm') +outputs.set_val(Aircraft.Furnishings.MASS, 15517.0, 'lbm') avg_diameter = 12.75 avg_diameter_units = 'ft' outputs.set_val(Aircraft.Fuselage.AVG_DIAMETER, avg_diameter, avg_diameter_units) -outputs.set_val(Aircraft.Fuselage.CHARACTERISTIC_LENGTH, 128., 'ft') +outputs.set_val(Aircraft.Fuselage.CHARACTERISTIC_LENGTH, 128.0, 'ft') outputs.set_val( Aircraft.Fuselage.CROSS_SECTION, - np.pi * (avg_diameter / 2.0)**2.0, f'{avg_diameter_units}**2') + np.pi * (avg_diameter / 2.0) ** 2.0, + f'{avg_diameter_units}**2', +) outputs.set_val(Aircraft.Fuselage.DIAMETER_TO_WING_SPAN, 0.108207) outputs.set_val(Aircraft.Fuselage.FINENESS, 10.0392) outputs.set_val(Aircraft.Fuselage.LENGTH_TO_DIAMETER, 10.039216) -outputs.set_val(Aircraft.Fuselage.MASS, 18357., 'lbm') +outputs.set_val(Aircraft.Fuselage.MASS, 18357.0, 'lbm') outputs.set_val(Aircraft.HorizontalTail.CHARACTERISTIC_LENGTH, 7.69, 'ft') outputs.set_val(Aircraft.HorizontalTail.FINENESS, 0.1250) -outputs.set_val(Aircraft.HorizontalTail.MASS, 1831., 'lbm') +outputs.set_val(Aircraft.HorizontalTail.MASS, 1831.0, 'lbm') outputs.set_val(Aircraft.Hydraulics.MASS, 1086.7, 'lbm') @@ -366,37 +367,44 @@ nacelle_wetted_area = np.array([273.45]) nacelle_wetted_area_units = 'ft**2' outputs.set_val( - Aircraft.Nacelle.WETTED_AREA, nacelle_wetted_area, nacelle_wetted_area_units) + Aircraft.Nacelle.WETTED_AREA, nacelle_wetted_area, nacelle_wetted_area_units +) outputs.set_val( Aircraft.Nacelle.TOTAL_WETTED_AREA, - 2 * nacelle_wetted_area, nacelle_wetted_area_units) + 2 * nacelle_wetted_area, + nacelle_wetted_area_units, +) outputs.set_val(Aircraft.Paint.MASS, 306.2, 'lbm') outputs.set_val(Aircraft.Propulsion.TOTAL_SCALED_SLS_THRUST, 51128.6, 'lbf') -outputs.set_val( - Aircraft.Propulsion.TOTAL_NUM_ENGINES, 4) +outputs.set_val(Aircraft.Propulsion.TOTAL_NUM_ENGINES, 4) engine_ctrls_mass = 88.44 engine_ctrls_mass_units = 'lbm' outputs.set_val( - Aircraft.Engine.CONTROLS_MASS, engine_ctrls_mass, engine_ctrls_mass_units) + Aircraft.Engine.CONTROLS_MASS, engine_ctrls_mass, engine_ctrls_mass_units +) outputs.set_val( Aircraft.Propulsion.TOTAL_ENGINE_CONTROLS_MASS, - engine_ctrls_mass, engine_ctrls_mass_units) + engine_ctrls_mass, + engine_ctrls_mass_units, +) outputs.set_val(Aircraft.Propulsion.TOTAL_ENGINE_OIL_MASS, 130.23, 'lbm') outputs.set_val(Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES, 4) outputs.set_val(Aircraft.Propulsion.TOTAL_NUM_FUSELAGE_ENGINES, 0) -outputs.set_val(Aircraft.Engine.MASS, 14800/2, 'lbm') +outputs.set_val( + Aircraft.Engine.SCALED_SLS_THRUST, np.array([28928.1 / 2, 22200.5 / 2]), 'lbf' +) +outputs.set_val(Aircraft.Engine.MASS, 14800 / 2, 'lbm') outputs.set_val(Aircraft.Engine.POD_MASS, 9000, 'lbm') outputs.set_val(Aircraft.Engine.ADDITIONAL_MASS, 0.0, 'lbm') outputs.set_val(Aircraft.Propulsion.TOTAL_MISC_MASS, 648.83, 'lbm') -outputs.set_val(Aircraft.Engine.SCALE_FACTOR, np.array([0.5, 0.5])) outputs.set_val(Aircraft.Propulsion.TOTAL_STARTER_MASS, 560.39, 'lbm') outputs.set_val(Aircraft.Propulsion.TOTAL_THRUST_REVERSERS_MASS, 0, 'lbm') diff --git a/aviary/models/test_aircraft/aircraft_for_bench_FwFm.csv b/aviary/models/test_aircraft/aircraft_for_bench_FwFm.csv index 29b7a41ec..4efd9526d 100644 --- a/aviary/models/test_aircraft/aircraft_for_bench_FwFm.csv +++ b/aviary/models/test_aircraft/aircraft_for_bench_FwFm.csv @@ -49,6 +49,7 @@ aircraft:engine:num_fuselage_engines,0,unitless aircraft:engine:num_wing_engines,2,unitless aircraft:engine:reference_mass,7400,lbm aircraft:engine:reference_sls_thrust,28928.1,lbf +aircraft:engine:scale_factor,1.0,unitless aircraft:engine:scale_mass,True,unitless aircraft:engine:scale_performance,True,unitless aircraft:engine:scaled_sls_thrust,28928.1,lbf diff --git a/aviary/models/test_aircraft/aircraft_for_bench_FwFm_with_electric.csv b/aviary/models/test_aircraft/aircraft_for_bench_FwFm_with_electric.csv index 4eee8d79b..4b5c12cf3 100644 --- a/aviary/models/test_aircraft/aircraft_for_bench_FwFm_with_electric.csv +++ b/aviary/models/test_aircraft/aircraft_for_bench_FwFm_with_electric.csv @@ -49,6 +49,7 @@ aircraft:engine:num_fuselage_engines,0,unitless aircraft:engine:num_wing_engines,2,unitless aircraft:engine:reference_mass,7400,lbm aircraft:engine:reference_sls_thrust,28928.1,lbf +aircraft:engine:scale_factor,1.0,unitless aircraft:engine:scale_mass,True,unitless aircraft:engine:scale_performance,True,unitless aircraft:engine:scaled_sls_thrust,28928.1,lbf diff --git a/aviary/models/test_aircraft/aircraft_for_bench_GwFm.csv b/aviary/models/test_aircraft/aircraft_for_bench_GwFm.csv index 84956f3f6..b1086dac7 100644 --- a/aviary/models/test_aircraft/aircraft_for_bench_GwFm.csv +++ b/aviary/models/test_aircraft/aircraft_for_bench_GwFm.csv @@ -81,9 +81,10 @@ aircraft:engine:pylon_factor,1.25,unitless aircraft:engine:reference_diameter,5.8,ft aircraft:engine:reference_mass,7400,lbm aircraft:engine:reference_sls_thrust,28928.1,lbf +aircraft:engine:scaled_sls_thrust,28928.1,lbf +aircraft:engine:scale_factor,1.0,unitless aircraft:engine:scale_mass,True,unitless aircraft:engine:scale_performance,True,unitless -aircraft:engine:scaled_sls_thrust,28928.1,lbf aircraft:engine:subsonic_fuel_flow_scaler,1.,unitless aircraft:engine:supersonic_fuel_flow_scaler,1.,unitless aircraft:engine:thrust_reversers_mass_scaler,0.0,unitless diff --git a/aviary/models/test_aircraft/aircraft_for_bench_solved2dof.csv b/aviary/models/test_aircraft/aircraft_for_bench_solved2dof.csv index 3aebc639f..994cc7aad 100644 --- a/aviary/models/test_aircraft/aircraft_for_bench_solved2dof.csv +++ b/aviary/models/test_aircraft/aircraft_for_bench_solved2dof.csv @@ -49,6 +49,7 @@ aircraft:engine:num_fuselage_engines,0,unitless aircraft:engine:num_wing_engines,2,unitless aircraft:engine:reference_mass,7400,lbm aircraft:engine:reference_sls_thrust,28928.1,lbf +aircraft:engine:scale_factor,1.0,unitless aircraft:engine:scale_mass,True,unitless aircraft:engine:scale_performance,True,unitless aircraft:engine:scaled_sls_thrust,28928.1,lbf diff --git a/aviary/subsystems/aerodynamics/flops_based/test/data/high_wing_single_aisle.csv b/aviary/subsystems/aerodynamics/flops_based/test/data/high_wing_single_aisle.csv index d798dfe0b..ac5d361fd 100644 --- a/aviary/subsystems/aerodynamics/flops_based/test/data/high_wing_single_aisle.csv +++ b/aviary/subsystems/aerodynamics/flops_based/test/data/high_wing_single_aisle.csv @@ -25,6 +25,7 @@ aircraft:electrical:mass_scaler,1.01,unitless #check aircraft:engine:additional_mass_fraction,0.001,unitless aircraft:engine:constant_fuel_consumption,0.,lb/h aircraft:engine:data_file,validation_cases/validation_data/flops_data/engine_only/turbofan_23k_2.deck,unitless +aircraft:engine:scale_factor,1.0,unitless aircraft:engine:flight_idle_max_fraction,1.01,unitless #check aircraft:engine:flight_idle_min_fraction,0.08,unitless aircraft:engine:flight_idle_thrust_fraction,0.00001,unitless #check diff --git a/aviary/subsystems/aerodynamics/flops_based/test/test_tabular_aero_group.py b/aviary/subsystems/aerodynamics/flops_based/test/test_tabular_aero_group.py index e02ae2985..f8df0193a 100644 --- a/aviary/subsystems/aerodynamics/flops_based/test/test_tabular_aero_group.py +++ b/aviary/subsystems/aerodynamics/flops_based/test/test_tabular_aero_group.py @@ -724,7 +724,8 @@ def setup(self): promotes_outputs=['*'], ) - key = Aircraft.Engine.SCALED_SLS_THRUST + # key = Aircraft.Engine.SCALED_SLS_THRUST + key = Aircraft.Engine.SCALE_FACTOR val, units = aviary_options.get_item(key) pre_mission.set_input_defaults(key, val, units) @@ -736,6 +737,6 @@ def setup(self): if __name__ == "__main__": unittest.main() - # test = TabularAeroGroupDataTest() + # test = ComputedVsTabularTest() # test.setUp() # test.test_case() diff --git a/aviary/subsystems/mass/flops_based/test/test_wing_common.py b/aviary/subsystems/mass/flops_based/test/test_wing_common.py index 4ddd4103c..5f8f1b7ec 100644 --- a/aviary/subsystems/mass/flops_based/test/test_wing_common.py +++ b/aviary/subsystems/mass/flops_based/test/test_wing_common.py @@ -73,7 +73,7 @@ def test_case(self): prob.set_val(Mission.Design.GROSS_MASS, 100000, 'lbm') partial_data = prob.check_partials(out_stream=None, method="cs") - assert_check_partials(partial_data, atol=5e-12, rtol=1e-12) + assert_check_partials(partial_data, atol=1e-11, rtol=1e-12) class WingMiscMassTest(unittest.TestCase): diff --git a/aviary/subsystems/mass/gasp_based/test/test_design_load.py b/aviary/subsystems/mass/gasp_based/test/test_design_load.py index 5df362720..70a131980 100644 --- a/aviary/subsystems/mass/gasp_based/test/test_design_load.py +++ b/aviary/subsystems/mass/gasp_based/test/test_design_load.py @@ -302,7 +302,7 @@ def test_case1(self): ) # not actual GASP value partial_data = self.prob.check_partials(out_stream=None, method="cs") - assert_check_partials(partial_data, atol=1e-15, rtol=1e-14) + assert_check_partials(partial_data, atol=1e-14, rtol=1e-13) class LoadSpeedsTestCase8smooth(unittest.TestCase): # TestCase3 with smooth functions @@ -397,7 +397,7 @@ def test_case1(self): ) # not actual GASP value partial_data = self.prob.check_partials(out_stream=None, method="cs") - assert_check_partials(partial_data, atol=1e-15, rtol=2e-14) + assert_check_partials(partial_data, atol=1e-15, rtol=1e-13) class LoadSpeedsTestCase10smooth(unittest.TestCase): # TestCase5 with smooth functions @@ -590,7 +590,7 @@ def test_case1(self): assert_near_equal(self.prob["V9"], 350, tol) # bug fixed value partial_data = self.prob.check_partials(out_stream=None, method="cs") - assert_check_partials(partial_data, atol=1e-15, rtol=1e-14) + assert_check_partials(partial_data, atol=1e-15, rtol=1e-13) class LoadParametersTestCase5smooth(unittest.TestCase): diff --git a/aviary/subsystems/mass/gasp_based/test/test_fixed.py b/aviary/subsystems/mass/gasp_based/test/test_fixed.py index 8a95ece97..1af3573d5 100644 --- a/aviary/subsystems/mass/gasp_based/test/test_fixed.py +++ b/aviary/subsystems/mass/gasp_based/test/test_fixed.py @@ -1704,7 +1704,7 @@ def test_case1(self): if __name__ == "__main__": - # unittest.main() + unittest.main() # test = GearTestCaseMultiengine() - test = EngineTestCaseMultiEngine() - test.test_case_1() + # test = EngineTestCaseMultiEngine() + # test.test_case_1() diff --git a/aviary/subsystems/test/test_flops_based_premission.py b/aviary/subsystems/test/test_flops_based_premission.py index 0650564f9..d16881a90 100644 --- a/aviary/subsystems/test/test_flops_based_premission.py +++ b/aviary/subsystems/test/test_flops_based_premission.py @@ -11,7 +11,11 @@ from aviary.utils.preprocessors import preprocess_options from aviary.utils.test_utils.default_subsystems import get_default_premission_subsystems from aviary.validation_cases.validation_tests import ( - flops_validation_test, get_flops_inputs, get_flops_outputs, get_flops_case_names, print_case + flops_validation_test, + get_flops_inputs, + get_flops_outputs, + get_flops_case_names, + print_case, ) from aviary.variable_info.functions import setup_model_options @@ -23,32 +27,40 @@ def setUp(self): self.prob = om.Problem() - @parameterized.expand(get_flops_case_names(), - name_func=print_case) + @parameterized.expand(get_flops_case_names(), name_func=print_case) def test_case(self, case_name): flops_inputs = get_flops_inputs(case_name) flops_outputs = get_flops_outputs(case_name) - flops_inputs.set_val(Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES, - flops_outputs.get_val(Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES)) + flops_inputs.set_val( + Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES, + flops_outputs.get_val(Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES), + ) flops_inputs.set_val(Settings.VERBOSITY, 0) engine = build_engine_deck(flops_inputs) preprocess_options(flops_inputs, engine_models=engine) default_premission_subsystems = get_default_premission_subsystems( - 'FLOPS', engine) + 'FLOPS', engine + ) prob = self.prob prob.model.add_subsystem( "pre_mission", - CorePreMission(aviary_options=flops_inputs, - subsystems=default_premission_subsystems), + CorePreMission( + aviary_options=flops_inputs, subsystems=default_premission_subsystems + ), promotes_inputs=['*'], promotes_outputs=['*'], ) setup_model_options(prob, flops_inputs) + # prob.model.set_input_defaults( + # Aircraft.Engine.SCALE_FACTOR, + # flops_inputs.get_val( + # Aircraft.Engine.SCALE_FACTOR)) + prob.setup(check=False, force_alloc_complex=True) prob.set_solver_print(2) @@ -62,32 +74,41 @@ def test_case(self, case_name): # We set these so that their derivatives are defined. # The ref values are not set in our test models. prob[Aircraft.Wing.ASPECT_RATIO_REF] = prob[Aircraft.Wing.ASPECT_RATIO] - prob[Aircraft.Wing.THICKNESS_TO_CHORD_REF] = prob[Aircraft.Wing.THICKNESS_TO_CHORD] + prob[Aircraft.Wing.THICKNESS_TO_CHORD_REF] = prob[ + Aircraft.Wing.THICKNESS_TO_CHORD + ] prob[Aircraft.Propulsion.TOTAL_ENGINE_MASS] = flops_outputs.get_val( - Aircraft.Propulsion.TOTAL_ENGINE_MASS, units='lbm') + Aircraft.Propulsion.TOTAL_ENGINE_MASS, units='lbm' + ) prob[Aircraft.Propulsion.TOTAL_ENGINE_CONTROLS_MASS] = flops_outputs.get_val( - Aircraft.Propulsion.TOTAL_ENGINE_CONTROLS_MASS, units='lbm') + Aircraft.Propulsion.TOTAL_ENGINE_CONTROLS_MASS, units='lbm' + ) flops_validation_test( prob, case_name, input_keys=[], - output_keys=[Aircraft.Design.STRUCTURE_MASS, - Aircraft.Propulsion.MASS, - Aircraft.Design.SYSTEMS_EQUIP_MASS, - Aircraft.Design.EMPTY_MASS, - Aircraft.Design.OPERATING_MASS, - Aircraft.Design.ZERO_FUEL_MASS, - Mission.Design.FUEL_MASS], + output_keys=[ + Aircraft.Design.STRUCTURE_MASS, + Aircraft.Propulsion.MASS, + Aircraft.Design.SYSTEMS_EQUIP_MASS, + Aircraft.Design.EMPTY_MASS, + Aircraft.Design.OPERATING_MASS, + Aircraft.Design.ZERO_FUEL_MASS, + Mission.Design.FUEL_MASS, + ], step=1.01e-40, atol=1e-8, - rtol=1e-10) + rtol=1e-10, + ) def test_diff_configuration_mass(self): # This standalone test provides coverage for some features unique to this # model. - from aviary.models.large_single_aisle_2.large_single_aisle_2_FLOPS_data import LargeSingleAisle2FLOPS + from aviary.models.large_single_aisle_2.large_single_aisle_2_FLOPS_data import ( + LargeSingleAisle2FLOPS, + ) prob = om.Problem() @@ -98,12 +119,14 @@ def test_diff_configuration_mass(self): engine = build_engine_deck(flops_inputs) preprocess_options(flops_inputs, engine_models=engine) default_premission_subsystems = get_default_premission_subsystems( - 'FLOPS', engine) + 'FLOPS', engine + ) prob.model.add_subsystem( "pre_mission", - CorePreMission(aviary_options=flops_inputs, - subsystems=default_premission_subsystems), + CorePreMission( + aviary_options=flops_inputs, subsystems=default_premission_subsystems + ), promotes_inputs=['*'], promotes_outputs=['*'], ) @@ -123,7 +146,8 @@ def test_diff_configuration_mass(self): rtol=1e-4, check_partials=False, flops_inputs=flops_inputs, - flops_outputs=flops_outputs) + flops_outputs=flops_outputs, + ) if __name__ == "__main__": diff --git a/aviary/subsystems/test/test_premission.py b/aviary/subsystems/test/test_premission.py index cd5b678f5..596b34012 100644 --- a/aviary/subsystems/test/test_premission.py +++ b/aviary/subsystems/test/test_premission.py @@ -235,28 +235,28 @@ def test_manual_override(self): # Problem in setup is GASP prioritized, so shared inputs for FLOPS will be manually overriden. outs = self.prob.model.pre_mission.list_outputs( - includes='*gasp*fuselage:avg_diam*', prom_name=True) + includes='*gasp*fuselage:avg_diam*', prom_name=True, out_stream=None) self.assertTrue( outs[0][0] == f'core_geometry.gasp_based_geom.fuselage.parameters.{Aircraft.Fuselage.AVG_DIAMETER}') self.assertTrue('MANUAL_OVERRIDE' not in outs[0][1]['prom_name']) outs = self.prob.model.pre_mission.list_outputs( - includes='*flops*fuselage:avg_diam*', prom_name=True) + includes='*flops*fuselage:avg_diam*', prom_name=True, out_stream=None) self.assertTrue( outs[0][0] == f'core_geometry.flops_based_geom.fuselage_prelim.{Aircraft.Fuselage.AVG_DIAMETER}') self.assertTrue('MANUAL_OVERRIDE' in outs[0][1]['prom_name']) outs = self.prob.model.pre_mission.list_outputs( - includes='*gasp*fuselage:wetted_area*', prom_name=True) + includes='*gasp*fuselage:wetted_area*', prom_name=True, out_stream=None) self.assertTrue( outs[0][0] == f'core_geometry.gasp_based_geom.fuselage.size.{Aircraft.Fuselage.WETTED_AREA}') self.assertTrue('MANUAL_OVERRIDE' not in outs[0][1]['prom_name']) outs = self.prob.model.pre_mission.list_outputs( - includes='*flops*fuselage:wetted_area*', prom_name=True) + includes='*flops*fuselage:wetted_area*', prom_name=True, out_stream=None) self.assertTrue( outs[0][0] == f'core_geometry.flops_based_geom.fuselage.{Aircraft.Fuselage.WETTED_AREA}') @@ -322,28 +322,28 @@ def test_manual_override(self): # Problem in setup is FLOPS prioritized, so shared inputs for FLOPS will be manually overriden. outs = prob.model.pre_mission.list_outputs( - includes='*gasp*fuselage:avg_diam*', prom_name=True) + includes='*gasp*fuselage:avg_diam*', prom_name=True, out_stream=None) self.assertTrue( outs[0][0] == f'core_geometry.gasp_based_geom.fuselage.parameters.{Aircraft.Fuselage.AVG_DIAMETER}') self.assertTrue('MANUAL_OVERRIDE' in outs[0][1]['prom_name']) outs = prob.model.pre_mission.list_outputs( - includes='*flops*fuselage:avg_diam*', prom_name=True) + includes='*flops*fuselage:avg_diam*', prom_name=True, out_stream=None) self.assertTrue( outs[0][0] == f'core_geometry.flops_based_geom.fuselage_prelim.{Aircraft.Fuselage.AVG_DIAMETER}') self.assertTrue('MANUAL_OVERRIDE' not in outs[0][1]['prom_name']) outs = prob.model.pre_mission.list_outputs( - includes='*gasp*fuselage:wetted_area*', prom_name=True) + includes='*gasp*fuselage:wetted_area*', prom_name=True, out_stream=None) self.assertTrue( outs[0][0] == f'core_geometry.gasp_based_geom.fuselage.size.{Aircraft.Fuselage.WETTED_AREA}') self.assertTrue('MANUAL_OVERRIDE' in outs[0][1]['prom_name']) outs = prob.model.pre_mission.list_outputs( - includes='*flops*fuselage:wetted_area*', prom_name=True) + includes='*flops*fuselage:wetted_area*', prom_name=True, out_stream=None) self.assertTrue( outs[0][0] == f'core_geometry.flops_based_geom.fuselage.{Aircraft.Fuselage.WETTED_AREA}') @@ -354,4 +354,5 @@ def test_manual_override(self): unittest.main() # test = PreMissionTestCase() # test.setUp() + # test.test_manual_override() # test.test_GASP_mass_FLOPS_everything_else() diff --git a/aviary/utils/preprocessors.py b/aviary/utils/preprocessors.py index bf555c8d0..d428c93b5 100644 --- a/aviary/utils/preprocessors.py +++ b/aviary/utils/preprocessors.py @@ -339,8 +339,11 @@ def preprocess_propulsion(aviary_options: AviaryValues, engine_models: list = No # update aviary options and outputs with new vectors # if data is numerical, store in a numpy array # keep tuples as tuples, lists get converted to numpy arrays - if type(vec[0]) in (int, float, np.int64, np.float64)\ - and type(vec) is not tuple: + # Some machines default to 32-bit np array types, so we have to check for those too + if ( + type(vec[0]) in (int, float, np.int32, np.int64, np.float32, np.float64) + and type(vec) is not tuple + ): vec = np.array(vec, dtype=dtype) aviary_options.set_val(var, vec, units) diff --git a/aviary/utils/process_input_decks.py b/aviary/utils/process_input_decks.py index 67723c2a1..1ee65092d 100644 --- a/aviary/utils/process_input_decks.py +++ b/aviary/utils/process_input_decks.py @@ -30,13 +30,23 @@ from aviary.utils.functions import get_path -operation_dict = {"<": lt, "<=": le, "==": eq, "!=": ne, - ">=": ge, ">": gt, "isinstance": isinstance} -problem_types = {'sizing': ProblemType.SIZING, - 'alternate': ProblemType.ALTERNATE, 'fallout': ProblemType.FALLOUT} - - -def create_vehicle(vehicle_deck='', meta_data=_MetaData, verbosity=None): +operation_dict = { + "<": lt, + "<=": le, + "==": eq, + "!=": ne, + ">=": ge, + ">": gt, + "isinstance": isinstance, +} +problem_types = { + 'sizing': ProblemType.SIZING, + 'alternate': ProblemType.ALTERNATE, + 'fallout': ProblemType.FALLOUT, +} + + +def create_vehicle(vehicle_deck='', meta_data=_MetaData, verbosity=Verbosity.BRIEF): """ Creates and initializes a vehicle with default or specified parameters. It sets up the aircraft values and initial guesses based on the input from the vehicle deck. @@ -75,18 +85,28 @@ def create_vehicle(vehicle_deck='', meta_data=_MetaData, verbosity=None): 'flight_duration': 0, 'time_to_climb': 0, 'climb_range': 0, - 'reserves': 0 + 'reserves': 0, } if isinstance(vehicle_deck, AviaryValues): for key, (val, units) in vehicle_deck: if key.startswith('initialization_guesses:'): - initialization_guesses[key.removeprefix('initialization_guesses:')] = val + initialization_guesses[key.removeprefix('initialization_guesses:')] = ( + val + ) aircraft_values.update(vehicle_deck) else: - vehicle_deck = get_path(vehicle_deck) + if verbosity >= 1: # BRIEF + verbose = True + else: + verbose = False + vehicle_deck = get_path(vehicle_deck, verbose) aircraft_values, initialization_guesses = parse_inputs( - vehicle_deck=vehicle_deck, aircraft_values=aircraft_values, initialization_guesses=initialization_guesses, meta_data=meta_data) + vehicle_deck=vehicle_deck, + aircraft_values=aircraft_values, + initialization_guesses=initialization_guesses, + meta_data=meta_data, + ) # make sure verbosity is always set # if verbosity set via parameter, use that @@ -100,7 +120,12 @@ def create_vehicle(vehicle_deck='', meta_data=_MetaData, verbosity=None): return aircraft_values, initialization_guesses -def parse_inputs(vehicle_deck, aircraft_values: AviaryValues = None, initialization_guesses=None, meta_data=_MetaData): +def parse_inputs( + vehicle_deck, + aircraft_values: AviaryValues = None, + initialization_guesses=None, + meta_data=_MetaData, +): """ Parses the input files and updates the aircraft values and initial guesses. The function reads the vehicle deck file, processes each line, and updates the aircraft_values object based on the data found. @@ -156,7 +181,13 @@ def parse_inputs(vehicle_deck, aircraft_values: AviaryValues = None, initializat if var_name in meta_data.keys(): aircraft_values = set_value( - var_name, var_values, aircraft_values, units=data_units, is_array=is_array, meta_data=meta_data) + var_name, + var_values, + aircraft_values, + units=data_units, + is_array=is_array, + meta_data=meta_data, + ) continue elif var_name in guess_names: @@ -167,8 +198,9 @@ def parse_inputs(vehicle_deck, aircraft_values: AviaryValues = None, initializat elif var_name.startswith('initialization_guesses:'): # get values labelled as initialization_guesses in .csv input file - initialization_guesses[var_name.removeprefix( - 'initialization_guesses:')] = float(var_values[0]) + initialization_guesses[ + var_name.removeprefix('initialization_guesses:') + ] = float(var_values[0]) continue elif ":" in var_name: @@ -184,6 +216,7 @@ def parse_inputs(vehicle_deck, aircraft_values: AviaryValues = None, initializat return aircraft_values, initialization_guesses + # TODO this should be a preprocessor, and tasks split to be specific to subsystem # e.g. aero preprocessor, mass preprocessor, 2DOF preprocessor, etc. @@ -207,21 +240,26 @@ def update_GASP_options(aircraft_values: AviaryValues): ## STRUT AND FOLD ## if not aircraft_values.get_val(Aircraft.Wing.HAS_STRUT): aircraft_values.set_val( - Aircraft.Strut.DIMENSIONAL_LOCATION_SPECIFIED, val=False) + Aircraft.Strut.DIMENSIONAL_LOCATION_SPECIFIED, val=False + ) if aircraft_values.get_val(Aircraft.Wing.HAS_FOLD): if not aircraft_values.get_val(Aircraft.Wing.CHOOSE_FOLD_LOCATION): aircraft_values.set_val( - Aircraft.Wing.FOLD_DIMENSIONAL_LOCATION_SPECIFIED, val=True) + Aircraft.Wing.FOLD_DIMENSIONAL_LOCATION_SPECIFIED, val=True + ) else: dim_loc_spec = aircraft_values.get_val( - Aircraft.Strut.DIMENSIONAL_LOCATION_SPECIFIED) + Aircraft.Strut.DIMENSIONAL_LOCATION_SPECIFIED + ) aircraft_values.set_val( - Aircraft.Wing.FOLD_DIMENSIONAL_LOCATION_SPECIFIED, val=dim_loc_spec) + Aircraft.Wing.FOLD_DIMENSIONAL_LOCATION_SPECIFIED, val=dim_loc_spec + ) else: aircraft_values.set_val(Aircraft.Wing.CHOOSE_FOLD_LOCATION, val=True) aircraft_values.set_val( - Aircraft.Wing.FOLD_DIMENSIONAL_LOCATION_SPECIFIED, val=False) + Aircraft.Wing.FOLD_DIMENSIONAL_LOCATION_SPECIFIED, val=False + ) if aircraft_values.get_val(Settings.VERBOSITY) >= Verbosity.VERBOSE: print('\nOptions') @@ -253,18 +291,26 @@ def update_dependent_options(aircraft_values: AviaryValues, dependent_options): # dependency is a dictionary that contains the target option, the relationship to the variable and the output values if dependency['relation'] in operation_dict: comp = operation_dict[dependency['relation']] - outcome = dependency['result'] if comp( - var_value, dependency['val']) else dependency['alternate'] + outcome = ( + dependency['result'] + if comp(var_value, dependency['val']) + else dependency['alternate'] + ) elif dependency['relation'] == "in": - outcome = dependency['result'] if var_value in dependency['val'] else dependency['alternate'] + outcome = ( + dependency['result'] + if var_value in dependency['val'] + else dependency['alternate'] + ) else: - warnings.warn(dependency['relation'] + - ' is not a valid selection') + warnings.warn(dependency['relation'] + ' is not a valid selection') aircraft_values.set_val(dependency['target'], val=outcome) return aircraft_values -def initialization_guessing(aircraft_values: AviaryValues, initialization_guesses, engine_builders): +def initialization_guessing( + aircraft_values: AviaryValues, initialization_guesses, engine_builders +): """ Sets initial guesses for various aircraft parameters based on the current problem type, aircraft values, and other factors. It calculates and sets values like takeoff mass, cruise mass, flight duration, etc. @@ -288,9 +334,11 @@ def initialization_guessing(aircraft_values: AviaryValues, initialization_guesse problem_type = aircraft_values.get_val(Settings.PROBLEM_TYPE) num_pax = aircraft_values.get_val(Aircraft.CrewPayload.Design.NUM_PASSENGERS) reserve_val = aircraft_values.get_val( - Aircraft.Design.RESERVE_FUEL_ADDITIONAL, units='lbm') + Aircraft.Design.RESERVE_FUEL_ADDITIONAL, units='lbm' + ) reserve_frac = aircraft_values.get_val( - Aircraft.Design.RESERVE_FUEL_FRACTION, units='unitless') + Aircraft.Design.RESERVE_FUEL_FRACTION, units='unitless' + ) if initialization_guesses['fuel_burn_per_passenger_mile'] <= 0: initialization_guesses['fuel_burn_per_passenger_mile'] = 0.1 @@ -298,14 +346,21 @@ def initialization_guessing(aircraft_values: AviaryValues, initialization_guesse reserves = initialization_guesses['reserves'] if reserves < 0.0: raise ValueError( - 'initialization_guesses["reserves"] must be greater than or equal to 0.') + 'initialization_guesses["reserves"] must be greater than or equal to 0.' + ) elif reserves == 0: reserves += reserve_val - reserves += (reserve_frac * (num_pax * initialization_guesses['fuel_burn_per_passenger_mile'] * - aircraft_values.get_val(Mission.Design.RANGE, units='NM'))) + reserves += reserve_frac * ( + num_pax + * initialization_guesses['fuel_burn_per_passenger_mile'] + * aircraft_values.get_val(Mission.Design.RANGE, units='NM') + ) elif reserves < 10: - reserves *= (num_pax * initialization_guesses['fuel_burn_per_passenger_mile'] * - aircraft_values.get_val(Mission.Design.RANGE, units='NM')) + reserves *= ( + num_pax + * initialization_guesses['fuel_burn_per_passenger_mile'] + * aircraft_values.get_val(Mission.Design.RANGE, units='NM') + ) initialization_guesses['reserves'] = reserves @@ -316,44 +371,64 @@ def initialization_guessing(aircraft_values: AviaryValues, initialization_guesse if Mission.Summary.CRUISE_MASS_FINAL in aircraft_values: cruise_mass_final = aircraft_values.get_val( - Mission.Summary.CRUISE_MASS_FINAL, units='lbm') + Mission.Summary.CRUISE_MASS_FINAL, units='lbm' + ) else: cruise_mass_final = initialization_guesses['cruise_mass_final'] # takeoff mass not given if mission_mass <= 0: if problem_type == ProblemType.ALTERNATE: - fuel_mass = num_pax * ( - initialization_guesses['fuel_burn_per_passenger_mile'] * aircraft_values.get_val(Mission.Design.RANGE, units='NM')) + reserves - mission_mass = initialization_guesses['operating_empty_mass'] + ( - num_pax * aircraft_values.get_val(Aircraft.CrewPayload.PASSENGER_MASS_WITH_BAGS, units='lbm')) + fuel_mass + fuel_mass = ( + num_pax + * ( + initialization_guesses['fuel_burn_per_passenger_mile'] + * aircraft_values.get_val(Mission.Design.RANGE, units='NM') + ) + + reserves + ) + mission_mass = ( + initialization_guesses['operating_empty_mass'] + + ( + num_pax + * aircraft_values.get_val( + Aircraft.CrewPayload.PASSENGER_MASS_WITH_BAGS, units='lbm' + ) + ) + + fuel_mass + ) elif problem_type == ProblemType.FALLOUT or problem_type == ProblemType.SIZING: mission_mass = aircraft_values.get_val( - Mission.Design.GROSS_MASS, units='lbm') + Mission.Design.GROSS_MASS, units='lbm' + ) initialization_guesses['actual_takeoff_mass'] = mission_mass if cruise_mass_final == 0: # no guess given if problem_type == ProblemType.SIZING: - cruise_mass_final = .8 + cruise_mass_final = 0.8 elif problem_type == ProblemType.ALTERNATE: cruise_mass_final = -1 # estimation based on payload and fuel if cruise_mass_final <= 0: - cruise_mass_final = initialization_guesses['operating_empty_mass'] + \ - num_pax * \ - aircraft_values.get_val( - Aircraft.CrewPayload.PASSENGER_MASS_WITH_BAGS, units='lbm') + reserves + cruise_mass_final = ( + initialization_guesses['operating_empty_mass'] + + num_pax + * aircraft_values.get_val( + Aircraft.CrewPayload.PASSENGER_MASS_WITH_BAGS, units='lbm' + ) + + reserves + ) # fraction of takeoff mass elif cruise_mass_final <= 1: - cruise_mass_final = mission_mass * \ - cruise_mass_final + cruise_mass_final = mission_mass * cruise_mass_final initialization_guesses['cruise_mass_final'] = cruise_mass_final if initialization_guesses['rotation_mass'] <= 0: initialization_guesses['rotation_mass'] = 0.99 if initialization_guesses['rotation_mass'] <= 1: # fraction of takeoff mass - initialization_guesses['rotation_mass'] = mission_mass * \ - initialization_guesses['rotation_mass'] + initialization_guesses['rotation_mass'] = ( + mission_mass * initialization_guesses['rotation_mass'] + ) if Mission.Design.MACH in aircraft_values: cruise_mach = aircraft_values.get_val(Mission.Design.MACH) @@ -361,27 +436,37 @@ def initialization_guessing(aircraft_values: AviaryValues, initialization_guesse cruise_mach = aircraft_values.get_val(Mission.Summary.CRUISE_MACH) if initialization_guesses['flight_duration'] <= 0: # estimation based on mach - initialization_guesses['flight_duration'] = aircraft_values.get_val( - Mission.Design.RANGE, units='NM') / (667 * cruise_mach) * (60 * 60) + initialization_guesses['flight_duration'] = ( + aircraft_values.get_val(Mission.Design.RANGE, units='NM') + / (667 * cruise_mach) + * (60 * 60) + ) elif initialization_guesses['flight_duration'] <= 15: # duration entered in hours - initialization_guesses['flight_duration'] = initialization_guesses['flight_duration'] * \ - (60 * 60) + initialization_guesses['flight_duration'] = initialization_guesses[ + 'flight_duration' + ] * (60 * 60) # TODO this does not work at all for mixed-type engines (some propeller and some not) try: num_engines = aircraft_values.get_val(Aircraft.Engine.NUM_ENGINES) # This happens before preprocessing, and we end up with the default when unspecified. - if isinstance(num_engines, list): - num_engines = num_engines[0] + # num_engines = np.array(num_engines) if aircraft_values.get_val(Aircraft.Engine.HAS_PROPELLERS): # For large turboprops, 1 pound of thrust per hp at takeoff seems to be close enough - total_thrust = aircraft_values.get_val( - Aircraft.Engine.Gearbox.SHAFT_POWER_DESIGN, 'hp') * num_engines + total_thrust = np.dot( + aircraft_values.get_val( + Aircraft.Engine.Gearbox.SHAFT_POWER_DESIGN, 'hp' + ), + aircraft_values.get_val(Aircraft.Engine.NUM_ENGINES), + ) else: - total_thrust = aircraft_values.get_val( - Aircraft.Engine.SCALED_SLS_THRUST, 'lbf') * num_engines + total_thrust = np.dot( + aircraft_values.get_val(Aircraft.Engine.REFERENCE_SLS_THRUST, 'lbf') + * aircraft_values.get_val(Aircraft.Engine.SCALE_FACTOR), + aircraft_values.get_val(Aircraft.Engine.NUM_ENGINES), + ) except KeyError: if engine_builders is not None and len(engine_builders) > 1: @@ -389,31 +474,41 @@ def initialization_guessing(aircraft_values: AviaryValues, initialization_guesse # heterogeneous engine-model case. Get thrust from the engine models instead. total_thrust = 0 for model in engine_builders: - thrust = model.get_val(Aircraft.Engine.SCALED_SLS_THRUST, 'lbf') + thrust = model.get_val( + Aircraft.Engine.REFERENCE_SLS_THRUST, 'lbf' + ) * model.get_val(Aircraft.Engine.SCALE_FACTOR) num_engines = model.get_val(Aircraft.Engine.NUM_ENGINES) total_thrust += thrust * num_engines else: total_thrust = aircraft_values.get_val( - Aircraft.Engine.SCALED_SLS_THRUST, 'lbf') * aircraft_values.get_val(Aircraft.Engine.NUM_ENGINES) + Aircraft.Engine.SCALED_SLS_THRUST, 'lbf' + ) * aircraft_values.get_val(Aircraft.Engine.NUM_ENGINES) - gamma_guess = np.arcsin(.5*total_thrust / mission_mass) - avg_speed_guess = (.5 * 667 * cruise_mach) # kts + gamma_guess = np.arcsin(0.5 * total_thrust / mission_mass) + avg_speed_guess = 0.5 * 667 * cruise_mach # kts if initialization_guesses['time_to_climb'] <= 0: # no guess given - initialization_guesses['time_to_climb'] = aircraft_values.get_val(Mission.Design.CRUISE_ALTITUDE, units='ft') / \ - (avg_speed_guess * np.sin(gamma_guess)) + initialization_guesses['time_to_climb'] = aircraft_values.get_val( + Mission.Design.CRUISE_ALTITUDE, units='ft' + ) / (avg_speed_guess * np.sin(gamma_guess)) elif initialization_guesses['time_to_climb'] <= 2: # duration entered in hours - initialization_guesses['time_to_climb'] = initialization_guesses['time_to_climb'] * ( - 60 * 60) + initialization_guesses['time_to_climb'] = initialization_guesses[ + 'time_to_climb' + ] * (60 * 60) elif initialization_guesses['time_to_climb'] <= 200: # average climb rate in ft/s - initialization_guesses['time_to_climb'] = aircraft_values.get_val(Mission.Design.CRUISE_ALTITUDE, units='ft') / \ - initialization_guesses['time_to_climb'] + initialization_guesses['time_to_climb'] = ( + aircraft_values.get_val(Mission.Design.CRUISE_ALTITUDE, units='ft') + / initialization_guesses['time_to_climb'] + ) # range covered using an average speed from 0 to cruise if initialization_guesses['climb_range'] <= 0: - initialization_guesses['climb_range'] = initialization_guesses['time_to_climb'] / \ - (60 * 60) * (avg_speed_guess * np.cos(gamma_guess)) + initialization_guesses['climb_range'] = ( + initialization_guesses['time_to_climb'] + / (60 * 60) + * (avg_speed_guess * np.cos(gamma_guess)) + ) if aircraft_values.get_val(Settings.VERBOSITY) >= Verbosity.VERBOSE: print('\nInitial Guesses') @@ -436,27 +531,106 @@ def initialization_guessing(aircraft_values: AviaryValues, initialization_guesse # is exactly equal to zero, engine_on_fuselage is set to to True, otherwise it is set to False. # One variable can be used to set the value of any number of options, but an option can only be # set by one variable - # [Aircraft.Engine.WING_LOCATIONS, { # 'val': 0, 'relation': '==', 'target': Aircraft.Engine.FUSELAGE_MOUNTED, 'result': True, 'alternate': False}], - [Aircraft.Wing.LOADING, {'val': 20, 'relation': '>', - 'target': Aircraft.Wing.LOADING_ABOVE_20, 'result': True, 'alternate': False}], - [Aircraft.Strut.ATTACHMENT_LOCATION, { - 'val': 0, 'relation': '!=', 'target': Aircraft.Wing.HAS_STRUT, 'result': True, 'alternate': False}], - [Aircraft.Strut.ATTACHMENT_LOCATION, { - 'val': 1, 'relation': '>', 'target': Aircraft.Strut.DIMENSIONAL_LOCATION_SPECIFIED, 'result': True, 'alternate': False}], - [Aircraft.Wing.FOLD_MASS_COEFFICIENT, { - 'val': 0, 'relation': '>', 'target': Aircraft.Wing.HAS_FOLD, 'result': True, 'alternate': False}], - [Aircraft.Wing.FOLDED_SPAN, {'val': 1, 'relation': '>', 'target': Aircraft.Wing.FOLD_DIMENSIONAL_LOCATION_SPECIFIED, - 'result': True, 'alternate': False}], - [Aircraft.Design.PART25_STRUCTURAL_CATEGORY, { - 'val': 0, 'relation': '<', 'target': Aircraft.Design.ULF_CALCULATED_FROM_MANEUVER, 'result': True, 'alternate': False}], - [Aircraft.Engine.TYPE, { - 'val': [1, 2, 3, 4, 6, 11, 12, 13, 14], 'relation': 'in', 'target': Aircraft.Engine.HAS_PROPELLERS, 'result': True, 'alternate': False}], - ['JENGSZ', { - 'val': 4, 'relation': '!=', 'target': Aircraft.Engine.SCALE_PERFORMANCE, 'result': True, 'alternate': False}], - [Aircraft.HorizontalTail.VOLUME_COEFFICIENT, { - 'val': 0, 'relation': '==', 'target': Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF, 'result': True, 'alternate': False}], - [Aircraft.VerticalTail.VOLUME_COEFFICIENT, { - 'val': 0, 'relation': '==', 'target': Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF, 'result': True, 'alternate': False}], + [ + Aircraft.Wing.LOADING, + { + 'val': 20, + 'relation': '>', + 'target': Aircraft.Wing.LOADING_ABOVE_20, + 'result': True, + 'alternate': False, + }, + ], + [ + Aircraft.Strut.ATTACHMENT_LOCATION, + { + 'val': 0, + 'relation': '!=', + 'target': Aircraft.Wing.HAS_STRUT, + 'result': True, + 'alternate': False, + }, + ], + [ + Aircraft.Strut.ATTACHMENT_LOCATION, + { + 'val': 1, + 'relation': '>', + 'target': Aircraft.Strut.DIMENSIONAL_LOCATION_SPECIFIED, + 'result': True, + 'alternate': False, + }, + ], + [ + Aircraft.Wing.FOLD_MASS_COEFFICIENT, + { + 'val': 0, + 'relation': '>', + 'target': Aircraft.Wing.HAS_FOLD, + 'result': True, + 'alternate': False, + }, + ], + [ + Aircraft.Wing.FOLDED_SPAN, + { + 'val': 1, + 'relation': '>', + 'target': Aircraft.Wing.FOLD_DIMENSIONAL_LOCATION_SPECIFIED, + 'result': True, + 'alternate': False, + }, + ], + [ + Aircraft.Design.PART25_STRUCTURAL_CATEGORY, + { + 'val': 0, + 'relation': '<', + 'target': Aircraft.Design.ULF_CALCULATED_FROM_MANEUVER, + 'result': True, + 'alternate': False, + }, + ], + [ + Aircraft.Engine.TYPE, + { + 'val': [1, 2, 3, 4, 6, 11, 12, 13, 14], + 'relation': 'in', + 'target': Aircraft.Engine.HAS_PROPELLERS, + 'result': True, + 'alternate': False, + }, + ], + [ + 'JENGSZ', + { + 'val': 4, + 'relation': '!=', + 'target': Aircraft.Engine.SCALE_PERFORMANCE, + 'result': True, + 'alternate': False, + }, + ], + [ + Aircraft.HorizontalTail.VOLUME_COEFFICIENT, + { + 'val': 0, + 'relation': '==', + 'target': Aircraft.Design.COMPUTE_HTAIL_VOLUME_COEFF, + 'result': True, + 'alternate': False, + }, + ], + [ + Aircraft.VerticalTail.VOLUME_COEFFICIENT, + { + 'val': 0, + 'relation': '==', + 'target': Aircraft.Design.COMPUTE_VTAIL_VOLUME_COEFF, + 'result': True, + 'alternate': False, + }, + ], ] diff --git a/aviary/validation_cases/benchmark_tests/test_FLOPS_balanced_field_length.py b/aviary/validation_cases/benchmark_tests/test_FLOPS_balanced_field_length.py index fd66f9d75..e37314900 100644 --- a/aviary/validation_cases/benchmark_tests/test_FLOPS_balanced_field_length.py +++ b/aviary/validation_cases/benchmark_tests/test_FLOPS_balanced_field_length.py @@ -105,7 +105,7 @@ def _do_run(self, driver: Driver, optimizer, *args): liftoff.add_objective( Dynamic.Mission.DISTANCE, loc='final', ref=distance_max, units=units) - varnames = [Aircraft.Wing.ASPECT_RATIO] + varnames = [Aircraft.Wing.ASPECT_RATIO, Aircraft.Engine.SCALE_FACTOR] set_aviary_input_defaults(takeoff.model, varnames, aviary_options) setup_model_options(takeoff, aviary_options) diff --git a/aviary/validation_cases/benchmark_tests/test_FLOPS_detailed_takeoff.py b/aviary/validation_cases/benchmark_tests/test_FLOPS_detailed_takeoff.py index 032905087..4f067bfae 100644 --- a/aviary/validation_cases/benchmark_tests/test_FLOPS_detailed_takeoff.py +++ b/aviary/validation_cases/benchmark_tests/test_FLOPS_detailed_takeoff.py @@ -114,7 +114,7 @@ def _do_run(self, driver: Driver, optimizer, *args): 'traj.takeoff_decision_speed.states:velocity', equals=155.36, units='kn', ref=159.0, indices=[-1]) - varnames = [Aircraft.Wing.ASPECT_RATIO] + varnames = [Aircraft.Wing.ASPECT_RATIO, Aircraft.Engine.SCALE_FACTOR] set_aviary_input_defaults(takeoff.model, varnames, aviary_options) setup_model_options(takeoff, aviary_options)