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..edafe86991 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 @@ -59,7 +59,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 +98,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 +152,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 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..9d689af69c --- /dev/null +++ b/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS.in @@ -0,0 +1,190 @@ +468 passenger BWB + + $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..04cbf34200 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,11 +113,11 @@ # 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 -inputs.set_val(Aircraft.HorizontalTail.MASS_SCALER, 1.0) # SHT +inputs.set_val(Aircraft.HorizontalTail.MASS_SCALER, 1.0) # FRHT inputs.set_val(Aircraft.HorizontalTail.WETTED_AREA_SCALER, 1.0) # SWETH # inputs.set_val(Aircraft.HorizontalTail.SWEEP, 0.0) # SWPHT @@ -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..4267713bd6 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 @@ -59,7 +59,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 +100,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 +151,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 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..486763ab81 --- /dev/null +++ b/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS.in @@ -0,0 +1,186 @@ +468 passenger BWB + + $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..445806f67b 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,11 +115,11 @@ # 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 -inputs.set_val(Aircraft.HorizontalTail.MASS_SCALER, 1.0) # SHT +inputs.set_val(Aircraft.HorizontalTail.MASS_SCALER, 1.0) # FRHT inputs.set_val(Aircraft.HorizontalTail.WETTED_AREA_SCALER, 1.0) # SWETH # inputs.set_val(Aircraft.HorizontalTail.SWEEP, 0.0) # SWPHT @@ -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/geometry/flops_based/fuselage.py b/aviary/subsystems/geometry/flops_based/fuselage.py index 35c4cfaf1e..77f60e2373 100644 --- a/aviary/subsystems/geometry/flops_based/fuselage.py +++ b/aviary/subsystems/geometry/flops_based/fuselage.py @@ -1,5 +1,6 @@ """Contains any preliminary calculations on the fuselage.""" +import warnings import numpy as np import openmdao.api as om @@ -70,7 +71,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') @@ -165,7 +168,7 @@ def compute(self, inputs, outputs): pax_compart_length = 0.6085 * length * (np.arctan(length / 59.0)) ** 1.1 if pax_compart_length > 190.0: if verbosity > Verbosity.BRIEF: - raise UserWarning( + warnings.warn( 'Passenger compartment lenght is longer than recommended maximum' ' length (of 190 ft). Suggest using detailed layout algorithm.' ) diff --git a/aviary/subsystems/geometry/flops_based/nacelle.py b/aviary/subsystems/geometry/flops_based/nacelle.py index e805347966..b8a5bbbd0a 100644 --- a/aviary/subsystems/geometry/flops_based/nacelle.py +++ b/aviary/subsystems/geometry/flops_based/nacelle.py @@ -62,20 +62,20 @@ def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None): # how many unique engine types are there (int) num_engine_type = len(num_engines) - avg_diam = inputs[Aircraft.Nacelle.AVG_DIAMETER] - avg_length = inputs[Aircraft.Nacelle.AVG_LENGTH] + ref_diam = inputs[Aircraft.Nacelle.AVG_DIAMETER] + ref_length = inputs[Aircraft.Nacelle.AVG_LENGTH] scaler = inputs[Aircraft.Nacelle.WETTED_AREA_SCALER] engine_scale = inputs[Aircraft.Engine.SCALE_FACTOR] - wetted_area = np.zeros(num_engine_type, dtype=avg_diam.dtype) + wetted_area = np.zeros(num_engine_type, dtype=ref_diam.dtype) calc_idx = np.where(num_engines >= 1) wetted_area[calc_idx] = ( scaler[calc_idx] * 2.8 - * avg_diam[calc_idx] - * avg_length[calc_idx] + * ref_diam[calc_idx] + * ref_length[calc_idx] * engine_scale[calc_idx] ) @@ -88,25 +88,25 @@ def compute(self, inputs, outputs, discrete_inputs=None, discrete_outputs=None): def compute_partials(self, inputs, J, discrete_inputs=None): num_engines = self.options[Aircraft.Engine.NUM_ENGINES] - avg_diam = inputs[Aircraft.Nacelle.AVG_DIAMETER] - avg_length = inputs[Aircraft.Nacelle.AVG_LENGTH] + ref_diam = inputs[Aircraft.Nacelle.AVG_DIAMETER] + ref_length = inputs[Aircraft.Nacelle.AVG_LENGTH] scaler = inputs[Aircraft.Nacelle.WETTED_AREA_SCALER] engine_scale = inputs[Aircraft.Engine.SCALE_FACTOR] - deriv_area_len = np.zeros(len(num_engines), dtype=avg_diam.dtype) - deriv_area_diam = np.zeros(len(num_engines), dtype=avg_diam.dtype) - deriv_area_scaler = np.zeros(len(num_engines), dtype=avg_diam.dtype) - deriv_area_thrust = np.zeros(len(num_engines), dtype=avg_diam.dtype) - deriv_total_len = np.zeros(len(num_engines), dtype=avg_diam.dtype) - deriv_total_diam = np.zeros(len(num_engines), dtype=avg_diam.dtype) - deriv_total_scaler = np.zeros(len(num_engines), dtype=avg_diam.dtype) - deriv_total_thrust = np.zeros(len(num_engines), dtype=avg_diam.dtype) - - area_to_length = 2.8 * avg_diam * engine_scale - area_to_diam = 2.8 * avg_length * engine_scale - area_to_scaler = 2.8 * avg_diam * avg_length * engine_scale - area_to_engine_scale = 2.8 * avg_diam * avg_length + deriv_area_len = np.zeros(len(num_engines), dtype=ref_diam.dtype) + deriv_area_diam = np.zeros(len(num_engines), dtype=ref_diam.dtype) + deriv_area_scaler = np.zeros(len(num_engines), dtype=ref_diam.dtype) + deriv_area_thrust = np.zeros(len(num_engines), dtype=ref_diam.dtype) + deriv_total_len = np.zeros(len(num_engines), dtype=ref_diam.dtype) + deriv_total_diam = np.zeros(len(num_engines), dtype=ref_diam.dtype) + deriv_total_scaler = np.zeros(len(num_engines), dtype=ref_diam.dtype) + deriv_total_thrust = np.zeros(len(num_engines), dtype=ref_diam.dtype) + + area_to_length = 2.8 * ref_diam * engine_scale + area_to_diam = 2.8 * ref_length * engine_scale + area_to_scaler = 2.8 * ref_diam * ref_length * engine_scale + area_to_engine_scale = 2.8 * ref_diam * ref_length calc_idx = np.where(num_engines >= 1) deriv_area_len[calc_idx] = scaler[calc_idx] * area_to_length[calc_idx] diff --git a/aviary/subsystems/geometry/flops_based/prep_geom.py b/aviary/subsystems/geometry/flops_based/prep_geom.py index a96086800f..e7a7884747 100644 --- a/aviary/subsystems/geometry/flops_based/prep_geom.py +++ b/aviary/subsystems/geometry/flops_based/prep_geom.py @@ -422,7 +422,7 @@ def compute_partials(self, inputs, J, discrete_inputs=None): fuselage_var = self.fuselage_var XDX = inputs[fuselage_var] - if design_type is not AircraftTypes.BLENDED_WING_BODY: + if design_type is AircraftTypes.TRANSPORT: area = inputs[Aircraft.HorizontalTail.AREA] aspect_ratio = inputs[Aircraft.HorizontalTail.ASPECT_RATIO] @@ -691,7 +691,7 @@ def compute(self, inputs, outputs): wingspan = inputs[Aircraft.Wing.SPAN][0] if wingspan <= 0.0: if verbosity > Verbosity.BRIEF: - print('Aircraft.Wing.SPAN must be positive.') + raise ValueError('Aircraft.Wing.SPAN must be positive.') rate_span = (wingspan - width) / wingspan # This part is repeated in BWBWingPrelim() 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/mass/flops_based/fuselage.py b/aviary/subsystems/mass/flops_based/fuselage.py index 6fb05e9eff..adabb67755 100644 --- a/aviary/subsystems/mass/flops_based/fuselage.py +++ b/aviary/subsystems/mass/flops_based/fuselage.py @@ -258,13 +258,13 @@ def compute(self, inputs, outputs): if rear_spar_percent_chord <= 0.0 or rear_spar_percent_chord >= 1.0: if verbosity > Verbosity.BRIEF: - print('Rear_spar_percent_chord must be within 0 and 1.') + raise ValueError('Rear_spar_percent_chord must be within 0 and 1.') if rear_spar_percent_chord_centerline <= 0.0 or rear_spar_percent_chord_centerline >= 1.0: if verbosity > Verbosity.BRIEF: - print('Rear_spar_percent_chord_centerline must be within 0 and 1.') + raise ValueError('Rear_spar_percent_chord_centerline must be within 0 and 1.') if length <= 0.0: if verbosity > Verbosity.BRIEF: - print('Aircraft.Fuselage.LENGTH must be positive.') + raise ValueError('Aircraft.Fuselage.LENGTH must be positive.') aftbody_area = fuse_area - cabin_area aftbody_tr = ((1.0 - rear_spar_percent_chord) * root_chord / rear_spar_percent_chord) / ( diff --git a/aviary/subsystems/mass/flops_based/mass_premission.py b/aviary/subsystems/mass/flops_based/mass_premission.py index 5c51b1fb1e..c09e1d1411 100644 --- a/aviary/subsystems/mass/flops_based/mass_premission.py +++ b/aviary/subsystems/mass/flops_based/mass_premission.py @@ -173,6 +173,36 @@ def setup(self): 'electrical', AltElectricalMass(), promotes_inputs=['*'], promotes_outputs=['*'] ) + self.add_subsystem( + 'surf_ctrl', AltSurfaceControlMass(), promotes_inputs=['*'], promotes_outputs=['*'] + ) + + if design_type == AircraftTypes.BLENDED_WING_BODY: + self.add_subsystem( + 'fuselage', + BWBFuselageMass(), + promotes_inputs=['*'], + promotes_outputs=['*'], + ) + else: + self.add_subsystem( + 'fuselage', + AltFuselageMass(), + promotes_inputs=['*'], + promotes_outputs=['*'], + ) + + self.add_subsystem( + 'htail', + AltHorizontalTailMass(), + promotes_inputs=['*'], + promotes_outputs=['*'], + ) + + self.add_subsystem( + 'vert_tail', AltVerticalTailMass(), promotes_inputs=['*'], promotes_outputs=['*'] + ) + else: self.add_subsystem( 'fuel_system', @@ -232,6 +262,36 @@ def setup(self): 'electrical', ElectricalMass(), promotes_inputs=['*'], promotes_outputs=['*'] ) + self.add_subsystem( + 'surf_ctrl', SurfaceControlMass(), promotes_inputs=['*'], promotes_outputs=['*'] + ) + + if design_type == AircraftTypes.BLENDED_WING_BODY: + self.add_subsystem( + 'fuselage', + BWBFuselageMass(), + promotes_inputs=['*'], + promotes_outputs=['*'], + ) + else: + self.add_subsystem( + 'fuselage', + TransportFuselageMass(), + promotes_inputs=['*'], + promotes_outputs=['*'], + ) + + self.add_subsystem( + 'htail', + HorizontalTailMass(), + promotes_inputs=['*'], + promotes_outputs=['*'], + ) + + self.add_subsystem( + 'vert_tail', VerticalTailMass(), promotes_inputs=['*'], promotes_outputs=['*'] + ) + self.add_subsystem( 'starter', TransportStarterMass(), promotes_inputs=['*'], promotes_outputs=['*'] ) @@ -270,68 +330,6 @@ def setup(self): 'landing_group', LandingMassGroup(), promotes_inputs=['*'], promotes_outputs=['*'] ) - if alt_mass: - self.add_subsystem( - 'surf_ctrl', AltSurfaceControlMass(), promotes_inputs=['*'], promotes_outputs=['*'] - ) - - if design_type == AircraftTypes.BLENDED_WING_BODY: - self.add_subsystem( - 'fuselage', - BWBFuselageMass(), - promotes_inputs=['*'], - promotes_outputs=['*'], - ) - else: - self.add_subsystem( - 'fuselage', - AltFuselageMass(), - promotes_inputs=['*'], - promotes_outputs=['*'], - ) - - self.add_subsystem( - 'htail', - AltHorizontalTailMass(), - promotes_inputs=['*'], - promotes_outputs=['*'], - ) - - self.add_subsystem( - 'vert_tail', AltVerticalTailMass(), promotes_inputs=['*'], promotes_outputs=['*'] - ) - - else: - self.add_subsystem( - 'surf_ctrl', SurfaceControlMass(), promotes_inputs=['*'], promotes_outputs=['*'] - ) - - if design_type == AircraftTypes.BLENDED_WING_BODY: - self.add_subsystem( - 'fuselage', - BWBFuselageMass(), - promotes_inputs=['*'], - promotes_outputs=['*'], - ) - else: - self.add_subsystem( - 'fuselage', - TransportFuselageMass(), - promotes_inputs=['*'], - promotes_outputs=['*'], - ) - - self.add_subsystem( - 'htail', - HorizontalTailMass(), - promotes_inputs=['*'], - promotes_outputs=['*'], - ) - - self.add_subsystem( - 'vert_tail', VerticalTailMass(), promotes_inputs=['*'], promotes_outputs=['*'] - ) - self.add_subsystem('canard', CanardMass(), promotes_inputs=['*'], promotes_outputs=['*']) self.add_subsystem('fin', FinMass(), promotes_inputs=['*'], promotes_outputs=['*']) 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..294d5edbcb 100644 --- a/aviary/subsystems/mass/flops_based/test/test_air_conditioning.py +++ b/aviary/subsystems/mass/flops_based/test/test_air_conditioning.py @@ -16,15 +16,13 @@ ) from aviary.variable_info.variables import Aircraft -bwb_cases = ['BWBsimpleFLOPS', 'BWBdetailedFLOPS'] - @use_tempdirs class TransportAirCondMassTest(unittest.TestCase): def setUp(self): self.prob = om.Problem() - @parameterized.expand(get_flops_case_names(omit=bwb_cases), name_func=print_case) + @parameterized.expand(get_flops_case_names(), name_func=print_case) def test_case(self, case_name): prob = self.prob @@ -35,7 +33,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) @@ -50,7 +48,7 @@ def test_case(self, case_name): ], output_keys=Aircraft.AirConditioning.MASS, aviary_option_keys=[Aircraft.CrewPayload.Design.NUM_PASSENGERS], - version=Version.TRANSPORT, + version=Version.TRANSPORT_and_BWB, tol=3.0e-4, atol=1e-11, ) @@ -166,45 +164,5 @@ def test_case(self): assert_check_partials(partial_data, atol=1e-12, rtol=1e-12) -@use_tempdirs -class BWBTransportAirCondMassTest(unittest.TestCase): - """Test air conditioning mass calculation for BWB data.""" - - 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): - """Test TransportAirCondMass component for BWB""" - prob = self.prob - - prob.model.add_subsystem( - 'air_cond', - TransportAirCondMass(), - promotes_inputs=['*'], - promotes_outputs=['*'], - ) - - prob.model_options['*'] = get_flops_options(case_name) - - prob.setup(check=False, force_alloc_complex=True) - - flops_validation_test( - prob, - case_name, - input_keys=[ - Aircraft.AirConditioning.MASS_SCALER, - Aircraft.Avionics.MASS, - Aircraft.Fuselage.MAX_HEIGHT, - Aircraft.Fuselage.PLANFORM_AREA, - ], - output_keys=Aircraft.AirConditioning.MASS, - aviary_option_keys=[Aircraft.CrewPayload.Design.NUM_PASSENGERS], - version=Version.BWB, - tol=3.0e-4, - atol=1e-11, - ) - - if __name__ == '__main__': unittest.main() diff --git a/aviary/subsystems/mass/flops_based/test/test_anti_icing.py b/aviary/subsystems/mass/flops_based/test/test_anti_icing.py index 7b7629c3e2..ddccbeeec5 100644 --- a/aviary/subsystems/mass/flops_based/test/test_anti_icing.py +++ b/aviary/subsystems/mass/flops_based/test/test_anti_icing.py @@ -17,15 +17,13 @@ ) from aviary.variable_info.variables import Aircraft -bwb_cases = ['BWBsimpleFLOPS', 'BWBdetailedFLOPS'] - @use_tempdirs class AntiIcingMassTest(unittest.TestCase): def setUp(self): self.prob = om.Problem() - @parameterized.expand(get_flops_case_names(omit=bwb_cases), name_func=print_case) + @parameterized.expand(get_flops_case_names(), name_func=print_case) def test_case(self, case_name): prob = self.prob @@ -51,6 +49,7 @@ def test_case(self, case_name): Aircraft.Wing.SWEEP, Aircraft.Engine.SCALE_FACTOR, ], + version=Version.TRANSPORT_and_BWB, output_keys=Aircraft.AntiIcing.MASS, tol=3.0e-3, ) @@ -175,49 +174,5 @@ def test_case_2(self): assert_check_partials(partial_data, atol=1e-12, rtol=1e-12) -@use_tempdirs -class BWBAntiIcingMassTest(unittest.TestCase): - """Test anti-icing mass calculation for BWB data.""" - - 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): - """test AntiIcingMass component for BWB""" - prob = self.prob - - prob.model.add_subsystem( - 'anti_icing', - AntiIcingMass(), - promotes_inputs=['*'], - promotes_outputs=['*'], - ) - - options = get_flops_options(case_name) - options[Aircraft.Engine.NUM_ENGINES] = np.array([3]) - options[Aircraft.Propulsion.TOTAL_NUM_ENGINES] = 3 - - prob.model_options['*'] = options - - prob.setup(check=False, force_alloc_complex=True) - - flops_validation_test( - prob, - case_name, - input_keys=[ - Aircraft.AntiIcing.MASS_SCALER, - Aircraft.Fuselage.MAX_WIDTH, - Aircraft.Nacelle.AVG_DIAMETER, - Aircraft.Wing.SPAN, - Aircraft.Wing.SWEEP, - Aircraft.Engine.SCALE_FACTOR, - ], - output_keys=Aircraft.AntiIcing.MASS, - version=Version.BWB, - tol=3.0e-3, - ) - - if __name__ == '__main__': unittest.main() diff --git a/aviary/subsystems/mass/flops_based/test/test_apu.py b/aviary/subsystems/mass/flops_based/test/test_apu.py index 47d1e31d9a..913c02a1e7 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 @@ -16,15 +17,13 @@ ) from aviary.variable_info.variables import Aircraft -bwb_cases = ['BWBsimpleFLOPS', 'BWBdetailedFLOPS'] - @use_tempdirs class APUMassTest(unittest.TestCase): def setUp(self): self.prob = om.Problem() - @parameterized.expand(get_flops_case_names(omit=bwb_cases), name_func=print_case) + @parameterized.expand(get_flops_case_names(), name_func=print_case) def test_case(self, case_name): prob = self.prob @@ -44,6 +43,7 @@ def test_case(self, case_name): case_name, input_keys=[Aircraft.APU.MASS_SCALER, Aircraft.Fuselage.PLANFORM_AREA], output_keys=Aircraft.APU.MASS, + version=Version.TRANSPORT_and_BWB, tol=5.0e-4, ) @@ -82,36 +82,5 @@ def test_case(self): assert_check_partials(partial_data, atol=1e-12, rtol=1e-12) -class BWBAPUMassTest(unittest.TestCase): - """Test APU mass calculation for BWB data.""" - - 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): - prob = self.prob - - prob.model.add_subsystem( - 'apu', - TransportAPUMass(), - promotes_inputs=['*'], - promotes_outputs=['*'], - ) - - prob.model_options['*'] = get_flops_options(case_name, preprocess=False) - - prob.setup(check=False, force_alloc_complex=True) - - flops_validation_test( - prob, - case_name, - input_keys=[Aircraft.APU.MASS_SCALER, Aircraft.Fuselage.PLANFORM_AREA], - output_keys=Aircraft.APU.MASS, - version=Version.BWB, - tol=5.0e-4, - ) - - if __name__ == '__main__': unittest.main() diff --git a/aviary/subsystems/mass/flops_based/test/test_avionics.py b/aviary/subsystems/mass/flops_based/test/test_avionics.py index d5e9d29078..39e45856c1 100644 --- a/aviary/subsystems/mass/flops_based/test/test_avionics.py +++ b/aviary/subsystems/mass/flops_based/test/test_avionics.py @@ -16,8 +16,6 @@ ) from aviary.variable_info.variables import Aircraft, Mission -bwb_cases = ['BWBsimpleFLOPS', 'BWBdetailedFLOPS'] - @use_tempdirs class TransportAvionicsMassTest(unittest.TestCase): @@ -26,7 +24,7 @@ class TransportAvionicsMassTest(unittest.TestCase): def setUp(self): self.prob = om.Problem() - @parameterized.expand(get_flops_case_names(omit=bwb_cases), name_func=print_case) + @parameterized.expand(get_flops_case_names(), name_func=print_case) def test_case(self, case_name): prob = self.prob @@ -51,6 +49,7 @@ def test_case(self, case_name): ], output_keys=Aircraft.Avionics.MASS, aviary_option_keys=[Aircraft.CrewPayload.NUM_FLIGHT_CREW], + version=Version.TRANSPORT_and_BWB, tol=2.0e-4, ) @@ -90,42 +89,5 @@ def test_case(self): assert_check_partials(partial_data, atol=1e-12, rtol=1e-12) -@use_tempdirs -class BWBTransportAvionicsMassTest(unittest.TestCase): - """Test fuselage mass calculation for BWB data.""" - - 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): - prob = self.prob - - prob.model.add_subsystem( - 'avionics', - TransportAvionicsMass(), - promotes_inputs=['*'], - promotes_outputs=['*'], - ) - - prob.model_options['*'] = get_flops_options(case_name, preprocess=True) - - prob.setup(check=False, force_alloc_complex=True) - - flops_validation_test( - prob, - case_name, - input_keys=[ - Aircraft.Avionics.MASS_SCALER, - Aircraft.Fuselage.PLANFORM_AREA, - Mission.Design.RANGE, - ], - output_keys=Aircraft.Avionics.MASS, - version=Version.BWB, - aviary_option_keys=[Aircraft.CrewPayload.NUM_FLIGHT_CREW], - tol=2.0e-4, - ) - - if __name__ == '__main__': unittest.main() diff --git a/aviary/subsystems/mass/flops_based/test/test_cargo_containers.py b/aviary/subsystems/mass/flops_based/test/test_cargo_containers.py index 7161b566a6..161446ec33 100644 --- a/aviary/subsystems/mass/flops_based/test/test_cargo_containers.py +++ b/aviary/subsystems/mass/flops_based/test/test_cargo_containers.py @@ -16,15 +16,13 @@ ) from aviary.variable_info.variables import Aircraft -bwb_cases = ['BWBsimpleFLOPS', 'BWBdetailedFLOPS'] - @use_tempdirs class CargoContainerMassTest(unittest.TestCase): def setUp(self): self.prob = om.Problem() - @parameterized.expand(get_flops_case_names(omit=bwb_cases), name_func=print_case) + @parameterized.expand(get_flops_case_names(), name_func=print_case) def test_case(self, case_name): prob = self.prob @@ -48,6 +46,7 @@ def test_case(self, case_name): Aircraft.CrewPayload.BAGGAGE_MASS, ], output_keys=Aircraft.CrewPayload.CARGO_CONTAINER_MASS, + version=Version.TRANSPORT_and_BWB, rtol=1e-10, ) @@ -88,41 +87,5 @@ def test_case(self): assert_check_partials(partial_data, atol=1e-12, rtol=1e-12) -@use_tempdirs -class BWBCargoContainersMassTest(unittest.TestCase): - """Test BWB cargo containers mass""" - - 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): - prob = self.prob - - prob.model.add_subsystem( - 'cargo_containers', - TransportCargoContainersMass(), - promotes_inputs=['*'], - promotes_outputs=['*'], - ) - - prob.model_options['*'] = get_flops_options(case_name, preprocess=True) - - prob.setup(check=False, force_alloc_complex=True) - - flops_validation_test( - prob, - case_name, - input_keys=[ - Aircraft.CrewPayload.CARGO_CONTAINER_MASS_SCALER, - Aircraft.CrewPayload.CARGO_MASS, - Aircraft.CrewPayload.BAGGAGE_MASS, - ], - output_keys=Aircraft.CrewPayload.CARGO_CONTAINER_MASS, - version=Version.BWB, - rtol=1e-10, - ) - - if __name__ == '__main__': unittest.main() diff --git a/aviary/subsystems/mass/flops_based/test/test_crew.py b/aviary/subsystems/mass/flops_based/test/test_crew.py index f656cea1e6..c14d76ccfd 100644 --- a/aviary/subsystems/mass/flops_based/test/test_crew.py +++ b/aviary/subsystems/mass/flops_based/test/test_crew.py @@ -15,15 +15,13 @@ ) from aviary.variable_info.variables import Aircraft -bwb_cases = ['BWBsimpleFLOPS', 'BWBdetailedFLOPS'] - @use_tempdirs class CabinCrewMassTest(unittest.TestCase): def setUp(self): self.prob = om.Problem() - @parameterized.expand(get_flops_case_names(omit=bwb_cases), name_func=print_case) + @parameterized.expand(get_flops_case_names(), name_func=print_case) def test_case(self, case_name): prob = self.prob @@ -43,6 +41,7 @@ def test_case(self, case_name): case_name, input_keys=Aircraft.CrewPayload.CABIN_CREW_MASS_SCALER, output_keys=Aircraft.CrewPayload.CABIN_CREW_MASS, + version=Version.TRANSPORT_and_BWB, atol=1e-11, ) @@ -55,7 +54,7 @@ class FlightCrewMassTest(unittest.TestCase): def setUp(self): self.prob = om.Problem() - @parameterized.expand(get_flops_case_names(omit=bwb_cases), name_func=print_case) + @parameterized.expand(get_flops_case_names(), name_func=print_case) def test_case(self, case_name): prob = self.prob @@ -75,6 +74,7 @@ def test_case(self, case_name): case_name, input_keys=Aircraft.CrewPayload.FLIGHT_CREW_MASS_SCALER, output_keys=Aircraft.CrewPayload.FLIGHT_CREW_MASS, + version=Version.TRANSPORT_and_BWB, atol=1e-11, ) @@ -82,69 +82,5 @@ def test_IO(self): assert_match_varnames(self.prob.model) -@use_tempdirs -class BWBCabinCrewMassTest(unittest.TestCase): - """Test non-flight crew mass calculation for BWB data.""" - - 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): - prob = self.prob - - prob.model.add_subsystem( - 'cabin_crew', - CabinCrewMass(), - promotes_inputs=['*'], - promotes_outputs=['*'], - ) - - prob.model_options['*'] = get_flops_options(case_name, preprocess=False) - - prob.setup(check=False, force_alloc_complex=True) - - flops_validation_test( - prob, - case_name, - input_keys=Aircraft.CrewPayload.CABIN_CREW_MASS_SCALER, - output_keys=Aircraft.CrewPayload.CABIN_CREW_MASS, - version=Version.BWB, - atol=1e-11, - ) - - -@use_tempdirs -class BWBFlightCrewMassTest(unittest.TestCase): - """Test flight crew mass calculation for BWB data.""" - - 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): - prob = self.prob - - prob.model.add_subsystem( - 'flight_crew', - FlightCrewMass(), - promotes_inputs=['*'], - promotes_outputs=['*'], - ) - - prob.model_options['*'] = get_flops_options(case_name, preprocess=True) - - prob.setup(check=False, force_alloc_complex=True) - - flops_validation_test( - prob, - case_name, - input_keys=Aircraft.CrewPayload.FLIGHT_CREW_MASS_SCALER, - output_keys=Aircraft.CrewPayload.FLIGHT_CREW_MASS, - version=Version.BWB, - atol=1e-11, - ) - - if __name__ == '__main__': unittest.main() diff --git a/aviary/subsystems/mass/flops_based/test/test_electrical.py b/aviary/subsystems/mass/flops_based/test/test_electrical.py index 5748dfebda..902ca0307b 100644 --- a/aviary/subsystems/mass/flops_based/test/test_electrical.py +++ b/aviary/subsystems/mass/flops_based/test/test_electrical.py @@ -24,7 +24,7 @@ class ElectricMassTest(unittest.TestCase): def setUp(self): self.prob = om.Problem() - @parameterized.expand(get_flops_case_names(omit=bwb_cases), name_func=print_case) + @parameterized.expand(get_flops_case_names(), name_func=print_case) def test_case(self, case_name): prob = self.prob @@ -54,7 +54,7 @@ def test_case(self, case_name): Aircraft.Electrical.MASS_SCALER, ], output_keys=Aircraft.Electrical.MASS, - version=Version.TRANSPORT, + version=Version.TRANSPORT_and_BWB, ) def test_IO(self): @@ -171,46 +171,5 @@ def test_IO(self): assert_match_varnames(self.prob.model) -@use_tempdirs -class BWBElectricMassTest(unittest.TestCase): - """Test electric mass calculation for BWB data.""" - - 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): - prob = self.prob - - prob.model.add_subsystem( - 'electric_test', - ElectricalMass(), - promotes_outputs=[ - Aircraft.Electrical.MASS, - ], - promotes_inputs=[ - Aircraft.Fuselage.LENGTH, - Aircraft.Fuselage.MAX_WIDTH, - Aircraft.Electrical.MASS_SCALER, - ], - ) - - prob.model_options['*'] = get_flops_options(case_name, preprocess=True) - - prob.setup(check=False, force_alloc_complex=True) - - flops_validation_test( - self.prob, - case_name, - input_keys=[ - Aircraft.Fuselage.LENGTH, - Aircraft.Fuselage.MAX_WIDTH, - Aircraft.Electrical.MASS_SCALER, - ], - output_keys=Aircraft.Electrical.MASS, - version=Version.BWB, - ) - - if __name__ == '__main__': unittest.main() diff --git a/aviary/subsystems/mass/flops_based/test/test_empty_margin.py b/aviary/subsystems/mass/flops_based/test/test_empty_margin.py index 9b15998674..377481dfde 100644 --- a/aviary/subsystems/mass/flops_based/test/test_empty_margin.py +++ b/aviary/subsystems/mass/flops_based/test/test_empty_margin.py @@ -15,15 +15,13 @@ ) from aviary.variable_info.variables import Aircraft -bwb_cases = ['BWBsimpleFLOPS', 'BWBdetailedFLOPS'] - @use_tempdirs class EmptyMassMarginTest(unittest.TestCase): def setUp(self): self.prob = om.Problem() - @parameterized.expand(get_flops_case_names(omit=bwb_cases), name_func=print_case) + @parameterized.expand(get_flops_case_names(), name_func=print_case) def test_case(self, case_name): prob = self.prob @@ -48,6 +46,7 @@ def test_case(self, case_name): Aircraft.Design.EMPTY_MASS_MARGIN_SCALER, ], output_keys=Aircraft.Design.EMPTY_MASS_MARGIN, + version=Version.TRANSPORT_and_BWB, tol=1e-3, atol=2e-11, ) @@ -56,43 +55,5 @@ def test_IO(self): assert_match_varnames(self.prob.model) -@use_tempdirs -class BWBEmptyMassMarginTest(unittest.TestCase): - """Test empty mass margin calculation for BWB data.""" - - 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): - prob = self.prob - - prob.model.add_subsystem( - 'margin', - EmptyMassMargin(), - promotes_inputs=['*'], - promotes_outputs=['*'], - ) - - prob.model_options['*'] = get_flops_options(case_name, preprocess=True) - - prob.setup(check=False, force_alloc_complex=True) - - flops_validation_test( - prob, - case_name, - input_keys=[ - Aircraft.Propulsion.MASS, - Aircraft.Design.STRUCTURE_MASS, - Aircraft.Design.SYSTEMS_AND_EQUIPMENT_MASS, - Aircraft.Design.EMPTY_MASS_MARGIN_SCALER, - ], - output_keys=Aircraft.Design.EMPTY_MASS_MARGIN, - version=Version.BWB, - tol=1e-3, - atol=2e-11, - ) - - if __name__ == '__main__': unittest.main() diff --git a/aviary/subsystems/mass/flops_based/test/test_engine_controls.py b/aviary/subsystems/mass/flops_based/test/test_engine_controls.py index ea705a065a..61fc6e3ea1 100644 --- a/aviary/subsystems/mass/flops_based/test/test_engine_controls.py +++ b/aviary/subsystems/mass/flops_based/test/test_engine_controls.py @@ -16,9 +16,6 @@ ) from aviary.variable_info.variables import Aircraft -bwb_cases = ['BWBsimpleFLOPS', 'BWBdetailedFLOPS'] -omit_cases = ['AdvancedSingleAisle', 'BWBsimpleFLOPS', 'BWBdetailedFLOPS'] - @use_tempdirs class BasicTransportEngineCtrlsTest(unittest.TestCase): @@ -27,7 +24,7 @@ class BasicTransportEngineCtrlsTest(unittest.TestCase): def setUp(self): self.prob = om.Problem() - @parameterized.expand(get_flops_case_names(omit=omit_cases), name_func=print_case) + @parameterized.expand(get_flops_case_names(omit='AdvancedSingleAisle'), name_func=print_case) def test_case(self, case_name): prob = self.prob @@ -47,6 +44,7 @@ def test_case(self, case_name): case_name, input_keys=[Aircraft.Propulsion.TOTAL_SCALED_SLS_THRUST], output_keys=Aircraft.Propulsion.TOTAL_ENGINE_CONTROLS_MASS, + version=Version.TRANSPORT_and_BWB, atol=2e-12, excludes=['size_prop.*'], ) @@ -86,41 +84,5 @@ def test_case(self): assert_check_partials(partial_data, atol=1e-12, rtol=1e-12) -@use_tempdirs -class BWBBasicTransportEngineCtrlsTest(unittest.TestCase): - """ - Test empty mass margin calculation for BWB data. - In FLOPS, WEC is scaled after override. We ignore the difference for now. - """ - - 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): - prob = self.prob - - prob.model.add_subsystem( - 'engine_ctrls', - TransportEngineCtrlsMass(), - promotes_outputs=['*'], - promotes_inputs=['*'], - ) - - prob.model_options['*'] = get_flops_options(case_name, preprocess=True) - - prob.setup(force_alloc_complex=True) - - flops_validation_test( - prob, - case_name, - input_keys=[Aircraft.Propulsion.TOTAL_SCALED_SLS_THRUST], - output_keys=Aircraft.Propulsion.TOTAL_ENGINE_CONTROLS_MASS, - version=Version.BWB, - atol=2e-12, - excludes=['size_prop.*'], - ) - - if __name__ == '__main__': unittest.main() diff --git a/aviary/subsystems/mass/flops_based/test/test_engine_oil.py b/aviary/subsystems/mass/flops_based/test/test_engine_oil.py index 961ac22623..92d793a384 100644 --- a/aviary/subsystems/mass/flops_based/test/test_engine_oil.py +++ b/aviary/subsystems/mass/flops_based/test/test_engine_oil.py @@ -16,8 +16,6 @@ ) from aviary.variable_info.variables import Aircraft -bwb_cases = ['BWBsimpleFLOPS', 'BWBdetailedFLOPS'] - @use_tempdirs class TransportEngineOilMassTest(unittest.TestCase): @@ -26,12 +24,15 @@ class TransportEngineOilMassTest(unittest.TestCase): def setUp(self): self.prob = om.Problem() - @parameterized.expand(get_flops_case_names(omit=bwb_cases), name_func=print_case) + @parameterized.expand(get_flops_case_names(), name_func=print_case) def test_case(self, case_name): prob = self.prob + inputs = get_flops_inputs(case_name, preprocess=True) options = { - Aircraft.Propulsion.TOTAL_NUM_ENGINES: 2, + Aircraft.Propulsion.TOTAL_NUM_ENGINES: inputs.get_val( + Aircraft.Propulsion.TOTAL_NUM_ENGINES + ), } prob.model.add_subsystem( @@ -53,7 +54,7 @@ def test_case(self, case_name): Aircraft.Propulsion.TOTAL_SCALED_SLS_THRUST, ], output_keys=[Aircraft.Propulsion.TOTAL_ENGINE_OIL_MASS], - version=Version.TRANSPORT, + version=Version.TRANSPORT_and_BWB, tol=4.0e-3, ) @@ -168,43 +169,5 @@ def test_case(self): assert_check_partials(partial_data, atol=1e-12, rtol=1e-12) -class BWBTransportEngineOilMassTest(unittest.TestCase): - """Tests transport/GA engine oil mass calculation for BWB.""" - - 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): - prob = self.prob - - options = { - Aircraft.Propulsion.TOTAL_NUM_ENGINES: 3, - } - - prob.model.add_subsystem( - 'engine_oil', - TransportEngineOilMass(**options), - promotes_outputs=['*'], - promotes_inputs=['*'], - ) - - prob.model_options['*'] = options - - prob.setup(check=False, force_alloc_complex=True) - - flops_validation_test( - prob, - case_name, - input_keys=[ - Aircraft.Propulsion.ENGINE_OIL_MASS_SCALER, - Aircraft.Propulsion.TOTAL_SCALED_SLS_THRUST, - ], - output_keys=[Aircraft.Propulsion.TOTAL_ENGINE_OIL_MASS], - version=Version.BWB, - tol=4.0e-3, - ) - - if __name__ == '__main__': unittest.main() diff --git a/aviary/subsystems/mass/flops_based/test/test_engine_pod.py b/aviary/subsystems/mass/flops_based/test/test_engine_pod.py index 07e3ac0530..b6f1853a0b 100644 --- a/aviary/subsystems/mass/flops_based/test/test_engine_pod.py +++ b/aviary/subsystems/mass/flops_based/test/test_engine_pod.py @@ -17,13 +17,7 @@ ) from aviary.variable_info.variables import Aircraft -bwb_cases = ['BWBsimpleFLOPS', 'BWBdetailedFLOPS'] -omit_cases = [ - 'LargeSingleAisle2FLOPS', - 'LargeSingleAisle2FLOPSalt', - 'BWBsimpleFLOPS', - 'BWBdetailedFLOPS', -] +omit_cases = ['LargeSingleAisle2FLOPS', 'LargeSingleAisle2FLOPSalt'] @use_tempdirs @@ -71,6 +65,7 @@ def test_case(self, case_name): Aircraft.Propulsion.TOTAL_SCALED_SLS_THRUST, ], output_keys=Aircraft.Engine.POD_MASS, + version=Version.TRANSPORT_and_BWB, tol=3e-3, ) @@ -108,54 +103,5 @@ def test_IO(self): assert_match_varnames(self.prob.model) -@use_tempdirs -class BWBEnginePodMassTest(unittest.TestCase): - """Tests the engine pod mass needed for the detailed wing calculation for BWB.""" - - 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): - prob = self.prob - - inputs = get_flops_inputs(case_name, preprocess=True) - - options = { - Aircraft.Engine.NUM_ENGINES: inputs.get_val(Aircraft.Engine.NUM_ENGINES), - } - - prob.model.add_subsystem( - 'engine_pod', EnginePodMass(), promotes_outputs=['*'], promotes_inputs=['*'] - ) - - prob.model_options['*'] = options - - prob.setup(check=False, force_alloc_complex=True) - - # Tol not that tight, but it is unclear where the pod mass values in files come from, - # since they aren't printed in the FLOPS output. - flops_validation_test( - prob, - case_name, - input_keys=[ - Aircraft.Electrical.MASS, - Aircraft.Fuel.FUEL_SYSTEM_MASS, - Aircraft.Hydraulics.MASS, - Aircraft.Instruments.MASS, - Aircraft.Nacelle.MASS, - Aircraft.Propulsion.TOTAL_ENGINE_CONTROLS_MASS, - Aircraft.Engine.MASS, - Aircraft.Propulsion.TOTAL_STARTER_MASS, - Aircraft.Engine.THRUST_REVERSERS_MASS, - Aircraft.Engine.SCALED_SLS_THRUST, - Aircraft.Propulsion.TOTAL_SCALED_SLS_THRUST, - ], - output_keys=Aircraft.Engine.POD_MASS, - version=Version.BWB, - tol=3e-3, - ) - - if __name__ == '__main__': unittest.main() diff --git a/aviary/subsystems/mass/flops_based/test/test_fuel_system.py b/aviary/subsystems/mass/flops_based/test/test_fuel_system.py index 12c3fb265e..d7ca7de71d 100644 --- a/aviary/subsystems/mass/flops_based/test/test_fuel_system.py +++ b/aviary/subsystems/mass/flops_based/test/test_fuel_system.py @@ -91,15 +91,12 @@ def test_case(self): assert_check_partials(partial_data, atol=1e-12, rtol=1e-12) -bwb_cases = ['BWBsimpleFLOPS', 'BWBdetailedFLOPS'] - - @use_tempdirs class TransportFuelSystemTest(unittest.TestCase): def setUp(self): self.prob = om.Problem() - @parameterized.expand(get_flops_case_names(omit=bwb_cases), name_func=print_case) + @parameterized.expand(get_flops_case_names(), name_func=print_case) def test_case(self, case_name): prob = self.prob @@ -126,7 +123,7 @@ def test_case(self, case_name): case_name, input_keys=[Aircraft.Fuel.FUEL_SYSTEM_MASS_SCALER, Aircraft.Fuel.TOTAL_CAPACITY], output_keys=Aircraft.Fuel.FUEL_SYSTEM_MASS, - version=Version.TRANSPORT, + version=Version.TRANSPORT_and_BWB, tol=8.0e-4, ) @@ -172,44 +169,5 @@ def test_case(self): assert_check_partials(partial_data, atol=1e-12, rtol=1e-12) -@use_tempdirs -class BWBTransportFuelSystemTest(unittest.TestCase): - """Tests fuel system mass calculation for BWB.""" - - 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): - prob = self.prob - - inputs = get_flops_inputs(case_name, preprocess=True) - - options = { - Aircraft.Propulsion.TOTAL_NUM_ENGINES: inputs.get_val( - Aircraft.Propulsion.TOTAL_NUM_ENGINES - ), - Mission.Constraints.MAX_MACH: inputs.get_val(Mission.Constraints.MAX_MACH), - } - - prob.model.add_subsystem( - 'bwb_transport_fuel_sys_test', - TransportFuelSystemMass(**options), - promotes_outputs=['*'], - promotes_inputs=['*'], - ) - - prob.setup(check=False, force_alloc_complex=True) - - flops_validation_test( - prob, - case_name, - input_keys=[Aircraft.Fuel.FUEL_SYSTEM_MASS_SCALER, Aircraft.Fuel.TOTAL_CAPACITY], - output_keys=Aircraft.Fuel.FUEL_SYSTEM_MASS, - version=Version.BWB, - tol=8.0e-4, - ) - - if __name__ == '__main__': unittest.main() diff --git a/aviary/subsystems/mass/flops_based/test/test_furnishings.py b/aviary/subsystems/mass/flops_based/test/test_furnishings.py index af0e1f0457..4fb1b44049 100644 --- a/aviary/subsystems/mass/flops_based/test/test_furnishings.py +++ b/aviary/subsystems/mass/flops_based/test/test_furnishings.py @@ -65,7 +65,7 @@ def test_IO(self): class BWBFurnishingsGroupMassTest(unittest.TestCase): - """Tests transport/GA furnishings mass calculation.""" + """Tests BWB furnishings mass calculation.""" def setUp(self): self.prob = om.Problem() @@ -101,7 +101,7 @@ def test_case(self, case_name): ) -class BWBFurnishingsGroupMassTest2(unittest.TestCase): +class TransportFurnishingsGroupMassTest2(unittest.TestCase): """Test mass-weight conversion.""" def setUp(self): diff --git a/aviary/subsystems/mass/flops_based/test/test_horizontail_tail.py b/aviary/subsystems/mass/flops_based/test/test_horizontail_tail.py index de43ab99e0..bab6c84ebd 100644 --- a/aviary/subsystems/mass/flops_based/test/test_horizontail_tail.py +++ b/aviary/subsystems/mass/flops_based/test/test_horizontail_tail.py @@ -18,15 +18,13 @@ ) from aviary.variable_info.variables import Aircraft, Mission -bwb_cases = ['BWBsimpleFLOPS', 'BWBdetailedFLOPS'] - @use_tempdirs class ExplicitHorizontalTailMassTest(unittest.TestCase): def setUp(self): self.prob = om.Problem() - @parameterized.expand(get_flops_case_names(omit=bwb_cases), name_func=print_case) + @parameterized.expand(get_flops_case_names(), name_func=print_case) def test_case(self, case_name): prob = self.prob @@ -49,7 +47,7 @@ def test_case(self, case_name): Aircraft.HorizontalTail.MASS_SCALER, ], output_keys=Aircraft.HorizontalTail.MASS, - version=Version.TRANSPORT, + version=Version.TRANSPORT_and_BWB, tol=2.0e-4, ) @@ -87,6 +85,7 @@ def test_case(self): assert_check_partials(partial_data, atol=1e-12, rtol=1e-12) +@use_tempdirs class ExplicitAltHorizontalTailMassTest(unittest.TestCase): def setUp(self): self.prob = om.Problem() @@ -144,40 +143,5 @@ def test_case(self): assert_check_partials(partial_data, atol=1e-12, rtol=1e-12) -@use_tempdirs -class BWBExplicitHorizontalTailMassTest(unittest.TestCase): - """Tests horizontal tail mass calculation for BWB.""" - - 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): - prob = self.prob - - prob.model.add_subsystem( - 'horizontal_tail', - HorizontalTailMass(), - promotes_inputs=['*'], - promotes_outputs=['*'], - ) - - prob.setup(check=False, force_alloc_complex=True) - - flops_validation_test( - prob, - case_name, - input_keys=[ - Aircraft.HorizontalTail.AREA, - Aircraft.HorizontalTail.TAPER_RATIO, - Mission.Design.GROSS_MASS, - Aircraft.HorizontalTail.MASS_SCALER, - ], - output_keys=Aircraft.HorizontalTail.MASS, - version=Version.BWB, - tol=2.0e-4, - ) - - if __name__ == '__main__': unittest.main() diff --git a/aviary/subsystems/mass/flops_based/test/test_hydraulics.py b/aviary/subsystems/mass/flops_based/test/test_hydraulics.py index 9a31f34a31..dfb827fd93 100644 --- a/aviary/subsystems/mass/flops_based/test/test_hydraulics.py +++ b/aviary/subsystems/mass/flops_based/test/test_hydraulics.py @@ -29,7 +29,7 @@ class TransportHydraulicsGroupMassTest(unittest.TestCase): def setUp(self): self.prob = om.Problem() - @parameterized.expand(get_flops_case_names(omit=bwb_cases), name_func=print_case) + @parameterized.expand(get_flops_case_names(), name_func=print_case) def test_case(self, case_name): prob = self.prob @@ -65,7 +65,7 @@ def test_case(self, case_name): Aircraft.Wing.VAR_SWEEP_MASS_PENALTY, ], output_keys=Aircraft.Hydraulics.MASS, - version=Version.TRANSPORT, + version=Version.TRANSPORT_and_BWB, tol=4.0e-4, ) @@ -187,7 +187,7 @@ 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): + def testsdg_case(self, case_name): prob = self.prob inputs = get_flops_inputs(case_name, preprocess=True) diff --git a/aviary/subsystems/mass/flops_based/test/test_instruments.py b/aviary/subsystems/mass/flops_based/test/test_instruments.py index 6e4efd43ec..163eb09c5d 100644 --- a/aviary/subsystems/mass/flops_based/test/test_instruments.py +++ b/aviary/subsystems/mass/flops_based/test/test_instruments.py @@ -16,14 +16,12 @@ ) from aviary.variable_info.variables import Aircraft, Mission -bwb_cases = ['BWBsimpleFLOPS', 'BWBdetailedFLOPS'] - class TransportInstrumentsMassTest(unittest.TestCase): def setUp(self): self.prob = om.Problem() - @parameterized.expand(get_flops_case_names(omit=bwb_cases), name_func=print_case) + @parameterized.expand(get_flops_case_names(), name_func=print_case) def test_case(self, case_name): prob = self.prob @@ -58,6 +56,7 @@ def test_case(self, case_name): case_name, input_keys=[Aircraft.Fuselage.PLANFORM_AREA, Aircraft.Instruments.MASS_SCALER], output_keys=Aircraft.Instruments.MASS, + version=Version.TRANSPORT_and_BWB, tol=1e-3, ) @@ -111,52 +110,5 @@ def test_case(self): assert_check_partials(partial_data, atol=1e-12, rtol=1e-12) -@use_tempdirs -class BWBTransportInstrumentsMassTest(unittest.TestCase): - """Tests instrument mass calculation for BWB.""" - - 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): - prob = self.prob - - inputs = get_flops_inputs(case_name, preprocess=True) - - options = { - Aircraft.CrewPayload.NUM_FLIGHT_CREW: inputs.get_val( - Aircraft.CrewPayload.NUM_FLIGHT_CREW - ), - Aircraft.Propulsion.TOTAL_NUM_FUSELAGE_ENGINES: inputs.get_val( - Aircraft.Propulsion.TOTAL_NUM_FUSELAGE_ENGINES - ), - Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES: inputs.get_val( - Aircraft.Propulsion.TOTAL_NUM_WING_ENGINES - ), - Mission.Constraints.MAX_MACH: inputs.get_val(Mission.Constraints.MAX_MACH), - } - - prob.model.add_subsystem( - 'instruments_tests', - TransportInstrumentMass(**options), - promotes_outputs=[ - Aircraft.Instruments.MASS, - ], - promotes_inputs=[Aircraft.Fuselage.PLANFORM_AREA, Aircraft.Instruments.MASS_SCALER], - ) - - prob.setup(check=False, force_alloc_complex=True) - - flops_validation_test( - prob, - case_name, - input_keys=[Aircraft.Fuselage.PLANFORM_AREA, Aircraft.Instruments.MASS_SCALER], - output_keys=Aircraft.Instruments.MASS, - version=Version.BWB, - tol=1e-3, - ) - - if __name__ == '__main__': unittest.main() diff --git a/aviary/subsystems/mass/flops_based/test/test_landing_gear.py b/aviary/subsystems/mass/flops_based/test/test_landing_gear.py index dd585de091..b06c931f6a 100644 --- a/aviary/subsystems/mass/flops_based/test/test_landing_gear.py +++ b/aviary/subsystems/mass/flops_based/test/test_landing_gear.py @@ -21,15 +21,13 @@ ) from aviary.variable_info.variables import Aircraft, Mission -bwb_cases = ['BWBsimpleFLOPS', 'BWBdetailedFLOPS'] - @use_tempdirs class LandingGearMassTest(unittest.TestCase): def setUp(self): self.prob = om.Problem() - @parameterized.expand(get_flops_case_names(omit=bwb_cases), name_func=print_case) + @parameterized.expand(get_flops_case_names(), name_func=print_case) def test_case(self, case_name): prob = self.prob @@ -53,7 +51,7 @@ def test_case(self, case_name): Aircraft.Design.TOUCHDOWN_MASS, ], output_keys=[Aircraft.LandingGear.MAIN_GEAR_MASS, Aircraft.LandingGear.NOSE_GEAR_MASS], - version=Version.TRANSPORT, + version=Version.TRANSPORT_and_BWB, atol=1e-11, ) @@ -200,41 +198,5 @@ def test_IO(self): assert_match_varnames(self.prob.model) -@use_tempdirs -class BWBLandingGearMassTest(unittest.TestCase): - """Tests landing gear mass calculation for BWB.""" - - 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): - prob = self.prob - - prob.model.add_subsystem( - 'landing_gear', - LandingGearMass(), - promotes_inputs=['*'], - promotes_outputs=['*'], - ) - - prob.setup(check=False, force_alloc_complex=True) - - flops_validation_test( - self.prob, - case_name, - input_keys=[ - Aircraft.LandingGear.MAIN_GEAR_OLEO_LENGTH, - Aircraft.LandingGear.MAIN_GEAR_MASS_SCALER, - Aircraft.LandingGear.NOSE_GEAR_OLEO_LENGTH, - Aircraft.LandingGear.NOSE_GEAR_MASS_SCALER, - Aircraft.Design.TOUCHDOWN_MASS, - ], - output_keys=[Aircraft.LandingGear.MAIN_GEAR_MASS, Aircraft.LandingGear.NOSE_GEAR_MASS], - version=Version.BWB, - atol=1e-11, - ) - - if __name__ == '__main__': unittest.main() diff --git a/aviary/subsystems/mass/flops_based/test/test_landing_mass.py b/aviary/subsystems/mass/flops_based/test/test_landing_mass.py index 50446cc73e..1e667208db 100644 --- a/aviary/subsystems/mass/flops_based/test/test_landing_mass.py +++ b/aviary/subsystems/mass/flops_based/test/test_landing_mass.py @@ -14,15 +14,13 @@ ) from aviary.variable_info.variables import Aircraft, Mission -omit_cases = ['LargeSingleAisle1FLOPS', 'BWBsimpleFLOPS', 'BWBdetailedFLOPS'] - @use_tempdirs class LandingMassTest(unittest.TestCase): def setUp(self): self.prob = om.Problem() - @parameterized.expand(get_flops_case_names(omit=omit_cases), name_func=print_case) + @parameterized.expand(get_flops_case_names(omit='LargeSingleAisle1FLOPS'), name_func=print_case) def test_case(self, case_name): prob = self.prob prob.model.add_subsystem('landing_mass', LandingMass(), promotes=['*']) @@ -34,37 +32,12 @@ def test_case(self, case_name): case_name, input_keys=[Mission.Design.GROSS_MASS, Aircraft.Design.LANDING_TO_TAKEOFF_MASS_RATIO], output_keys=Aircraft.Design.TOUCHDOWN_MASS, + version=Version.TRANSPORT_and_BWB, ) def test_IO(self): assert_match_varnames(self.prob.model) -bwb_cases = ['BWBsimpleFLOPS', 'BWBdetailedFLOPS'] - - -@use_tempdirs -class BWBLandingMassTest(unittest.TestCase): - """Tests landing mass calculation for BWB.""" - - 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): - prob = self.prob - prob.model.add_subsystem('landing_mass', LandingMass(), promotes=['*']) - - prob.setup(check=False, force_alloc_complex=True) - - flops_validation_test( - prob, - case_name, - input_keys=[Mission.Design.GROSS_MASS, Aircraft.Design.LANDING_TO_TAKEOFF_MASS_RATIO], - output_keys=Aircraft.Design.TOUCHDOWN_MASS, - version=Version.BWB, - ) - - if __name__ == '__main__': unittest.main() 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 7d52056e92..5885c07452 100644 --- a/aviary/subsystems/mass/flops_based/test/test_mass_summation.py +++ b/aviary/subsystems/mass/flops_based/test/test_mass_summation.py @@ -27,15 +27,13 @@ from aviary.variable_info.functions import setup_model_options from aviary.variable_info.variables import Aircraft, Mission, Settings -bwb_cases = ['BWBsimpleFLOPS', 'BWBdetailedFLOPS'] - @use_tempdirs class TotalSummationTest(unittest.TestCase): def setUp(self): self.prob = om.Problem() - @parameterized.expand(get_flops_case_names(omit=bwb_cases), name_func=print_case) + @parameterized.expand(get_flops_case_names(), name_func=print_case) def test_case(self, case_name): prob = self.prob @@ -102,7 +100,7 @@ def test_case(self, case_name): Mission.Summary.ZERO_FUEL_MASS, Mission.Summary.FUEL_MASS, ], - version=Version.TRANSPORT, + version=Version.TRANSPORT_and_BWB, atol=1e-10, ) om.n2(prob, show_browser=False) @@ -247,89 +245,5 @@ def test_case_multiengine(self): assert_check_partials(partial_data, atol=1e-6, rtol=1e-6) -@use_tempdirs -class BWBTotalSummationTest(unittest.TestCase): - """Tests total summation mass calculation for BWB.""" - - 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): - prob = self.prob - - prob.model.add_subsystem( - 'tot', - MassSummation(), - promotes_inputs=['*'], - promotes_outputs=['*'], - ) - - setup_model_options( - self.prob, AviaryValues({Aircraft.Engine.NUM_ENGINES: ([3], 'unitless')}) - ) - - prob.setup(check=False, force_alloc_complex=True) - - flops_validation_test( - prob, - case_name, - input_keys=[ - Aircraft.AirConditioning.MASS, - Aircraft.AntiIcing.MASS, - Aircraft.APU.MASS, - Aircraft.Avionics.MASS, - Aircraft.Canard.MASS, - Aircraft.CrewPayload.PASSENGER_MASS_TOTAL, - Aircraft.CrewPayload.BAGGAGE_MASS, - Aircraft.CrewPayload.CARGO_MASS, - Aircraft.CrewPayload.CARGO_CONTAINER_MASS, - Aircraft.CrewPayload.CABIN_CREW_MASS, - Aircraft.CrewPayload.FLIGHT_CREW_MASS, - Aircraft.Design.EMPTY_MASS_MARGIN_SCALER, - Aircraft.Electrical.MASS, - Aircraft.Fins.MASS, - Aircraft.Propulsion.TOTAL_ENGINE_OIL_MASS, - Aircraft.Fuel.FUEL_SYSTEM_MASS, - Aircraft.Furnishings.MASS, - Aircraft.Fuselage.MASS, - Aircraft.HorizontalTail.MASS, - Aircraft.Hydraulics.MASS, - Aircraft.Instruments.MASS, - Aircraft.LandingGear.TOTAL_MASS, - Aircraft.Nacelle.MASS, - Aircraft.Paint.MASS, - Aircraft.CrewPayload.PASSENGER_SERVICE_MASS, - Aircraft.Wing.SURFACE_CONTROL_MASS, - Aircraft.Propulsion.TOTAL_THRUST_REVERSERS_MASS, - Aircraft.Fuel.UNUSABLE_FUEL_MASS, - Aircraft.VerticalTail.MASS, - Aircraft.Wing.MASS, - Mission.Design.GROSS_MASS, - Aircraft.Propulsion.TOTAL_ENGINE_MASS, - Aircraft.Propulsion.TOTAL_MISC_MASS, - ], - output_keys=[ - Aircraft.Design.EMPTY_MASS_MARGIN, - Aircraft.Propulsion.MASS, - Aircraft.Design.STRUCTURE_MASS, - Aircraft.Design.SYSTEMS_AND_EQUIPMENT_MASS, - Aircraft.Design.EMPENNAGE_MASS, - Aircraft.Design.EMPTY_MASS, - Mission.Summary.USEFUL_LOAD, - Mission.Summary.OPERATING_MASS, - Mission.Summary.ZERO_FUEL_MASS, - Mission.Summary.FUEL_MASS, - ], - version=Version.TRANSPORT, - atol=1e-10, - ) - - if __name__ == '__main__': unittest.main() - # test = AltTotalSummationTest() - # test = TotalSummationTest() - # test.setUp() - # test.test_case_multiengine() - # test.test_case('LargeSingleAisle2FLOPSalt') diff --git a/aviary/subsystems/mass/flops_based/test/test_misc_engine.py b/aviary/subsystems/mass/flops_based/test/test_misc_engine.py index c9d727271b..125e63a3c0 100644 --- a/aviary/subsystems/mass/flops_based/test/test_misc_engine.py +++ b/aviary/subsystems/mass/flops_based/test/test_misc_engine.py @@ -21,15 +21,13 @@ ) from aviary.variable_info.variables import Aircraft, Settings -bwb_cases = ['BWBsimpleFLOPS', 'BWBdetailedFLOPS'] - @use_tempdirs class MiscEngineMassTest(unittest.TestCase): def setUp(self): self.prob = om.Problem() - @parameterized.expand(get_flops_case_names(omit=bwb_cases), name_func=print_case) + @parameterized.expand(get_flops_case_names(), name_func=print_case) def test_case(self, case_name): prob = self.prob @@ -55,6 +53,7 @@ def test_case(self, case_name): Aircraft.Propulsion.TOTAL_STARTER_MASS, ], output_keys=Aircraft.Propulsion.TOTAL_MISC_MASS, + version=Version.TRANSPORT_and_BWB, ) def test_IO(self): @@ -105,42 +104,5 @@ def test_case_multiengine(self): assert_check_partials(partial_data, atol=1e-7, rtol=1e-7) -@use_tempdirs -class BWBMiscEngineMassTest(unittest.TestCase): - """Tests misc engine mass calculation for BWB.""" - - 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): - prob = self.prob - - inputs = get_flops_inputs(case_name, preprocess=True) - - options = { - Aircraft.Engine.NUM_ENGINES: inputs.get_val(Aircraft.Engine.NUM_ENGINES), - } - - prob.model.add_subsystem( - 'misc_mass', EngineMiscMass(**options), promotes_inputs=['*'], promotes_outputs=['*'] - ) - - prob.setup(check=False, force_alloc_complex=True) - - flops_validation_test( - prob, - case_name, - input_keys=[ - Aircraft.Engine.ADDITIONAL_MASS, - Aircraft.Propulsion.MISC_MASS_SCALER, - Aircraft.Propulsion.TOTAL_ENGINE_CONTROLS_MASS, - Aircraft.Propulsion.TOTAL_STARTER_MASS, - ], - output_keys=Aircraft.Propulsion.TOTAL_MISC_MASS, - version=Version.BWB, - ) - - if __name__ == '__main__': unittest.main() diff --git a/aviary/subsystems/mass/flops_based/test/test_nacelle.py b/aviary/subsystems/mass/flops_based/test/test_nacelle.py index b9e940fb02..f13910c7aa 100644 --- a/aviary/subsystems/mass/flops_based/test/test_nacelle.py +++ b/aviary/subsystems/mass/flops_based/test/test_nacelle.py @@ -21,15 +21,13 @@ ) from aviary.variable_info.variables import Aircraft, Settings -bwb_cases = ['BWBsimpleFLOPS', 'BWBdetailedFLOPS'] - @use_tempdirs class NacelleMassTest(unittest.TestCase): def setUp(self): self.prob = om.Problem() - @parameterized.expand(get_flops_case_names(omit=bwb_cases), name_func=print_case) + @parameterized.expand(get_flops_case_names(), name_func=print_case) def test_case(self, case_name): prob = self.prob @@ -58,6 +56,7 @@ def test_case(self, case_name): Aircraft.Engine.SCALED_SLS_THRUST, ], output_keys=Aircraft.Nacelle.MASS, + version=Version.TRANSPORT_and_BWB, ) def test_IO(self): @@ -175,45 +174,5 @@ def test_case_multiengine(self): assert_check_partials(partial_data, atol=1e-12, rtol=1e-12) -@use_tempdirs -class BWBNacelleMassTest(unittest.TestCase): - """Tests nacelle mass calculation for BWB.""" - - 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): - prob = self.prob - - inputs = get_flops_inputs(case_name, preprocess=True) - - options = { - Aircraft.Engine.NUM_ENGINES: inputs.get_val(Aircraft.Engine.NUM_ENGINES), - } - - prob.model.add_subsystem( - 'nacelle', - NacelleMass(**options), - promotes_inputs=['*'], - promotes_outputs=['*'], - ) - - prob.setup(check=False, force_alloc_complex=True) - - flops_validation_test( - self.prob, - case_name, - input_keys=[ - Aircraft.Nacelle.AVG_DIAMETER, - Aircraft.Nacelle.AVG_LENGTH, - Aircraft.Nacelle.MASS_SCALER, - Aircraft.Engine.SCALED_SLS_THRUST, - ], - output_keys=Aircraft.Nacelle.MASS, - version=Version.BWB, - ) - - if __name__ == '__main__': unittest.main() diff --git a/aviary/subsystems/mass/flops_based/test/test_paint.py b/aviary/subsystems/mass/flops_based/test/test_paint.py index 93291f3d4d..776324357e 100644 --- a/aviary/subsystems/mass/flops_based/test/test_paint.py +++ b/aviary/subsystems/mass/flops_based/test/test_paint.py @@ -22,7 +22,7 @@ class PaintMassTest(unittest.TestCase): def setUp(self): self.prob = om.Problem() - @parameterized.expand(get_flops_case_names(omit=bwb_cases), name_func=print_case) + @parameterized.expand(get_flops_case_names(), name_func=print_case) def test_case(self, case_name): prob = self.prob @@ -40,6 +40,7 @@ def test_case(self, case_name): case_name, input_keys=[Aircraft.Design.TOTAL_WETTED_AREA, Aircraft.Paint.MASS_PER_UNIT_AREA], output_keys=Aircraft.Paint.MASS, + version=Version.TRANSPORT_and_BWB, ) def test_IO(self): @@ -54,7 +55,7 @@ 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): + def test_cdsase(self, case_name): prob = self.prob prob.model.add_subsystem( diff --git a/aviary/subsystems/mass/flops_based/test/test_passenger_service.py b/aviary/subsystems/mass/flops_based/test/test_passenger_service.py index c338106098..42ce464126 100644 --- a/aviary/subsystems/mass/flops_based/test/test_passenger_service.py +++ b/aviary/subsystems/mass/flops_based/test/test_passenger_service.py @@ -19,15 +19,13 @@ ) from aviary.variable_info.variables import Aircraft, Mission -bwb_cases = ['BWBsimpleFLOPS', 'BWBdetailedFLOPS'] - @use_tempdirs class PassengerServiceMassTest(unittest.TestCase): def setUp(self): self.prob = om.Problem() - @parameterized.expand(get_flops_case_names(omit=bwb_cases), name_func=print_case) + @parameterized.expand(get_flops_case_names(), name_func=print_case) def test_case(self, case_name): prob = self.prob @@ -47,7 +45,7 @@ def test_case(self, case_name): case_name, input_keys=[Aircraft.CrewPayload.PASSENGER_SERVICE_MASS_SCALER, Mission.Design.RANGE], output_keys=Aircraft.CrewPayload.PASSENGER_SERVICE_MASS, - version=Version.TRANSPORT, + version=Version.TRANSPORT_and_BWB, tol=2e-4, ) @@ -149,37 +147,5 @@ def test_case(self): assert_check_partials(partial_data, atol=1e-12, rtol=1e-12) -@use_tempdirs -class BWBPassengerServiceMassTest(unittest.TestCase): - """Tests passenger service mass calculation for BWB.""" - - 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): - prob = self.prob - - prob.model.add_subsystem( - 'passenger_service_weight', - PassengerServiceMass(), - promotes_inputs=['*'], - promotes_outputs=['*'], - ) - - prob.model_options['*'] = get_flops_options(case_name, preprocess=True) - - prob.setup(check=False, force_alloc_complex=True) - - flops_validation_test( - prob, - case_name, - input_keys=[Aircraft.CrewPayload.PASSENGER_SERVICE_MASS_SCALER, Mission.Design.RANGE], - output_keys=Aircraft.CrewPayload.PASSENGER_SERVICE_MASS, - version=Version.BWB, - tol=2e-4, - ) - - if __name__ == '__main__': unittest.main() diff --git a/aviary/subsystems/mass/flops_based/test/test_starter.py b/aviary/subsystems/mass/flops_based/test/test_starter.py index a7bd7f40f0..76f9508893 100644 --- a/aviary/subsystems/mass/flops_based/test/test_starter.py +++ b/aviary/subsystems/mass/flops_based/test/test_starter.py @@ -18,16 +18,13 @@ ) from aviary.variable_info.variables import Aircraft, Mission -bwb_cases = ['BWBsimpleFLOPS', 'BWBdetailedFLOPS'] -omit_cases = ['AdvancedSingleAisle', 'BWBsimpleFLOPS', 'BWBdetailedFLOPS'] - @use_tempdirs class TransportStarterMassTest(unittest.TestCase): def setUp(self): self.prob = om.Problem() - @parameterized.expand(get_flops_case_names(omit=omit_cases), name_func=print_case) + @parameterized.expand(get_flops_case_names(omit='AdvancedSingleAisle'), name_func=print_case) def test_case_1(self, case_name): prob = self.prob @@ -49,6 +46,7 @@ def test_case_1(self, case_name): case_name, input_keys=[Aircraft.Nacelle.AVG_DIAMETER, Aircraft.Engine.SCALE_FACTOR], output_keys=Aircraft.Propulsion.TOTAL_STARTER_MASS, + version=Version.TRANSPORT_and_BWB, ) def test_case_2(self): @@ -129,43 +127,5 @@ def test_case_2(self): assert_check_partials(partial_data, atol=1e-12, rtol=1e-12) -@use_tempdirs -class BWBTransportStarterMassTest(unittest.TestCase): - """ - Tests starter mass calculation for BWB. - In FLOPS, WSTART is scaled after override. We ignore the difference for now. - """ - - def setUp(self): - self.prob = om.Problem() - - @parameterized.expand(get_flops_case_names(only=bwb_cases), name_func=print_case) - def test_case_1(self, case_name): - prob = self.prob - - options = get_flops_options(case_name) - options[Aircraft.Engine.NUM_ENGINES] = np.array([3]) - options[Aircraft.Propulsion.TOTAL_NUM_ENGINES] = 3 - - prob.model.add_subsystem( - 'starter_test', - TransportStarterMass(), - promotes_outputs=['*'], - promotes_inputs=['*'], - ) - - prob.model_options['*'] = options - - prob.setup(check=False, force_alloc_complex=True) - - flops_validation_test( - prob, - case_name, - input_keys=[Aircraft.Nacelle.AVG_DIAMETER, Aircraft.Engine.SCALE_FACTOR], - output_keys=Aircraft.Propulsion.TOTAL_STARTER_MASS, - version=Version.BWB, - ) - - if __name__ == '__main__': unittest.main() diff --git a/aviary/subsystems/mass/flops_based/test/test_surface_controls.py b/aviary/subsystems/mass/flops_based/test/test_surface_controls.py index b941c054b7..30983e22a5 100644 --- a/aviary/subsystems/mass/flops_based/test/test_surface_controls.py +++ b/aviary/subsystems/mass/flops_based/test/test_surface_controls.py @@ -19,15 +19,13 @@ ) from aviary.variable_info.variables import Aircraft, Mission -bwb_cases = ['BWBsimpleFLOPS', 'BWBdetailedFLOPS'] - @use_tempdirs class SurfaceCtrlMassTest(unittest.TestCase): def setUp(self): self.prob = om.Problem() - @parameterized.expand(get_flops_case_names(omit=bwb_cases), name_func=print_case) + @parameterized.expand(get_flops_case_names(), name_func=print_case) def test_case(self, case_name): prob = self.prob @@ -47,7 +45,7 @@ def test_case(self, case_name): Aircraft.Wing.AREA, ], output_keys=[Aircraft.Wing.SURFACE_CONTROL_MASS, Aircraft.Wing.CONTROL_SURFACE_AREA], - version=Version.TRANSPORT, + version=Version.TRANSPORT_and_BWB, tol=2e-4, atol=1e-11, rtol=1e-11, @@ -149,39 +147,5 @@ def test_case(self): assert_check_partials(partial_data, atol=1e-12, rtol=1e-12) -@use_tempdirs -class BWBSurfaceCtrlMassTest(unittest.TestCase): - """Tests surface contraol mass calculation for BWB.""" - - 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): - prob = self.prob - - prob.model.add_subsystem('surf_ctrl', SurfaceControlMass(), promotes=['*']) - - prob.model_options['*'] = get_flops_options(case_name, preprocess=True) - - prob.setup(check=False, force_alloc_complex=True) - - flops_validation_test( - prob, - case_name, - input_keys=[ - Aircraft.Wing.SURFACE_CONTROL_MASS_SCALER, - Mission.Design.GROSS_MASS, - Aircraft.Wing.CONTROL_SURFACE_AREA_RATIO, - Aircraft.Wing.AREA, - ], - output_keys=[Aircraft.Wing.SURFACE_CONTROL_MASS, Aircraft.Wing.CONTROL_SURFACE_AREA], - version=Version.BWB, - tol=2e-4, - atol=1e-11, - rtol=1e-11, - ) - - if __name__ == '__main__': unittest.main() diff --git a/aviary/subsystems/mass/flops_based/test/test_thrust_reverser.py b/aviary/subsystems/mass/flops_based/test/test_thrust_reverser.py index 5d81f3015e..12bc1ca126 100644 --- a/aviary/subsystems/mass/flops_based/test/test_thrust_reverser.py +++ b/aviary/subsystems/mass/flops_based/test/test_thrust_reverser.py @@ -20,8 +20,7 @@ ) from aviary.variable_info.variables import Aircraft, Settings -bwb_cases = ['BWBsimpleFLOPS', 'BWBdetailedFLOPS'] -omit_cases = ['LargeSingleAisle1FLOPS', 'AdvancedSingleAisle', 'BWBsimpleFLOPS', 'BWBdetailedFLOPS'] +omit_cases = ['LargeSingleAisle1FLOPS', 'AdvancedSingleAisle'] @use_tempdirs @@ -54,6 +53,7 @@ def test_case(self, case_name): Aircraft.Engine.THRUST_REVERSERS_MASS, Aircraft.Propulsion.TOTAL_THRUST_REVERSERS_MASS, ], + version=Version.TRANSPORT_and_BWB, ) def test_case_multiengine(self): @@ -148,41 +148,5 @@ def test_case(self): assert_check_partials(partial_data, atol=1e-12, rtol=1e-12) -@use_tempdirs -class BWBThrustReverserMassTest(unittest.TestCase): - """Tests thrust reverser mass calculation for BWB.""" - - 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): - prob = self.prob - - inputs = get_flops_inputs(case_name, preprocess=True) - - options = { - Aircraft.Engine.NUM_ENGINES: inputs.get_val(Aircraft.Engine.NUM_ENGINES), - } - - prob.model.add_subsystem('thrust_rev', ThrustReverserMass(**options), promotes=['*']) - - prob.setup(check=False, force_alloc_complex=True) - - flops_validation_test( - prob, - case_name, - input_keys=[ - Aircraft.Engine.THRUST_REVERSERS_MASS_SCALER, - Aircraft.Engine.SCALED_SLS_THRUST, - ], - output_keys=[ - Aircraft.Engine.THRUST_REVERSERS_MASS, - Aircraft.Propulsion.TOTAL_THRUST_REVERSERS_MASS, - ], - version=Version.BWB, - ) - - if __name__ == '__main__': unittest.main() diff --git a/aviary/subsystems/mass/flops_based/test/test_unusable_fuel.py b/aviary/subsystems/mass/flops_based/test/test_unusable_fuel.py index 449f44e62b..3b7dfe34b1 100644 --- a/aviary/subsystems/mass/flops_based/test/test_unusable_fuel.py +++ b/aviary/subsystems/mass/flops_based/test/test_unusable_fuel.py @@ -19,8 +19,6 @@ ) from aviary.variable_info.variables import Aircraft -bwb_cases = ['BWBsimpleFLOPS', 'BWBdetailedFLOPS'] - @use_tempdirs class TransportUnusableFuelMassTest(unittest.TestCase): @@ -29,7 +27,7 @@ class TransportUnusableFuelMassTest(unittest.TestCase): def setUp(self): self.prob = om.Problem() - @parameterized.expand(get_flops_case_names(omit=bwb_cases), name_func=print_case) + @parameterized.expand(get_flops_case_names(), name_func=print_case) def test_case(self, case_name): prob = self.prob @@ -57,7 +55,7 @@ def test_case(self, case_name): output_keys=[ # Aircraft.Fuel.TOTAL_VOLUME, Aircraft.Fuel.UNUSABLE_FUEL_MASS ], - version=Version.TRANSPORT, + version=Version.TRANSPORT_and_BWB, tol=5e-4, excludes=['size_prop.*'], ) @@ -156,44 +154,5 @@ def test_case(self): assert_check_partials(partial_data, atol=1e-12, rtol=1e-12) -@use_tempdirs -class BWBTransportUnusableFuelMassTest(unittest.TestCase): - """Tests transport/GA unusable fuel mass calculation for BWB.""" - - 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): - prob = self.prob - - prob.model.add_subsystem( - 'unusable_fuel', - TransportUnusableFuelMass(), - promotes_outputs=['*'], - promotes_inputs=['*'], - ) - - prob.model_options['*'] = get_flops_options(case_name, preprocess=True) - - prob.setup(check=False, force_alloc_complex=True) - - flops_validation_test( - prob, - case_name, - input_keys=[ - Aircraft.Fuel.UNUSABLE_FUEL_MASS_SCALER, - Aircraft.Fuel.DENSITY, - Aircraft.Fuel.TOTAL_CAPACITY, - Aircraft.Propulsion.TOTAL_SCALED_SLS_THRUST, - Aircraft.Wing.AREA, - ], - output_keys=[Aircraft.Fuel.UNUSABLE_FUEL_MASS], - version=Version.BWB, - tol=5e-4, - excludes=['size_prop.*'], - ) - - if __name__ == '__main__': unittest.main() diff --git a/aviary/subsystems/mass/flops_based/test/test_vertical_tail.py b/aviary/subsystems/mass/flops_based/test/test_vertical_tail.py index a1a13b3cd6..f3c62adb0b 100644 --- a/aviary/subsystems/mass/flops_based/test/test_vertical_tail.py +++ b/aviary/subsystems/mass/flops_based/test/test_vertical_tail.py @@ -16,15 +16,13 @@ ) from aviary.variable_info.variables import Aircraft, Mission -bwb_cases = ['BWBsimpleFLOPS', 'BWBdetailedFLOPS'] - @use_tempdirs class VerticalTailMassTest(unittest.TestCase): def setUp(self): self.prob = om.Problem() - @parameterized.expand(get_flops_case_names(omit=bwb_cases), name_func=print_case) + @parameterized.expand(get_flops_case_names(), name_func=print_case) def test_case(self, case_name): prob = self.prob @@ -49,7 +47,7 @@ def test_case(self, case_name): Aircraft.VerticalTail.MASS_SCALER, ], output_keys=Aircraft.VerticalTail.MASS, - version=Version.TRANSPORT, + version=Version.TRANSPORT_and_BWB, ) def test_IO(self): @@ -149,41 +147,5 @@ def test_case(self): assert_check_partials(partial_data, atol=1e-12, rtol=1e-12) -@use_tempdirs -class BWBVerticalTailMassTest(unittest.TestCase): - """Tests vertial tail mass calculation for BWB.""" - - 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): - prob = self.prob - - prob.model.add_subsystem( - 'vertical_tail', - VerticalTailMass(), - promotes_inputs=['*'], - promotes_outputs=['*'], - ) - - prob.model_options['*'] = get_flops_options(case_name, preprocess=True) - - prob.setup(check=False, force_alloc_complex=True) - - flops_validation_test( - prob, - case_name, - input_keys=[ - Aircraft.VerticalTail.AREA, - Aircraft.VerticalTail.TAPER_RATIO, - Mission.Design.GROSS_MASS, - Aircraft.VerticalTail.MASS_SCALER, - ], - output_keys=Aircraft.VerticalTail.MASS, - version=Version.BWB, - ) - - if __name__ == '__main__': unittest.main() diff --git a/aviary/utils/fortran_to_aviary.py b/aviary/utils/fortran_to_aviary.py index 757a89e226..8297a34193 100644 --- a/aviary/utils/fortran_to_aviary.py +++ b/aviary/utils/fortran_to_aviary.py @@ -19,6 +19,7 @@ import csv import getpass import re +import warnings from datetime import datetime from pathlib import Path @@ -28,6 +29,7 @@ from aviary.utils.legacy_code_data.flops_defaults import flops_default_values, flops_deprecated_vars from aviary.utils.legacy_code_data.gasp_defaults import gasp_default_values, gasp_deprecated_vars from aviary.utils.named_values import NamedValues +from aviary.utils.utils import wrapped_convert_units from aviary.variable_info.enums import LegacyCode, Verbosity from aviary.variable_info.variable_meta_data import _MetaData from aviary.variable_info.variables import Aircraft, Mission, Settings @@ -123,7 +125,7 @@ def fortran_to_aviary( if legacy_code is GASP: vehicle_data = update_gasp_options(vehicle_data, verbosity) elif legacy_code is FLOPS: - vehicle_data = update_flops_options(vehicle_data) + vehicle_data = update_flops_options(vehicle_data, verbosity) vehicle_data = update_aviary_options(vehicle_data) # Add settings and engine data file @@ -787,65 +789,65 @@ def update_gasp_options(vehicle_data, verbosity=Verbosity.BRIEF): # Variables required by GASP, but no default values are provided in GASP missing_vars = [] - if not Aircraft.Wing.ZERO_LIFT_ANGLE in input_values: + if Aircraft.Wing.ZERO_LIFT_ANGLE not in input_values: missing_vars.append('ALPHL0') - if not Aircraft.Wing.ASPECT_RATIO in input_values: + if Aircraft.Wing.ASPECT_RATIO not in input_values: missing_vars.append('AR') - if not Aircraft.HorizontalTail.ASPECT_RATIO in input_values: + if Aircraft.HorizontalTail.ASPECT_RATIO not in input_values: missing_vars.append('ARHT') - if not Aircraft.VerticalTail.ASPECT_RATIO in input_values: + if Aircraft.VerticalTail.ASPECT_RATIO not in input_values: missing_vars.append('ARVT') - if not Aircraft.Design.PART25_STRUCTURAL_CATEGORY in input_values: + if Aircraft.Design.PART25_STRUCTURAL_CATEGORY not in input_values: missing_vars.append('CATD') - if not Aircraft.Fuselage.PRESSURE_DIFFERENTIAL in input_values: + if Aircraft.Fuselage.PRESSURE_DIFFERENTIAL not in input_values: missing_vars.append('DELP') - if not Mission.Taxi.DURATION in input_values: + if Mission.Taxi.DURATION not in input_values: missing_vars.append('DELTT') - if not Aircraft.Wing.FLAP_DEFLECTION_LANDING in input_values: + if Aircraft.Wing.FLAP_DEFLECTION_LANDING not in input_values: missing_vars.append('DFLPLD') - if not Aircraft.Wing.FLAP_DEFLECTION_TAKEOFF in input_values: + if Aircraft.Wing.FLAP_DEFLECTION_TAKEOFF not in input_values: missing_vars.append('DFLPTO') - if not Aircraft.Wing.SWEEP in input_values: + if Aircraft.Wing.SWEEP not in input_values: missing_vars.append('DLMC4') - if not Aircraft.Wing.INCIDENCE in input_values: + if Aircraft.Wing.INCIDENCE not in input_values: missing_vars.append('EYEW') - if not Aircraft.CrewPayload.Design.NUM_PASSENGERS in input_values: + if Aircraft.CrewPayload.Design.NUM_PASSENGERS not in input_values: missing_vars.append('PAX') - if not Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY in input_values: + if Aircraft.CrewPayload.Design.SEAT_PITCH_ECONOMY not in input_values: missing_vars.append('PS') - if not Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY in input_values: + if Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_ECONOMY not in input_values: missing_vars.append('SAB') - if not Aircraft.HorizontalTail.VERTICAL_TAIL_FRACTION in input_values: + if Aircraft.HorizontalTail.VERTICAL_TAIL_FRACTION not in input_values: missing_vars.append('SAH') - if not Aircraft.Wing.TAPER_RATIO in input_values: + if Aircraft.Wing.TAPER_RATIO not in input_values: missing_vars.append('SLM') - if not Aircraft.HorizontalTail.TAPER_RATIO in input_values: + if Aircraft.HorizontalTail.TAPER_RATIO not in input_values: missing_vars.append('SLMH') - if not Aircraft.VerticalTail.TAPER_RATIO in input_values: + if Aircraft.VerticalTail.TAPER_RATIO not in input_values: missing_vars.append('SLMV') - if not Aircraft.HorizontalTail.THICKNESS_TO_CHORD in input_values: + if Aircraft.HorizontalTail.THICKNESS_TO_CHORD not in input_values: missing_vars.append('TCHT') - if not Aircraft.Wing.THICKNESS_TO_CHORD_ROOT in input_values: + if Aircraft.Wing.THICKNESS_TO_CHORD_ROOT not in input_values: missing_vars.append('TCR') - if not Aircraft.Wing.THICKNESS_TO_CHORD_TIP in input_values: + if Aircraft.Wing.THICKNESS_TO_CHORD_TIP not in input_values: missing_vars.append('TCT') - if not Aircraft.VerticalTail.THICKNESS_TO_CHORD in input_values: + if Aircraft.VerticalTail.THICKNESS_TO_CHORD not in input_values: missing_vars.append('TCVT') - if not Aircraft.Nacelle.MASS_SPECIFIC in input_values: + if Aircraft.Nacelle.MASS_SPECIFIC not in input_values: missing_vars.append('UWNAC') - if not Aircraft.CrewPayload.MASS_PER_PASSENGER_WITH_BAGS in input_values: + if Aircraft.CrewPayload.MASS_PER_PASSENGER_WITH_BAGS not in input_values: missing_vars.append('UWPAX') - if not Aircraft.Design.MAX_STRUCTURAL_SPEED in input_values: + if Aircraft.Design.MAX_STRUCTURAL_SPEED not in input_values: missing_vars.append('VMLFSL') - if not Aircraft.Fuselage.AISLE_WIDTH in input_values: + if Aircraft.Fuselage.AISLE_WIDTH not in input_values: missing_vars.append('WAS') - if not Aircraft.Fuselage.SEAT_WIDTH in input_values: + if Aircraft.Fuselage.SEAT_WIDTH not in input_values: missing_vars.append('WS') - if not Aircraft.LandingGear.MAIN_GEAR_LOCATION in input_values: + if Aircraft.LandingGear.MAIN_GEAR_LOCATION not in input_values: missing_vars.append('YMG') - if not Aircraft.Engine.WING_LOCATIONS in input_values: + if Aircraft.Engine.WING_LOCATIONS not in input_values: missing_vars.append('YP') - if not Aircraft.HorizontalTail.VERTICAL_TAIL_FRACTION in input_values: + if Aircraft.HorizontalTail.VERTICAL_TAIL_FRACTION not in input_values: missing_vars.append('SAH') if len(missing_vars) > 0: raise RuntimeError( @@ -856,7 +858,7 @@ def update_gasp_options(vehicle_data, verbosity=Verbosity.BRIEF): return vehicle_data -def update_flops_options(vehicle_data): +def update_flops_options(vehicle_data, verbosity=Verbosity.BRIEF): """Handles variables that are affected by the values of others.""" input_values: NamedValues = vehicle_data['input_values'] @@ -904,7 +906,19 @@ 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 FWMAX < 0.0: + FWMAX = 23.0 + if Aircraft.Fuel.DENSITY in input_values: + FULDEN = input_values.get_val(Aircraft.Fuel.DENSITY, 'lbm/ft**3')[0] + else: + FULDEN = wrapped_convert_units( + ( + _MetaData[Aircraft.Fuel.DENSITY]['default_value'], + _MetaData[Aircraft.Fuel.DENSITY]['units'], + ), + 'lbm/ft**3', + ) + # FULDEN = 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 +928,216 @@ 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 Mission.Landing.LIFT_COEFFICIENT_MAX not in input_values: + # TODO revisit this once CLAPP is added to metadata and is no longer skipped by fortran_to_aviary + unused_values = vehicle_data['unused_values'] + try: + CLAPP = unused_values.get_item('TOLIN.CLAPP')[0][0] + CLLDM = 1.69 * CLAPP + except TypeError: + 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 Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO not 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') + print( + 'Set Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO to ' + 'Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO.' + ) + + if Aircraft.Fuel.WING_FUEL_FRACTION not 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 = wrapped_convert_units( + ( + _MetaData[Aircraft.Fuel.DENSITY]['default_value'], + _MetaData[Aircraft.Fuel.DENSITY]['units'], + ), + 'lbm/ft**3', + ) + # FULDEN = 50.1194909 # lbm/ft**3 or 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 ValueError( + 'Aviary currently only supports values of IFITE = 0 ("transport") or 3 ("bwb"), ' + f'the target file uses IFITE = {design_type[0]} .' + ) + + if ( + Aircraft.HorizontalTail.THICKNESS_TO_CHORD not 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 verbosity >= Verbosity.BRIEF: + print( + 'Aircraft.HorizontalTail.THICKNESS_TO_CHORD is not defined. Use ' + 'Aircraft.Wing.THICKNESS_TO_CHORD.' + ) + + if (Aircraft.VerticalTail.THICKNESS_TO_CHORD not 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') + if verbosity >= Verbosity.BRIEF: + print( + 'Aircraft.VerticalTail.THICKNESS_TO_CHORD is not defined. Use ' + 'Aircraft.Wing.THICKNESS_TO_CHORD.' + ) + + if ( + Aircraft.HorizontalTail.TAPER_RATIO not in input_values + or input_values.get_val(Aircraft.HorizontalTail.TAPER_RATIO)[0] < 0.0 + ): + if Aircraft.WING.SWEEP in input_values: + TR = input_values.get_val(Aircraft.Wing.TAPER_RATIO)[0] + input_values.set_val(Aircraft.HorizontalTail.TAPER_RATIO, [TR]) + + if ( + Aircraft.VerticalTail.TAPER_RATIO not in input_values + or input_values.get_val(Aircraft.VerticalTail.TAPER_RATIO)[0] < 0.0 + ): + if Aircraft.HorizontalTail.TAPER_RATIO in input_values: + TRHT = input_values.get_val(Aircraft.HorizontalTail.TAPER_RATIO)[0] + input_values.set_val(Aircraft.VerticalTail.TAPER_RATIO, [TRHT]) + + if ( + Aircraft.HorizontalTail.SWEEP not in input_values + or input_values.get_val(Aircraft.HorizontalTail.SWEEP, units='deg')[0] < -90.0 + ): + if Aircraft.WING.SWEEP in input_values: + SWEEP = input_values.get_val(Aircraft.Wing.SWEEP, units='deg')[0] + input_values.set_val(Aircraft.HorizontalTail.SWEEP, [SWEEP], 'deg') + + if ( + Aircraft.VerticalTail.SWEEP not in input_values + or input_values.get_val(Aircraft.VerticalTail.SWEEP, units='deg')[0] < -90.0 + ): + if Aircraft.HorizontalTail.SWEEP in input_values: + SWPHT = input_values.get_val(Aircraft.HorizontalTail.SWEEP, units='deg')[0] + input_values.set_val(Aircraft.VerticalTail.SWEEP, [SWPHT], 'deg') + + if ( + Aircraft.HorizontalTail.ASPECT_RATIO not in input_values + or input_values.get_val(Aircraft.HorizontalTail.ASPECT_RATIO)[0] < 0 + ): + if Aircraft.WING.ASPECT_RATIO in input_values: + AR = input_values.get_val(Aircraft.WING.ASPECT_RATIO) + input_values.set_val(Aircraft.HorizontalTail.ASPECT_RATIO, [AR], 'unitless') + + if ( + Aircraft.VerticalTail.ASPECT_RATIO not in input_values + or input_values.get_val(Aircraft.VerticalTail.ASPECT_RATIO)[0] < 0 + ): + if Aircraft.HorizontalTail.ASPECT_RATIO in input_values: + ARHT = input_values.get_val(Aircraft.HorizontalTail.ASPECT_RATIO)[0] + input_values.set_val(Aircraft.VerticalTail.ASPECT_RATIO, [ARHT / 2.0], 'unitless') + + # These variables should be removed if they are zero. + rem_list = [ + (Aircraft.Design.TOUCHDOWN_MASS, 'lbm'), + (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'), + ] + 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 +1146,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/preprocessors.py b/aviary/utils/preprocessors.py index 32a44e1aaf..ce75f111dd 100644 --- a/aviary/utils/preprocessors.py +++ b/aviary/utils/preprocessors.py @@ -12,7 +12,7 @@ from aviary.utils.named_values import get_keys from aviary.utils.test_utils.variable_test import get_names_from_hierarchy from aviary.utils.utils import isiterable -from aviary.variable_info.enums import LegacyCode, ProblemType, Verbosity +from aviary.variable_info.enums import AircraftTypes, LegacyCode, ProblemType, Verbosity from aviary.variable_info.variable_meta_data import _MetaData from aviary.variable_info.variables import Aircraft, Mission, Settings @@ -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. @@ -401,7 +403,10 @@ def preprocess_crewpayload(aviary_options: AviaryValues, meta_data=_MetaData, ve # Process FLOPS based crew variables if mass_method == LegacyCode.FLOPS: # Check flight attendants - if Aircraft.CrewPayload.NUM_FLIGHT_ATTENDANTS not in aviary_options: + if ( + Aircraft.CrewPayload.NUM_FLIGHT_ATTENDANTS not in aviary_options + or aviary_options.get_val(Aircraft.CrewPayload.NUM_FLIGHT_ATTENDANTS) < 0 + ): flight_attendants_count = 0 # assume no passengers if 0 < design_pax: @@ -415,7 +420,10 @@ def preprocess_crewpayload(aviary_options: AviaryValues, meta_data=_MetaData, ve Aircraft.CrewPayload.NUM_FLIGHT_ATTENDANTS, flight_attendants_count ) - if Aircraft.CrewPayload.NUM_GALLEY_CREW not in aviary_options: + if ( + Aircraft.CrewPayload.NUM_GALLEY_CREW not in aviary_options + or aviary_options.get_val(Aircraft.CrewPayload.NUM_GALLEY_CREW) < 0 + ): galley_crew_count = 0 # assume no passengers if 150 < design_pax: @@ -449,16 +457,18 @@ def preprocess_crewpayload(aviary_options: AviaryValues, meta_data=_MetaData, ve if ( Aircraft.CrewPayload.BAGGAGE_MASS_PER_PASSENGER not in aviary_options - and Mission.Design.RANGE in aviary_options + or aviary_options.get_val(Mission.Design.RANGE, 'nmi') < 0.0 ): - design_range = aviary_options.get_val(Mission.Design.RANGE, 'nmi') - - if design_range <= 900.0: - baggage_mass_per_pax = 35.0 - elif design_range <= 2900.0: - baggage_mass_per_pax = 40.0 - else: - baggage_mass_per_pax = 44.0 + baggage_mass_per_pax = 35.0 + if Mission.Design.RANGE in aviary_options: + design_range = aviary_options.get_val(Mission.Design.RANGE, 'nmi') + + if design_range <= 900.0: + baggage_mass_per_pax = 35.0 + elif design_range <= 2900.0: + baggage_mass_per_pax = 40.0 + else: + baggage_mass_per_pax = 44.0 aviary_options.set_val( Aircraft.CrewPayload.BAGGAGE_MASS_PER_PASSENGER, @@ -466,6 +476,23 @@ def preprocess_crewpayload(aviary_options: AviaryValues, meta_data=_MetaData, ve units='lbm', ) + if ( + Aircraft.HorizontalTail.VERTICAL_TAIL_FRACTION not in aviary_options + or aviary_options.get_val(Aircraft.HorizontalTail.VERTICAL_TAIL_FRACTION) < 0.0 + ): + HHT = 0 + if ( + Aircraft.Engine.NUM_FUSELAGE_ENGINES in aviary_options + and aviary_options.get_val(Aircraft.Engine.NUM_FUSELAGE_ENGINES) > 1 + and aviary_options.get_val(Aircraft.Design.TYPE) == AircraftTypes.TRANSPORT + ): + HHT = 1 + aviary_options.set_val( + Aircraft.HorizontalTail.VERTICAL_TAIL_FRACTION, + val=HHT, + units='unitless', + ) + return aviary_options @@ -550,6 +577,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..d74f7d0404 --- /dev/null +++ b/aviary/utils/test/data/converter_test_BWB_detailed_FLOPS.csv @@ -0,0 +1,163 @@ +# 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:ignore_fuel_capacity_constraint,False,unitless +aircraft:fuel:wing_fuel_fraction,0.6883549569366508,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:sweep,0,deg +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:aspect_ratio,0.0,unitless +aircraft:vertical_tail:mass_scaler,1,unitless +aircraft:vertical_tail:num_tails,0,unitless +aircraft:vertical_tail:sweep,0,deg +aircraft:vertical_tail:taper_ratio,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..562aeb515b --- /dev/null +++ b/aviary/utils/test/data/converter_test_BWB_simple_FLOPS.csv @@ -0,0 +1,162 @@ +# 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:ignore_fuel_capacity_constraint,False,unitless +aircraft:fuel:wing_fuel_fraction,0.6883549569366508,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:sweep,0,deg +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:aspect_ratio,0.0,unitless +aircraft:vertical_tail:mass_scaler,1,unitless +aircraft:vertical_tail:num_tails,0,unitless +aircraft:vertical_tail:sweep,0,deg +aircraft:vertical_tail:taper_ratio,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..f5c32de76d 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 @@ -27,7 +27,7 @@ aircraft:design:landing_to_takeoff_mass_ratio,0.84,unitless 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 +72,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 @@ -152,6 +153,7 @@ mission:design:lift_coefficient,-1.0,unitless mission:design:mach,-1.0,unitless mission:design:range,3500.0,NM mission:design:thrust_takeoff_per_eng,0.0,lbf +mission:landing:drag_coefficient_min,0.045,unitless mission:landing:flare_rate,2.2,deg/s mission:landing:initial_velocity,145.0,ft/s mission:landing:lift_coefficient_max,2.5,unitless @@ -159,6 +161,7 @@ mission:summary:cruise_mach,0.785,0.0,0.0,0.0,0.0,0.0,unitless mission:summary:fuel_flow_scaler,1.0,unitless mission:takeoff:angle_of_attack_runway,0.0,deg mission:takeoff:braking_friction_coefficient,0.35,unitless +mission:takeoff:drag_coefficient_min,0.05,unitless mission:takeoff:final_altitude,35.0,ft mission:takeoff:fuel_simple,0.0,lbm mission:takeoff:lift_coefficient_max,2.0,unitless @@ -288,7 +291,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 @@ -344,15 +346,12 @@ TOLIN.aprhgt,100 TOLIN.argef,1 TOLIN.cdeout,0.0046077279938182 TOLIN.cdld,0.1,0.1,0.12,0.13,0.14,0.15,0.16,0.17,0.18,0.2,0.22,0.24,0.26,0.3,0.32,0.34 -TOLIN.cdmld,0.045 -TOLIN.cdmto,0.05 TOLIN.cdrev,0 TOLIN.cdto,0.0674,0.065,0.065,0.07,0.072,0.076,0.084,0.09,0.1,0.11,0.12,0.13,0.15,0.16,0.18,0.2 TOLIN.clld,0.7,0.9,1.05,1.15,1.25,1.4,1.5,1.6,1.7,1.8,1.9,2.0,2.1,2.2,2.3,2.4 TOLIN.clldm,2.4 TOLIN.clrev,0 TOLIN.clto,0.5178,0.6,0.75,0.85,0.95,1.05,1.15,1.25,1.35,1.5,1.6,1.7,1.8,1.85,1.9,1.95 -TOLIN.cltom,2 TOLIN.deldfl,2 TOLIN.delhap,2 TOLIN.deltcl,0.2 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/validation_tests.py b/aviary/validation_cases/validation_tests.py index 57224f7e45..dddc8eed07 100644 --- a/aviary/validation_cases/validation_tests.py +++ b/aviary/validation_cases/validation_tests.py @@ -16,7 +16,7 @@ from aviary.variable_info.functions import extract_options from aviary.variable_info.variables import Aircraft -Version = Enum('Version', ['ALL', 'TRANSPORT', 'ALTERNATE', 'BWB']) +Version = Enum('Version', ['ALL', 'TRANSPORT', 'ALTERNATE', 'BWB', 'TRANSPORT_and_BWB']) def do_validation_test( @@ -182,8 +182,7 @@ def flops_validation_test( will be listed. version: Version If this is a FLOPS-based mass analysis test, version specifies which - version of the mass equations being tested. Currently, there is no - BWB validation data so output values will not be checked. + version of the mass equations being tested. Default is ALL. tol : float Relative tolerance for comparing problem outputs against @@ -230,7 +229,7 @@ def flops_validation_test( flops_outputs = flops_data['outputs'].deepcopy() if ( - version is Version.TRANSPORT + version in [Version.TRANSPORT, Version.BWB, Version.TRANSPORT_and_BWB] and flops_inputs.get_val(Aircraft.Design.USE_ALT_MASS) or version is Version.ALTERNATE and not flops_inputs.get_val(Aircraft.Design.USE_ALT_MASS) diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index 1e516e96aa..f6c76eb2b7 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, ) @@ -7388,7 +7388,7 @@ meta_data=_MetaData, historical_name={ 'GASP': None, - 'FLOPS': 'AERIN.CDMLD', # ['&DEFINE.AERIN.CDMLD', 'LANDG.CDMLD'], + 'FLOPS': ['AERIN.CDMLD', 'TOLIN.CDMLD'], # ['&DEFINE.AERIN.CDMLD', 'LANDG.CDMLD'], 'LEAPS1': None, }, units='unitless', @@ -7902,7 +7902,7 @@ meta_data=_MetaData, historical_name={ 'GASP': None, - 'FLOPS': 'AERIN.CDMTO', # ['&DEFINE.AERIN.CDMTO', 'LANDG.CDMTO'], + 'FLOPS': ['AERIN.CDMTO', 'TOLIN.CDMTO'], # ['&DEFINE.AERIN.CDMTO', 'LANDG.CDMTO'], 'LEAPS1': None, }, units='unitless', @@ -8016,7 +8016,7 @@ historical_name={ 'GASP': 'INGASP.CLMWTO', # ['&DEFINE.AERIN.CLTOM', 'LANDG.CLTOM', '~DEFTOL.CLTOA'], - 'FLOPS': 'AERIN.CLTOM', + 'FLOPS': ['AERIN.CLTOM', 'TOLIN.CLTOM'], 'LEAPS1': 'aircraft.inputs.L0_takeoff_and_landing.max_takeoff_lift_coeff', }, units='unitless',