From f1b3f4a3a9621efb4a4f40a78b9569c3efdb153c Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 24 Dec 2025 18:51:51 -0500 Subject: [PATCH 01/76] work in progress: add Aircraft.HorizontalTail.NUM_TAILS --- aviary/variable_info/variable_meta_data.py | 10 ++++++++++ aviary/variable_info/variables.py | 1 + 2 files changed, 11 insertions(+) diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index 316bde8e7..d36acdeb0 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -3931,6 +3931,16 @@ desc='Ratio of wing chord to horizontal tail moment arm', ) +add_meta_data( + Aircraft.HorizontalTail.NUM_TAILS, + meta_data=_MetaData, + historical_name={'GASP': None, 'FLOPS': None, 'LEAPS1': None}, + desc='number of horizontal tails', + types=int, + option=True, + default_value=1, +) + add_meta_data( Aircraft.HorizontalTail.ROOT_CHORD, meta_data=_MetaData, diff --git a/aviary/variable_info/variables.py b/aviary/variable_info/variables.py index 7053a86a7..9a1c795d6 100644 --- a/aviary/variable_info/variables.py +++ b/aviary/variable_info/variables.py @@ -378,6 +378,7 @@ class HorizontalTail: MASS_SCALER = 'aircraft:horizontal_tail:mass_scaler' MOMENT_ARM = 'aircraft:horizontal_tail:moment_arm' MOMENT_RATIO = 'aircraft:horizontal_tail:moment_ratio' + NUM_TAILS = 'aircraft:horizontal_tail:num_tails' ROOT_CHORD = 'aircraft:horizontal_tail:root_chord' SPAN = 'aircraft:horizontal_tail:span' SWEEP = 'aircraft:horizontal_tail:sweep' From e129a6c2608c2fb4dbdf6d80dd32bea6df041aac Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 24 Dec 2025 18:54:37 -0500 Subject: [PATCH 02/76] add FLOPS model input deck --- .../blended_wing_body/bwb_detailed_FLOPS.in | 190 ++++++++++++++++++ .../blended_wing_body/bwb_simple_FLOPS.in | 186 +++++++++++++++++ 2 files changed, 376 insertions(+) create mode 100644 aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS.in create mode 100644 aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS.in 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 000000000..e072d1681 --- /dev/null +++ b/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS.in @@ -0,0 +1,190 @@ +468 passenger BWB - Based on Boeing BWB450-1U, Karl Geiselhart + + $OPTION +MPRINT=1, +IOPT=1, +IANAL=3, +INENG=1, +ICOST=0, +ITAKOF=0, +ILAND=0, +NOPRO=0, +NOISE=0, +IFITE=3, +IXFL=1, +IPOLP=0, +IPLTTH=0, + $END + + $WTIN +DGW=874099, +VMMO=0.85, +DIH=3, +FLAPR=0.333, +GLOV=121.05, +VARSWP=0, +FCOMP=1, +FAERT=0, +FSTRT=0, +NETAW=14, +ETAW=0.35,0.4,0.45,0.5,0.55,0.6,0.6499,0.7,0.75,0.8,0.85,0.8999,0.95,1, +CHD=58.03,0.4491,0.3884,0.3317,0.2886,0.2537,0.2269,0.2121,0.1983,0.1843,0.1704,0.1565,0.1426,0.1287, +TOC=0.15,0.1132,0.0928,0.0822,0.0764,0.0742,0.0746,0.0758,0.0758,0.0756,0.0756,0.0758,0.076,0.076, +SWL=0,0,0,0,0,0,0,42.9,42.9,42.9,42.9,42.9,42.9,42.9,0,0,0,0,0,0, +SHT=0, +SWPHT=0, +ARHT=0, +TRHT=0, +TCHT=0, +NVERT=0, +NFIN=2, +SFIN=184.89, +ARFIN=1.952, +TRFIN=0.464, +SWPFIN=39.42, +TCFIN=0.08, +NFUSE=1, +XL=0, ! XL=137.5 for fixed geom. +WF=0, ! WF=64.58 +DF=0, ! DF=17 +XLP=0, ! XLP=40 +XMLG=85, +XNLG=87, +CARBAS=0, +NEW=0, +NEF=3, +THRSO=86459.2, +WENG=22017, +EEXP=1, +WINL=0, +XNAC=17.433, +DNAC=12.608, +NPF=28, +NPB=100, +NPT=340, +NSTU=22, +NFLCR=2, +CARGF=0, +FRWI=1, +FRHT=1, +FRVT=1, +FRFU=1, +FRNA=0, +WTHR=0, +WPMSC=0, +WHYD=1, +WAVONC=1, +WFURN=1, +ISPOWE=0, + $END + + $FUSEIN +ACABIN=0, +FPITCH=61, +NFABR=4, +BPITCH=39, +NBABR=4, +TPITCH=32, +NTABR=6, +OSSPAN=86.75, + $END + $CONFIN +DESRNG=7750, +OFG=1, +OFF=0, +GW=874099, +AR=7.557,0, +THRUST=70000,1,0,0,0,0, +SW=7621.66,1, +TR=0.311, +SWEEP=35.7, +TCA=0.11, +VCMN=0.85, +CH=39000, + $END + + $AERIN +MYAERO=0, +ITPAER=2, +CAM=2, +AITEK=2, +XLLAM=0, +E=0, +WRATIO=0.8, +VAPPR=140, +FLTO=11000, +FLLDG=11000, +THROFF=0.25, + $END + + $ENGDIN +IGENEN=-1, +EIFILE='ENGDEK', +IDLE=1, +MAXCR=1, +NOX=1, + $END + + $MISSIN +FCDO=1, +FCDI=1, +ISKAL=1, +IFLAG=2, +MSUMPT=1, +IRW=2, +IATA=0, +NPCON=1, +TAKOTM=2, +TAXOTM=9, +APPRTM=4, +TAXITM=5, +ITTFF=1, +NCLIMB=1, +CLAMIN=0, +FWF=-0.001, +NCRUSE=3, +IOC=1,4,4, +CRMACH=0.85,0.6,0, +CRALT=45000,25000,1500, +RCIN=300, +IVS=1, +DEAMIN=0, +IRS=1, +RESTRP=0.05, +TIMMAP=2, +ALTRAN=200, +NCLRES=1, +NCRRES=2, +HOLDTM=30, +NCRHOL=3, +IHOPOS=1, +THOLD=0.1, +NCRTH=1, + $END +START +CLIMB +CRUISE +DESCENT +END + + $PCONIN +CONALT=35000, +CONMCH=0.85, +CONPC=1, +ICONSG=2, +CONLIM=300, +ICONTP=5, + $END + + $RERUN + $END + + $MISSIN +IRW=1, +NPCON=0, + $END +START +CLIMB +CRUISE +DESCENT +END diff --git a/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS.in b/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS.in new file mode 100644 index 000000000..53d81a10a --- /dev/null +++ b/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS.in @@ -0,0 +1,186 @@ +468 passenger BWB - Based on Boeing BWB450-1U, Karl Geiselhart + + $OPTION +MPRINT=1, +IOPT=1, +IANAL=3, +INENG=1, +ICOST=0, +ITAKOF=0, +ILAND=0, +NOPRO=0, +NOISE=0, +IFITE=3, +IXFL=1, +IPOLP=0, +IPLTTH=0, + $END + + $WTIN +DGW=874099, +VMMO=0.85, +DIH=3, +FLAPR=0.333, +GLOV=121.05, +VARSWP=0, +FCOMP=1, +FAERT=0, +FSTRT=0, +NETAW=0, +SHT=0, +SWPHT=0, +ARHT=0, +TRHT=0, +TCHT=0, +NVERT=0, +NFIN=2, +SFIN=184.89, +ARFIN=1.952, +TRFIN=0.464, +SWPFIN=39.42, +TCFIN=0.08, +NFUSE=1, +XL=137.5, ! XL=137.5 for fixed geom. +WF=64.58 +DF=0, ! DL=17 +XLP=0, ! XLP=40 +XMLG=85, +XNLG=87, +CARBAS=0, +NEW=0, +NEF=3, +THRSO=86459.2, +WENG=22017, +EEXP=1, +WINL=0, +XNAC=17.433, +DNAC=12.608, +NPF=28, +NPB=100, +NPT=340, +NSTU=22, +NFLCR=2, +CARGF=0, +FRWI=1, +FRHT=1, +FRVT=1, +FRFU=1, +FRNA=0, +WTHR=0, +WPMSC=0, +WHYD=1, +WAVONC=1, +WFURN=1, +ISPOWE=0, + $END + + $FUSEIN +ACABIN=0, +FPITCH=61, +NFABR=4, +BPITCH=39, +NBABR=4, +TPITCH=32, +NTABR=6, +OSSPAN=86.75, + $END + $CONFIN +DESRNG=7750, +OFG=1, +OFF=0, +GW=874099, +AR=7.557,0, +THRUST=70000,1,0,0,0,0, +SW=7621.66,1, +TR=0.311, +SWEEP=35.7, +TCA=0.11, +VCMN=0.85, +CH=39000, + $END + + $AERIN +MYAERO=0, +ITPAER=2, +CAM=2, +AITEK=2, +XLLAM=0, +E=0, +WRATIO=0.8, +VAPPR=140, +FLTO=11000, +FLLDG=11000, +THROFF=0.25, + $END + + $ENGDIN +IGENEN=-1, +EIFILE='ENGDEK', +IDLE=1, +MAXCR=1, +NOX=1, + $END + + $MISSIN +FCDO=1, +FCDI=1, +ISKAL=1, +IFLAG=2, +MSUMPT=1, +IRW=2, +IATA=0, +NPCON=1, +TAKOTM=2, +TAXOTM=9, +APPRTM=4, +TAXITM=5, +ITTFF=1, +NCLIMB=1, +CLAMIN=0, +FWF=-0.001, +NCRUSE=3, +IOC=1,4,4, +CRMACH=0.85,0.6,0, +CRALT=45000,25000,1500, +RCIN=300, +IVS=1, +DEAMIN=0, +IRS=1, +RESTRP=0.05, +TIMMAP=2, +ALTRAN=200, +NCLRES=1, +NCRRES=2, +HOLDTM=30, +NCRHOL=3, +IHOPOS=1, +THOLD=0.1, +NCRTH=1, + $END +START +CLIMB +CRUISE +DESCENT +END + + $PCONIN +CONALT=35000, +CONMCH=0.85, +CONPC=1, +ICONSG=2, +CONLIM=300, +ICONTP=5, + $END + + $RERUN + $END + + $MISSIN +IRW=1, +NPCON=0, + $END +START +CLIMB +CRUISE +DESCENT +END From 2846139b039fba426cb3eb9ce115e2ac77cd5a5a Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 31 Dec 2025 11:44:18 -0500 Subject: [PATCH 03/76] work in progress --- .../models/aircraft/blended_wing_body/bwb_detailed_FLOPS.csv | 3 +-- .../aircraft/blended_wing_body/bwb_detailed_FLOPS_data.py | 1 - aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS.csv | 1 - .../models/aircraft/blended_wing_body/bwb_simple_FLOPS_data.py | 1 - 4 files changed, 1 insertion(+), 5 deletions(-) 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 24bedb619..a14698af6 100644 --- a/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS.csv +++ b/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS.csv @@ -6,7 +6,7 @@ aircraft:air_conditioning:mass_scaler,1.0,unitless aircraft:anti_icing:mass_scaler,1.0,unitless aircraft:apu:mass_scaler,1.0,unitless aircraft:avionics:mass_scaler,1.0,unitless -aircraft:blended_wing_body_design:detailed_wing_provided,False,unitless +aircraft:blended_wing_body_design:detailed_wing_provided,True,unitless aircraft:blended_wing_body_design:passenger_leading_edge_sweep,45,deg aircraft:canard:area,0.0,ft**2 aircraft:canard:aspect_ratio,0.0,unitless @@ -160,7 +160,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_data.py b/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS_data.py index 5728d528b..7d567823d 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) 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 d78d7176c..ca95241d4 100644 --- a/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS.csv +++ b/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS.csv @@ -156,7 +156,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_data.py b/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS_data.py index 257012b54..01cf06b3b 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) From 1edb49a3432188adbf6df6e390a292dda63283e3 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 5 Jan 2026 13:04:18 -0500 Subject: [PATCH 04/76] work in progress --- .../aircraft/blended_wing_body/bwb_detailed_FLOPS.csv | 7 +------ .../blended_wing_body/bwb_detailed_FLOPS_data.py | 4 ---- .../aircraft/blended_wing_body/bwb_simple_FLOPS.csv | 9 ++------- .../aircraft/blended_wing_body/bwb_simple_FLOPS_data.py | 4 ---- aviary/utils/legacy_code_data/flops_defaults.py | 4 ++++ 5 files changed, 7 insertions(+), 21 deletions(-) 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 a14698af6..1824b6dec 100644 --- a/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS.csv +++ b/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS.csv @@ -27,13 +27,9 @@ aircraft:crew_and_payload:design:seat_pitch_tourist,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_tourist_class,340,unitless aircraft:crew_and_payload:passenger_service_mass_scaler,1.0,unitless aircraft:crew_and_payload:wing_cargo,0.0,lbm aircraft:design:base_area,0.0,ft**2 @@ -104,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 @@ -153,7 +149,6 @@ aircraft:wing:surface_control_mass_scaler,1.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_reference,0.11,unitless aircraft:wing:thickness_to_chord_dist,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.0,unitless 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 7d567823d..754c80560 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 @@ -51,10 +51,6 @@ 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_TOURIST_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_TOURIST_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 inputs.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_TOURIST, 6) # NTABR 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 ca95241d4..bbc29319c 100644 --- a/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS.csv +++ b/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS.csv @@ -27,13 +27,9 @@ aircraft:crew_and_payload:design:seat_pitch_tourist,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_tourist_class,340,unitless aircraft:crew_and_payload:passenger_service_mass_scaler,1.0,unitless aircraft:crew_and_payload:wing_cargo,0.0,lbm aircraft:design:base_area,0.0,ft**2 @@ -99,13 +95,13 @@ aircraft:fuselage:wetted_area_scaler,1.0,unitless aircraft:horizontal_tail:area,0.0,ft**2 aircraft:horizontal_tail:aspect_ratio,0.1,unitless aircraft:horizontal_tail:mass_scaler,1.0,unitless -# aircraft:horizontal_tail:sweep,0.0,deg +aircraft:horizontal_tail:sweep,0.0,deg 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 @@ -150,7 +146,6 @@ aircraft:wing:surface_control_mass_scaler,1.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_reference,0.11,unitless aircraft:wing:ultimate_load_factor,3.75,unitless aircraft:wing:var_sweep_mass_penalty,0.0,unitless aircraft:wing:wetted_area_scaler,1.0,unitless 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 01cf06b3b..610ebd9d5 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 @@ -51,10 +51,6 @@ 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_TOURIST_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_TOURIST_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 inputs.set_val(Aircraft.CrewPayload.Design.NUM_SEATS_ABREAST_TOURIST, 6) # NTABR diff --git a/aviary/utils/legacy_code_data/flops_defaults.py b/aviary/utils/legacy_code_data/flops_defaults.py index 98f796401..1bef060d1 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'), } ) From f7961579295263bf91743d8ddc8bdde358948490 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 6 Jan 2026 16:58:23 -0500 Subject: [PATCH 05/76] add OPTION.IFITE to aviary variable Aircraft.Design.TYPE --- aviary/variable_info/variable_meta_data.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index 316bde8e7..8844d0bd8 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -1740,7 +1740,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, From 1244ff8e64ffbd9930b7e7b99243a4da20e1e203 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 6 Jan 2026 16:59:54 -0500 Subject: [PATCH 06/76] modify a docstring --- aviary/subsystems/geometry/flops_based/fuselage.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aviary/subsystems/geometry/flops_based/fuselage.py b/aviary/subsystems/geometry/flops_based/fuselage.py index 0fa9d61bf..5c6595531 100644 --- a/aviary/subsystems/geometry/flops_based/fuselage.py +++ b/aviary/subsystems/geometry/flops_based/fuselage.py @@ -135,7 +135,7 @@ def compute_partials(self, inputs, partials): class SimpleCabinLayout(om.ExplicitComponent): """ - Given fuselage length, height and width, compute passenger compartment length. + Given fuselage length, compute passenger compartment length. This is for transporter aircraft, not BWB. """ From bc53c1a185de3ac8645fec1820c651d773acfeba Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 6 Jan 2026 17:01:33 -0500 Subject: [PATCH 07/76] modify BWB models --- .../aircraft/blended_wing_body/bwb_detailed_FLOPS.csv | 6 +----- .../models/aircraft/blended_wing_body/bwb_simple_FLOPS.csv | 5 +---- 2 files changed, 2 insertions(+), 9 deletions(-) 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 1824b6dec..fd91a650b 100644 --- a/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS.csv +++ b/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS.csv @@ -73,7 +73,6 @@ aircraft:fins:num_fins,2,unitless aircraft:fins:taper_ratio,0.464,unitless aircraft:fins:mass_scaler,1.0,unitless aircraft:fuel:auxiliary_fuel_capacity,0.0,lbm -aircraft:fuel:density,6.7,lbm/galUS aircraft:fuel:ignore_fuel_capacity_constraint,False,unitless aircraft:fuel:num_tanks,7,unitless aircraft:fuel:fuel_system_mass_scaler,1.0,unitless @@ -123,9 +122,6 @@ aircraft:vertical_tail:thickness_to_chord,0.11,unitless aircraft:vertical_tail:wetted_area_scaler,1.0,unitless aircraft:wing:aeroelastic_tailoring_factor,0.0,unitless aircraft:wing:airfoil_technology,2.0,unitless -aircraft:wing:area,7621.66,1,ft**2 -aircraft:wing:aspect_ratio,7.557,0,unitless -# aircraft:wing:aspect_ratio_ref,7.557,0,unitless aircraft:wing:bending_material_mass_scaler,1.0,unitless aircraft:wing:chord_per_semispan_dist,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 @@ -158,7 +154,7 @@ 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:landing:lift_coefficient_max,3.0,unitless mission:landing:rolling_friction_coefficient,0.025,unitless mission:takeoff:lift_coefficient_max,2.0,unitless mission:summary:cruise_mach,0.85,unitless 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 bbc29319c..095dbe0e6 100644 --- a/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS.csv +++ b/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS.csv @@ -73,7 +73,6 @@ aircraft:fins:num_fins,2,unitless aircraft:fins:taper_ratio,0.464,unitless aircraft:fins:mass_scaler,1.0,unitless aircraft:fuel:auxiliary_fuel_capacity,0.0,lbm -aircraft:fuel:density,6.7,lbm/galUS aircraft:fuel:ignore_fuel_capacity_constraint,False,unitless aircraft:fuel:num_tanks,7,unitless aircraft:fuel:fuel_system_mass_scaler,1.0,unitless @@ -123,8 +122,6 @@ aircraft:vertical_tail:thickness_to_chord,0.11,unitless aircraft:vertical_tail:wetted_area_scaler,1.0,unitless aircraft:wing:aeroelastic_tailoring_factor,0.0,unitless aircraft:wing:airfoil_technology,2.0,unitless -# aircraft:wing:area,7621.66,1,ft**2 -# aircraft:wing:aspect_ratio,7.557,0,unitless aircraft:wing:bending_material_mass_scaler,1.0,unitless aircraft:wing:composite_fraction,1,unitless aircraft:wing:control_surface_area_ratio,0.333,unitless @@ -154,7 +151,7 @@ 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:landing:lift_coefficient_max,3.0,unitless mission:landing:rolling_friction_coefficient,0.025,unitless mission:takeoff:lift_coefficient_max,2.0,unitless mission:summary:cruise_mach,0.85,unitless From 979bb1c2ecb34434d4453bf33e0fcdbe3b291eff Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 6 Jan 2026 17:03:38 -0500 Subject: [PATCH 08/76] update BWB models --- .../aircraft/blended_wing_body/bwb_detailed_FLOPS_data.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 754c80560..cd0ac286e 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 @@ -84,7 +84,6 @@ # 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 @@ -283,7 +282,7 @@ inputs.set_val(Mission.Constraints.MAX_MACH, 0.85) # VMMO # inputs.set_val(Mission.Takeoff.FUEL_SIMPLE, 577, 'lbm') # FTKOFL -inputs.set_val(Mission.Landing.LIFT_COEFFICIENT_MAX, 3.0) # CLLDM +# inputs.set_val(Mission.Landing.LIFT_COEFFICIENT_MAX, 3.0) # CLLDM inputs.set_val(Mission.Takeoff.LIFT_COEFFICIENT_MAX, 2) # CLTOM # inputs.set_val(Mission.Takeoff.LIFT_OVER_DRAG, 17.354) inputs.set_val(Aircraft.Design.LANDING_TO_TAKEOFF_MASS_RATIO, 0.8) # WRATIO From 9eb99a99be6b05af2b6af5e91a6b973680d0e1e7 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 6 Jan 2026 17:04:44 -0500 Subject: [PATCH 09/76] update BWB models --- .../models/aircraft/blended_wing_body/bwb_simple_FLOPS_data.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) 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 610ebd9d5..0ca63dd28 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 @@ -84,7 +84,6 @@ # 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 @@ -230,7 +229,7 @@ inputs.set_val(Mission.Constraints.MAX_MACH, 0.85) # VMMO # inputs.set_val(Mission.Takeoff.FUEL_SIMPLE, 577, 'lbm') # FTKOFL -inputs.set_val(Mission.Landing.LIFT_COEFFICIENT_MAX, 3.0) # CLLDM +# inputs.set_val(Mission.Landing.LIFT_COEFFICIENT_MAX, 3.0) # CLLDM inputs.set_val(Mission.Takeoff.LIFT_COEFFICIENT_MAX, 2) # CLTOM # inputs.set_val(Mission.Takeoff.LIFT_OVER_DRAG, 17.354) inputs.set_val(Aircraft.Design.LANDING_TO_TAKEOFF_MASS_RATIO, 0.8) # WRATIO From 56f98f90a5a46644ba3661fee3f5e438bcc154c3 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 6 Jan 2026 17:07:50 -0500 Subject: [PATCH 10/76] work in progress --- aviary/utils/fortran_to_aviary.py | 156 +++++++++++++++++++++++++++++- 1 file changed, 155 insertions(+), 1 deletion(-) diff --git a/aviary/utils/fortran_to_aviary.py b/aviary/utils/fortran_to_aviary.py index f4eab2248..57d946db4 100644 --- a/aviary/utils/fortran_to_aviary.py +++ b/aviary/utils/fortran_to_aviary.py @@ -914,6 +914,160 @@ def update_flops_options(vehicle_data): if Aircraft.Wing.INPUT_STATION_DIST in input_values: input_values.set_val(Aircraft.Wing.DETAILED_WING, [True]) + 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) + 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_values.set_val(Aircraft.BWB.DETAILED_WING_PROVIDED, [True]) + else: + # If detail wing is not provided, initialize it to [0, 0.5, 1] + 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.CrewPayload.Design.NUM_BUSINESS_CLASS in input_values: + num_business_class = input_values.get_val( + Aircraft.CrewPayload.Design.NUM_BUSINESS_CLASS, 'unitless' + )[0] + else: + num_business_class = 0 + if Aircraft.CrewPayload.Design.NUM_FIRST_CLASS in input_values: + num_first_class = input_values.get_val( + Aircraft.CrewPayload.Design.NUM_FIRST_CLASS, 'unitless' + )[0] + else: + num_first_class = 0 + if Aircraft.CrewPayload.Design.NUM_TOURIST_CLASS in input_values: + num_tourist_class = input_values.get_val( + Aircraft.CrewPayload.Design.NUM_TOURIST_CLASS, 'unitless' + )[0] + else: + num_tourist_class = 0 + num_passengers = num_business_class + num_first_class + num_tourist_class + input_values.set_val(Aircraft.CrewPayload.Design.NUM_PASSENGERS, [num_passengers]) + + if not Aircraft.CrewPayload.NUM_GALLEY_CREW in input_values: + if num_passengers < 151: + num_galley_crew = 0 + else: + num_galley_crew = int(num_passengers / 250) + 1 + input_values.set_val(Aircraft.CrewPayload.NUM_GALLEY_CREW, [num_galley_crew]) + + if not Aircraft.Engine.NUM_ENGINES in input_values: + if Aircraft.Engine.NUM_FUSELAGE_ENGINES in input_values: + num_fuselage_engines = input_values.get_val( + Aircraft.Engine.NUM_FUSELAGE_ENGINES, 'unitless' + )[0] + else: + num_fuselage_engines = 0 + if Aircraft.Engine.NUM_WING_ENGINES in input_values: + num_wing_engines = input_values.get_val(Aircraft.Engine.NUM_WING_ENGINES, 'unitless')[0] + else: + num_wing_engines = 0 + num_engines = num_fuselage_engines + num_wing_engines + input_values.set_val(Aircraft.Engine.NUM_ENGINES, [num_engines]) + + if not Aircraft.CrewPayload.BAGGAGE_MASS_PER_PASSENGER in input_values: + if Mission.Design.RANGE in input_values: + design_range = input_values.get_val(Mission.Design.RANGE, 'nmi')[0] + baggage_per_pax = 35.0 + if design_range > 2900: + baggage_per_pax = 44.0 + elif design_range > 900: + baggage_per_pax = 40.0 + input_values.set_val( + Aircraft.CrewPayload.BAGGAGE_MASS_PER_PASSENGER, [baggage_per_pax], 'lbm' + ) + + if design_type[0] == 0: + 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: + if ( + Aircraft.Fuselage.LENGTH in input_values + and Aircraft.BWB.PASSENGER_LEADING_EDGE_SWEEP in input_values + ): + input_values.set_val(Aircraft.Fuselage.SIMPLE_LAYOUT, [True], 'unitless') + else: + input_values.set_val(Aircraft.Fuselage.SIMPLE_LAYOUT, [False], 'unitless') + + if design_type[0] == 3: + if Aircraft.Engine.SCALED_SLS_THRUST in input_values: + # not sure why THRUST=70000,1,0,0,0,0, just grab the first entry + # does it apply to transporters? + thrust = input_values.get_val(Aircraft.Engine.SCALED_SLS_THRUST, 'lbf')[0] + input_values.set_val(Aircraft.Engine.SCALED_SLS_THRUST, [thrust], 'lbf') + + if not Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO in input_values: + if Aircraft.Wing.THICKNESS_TO_CHORD in input_values: + wing_tc = input_values.get_val(Aircraft.Wing.THICKNESS_TO_CHORD, 'unitless')[0] + input_values.set_val(Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO, [wing_tc], 'unitless') + + if ( + not Aircraft.HorizontalTail.THICKNESS_TO_CHORD in input_values + or input_values.get_val(Aircraft.HorizontalTail.THICKNESS_TO_CHORD, 'unitless')[0] == 0 + ): + if Aircraft.Wing.THICKNESS_TO_CHORD in input_values: + wing_tc = input_values.get_val(Aircraft.Wing.THICKNESS_TO_CHORD, 'unitless')[0] + input_values.set_val(Aircraft.HorizontalTail.THICKNESS_TO_CHORD, [wing_tc], 'unitless') + + if (not Aircraft.VerticalTail.THICKNESS_TO_CHORD in input_values) or ( + input_values.get_val(Aircraft.VerticalTail.THICKNESS_TO_CHORD, 'unitless')[0] == 0 + ): + if Aircraft.Wing.THICKNESS_TO_CHORD in input_values: + wing_tc = input_values.get_val(Aircraft.Wing.THICKNESS_TO_CHORD, 'unitless')[0] + input_values.set_val(Aircraft.VerticalTail.THICKNESS_TO_CHORD, [wing_tc], 'unitless') + + if design_type[0] == 3: + if not Aircraft.Fuel.WING_FUEL_FRACTION in input_values: + # Interpret value equivalently to FWMAX = wing_fuel_fraction * fuel_density * 2/3 + FWMAX = 23 # the default + if Aircraft.Fuel.DENSITY in input_values: + FULDEN = input_values.get_val(Aircraft.Fuel.DENSITY, 'lbm/ft**3')[0] + else: + FULDEN = 50.1194909 # lbm/ft**3 or 6.7 lbm/galUS + input_values.set_val( + Aircraft.Fuel.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') + + # These variables should be removed if they are zero. + rem_list = [ + (Aircraft.Fuselage.CABIN_AREA, 'ft**2'), + (Aircraft.Fuselage.MAX_HEIGHT, 'ft'), + (Aircraft.Fuselage.PASSENGER_COMPARTMENT_LENGTH, 'ft'), + ] + for var in rem_list: + val = input_values.get_val(var[0], var[1])[0] + if val == 0.0: + input_values.delete(var[0]) + vehicle_data['input_values'] = input_values return vehicle_data @@ -922,7 +1076,7 @@ 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 + # if reference + scaled thrust both provided, set scale factor -- Is this comment still true? try: ref_thrust = input_values.get_val(Aircraft.Engine.REFERENCE_SLS_THRUST, 'lbf')[0] ref_thrust = float(ref_thrust) From acf2348c4bbefc5449fccc2ef477e7c82c01ead5 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 6 Jan 2026 19:04:25 -0500 Subject: [PATCH 11/76] fix a typo --- aviary/variable_info/variables.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aviary/variable_info/variables.py b/aviary/variable_info/variables.py index 6fe72918d..11cbd2e11 100644 --- a/aviary/variable_info/variables.py +++ b/aviary/variable_info/variables.py @@ -577,7 +577,7 @@ class Wing: NUM_INTEGRATION_STATIONS = 'aircraft:wing:num_integration_stations' OPTIMUM_FLAP_DEFLECTION = 'aircraft:wing:optimum_flap_deflection' OPTIMUM_SLAT_DEFLECTION = 'aircraft:wing:optimum_slat_deflection' - OUTBOARD_SEMISPAN = 'aircraft:wing:Outboard_semispan' + OUTBOARD_SEMISPAN = 'aircraft:wing:outboard_semispan' ROOT_CHORD = 'aircraft:wing:root_chord' SHEAR_CONTROL_MASS = 'aircraft:wing:shear_control_mass' From e04b45f6aeb66a50ee414d40ec0aba0202bd7e7e Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 6 Jan 2026 19:06:19 -0500 Subject: [PATCH 12/76] compute Aircraft.Wing.SPAN in case of simple wing of BWB --- aviary/utils/fortran_to_aviary.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/aviary/utils/fortran_to_aviary.py b/aviary/utils/fortran_to_aviary.py index 57d946db4..f28cb1061 100644 --- a/aviary/utils/fortran_to_aviary.py +++ b/aviary/utils/fortran_to_aviary.py @@ -929,6 +929,20 @@ def update_flops_options(vehicle_data): 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 not input_values.get_val(Aircraft.BWB.DETAILED_WING_PROVIDED)[0]: + try: + ar = input_values.get_val(Aircraft.Wing.ASPECT_RATIO, 'unitless')[0] + sw = input_values.get_val(Aircraft.Wing.AREA, 'ft**2')[0] + glov = input_values.get_val(Aircraft.Wing.GLOVE_AND_BAT, 'ft**2')[0] + span = (ar * (sw - glov)) ** 0.5 + input_values.set_val(Aircraft.Wing.SPAN, [span], 'ft') + except KeyError: + pass + try: # needed only if detailed wing is provided + input_values.delete(Aircraft.Wing.OUTBOARD_SEMISPAN) + except KeyError: + pass + if Aircraft.CrewPayload.Design.NUM_BUSINESS_CLASS in input_values: num_business_class = input_values.get_val( Aircraft.CrewPayload.Design.NUM_BUSINESS_CLASS, 'unitless' From 42aad076112d55a697da666dabb0882ad864a9ab Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 7 Jan 2026 16:07:19 -0500 Subject: [PATCH 13/76] work in progress for fortran_to_aviary --- .../blended_wing_body/bwb_detailed_FLOPS.csv | 1 + .../bwb_detailed_FLOPS_data.py | 1 + .../blended_wing_body/bwb_simple_FLOPS.csv | 1 + .../bwb_simple_FLOPS_data.py | 1 + .../flops_based/test/test_unusable_fuel.py | 7 ++- aviary/utils/fortran_to_aviary.py | 54 +++++++++++-------- .../test/data/converter_test_N3CC_FLOPS.csv | 5 +- 7 files changed, 44 insertions(+), 26 deletions(-) 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 fd91a650b..4d8e47387 100644 --- a/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS.csv +++ b/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS.csv @@ -73,6 +73,7 @@ aircraft:fins:num_fins,2,unitless aircraft:fins:taper_ratio,0.464,unitless aircraft:fins:mass_scaler,1.0,unitless aircraft:fuel:auxiliary_fuel_capacity,0.0,lbm +aircraft:fuel:density,6.7,lbm/galUS aircraft:fuel:ignore_fuel_capacity_constraint,False,unitless aircraft:fuel:num_tanks,7,unitless aircraft:fuel:fuel_system_mass_scaler,1.0,unitless 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 7c9396fee..3ec25e619 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 @@ -90,6 +90,7 @@ 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 # --------------------------- 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 095dbe0e6..b21e47b66 100644 --- a/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS.csv +++ b/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS.csv @@ -73,6 +73,7 @@ aircraft:fins:num_fins,2,unitless aircraft:fins:taper_ratio,0.464,unitless aircraft:fins:mass_scaler,1.0,unitless aircraft:fuel:auxiliary_fuel_capacity,0.0,lbm +aircraft:fuel:density,6.7,lbm/galUS aircraft:fuel:ignore_fuel_capacity_constraint,False,unitless aircraft:fuel:num_tanks,7,unitless aircraft:fuel:fuel_system_mass_scaler,1.0,unitless 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 0ca63dd28..1b7898eae 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 @@ -90,6 +90,7 @@ 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 # --------------------------- 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 449f44e62..0cadfa94b 100644 --- a/aviary/subsystems/mass/flops_based/test/test_unusable_fuel.py +++ b/aviary/subsystems/mass/flops_based/test/test_unusable_fuel.py @@ -163,8 +163,11 @@ class BWBTransportUnusableFuelMassTest(unittest.TestCase): def setUp(self): self.prob = om.Problem() - @parameterized.expand(get_flops_case_names(only=bwb_cases), name_func=print_case) - def test_case(self, case_name): + # @parameterized.expand(get_flops_case_names(only=bwb_cases), name_func=print_case) + def test_case( + self, + ): + case_name = 'BWBsimpleFLOPS' prob = self.prob prob.model.add_subsystem( diff --git a/aviary/utils/fortran_to_aviary.py b/aviary/utils/fortran_to_aviary.py index f28cb1061..fad6d5f41 100644 --- a/aviary/utils/fortran_to_aviary.py +++ b/aviary/utils/fortran_to_aviary.py @@ -969,7 +969,7 @@ def update_flops_options(vehicle_data): num_galley_crew = 0 else: num_galley_crew = int(num_passengers / 250) + 1 - input_values.set_val(Aircraft.CrewPayload.NUM_GALLEY_CREW, [num_galley_crew]) + input_values.set_val(Aircraft.CrewPayload.NUM_GALLEY_CREW, [num_galley_crew]) if not Aircraft.Engine.NUM_ENGINES in input_values: if Aircraft.Engine.NUM_FUSELAGE_ENGINES in input_values: @@ -1011,17 +1011,16 @@ def update_flops_options(vehicle_data): else: input_values.set_val(Aircraft.Fuselage.SIMPLE_LAYOUT, [False], 'unitless') - if design_type[0] == 3: if Aircraft.Engine.SCALED_SLS_THRUST in input_values: # not sure why THRUST=70000,1,0,0,0,0, just grab the first entry # does it apply to transporters? thrust = input_values.get_val(Aircraft.Engine.SCALED_SLS_THRUST, 'lbf')[0] input_values.set_val(Aircraft.Engine.SCALED_SLS_THRUST, [thrust], 'lbf') - if not Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO in input_values: - if Aircraft.Wing.THICKNESS_TO_CHORD in input_values: - wing_tc = input_values.get_val(Aircraft.Wing.THICKNESS_TO_CHORD, 'unitless')[0] - input_values.set_val(Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO, [wing_tc], 'unitless') + if not Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO in input_values: + if Aircraft.Wing.THICKNESS_TO_CHORD in input_values: + wing_tc = input_values.get_val(Aircraft.Wing.THICKNESS_TO_CHORD, 'unitless')[0] + input_values.set_val(Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO, [wing_tc], 'unitless') if ( not Aircraft.HorizontalTail.THICKNESS_TO_CHORD in input_values @@ -1046,6 +1045,7 @@ def update_flops_options(vehicle_data): FULDEN = input_values.get_val(Aircraft.Fuel.DENSITY, 'lbm/ft**3')[0] else: FULDEN = 50.1194909 # lbm/ft**3 or 6.7 lbm/galUS + input_values.set_val(Aircraft.Fuel.DENSITY, [6.7], 'lbm/galUS') input_values.set_val( Aircraft.Fuel.WING_FUEL_FRACTION, [FWMAX / (FULDEN * (2 / 3))], 'unitless' ) @@ -1056,20 +1056,22 @@ def update_flops_options(vehicle_data): 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') + 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' + ) # These variables should be removed if they are zero. rem_list = [ @@ -1078,9 +1080,15 @@ def update_flops_options(vehicle_data): (Aircraft.Fuselage.PASSENGER_COMPARTMENT_LENGTH, 'ft'), ] for var in rem_list: - val = input_values.get_val(var[0], var[1])[0] - if val == 0.0: - input_values.delete(var[0]) + 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 diff --git a/aviary/utils/test/data/converter_test_N3CC_FLOPS.csv b/aviary/utils/test/data/converter_test_N3CC_FLOPS.csv index db103ed1f..80b537dc3 100644 --- a/aviary/utils/test/data/converter_test_N3CC_FLOPS.csv +++ b/aviary/utils/test/data/converter_test_N3CC_FLOPS.csv @@ -11,6 +11,7 @@ aircraft:canard:mass_scaler,1.0,unitless aircraft:crew_and_payload:baggage_mass_per_passenger,35.0,lbm aircraft:crew_and_payload:design:num_business_class,20,unitless aircraft:crew_and_payload:design:num_first_class,16,unitless +aircraft:crew_and_payload:design:num_passengers,154,unitless aircraft:crew_and_payload:design:num_tourist_class,118,unitless aircraft:crew_and_payload:flight_crew_mass_scaler,1.0,unitless aircraft:crew_and_payload:mass_per_passenger,165.0,lbm @@ -28,6 +29,7 @@ aircraft:design:lift_dependent_drag_coeff_factor,0.93,unitless aircraft:design:subsonic_drag_coeff_factor,0.95,unitless aircraft:design:supersonic_drag_coeff_factor,1.0,unitless aircraft:design:touchdown_mass,0.0,lbm +aircraft:design:type,transport,unitless aircraft:design:use_alt_mass,False,unitless aircraft:design:zero_lift_drag_coeff_factor,0.96,unitless aircraft:electrical:mass_scaler,1.1976,unitless @@ -41,6 +43,7 @@ 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.15,unitless +aircraft:engine:num_engines,2,unitless aircraft:engine:num_fuselage_engines,0,unitless aircraft:engine:num_wing_engines,2,unitless aircraft:engine:reference_mass,6293.8,lbm @@ -72,6 +75,7 @@ aircraft:fuselage:max_width,12.3,ft aircraft:fuselage:military_cargo_floor,False,unitless aircraft:fuselage:num_fuselages,1,unitless aircraft:fuselage:passenger_compartment_length,97.5,ft +aircraft:fuselage:simple_layout,True,unitless aircraft:fuselage:wetted_area,4235.082096,ft**2 aircraft:horizontal_tail:area,349.522730527158,ft**2 aircraft:horizontal_tail:aspect_ratio,5.22699386503068,unitless @@ -288,7 +292,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 From 739c5c9e760edba8b0936ed543c05cb48bbc7ba2 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 7 Jan 2026 16:59:54 -0500 Subject: [PATCH 14/76] add a comment --- aviary/utils/fortran_to_aviary.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/aviary/utils/fortran_to_aviary.py b/aviary/utils/fortran_to_aviary.py index fad6d5f41..d5ec6dcb4 100644 --- a/aviary/utils/fortran_to_aviary.py +++ b/aviary/utils/fortran_to_aviary.py @@ -931,6 +931,8 @@ def update_flops_options(vehicle_data): if not input_values.get_val(Aircraft.BWB.DETAILED_WING_PROVIDED)[0]: try: + # FLOPS uses AR and SW to compute wing span. Later, AR and SW are updated. + # So, they will be removed from inputs. ar = input_values.get_val(Aircraft.Wing.ASPECT_RATIO, 'unitless')[0] sw = input_values.get_val(Aircraft.Wing.AREA, 'ft**2')[0] glov = input_values.get_val(Aircraft.Wing.GLOVE_AND_BAT, 'ft**2')[0] From 41132804e02cb1bc656a88d8f2b7c636b59571cd Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 7 Jan 2026 20:55:01 -0500 Subject: [PATCH 15/76] fix typo --- .../models/aircraft/blended_wing_body/bwb_detailed_FLOPS.csv | 2 +- aviary/subsystems/test/test_flops_based_premission.py | 5 +---- 2 files changed, 2 insertions(+), 5 deletions(-) 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 e219c6467..e9170d4f7 100644 --- a/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS.csv +++ b/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS.csv @@ -137,7 +137,7 @@ aircraft:wing:mass_scaler,1,unitless aircraft:wing:max_camber_at_70_semispan,2,unitless aircraft:wing:misc_mass_scaler,1.0,unitless aircraft:wing:num_integration_stations,50,unitless -aircraft:wing:Outboard_semispan,86.75,ft +aircraft:wing:outboard_semispan,86.75,ft aircraft:wing:shear_control_mass_scaler,1.0,unitless aircraft:wing:span,253.720756,ft aircraft:wing:span_efficiency_factor,0.0,unitless diff --git a/aviary/subsystems/test/test_flops_based_premission.py b/aviary/subsystems/test/test_flops_based_premission.py index a9cde4868..8cf08524b 100644 --- a/aviary/subsystems/test/test_flops_based_premission.py +++ b/aviary/subsystems/test/test_flops_based_premission.py @@ -1289,7 +1289,4 @@ def test_case_all_subsystems(self): if __name__ == '__main__': - # unittest.main() - test = BWBPreMissionGroupCSVTest2() - test.setUp() - test.test_case_geom_mass() + unittest.main() From f3c1c1a91606da3e4501704cc297061f0e5707f8 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Thu, 8 Jan 2026 20:36:05 -0500 Subject: [PATCH 16/76] update fortran_to_aviary.py for detailed BWB model --- aviary/utils/fortran_to_aviary.py | 32 +++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/aviary/utils/fortran_to_aviary.py b/aviary/utils/fortran_to_aviary.py index d5ec6dcb4..6c749fa22 100644 --- a/aviary/utils/fortran_to_aviary.py +++ b/aviary/utils/fortran_to_aviary.py @@ -923,28 +923,25 @@ def update_flops_options(vehicle_data): # 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: # If detail wing is not provided, initialize it to [0, 0.5, 1] 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 not input_values.get_val(Aircraft.BWB.DETAILED_WING_PROVIDED)[0]: - try: - # FLOPS uses AR and SW to compute wing span. Later, AR and SW are updated. - # So, they will be removed from inputs. - ar = input_values.get_val(Aircraft.Wing.ASPECT_RATIO, 'unitless')[0] - sw = input_values.get_val(Aircraft.Wing.AREA, 'ft**2')[0] - glov = input_values.get_val(Aircraft.Wing.GLOVE_AND_BAT, 'ft**2')[0] - span = (ar * (sw - glov)) ** 0.5 - input_values.set_val(Aircraft.Wing.SPAN, [span], 'ft') - except KeyError: - pass - try: # needed only if detailed wing is provided - input_values.delete(Aircraft.Wing.OUTBOARD_SEMISPAN) - except KeyError: - pass - if Aircraft.CrewPayload.Design.NUM_BUSINESS_CLASS in input_values: num_business_class = input_values.get_val( Aircraft.CrewPayload.Design.NUM_BUSINESS_CLASS, 'unitless' @@ -1080,6 +1077,9 @@ def update_flops_options(vehicle_data): (Aircraft.Fuselage.CABIN_AREA, 'ft**2'), (Aircraft.Fuselage.MAX_HEIGHT, 'ft'), (Aircraft.Fuselage.PASSENGER_COMPARTMENT_LENGTH, 'ft'), + (Aircraft.Fuselage.LENGTH, 'ft'), + (Aircraft.Fuselage.MAX_WIDTH, 'ft'), + (Aircraft.HorizontalTail.SWEEP, 'deg'), ] for var in rem_list: try: From 46791e7616a7bd24284b3e24f551618705eb0a8a Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Fri, 9 Jan 2026 12:10:30 -0500 Subject: [PATCH 17/76] put all BWB code together --- aviary/utils/fortran_to_aviary.py | 126 +++++++++++++++--------------- 1 file changed, 65 insertions(+), 61 deletions(-) diff --git a/aviary/utils/fortran_to_aviary.py b/aviary/utils/fortran_to_aviary.py index 6c749fa22..1ce416f23 100644 --- a/aviary/utils/fortran_to_aviary.py +++ b/aviary/utils/fortran_to_aviary.py @@ -917,6 +917,11 @@ def update_flops_options(vehicle_data): 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) @@ -942,6 +947,66 @@ def update_flops_options(vehicle_data): 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: + # not sure why THRUST=70000,1,0,0,0,0, just grab the first entry + # does it apply to transporters? + thrust = input_values.get_val(Aircraft.Engine.SCALED_SLS_THRUST, 'lbf')[0] + input_values.set_val(Aircraft.Engine.SCALED_SLS_THRUST, [thrust], 'lbf') + + if not Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO in input_values: + if Aircraft.Wing.THICKNESS_TO_CHORD in input_values: + wing_tc = input_values.get_val(Aircraft.Wing.THICKNESS_TO_CHORD, 'unitless')[0] + input_values.set_val(Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO, [wing_tc], 'unitless') + + if not Aircraft.Fuel.WING_FUEL_FRACTION in input_values: + # Interpret value equivalently to FWMAX = wing_fuel_fraction * fuel_density * 2/3 + FWMAX = 23 # the default + if Aircraft.Fuel.DENSITY in input_values: + FULDEN = input_values.get_val(Aircraft.Fuel.DENSITY, 'lbm/ft**3')[0] + else: + FULDEN = 50.1194909 # lbm/ft**3 or 6.7 lbm/galUS + input_values.set_val(Aircraft.Fuel.DENSITY, [6.7], 'lbm/galUS') + input_values.set_val( + Aircraft.Fuel.WING_FUEL_FRACTION, [FWMAX / (FULDEN * (2 / 3))], 'unitless' + ) + + # For BWB, wing area is always computed + if Aircraft.Wing.AREA in input_values: + input_values.delete(Aircraft.Wing.AREA) + if Aircraft.Wing.ASPECT_RATIO in input_values: + input_values.delete(Aircraft.Wing.ASPECT_RATIO) + + if ( + Aircraft.Engine.SCALED_SLS_THRUST in input_values + and Aircraft.Engine.REFERENCE_SLS_THRUST in input_values + ): + ref_thrust = input_values.get_val(Aircraft.Engine.REFERENCE_SLS_THRUST, 'lbf')[0] + scaled_thrust = input_values.get_val(Aircraft.Engine.SCALED_SLS_THRUST, 'lbf')[0] + if scaled_thrust <= 0: + print( + 'Aircraft.Engine.REFERENCE_SLS_THRUST must be positive ' + f'but you have {scaled_thrust}' + ) + else: + engine_scale_factor = scaled_thrust / ref_thrust + input_values.set_val( + Aircraft.Engine.SCALE_FACTOR, [engine_scale_factor], 'unitless' + ) + if Aircraft.CrewPayload.Design.NUM_BUSINESS_CLASS in input_values: num_business_class = input_values.get_val( Aircraft.CrewPayload.Design.NUM_BUSINESS_CLASS, 'unitless' @@ -996,31 +1061,6 @@ def update_flops_options(vehicle_data): Aircraft.CrewPayload.BAGGAGE_MASS_PER_PASSENGER, [baggage_per_pax], 'lbm' ) - if design_type[0] == 0: - 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: - if ( - Aircraft.Fuselage.LENGTH in input_values - and Aircraft.BWB.PASSENGER_LEADING_EDGE_SWEEP in input_values - ): - input_values.set_val(Aircraft.Fuselage.SIMPLE_LAYOUT, [True], 'unitless') - else: - input_values.set_val(Aircraft.Fuselage.SIMPLE_LAYOUT, [False], 'unitless') - - if Aircraft.Engine.SCALED_SLS_THRUST in input_values: - # not sure why THRUST=70000,1,0,0,0,0, just grab the first entry - # does it apply to transporters? - thrust = input_values.get_val(Aircraft.Engine.SCALED_SLS_THRUST, 'lbf')[0] - input_values.set_val(Aircraft.Engine.SCALED_SLS_THRUST, [thrust], 'lbf') - - if not Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO in input_values: - if Aircraft.Wing.THICKNESS_TO_CHORD in input_values: - wing_tc = input_values.get_val(Aircraft.Wing.THICKNESS_TO_CHORD, 'unitless')[0] - input_values.set_val(Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO, [wing_tc], 'unitless') - if ( not Aircraft.HorizontalTail.THICKNESS_TO_CHORD in input_values or input_values.get_val(Aircraft.HorizontalTail.THICKNESS_TO_CHORD, 'unitless')[0] == 0 @@ -1036,42 +1076,6 @@ def update_flops_options(vehicle_data): 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 design_type[0] == 3: - if not Aircraft.Fuel.WING_FUEL_FRACTION in input_values: - # Interpret value equivalently to FWMAX = wing_fuel_fraction * fuel_density * 2/3 - FWMAX = 23 # the default - if Aircraft.Fuel.DENSITY in input_values: - FULDEN = input_values.get_val(Aircraft.Fuel.DENSITY, 'lbm/ft**3')[0] - else: - FULDEN = 50.1194909 # lbm/ft**3 or 6.7 lbm/galUS - input_values.set_val(Aircraft.Fuel.DENSITY, [6.7], 'lbm/galUS') - input_values.set_val( - Aircraft.Fuel.WING_FUEL_FRACTION, [FWMAX / (FULDEN * (2 / 3))], 'unitless' - ) - - # For BWB, wing area is always computed - if Aircraft.Wing.AREA in input_values: - input_values.delete(Aircraft.Wing.AREA) - if Aircraft.Wing.ASPECT_RATIO in input_values: - input_values.delete(Aircraft.Wing.ASPECT_RATIO) - - if ( - Aircraft.Engine.SCALED_SLS_THRUST in input_values - and Aircraft.Engine.REFERENCE_SLS_THRUST in input_values - ): - ref_thrust = input_values.get_val(Aircraft.Engine.REFERENCE_SLS_THRUST, 'lbf')[0] - scaled_thrust = input_values.get_val(Aircraft.Engine.SCALED_SLS_THRUST, 'lbf')[0] - if scaled_thrust <= 0: - print( - 'Aircraft.Engine.REFERENCE_SLS_THRUST must be positive ' - f'but you have {scaled_thrust}' - ) - else: - engine_scale_factor = scaled_thrust / ref_thrust - input_values.set_val( - Aircraft.Engine.SCALE_FACTOR, [engine_scale_factor], 'unitless' - ) - # These variables should be removed if they are zero. rem_list = [ (Aircraft.Fuselage.CABIN_AREA, 'ft**2'), From 8867db27e2d0db5edfd7b1d4f1efef4c9bb5ff39 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Thu, 22 Jan 2026 13:54:57 -0500 Subject: [PATCH 18/76] minor update to match with main --- .../subsystems/mass/flops_based/test/test_unusable_fuel.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) 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 0cadfa94b..449f44e62 100644 --- a/aviary/subsystems/mass/flops_based/test/test_unusable_fuel.py +++ b/aviary/subsystems/mass/flops_based/test/test_unusable_fuel.py @@ -163,11 +163,8 @@ class BWBTransportUnusableFuelMassTest(unittest.TestCase): def setUp(self): self.prob = om.Problem() - # @parameterized.expand(get_flops_case_names(only=bwb_cases), name_func=print_case) - def test_case( - self, - ): - case_name = 'BWBsimpleFLOPS' + @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( From 8c2572e97bb8bbfedfb66e688d40d20c2d7dd22e Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 28 Jan 2026 17:04:27 -0500 Subject: [PATCH 19/76] work in progress --- aviary/utils/fortran_to_aviary.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/aviary/utils/fortran_to_aviary.py b/aviary/utils/fortran_to_aviary.py index 1ce416f23..2c90284ad 100644 --- a/aviary/utils/fortran_to_aviary.py +++ b/aviary/utils/fortran_to_aviary.py @@ -904,7 +904,10 @@ def update_flops_options(vehicle_data): if input_values.get_val(Aircraft.Fuel.WING_FUEL_CAPACITY, 'lbm')[0] < 50: # Interpret value equivalently to FWMAX = wing_fuel_fraction * fuel_density * 2/3 FWMAX = input_values.get_val(Aircraft.Fuel.WING_FUEL_CAPACITY, 'lbm')[0] - FULDEN = input_values.get_val(Aircraft.Fuel.DENSITY, 'lbm/ft**3')[0] + if Aircraft.Fuel.DENSITY in input_values: + FULDEN = input_values.get_val(Aircraft.Fuel.DENSITY, 'lbm/ft**3')[0] + else: + FULDEN = 50.12 # 50.12 lbm/ft**3 = 6.7 lbm/galUS input_values.set_val( Aircraft.Fuel.WING_FUEL_FRACTION, [FWMAX / (FULDEN * (2 / 3))], 'unitless' ) From 4d83c89f5319fedca6ea86e3e5052e9be3126585 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 2 Feb 2026 12:52:14 -0500 Subject: [PATCH 20/76] work in progress: updating based on Chris' comments --- aviary/utils/fortran_to_aviary.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/aviary/utils/fortran_to_aviary.py b/aviary/utils/fortran_to_aviary.py index 2c90284ad..bc4575350 100644 --- a/aviary/utils/fortran_to_aviary.py +++ b/aviary/utils/fortran_to_aviary.py @@ -946,7 +946,7 @@ def update_flops_options(vehicle_data): 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: - # If detail wing is not provided, initialize it to [0, 0.5, 1] + # 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]) @@ -1009,6 +1009,10 @@ def update_flops_options(vehicle_data): input_values.set_val( Aircraft.Engine.SCALE_FACTOR, [engine_scale_factor], 'unitless' ) + else: + raise RuntimeError( + f'Currently, Aircraft.Design.TYPE must be either 0 or 3 not {design_type[0]}.' + ) if Aircraft.CrewPayload.Design.NUM_BUSINESS_CLASS in input_values: num_business_class = input_values.get_val( @@ -1107,7 +1111,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 -- Is this comment still true? try: ref_thrust = input_values.get_val(Aircraft.Engine.REFERENCE_SLS_THRUST, 'lbf')[0] ref_thrust = float(ref_thrust) From ea7cea50d605a578fee6de80e211f5e520ebc745 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 2 Feb 2026 13:38:53 -0500 Subject: [PATCH 21/76] add a comment that remove_preprocessed_options is not used --- aviary/utils/preprocessors.py | 1 + 1 file changed, 1 insertion(+) diff --git a/aviary/utils/preprocessors.py b/aviary/utils/preprocessors.py index 26c4b3693..700d0d7aa 100644 --- a/aviary/utils/preprocessors.py +++ b/aviary/utils/preprocessors.py @@ -50,6 +50,7 @@ def preprocess_options(aviary_options: AviaryValues, meta_data=_MetaData, verbos 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. From bdd8b0c6441fb737682ef10bff6ca1f06dc414d5 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 2 Feb 2026 17:19:50 -0500 Subject: [PATCH 22/76] move Aircraft.Engine.NUM_ENGINES from fortran_to_aviary.py to preprocessors.py --- aviary/utils/fortran_to_aviary.py | 23 ++++++--------- aviary/utils/preprocessors.py | 47 +++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 14 deletions(-) diff --git a/aviary/utils/fortran_to_aviary.py b/aviary/utils/fortran_to_aviary.py index bc4575350..5b2e27dcc 100644 --- a/aviary/utils/fortran_to_aviary.py +++ b/aviary/utils/fortran_to_aviary.py @@ -917,6 +917,15 @@ def update_flops_options(vehicle_data): if Aircraft.Wing.INPUT_STATION_DIST in input_values: input_values.set_val(Aircraft.Wing.DETAILED_WING, [True]) + if not Mission.Landing.LIFT_COEFFICIENT_MAX in input_values: + unused_values = vehicle_data['unused_values'] + try: + CLAPP = unused_values.get_item('TOLIN.CLAPP')[0][0] + CLLDM = 1.69 * CLAPP + except: + CLLDM = 3.0 + input_values.set_val(Mission.Landing.LIFT_COEFFICIENT_MAX, [CLLDM]) + design_type, design_units = input_values.get_item(Aircraft.Design.TYPE) if design_type[0] == 0: input_values.set_val(Aircraft.Design.TYPE, ['transport'], design_units) @@ -1042,20 +1051,6 @@ def update_flops_options(vehicle_data): num_galley_crew = int(num_passengers / 250) + 1 input_values.set_val(Aircraft.CrewPayload.NUM_GALLEY_CREW, [num_galley_crew]) - if not Aircraft.Engine.NUM_ENGINES in input_values: - if Aircraft.Engine.NUM_FUSELAGE_ENGINES in input_values: - num_fuselage_engines = input_values.get_val( - Aircraft.Engine.NUM_FUSELAGE_ENGINES, 'unitless' - )[0] - else: - num_fuselage_engines = 0 - if Aircraft.Engine.NUM_WING_ENGINES in input_values: - num_wing_engines = input_values.get_val(Aircraft.Engine.NUM_WING_ENGINES, 'unitless')[0] - else: - num_wing_engines = 0 - num_engines = num_fuselage_engines + num_wing_engines - input_values.set_val(Aircraft.Engine.NUM_ENGINES, [num_engines]) - if not Aircraft.CrewPayload.BAGGAGE_MASS_PER_PASSENGER in input_values: if Mission.Design.RANGE in input_values: design_range = input_values.get_val(Mission.Design.RANGE, 'nmi')[0] diff --git a/aviary/utils/preprocessors.py b/aviary/utils/preprocessors.py index 700d0d7aa..44dfb4e3f 100644 --- a/aviary/utils/preprocessors.py +++ b/aviary/utils/preprocessors.py @@ -45,6 +45,7 @@ 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) @@ -531,6 +532,52 @@ 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' + ) + 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') + else: + num_wing_engines = [0] + tot_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 num_engines == tot_engines: + pass + else: + raise UserWarning( + 'Your total number of engines is not the same as ' + 'the sum of wing engines and fuselage engines.' + ) + else: + num_engines = tot_engines + aviary_options.set_val(Aircraft.Engine.NUM_ENGINES, num_engines) + + return aviary_options + + def preprocess_propulsion( aviary_options: AviaryValues, engine_models: list = None, From d2bad18842ed7efaea8e41d991611df8fe94c1c8 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 2 Feb 2026 19:09:25 -0500 Subject: [PATCH 23/76] remove aircraft:engine:num_engines becuase it will be handled in preprocess --- aviary/utils/test/data/converter_test_N3CC_FLOPS.csv | 1 - 1 file changed, 1 deletion(-) diff --git a/aviary/utils/test/data/converter_test_N3CC_FLOPS.csv b/aviary/utils/test/data/converter_test_N3CC_FLOPS.csv index 80b537dc3..3d6b93ba8 100644 --- a/aviary/utils/test/data/converter_test_N3CC_FLOPS.csv +++ b/aviary/utils/test/data/converter_test_N3CC_FLOPS.csv @@ -43,7 +43,6 @@ 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.15,unitless -aircraft:engine:num_engines,2,unitless aircraft:engine:num_fuselage_engines,0,unitless aircraft:engine:num_wing_engines,2,unitless aircraft:engine:reference_mass,6293.8,lbm From a23b7da99b676668cc668e22636c3d14f3f416f7 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 2 Feb 2026 19:24:30 -0500 Subject: [PATCH 24/76] minor update --- aviary/utils/preprocessors.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/aviary/utils/preprocessors.py b/aviary/utils/preprocessors.py index 44dfb4e3f..24dc1bc92 100644 --- a/aviary/utils/preprocessors.py +++ b/aviary/utils/preprocessors.py @@ -552,19 +552,19 @@ def preprocess_Engines(aviary_options: AviaryValues, verbosity=None): if Aircraft.Engine.NUM_FUSELAGE_ENGINES in aviary_options: num_fuselage_engines = aviary_options.get_val( Aircraft.Engine.NUM_FUSELAGE_ENGINES, 'unitless' - ) + )[0] else: - num_fuselage_engines = [0] + 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') + num_wing_engines = aviary_options.get_val(Aircraft.Engine.NUM_WING_ENGINES, 'unitless')[0] else: - num_wing_engines = [0] - tot_engines = num_fuselage_engines + num_wing_engines + 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 num_engines == tot_engines: + num_engines = aviary_options.get_val(Aircraft.Engine.NUM_ENGINES)[0] + if num_engines == sum_engines: pass else: raise UserWarning( @@ -572,8 +572,8 @@ def preprocess_Engines(aviary_options: AviaryValues, verbosity=None): 'the sum of wing engines and fuselage engines.' ) else: - num_engines = tot_engines - aviary_options.set_val(Aircraft.Engine.NUM_ENGINES, num_engines) + num_engines = sum_engines + aviary_options.set_val(Aircraft.Engine.NUM_ENGINES, [num_engines]) return aviary_options From a726132ea5c3fe387daf8f865ab736277a548f4d Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 2 Feb 2026 20:48:14 -0500 Subject: [PATCH 25/76] deal with int in preprocess_Engines --- aviary/utils/preprocessors.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/aviary/utils/preprocessors.py b/aviary/utils/preprocessors.py index 24dc1bc92..d7ab4e4a6 100644 --- a/aviary/utils/preprocessors.py +++ b/aviary/utils/preprocessors.py @@ -552,21 +552,31 @@ def preprocess_Engines(aviary_options: AviaryValues, verbosity=None): if Aircraft.Engine.NUM_FUSELAGE_ENGINES in aviary_options: num_fuselage_engines = aviary_options.get_val( Aircraft.Engine.NUM_FUSELAGE_ENGINES, 'unitless' - )[0] + ) + if isinstance(num_fuselage_engines, np.ndarray): + 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')[0] + num_wing_engines = aviary_options.get_val(Aircraft.Engine.NUM_WING_ENGINES, 'unitless') + if isinstance(num_wing_engines, np.ndarray): + 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)[0] - if num_engines == sum_engines: - pass + num_engines = aviary_options.get_val(Aircraft.Engine.NUM_ENGINES) + if isinstance(num_engines, np.ndarray): + num_engines = num_engines[0] else: + num_engines = int(num_engines) + if num_engines != sum_engines: raise UserWarning( 'Your total number of engines is not the same as ' 'the sum of wing engines and fuselage engines.' From ffe4e503db278dd8f706123a982cba515e0c9164 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 3 Feb 2026 00:38:19 -0500 Subject: [PATCH 26/76] preprocess_Engines() does not work. comment it out --- aviary/utils/preprocessors.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aviary/utils/preprocessors.py b/aviary/utils/preprocessors.py index d7ab4e4a6..29ab27427 100644 --- a/aviary/utils/preprocessors.py +++ b/aviary/utils/preprocessors.py @@ -45,7 +45,7 @@ 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) + # preprocess_Engines(aviary_options, verbosity) if engine_models is not None: preprocess_propulsion(aviary_options, engine_models, meta_data, verbosity) From ac219d5123605228e5a0f8607b2a9e2bcb08c2cd Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 3 Feb 2026 11:21:19 -0500 Subject: [PATCH 27/76] changed a comment --- aviary/utils/fortran_to_aviary.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/aviary/utils/fortran_to_aviary.py b/aviary/utils/fortran_to_aviary.py index 5b2e27dcc..26d8f2c82 100644 --- a/aviary/utils/fortran_to_aviary.py +++ b/aviary/utils/fortran_to_aviary.py @@ -974,8 +974,7 @@ def update_flops_options(vehicle_data): input_values.set_val(Aircraft.Fuselage.SIMPLE_LAYOUT, [False], 'unitless') if Aircraft.Engine.SCALED_SLS_THRUST in input_values: - # not sure why THRUST=70000,1,0,0,0,0, just grab the first entry - # does it apply to transporters? + # 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') From 64596f847008e35a2e9dc9721ea1ae28fd54035a Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 3 Feb 2026 21:20:49 -0500 Subject: [PATCH 28/76] testing --- aviary/utils/preprocessors.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aviary/utils/preprocessors.py b/aviary/utils/preprocessors.py index 29ab27427..d7ab4e4a6 100644 --- a/aviary/utils/preprocessors.py +++ b/aviary/utils/preprocessors.py @@ -45,7 +45,7 @@ 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) + preprocess_Engines(aviary_options, verbosity) if engine_models is not None: preprocess_propulsion(aviary_options, engine_models, meta_data, verbosity) From 7fc0a9fe24d98acef06f0e631b52573b881d3a4a Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 3 Feb 2026 21:52:19 -0500 Subject: [PATCH 29/76] roll back testing --- aviary/utils/preprocessors.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aviary/utils/preprocessors.py b/aviary/utils/preprocessors.py index d7ab4e4a6..29ab27427 100644 --- a/aviary/utils/preprocessors.py +++ b/aviary/utils/preprocessors.py @@ -45,7 +45,7 @@ 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) + # preprocess_Engines(aviary_options, verbosity) if engine_models is not None: preprocess_propulsion(aviary_options, engine_models, meta_data, verbosity) From 5da579c8637555ff7d98a6beeb504ce15d0f6c82 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 3 Feb 2026 23:29:57 -0500 Subject: [PATCH 30/76] still testing: change 'raise UserWarning' to print --- aviary/utils/preprocessors.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aviary/utils/preprocessors.py b/aviary/utils/preprocessors.py index 29ab27427..b7db845e5 100644 --- a/aviary/utils/preprocessors.py +++ b/aviary/utils/preprocessors.py @@ -45,7 +45,7 @@ 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) + preprocess_Engines(aviary_options, verbosity) if engine_models is not None: preprocess_propulsion(aviary_options, engine_models, meta_data, verbosity) @@ -577,7 +577,7 @@ def preprocess_Engines(aviary_options: AviaryValues, verbosity=None): else: num_engines = int(num_engines) if num_engines != sum_engines: - raise UserWarning( + print( 'Your total number of engines is not the same as ' 'the sum of wing engines and fuselage engines.' ) From 1f753851ef68df1758ce4affd54ed1fbc3f1a7a5 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 4 Feb 2026 00:07:50 -0500 Subject: [PATCH 31/76] still testing --- aviary/utils/preprocessors.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/aviary/utils/preprocessors.py b/aviary/utils/preprocessors.py index b7db845e5..f92a6bf91 100644 --- a/aviary/utils/preprocessors.py +++ b/aviary/utils/preprocessors.py @@ -553,7 +553,7 @@ def preprocess_Engines(aviary_options: AviaryValues, verbosity=None): num_fuselage_engines = aviary_options.get_val( Aircraft.Engine.NUM_FUSELAGE_ENGINES, 'unitless' ) - if isinstance(num_fuselage_engines, np.ndarray): + 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) @@ -562,7 +562,7 @@ def preprocess_Engines(aviary_options: AviaryValues, verbosity=None): 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): + 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) @@ -572,7 +572,7 @@ def preprocess_Engines(aviary_options: AviaryValues, verbosity=None): if Aircraft.Engine.NUM_ENGINES in aviary_options: num_engines = aviary_options.get_val(Aircraft.Engine.NUM_ENGINES) - if isinstance(num_engines, np.ndarray): + if isinstance(num_engines, np.ndarray) or isinstance(num_engines, list): num_engines = num_engines[0] else: num_engines = int(num_engines) From 511cc461186f38ead165f37c71aad38e8639c069 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Thu, 5 Feb 2026 12:15:46 -0500 Subject: [PATCH 32/76] add verbosity check --- aviary/utils/preprocessors.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/aviary/utils/preprocessors.py b/aviary/utils/preprocessors.py index f92a6bf91..95025918f 100644 --- a/aviary/utils/preprocessors.py +++ b/aviary/utils/preprocessors.py @@ -577,10 +577,11 @@ def preprocess_Engines(aviary_options: AviaryValues, verbosity=None): else: num_engines = int(num_engines) if num_engines != sum_engines: - print( - 'Your total number of engines is not the same as ' - 'the sum of wing engines and fuselage 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, [num_engines]) From 6b14d98664e653153e2253f47466ecd3c39ac4f3 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Thu, 5 Feb 2026 12:18:29 -0500 Subject: [PATCH 33/76] comment out 'aircraft:engine:num_engines,3,unitless' and 'inputs.set_val(Aircraft.Engine.NUM_ENGINES, np.array([3]))' for FLOPS based BWB models --- aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS.csv | 2 +- .../aircraft/blended_wing_body/bwb_detailed_FLOPS_data.py | 2 +- aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS.csv | 2 +- .../models/aircraft/blended_wing_body/bwb_simple_FLOPS_data.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) 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 7cdaf1b99..1ddafbf27 100644 --- a/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS.csv +++ b/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS.csv @@ -55,7 +55,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 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 f047f0a98..17665c590 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 @@ -154,7 +154,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 61c1dd62f..0a98469f0 100644 --- a/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS.csv +++ b/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS.csv @@ -55,7 +55,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 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 eee3f9cea..9c2d0c8dc 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 @@ -156,7 +156,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 From 43acd6c2174fd22cf38a1435a336192a0cff909f Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Thu, 5 Feb 2026 13:14:26 -0500 Subject: [PATCH 34/76] add 'aircraft:engine:num_engines,3,unitless' and 'inputs.set_val(Aircraft.Engine.NUM_ENGINES, np.array([3]))' for FLOPS based BWB models for now --- aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS.csv | 2 +- .../aircraft/blended_wing_body/bwb_detailed_FLOPS_data.py | 2 +- aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS.csv | 2 +- .../models/aircraft/blended_wing_body/bwb_simple_FLOPS_data.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) 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 b0fa68674..62289325a 100644 --- a/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS.csv +++ b/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS.csv @@ -57,7 +57,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 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 340e063cb..25c8589f9 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 @@ -158,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 b2b1d016a..cbc607618 100644 --- a/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS.csv +++ b/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS.csv @@ -57,7 +57,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 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 2a5f58097..d92f93eec 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 @@ -160,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 From 30b2f547b6974b5ec021f5ccf38a75e7119376ae Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Thu, 5 Feb 2026 14:27:34 -0500 Subject: [PATCH 35/76] work in progress: Do not set Aircraft.CrewPayload.Design.NUM_PASSENGERS. It will be moved to preprocess --- aviary/utils/fortran_to_aviary.py | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/aviary/utils/fortran_to_aviary.py b/aviary/utils/fortran_to_aviary.py index a1d1dcef3..0e333b1fb 100644 --- a/aviary/utils/fortran_to_aviary.py +++ b/aviary/utils/fortran_to_aviary.py @@ -1034,14 +1034,15 @@ def update_flops_options(vehicle_data): )[0] else: num_first_class = 0 - if Aircraft.CrewPayload.Design.NUM_TOURIST_CLASS in input_values: - num_tourist_class = input_values.get_val( - Aircraft.CrewPayload.Design.NUM_TOURIST_CLASS, 'unitless' + if Aircraft.CrewPayload.Design.NUM_ECONOMY_CLASS in input_values: + num_economy_class = input_values.get_val( + Aircraft.CrewPayload.Design.NUM_ECONOMY_CLASS, 'unitless' )[0] else: - num_tourist_class = 0 - num_passengers = num_business_class + num_first_class + num_tourist_class - input_values.set_val(Aircraft.CrewPayload.Design.NUM_PASSENGERS, [num_passengers]) + num_economy_class = 0 + num_passengers = num_business_class + num_first_class + num_economy_class + # TODO: will be moved to preprocess + # input_values.set_val(Aircraft.CrewPayload.Design.NUM_PASSENGERS, [num_passengers]) if not Aircraft.CrewPayload.NUM_GALLEY_CREW in input_values: if num_passengers < 151: From dfa036f3965533d9225b4ee0cdf53956cfa577c6 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Thu, 5 Feb 2026 15:47:43 -0500 Subject: [PATCH 36/76] changes based on Chris' comments --- .../blended_wing_body/bwb_detailed_FLOPS.csv | 2 ++ .../blended_wing_body/bwb_simple_FLOPS.csv | 7 ++++-- .../test/test_flops_based_premission.py | 6 +++++ aviary/utils/fortran_to_aviary.py | 22 ------------------- 4 files changed, 13 insertions(+), 24 deletions(-) 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 62289325a..d4d6b3a70 100644 --- a/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS.csv +++ b/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS.csv @@ -30,6 +30,8 @@ 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:crew_and_payload:num_galley_crew,2,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 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 cbc607618..2559ce8b8 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 @@ -30,7 +30,9 @@ 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: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 @@ -143,6 +145,7 @@ aircraft:wing:surface_control_mass_scaler,1.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_reference,0.11,unitless aircraft:wing:ultimate_load_factor,3.75,unitless aircraft:wing:var_sweep_mass_penalty,0.0,unitless aircraft:wing:wetted_area_scaler,1.0,unitless diff --git a/aviary/subsystems/test/test_flops_based_premission.py b/aviary/subsystems/test/test_flops_based_premission.py index 2ef158f33..451b2d693 100644 --- a/aviary/subsystems/test/test_flops_based_premission.py +++ b/aviary/subsystems/test/test_flops_based_premission.py @@ -1223,3 +1223,9 @@ def test_case_all_subsystems(self): if __name__ == '__main__': unittest.main() + import numpy as np + + np.seterr(divide='raise') + test = BWBPreMissionGroupCSVTest1() + test.setUp() + # test.test_case_geom_mass() diff --git a/aviary/utils/fortran_to_aviary.py b/aviary/utils/fortran_to_aviary.py index 0e333b1fb..22c5db307 100644 --- a/aviary/utils/fortran_to_aviary.py +++ b/aviary/utils/fortran_to_aviary.py @@ -1040,28 +1040,6 @@ def update_flops_options(vehicle_data): )[0] else: num_economy_class = 0 - num_passengers = num_business_class + num_first_class + num_economy_class - # TODO: will be moved to preprocess - # input_values.set_val(Aircraft.CrewPayload.Design.NUM_PASSENGERS, [num_passengers]) - - if not Aircraft.CrewPayload.NUM_GALLEY_CREW in input_values: - if num_passengers < 151: - num_galley_crew = 0 - else: - num_galley_crew = int(num_passengers / 250) + 1 - input_values.set_val(Aircraft.CrewPayload.NUM_GALLEY_CREW, [num_galley_crew]) - - if not Aircraft.CrewPayload.BAGGAGE_MASS_PER_PASSENGER in input_values: - if Mission.Design.RANGE in input_values: - design_range = input_values.get_val(Mission.Design.RANGE, 'nmi')[0] - baggage_per_pax = 35.0 - if design_range > 2900: - baggage_per_pax = 44.0 - elif design_range > 900: - baggage_per_pax = 40.0 - input_values.set_val( - Aircraft.CrewPayload.BAGGAGE_MASS_PER_PASSENGER, [baggage_per_pax], 'lbm' - ) if ( not Aircraft.HorizontalTail.THICKNESS_TO_CHORD in input_values From 7b6c16d36d9963a60a05e5c91d041a767f7f26e2 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Thu, 5 Feb 2026 16:21:24 -0500 Subject: [PATCH 37/76] minor update --- aviary/utils/fortran_to_aviary.py | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/aviary/utils/fortran_to_aviary.py b/aviary/utils/fortran_to_aviary.py index 22c5db307..307ec4554 100644 --- a/aviary/utils/fortran_to_aviary.py +++ b/aviary/utils/fortran_to_aviary.py @@ -1022,25 +1022,6 @@ def update_flops_options(vehicle_data): f'Currently, Aircraft.Design.TYPE must be either 0 or 3 not {design_type[0]}.' ) - if Aircraft.CrewPayload.Design.NUM_BUSINESS_CLASS in input_values: - num_business_class = input_values.get_val( - Aircraft.CrewPayload.Design.NUM_BUSINESS_CLASS, 'unitless' - )[0] - else: - num_business_class = 0 - if Aircraft.CrewPayload.Design.NUM_FIRST_CLASS in input_values: - num_first_class = input_values.get_val( - Aircraft.CrewPayload.Design.NUM_FIRST_CLASS, 'unitless' - )[0] - else: - num_first_class = 0 - if Aircraft.CrewPayload.Design.NUM_ECONOMY_CLASS in input_values: - num_economy_class = input_values.get_val( - Aircraft.CrewPayload.Design.NUM_ECONOMY_CLASS, 'unitless' - )[0] - else: - num_economy_class = 0 - if ( not Aircraft.HorizontalTail.THICKNESS_TO_CHORD in input_values or input_values.get_val(Aircraft.HorizontalTail.THICKNESS_TO_CHORD, 'unitless')[0] == 0 From acfcdde8a8268fd7da4ee5887a360f8d3ea5d51f Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Thu, 5 Feb 2026 18:52:17 -0500 Subject: [PATCH 38/76] removed num_engines from BWB data sets --- .../aircraft/blended_wing_body/bwb_detailed_FLOPS.csv | 6 +++--- .../aircraft/blended_wing_body/bwb_detailed_FLOPS_data.py | 6 +++--- .../models/aircraft/blended_wing_body/bwb_simple_FLOPS.csv | 2 +- .../aircraft/blended_wing_body/bwb_simple_FLOPS_data.py | 6 +++--- 4 files changed, 10 insertions(+), 10 deletions(-) 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 d4d6b3a70..cd8882bc3 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 @@ -32,7 +32,7 @@ aircraft:crew_and_payload:num_flight_crew,2,unitless aircraft:crew_and_payload:num_galley_crew,2,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_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 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 25c8589f9..cf2d45e65 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 @@ -49,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 @@ -158,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 2559ce8b8..4f91fbc50 100644 --- a/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS.csv +++ b/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS.csv @@ -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 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 d92f93eec..f4cea0919 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 @@ -49,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 @@ -160,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 From fa1a33abcc3fe104c6240410f867492c61632465 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Thu, 5 Feb 2026 18:53:26 -0500 Subject: [PATCH 39/76] set np.array, otherwise, it fails some unit tests. --- aviary/utils/preprocessors.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aviary/utils/preprocessors.py b/aviary/utils/preprocessors.py index caa6af385..cc0c6fd49 100644 --- a/aviary/utils/preprocessors.py +++ b/aviary/utils/preprocessors.py @@ -604,7 +604,7 @@ def preprocess_Engines(aviary_options: AviaryValues, verbosity=None): ) else: num_engines = sum_engines - aviary_options.set_val(Aircraft.Engine.NUM_ENGINES, [num_engines]) + aviary_options.set_val(Aircraft.Engine.NUM_ENGINES, np.array([num_engines])) return aviary_options From e5808659679b211edb8da0694a7e2d5997705647 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Thu, 5 Feb 2026 18:53:43 -0500 Subject: [PATCH 40/76] minor update --- aviary/subsystems/test/test_flops_based_premission.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/aviary/subsystems/test/test_flops_based_premission.py b/aviary/subsystems/test/test_flops_based_premission.py index 451b2d693..2ef158f33 100644 --- a/aviary/subsystems/test/test_flops_based_premission.py +++ b/aviary/subsystems/test/test_flops_based_premission.py @@ -1223,9 +1223,3 @@ def test_case_all_subsystems(self): if __name__ == '__main__': unittest.main() - import numpy as np - - np.seterr(divide='raise') - test = BWBPreMissionGroupCSVTest1() - test.setUp() - # test.test_case_geom_mass() From cbf9e4f70f6dd4f20cdffec61b5b200e317bc7cf Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Thu, 5 Feb 2026 19:24:37 -0500 Subject: [PATCH 41/76] add unit test data files for FLOPS based BWB model --- .../converter_test_BWB_detailed_FLOPS.csv | 160 ++++++++++++++++++ .../data/converter_test_BWB_simple_FLOPS.csv | 159 +++++++++++++++++ 2 files changed, 319 insertions(+) create mode 100644 aviary/utils/test/data/converter_test_BWB_detailed_FLOPS.csv create mode 100644 aviary/utils/test/data/converter_test_BWB_simple_FLOPS.csv 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 000000000..088447e70 --- /dev/null +++ b/aviary/utils/test/data/converter_test_BWB_detailed_FLOPS.csv @@ -0,0 +1,160 @@ +# FLOPS-derived aircraft input deck converted from bwb_detailed_FLOPS.in + +# Input Values +aircraft:avionics:mass_scaler,1,unitless +aircraft:blended_wing_body_design:detailed_wing_provided,True,unitless +aircraft:blended_wing_body_design:passenger_leading_edge_sweep,45.0,deg +aircraft:crew_and_payload:design:num_business_class,100,unitless +aircraft:crew_and_payload:design:num_economy_class,340,unitless +aircraft:crew_and_payload:design:num_first_class,28,unitless +aircraft:crew_and_payload:design:num_seats_abreast_business,4,unitless +aircraft:crew_and_payload:design:num_seats_abreast_economy,6,unitless +aircraft:crew_and_payload:design:num_seats_abreast_first,4,unitless +aircraft:crew_and_payload:design:seat_pitch_business,39,inch +aircraft:crew_and_payload:design:seat_pitch_economy,32,inch +aircraft:crew_and_payload:design:seat_pitch_first,61,inch +aircraft:crew_and_payload:mass_per_passenger,165.0,lbm +aircraft:crew_and_payload:num_flight_attendants,22,unitless +aircraft:crew_and_payload:num_flight_crew,2,unitless +aircraft:design:landing_to_takeoff_mass_ratio,0.8,unitless +aircraft:design:lift_dependent_drag_coeff_factor,1,unitless +aircraft:design:type,BWB,unitless +aircraft:design:use_alt_mass,False,unitless +aircraft:design:zero_lift_drag_coeff_factor,1,unitless +aircraft:engine:data_file,'ENGDEK',unitless +aircraft:engine:generate_flight_idle,True,unitless +aircraft:engine:geopotential_alt,False,unitless +aircraft:engine:ignore_negative_thrust,False,unitless +aircraft:engine:mass_scaler,1,unitless +aircraft:engine:num_fuselage_engines,3,unitless +aircraft:engine:num_wing_engines,0,unitless +aircraft:engine:reference_mass,22017,lbm +aircraft:engine:reference_sls_thrust,86459.2,lbf +aircraft:engine:scale_factor,0.8096304384033163,unitless +aircraft:engine:scaled_sls_thrust,70000,lbf +aircraft:fins:area,184.89,ft**2 +aircraft:fins:num_fins,2,unitless +aircraft:fins:taper_ratio,0.464,unitless +aircraft:fuel:density,6.7,lbm/galUS +aircraft:fuel:ignore_fuel_capacity_constraint,False,unitless +aircraft:fuel:wing_fuel_fraction,0.688354956933531,unitless +aircraft:furnishings:mass_scaler,1,unitless +aircraft:fuselage:height_to_width_ratio,0.11,unitless +aircraft:fuselage:mass_scaler,1,unitless +aircraft:fuselage:military_cargo_floor,False,unitless +aircraft:fuselage:num_fuselages,1,unitless +aircraft:fuselage:simple_layout,False,unitless +aircraft:fuselage:wetted_area_scaler,1,unitless +aircraft:horizontal_tail:area,0,ft**2 +aircraft:horizontal_tail:aspect_ratio,0,unitless +aircraft:horizontal_tail:mass_scaler,1,unitless +aircraft:horizontal_tail:taper_ratio,0,unitless +aircraft:horizontal_tail:thickness_to_chord,0.11,unitless +aircraft:hydraulics:mass_scaler,1,unitless +aircraft:hydraulics:system_pressure,3000.0,psi +aircraft:landing_gear:main_gear_oleo_length,85,inch +aircraft:landing_gear:nose_gear_oleo_length,87,inch +aircraft:nacelle:avg_diameter,12.608,ft +aircraft:nacelle:avg_length,17.433,ft +aircraft:propulsion:misc_mass_scaler,0,unitless +aircraft:vertical_tail:mass_scaler,1,unitless +aircraft:vertical_tail:num_tails,0,unitless +aircraft:vertical_tail:thickness_to_chord,0.11,unitless +aircraft:vertical_tail:wetted_area_scaler,1,unitless +aircraft:wing:aeroelastic_tailoring_factor,0,unitless +aircraft:wing:airfoil_technology,2,unitless +aircraft:wing:chord_per_semispan_dist,-1.0,58.03,0.4491,0.3884,0.3317,0.2886,0.2537,0.2269,0.2121,0.1983,0.1843,0.1704,0.1565,0.1426,0.1287,unitless +aircraft:wing:composite_fraction,1,unitless +aircraft:wing:control_surface_area_ratio,0.333,unitless +aircraft:wing:detailed_wing,True,unitless +aircraft:wing:dihedral,3,deg +aircraft:wing:glove_and_bat,121.05,ft**2 +aircraft:wing:input_station_dist,0.0,0.35,0.4,0.45,0.5,0.55,0.6,0.6499,0.7,0.75,0.8,0.85,0.8999,0.95,1,unitless +aircraft:wing:load_path_sweep_dist,0.0,0,0,0,0,0,0,0,42.9,42.9,42.9,42.9,42.9,42.9,deg +aircraft:wing:mass_scaler,1,unitless +aircraft:wing:max_camber_at_70_semispan,2,unitless +aircraft:wing:outboard_semispan,86.75,ft +aircraft:wing:span_efficiency_factor,0,unitless +aircraft:wing:span_efficiency_reduction,False,unitless +aircraft:wing:strut_bracing_factor,0,unitless +aircraft:wing:sweep,35.7,deg +aircraft:wing:taper_ratio,0.311,unitless +aircraft:wing:thickness_to_chord,0.11,unitless +aircraft:wing:thickness_to_chord_dist,-1.0,0.15,0.1132,0.0928,0.0822,0.0764,0.0742,0.0746,0.0758,0.0758,0.0756,0.0756,0.0758,0.076,0.076,unitless +aircraft:wing:ultimate_load_factor,3.75,unitless +aircraft:wing:var_sweep_mass_penalty,0,unitless +mission:constraints:max_mach,0.85,unitless +mission:design:gross_mass,874099,lbm +mission:design:range,7750,NM +mission:design:thrust_takeoff_per_eng,0.25,lbf +mission:landing:initial_velocity,140,ft/s +mission:landing:lift_coefficient_max,3.0,unitless +mission:summary:cruise_mach,0.85,unitless +settings:aerodynamics_method,FLOPS,unitless +settings:equations_of_motion,height_energy,unitless +settings:mass_method,FLOPS,unitless + +# Unconverted Values +AERIN.FLLDG,11000 +AERIN.FLTO,11000 +AERIN.ITPAER,2 +AERIN.MYAERO,0 +AERIN.XLLAM,0 +CONFIN.CH,39000 +CONFIN.GW,874099 +CONFIN.OFF,0 +CONFIN.OFG,1 +ENGDIN.MAXCR,1 +MISSIN.ALTRAN,200 +MISSIN.APPRTM,4 +MISSIN.CLAMIN,0 +MISSIN.CRALT,45000,25000,1500 +MISSIN.CRMACH,0.85,0.6,0 +MISSIN.DEAMIN,0 +MISSIN.FWF,-0.001 +MISSIN.HOLDTM,30 +MISSIN.IATA,0 +MISSIN.IFLAG,2 +MISSIN.IHOPOS,1 +MISSIN.IOC,1,4,4 +MISSIN.IRS,1 +MISSIN.IRW,1 +MISSIN.ISKAL,1 +MISSIN.ITTFF,1 +MISSIN.IVS,1 +MISSIN.MSUMPT,1 +MISSIN.NCLIMB,1 +MISSIN.NCLRES,1 +MISSIN.NCRHOL,3 +MISSIN.NCRRES,2 +MISSIN.NCRTH,1 +MISSIN.NCRUSE,3 +MISSIN.NPCON,0 +MISSIN.RCIN,300 +MISSIN.RESTRP,0.05 +MISSIN.TAKOTM,2 +MISSIN.TAXITM,5 +MISSIN.TAXOTM,9 +MISSIN.THOLD,0.1 +MISSIN.TIMMAP,2 +OPTION.IANAL,3 +OPTION.ICOST,0 +OPTION.ILAND,0 +OPTION.INENG,1 +OPTION.IPLTTH,0 +OPTION.ITAKOF,0 +OPTION.IXFL,1 +OPTION.MPRINT,1 +OPTION.NOPRO,0 +PCONIN.CONALT,35000 +PCONIN.CONLIM,300 +PCONIN.CONMCH,0.85 +PCONIN.CONPC,1 +PCONIN.ICONSG,2 +PCONIN.ICONTP,5 +WTIN.ARFIN,1.952 +WTIN.ISPOWE,0 +WTIN.NETAW,14 +WTIN.SWPFIN,39.42 +WTIN.TCFIN,0.08 +WTIN.WINL,0 diff --git a/aviary/utils/test/data/converter_test_BWB_simple_FLOPS.csv b/aviary/utils/test/data/converter_test_BWB_simple_FLOPS.csv new file mode 100644 index 000000000..58d33a586 --- /dev/null +++ b/aviary/utils/test/data/converter_test_BWB_simple_FLOPS.csv @@ -0,0 +1,159 @@ +# FLOPS-derived aircraft input deck converted from bwb_simple_FLOPS.in + +# Input Values +aircraft:avionics:mass_scaler,1,unitless +aircraft:blended_wing_body_design:detailed_wing_provided,False,unitless +aircraft:blended_wing_body_design:passenger_leading_edge_sweep,45.0,deg +aircraft:crew_and_payload:design:num_business_class,100,unitless +aircraft:crew_and_payload:design:num_economy_class,340,unitless +aircraft:crew_and_payload:design:num_first_class,28,unitless +aircraft:crew_and_payload:design:num_seats_abreast_business,4,unitless +aircraft:crew_and_payload:design:num_seats_abreast_economy,6,unitless +aircraft:crew_and_payload:design:num_seats_abreast_first,4,unitless +aircraft:crew_and_payload:design:seat_pitch_business,39,inch +aircraft:crew_and_payload:design:seat_pitch_economy,32,inch +aircraft:crew_and_payload:design:seat_pitch_first,61,inch +aircraft:crew_and_payload:mass_per_passenger,165.0,lbm +aircraft:crew_and_payload:num_flight_attendants,22,unitless +aircraft:crew_and_payload:num_flight_crew,2,unitless +aircraft:design:landing_to_takeoff_mass_ratio,0.8,unitless +aircraft:design:lift_dependent_drag_coeff_factor,1,unitless +aircraft:design:type,BWB,unitless +aircraft:design:use_alt_mass,False,unitless +aircraft:design:zero_lift_drag_coeff_factor,1,unitless +aircraft:engine:data_file,'ENGDEK',unitless +aircraft:engine:generate_flight_idle,True,unitless +aircraft:engine:geopotential_alt,False,unitless +aircraft:engine:ignore_negative_thrust,False,unitless +aircraft:engine:mass_scaler,1,unitless +aircraft:engine:num_fuselage_engines,3,unitless +aircraft:engine:num_wing_engines,0,unitless +aircraft:engine:reference_mass,22017,lbm +aircraft:engine:reference_sls_thrust,86459.2,lbf +aircraft:engine:scale_factor,0.8096304384033163,unitless +aircraft:engine:scaled_sls_thrust,70000,lbf +aircraft:fins:area,184.89,ft**2 +aircraft:fins:num_fins,2,unitless +aircraft:fins:taper_ratio,0.464,unitless +aircraft:fuel:density,6.7,lbm/galUS +aircraft:fuel:ignore_fuel_capacity_constraint,False,unitless +aircraft:fuel:wing_fuel_fraction,0.688354956933531,unitless +aircraft:furnishings:mass_scaler,1,unitless +aircraft:fuselage:height_to_width_ratio,0.11,unitless +aircraft:fuselage:length,137.5,ft +aircraft:fuselage:mass_scaler,1,unitless +aircraft:fuselage:max_width,64.58,ft +aircraft:fuselage:military_cargo_floor,False,unitless +aircraft:fuselage:num_fuselages,1,unitless +aircraft:fuselage:simple_layout,True,unitless +aircraft:fuselage:wetted_area_scaler,1,unitless +aircraft:horizontal_tail:area,0,ft**2 +aircraft:horizontal_tail:aspect_ratio,0,unitless +aircraft:horizontal_tail:mass_scaler,1,unitless +aircraft:horizontal_tail:taper_ratio,0,unitless +aircraft:horizontal_tail:thickness_to_chord,0.11,unitless +aircraft:hydraulics:mass_scaler,1,unitless +aircraft:hydraulics:system_pressure,3000.0,psi +aircraft:landing_gear:main_gear_oleo_length,85,inch +aircraft:landing_gear:nose_gear_oleo_length,87,inch +aircraft:nacelle:avg_diameter,12.608,ft +aircraft:nacelle:avg_length,17.433,ft +aircraft:propulsion:misc_mass_scaler,0,unitless +aircraft:vertical_tail:mass_scaler,1,unitless +aircraft:vertical_tail:num_tails,0,unitless +aircraft:vertical_tail:thickness_to_chord,0.11,unitless +aircraft:vertical_tail:wetted_area_scaler,1,unitless +aircraft:wing:aeroelastic_tailoring_factor,0,unitless +aircraft:wing:airfoil_technology,2,unitless +aircraft:wing:composite_fraction,1,unitless +aircraft:wing:control_surface_area_ratio,0.333,unitless +aircraft:wing:detailed_wing,True,unitless +aircraft:wing:dihedral,3,deg +aircraft:wing:glove_and_bat,121.05,ft**2 +aircraft:wing:input_station_dist,0.0,0.5,1.0,unitless +aircraft:wing:mass_scaler,1,unitless +aircraft:wing:max_camber_at_70_semispan,2,unitless +aircraft:wing:outboard_semispan,86.75,ft +aircraft:wing:span_efficiency_factor,0,unitless +aircraft:wing:span_efficiency_reduction,False,unitless +aircraft:wing:strut_bracing_factor,0,unitless +aircraft:wing:sweep,35.7,deg +aircraft:wing:taper_ratio,0.311,unitless +aircraft:wing:thickness_to_chord,0.11,unitless +aircraft:wing:ultimate_load_factor,3.75,unitless +aircraft:wing:var_sweep_mass_penalty,0,unitless +mission:constraints:max_mach,0.85,unitless +mission:design:gross_mass,874099,lbm +mission:design:range,7750,NM +mission:design:thrust_takeoff_per_eng,0.25,lbf +mission:landing:initial_velocity,140,ft/s +mission:landing:lift_coefficient_max,3.0,unitless +mission:summary:cruise_mach,0.85,unitless +settings:aerodynamics_method,FLOPS,unitless +settings:equations_of_motion,height_energy,unitless +settings:mass_method,FLOPS,unitless + +# Unconverted Values +AERIN.FLLDG,11000 +AERIN.FLTO,11000 +AERIN.ITPAER,2 +AERIN.MYAERO,0 +AERIN.XLLAM,0 +CONFIN.CH,39000 +CONFIN.GW,874099 +CONFIN.OFF,0 +CONFIN.OFG,1 +ENGDIN.MAXCR,1 +MISSIN.ALTRAN,200 +MISSIN.APPRTM,4 +MISSIN.CLAMIN,0 +MISSIN.CRALT,45000,25000,1500 +MISSIN.CRMACH,0.85,0.6,0 +MISSIN.DEAMIN,0 +MISSIN.FWF,-0.001 +MISSIN.HOLDTM,30 +MISSIN.IATA,0 +MISSIN.IFLAG,2 +MISSIN.IHOPOS,1 +MISSIN.IOC,1,4,4 +MISSIN.IRS,1 +MISSIN.IRW,1 +MISSIN.ISKAL,1 +MISSIN.ITTFF,1 +MISSIN.IVS,1 +MISSIN.MSUMPT,1 +MISSIN.NCLIMB,1 +MISSIN.NCLRES,1 +MISSIN.NCRHOL,3 +MISSIN.NCRRES,2 +MISSIN.NCRTH,1 +MISSIN.NCRUSE,3 +MISSIN.NPCON,0 +MISSIN.RCIN,300 +MISSIN.RESTRP,0.05 +MISSIN.TAKOTM,2 +MISSIN.TAXITM,5 +MISSIN.TAXOTM,9 +MISSIN.THOLD,0.1 +MISSIN.TIMMAP,2 +OPTION.IANAL,3 +OPTION.ICOST,0 +OPTION.ILAND,0 +OPTION.INENG,1 +OPTION.IPLTTH,0 +OPTION.ITAKOF,0 +OPTION.IXFL,1 +OPTION.MPRINT,1 +OPTION.NOPRO,0 +PCONIN.CONALT,35000 +PCONIN.CONLIM,300 +PCONIN.CONMCH,0.85 +PCONIN.CONPC,1 +PCONIN.ICONSG,2 +PCONIN.ICONTP,5 +WTIN.ARFIN,1.952 +WTIN.ISPOWE,0 +WTIN.NETAW,0 +WTIN.SWPFIN,39.42 +WTIN.TCFIN,0.08 +WTIN.WINL,0 From 220a4be2a33d1022c40e3381409eb2129aa0c610 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Thu, 5 Feb 2026 19:25:26 -0500 Subject: [PATCH 42/76] add two unit tests for FLOPS based BWB datasets --- aviary/utils/test/test_fortran_to_aviary.py | 22 +++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/aviary/utils/test/test_fortran_to_aviary.py b/aviary/utils/test/test_fortran_to_aviary.py index e312b4154..f5bf0d002 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. From d432a883272e5ac6743a3975aa402b79c500253d Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Thu, 5 Feb 2026 19:45:52 -0500 Subject: [PATCH 43/76] add preprocess --- .../geometry/flops_based/test/test_nacelle.py | 6 +++--- .../flops_based/test/test_air_conditioning.py | 2 +- .../subsystems/mass/flops_based/test/test_apu.py | 15 +++++++++++---- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/aviary/subsystems/geometry/flops_based/test/test_nacelle.py b/aviary/subsystems/geometry/flops_based/test/test_nacelle.py index 9f408ba40..0c1468e50 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/test/test_air_conditioning.py b/aviary/subsystems/mass/flops_based/test/test_air_conditioning.py index 7200c7641..39d9f73c3 100644 --- a/aviary/subsystems/mass/flops_based/test/test_air_conditioning.py +++ b/aviary/subsystems/mass/flops_based/test/test_air_conditioning.py @@ -185,7 +185,7 @@ def test_case(self, case_name): promotes_outputs=['*'], ) - prob.model_options['*'] = get_flops_options(case_name) + prob.model_options['*'] = get_flops_options(case_name, preprocess=True) prob.setup(check=False, force_alloc_complex=True) diff --git a/aviary/subsystems/mass/flops_based/test/test_apu.py b/aviary/subsystems/mass/flops_based/test/test_apu.py index 47d1e31d9..3c9ee7dc5 100644 --- a/aviary/subsystems/mass/flops_based/test/test_apu.py +++ b/aviary/subsystems/mass/flops_based/test/test_apu.py @@ -1,5 +1,6 @@ import unittest +import numpy as np import openmdao.api as om from openmdao.utils.assert_utils import assert_check_partials from openmdao.utils.testing_utils import use_tempdirs @@ -88,8 +89,11 @@ class BWBAPUMassTest(unittest.TestCase): def setUp(self): self.prob = om.Problem() - @parameterized.expand(get_flops_case_names(only=bwb_cases), name_func=print_case) - def test_case(self, case_name): + # @parameterized.expand(get_flops_case_names(only=bwb_cases), name_func=print_case) + def test_case( + self, + ): + case_name = 'BWBsimpleFLOPS' prob = self.prob prob.model.add_subsystem( @@ -99,7 +103,7 @@ def test_case(self, case_name): promotes_outputs=['*'], ) - prob.model_options['*'] = get_flops_options(case_name, preprocess=False) + prob.model_options['*'] = get_flops_options(case_name, preprocess=True) prob.setup(check=False, force_alloc_complex=True) @@ -114,4 +118,7 @@ def test_case(self, case_name): if __name__ == '__main__': - unittest.main() + # unittest.main() + test = BWBAPUMassTest() + test.setUp() + test.test_case() From 93f0044bde0ecac3a6455568e7a493adff0cd8ca Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Fri, 6 Feb 2026 11:24:30 -0500 Subject: [PATCH 44/76] add comments --- aviary/subsystems/geometry/flops_based/fuselage.py | 4 +++- aviary/variable_info/variable_meta_data.py | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/aviary/subsystems/geometry/flops_based/fuselage.py b/aviary/subsystems/geometry/flops_based/fuselage.py index 35c4cfaf1..82198e496 100644 --- a/aviary/subsystems/geometry/flops_based/fuselage.py +++ b/aviary/subsystems/geometry/flops_based/fuselage.py @@ -70,7 +70,9 @@ def setup(self): 'Rear_spar_percent_chord', 0.7, units='unitless', - desc='RSPSOB: Rear spar percent chord for BWB at side of body', + desc='RSPSOB: Rear spar percent chord for BWB at side of body, ' + ' or more precisely, the passenger compartment ends at the ' + ' 70% of fuselage length from the leading edge.', ) add_aviary_output(self, Aircraft.Fuselage.REF_DIAMETER, units='ft') diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index 1f90e65f2..a576afd65 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -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, ) From c5101c0af68826f59310089b6d1a4d63b0a3e9a5 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Fri, 6 Feb 2026 14:25:59 -0500 Subject: [PATCH 45/76] modify comments --- .../aircraft/blended_wing_body/bwb_detailed_FLOPS_data.py | 2 +- .../models/aircraft/blended_wing_body/bwb_simple_FLOPS_data.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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 cf2d45e65..5045f972e 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 @@ -113,7 +113,7 @@ # Horizontal Tail # --------------------------- inputs.set_val(Aircraft.HorizontalTail.AREA, 0.0, 'ft**2') # SHT -inputs.set_val(Aircraft.HorizontalTail.ASPECT_RATIO, 0.1) # SHT +inputs.set_val(Aircraft.HorizontalTail.ASPECT_RATIO, 0.1) # ARHT inputs.set_val(Aircraft.HorizontalTail.TAPER_RATIO, 0.0) # TRHT inputs.set_val(Aircraft.HorizontalTail.THICKNESS_TO_CHORD, 0.11) # TCHT # inputs.set_val(Aircraft.HorizontalTail.VERTICAL_TAIL_FRACTION, 0.0) # HHT 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 f4cea0919..25c7e3563 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 @@ -115,7 +115,7 @@ # Horizontal Tail # --------------------------- inputs.set_val(Aircraft.HorizontalTail.AREA, 0.0, 'ft**2') # SHT -inputs.set_val(Aircraft.HorizontalTail.ASPECT_RATIO, 0.1) # SHT +inputs.set_val(Aircraft.HorizontalTail.ASPECT_RATIO, 0.1) # ARHT inputs.set_val(Aircraft.HorizontalTail.TAPER_RATIO, 0.0) # TRHT inputs.set_val(Aircraft.HorizontalTail.THICKNESS_TO_CHORD, 0.11) # TCHT # inputs.set_val(Aircraft.HorizontalTail.VERTICAL_TAIL_FRACTION, 0.0) # HHT From b3c6481e0a7a864aeb36cb44f9510754794e5c14 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Fri, 6 Feb 2026 21:09:55 -0500 Subject: [PATCH 46/76] add Mission.Landing.LIFT_COEFFICIENT_MAX back to model --- aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS.csv | 2 +- .../aircraft/blended_wing_body/bwb_detailed_FLOPS_data.py | 2 +- aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS.csv | 2 +- .../models/aircraft/blended_wing_body/bwb_simple_FLOPS_data.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) 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 cd8882bc3..edafe8699 100644 --- a/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS.csv +++ b/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS.csv @@ -155,7 +155,7 @@ 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:landing:lift_coefficient_max,3.0,unitless mission:landing:rolling_friction_coefficient,0.025,unitless mission:takeoff:lift_coefficient_max,2.0,unitless mission:summary:cruise_mach,0.85,unitless 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 5045f972e..3c21bf170 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 @@ -287,7 +287,7 @@ inputs.set_val(Mission.Constraints.MAX_MACH, 0.85) # VMMO # inputs.set_val(Mission.Takeoff.FUEL_SIMPLE, 577, 'lbm') # FTKOFL -# inputs.set_val(Mission.Landing.LIFT_COEFFICIENT_MAX, 3.0) # CLLDM +inputs.set_val(Mission.Landing.LIFT_COEFFICIENT_MAX, 3.0) # CLLDM inputs.set_val(Mission.Takeoff.LIFT_COEFFICIENT_MAX, 2) # CLTOM # inputs.set_val(Mission.Takeoff.LIFT_OVER_DRAG, 17.354) inputs.set_val(Aircraft.Design.LANDING_TO_TAKEOFF_MASS_RATIO, 0.8) # WRATIO 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 4f91fbc50..4267713bd 100644 --- a/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS.csv +++ b/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS.csv @@ -154,7 +154,7 @@ 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:landing:lift_coefficient_max,3.0,unitless mission:landing:rolling_friction_coefficient,0.025,unitless mission:takeoff:lift_coefficient_max,2.0,unitless mission:summary:cruise_mach,0.85,unitless 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 25c7e3563..516de7c23 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 @@ -234,7 +234,7 @@ inputs.set_val(Mission.Constraints.MAX_MACH, 0.85) # VMMO # inputs.set_val(Mission.Takeoff.FUEL_SIMPLE, 577, 'lbm') # FTKOFL -# inputs.set_val(Mission.Landing.LIFT_COEFFICIENT_MAX, 3.0) # CLLDM +inputs.set_val(Mission.Landing.LIFT_COEFFICIENT_MAX, 3.0) # CLLDM inputs.set_val(Mission.Takeoff.LIFT_COEFFICIENT_MAX, 2) # CLTOM # inputs.set_val(Mission.Takeoff.LIFT_OVER_DRAG, 17.354) inputs.set_val(Aircraft.Design.LANDING_TO_TAKEOFF_MASS_RATIO, 0.8) # WRATIO From 90f79212bd9be7cae66a559f87a3229bb14d0dbc Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 9 Feb 2026 19:26:52 -0500 Subject: [PATCH 47/76] remove many unnecessary unit tests for BWB --- .../flops_based/test/test_air_conditioning.py | 48 +--------- .../mass/flops_based/test/test_anti_icing.py | 49 +--------- .../mass/flops_based/test/test_apu.py | 44 +-------- .../mass/flops_based/test/test_avionics.py | 7 +- .../flops_based/test/test_cargo_containers.py | 41 +-------- .../mass/flops_based/test/test_crew.py | 72 +-------------- .../mass/flops_based/test/test_electrical.py | 45 +--------- .../flops_based/test/test_empty_margin.py | 43 +-------- .../flops_based/test/test_engine_controls.py | 42 +-------- .../mass/flops_based/test/test_engine_oil.py | 49 ++-------- .../mass/flops_based/test/test_engine_pod.py | 58 +----------- .../mass/flops_based/test/test_fuel_system.py | 46 +--------- .../mass/flops_based/test/test_furnishings.py | 2 +- .../flops_based/test/test_horizontail_tail.py | 41 +-------- .../mass/flops_based/test/test_hydraulics.py | 6 +- .../mass/flops_based/test/test_instruments.py | 52 +---------- .../flops_based/test/test_landing_gear.py | 8 +- .../flops_based/test/test_landing_mass.py | 31 +------ .../flops_based/test/test_mass_summation.py | 90 +------------------ .../mass/flops_based/test/test_misc_engine.py | 42 +-------- .../mass/flops_based/test/test_nacelle.py | 45 +--------- .../mass/flops_based/test/test_paint.py | 5 +- .../test/test_passenger_service.py | 38 +------- .../mass/flops_based/test/test_starter.py | 44 +-------- .../flops_based/test/test_surface_controls.py | 40 +-------- .../flops_based/test/test_thrust_reverser.py | 40 +-------- .../flops_based/test/test_unusable_fuel.py | 45 +--------- .../flops_based/test/test_vertical_tail.py | 42 +-------- 28 files changed, 67 insertions(+), 1048 deletions(-) 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 39d9f73c3..294d5edbc 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, preprocess=True) - - 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 7b7629c3e..ddccbeeec 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 3c9ee7dc5..913c02a1e 100644 --- a/aviary/subsystems/mass/flops_based/test/test_apu.py +++ b/aviary/subsystems/mass/flops_based/test/test_apu.py @@ -17,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 @@ -45,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, ) @@ -83,42 +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 = 'BWBsimpleFLOPS' - prob = self.prob - - prob.model.add_subsystem( - 'apu', - TransportAPUMass(), - 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.APU.MASS_SCALER, Aircraft.Fuselage.PLANFORM_AREA], - output_keys=Aircraft.APU.MASS, - version=Version.BWB, - tol=5.0e-4, - ) - - if __name__ == '__main__': - # unittest.main() - test = BWBAPUMassTest() - test.setUp() - test.test_case() + 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 d5e9d2907..20fec6efd 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, ) @@ -98,7 +97,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 ttest_case(self, case_name): prob = self.prob prob.model.add_subsystem( 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 7161b566a..161446ec3 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 f656cea1e..c14d76ccf 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 5748dfebd..902ca0307 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 9b1599867..377481dfd 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 ea705a065..61fc6e3ea 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 961ac2262..92d793a38 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 07e3ac053..b6f1853a0 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 12c3fb265..d7ca7de71 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 af0e1f045..c022eb99f 100644 --- a/aviary/subsystems/mass/flops_based/test/test_furnishings.py +++ b/aviary/subsystems/mass/flops_based/test/test_furnishings.py @@ -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 de43ab99e..feff0a560 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, ) @@ -144,40 +142,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 9a31f34a3..dfb827fd9 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 6e4efd43e..163eb09c5 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 dd585de09..37c6717b8 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, ) @@ -208,7 +206,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_casdgse(self, case_name): prob = self.prob prob.model.add_subsystem( 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 50446cc73..1e667208d 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 7d52056e9..5885c0745 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 c9d727271..125e63a3c 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 b9e940fb0..f13910c7a 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 93291f3d4..776324357 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 c33810609..42ce46412 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 a7bd7f40f..76f950889 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 b941c054b..30983e22a 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 5d81f3015..12bc1ca12 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 449f44e62..3b7dfe34b 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 a1a13b3cd..f3c62adb0 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() From 39a25d2ffe28544b7d99e631b79940123e1e2f95 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 9 Feb 2026 19:27:45 -0500 Subject: [PATCH 48/76] add Version.TRANSPORT_and_BWB --- aviary/validation_cases/validation_tests.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/aviary/validation_cases/validation_tests.py b/aviary/validation_cases/validation_tests.py index 57224f7e4..dddc8eed0 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) From bd3cc319a7cb2100c4873447a876ea1a26d45e3d Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 9 Feb 2026 19:28:17 -0500 Subject: [PATCH 49/76] fix a typo in comment --- .../aircraft/blended_wing_body/bwb_detailed_FLOPS_data.py | 2 +- .../models/aircraft/blended_wing_body/bwb_simple_FLOPS_data.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) 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 3c21bf170..04cbf3420 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 @@ -117,7 +117,7 @@ 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 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 516de7c23..445806f67 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 @@ -119,7 +119,7 @@ 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 From 2cad3ff7b928e7c25201db0ad3df2da04f29b5eb Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 9 Feb 2026 19:28:57 -0500 Subject: [PATCH 50/76] remove many unnecessary unit tests for BWB --- aviary/subsystems/mass/flops_based/fuselage.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/aviary/subsystems/mass/flops_based/fuselage.py b/aviary/subsystems/mass/flops_based/fuselage.py index 6fb05e9ef..adabb6775 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) / ( From 42999896a27974deff4c7f2a31be92d1205016ff Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 9 Feb 2026 19:30:53 -0500 Subject: [PATCH 51/76] replace print by raise ValueError. Reword an if condition --- aviary/subsystems/geometry/flops_based/prep_geom.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/aviary/subsystems/geometry/flops_based/prep_geom.py b/aviary/subsystems/geometry/flops_based/prep_geom.py index a96086800..e7a788474 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() From 5e0668fc3cd602f8c32f5970c74f7d65099aa8c0 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 9 Feb 2026 19:31:44 -0500 Subject: [PATCH 52/76] rename local variables avg_diam and avg_length to ref_diam andref_length --- .../geometry/flops_based/nacelle.py | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/aviary/subsystems/geometry/flops_based/nacelle.py b/aviary/subsystems/geometry/flops_based/nacelle.py index e80534796..b8a5bbbd0 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] From 0e06c460cf7b0d60c4121dea305df2b850fc7051 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 9 Feb 2026 19:32:28 -0500 Subject: [PATCH 53/76] replace 'raise UserWarning' by warning.warn --- aviary/subsystems/geometry/flops_based/fuselage.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/aviary/subsystems/geometry/flops_based/fuselage.py b/aviary/subsystems/geometry/flops_based/fuselage.py index 82198e496..77f60e237 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 @@ -167,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.' ) From 7fc293007b306400488bc325d6e1c959f799848a Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 9 Feb 2026 22:30:37 -0500 Subject: [PATCH 54/76] remove some detailed info --- aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS.in | 2 +- aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS.in | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS.in b/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS.in index e072d1681..9d689af69 100644 --- a/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS.in +++ b/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS.in @@ -1,4 +1,4 @@ -468 passenger BWB - Based on Boeing BWB450-1U, Karl Geiselhart +468 passenger BWB $OPTION MPRINT=1, diff --git a/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS.in b/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS.in index 53d81a10a..486763ab8 100644 --- a/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS.in +++ b/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS.in @@ -1,4 +1,4 @@ -468 passenger BWB - Based on Boeing BWB450-1U, Karl Geiselhart +468 passenger BWB $OPTION MPRINT=1, From ba440931650cd18b0768e3e4c70b0c0f6f4d9ee7 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 9 Feb 2026 22:31:38 -0500 Subject: [PATCH 55/76] removed the TODO comment on CLAPP and CLLDM --- aviary/variable_info/variable_meta_data.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index a576afd65..0816ee0e7 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -7476,9 +7476,6 @@ ) add_meta_data( - # TODO: missing &DEFINE.AERIN.CLAPP ??? - # - NOTE: there is a relationship in FLOPS/LEAPS1 between CLAPP and - # CLLDM (this variable) Mission.Landing.LIFT_COEFFICIENT_MAX, meta_data=_MetaData, historical_name={ From e546a7547df00c2312770231e03c2c753a469167 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 9 Feb 2026 22:32:15 -0500 Subject: [PATCH 56/76] changed a docstring --- aviary/subsystems/mass/flops_based/test/test_furnishings.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aviary/subsystems/mass/flops_based/test/test_furnishings.py b/aviary/subsystems/mass/flops_based/test/test_furnishings.py index c022eb99f..4fb1b4404 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() From eab9e8dd96d7ce0568c19229b5e615cac52c1096 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 9 Feb 2026 22:32:55 -0500 Subject: [PATCH 57/76] add created date --- aviary/utils/test/data/converter_test_BWB_detailed_FLOPS.csv | 1 + aviary/utils/test/data/converter_test_BWB_simple_FLOPS.csv | 1 + 2 files changed, 2 insertions(+) diff --git a/aviary/utils/test/data/converter_test_BWB_detailed_FLOPS.csv b/aviary/utils/test/data/converter_test_BWB_detailed_FLOPS.csv index 088447e70..2b319c877 100644 --- a/aviary/utils/test/data/converter_test_BWB_detailed_FLOPS.csv +++ b/aviary/utils/test/data/converter_test_BWB_detailed_FLOPS.csv @@ -1,3 +1,4 @@ +# created 12/24/25 # FLOPS-derived aircraft input deck converted from bwb_detailed_FLOPS.in # Input Values diff --git a/aviary/utils/test/data/converter_test_BWB_simple_FLOPS.csv b/aviary/utils/test/data/converter_test_BWB_simple_FLOPS.csv index 58d33a586..91768a082 100644 --- a/aviary/utils/test/data/converter_test_BWB_simple_FLOPS.csv +++ b/aviary/utils/test/data/converter_test_BWB_simple_FLOPS.csv @@ -1,3 +1,4 @@ +created 12/24/25 # FLOPS-derived aircraft input deck converted from bwb_simple_FLOPS.in # Input Values From 497c78f83684315a35e5e42269f219576f984fec Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 9 Feb 2026 22:34:09 -0500 Subject: [PATCH 58/76] work in progress: changes based on comments from Crhis and Jason --- aviary/utils/fortran_to_aviary.py | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/aviary/utils/fortran_to_aviary.py b/aviary/utils/fortran_to_aviary.py index 307ec4554..968a08c2b 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 @@ -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'] @@ -989,8 +991,15 @@ def update_flops_options(vehicle_data): if Aircraft.Fuel.DENSITY in input_values: FULDEN = input_values.get_val(Aircraft.Fuel.DENSITY, 'lbm/ft**3')[0] else: - FULDEN = 50.1194909 # lbm/ft**3 or 6.7 lbm/galUS - input_values.set_val(Aircraft.Fuel.DENSITY, [6.7], 'lbm/galUS') + 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.DENSITY, [FULDEN], 'lbm/galUS') input_values.set_val( Aircraft.Fuel.WING_FUEL_FRACTION, [FWMAX / (FULDEN * (2 / 3))], 'unitless' ) @@ -1008,10 +1017,11 @@ def update_flops_options(vehicle_data): 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}' - ) + if verbosity >= Verbosity.BRIEF: + warnings.warn( + '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( From 8c6caac15c8b9e2379011521f8ada1a8bd94859c Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 9 Feb 2026 22:54:21 -0500 Subject: [PATCH 59/76] removed the date that was added just now --- aviary/utils/test/data/converter_test_BWB_detailed_FLOPS.csv | 1 - aviary/utils/test/data/converter_test_BWB_simple_FLOPS.csv | 1 - 2 files changed, 2 deletions(-) diff --git a/aviary/utils/test/data/converter_test_BWB_detailed_FLOPS.csv b/aviary/utils/test/data/converter_test_BWB_detailed_FLOPS.csv index 2b319c877..088447e70 100644 --- a/aviary/utils/test/data/converter_test_BWB_detailed_FLOPS.csv +++ b/aviary/utils/test/data/converter_test_BWB_detailed_FLOPS.csv @@ -1,4 +1,3 @@ -# created 12/24/25 # FLOPS-derived aircraft input deck converted from bwb_detailed_FLOPS.in # Input Values diff --git a/aviary/utils/test/data/converter_test_BWB_simple_FLOPS.csv b/aviary/utils/test/data/converter_test_BWB_simple_FLOPS.csv index 91768a082..58d33a586 100644 --- a/aviary/utils/test/data/converter_test_BWB_simple_FLOPS.csv +++ b/aviary/utils/test/data/converter_test_BWB_simple_FLOPS.csv @@ -1,4 +1,3 @@ -created 12/24/25 # FLOPS-derived aircraft input deck converted from bwb_simple_FLOPS.in # Input Values From 83ef435b0948f012e716be8f4cc0158ffc6cebb3 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 9 Feb 2026 23:05:49 -0500 Subject: [PATCH 60/76] remove unit tests on WBW data --- .../mass/flops_based/test/test_avionics.py | 37 ------------------- .../flops_based/test/test_landing_gear.py | 36 ------------------ 2 files changed, 73 deletions(-) diff --git a/aviary/subsystems/mass/flops_based/test/test_avionics.py b/aviary/subsystems/mass/flops_based/test/test_avionics.py index 20fec6efd..39e45856c 100644 --- a/aviary/subsystems/mass/flops_based/test/test_avionics.py +++ b/aviary/subsystems/mass/flops_based/test/test_avionics.py @@ -89,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 ttest_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_landing_gear.py b/aviary/subsystems/mass/flops_based/test/test_landing_gear.py index 37c6717b8..b06c931f6 100644 --- a/aviary/subsystems/mass/flops_based/test/test_landing_gear.py +++ b/aviary/subsystems/mass/flops_based/test/test_landing_gear.py @@ -198,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_casdgse(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() From 84313a2a9394e373b0235e2000347fd0b5042164 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Mon, 9 Feb 2026 23:43:18 -0500 Subject: [PATCH 61/76] update wing_fuel_fraction --- aviary/utils/fortran_to_aviary.py | 9 ++++++++- .../test/data/converter_test_BWB_detailed_FLOPS.csv | 2 +- .../utils/test/data/converter_test_BWB_simple_FLOPS.csv | 2 +- 3 files changed, 10 insertions(+), 3 deletions(-) diff --git a/aviary/utils/fortran_to_aviary.py b/aviary/utils/fortran_to_aviary.py index 968a08c2b..0731a7e55 100644 --- a/aviary/utils/fortran_to_aviary.py +++ b/aviary/utils/fortran_to_aviary.py @@ -999,7 +999,14 @@ def update_flops_options(vehicle_data, verbosity=Verbosity.BRIEF): 'lbm/ft**3', ) # FULDEN = 50.1194909 # lbm/ft**3 or 6.7 lbm/galUS - input_values.set_val(Aircraft.Fuel.DENSITY, [FULDEN], 'lbm/galUS') + FULDEN2 = wrapped_convert_units( + ( + _MetaData[Aircraft.Fuel.DENSITY]['default_value'], + _MetaData[Aircraft.Fuel.DENSITY]['units'], + ), + 'lbm/galUS', + ) + input_values.set_val(Aircraft.Fuel.DENSITY, [FULDEN2], 'lbm/galUS') input_values.set_val( Aircraft.Fuel.WING_FUEL_FRACTION, [FWMAX / (FULDEN * (2 / 3))], 'unitless' ) diff --git a/aviary/utils/test/data/converter_test_BWB_detailed_FLOPS.csv b/aviary/utils/test/data/converter_test_BWB_detailed_FLOPS.csv index 088447e70..f3992ee0a 100644 --- a/aviary/utils/test/data/converter_test_BWB_detailed_FLOPS.csv +++ b/aviary/utils/test/data/converter_test_BWB_detailed_FLOPS.csv @@ -37,7 +37,7 @@ aircraft:fins:num_fins,2,unitless aircraft:fins:taper_ratio,0.464,unitless aircraft:fuel:density,6.7,lbm/galUS aircraft:fuel:ignore_fuel_capacity_constraint,False,unitless -aircraft:fuel:wing_fuel_fraction,0.688354956933531,unitless +aircraft: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 diff --git a/aviary/utils/test/data/converter_test_BWB_simple_FLOPS.csv b/aviary/utils/test/data/converter_test_BWB_simple_FLOPS.csv index 58d33a586..7eb69dd29 100644 --- a/aviary/utils/test/data/converter_test_BWB_simple_FLOPS.csv +++ b/aviary/utils/test/data/converter_test_BWB_simple_FLOPS.csv @@ -37,7 +37,7 @@ aircraft:fins:num_fins,2,unitless aircraft:fins:taper_ratio,0.464,unitless aircraft:fuel:density,6.7,lbm/galUS aircraft:fuel:ignore_fuel_capacity_constraint,False,unitless -aircraft:fuel:wing_fuel_fraction,0.688354956933531,unitless +aircraft: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 From a68137bb612af31f265d120e32c149ea4769e95b Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 10 Feb 2026 12:14:54 -0500 Subject: [PATCH 62/76] remove 'aircraft:fuel:density,6.7,lbm/galUS' from FLOPS based BWB test data --- aviary/utils/test/data/converter_test_BWB_detailed_FLOPS.csv | 1 - aviary/utils/test/data/converter_test_BWB_simple_FLOPS.csv | 1 - 2 files changed, 2 deletions(-) diff --git a/aviary/utils/test/data/converter_test_BWB_detailed_FLOPS.csv b/aviary/utils/test/data/converter_test_BWB_detailed_FLOPS.csv index f3992ee0a..c89c47eaf 100644 --- a/aviary/utils/test/data/converter_test_BWB_detailed_FLOPS.csv +++ b/aviary/utils/test/data/converter_test_BWB_detailed_FLOPS.csv @@ -35,7 +35,6 @@ aircraft:engine:scaled_sls_thrust,70000,lbf aircraft:fins:area,184.89,ft**2 aircraft:fins:num_fins,2,unitless aircraft:fins:taper_ratio,0.464,unitless -aircraft:fuel:density,6.7,lbm/galUS aircraft:fuel:ignore_fuel_capacity_constraint,False,unitless aircraft:fuel:wing_fuel_fraction,0.6883549569366508,unitless aircraft:furnishings:mass_scaler,1,unitless diff --git a/aviary/utils/test/data/converter_test_BWB_simple_FLOPS.csv b/aviary/utils/test/data/converter_test_BWB_simple_FLOPS.csv index 7eb69dd29..8fbd6a169 100644 --- a/aviary/utils/test/data/converter_test_BWB_simple_FLOPS.csv +++ b/aviary/utils/test/data/converter_test_BWB_simple_FLOPS.csv @@ -35,7 +35,6 @@ aircraft:engine:scaled_sls_thrust,70000,lbf aircraft:fins:area,184.89,ft**2 aircraft:fins:num_fins,2,unitless aircraft:fins:taper_ratio,0.464,unitless -aircraft:fuel:density,6.7,lbm/galUS aircraft:fuel:ignore_fuel_capacity_constraint,False,unitless aircraft:fuel:wing_fuel_fraction,0.6883549569366508,unitless aircraft:furnishings:mass_scaler,1,unitless From 251e305cb7064d91984c619f049635cb1e370a43 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 10 Feb 2026 12:16:04 -0500 Subject: [PATCH 63/76] work in progress. All minors. Changes based on Jason's comments. --- aviary/utils/fortran_to_aviary.py | 75 ++++++++++++++----------------- 1 file changed, 34 insertions(+), 41 deletions(-) diff --git a/aviary/utils/fortran_to_aviary.py b/aviary/utils/fortran_to_aviary.py index 0731a7e55..e775e73b2 100644 --- a/aviary/utils/fortran_to_aviary.py +++ b/aviary/utils/fortran_to_aviary.py @@ -789,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( @@ -919,7 +919,8 @@ def update_flops_options(vehicle_data, verbosity=Verbosity.BRIEF): if Aircraft.Wing.INPUT_STATION_DIST in input_values: input_values.set_val(Aircraft.Wing.DETAILED_WING, [True]) - if not Mission.Landing.LIFT_COEFFICIENT_MAX in input_values: + 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] @@ -980,12 +981,12 @@ def update_flops_options(vehicle_data, verbosity=Verbosity.BRIEF): thrust = input_values.get_val(Aircraft.Engine.SCALED_SLS_THRUST, 'lbf')[0] input_values.set_val(Aircraft.Engine.SCALED_SLS_THRUST, [thrust], 'lbf') - if not Aircraft.Fuselage.HEIGHT_TO_WIDTH_RATIO in input_values: + if Aircraft.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') - if not Aircraft.Fuel.WING_FUEL_FRACTION in input_values: + 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: @@ -999,14 +1000,6 @@ def update_flops_options(vehicle_data, verbosity=Verbosity.BRIEF): 'lbm/ft**3', ) # FULDEN = 50.1194909 # lbm/ft**3 or 6.7 lbm/galUS - FULDEN2 = wrapped_convert_units( - ( - _MetaData[Aircraft.Fuel.DENSITY]['default_value'], - _MetaData[Aircraft.Fuel.DENSITY]['units'], - ), - 'lbm/galUS', - ) - input_values.set_val(Aircraft.Fuel.DENSITY, [FULDEN2], 'lbm/galUS') input_values.set_val( Aircraft.Fuel.WING_FUEL_FRACTION, [FWMAX / (FULDEN * (2 / 3))], 'unitless' ) From 7d3bdc410c22b2b064e8253e3fade54001cc73cb Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 10 Feb 2026 12:51:40 -0500 Subject: [PATCH 64/76] work in progress. Aircraft.CrewPayload.BAGGAGE_MASS_PER_PASSENGER is dropped off by accident. Add it back. --- aviary/utils/fortran_to_aviary.py | 21 +++++++++++++++++-- .../converter_test_BWB_detailed_FLOPS.csv | 1 + .../data/converter_test_BWB_simple_FLOPS.csv | 1 + 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/aviary/utils/fortran_to_aviary.py b/aviary/utils/fortran_to_aviary.py index e775e73b2..340a84304 100644 --- a/aviary/utils/fortran_to_aviary.py +++ b/aviary/utils/fortran_to_aviary.py @@ -1032,15 +1032,32 @@ def update_flops_options(vehicle_data, verbosity=Verbosity.BRIEF): f'Currently, Aircraft.Design.TYPE must be either 0 or 3 not {design_type[0]}.' ) + if Aircraft.CrewPayload.BAGGAGE_MASS_PER_PASSENGER not in input_values: + if Mission.Design.RANGE in input_values: + design_range = input_values.get_val(Mission.Design.RANGE, 'nmi')[0] + baggage_per_pax = 35.0 + if design_range > 2900: + baggage_per_pax = 44.0 + elif design_range > 900: + baggage_per_pax = 40.0 + input_values.set_val( + Aircraft.CrewPayload.BAGGAGE_MASS_PER_PASSENGER, [baggage_per_pax], 'lbm' + ) + if verbosity >= Verbosity.BRIEF: + print( + 'Set Aircraft.CrewPayload.BAGGAGE_MASS_PER_PASSENGER to : ' + f'FLOPS specific assumption {baggage_per_pax}' + ) + if ( - not Aircraft.HorizontalTail.THICKNESS_TO_CHORD in input_values + 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 (not Aircraft.VerticalTail.THICKNESS_TO_CHORD in input_values) or ( + 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: diff --git a/aviary/utils/test/data/converter_test_BWB_detailed_FLOPS.csv b/aviary/utils/test/data/converter_test_BWB_detailed_FLOPS.csv index c89c47eaf..4ae11ada3 100644 --- a/aviary/utils/test/data/converter_test_BWB_detailed_FLOPS.csv +++ b/aviary/utils/test/data/converter_test_BWB_detailed_FLOPS.csv @@ -4,6 +4,7 @@ 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:baggage_mass_per_passenger,44.0,lbm 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 diff --git a/aviary/utils/test/data/converter_test_BWB_simple_FLOPS.csv b/aviary/utils/test/data/converter_test_BWB_simple_FLOPS.csv index 8fbd6a169..4b18d7c1a 100644 --- a/aviary/utils/test/data/converter_test_BWB_simple_FLOPS.csv +++ b/aviary/utils/test/data/converter_test_BWB_simple_FLOPS.csv @@ -4,6 +4,7 @@ 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:baggage_mass_per_passenger,44.0,lbm 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 From 07a7a43463a876086346d8b90825b4483fe1281d Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 10 Feb 2026 14:05:51 -0500 Subject: [PATCH 65/76] remove aircraft:engine:scale_factor from data --- aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS.csv | 2 +- .../aircraft/blended_wing_body/bwb_detailed_FLOPS_data.py | 2 +- aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS.csv | 2 +- .../models/aircraft/blended_wing_body/bwb_simple_FLOPS_data.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) 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 edafe8699..a1288da0e 100644 --- a/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS.csv +++ b/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS.csv @@ -64,7 +64,7 @@ aircraft:engine:num_fuselage_engines,3,unitless aircraft:engine:num_wing_engines,0,unitless aircraft:engine:reference_mass,22017.0,lbm aircraft:engine:reference_sls_thrust,86459.2,lbf -aircraft:engine:scale_factor,0.8096304384,unitless +# aircraft:engine:scale_factor,0.8096304384,unitless aircraft:engine:scale_mass,True,unitless aircraft:engine:scale_performance,True,unitless aircraft:engine:scaled_sls_thrust,70000,lbf 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 04cbf3420..be60b0213 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 @@ -163,7 +163,7 @@ inputs.set_val(Aircraft.Engine.NUM_WING_ENGINES, np.array([0])) # NEW inputs.set_val(Aircraft.Engine.THRUST_REVERSERS_MASS_SCALER, 0.0) # WTHR inputs.set_val(Aircraft.Engine.WING_LOCATIONS, 0) # ETAE -inputs.set_val(Aircraft.Engine.SCALE_FACTOR, 0.8096304384) # THRUST/THRSO +# inputs.set_val(Aircraft.Engine.SCALE_FACTOR, 0.8096304384) # THRUST/THRSO inputs.set_val(Aircraft.Engine.SCALE_MASS, True) inputs.set_val(Aircraft.Engine.MASS_SCALER, 1.0) # EEXP inputs.set_val(Aircraft.Engine.SCALE_PERFORMANCE, True) 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 4267713bd..d508881dd 100644 --- a/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS.csv +++ b/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS.csv @@ -64,7 +64,7 @@ aircraft:engine:num_fuselage_engines,3,unitless aircraft:engine:num_wing_engines,0,unitless aircraft:engine:reference_mass,22017.0,lbm aircraft:engine:reference_sls_thrust,86459.2,lbf -aircraft:engine:scale_factor,0.8096304384,unitless +# aircraft:engine:scale_factor,0.8096304384,unitless aircraft:engine:scale_mass,True,unitless aircraft:engine:scale_performance,True,unitless aircraft:engine:scaled_sls_thrust,70000,lbf 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 445806f67..3269defd7 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 @@ -165,7 +165,7 @@ inputs.set_val(Aircraft.Engine.NUM_WING_ENGINES, np.array([0])) # NEW inputs.set_val(Aircraft.Engine.THRUST_REVERSERS_MASS_SCALER, 0.0) # WTHR inputs.set_val(Aircraft.Engine.WING_LOCATIONS, 0) # ETAE -inputs.set_val(Aircraft.Engine.SCALE_FACTOR, 0.8096304384) # THRUST/THRSO +# inputs.set_val(Aircraft.Engine.SCALE_FACTOR, 0.8096304384) # THRUST/THRSO inputs.set_val(Aircraft.Engine.SCALE_MASS, True) inputs.set_val(Aircraft.Engine.MASS_SCALER, 1.0) # EEXP inputs.set_val(Aircraft.Engine.SCALE_PERFORMANCE, True) From e55a11cd44b175ca44d95d4ae8373047a2fce823 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 10 Feb 2026 14:08:12 -0500 Subject: [PATCH 66/76] remove aircraft:engine:scale_factor from data --- aviary/utils/test/data/converter_test_BWB_detailed_FLOPS.csv | 1 - aviary/utils/test/data/converter_test_BWB_simple_FLOPS.csv | 1 - 2 files changed, 2 deletions(-) diff --git a/aviary/utils/test/data/converter_test_BWB_detailed_FLOPS.csv b/aviary/utils/test/data/converter_test_BWB_detailed_FLOPS.csv index 4ae11ada3..06cea4101 100644 --- a/aviary/utils/test/data/converter_test_BWB_detailed_FLOPS.csv +++ b/aviary/utils/test/data/converter_test_BWB_detailed_FLOPS.csv @@ -31,7 +31,6 @@ 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 diff --git a/aviary/utils/test/data/converter_test_BWB_simple_FLOPS.csv b/aviary/utils/test/data/converter_test_BWB_simple_FLOPS.csv index 4b18d7c1a..89479e215 100644 --- a/aviary/utils/test/data/converter_test_BWB_simple_FLOPS.csv +++ b/aviary/utils/test/data/converter_test_BWB_simple_FLOPS.csv @@ -31,7 +31,6 @@ 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 From d5b75fada841609379ee707397de04db485358fe Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 10 Feb 2026 14:09:07 -0500 Subject: [PATCH 67/76] work in progress --- aviary/utils/fortran_to_aviary.py | 36 +++++++++++++++---------------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/aviary/utils/fortran_to_aviary.py b/aviary/utils/fortran_to_aviary.py index 340a84304..4952b3917 100644 --- a/aviary/utils/fortran_to_aviary.py +++ b/aviary/utils/fortran_to_aviary.py @@ -909,7 +909,14 @@ def update_flops_options(vehicle_data, verbosity=Verbosity.BRIEF): if Aircraft.Fuel.DENSITY in input_values: FULDEN = input_values.get_val(Aircraft.Fuel.DENSITY, 'lbm/ft**3')[0] else: - FULDEN = 50.12 # 50.12 lbm/ft**3 = 6.7 lbm/galUS + 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' ) @@ -1010,23 +1017,6 @@ def update_flops_options(vehicle_data, verbosity=Verbosity.BRIEF): 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: - if verbosity >= Verbosity.BRIEF: - warnings.warn( - 'Aircraft.Engine.REFERENCE_SLS_THRUST must be positive ' - f'but you have {scaled_thrust}' - ) - else: - engine_scale_factor = scaled_thrust / ref_thrust - input_values.set_val( - Aircraft.Engine.SCALE_FACTOR, [engine_scale_factor], 'unitless' - ) else: raise RuntimeError( f'Currently, Aircraft.Design.TYPE must be either 0 or 3 not {design_type[0]}.' @@ -1056,6 +1046,11 @@ def update_flops_options(vehicle_data, verbosity=Verbosity.BRIEF): 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 @@ -1063,6 +1058,11 @@ def update_flops_options(vehicle_data, verbosity=Verbosity.BRIEF): 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.' + ) # These variables should be removed if they are zero. rem_list = [ From df37234a62e9724d1e4cfcafdb2fe20bda430e39 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 10 Feb 2026 15:06:06 -0500 Subject: [PATCH 68/76] add Aircraft.Engine.SCALE_FACTOR back in update_flops_options for now --- .../blended_wing_body/bwb_detailed_FLOPS.csv | 2 +- .../blended_wing_body/bwb_detailed_FLOPS_data.py | 2 +- .../blended_wing_body/bwb_simple_FLOPS.csv | 2 +- .../blended_wing_body/bwb_simple_FLOPS_data.py | 2 +- .../flops_based/test/test_horizontail_tail.py | 1 + aviary/utils/fortran_to_aviary.py | 16 ++++++++++++++++ .../data/converter_test_BWB_detailed_FLOPS.csv | 1 + .../data/converter_test_BWB_simple_FLOPS.csv | 1 + 8 files changed, 23 insertions(+), 4 deletions(-) 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 a1288da0e..edafe8699 100644 --- a/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS.csv +++ b/aviary/models/aircraft/blended_wing_body/bwb_detailed_FLOPS.csv @@ -64,7 +64,7 @@ aircraft:engine:num_fuselage_engines,3,unitless aircraft:engine:num_wing_engines,0,unitless aircraft:engine:reference_mass,22017.0,lbm aircraft:engine:reference_sls_thrust,86459.2,lbf -# aircraft:engine:scale_factor,0.8096304384,unitless +aircraft:engine:scale_factor,0.8096304384,unitless aircraft:engine:scale_mass,True,unitless aircraft:engine:scale_performance,True,unitless aircraft:engine:scaled_sls_thrust,70000,lbf 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 be60b0213..04cbf3420 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 @@ -163,7 +163,7 @@ inputs.set_val(Aircraft.Engine.NUM_WING_ENGINES, np.array([0])) # NEW inputs.set_val(Aircraft.Engine.THRUST_REVERSERS_MASS_SCALER, 0.0) # WTHR inputs.set_val(Aircraft.Engine.WING_LOCATIONS, 0) # ETAE -# inputs.set_val(Aircraft.Engine.SCALE_FACTOR, 0.8096304384) # THRUST/THRSO +inputs.set_val(Aircraft.Engine.SCALE_FACTOR, 0.8096304384) # THRUST/THRSO inputs.set_val(Aircraft.Engine.SCALE_MASS, True) inputs.set_val(Aircraft.Engine.MASS_SCALER, 1.0) # EEXP inputs.set_val(Aircraft.Engine.SCALE_PERFORMANCE, True) 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 d508881dd..4267713bd 100644 --- a/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS.csv +++ b/aviary/models/aircraft/blended_wing_body/bwb_simple_FLOPS.csv @@ -64,7 +64,7 @@ aircraft:engine:num_fuselage_engines,3,unitless aircraft:engine:num_wing_engines,0,unitless aircraft:engine:reference_mass,22017.0,lbm aircraft:engine:reference_sls_thrust,86459.2,lbf -# aircraft:engine:scale_factor,0.8096304384,unitless +aircraft:engine:scale_factor,0.8096304384,unitless aircraft:engine:scale_mass,True,unitless aircraft:engine:scale_performance,True,unitless aircraft:engine:scaled_sls_thrust,70000,lbf 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 3269defd7..445806f67 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 @@ -165,7 +165,7 @@ inputs.set_val(Aircraft.Engine.NUM_WING_ENGINES, np.array([0])) # NEW inputs.set_val(Aircraft.Engine.THRUST_REVERSERS_MASS_SCALER, 0.0) # WTHR inputs.set_val(Aircraft.Engine.WING_LOCATIONS, 0) # ETAE -# inputs.set_val(Aircraft.Engine.SCALE_FACTOR, 0.8096304384) # THRUST/THRSO +inputs.set_val(Aircraft.Engine.SCALE_FACTOR, 0.8096304384) # THRUST/THRSO inputs.set_val(Aircraft.Engine.SCALE_MASS, True) inputs.set_val(Aircraft.Engine.MASS_SCALER, 1.0) # EEXP inputs.set_val(Aircraft.Engine.SCALE_PERFORMANCE, True) 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 feff0a560..bab6c84eb 100644 --- a/aviary/subsystems/mass/flops_based/test/test_horizontail_tail.py +++ b/aviary/subsystems/mass/flops_based/test/test_horizontail_tail.py @@ -85,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() diff --git a/aviary/utils/fortran_to_aviary.py b/aviary/utils/fortran_to_aviary.py index 4952b3917..9d32a0283 100644 --- a/aviary/utils/fortran_to_aviary.py +++ b/aviary/utils/fortran_to_aviary.py @@ -1017,6 +1017,22 @@ def update_flops_options(vehicle_data, verbosity=Verbosity.BRIEF): if Aircraft.Wing.ASPECT_RATIO in input_values: input_values.delete(Aircraft.Wing.ASPECT_RATIO) + if ( + Aircraft.Engine.SCALED_SLS_THRUST in input_values + and Aircraft.Engine.REFERENCE_SLS_THRUST in input_values + ): + ref_thrust = input_values.get_val(Aircraft.Engine.REFERENCE_SLS_THRUST, 'lbf')[0] + scaled_thrust = input_values.get_val(Aircraft.Engine.SCALED_SLS_THRUST, 'lbf')[0] + if scaled_thrust <= 0: + print( + 'Aircraft.Engine.REFERENCE_SLS_THRUST must be positive ' + f'but you have {scaled_thrust}' + ) + else: + engine_scale_factor = scaled_thrust / ref_thrust + input_values.set_val( + Aircraft.Engine.SCALE_FACTOR, [engine_scale_factor], 'unitless' + ) else: raise RuntimeError( f'Currently, Aircraft.Design.TYPE must be either 0 or 3 not {design_type[0]}.' diff --git a/aviary/utils/test/data/converter_test_BWB_detailed_FLOPS.csv b/aviary/utils/test/data/converter_test_BWB_detailed_FLOPS.csv index 06cea4101..4ae11ada3 100644 --- a/aviary/utils/test/data/converter_test_BWB_detailed_FLOPS.csv +++ b/aviary/utils/test/data/converter_test_BWB_detailed_FLOPS.csv @@ -31,6 +31,7 @@ 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 diff --git a/aviary/utils/test/data/converter_test_BWB_simple_FLOPS.csv b/aviary/utils/test/data/converter_test_BWB_simple_FLOPS.csv index 89479e215..4b18d7c1a 100644 --- a/aviary/utils/test/data/converter_test_BWB_simple_FLOPS.csv +++ b/aviary/utils/test/data/converter_test_BWB_simple_FLOPS.csv @@ -31,6 +31,7 @@ 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 From 8035f48cad1b9e67daa3b2fa309e2efedebfc677 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 10 Feb 2026 15:24:31 -0500 Subject: [PATCH 69/76] minor update: replace 'except' by 'except TypeError' --- aviary/utils/fortran_to_aviary.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aviary/utils/fortran_to_aviary.py b/aviary/utils/fortran_to_aviary.py index 9d32a0283..2f56f0f33 100644 --- a/aviary/utils/fortran_to_aviary.py +++ b/aviary/utils/fortran_to_aviary.py @@ -932,7 +932,7 @@ def update_flops_options(vehicle_data, verbosity=Verbosity.BRIEF): try: CLAPP = unused_values.get_item('TOLIN.CLAPP')[0][0] CLLDM = 1.69 * CLAPP - except: + except TypeError: CLLDM = 3.0 input_values.set_val(Mission.Landing.LIFT_COEFFICIENT_MAX, [CLLDM]) From be8b65055f7b4c8ed13910e54c07e77b066e5a92 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Tue, 10 Feb 2026 15:24:57 -0500 Subject: [PATCH 70/76] add a comment back --- aviary/variable_info/variable_meta_data.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/aviary/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index 0816ee0e7..a576afd65 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -7476,6 +7476,9 @@ ) add_meta_data( + # TODO: missing &DEFINE.AERIN.CLAPP ??? + # - NOTE: there is a relationship in FLOPS/LEAPS1 between CLAPP and + # CLLDM (this variable) Mission.Landing.LIFT_COEFFICIENT_MAX, meta_data=_MetaData, historical_name={ From 5336b370d3dcf20006b32227abf42611c9df85cc Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 11 Feb 2026 13:06:52 -0500 Subject: [PATCH 71/76] Chris wants to reorganize the alternate mass computation logic. I give it a try. --- .../mass/flops_based/mass_premission.py | 122 +++++++++--------- 1 file changed, 60 insertions(+), 62 deletions(-) diff --git a/aviary/subsystems/mass/flops_based/mass_premission.py b/aviary/subsystems/mass/flops_based/mass_premission.py index 5c51b1fb1..c09e1d141 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=['*']) From b5c386b0eb64bc997e7fb1261254c98e82c7a7c9 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 11 Feb 2026 15:00:24 -0500 Subject: [PATCH 72/76] add message --- aviary/utils/fortran_to_aviary.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/aviary/utils/fortran_to_aviary.py b/aviary/utils/fortran_to_aviary.py index 2f56f0f33..caa39212a 100644 --- a/aviary/utils/fortran_to_aviary.py +++ b/aviary/utils/fortran_to_aviary.py @@ -992,6 +992,10 @@ def update_flops_options(vehicle_data, verbosity=Verbosity.BRIEF): 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 @@ -1034,8 +1038,9 @@ def update_flops_options(vehicle_data, verbosity=Verbosity.BRIEF): Aircraft.Engine.SCALE_FACTOR, [engine_scale_factor], 'unitless' ) else: - raise RuntimeError( - f'Currently, Aircraft.Design.TYPE must be either 0 or 3 not {design_type[0]}.' + 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.CrewPayload.BAGGAGE_MASS_PER_PASSENGER not in input_values: From 0001e39c3b35b0bc22b31372922e9416c2c95dc4 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 11 Feb 2026 17:40:04 -0500 Subject: [PATCH 73/76] If FWMAX is negative, set FWMAX = 23 --- aviary/utils/fortran_to_aviary.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/aviary/utils/fortran_to_aviary.py b/aviary/utils/fortran_to_aviary.py index caa39212a..485e18ee8 100644 --- a/aviary/utils/fortran_to_aviary.py +++ b/aviary/utils/fortran_to_aviary.py @@ -906,6 +906,8 @@ def update_flops_options(vehicle_data, verbosity=Verbosity.BRIEF): 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] + 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: From 2d0f0018f52dd8206dc0129a1c436c0e1ab0a3d6 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Wed, 11 Feb 2026 22:54:49 -0500 Subject: [PATCH 74/76] allow some data from TOLIN block when runnig fortran_to_aviary --- .../data/converter_test_advanced_single_aisle_FLOPS.csv | 5 ++--- aviary/variable_info/variable_meta_data.py | 6 +++--- 2 files changed, 5 insertions(+), 6 deletions(-) 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 d4a0c6ff1..9496ab392 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 @@ -154,6 +154,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 @@ -161,6 +162,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 @@ -345,15 +347,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/variable_info/variable_meta_data.py b/aviary/variable_info/variable_meta_data.py index a576afd65..f6c76eb2b 100644 --- a/aviary/variable_info/variable_meta_data.py +++ b/aviary/variable_info/variable_meta_data.py @@ -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', From 8132d8a43d7adb7667cca97defd07ee6627b49ab Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Fri, 13 Feb 2026 11:22:01 -0500 Subject: [PATCH 75/76] update fortran_to_aviary and preprocessors due to new data set of BWB300_baseline --- aviary/utils/fortran_to_aviary.py | 67 ++++++++++++++----- aviary/utils/preprocessors.py | 49 ++++++++++---- .../converter_test_BWB_detailed_FLOPS.csv | 5 +- .../data/converter_test_BWB_simple_FLOPS.csv | 5 +- ...erter_test_advanced_single_aisle_FLOPS.csv | 1 - 5 files changed, 94 insertions(+), 33 deletions(-) diff --git a/aviary/utils/fortran_to_aviary.py b/aviary/utils/fortran_to_aviary.py index 485e18ee8..8297a3419 100644 --- a/aviary/utils/fortran_to_aviary.py +++ b/aviary/utils/fortran_to_aviary.py @@ -1045,23 +1045,6 @@ def update_flops_options(vehicle_data, verbosity=Verbosity.BRIEF): f'the target file uses IFITE = {design_type[0]} .' ) - if Aircraft.CrewPayload.BAGGAGE_MASS_PER_PASSENGER not in input_values: - if Mission.Design.RANGE in input_values: - design_range = input_values.get_val(Mission.Design.RANGE, 'nmi')[0] - baggage_per_pax = 35.0 - if design_range > 2900: - baggage_per_pax = 44.0 - elif design_range > 900: - baggage_per_pax = 40.0 - input_values.set_val( - Aircraft.CrewPayload.BAGGAGE_MASS_PER_PASSENGER, [baggage_per_pax], 'lbm' - ) - if verbosity >= Verbosity.BRIEF: - print( - 'Set Aircraft.CrewPayload.BAGGAGE_MASS_PER_PASSENGER to : ' - f'FLOPS specific assumption {baggage_per_pax}' - ) - if ( Aircraft.HorizontalTail.THICKNESS_TO_CHORD not in input_values or input_values.get_val(Aircraft.HorizontalTail.THICKNESS_TO_CHORD, 'unitless')[0] == 0 @@ -1087,14 +1070,62 @@ def update_flops_options(vehicle_data, verbosity=Verbosity.BRIEF): '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'), - (Aircraft.HorizontalTail.SWEEP, 'deg'), ] for var in rem_list: try: diff --git a/aviary/utils/preprocessors.py b/aviary/utils/preprocessors.py index cc0c6fd49..6ff0bab0d 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 @@ -403,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: @@ -417,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: @@ -451,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) < 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, @@ -468,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 diff --git a/aviary/utils/test/data/converter_test_BWB_detailed_FLOPS.csv b/aviary/utils/test/data/converter_test_BWB_detailed_FLOPS.csv index 4ae11ada3..d74f7d040 100644 --- a/aviary/utils/test/data/converter_test_BWB_detailed_FLOPS.csv +++ b/aviary/utils/test/data/converter_test_BWB_detailed_FLOPS.csv @@ -4,7 +4,6 @@ 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:baggage_mass_per_passenger,44.0,lbm 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 @@ -48,6 +47,7 @@ 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 @@ -57,8 +57,11 @@ 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 diff --git a/aviary/utils/test/data/converter_test_BWB_simple_FLOPS.csv b/aviary/utils/test/data/converter_test_BWB_simple_FLOPS.csv index 4b18d7c1a..562aeb515 100644 --- a/aviary/utils/test/data/converter_test_BWB_simple_FLOPS.csv +++ b/aviary/utils/test/data/converter_test_BWB_simple_FLOPS.csv @@ -4,7 +4,6 @@ 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:baggage_mass_per_passenger,44.0,lbm 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 @@ -50,6 +49,7 @@ 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 @@ -59,8 +59,11 @@ 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 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 9496ab392..f5c32de76 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,6 @@ 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 From b2345e19e5d156758db9f342c9948344e09045b1 Mon Sep 17 00:00:00 2001 From: Xun Jiang Date: Fri, 13 Feb 2026 12:18:19 -0500 Subject: [PATCH 76/76] minor update --- aviary/utils/preprocessors.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/aviary/utils/preprocessors.py b/aviary/utils/preprocessors.py index 6ff0bab0d..ce75f111d 100644 --- a/aviary/utils/preprocessors.py +++ b/aviary/utils/preprocessors.py @@ -457,7 +457,7 @@ def preprocess_crewpayload(aviary_options: AviaryValues, meta_data=_MetaData, ve if ( Aircraft.CrewPayload.BAGGAGE_MASS_PER_PASSENGER not in aviary_options - or aviary_options.get_val(Mission.Design.RANGE) < 0.0 + or aviary_options.get_val(Mission.Design.RANGE, 'nmi') < 0.0 ): baggage_mass_per_pax = 35.0 if Mission.Design.RANGE in aviary_options: