diff --git a/aviary/mission/height_energy_problem_configurator.py b/aviary/mission/height_energy_problem_configurator.py index 4e836111a3..d8de503c0d 100644 --- a/aviary/mission/height_energy_problem_configurator.py +++ b/aviary/mission/height_energy_problem_configurator.py @@ -394,7 +394,11 @@ def add_post_mission_systems(self, aviary_group): ) if aviary_group.post_mission_info['include_landing']: - self._add_landing_systems(aviary_group) + if 'aircraft:wing:area' in aviary_group.aviary_inputs: + self._add_landing_systems(aviary_group) + else: + print('Aircraft.Wing.AREA is not given. Set include_landing = False') + aviary_group.post_mission_info['include_landing'] = False aviary_group.add_subsystem( 'range_constraint', diff --git a/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS.csv b/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS.csv index a31df113e3..d49cb432a6 100644 --- a/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS.csv +++ b/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS.csv @@ -15,7 +15,7 @@ aircraft:crew_and_payload:baggage_mass_per_passenger,44.0,lbm aircraft:crew_and_payload:cargo_container_mass_scaler,1.0,unitless aircraft:crew_and_payload:design:num_business_class,100,unitless aircraft:crew_and_payload:design:num_first_class,28,unitless -aircraft:crew_and_payload:design:num_passengers,468,unitless +# aircraft:crew_and_payload:design:num_passengers,468,unitless aircraft:crew_and_payload:design:num_economy_class,340,unitless aircraft:crew_and_payload:design:num_seats_abreast_business,4,unitless aircraft:crew_and_payload:design:num_seats_abreast_first,4,unitless @@ -27,12 +27,12 @@ aircraft:crew_and_payload:design:seat_pitch_economy,32,inch aircraft:crew_and_payload:flight_crew_mass_scaler,1.0,unitless aircraft:crew_and_payload:misc_cargo,0.0,lbm aircraft:crew_and_payload:mass_per_passenger,165.0,lbm -aircraft:crew_and_payload:num_business_class,100,unitless -aircraft:crew_and_payload:num_first_class,28,unitless aircraft:crew_and_payload:num_flight_attendants,22,unitless aircraft:crew_and_payload:num_flight_crew,2,unitless aircraft:crew_and_payload:num_galley_crew,2,unitless -aircraft:crew_and_payload:num_passengers,468,unitless +aircraft:crew_and_payload:num_business_class,100,unitless +aircraft:crew_and_payload:num_first_class,28,unitless +# aircraft:crew_and_payload:num_passengers,468,unitless aircraft:crew_and_payload:num_economy_class,340,unitless aircraft:crew_and_payload:passenger_service_mass_scaler,1.0,unitless aircraft:crew_and_payload:wing_cargo,0.0,lbm @@ -41,6 +41,12 @@ aircraft:design:empty_mass_margin_scaler,0.0,unitless aircraft:design:landing_to_takeoff_mass_ratio,0.8,unitless aircraft:design:lift_dependent_drag_coeff_factor,1.0,unitless aircraft:design:subsonic_drag_coeff_factor,1.0,unitless + +# TODO: Needed to reduce the drag so that engine wasn't full throttle in cruise. +# There must be something about drag that still isn't working for BWB. +aircraft:design:subsonic_drag_coeff_factor,0.7,unitless +# aircraft:design:subsonic_drag_coeff_factor,1.0,unitless + aircraft:design:supersonic_drag_coeff_factor,1.0,unitless aircraft:design:type,BWB,unitless aircraft:design:use_alt_mass,False,unitless @@ -59,7 +65,7 @@ aircraft:engine:geopotential_alt,False,unitless aircraft:engine:ignore_negative_thrust,False,unitless aircraft:engine:interpolation_method,slinear,unitless aircraft:engine:mass_scaler,1,unitless -aircraft:engine:num_engines,3,unitless +# aircraft:engine:num_engines,3,unitless aircraft:engine:num_fuselage_engines,3,unitless aircraft:engine:num_wing_engines,0,unitless aircraft:engine:reference_mass,22017.0,lbm @@ -98,8 +104,8 @@ aircraft:horizontal_tail:taper_ratio,0.0,unitless aircraft:horizontal_tail:thickness_to_chord,0.11,unitless aircraft:horizontal_tail:vertical_tail_fraction,0.0,unitless aircraft:horizontal_tail:wetted_area_scaler,1.0,unitless -aircraft:hydraulics:system_pressure,3000.0,psi aircraft:hydraulics:mass_scaler,1.0,unitless +aircraft:hydraulics:system_pressure,3000.0,psi aircraft:instruments:mass_scaler,1.0,unitless aircraft:landing_gear:main_gear_oleo_length,85.0,inch aircraft:landing_gear:main_gear_mass_scaler,1.0,unitless @@ -152,7 +158,6 @@ aircraft:wing:var_sweep_mass_penalty,0.0,unitless aircraft:wing:wetted_area_scaler,1.0,unitless mission:constraints:max_mach,0.85,unitless mission:design:gross_mass,874099,lbm -mission:design:lift_coefficient,-1.0,unitless mission:design:range,7750,NM mission:design:thrust_takeoff_per_eng,0.25,lbf mission:landing:initial_velocity,140,ft/s @@ -164,6 +169,7 @@ mission:summary:fuel_flow_scaler,1.0,unitless settings:aerodynamics_method,FLOPS,unitless settings:equations_of_motion,height_energy,unitless settings:mass_method,FLOPS,unitless +settings:verbosity,1,unitless # Unconverted Values AERIN.FLLDG,11000 diff --git a/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS.in b/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS.in new file mode 100644 index 0000000000..e072d16819 --- /dev/null +++ b/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS.in @@ -0,0 +1,190 @@ +468 passenger BWB - Based on Boeing BWB450-1U, Karl Geiselhart + + $OPTION +MPRINT=1, +IOPT=1, +IANAL=3, +INENG=1, +ICOST=0, +ITAKOF=0, +ILAND=0, +NOPRO=0, +NOISE=0, +IFITE=3, +IXFL=1, +IPOLP=0, +IPLTTH=0, + $END + + $WTIN +DGW=874099, +VMMO=0.85, +DIH=3, +FLAPR=0.333, +GLOV=121.05, +VARSWP=0, +FCOMP=1, +FAERT=0, +FSTRT=0, +NETAW=14, +ETAW=0.35,0.4,0.45,0.5,0.55,0.6,0.6499,0.7,0.75,0.8,0.85,0.8999,0.95,1, +CHD=58.03,0.4491,0.3884,0.3317,0.2886,0.2537,0.2269,0.2121,0.1983,0.1843,0.1704,0.1565,0.1426,0.1287, +TOC=0.15,0.1132,0.0928,0.0822,0.0764,0.0742,0.0746,0.0758,0.0758,0.0756,0.0756,0.0758,0.076,0.076, +SWL=0,0,0,0,0,0,0,42.9,42.9,42.9,42.9,42.9,42.9,42.9,0,0,0,0,0,0, +SHT=0, +SWPHT=0, +ARHT=0, +TRHT=0, +TCHT=0, +NVERT=0, +NFIN=2, +SFIN=184.89, +ARFIN=1.952, +TRFIN=0.464, +SWPFIN=39.42, +TCFIN=0.08, +NFUSE=1, +XL=0, ! XL=137.5 for fixed geom. +WF=0, ! WF=64.58 +DF=0, ! DF=17 +XLP=0, ! XLP=40 +XMLG=85, +XNLG=87, +CARBAS=0, +NEW=0, +NEF=3, +THRSO=86459.2, +WENG=22017, +EEXP=1, +WINL=0, +XNAC=17.433, +DNAC=12.608, +NPF=28, +NPB=100, +NPT=340, +NSTU=22, +NFLCR=2, +CARGF=0, +FRWI=1, +FRHT=1, +FRVT=1, +FRFU=1, +FRNA=0, +WTHR=0, +WPMSC=0, +WHYD=1, +WAVONC=1, +WFURN=1, +ISPOWE=0, + $END + + $FUSEIN +ACABIN=0, +FPITCH=61, +NFABR=4, +BPITCH=39, +NBABR=4, +TPITCH=32, +NTABR=6, +OSSPAN=86.75, + $END + $CONFIN +DESRNG=7750, +OFG=1, +OFF=0, +GW=874099, +AR=7.557,0, +THRUST=70000,1,0,0,0,0, +SW=7621.66,1, +TR=0.311, +SWEEP=35.7, +TCA=0.11, +VCMN=0.85, +CH=39000, + $END + + $AERIN +MYAERO=0, +ITPAER=2, +CAM=2, +AITEK=2, +XLLAM=0, +E=0, +WRATIO=0.8, +VAPPR=140, +FLTO=11000, +FLLDG=11000, +THROFF=0.25, + $END + + $ENGDIN +IGENEN=-1, +EIFILE='ENGDEK', +IDLE=1, +MAXCR=1, +NOX=1, + $END + + $MISSIN +FCDO=1, +FCDI=1, +ISKAL=1, +IFLAG=2, +MSUMPT=1, +IRW=2, +IATA=0, +NPCON=1, +TAKOTM=2, +TAXOTM=9, +APPRTM=4, +TAXITM=5, +ITTFF=1, +NCLIMB=1, +CLAMIN=0, +FWF=-0.001, +NCRUSE=3, +IOC=1,4,4, +CRMACH=0.85,0.6,0, +CRALT=45000,25000,1500, +RCIN=300, +IVS=1, +DEAMIN=0, +IRS=1, +RESTRP=0.05, +TIMMAP=2, +ALTRAN=200, +NCLRES=1, +NCRRES=2, +HOLDTM=30, +NCRHOL=3, +IHOPOS=1, +THOLD=0.1, +NCRTH=1, + $END +START +CLIMB +CRUISE +DESCENT +END + + $PCONIN +CONALT=35000, +CONMCH=0.85, +CONPC=1, +ICONSG=2, +CONLIM=300, +ICONTP=5, + $END + + $RERUN + $END + + $MISSIN +IRW=1, +NPCON=0, + $END +START +CLIMB +CRUISE +DESCENT +END diff --git a/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS_data.py b/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS_data.py index 7fc28bc94b..3c21bf1702 100644 --- a/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS_data.py +++ b/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS_data.py @@ -20,7 +20,6 @@ inputs.set_val(Aircraft.Design.SUPERSONIC_DRAG_COEFF_FACTOR, 1.0) # FCDSUP inputs.set_val(Aircraft.Design.ZERO_LIFT_DRAG_COEFF_FACTOR, 1.0) # FCDO inputs.set_val(Aircraft.Design.TYPE, AircraftTypes.BLENDED_WING_BODY) -inputs.set_val(Mission.Design.LIFT_COEFFICIENT, -1.0) # FCLDES inputs.set_val(Aircraft.Fuselage.SIMPLE_LAYOUT, False) inputs.set_val(Aircraft.BWB.DETAILED_WING_PROVIDED, True) @@ -50,11 +49,11 @@ # --------------------------- inputs.set_val(Aircraft.CrewPayload.Design.NUM_BUSINESS_CLASS, 100) # NPB inputs.set_val(Aircraft.CrewPayload.Design.NUM_FIRST_CLASS, 28) # NPF -inputs.set_val(Aircraft.CrewPayload.Design.NUM_PASSENGERS, 468, units='unitless') # NPB+NPF+NPT +# inputs.set_val(Aircraft.CrewPayload.Design.NUM_PASSENGERS, 468, units='unitless') # NPB+NPF+NPT inputs.set_val(Aircraft.CrewPayload.Design.NUM_ECONOMY_CLASS, 340) # NPT inputs.set_val(Aircraft.CrewPayload.NUM_BUSINESS_CLASS, 100) # NPB inputs.set_val(Aircraft.CrewPayload.NUM_FIRST_CLASS, 28) # NPF -inputs.set_val(Aircraft.CrewPayload.NUM_PASSENGERS, 468, units='unitless') # sum of three classes +# inputs.set_val(Aircraft.CrewPayload.NUM_PASSENGERS, 468, units='unitless') # sum of three classes inputs.set_val(Aircraft.CrewPayload.NUM_ECONOMY_CLASS, 340) # NPT inputs.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_BUSINESS, 4) # NBABR inputs.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_FIRST, 4) # NFABR @@ -89,13 +88,13 @@ # Fuel # --------------------------- inputs.set_val(Aircraft.Fuel.AUXILIARY_FUEL_CAPACITY, 0.0, 'lbm') # FULAUX -inputs.set_val(Aircraft.Fuel.DENSITY, 6.7, 'lbm/galUS') # FULDEN inputs.set_val(Aircraft.Fuel.FUEL_SYSTEM_MASS_SCALER, 1.0) # WFSYS inputs.set_val(Aircraft.Fuel.FUSELAGE_FUEL_CAPACITY, 0.0, 'lbm') # FULFMX inputs.set_val(Aircraft.Fuel.NUM_TANKS, 7) # NTANK inputs.set_val(Aircraft.Fuel.UNUSABLE_FUEL_MASS_SCALER, 1.0) # WUF inputs.set_val(Aircraft.Fuel.IGNORE_FUEL_CAPACITY_CONSTRAINT, False) # IFUFU inputs.set_val(Aircraft.Fuel.WING_FUEL_FRACTION, 0.68835495693, 'unitless') +inputs.set_val(Aircraft.Fuel.DENSITY, 6.7, 'lbm/galUS') # Furnishings # --------------------------- @@ -114,7 +113,7 @@ # Horizontal Tail # --------------------------- inputs.set_val(Aircraft.HorizontalTail.AREA, 0.0, 'ft**2') # SHT -inputs.set_val(Aircraft.HorizontalTail.ASPECT_RATIO, 0.1) # SHT +inputs.set_val(Aircraft.HorizontalTail.ASPECT_RATIO, 0.1) # ARHT inputs.set_val(Aircraft.HorizontalTail.TAPER_RATIO, 0.0) # TRHT inputs.set_val(Aircraft.HorizontalTail.THICKNESS_TO_CHORD, 0.11) # TCHT # inputs.set_val(Aircraft.HorizontalTail.VERTICAL_TAIL_FRACTION, 0.0) # HHT @@ -159,7 +158,7 @@ inputs.set_val(Aircraft.Engine.REFERENCE_MASS, 22017, 'lbm') # WENG inputs.set_val(Aircraft.Engine.SCALED_SLS_THRUST, 70000.0, 'lbf') # THRUST inputs.set_val(Aircraft.Engine.REFERENCE_SLS_THRUST, 86459.2, 'lbf') # THRSO -inputs.set_val(Aircraft.Engine.NUM_ENGINES, np.array([3])) # NEW+NEF +# inputs.set_val(Aircraft.Engine.NUM_ENGINES, np.array([3])) # NEW+NEF inputs.set_val(Aircraft.Engine.NUM_FUSELAGE_ENGINES, 3) # NEF inputs.set_val(Aircraft.Engine.NUM_WING_ENGINES, np.array([0])) # NEW inputs.set_val(Aircraft.Engine.THRUST_REVERSERS_MASS_SCALER, 0.0) # WTHR diff --git a/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS.csv b/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS.csv index 4ca45ca361..b1ff61b829 100644 --- a/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS.csv +++ b/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS.csv @@ -15,7 +15,7 @@ aircraft:crew_and_payload:baggage_mass_per_passenger,44.0,lbm aircraft:crew_and_payload:cargo_container_mass_scaler,1.0,unitless aircraft:crew_and_payload:design:num_business_class,100,unitless aircraft:crew_and_payload:design:num_first_class,28,unitless -aircraft:crew_and_payload:design:num_passengers,468,unitless +# aircraft:crew_and_payload:design:num_passengers,468,unitless aircraft:crew_and_payload:design:num_economy_class,340,unitless aircraft:crew_and_payload:design:num_seats_abreast_business,4,unitless aircraft:crew_and_payload:design:num_seats_abreast_first,4,unitless @@ -27,12 +27,12 @@ aircraft:crew_and_payload:design:seat_pitch_economy,32,inch aircraft:crew_and_payload:flight_crew_mass_scaler,1.0,unitless aircraft:crew_and_payload:misc_cargo,0.0,lbm aircraft:crew_and_payload:mass_per_passenger,165.0,lbm -aircraft:crew_and_payload:num_business_class,100,unitless -aircraft:crew_and_payload:num_first_class,28,unitless aircraft:crew_and_payload:num_flight_attendants,22,unitless aircraft:crew_and_payload:num_flight_crew,2,unitless aircraft:crew_and_payload:num_galley_crew,2,unitless -aircraft:crew_and_payload:num_passengers,468,unitless +# aircraft:crew_and_payload:num_passengers,468,unitless +aircraft:crew_and_payload:num_business_class,100,unitless +aircraft:crew_and_payload:num_first_class,28,unitless aircraft:crew_and_payload:num_economy_class,340,unitless aircraft:crew_and_payload:passenger_service_mass_scaler,1.0,unitless aircraft:crew_and_payload:wing_cargo,0.0,lbm @@ -41,6 +41,12 @@ aircraft:design:empty_mass_margin_scaler,0.0,unitless aircraft:design:landing_to_takeoff_mass_ratio,0.8,unitless aircraft:design:lift_dependent_drag_coeff_factor,1.0,unitless aircraft:design:subsonic_drag_coeff_factor,1.0,unitless + +# TODO: Needed to reduce the drag so that engine wasn't full throttle in cruise. +# There must be something about drag that still isn't working for BWB. +aircraft:design:subsonic_drag_coeff_factor,0.7,unitless +# aircraft:design:subsonic_drag_coeff_factor,1.0,unitless + aircraft:design:supersonic_drag_coeff_factor,1.0,unitless aircraft:design:type,BWB,unitless aircraft:design:use_alt_mass,False,unitless @@ -59,7 +65,7 @@ aircraft:engine:geopotential_alt,False,unitless aircraft:engine:ignore_negative_thrust,False,unitless aircraft:engine:interpolation_method,slinear,unitless aircraft:engine:mass_scaler,1,unitless -aircraft:engine:num_engines,3,unitless +# aircraft:engine:num_engines,3,unitless aircraft:engine:num_fuselage_engines,3,unitless aircraft:engine:num_wing_engines,0,unitless aircraft:engine:reference_mass,22017.0,lbm @@ -100,8 +106,8 @@ aircraft:horizontal_tail:taper_ratio,0.0,unitless aircraft:horizontal_tail:thickness_to_chord,0.11,unitless aircraft:horizontal_tail:vertical_tail_fraction,0.0,unitless aircraft:horizontal_tail:wetted_area_scaler,1.0,unitless -aircraft:hydraulics:system_pressure,3000.0,psi aircraft:hydraulics:mass_scaler,1.0,unitless +aircraft:hydraulics:system_pressure,3000.0,psi aircraft:instruments:mass_scaler,1.0,unitless aircraft:landing_gear:main_gear_oleo_length,85.0,inch aircraft:landing_gear:main_gear_mass_scaler,1.0,unitless @@ -151,7 +157,6 @@ aircraft:wing:var_sweep_mass_penalty,0.0,unitless aircraft:wing:wetted_area_scaler,1.0,unitless mission:constraints:max_mach,0.85,unitless mission:design:gross_mass,874099,lbm -mission:design:lift_coefficient,-1.0,unitless mission:design:range,7750,NM mission:design:thrust_takeoff_per_eng,0.25,lbf mission:landing:initial_velocity,140,ft/s @@ -163,6 +168,7 @@ mission:summary:fuel_flow_scaler,1.0,unitless settings:aerodynamics_method,FLOPS,unitless settings:equations_of_motion,height_energy,unitless settings:mass_method,FLOPS,unitless +settings:verbosity,1,unitless # Unconverted Values AERIN.FLLDG,11000 diff --git a/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS.in b/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS.in new file mode 100644 index 0000000000..53d81a10a6 --- /dev/null +++ b/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS.in @@ -0,0 +1,186 @@ +468 passenger BWB - Based on Boeing BWB450-1U, Karl Geiselhart + + $OPTION +MPRINT=1, +IOPT=1, +IANAL=3, +INENG=1, +ICOST=0, +ITAKOF=0, +ILAND=0, +NOPRO=0, +NOISE=0, +IFITE=3, +IXFL=1, +IPOLP=0, +IPLTTH=0, + $END + + $WTIN +DGW=874099, +VMMO=0.85, +DIH=3, +FLAPR=0.333, +GLOV=121.05, +VARSWP=0, +FCOMP=1, +FAERT=0, +FSTRT=0, +NETAW=0, +SHT=0, +SWPHT=0, +ARHT=0, +TRHT=0, +TCHT=0, +NVERT=0, +NFIN=2, +SFIN=184.89, +ARFIN=1.952, +TRFIN=0.464, +SWPFIN=39.42, +TCFIN=0.08, +NFUSE=1, +XL=137.5, ! XL=137.5 for fixed geom. +WF=64.58 +DF=0, ! DL=17 +XLP=0, ! XLP=40 +XMLG=85, +XNLG=87, +CARBAS=0, +NEW=0, +NEF=3, +THRSO=86459.2, +WENG=22017, +EEXP=1, +WINL=0, +XNAC=17.433, +DNAC=12.608, +NPF=28, +NPB=100, +NPT=340, +NSTU=22, +NFLCR=2, +CARGF=0, +FRWI=1, +FRHT=1, +FRVT=1, +FRFU=1, +FRNA=0, +WTHR=0, +WPMSC=0, +WHYD=1, +WAVONC=1, +WFURN=1, +ISPOWE=0, + $END + + $FUSEIN +ACABIN=0, +FPITCH=61, +NFABR=4, +BPITCH=39, +NBABR=4, +TPITCH=32, +NTABR=6, +OSSPAN=86.75, + $END + $CONFIN +DESRNG=7750, +OFG=1, +OFF=0, +GW=874099, +AR=7.557,0, +THRUST=70000,1,0,0,0,0, +SW=7621.66,1, +TR=0.311, +SWEEP=35.7, +TCA=0.11, +VCMN=0.85, +CH=39000, + $END + + $AERIN +MYAERO=0, +ITPAER=2, +CAM=2, +AITEK=2, +XLLAM=0, +E=0, +WRATIO=0.8, +VAPPR=140, +FLTO=11000, +FLLDG=11000, +THROFF=0.25, + $END + + $ENGDIN +IGENEN=-1, +EIFILE='ENGDEK', +IDLE=1, +MAXCR=1, +NOX=1, + $END + + $MISSIN +FCDO=1, +FCDI=1, +ISKAL=1, +IFLAG=2, +MSUMPT=1, +IRW=2, +IATA=0, +NPCON=1, +TAKOTM=2, +TAXOTM=9, +APPRTM=4, +TAXITM=5, +ITTFF=1, +NCLIMB=1, +CLAMIN=0, +FWF=-0.001, +NCRUSE=3, +IOC=1,4,4, +CRMACH=0.85,0.6,0, +CRALT=45000,25000,1500, +RCIN=300, +IVS=1, +DEAMIN=0, +IRS=1, +RESTRP=0.05, +TIMMAP=2, +ALTRAN=200, +NCLRES=1, +NCRRES=2, +HOLDTM=30, +NCRHOL=3, +IHOPOS=1, +THOLD=0.1, +NCRTH=1, + $END +START +CLIMB +CRUISE +DESCENT +END + + $PCONIN +CONALT=35000, +CONMCH=0.85, +CONPC=1, +ICONSG=2, +CONLIM=300, +ICONTP=5, + $END + + $RERUN + $END + + $MISSIN +IRW=1, +NPCON=0, + $END +START +CLIMB +CRUISE +DESCENT +END diff --git a/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS_data.py b/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS_data.py index 2cb2018976..516de7c234 100644 --- a/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS_data.py +++ b/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS_data.py @@ -20,7 +20,6 @@ inputs.set_val(Aircraft.Design.SUPERSONIC_DRAG_COEFF_FACTOR, 1.0) # FCDSUP inputs.set_val(Aircraft.Design.ZERO_LIFT_DRAG_COEFF_FACTOR, 1.0) # FCDO inputs.set_val(Aircraft.Design.TYPE, AircraftTypes.BLENDED_WING_BODY) -inputs.set_val(Mission.Design.LIFT_COEFFICIENT, -1.0) # FCLDES inputs.set_val(Aircraft.Fuselage.SIMPLE_LAYOUT, True) inputs.set_val(Aircraft.BWB.DETAILED_WING_PROVIDED, False) @@ -50,11 +49,11 @@ # --------------------------- inputs.set_val(Aircraft.CrewPayload.Design.NUM_BUSINESS_CLASS, 100) # NPB inputs.set_val(Aircraft.CrewPayload.Design.NUM_FIRST_CLASS, 28) # NPF -inputs.set_val(Aircraft.CrewPayload.Design.NUM_PASSENGERS, 468, units='unitless') # NPB+NPF+NPT +# inputs.set_val(Aircraft.CrewPayload.Design.NUM_PASSENGERS, 468, units='unitless') # NPB+NPF+NPT inputs.set_val(Aircraft.CrewPayload.Design.NUM_ECONOMY_CLASS, 340) # NPT inputs.set_val(Aircraft.CrewPayload.NUM_BUSINESS_CLASS, 100) # NPB inputs.set_val(Aircraft.CrewPayload.NUM_FIRST_CLASS, 28) # NPF -inputs.set_val(Aircraft.CrewPayload.NUM_PASSENGERS, 468, units='unitless') # sum of three classes +# inputs.set_val(Aircraft.CrewPayload.NUM_PASSENGERS, 468, units='unitless') # sum of three classes inputs.set_val(Aircraft.CrewPayload.NUM_ECONOMY_CLASS, 340) # NPT inputs.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_BUSINESS, 4) # NBABR inputs.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_FIRST, 4) # NFABR @@ -89,13 +88,13 @@ # Fuel # --------------------------- inputs.set_val(Aircraft.Fuel.AUXILIARY_FUEL_CAPACITY, 0.0, 'lbm') # FULAUX -inputs.set_val(Aircraft.Fuel.DENSITY, 6.7, 'lbm/galUS') # FULDEN inputs.set_val(Aircraft.Fuel.FUEL_SYSTEM_MASS_SCALER, 1.0) # WFSYS inputs.set_val(Aircraft.Fuel.FUSELAGE_FUEL_CAPACITY, 0.0, 'lbm') # FULFMX inputs.set_val(Aircraft.Fuel.NUM_TANKS, 7) # NTANK inputs.set_val(Aircraft.Fuel.UNUSABLE_FUEL_MASS_SCALER, 1.0) # WUF inputs.set_val(Aircraft.Fuel.IGNORE_FUEL_CAPACITY_CONSTRAINT, False) # IFUFU inputs.set_val(Aircraft.Fuel.WING_FUEL_FRACTION, 0.68835495693, 'unitless') +inputs.set_val(Aircraft.Fuel.DENSITY, 6.7, 'lbm/galUS') # Furnishings # --------------------------- @@ -116,7 +115,7 @@ # Horizontal Tail # --------------------------- inputs.set_val(Aircraft.HorizontalTail.AREA, 0.0, 'ft**2') # SHT -inputs.set_val(Aircraft.HorizontalTail.ASPECT_RATIO, 0.1) # SHT +inputs.set_val(Aircraft.HorizontalTail.ASPECT_RATIO, 0.1) # ARHT inputs.set_val(Aircraft.HorizontalTail.TAPER_RATIO, 0.0) # TRHT inputs.set_val(Aircraft.HorizontalTail.THICKNESS_TO_CHORD, 0.11) # TCHT # inputs.set_val(Aircraft.HorizontalTail.VERTICAL_TAIL_FRACTION, 0.0) # HHT @@ -161,7 +160,7 @@ inputs.set_val(Aircraft.Engine.REFERENCE_MASS, 22017, 'lbm') # WENG inputs.set_val(Aircraft.Engine.SCALED_SLS_THRUST, 70000.0, 'lbf') # THRUST inputs.set_val(Aircraft.Engine.REFERENCE_SLS_THRUST, 86459.2, 'lbf') # THRSO -inputs.set_val(Aircraft.Engine.NUM_ENGINES, np.array([3])) # NEW+NEF +# inputs.set_val(Aircraft.Engine.NUM_ENGINES, np.array([3])) # NEW+NEF inputs.set_val(Aircraft.Engine.NUM_FUSELAGE_ENGINES, 3) # NEF inputs.set_val(Aircraft.Engine.NUM_WING_ENGINES, np.array([0])) # NEW inputs.set_val(Aircraft.Engine.THRUST_REVERSERS_MASS_SCALER, 0.0) # WTHR diff --git a/aviary/subsystems/aerodynamics/aerodynamics_builder.py b/aviary/subsystems/aerodynamics/aerodynamics_builder.py index e5167ffc94..0172d7a437 100644 --- a/aviary/subsystems/aerodynamics/aerodynamics_builder.py +++ b/aviary/subsystems/aerodynamics/aerodynamics_builder.py @@ -494,7 +494,15 @@ def get_parameters(self, aviary_inputs=None, **kwargs): params[Aircraft.Design.LIFT_DEPENDENT_DRAG_POLAR] = opts if method == 'computed': - for var in COMPUTED_CORE_INPUTS: + try: + design_type = aviary_inputs.get_val(Aircraft.Design.TYPE) + except: + design_type = AircraftTypes.TRANSPORT + if design_type is AircraftTypes.BLENDED_WING_BODY: + core_inputs_computed = COMPUTED_CORE_INPUTS_BWB + else: + core_inputs_computed = COMPUTED_CORE_INPUTS + for var in core_inputs_computed: meta = _MetaData[var] val = meta['default_value'] @@ -622,7 +630,10 @@ def get_parameters(self, aviary_inputs=None, **kwargs): 'tabular_cruise, low_speed, tabular_low_speed)' ) - design_type = aviary_inputs.get_val(Aircraft.Design.TYPE) + try: + design_type = aviary_inputs.get_val(Aircraft.Design.TYPE) + except: + design_type = AircraftTypes.TRANSPORT if design_type is AircraftTypes.BLENDED_WING_BODY: all_vars.add(Aircraft.Fuselage.LIFT_CURVE_SLOPE_MACH0) @@ -729,6 +740,37 @@ def report(self, prob, reports_folder, **kwargs): Mission.Design.MACH, ] +COMPUTED_CORE_INPUTS_BWB = [ + Aircraft.Design.BASE_AREA, + Aircraft.Design.LIFT_DEPENDENT_DRAG_COEFF_FACTOR, + Aircraft.Design.SUBSONIC_DRAG_COEFF_FACTOR, + Aircraft.Design.SUPERSONIC_DRAG_COEFF_FACTOR, + Aircraft.Design.ZERO_LIFT_DRAG_COEFF_FACTOR, + Aircraft.Fuselage.CHARACTERISTIC_LENGTH, + Aircraft.Fuselage.CROSS_SECTION, + Aircraft.Fuselage.DIAMETER_TO_WING_SPAN, + Aircraft.Fuselage.FINENESS, + Aircraft.Fuselage.LAMINAR_FLOW_LOWER, + Aircraft.Fuselage.LAMINAR_FLOW_UPPER, + Aircraft.Fuselage.LENGTH_TO_DIAMETER, + Aircraft.Fuselage.WETTED_AREA, + Aircraft.Wing.AREA, + Aircraft.Wing.ASPECT_RATIO, + Aircraft.Wing.CHARACTERISTIC_LENGTH, + Aircraft.Wing.FINENESS, + Aircraft.Wing.LAMINAR_FLOW_LOWER, + Aircraft.Wing.LAMINAR_FLOW_UPPER, + Aircraft.Wing.MAX_CAMBER_AT_70_SEMISPAN, + Aircraft.Wing.SPAN_EFFICIENCY_FACTOR, + Aircraft.Wing.SWEEP, + Aircraft.Wing.TAPER_RATIO, + Aircraft.Wing.THICKNESS_TO_CHORD, + Aircraft.Wing.WETTED_AREA, + # Mission.Summary.GROSS_MASS, + Mission.Design.LIFT_COEFFICIENT, + Mission.Design.MACH, +] + TABULAR_CORE_INPUTS = [ Aircraft.Wing.AREA, Aircraft.Design.SUBSONIC_DRAG_COEFF_FACTOR, diff --git a/aviary/subsystems/aerodynamics/flops_based/skin_friction.py b/aviary/subsystems/aerodynamics/flops_based/skin_friction.py index 502378cf3f..0cf9fb870b 100644 --- a/aviary/subsystems/aerodynamics/flops_based/skin_friction.py +++ b/aviary/subsystems/aerodynamics/flops_based/skin_friction.py @@ -1,6 +1,7 @@ import numpy as np import openmdao.api as om +from aviary.variable_info.enums import AircraftTypes from aviary.variable_info.functions import add_aviary_input, add_aviary_option from aviary.variable_info.variables import Aircraft, Dynamic @@ -36,17 +37,23 @@ def initialize(self): desc='The number of points at which the cross product is computed.', ) + add_aviary_option(self, Aircraft.Design.TYPE) add_aviary_option(self, Aircraft.Engine.NUM_ENGINES) add_aviary_option(self, Aircraft.Fuselage.NUM_FUSELAGES) add_aviary_option(self, Aircraft.VerticalTail.NUM_TAILS) def setup(self): nn = self.options['num_nodes'] + design_type = self.options[Aircraft.Design.TYPE] num_engines = self.options[Aircraft.Engine.NUM_ENGINES] num_fuselages = self.options[Aircraft.Fuselage.NUM_FUSELAGES] num_tails = self.options[Aircraft.VerticalTail.NUM_TAILS] - self.nc = nc = 2 + num_tails + num_fuselages + int(sum(num_engines)) + if design_type is AircraftTypes.BLENDED_WING_BODY: + # No horizontal tail for BWB + self.nc = nc = 1 + num_tails + num_fuselages + int(sum(num_engines)) + else: + self.nc = nc = 2 + num_tails + num_fuselages + int(sum(num_engines)) # Simulation inputs add_aviary_input(self, Dynamic.Atmosphere.TEMPERATURE, shape=nn, units='degR') diff --git a/aviary/subsystems/aerodynamics/flops_based/skin_friction_drag.py b/aviary/subsystems/aerodynamics/flops_based/skin_friction_drag.py index 2324ecee40..284cc12e4b 100644 --- a/aviary/subsystems/aerodynamics/flops_based/skin_friction_drag.py +++ b/aviary/subsystems/aerodynamics/flops_based/skin_friction_drag.py @@ -1,6 +1,7 @@ import numpy as np import openmdao.api as om +from aviary.variable_info.enums import AircraftTypes from aviary.variable_info.functions import add_aviary_input, add_aviary_option, get_units from aviary.variable_info.variables import Aircraft @@ -33,6 +34,7 @@ def initialize(self): desc='The number of points at which the cross product is computed.', ) + add_aviary_option(self, Aircraft.Design.TYPE) add_aviary_option(self, Aircraft.Engine.NUM_ENGINES) add_aviary_option(self, Aircraft.Fuselage.NUM_FUSELAGES) add_aviary_option(self, Aircraft.VerticalTail.NUM_TAILS) @@ -47,12 +49,17 @@ def initialize(self): def setup(self): nn = self.options['num_nodes'] + design_type = self.options[Aircraft.Design.TYPE] nvtail = self.options[Aircraft.VerticalTail.NUM_TAILS] nfuse = self.options[Aircraft.Fuselage.NUM_FUSELAGES] num_engines = self.options[Aircraft.Engine.NUM_ENGINES] - self.nc = nc = 2 + nvtail + nfuse + int(sum(num_engines)) + if design_type is AircraftTypes.BLENDED_WING_BODY: + # No horizontal tail for BWB + self.nc = nc = 1 + nvtail + nfuse + int(sum(num_engines)) + else: + self.nc = nc = 2 + nvtail + nfuse + int(sum(num_engines)) # Computed by other components in drag group. self.add_input('skin_friction_coeff', np.zeros((nn, nc)), units='unitless') diff --git a/aviary/subsystems/geometry/flops_based/canard.py b/aviary/subsystems/geometry/flops_based/canard.py index 40095d929f..46bee4a1fc 100644 --- a/aviary/subsystems/geometry/flops_based/canard.py +++ b/aviary/subsystems/geometry/flops_based/canard.py @@ -12,6 +12,7 @@ class Canard(om.ExplicitComponent): """Calculate the wetted area of canard.""" + # TODO: what is it for? def initialize(self): self.options.declare( 'aviary_options', diff --git a/aviary/subsystems/geometry/flops_based/fuselage.py b/aviary/subsystems/geometry/flops_based/fuselage.py index 35c4cfaf1e..46e5b4ec4f 100644 --- a/aviary/subsystems/geometry/flops_based/fuselage.py +++ b/aviary/subsystems/geometry/flops_based/fuselage.py @@ -70,7 +70,9 @@ def setup(self): 'Rear_spar_percent_chord', 0.7, units='unitless', - desc='RSPSOB: Rear spar percent chord for BWB at side of body', + desc='RSPSOB: Rear spar percent chord for BWB at side of body, ' + ' or more precisely, the passenger compartment ends at the ' + ' 70% of fuselage length from the leading edge.', ) add_aviary_output(self, Aircraft.Fuselage.REF_DIAMETER, units='ft') @@ -167,7 +169,7 @@ def compute(self, inputs, outputs): if verbosity > Verbosity.BRIEF: raise UserWarning( 'Passenger compartment lenght is longer than recommended maximum' - ' length (of 190 ft). Suggest using detailed layout algorithm.' + ' length. Suggest using detailed layout algorithm.' ) outputs[Aircraft.Fuselage.PASSENGER_COMPARTMENT_LENGTH] = pax_compart_length @@ -480,8 +482,8 @@ def compute(self, inputs, outputs): # Enforce maximum number of bays num_bays_max = self.options[Aircraft.BWB.MAX_NUM_BAYS] - num_bays = int(0.5 + max_width.real / bay_width_max.real) - if num_bays > num_bays_max and num_bays_max > 0: + num_bays = int(0.5 + max_width / bay_width_max) + if num_bays.real > num_bays_max and num_bays_max > 0: num_bays = num_bays_max outputs[Aircraft.BWB.NUM_BAYS] = smooth_int_tanh(num_bays, mu=20.0) @@ -657,27 +659,30 @@ def compute(self, inputs, outputs): pax_compart_length = root_chord + tan_sweep * max_width / 2.0 # Enforce maximum number of bays - z = 0.5 + max_width / bay_width_max - z = z[0] - num_bays = int(z.real) - if num_bays > num_bays_max and num_bays_max > 0: + num_bays_tmp = 0.5 + max_width / bay_width_max + if num_bays_tmp[0].real > num_bays_max and num_bays_max > 0: num_bays = num_bays_max + else: + num_bays = int(num_bays_tmp[0].real) # Enforce maximum bay width bay_width = max_width / num_bays if bay_width > bay_width_max: bay_width = bay_width_max - num_bays = int(0.999 + max_width / bay_width) - if num_bays > num_bays_max and num_bays_max > 0: + num_bays_tmp = 0.999 + max_width / bay_width + if num_bays_tmp.real > num_bays_max and num_bays_max > 0: num_bays = num_bays_max max_width = bay_width_max * bay_width pax_compart_length = area_cabin / max_width + tan_sweep * max_width / 4.0 root_chord = pax_compart_length - tan_sweep * max_width / 2.0 + else: + num_bays = smooth_int_tanh(num_bays_tmp, mu=40.0) + # If number of bays has changed, recalculate cabin area length = pax_compart_length / rear_spar_percent_chord max_height = height_to_width * length - outputs[Aircraft.BWB.NUM_BAYS] = smooth_int_tanh(num_bays, mu=20.0) + outputs[Aircraft.BWB.NUM_BAYS] = num_bays outputs[Aircraft.Fuselage.LENGTH] = length outputs[Aircraft.Fuselage.PASSENGER_COMPARTMENT_LENGTH] = pax_compart_length diff --git a/aviary/subsystems/geometry/flops_based/test/test_nacelle.py b/aviary/subsystems/geometry/flops_based/test/test_nacelle.py index 9f408ba40c..0c1468e50b 100644 --- a/aviary/subsystems/geometry/flops_based/test/test_nacelle.py +++ b/aviary/subsystems/geometry/flops_based/test/test_nacelle.py @@ -60,9 +60,9 @@ def test_case_BWB(self): prob = self.prob options = get_flops_options('BWBsimpleFLOPS') - # options = { - # Aircraft.Engine.NUM_ENGINES: np.array([3]), - # } + options = { + Aircraft.Engine.NUM_ENGINES: np.array([3]), + } prob.model.add_subsystem( 'nacelles', Nacelles(), promotes_outputs=['*'], promotes_inputs=['*'] diff --git a/aviary/subsystems/geometry/flops_based/wing_detailed_bwb.py b/aviary/subsystems/geometry/flops_based/wing_detailed_bwb.py index ee50e02065..f050502e93 100644 --- a/aviary/subsystems/geometry/flops_based/wing_detailed_bwb.py +++ b/aviary/subsystems/geometry/flops_based/wing_detailed_bwb.py @@ -397,7 +397,7 @@ def compute(self, inputs, outputs): # This part is repeated in _BWBWing() num_inp_stations = len(self.options[Aircraft.Wing.INPUT_STATION_DIST]) bwb_input_station_dist = np.array( - self.options[Aircraft.Wing.INPUT_STATION_DIST], dtype=float + self.options[Aircraft.Wing.INPUT_STATION_DIST], dtype=width.dtype ) bwb_input_station_dist = np.where( bwb_input_station_dist <= 1.0, diff --git a/aviary/subsystems/mass/flops_based/test/test_air_conditioning.py b/aviary/subsystems/mass/flops_based/test/test_air_conditioning.py index 7200c76417..39d9f73c32 100644 --- a/aviary/subsystems/mass/flops_based/test/test_air_conditioning.py +++ b/aviary/subsystems/mass/flops_based/test/test_air_conditioning.py @@ -185,7 +185,7 @@ def test_case(self, case_name): promotes_outputs=['*'], ) - prob.model_options['*'] = get_flops_options(case_name) + prob.model_options['*'] = get_flops_options(case_name, preprocess=True) prob.setup(check=False, force_alloc_complex=True) diff --git a/aviary/subsystems/mass/flops_based/test/test_apu.py b/aviary/subsystems/mass/flops_based/test/test_apu.py index 47d1e31d9a..3c9ee7dc59 100644 --- a/aviary/subsystems/mass/flops_based/test/test_apu.py +++ b/aviary/subsystems/mass/flops_based/test/test_apu.py @@ -1,5 +1,6 @@ import unittest +import numpy as np import openmdao.api as om from openmdao.utils.assert_utils import assert_check_partials from openmdao.utils.testing_utils import use_tempdirs @@ -88,8 +89,11 @@ class BWBAPUMassTest(unittest.TestCase): def setUp(self): self.prob = om.Problem() - @parameterized.expand(get_flops_case_names(only=bwb_cases), name_func=print_case) - def test_case(self, case_name): + # @parameterized.expand(get_flops_case_names(only=bwb_cases), name_func=print_case) + def test_case( + self, + ): + case_name = 'BWBsimpleFLOPS' prob = self.prob prob.model.add_subsystem( @@ -99,7 +103,7 @@ def test_case(self, case_name): promotes_outputs=['*'], ) - prob.model_options['*'] = get_flops_options(case_name, preprocess=False) + prob.model_options['*'] = get_flops_options(case_name, preprocess=True) prob.setup(check=False, force_alloc_complex=True) @@ -114,4 +118,7 @@ def test_case(self, case_name): if __name__ == '__main__': - unittest.main() + # unittest.main() + test = BWBAPUMassTest() + test.setUp() + test.test_case() diff --git a/aviary/subsystems/test/test_flops_based_premission.py b/aviary/subsystems/test/test_flops_based_premission.py index 2ef158f33a..5480ce9ea9 100644 --- a/aviary/subsystems/test/test_flops_based_premission.py +++ b/aviary/subsystems/test/test_flops_based_premission.py @@ -505,7 +505,7 @@ def test_case_geom(self): assert_near_equal(prob[Aircraft.Wing.ROOT_CHORD], 63.96, tol) assert_near_equal(prob[Aircraft.Fuselage.CABIN_AREA], 5173.187202504683, tol) assert_near_equal(prob[Aircraft.Fuselage.MAX_HEIGHT], 15.125, tol) - assert_near_equal(prob[Aircraft.BWB.NUM_BAYS], 5.0, tol) + assert_near_equal(prob[Aircraft.BWB.NUM_BAYS], 5.0, 1e-4) # BWBFuselagePrelim assert_near_equal(prob[Aircraft.Fuselage.REF_DIAMETER], 39.8525, tol) assert_near_equal(prob[Aircraft.Fuselage.PLANFORM_AREA], 7390.267432149546, tol) diff --git a/aviary/utils/fortran_to_aviary.py b/aviary/utils/fortran_to_aviary.py index 757a89e226..307ec45545 100644 --- a/aviary/utils/fortran_to_aviary.py +++ b/aviary/utils/fortran_to_aviary.py @@ -904,7 +904,10 @@ def update_flops_options(vehicle_data): if input_values.get_val(Aircraft.Fuel.WING_FUEL_CAPACITY, 'lbm')[0] < 50: # Interpret value equivalently to FWMAX = wing_fuel_fraction * fuel_density * 2/3 FWMAX = input_values.get_val(Aircraft.Fuel.WING_FUEL_CAPACITY, 'lbm')[0] - FULDEN = input_values.get_val(Aircraft.Fuel.DENSITY, 'lbm/ft**3')[0] + if Aircraft.Fuel.DENSITY in input_values: + FULDEN = input_values.get_val(Aircraft.Fuel.DENSITY, 'lbm/ft**3')[0] + else: + FULDEN = 50.12 # 50.12 lbm/ft**3 = 6.7 lbm/galUS input_values.set_val( Aircraft.Fuel.WING_FUEL_FRACTION, [FWMAX / (FULDEN * (2 / 3))], 'unitless' ) @@ -914,6 +917,146 @@ def update_flops_options(vehicle_data): if Aircraft.Wing.INPUT_STATION_DIST in input_values: input_values.set_val(Aircraft.Wing.DETAILED_WING, [True]) + if not Mission.Landing.LIFT_COEFFICIENT_MAX in input_values: + unused_values = vehicle_data['unused_values'] + try: + CLAPP = unused_values.get_item('TOLIN.CLAPP')[0][0] + CLLDM = 1.69 * CLAPP + except: + CLLDM = 3.0 + input_values.set_val(Mission.Landing.LIFT_COEFFICIENT_MAX, [CLLDM]) + + design_type, design_units = input_values.get_item(Aircraft.Design.TYPE) + if design_type[0] == 0: + input_values.set_val(Aircraft.Design.TYPE, ['transport'], design_units) + + if Aircraft.Fuselage.LENGTH in input_values: + input_values.set_val(Aircraft.Fuselage.SIMPLE_LAYOUT, [True], 'unitless') + else: + input_values.set_val(Aircraft.Fuselage.SIMPLE_LAYOUT, [False], 'unitless') + elif design_type[0] == 3: + input_values.set_val(Aircraft.Design.TYPE, ['BWB'], design_units) + + # BWB always have detailed wing. + input_values.set_val(Aircraft.Wing.DETAILED_WING, [True]) + if Aircraft.Wing.INPUT_STATION_DIST in input_values: + input_station_dist = input_values.get_val(Aircraft.Wing.INPUT_STATION_DIST) + input_station_dist = [0.0] + input_station_dist + input_values.set_val(Aircraft.Wing.INPUT_STATION_DIST, input_station_dist) + n_dist = len(input_station_dist) + chord_per_semispan_dist = input_values.get_val(Aircraft.Wing.CHORD_PER_SEMISPAN_DIST) + chord_per_semispan_dist = [-1.0] + chord_per_semispan_dist[0 : n_dist - 1] + input_values.set_val(Aircraft.Wing.CHORD_PER_SEMISPAN_DIST, chord_per_semispan_dist) + load_path_sweep_dist = input_values.get_val(Aircraft.Wing.LOAD_PATH_SWEEP_DIST, 'deg') + load_path_sweep_dist = [0.0] + load_path_sweep_dist[0 : n_dist - 2] + input_values.set_val(Aircraft.Wing.LOAD_PATH_SWEEP_DIST, load_path_sweep_dist, 'deg') + thickness_to_chord_dist = input_values.get_val(Aircraft.Wing.THICKNESS_TO_CHORD_DIST) + thickness_to_chord_dist = [-1.0] + thickness_to_chord_dist[0 : n_dist - 1] + input_values.set_val(Aircraft.Wing.THICKNESS_TO_CHORD_DIST, thickness_to_chord_dist) + input_values.set_val(Aircraft.BWB.DETAILED_WING_PROVIDED, [True]) + else: + # For BWB, if detail wing is not provided, initialize it to [0, 0.5, 1]. See doc page for detail. + input_values.set_val(Aircraft.BWB.DETAILED_WING_PROVIDED, [False]) + input_values.set_val(Aircraft.Wing.INPUT_STATION_DIST, [0.0, 0.5, 1.0]) + + if ( + Aircraft.Fuselage.LENGTH in input_values + and Aircraft.BWB.PASSENGER_LEADING_EDGE_SWEEP in input_values + ): + if ( + input_values.get_val(Aircraft.Fuselage.LENGTH, 'ft')[0] > 0.0 + and input_values.get_val(Aircraft.BWB.PASSENGER_LEADING_EDGE_SWEEP, 'deg')[0] > 0.0 + ): + input_values.set_val(Aircraft.Fuselage.SIMPLE_LAYOUT, [True], 'unitless') + else: + input_values.set_val(Aircraft.Fuselage.SIMPLE_LAYOUT, [False], 'unitless') + else: + input_values.set_val(Aircraft.Fuselage.SIMPLE_LAYOUT, [False], 'unitless') + + if Aircraft.Engine.SCALED_SLS_THRUST in input_values: + # This is a design variable. So, first entry is the initial value + thrust = input_values.get_val(Aircraft.Engine.SCALED_SLS_THRUST, 'lbf')[0] + input_values.set_val(Aircraft.Engine.SCALED_SLS_THRUST, [thrust], 'lbf') + + if not Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO in input_values: + if Aircraft.Wing.THICKNESS_TO_CHORD in input_values: + wing_tc = input_values.get_val(Aircraft.Wing.THICKNESS_TO_CHORD, 'unitless')[0] + input_values.set_val(Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO, [wing_tc], 'unitless') + + if not Aircraft.Fuel.WING_FUEL_FRACTION in input_values: + # Interpret value equivalently to FWMAX = wing_fuel_fraction * fuel_density * 2/3 + FWMAX = 23 # the default + if Aircraft.Fuel.DENSITY in input_values: + FULDEN = input_values.get_val(Aircraft.Fuel.DENSITY, 'lbm/ft**3')[0] + else: + FULDEN = 50.1194909 # lbm/ft**3 or 6.7 lbm/galUS + input_values.set_val(Aircraft.Fuel.DENSITY, [6.7], 'lbm/galUS') + input_values.set_val( + Aircraft.Fuel.WING_FUEL_FRACTION, [FWMAX / (FULDEN * (2 / 3))], 'unitless' + ) + + # For BWB, wing area is always computed + if Aircraft.Wing.AREA in input_values: + input_values.delete(Aircraft.Wing.AREA) + if Aircraft.Wing.ASPECT_RATIO in input_values: + input_values.delete(Aircraft.Wing.ASPECT_RATIO) + + if ( + Aircraft.Engine.SCALED_SLS_THRUST in input_values + and Aircraft.Engine.REFERENCE_SLS_THRUST in input_values + ): + ref_thrust = input_values.get_val(Aircraft.Engine.REFERENCE_SLS_THRUST, 'lbf')[0] + scaled_thrust = input_values.get_val(Aircraft.Engine.SCALED_SLS_THRUST, 'lbf')[0] + if scaled_thrust <= 0: + print( + 'Aircraft.Engine.REFERENCE_SLS_THRUST must be positive ' + f'but you have {scaled_thrust}' + ) + else: + engine_scale_factor = scaled_thrust / ref_thrust + input_values.set_val( + Aircraft.Engine.SCALE_FACTOR, [engine_scale_factor], 'unitless' + ) + else: + raise RuntimeError( + f'Currently, Aircraft.Design.TYPE must be either 0 or 3 not {design_type[0]}.' + ) + + if ( + not Aircraft.HorizontalTail.THICKNESS_TO_CHORD in input_values + or input_values.get_val(Aircraft.HorizontalTail.THICKNESS_TO_CHORD, 'unitless')[0] == 0 + ): + if Aircraft.Wing.THICKNESS_TO_CHORD in input_values: + wing_tc = input_values.get_val(Aircraft.Wing.THICKNESS_TO_CHORD, 'unitless')[0] + input_values.set_val(Aircraft.HorizontalTail.THICKNESS_TO_CHORD, [wing_tc], 'unitless') + + if (not Aircraft.VerticalTail.THICKNESS_TO_CHORD in input_values) or ( + input_values.get_val(Aircraft.VerticalTail.THICKNESS_TO_CHORD, 'unitless')[0] == 0 + ): + if Aircraft.Wing.THICKNESS_TO_CHORD in input_values: + wing_tc = input_values.get_val(Aircraft.Wing.THICKNESS_TO_CHORD, 'unitless')[0] + input_values.set_val(Aircraft.VerticalTail.THICKNESS_TO_CHORD, [wing_tc], 'unitless') + + # These variables should be removed if they are zero. + rem_list = [ + (Aircraft.Fuselage.CABIN_AREA, 'ft**2'), + (Aircraft.Fuselage.MAX_HEIGHT, 'ft'), + (Aircraft.Fuselage.PASSENGER_COMPARTMENT_LENGTH, 'ft'), + (Aircraft.Fuselage.LENGTH, 'ft'), + (Aircraft.Fuselage.MAX_WIDTH, 'ft'), + (Aircraft.HorizontalTail.SWEEP, 'deg'), + ] + for var in rem_list: + try: + val = input_values.get_val(var[0], var[1])[0] + if val == 0.0: + input_values.delete(var[0]) + except: + pass + + if design_type[0] != 3: + input_values.delete(Aircraft.BWB.PASSENGER_LEADING_EDGE_SWEEP) + vehicle_data['input_values'] = input_values return vehicle_data @@ -922,7 +1065,6 @@ def update_aviary_options(vehicle_data): """Special handling for variables that occurs for either legacy code.""" input_values: NamedValues = vehicle_data['input_values'] - # if reference + scaled thrust both provided, set scale factor try: ref_thrust = input_values.get_val(Aircraft.Engine.REFERENCE_SLS_THRUST, 'lbf')[0] ref_thrust = float(ref_thrust) diff --git a/aviary/utils/legacy_code_data/flops_defaults.py b/aviary/utils/legacy_code_data/flops_defaults.py index 98f796401d..1bef060d1e 100644 --- a/aviary/utils/legacy_code_data/flops_defaults.py +++ b/aviary/utils/legacy_code_data/flops_defaults.py @@ -7,12 +7,16 @@ 'WTIN.IALTWT': (False, 'unitless'), 'WTIN.CARGF': (False, 'unitless'), 'WTIN.IFUFU': (False, 'unitless'), + 'WTIN.HYDPR': (3000.0, 'psi'), + 'WTIN.ULF': (3.75, 'unitless'), + 'WTIN.WPPASS': (165.0, 'lbm'), 'ENGDIN.IDLE': (False, 'unitless'), 'ENGDIN.IGEO': (False, 'unitless'), 'ENGDIN.NONEG': (False, 'unitless'), 'AERIN.MIKE': (False, 'unitless'), 'AERIN.SWETF': (1, 'unitless'), 'AERIN.SWETV': (1, 'unitless'), + 'FUSEIN.SWPLE': (45.0, 'deg'), } ) diff --git a/aviary/utils/math.py b/aviary/utils/math.py index 5c01de748c..378184e989 100644 --- a/aviary/utils/math.py +++ b/aviary/utils/math.py @@ -215,7 +215,7 @@ def smooth_int_tanh(x, mu=10.0): """ Smooth approximation of int(x) using tanh. """ - f = np.floor(x) + f = np.floor(x.real) + x.imag * 1j frac = x - f t = np.tanh(mu * (frac - 0.5)) s = 0.5 * (t + 1) @@ -228,7 +228,7 @@ def d_smooth_int_tanh(x, mu=10.0): Smooth approximation of int(x) using tanh. Returns (y, dy_dx). """ - f = np.floor(x) + f = np.floor(x) + x.imag * 1j frac = x - f t = np.tanh(mu * (frac - 0.5)) dy_dx = 0.5 * mu * (1 - t**2) diff --git a/aviary/utils/preprocessors.py b/aviary/utils/preprocessors.py index 32a44e1aaf..cc0c6fd492 100644 --- a/aviary/utils/preprocessors.py +++ b/aviary/utils/preprocessors.py @@ -45,11 +45,13 @@ def preprocess_options(aviary_options: AviaryValues, meta_data=_MetaData, verbos preprocess_crewpayload(aviary_options, meta_data, verbosity) preprocess_fuel_capacities(aviary_options, verbosity) + preprocess_Engines(aviary_options, verbosity) if engine_models is not None: preprocess_propulsion(aviary_options, engine_models, meta_data, verbosity) +# this function is not used def remove_preprocessed_options(aviary_options): """ Remove options whose values will be computed in the preprocessors. @@ -550,6 +552,63 @@ def preprocess_fuel_capacities(aviary_options: AviaryValues, verbosity=None): return aviary_options +def preprocess_Engines(aviary_options: AviaryValues, verbosity=None): + """ + Preprocesses the AviaryValues object to ensure the number of engines is + the sum of wing engines and body engines. + + Parameters + ---------- + aviary_options : AviaryValues + Options to be updated + + """ + if verbosity is not None: + # compatibility with being passed int for verbosity + verbosity = Verbosity(verbosity) + else: + verbosity = aviary_options.get_val(Settings.VERBOSITY) + + if Aircraft.Engine.NUM_FUSELAGE_ENGINES in aviary_options: + num_fuselage_engines = aviary_options.get_val( + Aircraft.Engine.NUM_FUSELAGE_ENGINES, 'unitless' + ) + if isinstance(num_fuselage_engines, np.ndarray) or isinstance(num_fuselage_engines, list): + num_fuselage_engines = num_fuselage_engines[0] + else: + num_fuselage_engines = int(num_fuselage_engines) + else: + num_fuselage_engines = 0 + + if Aircraft.Engine.NUM_WING_ENGINES in aviary_options: + num_wing_engines = aviary_options.get_val(Aircraft.Engine.NUM_WING_ENGINES, 'unitless') + if isinstance(num_wing_engines, np.ndarray) or isinstance(num_wing_engines, list): + num_wing_engines = num_wing_engines[0] + else: + num_wing_engines = int(num_wing_engines) + else: + num_wing_engines = 0 + sum_engines = num_fuselage_engines + num_wing_engines + + if Aircraft.Engine.NUM_ENGINES in aviary_options: + num_engines = aviary_options.get_val(Aircraft.Engine.NUM_ENGINES) + if isinstance(num_engines, np.ndarray) or isinstance(num_engines, list): + num_engines = num_engines[0] + else: + num_engines = int(num_engines) + if num_engines != sum_engines: + if verbosity >= Verbosity.BRIEF: + print( + 'Your total number of engines is not the same as ' + 'the sum of wing engines and fuselage engines.' + ) + else: + num_engines = sum_engines + aviary_options.set_val(Aircraft.Engine.NUM_ENGINES, np.array([num_engines])) + + return aviary_options + + def preprocess_propulsion( aviary_options: AviaryValues, engine_models: list = None, diff --git a/aviary/utils/test/data/converter_test_BWB_detailed_FLOPS.csv b/aviary/utils/test/data/converter_test_BWB_detailed_FLOPS.csv new file mode 100644 index 0000000000..088447e703 --- /dev/null +++ b/aviary/utils/test/data/converter_test_BWB_detailed_FLOPS.csv @@ -0,0 +1,160 @@ +# FLOPS-derived aircraft input deck converted from bwb_detailed_FLOPS.in + +# Input Values +aircraft:avionics:mass_scaler,1,unitless +aircraft:blended_wing_body_design:detailed_wing_provided,True,unitless +aircraft:blended_wing_body_design:passenger_leading_edge_sweep,45.0,deg +aircraft:crew_and_payload:design:num_business_class,100,unitless +aircraft:crew_and_payload:design:num_economy_class,340,unitless +aircraft:crew_and_payload:design:num_first_class,28,unitless +aircraft:crew_and_payload:design:num_seats_abreast_business,4,unitless +aircraft:crew_and_payload:design:num_seats_abreast_economy,6,unitless +aircraft:crew_and_payload:design:num_seats_abreast_first,4,unitless +aircraft:crew_and_payload:design:seat_pitch_business,39,inch +aircraft:crew_and_payload:design:seat_pitch_economy,32,inch +aircraft:crew_and_payload:design:seat_pitch_first,61,inch +aircraft:crew_and_payload:mass_per_passenger,165.0,lbm +aircraft:crew_and_payload:num_flight_attendants,22,unitless +aircraft:crew_and_payload:num_flight_crew,2,unitless +aircraft:design:landing_to_takeoff_mass_ratio,0.8,unitless +aircraft:design:lift_dependent_drag_coeff_factor,1,unitless +aircraft:design:type,BWB,unitless +aircraft:design:use_alt_mass,False,unitless +aircraft:design:zero_lift_drag_coeff_factor,1,unitless +aircraft:engine:data_file,'ENGDEK',unitless +aircraft:engine:generate_flight_idle,True,unitless +aircraft:engine:geopotential_alt,False,unitless +aircraft:engine:ignore_negative_thrust,False,unitless +aircraft:engine:mass_scaler,1,unitless +aircraft:engine:num_fuselage_engines,3,unitless +aircraft:engine:num_wing_engines,0,unitless +aircraft:engine:reference_mass,22017,lbm +aircraft:engine:reference_sls_thrust,86459.2,lbf +aircraft:engine:scale_factor,0.8096304384033163,unitless +aircraft:engine:scaled_sls_thrust,70000,lbf +aircraft:fins:area,184.89,ft**2 +aircraft:fins:num_fins,2,unitless +aircraft:fins:taper_ratio,0.464,unitless +aircraft:fuel:density,6.7,lbm/galUS +aircraft:fuel:ignore_fuel_capacity_constraint,False,unitless +aircraft:fuel:wing_fuel_fraction,0.688354956933531,unitless +aircraft:furnishings:mass_scaler,1,unitless +aircraft:fuselage:height_to_width_ratio,0.11,unitless +aircraft:fuselage:mass_scaler,1,unitless +aircraft:fuselage:military_cargo_floor,False,unitless +aircraft:fuselage:num_fuselages,1,unitless +aircraft:fuselage:simple_layout,False,unitless +aircraft:fuselage:wetted_area_scaler,1,unitless +aircraft:horizontal_tail:area,0,ft**2 +aircraft:horizontal_tail:aspect_ratio,0,unitless +aircraft:horizontal_tail:mass_scaler,1,unitless +aircraft:horizontal_tail:taper_ratio,0,unitless +aircraft:horizontal_tail:thickness_to_chord,0.11,unitless +aircraft:hydraulics:mass_scaler,1,unitless +aircraft:hydraulics:system_pressure,3000.0,psi +aircraft:landing_gear:main_gear_oleo_length,85,inch +aircraft:landing_gear:nose_gear_oleo_length,87,inch +aircraft:nacelle:avg_diameter,12.608,ft +aircraft:nacelle:avg_length,17.433,ft +aircraft:propulsion:misc_mass_scaler,0,unitless +aircraft:vertical_tail:mass_scaler,1,unitless +aircraft:vertical_tail:num_tails,0,unitless +aircraft:vertical_tail:thickness_to_chord,0.11,unitless +aircraft:vertical_tail:wetted_area_scaler,1,unitless +aircraft:wing:aeroelastic_tailoring_factor,0,unitless +aircraft:wing:airfoil_technology,2,unitless +aircraft:wing:chord_per_semispan_dist,-1.0,58.03,0.4491,0.3884,0.3317,0.2886,0.2537,0.2269,0.2121,0.1983,0.1843,0.1704,0.1565,0.1426,0.1287,unitless +aircraft:wing:composite_fraction,1,unitless +aircraft:wing:control_surface_area_ratio,0.333,unitless +aircraft:wing:detailed_wing,True,unitless +aircraft:wing:dihedral,3,deg +aircraft:wing:glove_and_bat,121.05,ft**2 +aircraft:wing:input_station_dist,0.0,0.35,0.4,0.45,0.5,0.55,0.6,0.6499,0.7,0.75,0.8,0.85,0.8999,0.95,1,unitless +aircraft:wing:load_path_sweep_dist,0.0,0,0,0,0,0,0,0,42.9,42.9,42.9,42.9,42.9,42.9,deg +aircraft:wing:mass_scaler,1,unitless +aircraft:wing:max_camber_at_70_semispan,2,unitless +aircraft:wing:outboard_semispan,86.75,ft +aircraft:wing:span_efficiency_factor,0,unitless +aircraft:wing:span_efficiency_reduction,False,unitless +aircraft:wing:strut_bracing_factor,0,unitless +aircraft:wing:sweep,35.7,deg +aircraft:wing:taper_ratio,0.311,unitless +aircraft:wing:thickness_to_chord,0.11,unitless +aircraft:wing:thickness_to_chord_dist,-1.0,0.15,0.1132,0.0928,0.0822,0.0764,0.0742,0.0746,0.0758,0.0758,0.0756,0.0756,0.0758,0.076,0.076,unitless +aircraft:wing:ultimate_load_factor,3.75,unitless +aircraft:wing:var_sweep_mass_penalty,0,unitless +mission:constraints:max_mach,0.85,unitless +mission:design:gross_mass,874099,lbm +mission:design:range,7750,NM +mission:design:thrust_takeoff_per_eng,0.25,lbf +mission:landing:initial_velocity,140,ft/s +mission:landing:lift_coefficient_max,3.0,unitless +mission:summary:cruise_mach,0.85,unitless +settings:aerodynamics_method,FLOPS,unitless +settings:equations_of_motion,height_energy,unitless +settings:mass_method,FLOPS,unitless + +# Unconverted Values +AERIN.FLLDG,11000 +AERIN.FLTO,11000 +AERIN.ITPAER,2 +AERIN.MYAERO,0 +AERIN.XLLAM,0 +CONFIN.CH,39000 +CONFIN.GW,874099 +CONFIN.OFF,0 +CONFIN.OFG,1 +ENGDIN.MAXCR,1 +MISSIN.ALTRAN,200 +MISSIN.APPRTM,4 +MISSIN.CLAMIN,0 +MISSIN.CRALT,45000,25000,1500 +MISSIN.CRMACH,0.85,0.6,0 +MISSIN.DEAMIN,0 +MISSIN.FWF,-0.001 +MISSIN.HOLDTM,30 +MISSIN.IATA,0 +MISSIN.IFLAG,2 +MISSIN.IHOPOS,1 +MISSIN.IOC,1,4,4 +MISSIN.IRS,1 +MISSIN.IRW,1 +MISSIN.ISKAL,1 +MISSIN.ITTFF,1 +MISSIN.IVS,1 +MISSIN.MSUMPT,1 +MISSIN.NCLIMB,1 +MISSIN.NCLRES,1 +MISSIN.NCRHOL,3 +MISSIN.NCRRES,2 +MISSIN.NCRTH,1 +MISSIN.NCRUSE,3 +MISSIN.NPCON,0 +MISSIN.RCIN,300 +MISSIN.RESTRP,0.05 +MISSIN.TAKOTM,2 +MISSIN.TAXITM,5 +MISSIN.TAXOTM,9 +MISSIN.THOLD,0.1 +MISSIN.TIMMAP,2 +OPTION.IANAL,3 +OPTION.ICOST,0 +OPTION.ILAND,0 +OPTION.INENG,1 +OPTION.IPLTTH,0 +OPTION.ITAKOF,0 +OPTION.IXFL,1 +OPTION.MPRINT,1 +OPTION.NOPRO,0 +PCONIN.CONALT,35000 +PCONIN.CONLIM,300 +PCONIN.CONMCH,0.85 +PCONIN.CONPC,1 +PCONIN.ICONSG,2 +PCONIN.ICONTP,5 +WTIN.ARFIN,1.952 +WTIN.ISPOWE,0 +WTIN.NETAW,14 +WTIN.SWPFIN,39.42 +WTIN.TCFIN,0.08 +WTIN.WINL,0 diff --git a/aviary/utils/test/data/converter_test_BWB_simple_FLOPS.csv b/aviary/utils/test/data/converter_test_BWB_simple_FLOPS.csv new file mode 100644 index 0000000000..58d33a586c --- /dev/null +++ b/aviary/utils/test/data/converter_test_BWB_simple_FLOPS.csv @@ -0,0 +1,159 @@ +# FLOPS-derived aircraft input deck converted from bwb_simple_FLOPS.in + +# Input Values +aircraft:avionics:mass_scaler,1,unitless +aircraft:blended_wing_body_design:detailed_wing_provided,False,unitless +aircraft:blended_wing_body_design:passenger_leading_edge_sweep,45.0,deg +aircraft:crew_and_payload:design:num_business_class,100,unitless +aircraft:crew_and_payload:design:num_economy_class,340,unitless +aircraft:crew_and_payload:design:num_first_class,28,unitless +aircraft:crew_and_payload:design:num_seats_abreast_business,4,unitless +aircraft:crew_and_payload:design:num_seats_abreast_economy,6,unitless +aircraft:crew_and_payload:design:num_seats_abreast_first,4,unitless +aircraft:crew_and_payload:design:seat_pitch_business,39,inch +aircraft:crew_and_payload:design:seat_pitch_economy,32,inch +aircraft:crew_and_payload:design:seat_pitch_first,61,inch +aircraft:crew_and_payload:mass_per_passenger,165.0,lbm +aircraft:crew_and_payload:num_flight_attendants,22,unitless +aircraft:crew_and_payload:num_flight_crew,2,unitless +aircraft:design:landing_to_takeoff_mass_ratio,0.8,unitless +aircraft:design:lift_dependent_drag_coeff_factor,1,unitless +aircraft:design:type,BWB,unitless +aircraft:design:use_alt_mass,False,unitless +aircraft:design:zero_lift_drag_coeff_factor,1,unitless +aircraft:engine:data_file,'ENGDEK',unitless +aircraft:engine:generate_flight_idle,True,unitless +aircraft:engine:geopotential_alt,False,unitless +aircraft:engine:ignore_negative_thrust,False,unitless +aircraft:engine:mass_scaler,1,unitless +aircraft:engine:num_fuselage_engines,3,unitless +aircraft:engine:num_wing_engines,0,unitless +aircraft:engine:reference_mass,22017,lbm +aircraft:engine:reference_sls_thrust,86459.2,lbf +aircraft:engine:scale_factor,0.8096304384033163,unitless +aircraft:engine:scaled_sls_thrust,70000,lbf +aircraft:fins:area,184.89,ft**2 +aircraft:fins:num_fins,2,unitless +aircraft:fins:taper_ratio,0.464,unitless +aircraft:fuel:density,6.7,lbm/galUS +aircraft:fuel:ignore_fuel_capacity_constraint,False,unitless +aircraft:fuel:wing_fuel_fraction,0.688354956933531,unitless +aircraft:furnishings:mass_scaler,1,unitless +aircraft:fuselage:height_to_width_ratio,0.11,unitless +aircraft:fuselage:length,137.5,ft +aircraft:fuselage:mass_scaler,1,unitless +aircraft:fuselage:max_width,64.58,ft +aircraft:fuselage:military_cargo_floor,False,unitless +aircraft:fuselage:num_fuselages,1,unitless +aircraft:fuselage:simple_layout,True,unitless +aircraft:fuselage:wetted_area_scaler,1,unitless +aircraft:horizontal_tail:area,0,ft**2 +aircraft:horizontal_tail:aspect_ratio,0,unitless +aircraft:horizontal_tail:mass_scaler,1,unitless +aircraft:horizontal_tail:taper_ratio,0,unitless +aircraft:horizontal_tail:thickness_to_chord,0.11,unitless +aircraft:hydraulics:mass_scaler,1,unitless +aircraft:hydraulics:system_pressure,3000.0,psi +aircraft:landing_gear:main_gear_oleo_length,85,inch +aircraft:landing_gear:nose_gear_oleo_length,87,inch +aircraft:nacelle:avg_diameter,12.608,ft +aircraft:nacelle:avg_length,17.433,ft +aircraft:propulsion:misc_mass_scaler,0,unitless +aircraft:vertical_tail:mass_scaler,1,unitless +aircraft:vertical_tail:num_tails,0,unitless +aircraft:vertical_tail:thickness_to_chord,0.11,unitless +aircraft:vertical_tail:wetted_area_scaler,1,unitless +aircraft:wing:aeroelastic_tailoring_factor,0,unitless +aircraft:wing:airfoil_technology,2,unitless +aircraft:wing:composite_fraction,1,unitless +aircraft:wing:control_surface_area_ratio,0.333,unitless +aircraft:wing:detailed_wing,True,unitless +aircraft:wing:dihedral,3,deg +aircraft:wing:glove_and_bat,121.05,ft**2 +aircraft:wing:input_station_dist,0.0,0.5,1.0,unitless +aircraft:wing:mass_scaler,1,unitless +aircraft:wing:max_camber_at_70_semispan,2,unitless +aircraft:wing:outboard_semispan,86.75,ft +aircraft:wing:span_efficiency_factor,0,unitless +aircraft:wing:span_efficiency_reduction,False,unitless +aircraft:wing:strut_bracing_factor,0,unitless +aircraft:wing:sweep,35.7,deg +aircraft:wing:taper_ratio,0.311,unitless +aircraft:wing:thickness_to_chord,0.11,unitless +aircraft:wing:ultimate_load_factor,3.75,unitless +aircraft:wing:var_sweep_mass_penalty,0,unitless +mission:constraints:max_mach,0.85,unitless +mission:design:gross_mass,874099,lbm +mission:design:range,7750,NM +mission:design:thrust_takeoff_per_eng,0.25,lbf +mission:landing:initial_velocity,140,ft/s +mission:landing:lift_coefficient_max,3.0,unitless +mission:summary:cruise_mach,0.85,unitless +settings:aerodynamics_method,FLOPS,unitless +settings:equations_of_motion,height_energy,unitless +settings:mass_method,FLOPS,unitless + +# Unconverted Values +AERIN.FLLDG,11000 +AERIN.FLTO,11000 +AERIN.ITPAER,2 +AERIN.MYAERO,0 +AERIN.XLLAM,0 +CONFIN.CH,39000 +CONFIN.GW,874099 +CONFIN.OFF,0 +CONFIN.OFG,1 +ENGDIN.MAXCR,1 +MISSIN.ALTRAN,200 +MISSIN.APPRTM,4 +MISSIN.CLAMIN,0 +MISSIN.CRALT,45000,25000,1500 +MISSIN.CRMACH,0.85,0.6,0 +MISSIN.DEAMIN,0 +MISSIN.FWF,-0.001 +MISSIN.HOLDTM,30 +MISSIN.IATA,0 +MISSIN.IFLAG,2 +MISSIN.IHOPOS,1 +MISSIN.IOC,1,4,4 +MISSIN.IRS,1 +MISSIN.IRW,1 +MISSIN.ISKAL,1 +MISSIN.ITTFF,1 +MISSIN.IVS,1 +MISSIN.MSUMPT,1 +MISSIN.NCLIMB,1 +MISSIN.NCLRES,1 +MISSIN.NCRHOL,3 +MISSIN.NCRRES,2 +MISSIN.NCRTH,1 +MISSIN.NCRUSE,3 +MISSIN.NPCON,0 +MISSIN.RCIN,300 +MISSIN.RESTRP,0.05 +MISSIN.TAKOTM,2 +MISSIN.TAXITM,5 +MISSIN.TAXOTM,9 +MISSIN.THOLD,0.1 +MISSIN.TIMMAP,2 +OPTION.IANAL,3 +OPTION.ICOST,0 +OPTION.ILAND,0 +OPTION.INENG,1 +OPTION.IPLTTH,0 +OPTION.ITAKOF,0 +OPTION.IXFL,1 +OPTION.MPRINT,1 +OPTION.NOPRO,0 +PCONIN.CONALT,35000 +PCONIN.CONLIM,300 +PCONIN.CONMCH,0.85 +PCONIN.CONPC,1 +PCONIN.ICONSG,2 +PCONIN.ICONTP,5 +WTIN.ARFIN,1.952 +WTIN.ISPOWE,0 +WTIN.NETAW,0 +WTIN.SWPFIN,39.42 +WTIN.TCFIN,0.08 +WTIN.WINL,0 diff --git a/aviary/utils/test/data/converter_test_advanced_single_aisle_FLOPS.csv b/aviary/utils/test/data/converter_test_advanced_single_aisle_FLOPS.csv index ec3b79b50d..d4a0c6ff1f 100644 --- a/aviary/utils/test/data/converter_test_advanced_single_aisle_FLOPS.csv +++ b/aviary/utils/test/data/converter_test_advanced_single_aisle_FLOPS.csv @@ -28,6 +28,7 @@ aircraft:design:lift_dependent_drag_coeff_factor,0.93,unitless aircraft:design:subsonic_drag_coeff_factor,0.95,unitless aircraft:design:supersonic_drag_coeff_factor,1.0,unitless aircraft:design:touchdown_mass,0.0,lbm +aircraft:design:type,transport,unitless aircraft:design:use_alt_mass,False,unitless aircraft:design:zero_lift_drag_coeff_factor,0.96,unitless aircraft:electrical:mass_scaler,1.1976,unitless @@ -72,6 +73,7 @@ aircraft:fuselage:max_width,12.3,ft aircraft:fuselage:military_cargo_floor,False,unitless aircraft:fuselage:num_fuselages,1,unitless aircraft:fuselage:passenger_compartment_length,97.5,ft +aircraft:fuselage:simple_layout,True,unitless aircraft:fuselage:wetted_area,4235.082096,ft**2 aircraft:horizontal_tail:area,349.522730527158,ft**2 aircraft:horizontal_tail:aspect_ratio,5.22699386503068,unitless @@ -288,7 +290,6 @@ MISSIN.txfufl,0 MISSIN.vqlm,260.0,320.0 OPTION.ianal,3 OPTION.icost,0 -OPTION.ifite,0 OPTION.iland,1 OPTION.ineng,0 OPTION.iplths,0 diff --git a/aviary/utils/test/test_fortran_to_aviary.py b/aviary/utils/test/test_fortran_to_aviary.py index e312b41544..f5bf0d0029 100644 --- a/aviary/utils/test/test_fortran_to_aviary.py +++ b/aviary/utils/test/test_fortran_to_aviary.py @@ -94,6 +94,28 @@ def test_bwb_gasp(self): ) self.compare_files(comparison_filepath) + def test_bwb_detailed_flops(self): + filepath = 'models/aircraft/blended_wing_body/bwb_detailed_FLOPS.in' + comparison_filepath = 'utils/test/data/converter_test_BWB_detailed_FLOPS.csv' + + self.prepare_and_run( + filepath, + out_file=Path.cwd() / Path('TEST_' + comparison_filepath), + legacy_code=LegacyCode.FLOPS, + ) + self.compare_files(comparison_filepath) + + def test_bwb_simple_flops(self): + filepath = 'models/aircraft/blended_wing_body/bwb_simple_FLOPS.in' + comparison_filepath = 'utils/test/data/converter_test_BWB_simple_FLOPS.csv' + + self.prepare_and_run( + filepath, + out_file=Path.cwd() / Path('TEST_' + comparison_filepath), + legacy_code=LegacyCode.FLOPS, + ) + self.compare_files(comparison_filepath) + def test_advanced_single_aisle(self): # Note: The csv comparison file N3CC_generic_low_speed_polars_FLOPSinp.csv was generated # using the fortran-to-Aviary converter and was not evaluated for comparison to the original. diff --git a/aviary/validation_cases/benchmark_tests/test_bwb_FwFm.py b/aviary/validation_cases/benchmark_tests/test_bwb_FwFm.py new file mode 100644 index 0000000000..b5d7be0e05 --- /dev/null +++ b/aviary/validation_cases/benchmark_tests/test_bwb_FwFm.py @@ -0,0 +1,152 @@ +import unittest +from copy import deepcopy + +from openmdao.core.problem import _clear_problem_names +from openmdao.utils.assert_utils import assert_near_equal +from openmdao.utils.testing_utils import require_pyoptsparse, use_tempdirs + +from aviary.interface.methods_for_level1 import run_aviary +from aviary.variable_info.variables import Mission + +phase_info = { + 'pre_mission': {'include_takeoff': False, 'optimize_mass': True}, + 'climb': { + 'subsystem_options': {'core_aerodynamics': {'method': 'cruise', 'solve_alpha': 'true'}}, + 'user_options': { + 'num_segments': 5, + 'order': 3, + 'mach_optimize': True, + 'mach_initial': (0.3, 'unitless'), + 'mach_bounds': ((0.3, 0.85), 'unitless'), + 'altitude_optimize': True, + 'altitude_initial': (500.0, 'ft'), + 'altitude_bounds': ((500.0, 35000.0), 'ft'), + 'no_descent': True, + 'mass_ref': (875000, 'lbm'), + 'throttle_enforcement': 'control', + 'time_initial_bounds': ((0.0, 0.0), 'min'), + 'time_duration_bounds': ((24.0, 90.0), 'min'), + }, + 'initial_guesses': { + 'altitude': ([500.5, 35000.0], 'ft'), + 'mach': ([0.3, 0.85], 'unitless'), + }, + }, + 'cruise': { + 'subsystem_options': {'core_aerodynamics': {'method': 'cruise', 'solve_alpha': 'true'}}, + 'user_options': { + 'num_segments': 5, + 'order': 3, + 'mach_optimize': False, + 'mach_initial': (0.85, 'unitless'), + 'mach_bounds': ((0.85, 0.85), 'unitless'), + 'altitude_optimize': False, + 'altitude_initial': (35000.0, 'ft'), + 'altitude_bounds': ((35000.0, 43000.0), 'ft'), + 'mass_ref': (875000, 'lbm'), + 'distance_ref': (7750, 'nmi'), + 'throttle_enforcement': 'control', + 'time_initial_bounds': ((24.0, 180.0), 'min'), + 'time_duration_bounds': ((10.0, 19.0), 'h'), + }, + 'initial_guesses': { + 'altitude': ([35000, 42000.0], 'ft'), + 'mach': ([0.85, 0.85], 'unitless'), + }, + }, + 'descent': { + 'subsystem_options': {'core_aerodynamics': {'method': 'cruise', 'solve_alpha': 'true'}}, + 'user_options': { + 'num_segments': 5, + 'order': 3, + 'mach_optimize': True, + 'mach_initial': (0.85, 'unitless'), + 'mach_final': (0.2, 'unitless'), + 'mach_bounds': ((0.2, 0.85), 'unitless'), + 'altitude_optimize': True, + 'altitude_initial': (42000.0, 'ft'), + 'altitude_final': (500.0, 'ft'), + 'altitude_bounds': ((500.0, 42000.0), 'ft'), + 'mass_ref': (875000, 'lbm'), + 'distance_ref': (7750, 'nmi'), + 'no_climb': True, + 'throttle_enforcement': 'control', + 'time_initial_bounds': ((10, 19.0), 'h'), + 'time_duration_bounds': ((0.15, 1.0), 'h'), + }, + }, + 'post_mission': { + 'include_landing': False, + 'constrain_range': True, + 'target_range': (7750.0, 'nmi'), + }, +} + + +# @use_tempdirs +class BWBProblemPhaseTestCase(unittest.TestCase): + """ + Test the setup and run of a BWB aircraft using FLOPS mass and aero method + and HEIGHT_ENERGY mission method. Expected outputs based on + 'models/aircraft/blended_wing_body/bwb_simple_FLOPS.csv' model. + """ + + def setUp(self): + _clear_problem_names() # need to reset these to simulate separate runs + + @require_pyoptsparse(optimizer='SNOPT') + def test_bench_bwb_FwFm_SNOPT(self): + local_phase_info = deepcopy(phase_info) + prob = run_aviary( + 'models/aircraft/blended_wing_body/bwb_simple_FLOPS.csv', + local_phase_info, + optimizer='SNOPT', + verbosity=1, + max_iter=60, + ) + # prob.model.list_vars(units=True, print_arrays=True) + # prob.list_indep_vars() + # prob.list_problem_vars() + # prob.model.list_outputs() + + rtol = 1e-3 + + # There are no truth values for these. + assert_near_equal( + prob.get_val(Mission.Design.GROSS_MASS, units='lbm'), + 139803.667415, + tolerance=rtol, + ) + + assert_near_equal( + prob.get_val(Mission.Summary.OPERATING_MASS, units='lbm'), + 79873.05255347, + tolerance=rtol, + ) + + assert_near_equal( + prob.get_val(Mission.Summary.TOTAL_FUEL_MASS, units='lbm'), + 26180.61486153, + tolerance=rtol, + ) + + assert_near_equal(prob.get_val(Mission.Summary.RANGE, units='NM'), 3500.0, tolerance=rtol) + + assert_near_equal( + prob.get_val(Mission.Landing.GROUND_DISTANCE, units='ft'), + 2216.0066613, + tolerance=rtol, + ) + + assert_near_equal( + prob.get_val(Mission.Landing.TOUCHDOWN_MASS, units='lbm'), + 116003.31044998, + tolerance=rtol, + ) + + +if __name__ == '__main__': + # unittest.main() + test = BWBProblemPhaseTestCase() + test.setUp() + test.test_bench_bwb_FwFm_SNOPT() diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index 1e516e96aa..a576afd657 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -1752,7 +1752,7 @@ add_meta_data( Aircraft.Design.TYPE, meta_data=_MetaData, - historical_name={'GASP': ['INGASP.IHWB'], 'FLOPS': None, 'LEAPS1': None}, + historical_name={'GASP': ['INGASP.IHWB'], 'FLOPS': ['OPTION.IFITE'], 'LEAPS1': None}, units='unitless', types=AircraftTypes, option=True, @@ -3699,7 +3699,7 @@ meta_data=_MetaData, historical_name={'GASP': None, 'FLOPS': None, 'LEAPS1': None}, units='unitless', - desc='carry out simple or detailed layout of fuselage.', + desc='carry out simple or detailed layout of fuselage (for FLOPS based geometry).', option=True, default_value=True, )