diff --git a/aviary/docs/theory_guide/gasp_based_bwb.ipynb b/aviary/docs/theory_guide/gasp_based_bwb.ipynb index e8c602aa9..98ea6d3df 100644 --- a/aviary/docs/theory_guide/gasp_based_bwb.ipynb +++ b/aviary/docs/theory_guide/gasp_based_bwb.ipynb @@ -123,16 +123,16 @@ "# Testing Cell\n", "\n", "from aviary.api import Aircraft\n", - "from aviary.subsystems.mass.gasp_based.equipment_and_useful_load import (\n", + "from aviary.subsystems.mass.gasp_based.equipment_and_operating_items import (\n", " BWBACMass,\n", " BWBFurnishingMass,\n", - " EquipAndUsefulLoadMassGroup,\n", - " UsefulLoadMassGroup,\n", + " EquipAndOperatingItemsMassGroup,\n", + " OperatingItemsMassGroup,\n", ")\n", "from aviary.utils.doctape import get_variable_name, glue_variable\n", "\n", - "glue_variable(get_variable_name(EquipAndUsefulLoadMassGroup), md_code=True)\n", - "glue_variable(get_variable_name(UsefulLoadMassGroup), md_code=True)\n", + "glue_variable(get_variable_name(EquipAndOperatingItemsMassGroup), md_code=True)\n", + "glue_variable(get_variable_name(OperatingItemsMassGroup), md_code=True)\n", "glue_variable(get_variable_name(BWBACMass), md_code=True)\n", "glue_variable(get_variable_name(BWBFurnishingMass), md_code=True)\n", "\n", @@ -150,11 +150,11 @@ "id": "8d5ec109", "metadata": {}, "source": [ - "### Equip And Useful Load\n", + "### Equip And Operating Items\n", "\n", - " - {glue:md}`EquipAndUsefulLoadMassGroup` includes the computations of 19 items. Ideally, each of them should be done in its own component and one group has them all. This is a long time goal. For now, it is separated to two components `EquipMass` and {glue:md}`UsefulLoadMassGroup`. The air conditioning and furnishing masses are already singled out because they need to be modified for BWB.\n", + " - {glue:md}`EquipAndOperatingItemsMassGroup` includes the computations of 19 items. Ideally, each of them should be done in its own component and one group has them all. This is a long time goal. For now, it is separated to two components `EquipMass` and {glue:md}`OperatingItemsMassGroup`. The air conditioning and furnishing masses are already singled out because they need to be modified for BWB.\n", " - A new variable {glue:md}`Aircraft.Electrical.SYSTEM_MASS_PER_PASSENGER` is added which corresponds to `CW(15)` in GASP. Its value is different for conventional aircraft and BWB.\n", - " - Two new components {glue:md}`BWBACMass` and {glue:md}`BWBFurnishingMass` are added to `equipment_and_useful_load.py`.\n", + " - Two new components {glue:md}`BWBACMass` and {glue:md}`BWBFurnishingMass` are added to `equipment_and_operating_items.py`.\n", " - **Note:** GASP Fortran code has new updates that are not included in Aviary. We've updated Aviary for furnishing mass but other masses need to be checked.\n", " - **Note:** `EquipMassPartialSum` has implementation errors for the computations of {glue:md}`Aircraft.APU.MASS`, {glue:md}`Aircraft.Avionics.MASS`, {glue:md}`Aircraft.AntiIcing.MASS`, {glue:md}`Aircraft.Furnishings.MASS`, and {glue:md}`Aircraft.Design.EMERGENCY_EQUIPMENT_MASS`. As a result, Aviary always uses user provided masses (not empirical formulas). We should use Aviary's feature of `overriding` to override those variables." ] @@ -249,7 +249,7 @@ "\n", "glue_variable(get_variable_name(Mission.TOTAL_FUEL), md_code=True)\n", "\n", - "glue_variable(get_variable_name(Mission.USEFUL_LOAD), md_code=True)\n", + "glue_variable(get_variable_name(Mission.OPERATING_ITEMS_MASS), md_code=True)\n", "glue_variable(get_variable_name(Aircraft.Wing.HIGH_LIFT_MASS), md_code=True)\n", "glue_variable(get_variable_name(Aircraft.Fuel.FUEL_SYSTEM_MASS), md_code=True)\n", "glue_variable(get_variable_name(Aircraft.Design.STRUCTURE_MASS), md_code=True)\n", @@ -275,7 +275,7 @@ "\n", "| Aviary |     | GASP |     | Observation |\n", "| ------- | ------- | ------- | -------- | ------------- |\n", - "| {glue:md}`Mission.USEFUL_LOAD` | 5972 | WFUL | 5775 | different unit weight of pilots and attendents |\n", + "| {glue:md}`Mission.OPERATING_ITEMS_MASS` | 5972 | WFUL | 5775 | different unit weight of pilots and attendents |\n", "| {glue:md}`Aircraft.Wing.HIGH_LIFT_MASS` | 972 | WHLDEV | 974 | In GASP, wing loading is a variable, but in Aviary, it is a constant |\n", "| {glue:md}`Aircraft.Fuel.FUEL_SYSTEM_MASS` | 1316 | WFSS | 1281 | the mass in GASP is computed after engine sizing. |\n", "| {glue:md}`Aircraft.Design.STRUCTURE_MASS` | 44471 | WST | 45623 | the mass in GASP is computed after engine sizing. |\n", diff --git a/aviary/docs/user_guide_unreviewed/subsystems/fuel.ipynb b/aviary/docs/user_guide_unreviewed/subsystems/fuel.ipynb index e221aa96b..b22fd4b94 100644 --- a/aviary/docs/user_guide_unreviewed/subsystems/fuel.ipynb +++ b/aviary/docs/user_guide_unreviewed/subsystems/fuel.ipynb @@ -16,7 +16,7 @@ "\n", "\n", "## Fuel Mass\n", - "The Fuel Mass breakdown is shown below. Note that UNUSABLE_FUEL_MASS is not accounted for in this mass and is instead book kept under USEFUL_LOAD which contributes to OPERATING_MASS see [mass subsystem for details](mass.ipynb).\n", + "The Fuel Mass breakdown is shown below. Note that UNUSABLE_FUEL_MASS is not accounted for in this mass and is instead book kept under OPERATING_ITEMS_MASS which contributes to OPERATING_MASS see [mass subsystem for details](mass.ipynb).\n", "\n", "- TOTAL_FUEL (mass)\n", " - FUEL (mass)\n", diff --git a/aviary/docs/user_guide_unreviewed/subsystems/mass.ipynb b/aviary/docs/user_guide_unreviewed/subsystems/mass.ipynb index 9c3adfc12..32e5d0494 100644 --- a/aviary/docs/user_guide_unreviewed/subsystems/mass.ipynb +++ b/aviary/docs/user_guide_unreviewed/subsystems/mass.ipynb @@ -25,7 +25,9 @@ " ZeroFuelMass,\n", ")\n", "from aviary.subsystems.mass.gasp_based.design_load import DesignLoadGroup\n", - "from aviary.subsystems.mass.gasp_based.equipment_and_useful_load import EquipAndUsefulLoadMassGroup\n", + "from aviary.subsystems.mass.gasp_based.equipment_and_operating_items import (\n", + " EquipAndOperatingItemsMassGroup,\n", + ")\n", "from aviary.subsystems.mass.gasp_based.fixed import FixedMassGroup\n", "from aviary.subsystems.mass.gasp_based.wing import WingMassGroup\n", "from aviary.utils.doctape import get_variable_name, glue_variable\n", @@ -74,9 +76,9 @@ "st = split_by_capitals_and_underscores(get_variable_name(FixedMassGroup))\n", "glue_variable(st, md_code=False)\n", "glue_variable(get_variable_name(FixedMassGroup), md_code=False)\n", - "st = split_by_capitals_and_underscores(get_variable_name(EquipAndUsefulLoadMassGroup))\n", + "st = split_by_capitals_and_underscores(get_variable_name(EquipAndOperatingItemsMassGroup))\n", "glue_variable(st, md_code=False)\n", - "glue_variable(get_variable_name(EquipAndUsefulLoadMassGroup), md_code=False)\n", + "glue_variable(get_variable_name(EquipAndOperatingItemsMassGroup), md_code=False)\n", "st = split_by_capitals_and_underscores(get_variable_name(WingMassGroup))\n", "glue_variable(st, md_code=False)\n", "glue_variable(get_variable_name(WingMassGroup), md_code=False)" @@ -136,7 +138,7 @@ "\n", "### Operating Mass\n", "Empty Mass, plus:\n", - "- **Useful Load**\n", + "- **Operating Items**\n", " - Flight Crew\n", " - Cabin Crew\n", " - Unusable Fuel\n", @@ -145,8 +147,10 @@ "\n", "### Zero-Fuel Mass\n", "Operating Mass, plus:\n", - "- Passengers\n", - "- Cargo\n", + "- **Payload Mass**\n", + " - Passengers\n", + " - Passenger Bags\n", + " - Cargo\n", "\n", "### Fuel Mass\n", "[Total fuel burned during the mission and fuel reserves are explored here in more detail](fuel.ipynb).\n", @@ -155,6 +159,9 @@ "Zero-Fuel Mass, plus:\n", "- Fuel\n", "\n", + "### Useful Load Mass\n", + "Gross Mass - Empty Mass\n", + "\n", "## Using the Mass Subsystem\n", "\n", "The choice of which code's methods for mass estimate to use is set using the variable {glue:md}`setting_MASS_METHOD`. This variable can be specified in the Aviary input file or can be manually set when using the Level 2 or 3 interface.\n", diff --git a/aviary/subsystems/mass/flops_based/mass_summation.py b/aviary/subsystems/mass/flops_based/mass_summation.py index 49c7c7c01..e9e3950ca 100644 --- a/aviary/subsystems/mass/flops_based/mass_summation.py +++ b/aviary/subsystems/mass/flops_based/mass_summation.py @@ -60,7 +60,10 @@ def setup(self): ) self.add_subsystem( - 'useful_load_mass', UsefulLoadMass(), promotes_inputs=['*'], promotes_outputs=['*'] + 'operating_items_mass', + OperatingItemsMass(), + promotes_inputs=['*'], + promotes_outputs=['*'], ) self.add_subsystem( @@ -71,6 +74,10 @@ def setup(self): 'zero_fuel_mass', ZeroFuelMass(), promotes_inputs=['*'], promotes_outputs=['*'] ) + self.add_subsystem( + 'useful_load_mass', UsefulLoadMass(), promotes_inputs=['*'], promotes_outputs=['*'] + ) + class EmpennageMass(om.ExplicitComponent): def setup(self): @@ -361,7 +368,7 @@ def compute(self, inputs, outputs): ) -class UsefulLoadMass(om.ExplicitComponent): +class OperatingItemsMass(om.ExplicitComponent): def setup(self): add_aviary_input(self, Aircraft.CrewPayload.CARGO_CONTAINER_MASS, units='lbm') add_aviary_input(self, Aircraft.CrewPayload.CABIN_CREW_MASS, units='lbm') @@ -370,10 +377,10 @@ def setup(self): add_aviary_input(self, Aircraft.Fuel.UNUSABLE_FUEL_MASS, units='lbm') add_aviary_input(self, Aircraft.Propulsion.TOTAL_ENGINE_OIL_MASS, units='lbm') - add_aviary_output(self, Mission.USEFUL_LOAD, units='lbm') + add_aviary_output(self, Mission.OPERATING_ITEMS_MASS, units='lbm') def setup_partials(self): - self.declare_partials(Mission.USEFUL_LOAD, '*', val=1) + self.declare_partials(Mission.OPERATING_ITEMS_MASS, '*', val=1) def compute(self, inputs, outputs): cargo_container_mass = inputs[Aircraft.CrewPayload.CARGO_CONTAINER_MASS] @@ -383,7 +390,7 @@ def compute(self, inputs, outputs): pass_service_mass = inputs[Aircraft.CrewPayload.PASSENGER_SERVICE_MASS] unusable_fuel_mass = inputs[Aircraft.Fuel.UNUSABLE_FUEL_MASS] - outputs[Mission.USEFUL_LOAD] = ( + outputs[Mission.OPERATING_ITEMS_MASS] = ( cabin_crew_mass + flight_crew_mass + unusable_fuel_mass @@ -396,7 +403,7 @@ def compute(self, inputs, outputs): class OperatingMass(om.ExplicitComponent): def setup(self): add_aviary_input(self, Aircraft.Design.EMPTY_MASS, units='lbm') - add_aviary_input(self, Mission.USEFUL_LOAD, units='lbm') + add_aviary_input(self, Mission.OPERATING_ITEMS_MASS, units='lbm') add_aviary_output(self, Mission.OPERATING_MASS, units='lbm') @@ -404,10 +411,10 @@ def setup_partials(self): self.declare_partials(Mission.OPERATING_MASS, '*', val=1) def compute(self, inputs, outputs): - useful_load = inputs[Mission.USEFUL_LOAD] + operating_items_mass = inputs[Mission.OPERATING_ITEMS_MASS] empty_mass = inputs[Aircraft.Design.EMPTY_MASS] - outputs[Mission.OPERATING_MASS] = empty_mass + useful_load + outputs[Mission.OPERATING_MASS] = empty_mass + operating_items_mass class ZeroFuelMass(om.ExplicitComponent): @@ -429,3 +436,21 @@ def compute(self, inputs, outputs): operating_mass = inputs[Mission.OPERATING_MASS] outputs[Mission.ZERO_FUEL_MASS] = operating_mass + pass_mass + bag_mass + cargo_mass + + +class UsefulLoadMass(om.ExplicitComponent): + def setup(self): + add_aviary_input(self, Aircraft.Design.GROSS_MASS, units='lbm') + add_aviary_input(self, Aircraft.Design.EMPTY_MASS, units='lbm') + + add_aviary_output(self, Aircraft.Design.USEFUL_LOAD_MASS, units='lbm') + + def setup_partials(self): + self.declare_partials(Aircraft.Design.USEFUL_LOAD_MASS, Aircraft.Design.GROSS_MASS, val=1) + self.declare_partials(Aircraft.Design.USEFUL_LOAD_MASS, Aircraft.Design.EMPTY_MASS, val=-1) + + def compute(self, inputs, outputs): + gross_mass = inputs[Aircraft.Design.GROSS_MASS] + empty_mass = inputs[Aircraft.Design.EMPTY_MASS] + + outputs[Aircraft.Design.USEFUL_LOAD_MASS] = gross_mass - empty_mass diff --git a/aviary/subsystems/mass/flops_based/payload.py b/aviary/subsystems/mass/flops_based/payload.py index 7391eb5d3..501dae14a 100644 --- a/aviary/subsystems/mass/flops_based/payload.py +++ b/aviary/subsystems/mass/flops_based/payload.py @@ -13,6 +13,9 @@ class PayloadGroup(om.Group): def setup(self): self.add_subsystem('cargo_mass', CargoMass(), promotes_inputs=['*'], promotes_outputs=['*']) + self.add_subsystem( + 'pax_payload_mass', PaxPayloadMass(), promotes_inputs=['*'], promotes_outputs=['*'] + ) self.add_subsystem( 'total_payload_mass', TotalPayload(), promotes_inputs=['*'], promotes_outputs=['*'] ) @@ -24,6 +27,7 @@ class TotalPayload(om.ExplicitComponent): def setup(self): add_aviary_input(self, Aircraft.CrewPayload.CARGO_MASS, units='lbm') add_aviary_input(self, Aircraft.CrewPayload.PASSENGER_PAYLOAD_MASS, units='lbm') + add_aviary_output(self, Aircraft.CrewPayload.TOTAL_PAYLOAD_MASS, units='lbm') def setup_partials(self): @@ -33,7 +37,7 @@ def setup_partials(self): val=1.0, ) - def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None): + def compute(self, inputs, outputs): cargo_mass = inputs[Aircraft.CrewPayload.CARGO_MASS] passenger_payload_mass = inputs[Aircraft.CrewPayload.PASSENGER_PAYLOAD_MASS] @@ -41,7 +45,26 @@ def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None): class CargoMass(om.ExplicitComponent): - """Calculate the mass of any passengers, their baggage, and other cargo.""" + """Calculate the total cargo mass.""" + + def setup(self): + add_aviary_input(self, Aircraft.CrewPayload.WING_CARGO, units='lbm') + add_aviary_input(self, Aircraft.CrewPayload.MISC_CARGO, units='lbm') + + add_aviary_output(self, Aircraft.CrewPayload.CARGO_MASS, units='lbm') + + def setup_partials(self): + self.declare_partials(Aircraft.CrewPayload.CARGO_MASS, '*', val=1.0) + + def compute(self, inputs, outputs): + wing_cargo = inputs[Aircraft.CrewPayload.WING_CARGO] + misc_cargo = inputs[Aircraft.CrewPayload.MISC_CARGO] + + outputs[Aircraft.CrewPayload.CARGO_MASS] = wing_cargo + misc_cargo + + +class PaxPayloadMass(om.ExplicitComponent): + """Calculate the mass of passengers and their baggage.""" def initialize(self): add_aviary_option(self, Aircraft.CrewPayload.BAGGAGE_MASS_PER_PASSENGER, units='lbm') @@ -49,38 +72,21 @@ def initialize(self): add_aviary_option(self, Aircraft.CrewPayload.NUM_PASSENGERS) def setup(self): - add_aviary_input(self, Aircraft.CrewPayload.WING_CARGO, units='lbm') - add_aviary_input(self, Aircraft.CrewPayload.MISC_CARGO, units='lbm') add_aviary_output(self, Aircraft.CrewPayload.PASSENGER_MASS_TOTAL, units='lbm') add_aviary_output(self, Aircraft.CrewPayload.BAGGAGE_MASS, units='lbm') add_aviary_output(self, Aircraft.CrewPayload.PASSENGER_PAYLOAD_MASS, units='lbm') - add_aviary_output(self, Aircraft.CrewPayload.CARGO_MASS, units='lbm') - def setup_partials(self): - self.declare_partials( - Aircraft.CrewPayload.CARGO_MASS, Aircraft.CrewPayload.WING_CARGO, val=1.0 - ) - - self.declare_partials( - Aircraft.CrewPayload.CARGO_MASS, Aircraft.CrewPayload.MISC_CARGO, val=1.0 - ) - - def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None): + def compute(self, inputs, outputs): passenger_count = self.options[Aircraft.CrewPayload.NUM_PASSENGERS] mass_per_passenger, _ = self.options[Aircraft.CrewPayload.MASS_PER_PASSENGER] baggage_mass_per_passenger, _ = self.options[ Aircraft.CrewPayload.BAGGAGE_MASS_PER_PASSENGER ] - outputs[Aircraft.CrewPayload.PASSENGER_MASS_TOTAL] = mass_per_passenger * passenger_count - - outputs[Aircraft.CrewPayload.BAGGAGE_MASS] = baggage_mass_per_passenger * passenger_count - - outputs[Aircraft.CrewPayload.PASSENGER_PAYLOAD_MASS] = ( - mass_per_passenger * passenger_count + baggage_mass_per_passenger * passenger_count - ) - - wing_cargo = inputs[Aircraft.CrewPayload.WING_CARGO] - misc_cargo = inputs[Aircraft.CrewPayload.MISC_CARGO] + pax_mass = mass_per_passenger * passenger_count + baggage_mass = baggage_mass_per_passenger * passenger_count + pax_payload = pax_mass + baggage_mass - outputs[Aircraft.CrewPayload.CARGO_MASS] = wing_cargo + misc_cargo + outputs[Aircraft.CrewPayload.PASSENGER_MASS_TOTAL] = pax_mass + outputs[Aircraft.CrewPayload.BAGGAGE_MASS] = baggage_mass + outputs[Aircraft.CrewPayload.PASSENGER_PAYLOAD_MASS] = pax_payload diff --git a/aviary/subsystems/mass/flops_based/test/test_mass_summation.py b/aviary/subsystems/mass/flops_based/test/test_mass_summation.py index e60511ec7..79b69c63e 100644 --- a/aviary/subsystems/mass/flops_based/test/test_mass_summation.py +++ b/aviary/subsystems/mass/flops_based/test/test_mass_summation.py @@ -7,10 +7,7 @@ from parameterized import parameterized from aviary.subsystems.mass.flops_based.mass_summation import ( - EmptyMass, MassSummation, - OperatingMass, - PropulsionMass, StructureMass, ) from aviary.subsystems.propulsion.engine_deck import EngineDeck @@ -92,6 +89,7 @@ def test_case( Aircraft.Wing.MASS, Aircraft.Propulsion.TOTAL_ENGINE_MASS, Aircraft.Propulsion.TOTAL_MISC_MASS, + Aircraft.Design.GROSS_MASS, ], output_keys=[ Aircraft.Design.EMPTY_MASS_MARGIN, @@ -100,9 +98,10 @@ def test_case( Aircraft.Design.SYSTEMS_AND_EQUIPMENT_MASS, Aircraft.Design.EMPENNAGE_MASS, Aircraft.Design.EMPTY_MASS, - Mission.USEFUL_LOAD, + Mission.OPERATING_ITEMS_MASS, Mission.OPERATING_MASS, Mission.ZERO_FUEL_MASS, + Aircraft.Design.USEFUL_LOAD_MASS, ], version=Version.TRANSPORT_and_BWB, atol=1e-10, @@ -185,7 +184,7 @@ def test_case(self, case_name): Aircraft.Design.SYSTEMS_AND_EQUIPMENT_MASS, Aircraft.Design.EMPENNAGE_MASS, Aircraft.Design.EMPTY_MASS, - Mission.USEFUL_LOAD, + Mission.OPERATING_ITEMS_MASS, Mission.OPERATING_MASS, Mission.ZERO_FUEL_MASS, ], diff --git a/aviary/subsystems/mass/gasp_based/equipment_and_useful_load.py b/aviary/subsystems/mass/gasp_based/equipment_and_operating_items.py similarity index 98% rename from aviary/subsystems/mass/gasp_based/equipment_and_useful_load.py rename to aviary/subsystems/mass/gasp_based/equipment_and_operating_items.py index 4c9f40f71..5d3caf8aa 100644 --- a/aviary/subsystems/mass/gasp_based/equipment_and_useful_load.py +++ b/aviary/subsystems/mass/gasp_based/equipment_and_operating_items.py @@ -78,7 +78,7 @@ def setup(self): ) -class UsefulLoadMassGroup(om.Group): +class OperatingItemsMassGroup(om.Group): def setup(self): self.add_subsystem( 'cargo_containers', @@ -182,7 +182,7 @@ def setup(self): ) -class EquipAndUsefulLoadMassGroup(om.Group): +class EquipAndOperatingItemsMassGroup(om.Group): def initialize(self): add_aviary_option(self, Aircraft.Design.TYPE) @@ -206,7 +206,7 @@ def setup(self): self.add_subsystem( 'useful', - UsefulLoadMassGroup(), + OperatingItemsMassGroup(), promotes_inputs=['*'], promotes_outputs=['*'], ) diff --git a/aviary/subsystems/mass/gasp_based/mass_premission.py b/aviary/subsystems/mass/gasp_based/mass_premission.py index d29739738..0a47d04c8 100644 --- a/aviary/subsystems/mass/gasp_based/mass_premission.py +++ b/aviary/subsystems/mass/gasp_based/mass_premission.py @@ -1,7 +1,9 @@ import openmdao.api as om from aviary.subsystems.mass.gasp_based.design_load import BWBDesignLoadGroup, DesignLoadGroup -from aviary.subsystems.mass.gasp_based.equipment_and_useful_load import EquipAndUsefulLoadMassGroup +from aviary.subsystems.mass.gasp_based.equipment_and_operating_items import ( + EquipAndOperatingItemsMassGroup, +) from aviary.subsystems.mass.gasp_based.fixed import FixedMassGroup from aviary.subsystems.mass.gasp_based.fuel import ( BodyTankCalculations, @@ -52,7 +54,7 @@ def setup(self): self.add_subsystem( 'equip_and_useful_mass', - EquipAndUsefulLoadMassGroup(), + EquipAndOperatingItemsMassGroup(), promotes_inputs=['*'], promotes_outputs=['*'], ) diff --git a/aviary/subsystems/mass/gasp_based/mass_summation.py b/aviary/subsystems/mass/gasp_based/mass_summation.py index 29cf8832a..08c1be25f 100644 --- a/aviary/subsystems/mass/gasp_based/mass_summation.py +++ b/aviary/subsystems/mass/gasp_based/mass_summation.py @@ -36,7 +36,10 @@ def setup(self): ) self.add_subsystem( - 'useful_load_mass', UsefulLoadMass(), promotes_inputs=['*'], promotes_outputs=['*'] + 'operating_items_mass', + OperatingItemsMass(), + promotes_inputs=['*'], + promotes_outputs=['*'], ) self.add_subsystem( @@ -47,6 +50,10 @@ def setup(self): 'zero_fuel_mass', ZeroFuelMass(), promotes_inputs=['*'], promotes_outputs=['*'] ) + self.add_subsystem( + 'useful_load_mass', UsefulLoadMass(), promotes_inputs=['*'], promotes_outputs=['*'] + ) + class EmpennageMass(om.ExplicitComponent): def setup(self): @@ -190,7 +197,7 @@ def compute(self, inputs, outputs): ) -class UsefulLoadMass(om.ExplicitComponent): +class OperatingItemsMass(om.ExplicitComponent): def setup(self): add_aviary_input(self, Aircraft.CrewPayload.CARGO_CONTAINER_MASS, units='lbm') add_aviary_input(self, Aircraft.CrewPayload.CABIN_CREW_MASS, units='lbm') @@ -200,10 +207,10 @@ def setup(self): add_aviary_input(self, Aircraft.Propulsion.TOTAL_ENGINE_OIL_MASS, units='lbm') add_aviary_input(self, Aircraft.Design.EMERGENCY_EQUIPMENT_MASS) - add_aviary_output(self, Mission.USEFUL_LOAD, units='lbm') + add_aviary_output(self, Mission.OPERATING_ITEMS_MASS, units='lbm') def setup_partials(self): - self.declare_partials(Mission.USEFUL_LOAD, '*', val=1) + self.declare_partials(Mission.OPERATING_ITEMS_MASS, '*', val=1) def compute(self, inputs, outputs): cargo_container_mass = inputs[Aircraft.CrewPayload.CARGO_CONTAINER_MASS] @@ -214,7 +221,7 @@ def compute(self, inputs, outputs): unusable_fuel_mass = inputs[Aircraft.Fuel.UNUSABLE_FUEL_MASS] emergency_equip_mass = inputs[Aircraft.Design.EMERGENCY_EQUIPMENT_MASS] - outputs[Mission.USEFUL_LOAD] = ( + outputs[Mission.OPERATING_ITEMS_MASS] = ( cabin_crew_mass + flight_crew_mass + unusable_fuel_mass @@ -228,7 +235,7 @@ def compute(self, inputs, outputs): class OperatingMass(om.ExplicitComponent): def setup(self): add_aviary_input(self, Aircraft.Design.EMPTY_MASS, units='lbm') - add_aviary_input(self, Mission.USEFUL_LOAD, units='lbm') + add_aviary_input(self, Mission.OPERATING_ITEMS_MASS, units='lbm') add_aviary_output(self, Mission.OPERATING_MASS, units='lbm') @@ -236,10 +243,10 @@ def setup_partials(self): self.declare_partials(Mission.OPERATING_MASS, '*', val=1) def compute(self, inputs, outputs): - useful_load = inputs[Mission.USEFUL_LOAD] + operating_items_mass = inputs[Mission.OPERATING_ITEMS_MASS] empty_mass = inputs[Aircraft.Design.EMPTY_MASS] - outputs[Mission.OPERATING_MASS] = empty_mass + useful_load + outputs[Mission.OPERATING_MASS] = empty_mass + operating_items_mass class ZeroFuelMass(om.ExplicitComponent): @@ -257,3 +264,21 @@ def compute(self, inputs, outputs): operating_mass = inputs[Mission.OPERATING_MASS] outputs[Mission.ZERO_FUEL_MASS] = operating_mass + payload_mass + + +class UsefulLoadMass(om.ExplicitComponent): + def setup(self): + add_aviary_input(self, Aircraft.Design.GROSS_MASS, units='lbm') + add_aviary_input(self, Aircraft.Design.EMPTY_MASS, units='lbm') + + add_aviary_output(self, Aircraft.Design.USEFUL_LOAD_MASS, units='lbm') + + def setup_partials(self): + self.declare_partials(Aircraft.Design.USEFUL_LOAD_MASS, Aircraft.Design.GROSS_MASS, val=1) + self.declare_partials(Aircraft.Design.USEFUL_LOAD_MASS, Aircraft.Design.EMPTY_MASS, val=-1) + + def compute(self, inputs, outputs): + gross_mass = inputs[Aircraft.Design.GROSS_MASS] + empty_mass = inputs[Aircraft.Design.EMPTY_MASS] + + outputs[Aircraft.Design.USEFUL_LOAD_MASS] = gross_mass - empty_mass diff --git a/aviary/subsystems/mass/gasp_based/test/test_equipment_and_useful_load.py b/aviary/subsystems/mass/gasp_based/test/test_equipment_and_operating_items.py similarity index 97% rename from aviary/subsystems/mass/gasp_based/test/test_equipment_and_useful_load.py rename to aviary/subsystems/mass/gasp_based/test/test_equipment_and_operating_items.py index 753f28743..9d960707b 100644 --- a/aviary/subsystems/mass/gasp_based/test/test_equipment_and_useful_load.py +++ b/aviary/subsystems/mass/gasp_based/test/test_equipment_and_operating_items.py @@ -4,13 +4,16 @@ from openmdao.utils.assert_utils import assert_check_partials, assert_near_equal from openmdao.utils.testing_utils import use_tempdirs -from aviary.subsystems.mass.gasp_based.equipment_and_useful_load import ( +from aviary.subsystems.mass.gasp_based.equipment_and_operating_items import ( BWBEquipMassGroup, - EquipAndUsefulLoadMassGroup, + EquipAndOperatingItemsMassGroup, EquipMassGroup, - UsefulLoadMassGroup, + OperatingItemsMassGroup, +) +from aviary.subsystems.mass.gasp_based.mass_summation import ( + SystemsEquipmentMass, + OperatingItemsMass, ) -from aviary.subsystems.mass.gasp_based.mass_summation import SystemsEquipmentMass, UsefulLoadMass from aviary.variable_info.functions import setup_model_options from aviary.variable_info.options import get_option_defaults from aviary.variable_info.variables import Aircraft, Mission, Settings @@ -124,7 +127,7 @@ def test_case1(self): assert_check_partials(partial_data, atol=8e-12, rtol=1e-12) -class UsefulMassSumTest(unittest.TestCase): +class OperatingItemsMassSumTest(unittest.TestCase): """this is the large single aisle 1 V3 test case.""" def setUp(self): @@ -135,7 +138,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( 'useful', - UsefulLoadMass(), + OperatingItemsMass(), promotes=['*'], ) @@ -169,7 +172,7 @@ def test_case1(self): self.prob.run_model() tol = 1e-7 - assert_near_equal(self.prob[Mission.USEFUL_LOAD], 5341.36, tol) + assert_near_equal(self.prob[Mission.OPERATING_ITEMS_MASS], 5341.36, tol) partial_data = self.prob.check_partials(out_stream=None, method='cs') assert_check_partials(partial_data, atol=8e-12, rtol=1e-12) @@ -186,7 +189,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( 'useful_group', - UsefulLoadMassGroup(), + OperatingItemsMassGroup(), promotes=['*'], ) @@ -241,7 +244,7 @@ def setUp(self): self.prob = om.Problem() self.prob.model.add_subsystem( 'group', - EquipAndUsefulLoadMassGroup(), + EquipAndOperatingItemsMassGroup(), promotes=['*'], ) @@ -388,7 +391,7 @@ def test_case1(self): assert_check_partials(partial_data, atol=8e-12, rtol=1e-12) -class BWBUsefulMassSumTest(unittest.TestCase): +class BWBOperatingItemsMassSumTest(unittest.TestCase): """Created based on GASP BWB model.""" def setUp(self): @@ -399,7 +402,7 @@ def setUp(self): prob = self.prob = om.Problem() prob.model.add_subsystem( 'useful', - UsefulLoadMass(), + OperatingItemsMass(), promotes=['*'], ) @@ -431,7 +434,7 @@ def test_case1(self): self.prob.run_model() tol = 1e-7 - assert_near_equal(self.prob[Mission.USEFUL_LOAD], 4321.8, tol) + assert_near_equal(self.prob[Mission.OPERATING_ITEMS_MASS], 4321.8, tol) partial_data = self.prob.check_partials(out_stream=None, method='cs') assert_check_partials(partial_data, atol=8e-12, rtol=1e-12) @@ -450,7 +453,7 @@ def setUp(self): prob = self.prob = om.Problem() prob.model.add_subsystem( 'group', - EquipAndUsefulLoadMassGroup(), + EquipAndOperatingItemsMassGroup(), promotes=['*'], ) diff --git a/aviary/subsystems/mass/gasp_based/test/test_fuel.py b/aviary/subsystems/mass/gasp_based/test/test_fuel.py index c3bdc9b52..76151a449 100644 --- a/aviary/subsystems/mass/gasp_based/test/test_fuel.py +++ b/aviary/subsystems/mass/gasp_based/test/test_fuel.py @@ -754,7 +754,7 @@ def setUp(self): # prob.model.set_input_defaults( # Aircraft.Design.SYSTEMS_AND_EQUIPMENT_MASS, 20876.477, units='lbm' # ) - # prob.model.set_input_defaults(Mission.USEFUL_LOAD, 5736.3, units='lbm') + # prob.model.set_input_defaults(Mission.OPERATING_ITEMS_MASS, 5736.3, units='lbm') prob.model.set_input_defaults(Mission.OPERATING_MASS, 88282.366, units='lbm') prob.model.set_input_defaults('fuel_mass_required', 26652.3, units='lbm') prob.model.set_input_defaults( diff --git a/aviary/subsystems/mass/gasp_based/test/test_furnishings.py b/aviary/subsystems/mass/gasp_based/test/test_furnishings.py index 35941c206..868fe66c2 100644 --- a/aviary/subsystems/mass/gasp_based/test/test_furnishings.py +++ b/aviary/subsystems/mass/gasp_based/test/test_furnishings.py @@ -58,12 +58,12 @@ class FurnishingMassTestCase2(unittest.TestCase): """Test mass-weight conversion""" def setUp(self): - import aviary.subsystems.mass.gasp_based.equipment_and_useful_load as equip + import aviary.subsystems.mass.gasp_based.equipment_and_operating_items as equip equip.GRAV_ENGLISH_LBM = 1.1 def tearDown(self): - import aviary.subsystems.mass.gasp_based.equipment_and_useful_load as equip + import aviary.subsystems.mass.gasp_based.equipment_and_operating_items as equip equip.GRAV_ENGLISH_LBM = 1.0 diff --git a/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py b/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py index 510199ffa..fa95239cf 100644 --- a/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py +++ b/aviary/subsystems/mass/gasp_based/test/test_mass_premission.py @@ -79,8 +79,6 @@ def setUp(self): def test_case1(self): self.prob.run_model() - # print(f'wetted_area: {self.prob[Aircraft.Fuselage.WETTED_AREA]}') - tol = 5e-4 expected_values = { 'gasp_based_geom.cabin_height': 13.1, @@ -112,6 +110,7 @@ def test_case1(self): Aircraft.Fuel.AUXILIARY_FUEL_CAPACITY: 0, # always zero when no body tank 'extra_fuel_volume': 0, # always zero when no body tank 'max_extra_fuel_mass': 0, # always zero when no body tank + Aircraft.Design.USEFUL_LOAD_MASS: 85002.98039399, } for var_name, expected_val in expected_values.items(): @@ -3236,7 +3235,7 @@ def setUp(self): Aircraft.Electrical.SYSTEM_MASS_PER_PASSENGER, 11.45, units='lbm' ) - # inputs to UsefulLoadMass + # inputs to OperatingItemsMass prob.model.set_input_defaults( Aircraft.Fuel.UNUSABLE_FUEL_MASS_COEFFICIENT, 12.0, units='unitless' ) @@ -3279,7 +3278,7 @@ def test_case1(self): Aircraft.Engine.POSITION_FACTOR -- SKEPOS = 1.05 Aircraft.CrewPayload.PASSENGER_PAYLOAD_MASS -- WPL = 33750 Aircraft.Design.SYSTEMS_AND_EQUIPMENT_MASS - WFE = 20876. - Mission.USEFUL_LOAD -- WFUL = 5775. + Mission.OPERATING_ITEMS_MASS -- WFUL = 5775. Aircraft.Wing.MASS -- WW = 7645. Aircraft.Strut.MASS -- WSTRUT = 0 Aircraft.Wing.FOLD_MASS -- WWFOLD = 107.9 @@ -3358,7 +3357,7 @@ def test_case1(self): assert_near_equal(prob[Aircraft.Engine.ADDITIONAL_MASS], 153.16770871, tol) assert_near_equal(prob[Aircraft.Engine.POSITION_FACTOR], 1.05, tol) assert_near_equal(prob[Aircraft.Design.SYSTEMS_AND_EQUIPMENT_MASS], 21885.38086961, tol) - assert_near_equal(prob[Mission.USEFUL_LOAD], 5961.79463002, tol) + assert_near_equal(prob[Mission.OPERATING_ITEMS_MASS], 5961.79463002, tol) assert_near_equal(prob[Aircraft.Wing.SURFACE_CONTROL_MASS], 1986.25111783, tol) # BWBWingMassGroup diff --git a/aviary/subsystems/mass/mass_builder.py b/aviary/subsystems/mass/mass_builder.py index 9e776250b..a734a7683 100644 --- a/aviary/subsystems/mass/mass_builder.py +++ b/aviary/subsystems/mass/mass_builder.py @@ -274,8 +274,10 @@ def report(self, prob, reports_folder, **kwargs): f.write(f'|####**MISSION SPECIFIC DETAILS:**####|||\n') f.write('||||\n') - val, units = find_variable_in_problem(Mission.USEFUL_LOAD, prob, self.meta_data) - f.write(f'|Useful Load|{val}|{units}|\n') + val, units = find_variable_in_problem( + Mission.OPERATING_ITEMS_MASS, prob, self.meta_data + ) + f.write(f'|Operating Items|{val}|{units}|\n') val1, units = find_variable_in_problem( Aircraft.CrewPayload.CABIN_CREW_MASS, prob, self.meta_data diff --git a/aviary/subsystems/test/test_flops_based_premission.py b/aviary/subsystems/test/test_flops_based_premission.py index bb14f4e2c..8a8f53147 100644 --- a/aviary/subsystems/test/test_flops_based_premission.py +++ b/aviary/subsystems/test/test_flops_based_premission.py @@ -1229,6 +1229,6 @@ def test_case_all_subsystems(self): if __name__ == '__main__': unittest.main() - test = BWBPreMissionGroupTest() - test.setUp() + # test = BWBPreMissionGroupTest() + # test.setUp() # test.test_case_all_subsystems() diff --git a/aviary/subsystems/test/test_gasp_based_premission.py b/aviary/subsystems/test/test_gasp_based_premission.py index 3578b230e..8c69baa98 100644 --- a/aviary/subsystems/test/test_gasp_based_premission.py +++ b/aviary/subsystems/test/test_gasp_based_premission.py @@ -97,7 +97,7 @@ def test_case1(self): Aircraft.LandingGear.MAIN_GEAR_MASS: 6366.3591, # GASP original 21078.3911, added controls mass Aircraft.Design.SYSTEMS_AND_EQUIPMENT_MASS: 24_897.7475, - Mission.USEFUL_LOAD: 5341.4317956, + Mission.OPERATING_ITEMS_MASS: 5341.4317956, Aircraft.Engine.ADDITIONAL_MASS: 850.90095, Aircraft.Wing.MASS: 16206.8122, Aircraft.Fuel.FUEL_SYSTEM_MASS: 1740.2606, @@ -184,7 +184,7 @@ def test_case2(self): Aircraft.LandingGear.MAIN_GEAR_MASS: 6366.3591, # GASP original 21078.3911, added controls mass Aircraft.Design.SYSTEMS_AND_EQUIPMENT_MASS: 24_897.7475, - Mission.USEFUL_LOAD: 5332.684, + Mission.OPERATING_ITEMS_MASS: 5332.684, Aircraft.Engine.ADDITIONAL_MASS: 827.5372, Aircraft.Wing.MASS: 15651.64198957, Aircraft.Fuel.FUEL_SYSTEM_MASS: 1779.06667944, @@ -235,7 +235,7 @@ def test_case1(self): Aircraft.AirConditioning.MASS -- WAC = 1301.57 Aircraft.Furnishings.MASS -- 11269.88 Aircraft.Design.SYSTEMS_AND_EQUIPMENT_MASS -- WFE = 20876. - Mission.USEFUL_LOAD -- WFUL = 5775. + Mission.OPERATING_ITEMS_MASS -- WFUL = 5775. Aircraft.Engine.ADDITIONAL_MASS -- not in GASP Aircraft.Wing.FOLD_MASS -- WWFOLD = 107.9 Aircraft.Wing.MASS -- WW = 7645. @@ -322,7 +322,7 @@ def test_case1(self): Aircraft.Furnishings.MASS: 11269.876, # GASP original 20876.453, added controls mass Aircraft.Design.SYSTEMS_AND_EQUIPMENT_MASS: 22_991.435, - Mission.USEFUL_LOAD: 5971.7946, + Mission.OPERATING_ITEMS_MASS: 5971.7946, Aircraft.Engine.ADDITIONAL_MASS: 153.1677, Aircraft.Wing.FOLD_MASS: 107.8736151, Aircraft.Wing.MASS: 6962.31442344, @@ -476,7 +476,7 @@ def test_case_geom_mass(self): Aircraft.Furnishings.MASS: 11269.876, # GASP original 20876.453, added controls mass Aircraft.Design.SYSTEMS_AND_EQUIPMENT_MASS: 22_991.435, - Mission.USEFUL_LOAD: 5971.7946, + Mission.OPERATING_ITEMS_MASS: 5971.7946, Aircraft.Engine.ADDITIONAL_MASS: 153.1677, Aircraft.Wing.FOLD_MASS: 107.8335, Aircraft.Wing.MASS: 6959.7262, diff --git a/aviary/validation_cases/validation_data/test_data/advanced_single_aisle_data.py b/aviary/validation_cases/validation_data/test_data/advanced_single_aisle_data.py index 56e6a0061..b34daad82 100644 --- a/aviary/validation_cases/validation_data/test_data/advanced_single_aisle_data.py +++ b/aviary/validation_cases/validation_data/test_data/advanced_single_aisle_data.py @@ -337,7 +337,7 @@ outputs.set_val(Aircraft.Propulsion.MASS, 13105.0, 'lbm') outputs.set_val(Aircraft.Design.STRUCTURE_MASS, 29336.0, 'lbm') outputs.set_val(Aircraft.Design.SYSTEMS_AND_EQUIPMENT_MASS, 24105.0, 'lbm') -outputs.set_val(Mission.USEFUL_LOAD, 5100, 'lbm') +outputs.set_val(Mission.OPERATING_ITEMS_MASS, 5100, 'lbm') outputs.set_val(Aircraft.Design.TOTAL_WETTED_AREA, 7956.515738, 'ft**2') outputs.set_val(Mission.ZERO_FUEL_MASS, 103442.0, 'lbm') diff --git a/aviary/validation_cases/validation_data/test_data/bwb300_baseline_FLOPS_data.py b/aviary/validation_cases/validation_data/test_data/bwb300_baseline_FLOPS_data.py index 90d203709..405ff41f0 100644 --- a/aviary/validation_cases/validation_data/test_data/bwb300_baseline_FLOPS_data.py +++ b/aviary/validation_cases/validation_data/test_data/bwb300_baseline_FLOPS_data.py @@ -423,7 +423,7 @@ outputs.set_val(Aircraft.Wing.AREA, 8421.7146805052689, 'ft**2') # SW outputs.set_val(Aircraft.Wing.WETTED_AREA, 17302.04910213, 'ft**2') # SWET(1) -outputs.set_val(Mission.Summary.USEFUL_LOAD, 20996.3933862, 'lbm') +outputs.set_val(Mission.Summary.OPERATING_ITEMS_MASS, 20996.3933862, 'lbm') # outputs.set_val(Aircraft.Design.MACH, 0.800) # FMDES outputs.set_val(Mission.Summary.OPERATING_MASS, 321171.82272983, 'lbm') # DOWE diff --git a/aviary/validation_cases/validation_data/test_data/bwb_detailed_FLOPS_data.py b/aviary/validation_cases/validation_data/test_data/bwb_detailed_FLOPS_data.py index bf1332f14..1e7f09b29 100644 --- a/aviary/validation_cases/validation_data/test_data/bwb_detailed_FLOPS_data.py +++ b/aviary/validation_cases/validation_data/test_data/bwb_detailed_FLOPS_data.py @@ -423,8 +423,9 @@ outputs.set_val(Aircraft.Wing.WETTED_AREA, 24713.661297561481, 'ft**2') # SWET(1) outputs.set_val(Aircraft.Wing.SPAN, 253.720756, 'ft') # SPAN = WF+OSSPAN*2 -outputs.set_val(Mission.USEFUL_LOAD, 20996.3933862, 'lbm') +outputs.set_val(Mission.OPERATING_ITEMS_MASS, 20996.3933862, 'lbm') outputs.set_val(Aircraft.Design.MACH, 0.800) outputs.set_val(Mission.OPERATING_MASS, 411552.29917206, 'lbm') # WOWE outputs.set_val(Mission.ZERO_FUEL_MASS, 509364.29917206, 'lbm') # WZF +outputs.set_val(Aircraft.Design.USEFUL_LOAD_MASS, 483543.0927945, 'lbm') diff --git a/aviary/validation_cases/validation_data/test_data/bwb_simple_FLOPS_data.py b/aviary/validation_cases/validation_data/test_data/bwb_simple_FLOPS_data.py index 6561c97d7..949526a03 100644 --- a/aviary/validation_cases/validation_data/test_data/bwb_simple_FLOPS_data.py +++ b/aviary/validation_cases/validation_data/test_data/bwb_simple_FLOPS_data.py @@ -370,7 +370,7 @@ outputs.set_val(Aircraft.Wing.WETTED_AREA, 33816.732336575638, 'ft**2') # SWET(1) outputs.set_val(Aircraft.Wing.SPAN, 238.08, 'ft') # SPAN = WF+OSSPAN*2 -outputs.set_val(Mission.USEFUL_LOAD, 21427.61093929, 'lbm') +outputs.set_val(Mission.OPERATING_ITEMS_MASS, 21427.61093929, 'lbm') outputs.set_val(Aircraft.Design.MACH, 0.800) outputs.set_val(Mission.OPERATING_MASS, 455464.65969526308, 'lbm') # WOWE diff --git a/aviary/validation_cases/validation_data/test_data/large_single_aisle_1_FLOPS_data.py b/aviary/validation_cases/validation_data/test_data/large_single_aisle_1_FLOPS_data.py index 4503a5c46..387cebff0 100644 --- a/aviary/validation_cases/validation_data/test_data/large_single_aisle_1_FLOPS_data.py +++ b/aviary/validation_cases/validation_data/test_data/large_single_aisle_1_FLOPS_data.py @@ -262,7 +262,7 @@ outputs.set_val(Aircraft.Design.EMPENNAGE_MASS, 3052.8, 'lbm') outputs.set_val(Aircraft.Design.STRUCTURE_MASS, 50736.0, 'lbm') outputs.set_val(Aircraft.Design.SYSTEMS_AND_EQUIPMENT_MASS, 25169.0, 'lbm') -outputs.set_val(Mission.USEFUL_LOAD, 5969.278, 'lbm') +outputs.set_val(Mission.OPERATING_ITEMS_MASS, 5969.278, 'lbm') outputs.set_val(Aircraft.Design.TOTAL_WETTED_AREA, 8275.86, 'ft**2') outputs.set_val(Mission.ZERO_FUEL_MASS, 135848.0, 'lbm') diff --git a/aviary/validation_cases/validation_data/test_data/large_single_aisle_2_FLOPS_data.py b/aviary/validation_cases/validation_data/test_data/large_single_aisle_2_FLOPS_data.py index ae3a470f3..218e67966 100644 --- a/aviary/validation_cases/validation_data/test_data/large_single_aisle_2_FLOPS_data.py +++ b/aviary/validation_cases/validation_data/test_data/large_single_aisle_2_FLOPS_data.py @@ -261,7 +261,7 @@ outputs.set_val(Aircraft.Design.TOUCHDOWN_MASS_MAX, 146328.0, 'lbm') outputs.set_val(Mission.OPERATING_MASS, 95007.0, 'lbm') outputs.set_val(Aircraft.Design.EMPENNAGE_MASS, 2967.4, 'lbm') -outputs.set_val(Mission.USEFUL_LOAD, 6760.42285438, 'lbm') +outputs.set_val(Mission.OPERATING_ITEMS_MASS, 6760.42285438, 'lbm') outputs.set_val(Aircraft.Propulsion.MASS, 19232.0, 'lbm') outputs.set_val(Aircraft.Design.STRUCTURE_MASS, 44389.0, 'lbm') outputs.set_val(Aircraft.Design.SYSTEMS_AND_EQUIPMENT_MASS, 24174.0, 'lbm') diff --git a/aviary/validation_cases/validation_data/test_data/large_single_aisle_2_altwt_FLOPS_data.py b/aviary/validation_cases/validation_data/test_data/large_single_aisle_2_altwt_FLOPS_data.py index d6b2f4066..3e2989e38 100644 --- a/aviary/validation_cases/validation_data/test_data/large_single_aisle_2_altwt_FLOPS_data.py +++ b/aviary/validation_cases/validation_data/test_data/large_single_aisle_2_altwt_FLOPS_data.py @@ -271,7 +271,7 @@ sys_equip_mass = 32232.0 sys_equip_mass_units = 'lbm' outputs.set_val(Aircraft.Design.SYSTEMS_AND_EQUIPMENT_MASS, sys_equip_mass, sys_equip_mass_units) -outputs.set_val(Mission.USEFUL_LOAD, 10071.93, 'lbm') +outputs.set_val(Mission.OPERATING_ITEMS_MASS, 10071.93, 'lbm') outputs.set_val(Aircraft.Design.TOTAL_WETTED_AREA, 8319.07, 'ft**2') outputs.set_val(Mission.ZERO_FUEL_MASS, 142837.0, 'lbm') diff --git a/aviary/validation_cases/validation_data/test_data/large_single_aisle_2_detailwing_FLOPS_data.py b/aviary/validation_cases/validation_data/test_data/large_single_aisle_2_detailwing_FLOPS_data.py index a1d5085d3..6454f54a3 100644 --- a/aviary/validation_cases/validation_data/test_data/large_single_aisle_2_detailwing_FLOPS_data.py +++ b/aviary/validation_cases/validation_data/test_data/large_single_aisle_2_detailwing_FLOPS_data.py @@ -260,7 +260,7 @@ outputs.set_val(Aircraft.Propulsion.MASS, 19232.0, 'lbm') outputs.set_val(Aircraft.Design.STRUCTURE_MASS, 44648.0, 'lbm') outputs.set_val(Aircraft.Design.SYSTEMS_AND_EQUIPMENT_MASS, 24174.0, 'lbm') -outputs.set_val(Mission.USEFUL_LOAD, 6760.42285438, 'lbm') +outputs.set_val(Mission.OPERATING_ITEMS_MASS, 6760.42285438, 'lbm') outputs.set_val(Aircraft.Design.TOTAL_WETTED_AREA, 8319.07, 'ft**2') outputs.set_val(Mission.ZERO_FUEL_MASS, 131744.0, 'lbm') diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index 4ef9a792b..5a81d359d 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -1784,6 +1784,16 @@ default_value=False, ) +add_meta_data( + Aircraft.Design.USEFUL_LOAD_MASS, + meta_data=_MetaData, + historical_name={'GASP': None, 'FLOPS': None}, + units='lbm', + desc='Useful load of the aircraft calculated as ' + 'Aircraft.Design.GROSS_MASS - Aircraft.Design.EMPTY_MASS', +) + + add_meta_data( Aircraft.Design.WETTED_AREAS, meta_data=_MetaData, @@ -6859,6 +6869,15 @@ 'May differ from Aircraft.Design.GROSS_MASS for off-design missions.', ) +add_meta_data( + Mission.OPERATING_ITEMS_MASS, + meta_data=_MetaData, + historical_name={'GASP': 'INGASP.WFUL', 'FLOPS': None}, + units='lbm', + desc='Operating Items group. Includes crew, unusable fuel, and oil mass.', + default_value=0.0, +) + add_meta_data( Mission.OPERATING_MASS, meta_data=_MetaData, @@ -6933,15 +6952,6 @@ default_value=0, ) -add_meta_data( - Mission.USEFUL_LOAD, - meta_data=_MetaData, - historical_name={'GASP': 'INGASP.WFUL', 'FLOPS': None}, - units='lbm', - desc='Useful load group. Includes crew, unusable fuel, and oil mass.', - default_value=0.0, -) - add_meta_data( Mission.ZERO_FUEL_MASS, meta_data=_MetaData, diff --git a/aviary/variable_info/variables.py b/aviary/variable_info/variables.py index 1a2bc48df..8d82233cd 100644 --- a/aviary/variable_info/variables.py +++ b/aviary/variable_info/variables.py @@ -176,6 +176,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' + USEFUL_LOAD_MASS = 'aircraft:design:useful_load_mass' WETTED_AREAS = 'aircraft:design:wetted_areas' WING_LOADING = 'aircraft:design:wing_loading' ZERO_LIFT_DRAG_COEFF_FACTOR = 'aircraft:design:zero_lift_drag_coeff_factor' @@ -672,6 +673,7 @@ class Mission: FINAL_TIME = 'mission:final_time' FUEL = 'mission:fuel' GROSS_MASS = 'mission:gross_mass' + OPERATING_ITEMS_MASS = 'mission:operating_items_mass' OPERATING_MASS = 'mission:operating_mass' RANGE = 'mission:range' RESERVE_FUEL = 'mission:reserve_fuel' @@ -679,7 +681,6 @@ class Mission: RESERVE_FUEL_MARGIN = 'mission:reserve_fuel_margin' TOTAL_FUEL = 'mission:total_fuel' TOTAL_RESERVE_FUEL = 'mission:total_reserve_fuel' - USEFUL_LOAD = 'mission:useful_load' ZERO_FUEL_MASS = 'mission:zero_fuel_mass' class Constraints: