def test(): for config in configs: aircraft = OnDemandAircraft() aircraft = aircraft.standard_substitutions( config=config, autonomousEnabled=generic_data["autonomousEnabled"]) sizing_mission = OnDemandSizingMission(aircraft=aircraft) sizing_mission = sizing_mission.standard_substitutions( piloted=generic_data["isSizingMissionPiloted"], reserve=generic_data["reserve"]) revenue_mission = OnDemandRevenueMission(aircraft=aircraft) revenue_mission = revenue_mission.standard_substitutions( piloted=generic_data["isRevenueMissionPiloted"]) deadhead_mission = OnDemandDeadheadMission(aircraft=aircraft) deadhead_mission = deadhead_mission.standard_substitutions( piloted=generic_data["isDeadheadMissionPiloted"]) mission_cost = OnDemandMissionCost(aircraft=aircraft, revenue_mission=revenue_mission, deadhead_mission=deadhead_mission) mission_cost = mission_cost.standard_substitutions( isRevenueMissionPiloted=generic_data["isRevenueMissionPiloted"], isDeadheadMissionPiloted=generic_data["isDeadheadMissionPiloted"]) objective_function = mission_cost.cpt problem = Model(objective_function, [ aircraft, sizing_mission, revenue_mission, deadhead_mission, mission_cost ]) solution = problem.solve(verbosity=0)
print "Solving configuration: " + config c = configs[config] configs[config]["TOGW"] = np.zeros(np.size(sizing_N_passengers_array)) configs[config]["W_{battery}"] = np.zeros(np.size(sizing_N_passengers_array)) configs[config]["cost_per_trip_per_passenger"] = np.zeros(np.size(sizing_N_passengers_array)) configs[config]["SPL_A"] = np.zeros(np.size(sizing_N_passengers_array)) for i,sizing_N_passengers in enumerate(sizing_N_passengers_array): revenue_N_passengers = revenue_N_passengers_array[i] problem_subDict = {} Aircraft = OnDemandAircraft(autonomousEnabled=generic_data["autonomousEnabled"]) problem_subDict.update({ Aircraft.L_D_cruise: c["L/D"], #estimated L/D in cruise Aircraft.eta_cruise: generic_data["\eta_{cruise}"], #propulsive efficiency in cruise Aircraft.tailRotor_power_fraction_hover: c["tailRotor_power_fraction_hover"], Aircraft.tailRotor_power_fraction_levelFlight: c["tailRotor_power_fraction_levelFlight"], Aircraft.cost_per_weight: generic_data["vehicle_cost_per_weight"], #vehicle cost per unit empty weight Aircraft.battery.C_m: generic_data["C_m"], #battery energy density Aircraft.battery.cost_per_C: generic_data["battery_cost_per_C"], #battery cost per unit energy capacity Aircraft.rotors.N: c["N"], #number of propellers Aircraft.rotors.Cl_mean_max: c["Cl_{mean_{max}}"], #maximum allowed mean lift coefficient Aircraft.structure.weight_fraction: c["weight_fraction"], #empty weight fraction Aircraft.electricalSystem.eta: generic_data["\eta_{electric}"], #electrical system efficiency }) SizingMission = OnDemandSizingMission(Aircraft,mission_type=generic_data["sizing_mission"]["type"],
V_cruise = c["V_{cruise}"] L_D_cruise = c["L/D"] T_A = c["T/A"] loiter_type = c["loiter_type"] tailRotor_power_fraction_hover = c["tailRotor_power_fraction_hover"] tailRotor_power_fraction_levelFlight = c["tailRotor_power_fraction_levelFlight"] weight_fraction = c["weight_fraction"] N = c["N"] B = c["B"] s = c["s"] t_c = c["t_c"] Cl_mean_max = c["Cl_{mean_{max}}"] Aircraft = OnDemandAircraft(N=N,L_D_cruise=L_D_cruise,eta_cruise=eta_cruise,C_m=C_m, Cl_mean_max=Cl_mean_max,weight_fraction=weight_fraction,s=s,n=n,eta_electric=eta_electric, cost_per_weight=vehicle_cost_per_weight,cost_per_C=battery_cost_per_C, autonomousEnabled=autonomousEnabled) SizingMission = OnDemandSizingMission(Aircraft,mission_range=sizing_mission_range, V_cruise=V_cruise,N_passengers=sizing_N_passengers,t_hover=sizing_t_hover, reserve_type=reserve_type,mission_type=sizing_mission_type,loiter_type=loiter_type, tailRotor_power_fraction_hover=tailRotor_power_fraction_hover, tailRotor_power_fraction_levelFlight=tailRotor_power_fraction_levelFlight) SizingMission.substitutions.update({SizingMission.fs0.topvar("T/A"):T_A}) RevenueMission = OnDemandRevenueMission(Aircraft,mission_range=revenue_mission_range, V_cruise=V_cruise,N_passengers=revenue_N_passengers,t_hover=revenue_t_hover, charger_power=charger_power,mission_type=revenue_mission_type, tailRotor_power_fraction_hover=tailRotor_power_fraction_hover, tailRotor_power_fraction_levelFlight=tailRotor_power_fraction_levelFlight)
mission_range = np.linspace(2, 36, num_pts) * ureg.nautical_mile elif (config == "Coaxial heli"): mission_range = np.linspace(1, 49, num_pts) * ureg.nautical_mile elif (config == "Compound heli"): mission_range = np.linspace(10, 82, num_pts) * ureg.nautical_mile elif (config == "Lift + cruise"): mission_range = np.linspace(10, 85, num_pts) * ureg.nautical_mile elif (config == "Tilt wing"): mission_range = np.linspace(15, 98, num_pts) * ureg.nautical_mile elif (config == "Tilt rotor"): mission_range = np.linspace(15, 110, num_pts) * ureg.nautical_mile c = configs[config] c["SPL_sizing_A"] = np.zeros(np.size(mission_range)) aircraft = OnDemandAircraft() aircraft = aircraft.standard_substitutions(config=config, autonomousEnabled=generic_data["autonomousEnabled"]) sizing_mission = OnDemandSizingMission(aircraft=aircraft) sizing_mission = sizing_mission.standard_substitutions(piloted=generic_data["isSizingMissionPiloted"], reserve=generic_data["reserve"]) sizing_mission.substitutions.update({ sizing_mission.cruise_segment.d_segment: ("sweep", mission_range.to(ureg.km).magnitude), # Careful with units here }) revenue_mission = OnDemandRevenueMission(aircraft=aircraft) revenue_mission = revenue_mission.standard_substitutions(piloted=generic_data["isRevenueMissionPiloted"]) deadhead_mission = OnDemandDeadheadMission(aircraft=aircraft) deadhead_mission = deadhead_mission.standard_substitutions(piloted=generic_data["isDeadheadMissionPiloted"])
del configs["Tilt duct"] del configs["Helicopter"] del configs["Coaxial heli"] #Optimize remaining configurations for config in configs: print "Solving configuration: " + config for time_frame in configs[config]: c = configs[config][time_frame] problem_subDict = {} Aircraft = OnDemandAircraft(autonomousEnabled=time_frame_data[time_frame]["autonomousEnabled"]) problem_subDict.update({ Aircraft.L_D_cruise: c["L/D"], #estimated L/D in cruise Aircraft.eta_cruise: generic_data["\eta_{cruise}"], #propulsive efficiency in cruise Aircraft.tailRotor_power_fraction_hover: c["tailRotor_power_fraction_hover"], Aircraft.tailRotor_power_fraction_levelFlight: c["tailRotor_power_fraction_levelFlight"], Aircraft.cost_per_weight: time_frame_data[time_frame]["vehicle_cost_per_weight"], #vehicle cost per unit empty weight Aircraft.battery.C_m: time_frame_data[time_frame]["C_m"], #battery energy density Aircraft.battery.cost_per_C: time_frame_data[time_frame]["battery_cost_per_C"], #battery cost per unit energy capacity Aircraft.rotors.N: c["N"], #number of propellers Aircraft.rotors.Cl_mean_max: c["Cl_{mean_{max}}"], #maximum allowed mean lift coefficient Aircraft.structure.weight_fraction: c["weight_fraction"], #empty weight fraction Aircraft.electricalSystem.eta: generic_data["\eta_{electric}"], #electrical system efficiency }) SizingMission = OnDemandSizingMission(Aircraft,mission_type=time_frame_data[time_frame]["sizing_mission_type"],
def test(generic_data, configuration_data, config): configs = configuration_data.copy() c = configs[config] problem_subDict = {} Aircraft = OnDemandAircraft( autonomousEnabled=generic_data["autonomousEnabled"]) problem_subDict.update({ Aircraft.L_D_cruise: c["L/D"], #estimated L/D in cruise Aircraft.eta_cruise: generic_data["\eta_{cruise}"], #propulsive efficiency in cruise Aircraft.tailRotor_power_fraction_hover: c["tailRotor_power_fraction_hover"], Aircraft.tailRotor_power_fraction_levelFlight: c["tailRotor_power_fraction_levelFlight"], Aircraft.cost_per_weight: generic_data[ "vehicle_cost_per_weight"], #vehicle cost per unit empty weight Aircraft.battery.C_m: generic_data["C_m"], #battery energy density Aircraft.battery.cost_per_C: generic_data[ "battery_cost_per_C"], #battery cost per unit energy capacity Aircraft.rotors.N: c["N"], #number of propellers Aircraft.rotors.Cl_mean_max: c["Cl_{mean_{max}}"], #maximum allowed mean lift coefficient Aircraft.structure.weight_fraction: c["weight_fraction"], #empty weight fraction Aircraft.electricalSystem.eta: generic_data["\eta_{electric}"], #electrical system efficiency }) SizingMission = OnDemandSizingMission( Aircraft, mission_type=generic_data["sizing_mission"]["type"], reserve_type=generic_data["reserve_type"]) problem_subDict.update({ SizingMission.mission_range: generic_data["sizing_mission"]["range"], #mission range SizingMission.V_cruise: c["V_{cruise}"], #cruising speed SizingMission.t_hover: generic_data["sizing_mission"]["t_{hover}"], #hover time SizingMission.T_A: c["T/A"], #disk loading SizingMission.passengers.N_passengers: generic_data["sizing_mission"]["N_passengers"], #Number of passengers }) RevenueMission = OnDemandRevenueMission( Aircraft, mission_type=generic_data["revenue_mission"]["type"]) problem_subDict.update({ RevenueMission.mission_range: generic_data["revenue_mission"]["range"], #mission range RevenueMission.V_cruise: c["V_{cruise}"], #cruising speed RevenueMission.t_hover: generic_data["revenue_mission"]["t_{hover}"], #hover time RevenueMission.passengers.N_passengers: generic_data["revenue_mission"]["N_passengers"], #Number of passengers RevenueMission.time_on_ground.charger_power: generic_data["charger_power"], #Charger power }) DeadheadMission = OnDemandDeadheadMission( Aircraft, mission_type=generic_data["deadhead_mission"]["type"]) problem_subDict.update({ DeadheadMission.mission_range: generic_data["deadhead_mission"]["range"], #mission range DeadheadMission.V_cruise: c["V_{cruise}"], #cruising speed DeadheadMission.t_hover: generic_data["deadhead_mission"]["t_{hover}"], #hover time DeadheadMission.passengers.N_passengers: generic_data["deadhead_mission"] ["N_passengers"], #Number of passengers DeadheadMission.time_on_ground.charger_power: generic_data["charger_power"], #Charger power }) MissionCost = OnDemandMissionCost(Aircraft, RevenueMission, DeadheadMission) problem_subDict.update({ MissionCost.revenue_mission_costs.operating_expenses.pilot_cost.wrap_rate: generic_data["pilot_wrap_rate"], #pilot wrap rate MissionCost.revenue_mission_costs.operating_expenses.maintenance_cost.wrap_rate: generic_data["mechanic_wrap_rate"], #mechanic wrap rate MissionCost.revenue_mission_costs.operating_expenses.maintenance_cost.MMH_FH: generic_data["MMH_FH"], #maintenance man-hours per flight hour MissionCost.deadhead_mission_costs.operating_expenses.pilot_cost.wrap_rate: generic_data["pilot_wrap_rate"], #pilot wrap rate MissionCost.deadhead_mission_costs.operating_expenses.maintenance_cost.wrap_rate: generic_data["mechanic_wrap_rate"], #mechanic wrap rate MissionCost.deadhead_mission_costs.operating_expenses.maintenance_cost.MMH_FH: generic_data["MMH_FH"], #maintenance man-hours per flight hour MissionCost.deadhead_ratio: generic_data["deadhead_ratio"], #deadhead ratio #MissionCost.NdNr: 0.25, }) problem = Model(MissionCost["cost_per_trip"], [ Aircraft, SizingMission, RevenueMission, DeadheadMission, MissionCost ]) #problem = Model(Aircraft["TOGW"],[Aircraft, SizingMission]) problem.substitutions.update(problem_subDict) try: solution = problem.solve(verbosity=0) return solution except: return problem
constraints += [W_mission == c.performance.W for c in flight_segments] constraints += [ W_mission >= W_noPassengersOrCrew + sum(c.W for c in payload) ] constraints += [MTOW >= W_mission] constraints += [ E_mission >= sum(c.performance.battery_perf.E for c in flight_segments) ] constraints += [E_eff >= E_mission] return constraints if __name__ == "__main__": aircraft = OnDemandAircraft() aircraft = aircraft.standard_substitutions(config="Lift + cruise", autonomousEnabled=True) sizing_mission = OnDemandSizingMission(aircraft=aircraft) sizing_mission = sizing_mission.standard_substitutions( piloted=True, reserve="20-minute loiter") objective_function = aircraft.MTOM problem = Model(objective_function, [aircraft, sizing_mission]) solution = problem.solve(verbosity=0) # print solution.table()
] return constraints if __name__ == "__main__": #Concept representative analysis # from noise_models import rotational_noise, vortex_noise, noise_weighting #String inputs # reserve_type="FAA_heli" # sizing_mission_type="piloted" aircraft = OnDemandAircraft() aircraft = aircraft.standard_substitutions(config="Compound heli", autonomousEnabled=True) sizing_mission = OnDemandSizingMission(aircraft=aircraft) sizing_mission = sizing_mission.standard_substitutions( piloted=True, reserve="20-minute loiter") revenue_mission = OnDemandRevenueMission(aircraft=aircraft) revenue_mission = revenue_mission.standard_substitutions(piloted=True) deadhead_mission = OnDemandDeadheadMission(aircraft=aircraft) deadhead_mission = deadhead_mission.standard_substitutions(piloted=False) mission_cost = OnDemandMissionCost(aircraft=aircraft, revenue_mission=revenue_mission,