# This file is part of FAST-OAD_CS23-HE : A framework for rapid Overall Aircraft Design of Hybrid
# Electric Aircraft.
# Copyright (C) 2022 ISAE-SUPAERO
import numpy as np
import openmdao.api as om
[docs]
class LCAFuselageWeightPerFU(om.ExplicitComponent):
[docs]
def initialize(self):
self.options.declare(
name="airframe_material",
default="aluminium",
desc="Material used for the airframe which include wing, fuselage, HTP and VTP. LG will"
" always be in aluminium and flight controls in steel",
allow_none=False,
values=["aluminium", "composite"],
)
[docs]
def setup(self):
self.add_input("data:weight:airframe:fuselage:mass", val=np.nan, units="kg")
self.add_input("data:environmental_impact:aircraft_per_fu", val=np.nan)
if self.options["airframe_material"] == "aluminium":
self.add_input(
"data:environmental_impact:buy_to_fly:metallic",
val=1.0,
desc="Ratio of the amount of material purchased to to what is really put into the "
"manufactured parts. Typical value for metallic material is between 5 and 10",
)
else:
self.add_input(
"data:environmental_impact:buy_to_fly:composite",
val=1.0,
desc="Ratio of the amount of material purchased to to what is really put into the "
"manufactured parts. Typical value for composite material is between 1 and 2",
)
self.add_output("data:weight:airframe:fuselage:mass_per_fu", val=1e-6, units="kg")
self.declare_partials(of="*", wrt="*", method="exact")
[docs]
def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None):
if self.options["airframe_material"] == "aluminium":
buy_to_fly = inputs["data:environmental_impact:buy_to_fly:metallic"]
else:
buy_to_fly = inputs["data:environmental_impact:buy_to_fly:composite"]
outputs["data:weight:airframe:fuselage:mass_per_fu"] = (
inputs["data:weight:airframe:fuselage:mass"]
* inputs["data:environmental_impact:aircraft_per_fu"]
* buy_to_fly
)
[docs]
def compute_partials(self, inputs, partials, discrete_inputs=None):
if self.options["airframe_material"] == "aluminium":
buy_to_fly = inputs["data:environmental_impact:buy_to_fly:metallic"]
partials[
"data:weight:airframe:fuselage:mass_per_fu",
"data:environmental_impact:buy_to_fly:metallic",
] = (
inputs["data:weight:airframe:fuselage:mass"]
* inputs["data:environmental_impact:aircraft_per_fu"]
)
else:
buy_to_fly = inputs["data:environmental_impact:buy_to_fly:composite"]
partials[
"data:weight:airframe:fuselage:mass_per_fu",
"data:environmental_impact:buy_to_fly:composite",
] = (
inputs["data:weight:airframe:fuselage:mass"]
* inputs["data:environmental_impact:aircraft_per_fu"]
)
partials[
"data:weight:airframe:fuselage:mass_per_fu", "data:weight:airframe:fuselage:mass"
] = inputs["data:environmental_impact:aircraft_per_fu"] * buy_to_fly
partials[
"data:weight:airframe:fuselage:mass_per_fu", "data:environmental_impact:aircraft_per_fu"
] = inputs["data:weight:airframe:fuselage:mass"] * buy_to_fly