def test_mass_gain(battery, power): print(battery) mass_gain = find_total_mass_gain(battery) print('mass_gain=', mass_gain) mdot = find_mass_gain_rate(battery, power) print('mass_gain_rate=', mdot) return
def test_mass_gain(battery, power): print battery mass_gain = find_total_mass_gain(battery) print 'mass_gain=', mass_gain mdot = find_mass_gain_rate(battery, power) print 'mass_gain_rate=', mdot return
def test_mass_gain(battery,power): print battery mass_gain =find_total_mass_gain(battery) print 'mass_gain=', mass_gain mdot =find_mass_gain_rate(battery,power) print 'mass_gain_rate=', mdot return
def test_mass_gain(battery,power): print(battery) mass_gain =find_total_mass_gain(battery) print('mass_gain=', mass_gain) mdot =find_mass_gain_rate(battery,power) print('mass_gain_rate=', mdot) return
def evaluate_thrust(self,state): # unpack propulsor = self.propulsor battery = self.battery conditions = state.conditions numerics = state.numerics results=propulsor.evaluate_thrust(state) Pe =results.thrust_force_vector[:,0]*conditions.freestream.velocity try: initial_energy=conditions.propulsion.battery_energy if initial_energy[0][0]==0: #beginning of segment; initialize battery battery.current_energy=battery.current_energy[-1]*np.ones_like(initial_energy) except AttributeError: #battery energy not initialized, e.g. in takeoff battery.current_energy=battery.current_energy[-1]*np.ones_like(F) pbat=-Pe/self.motor_efficiency battery_logic = Data() battery_logic.power_in = pbat battery_logic.current = 90. #use 90 amps as a default for now; will change this for higher fidelity methods battery.inputs =battery_logic battery.inputs.power_in=pbat tol = 1e-6 battery.energy_calc(numerics) #allow for mass gaining batteries try: mdot=find_mass_gain_rate(battery,-(pbat-battery.resistive_losses)) except AttributeError: mdot=np.zeros_like(F) #Pack the conditions for outputs battery_draw = battery.inputs.power_in battery_energy = battery.current_energy conditions.propulsion.battery_draw = battery_draw conditions.propulsion.battery_energy = battery_energy output_power= battery_draw #number_of_engines #Create the outputs results.vehicle_mass_rate = mdot return results
def evaluate_thrust(self, state): # unpack propulsor = self.propulsor battery = self.battery conditions = state.conditions numerics = state.numerics results = propulsor.evaluate_thrust(state) Pe = results.thrust_force_vector[:, 0] * conditions.freestream.velocity try: initial_energy = conditions.propulsion.battery_energy if initial_energy[0][ 0] == 0: #beginning of segment; initialize battery battery.current_energy = battery.current_energy[ -1] * np.ones_like(initial_energy) except AttributeError: #battery energy not initialized, e.g. in takeoff battery.current_energy = battery.current_energy[-1] * np.ones_like( F) pbat = -Pe / self.motor_efficiency battery_logic = Data() battery_logic.power_in = pbat battery_logic.current = 90. #use 90 amps as a default for now; will change this for higher fidelity methods battery.inputs = battery_logic battery.inputs.power_in = pbat tol = 1e-6 battery.energy_calc(numerics) #allow for mass gaining batteries try: mdot = find_mass_gain_rate(battery, -(pbat - battery.resistive_losses)) except AttributeError: mdot = np.zeros_like(F) #Pack the conditions for outputs battery_draw = battery.inputs.power_in battery_energy = battery.current_energy conditions.propulsion.battery_draw = battery_draw conditions.propulsion.battery_energy = battery_energy output_power = battery_draw #number_of_engines #Create the outputs results.vehicle_mass_rate = mdot return results
def evaluate_thrust(self, state): """ Calculate thrust given the current state of the vehicle Assumptions: None Source: N/A Inputs: state [state()] Outputs: results.thrust_force_vector [newtons] results.vehicle_mass_rate [kg/s] Properties Used: Defaulted values """ # unpack propulsor = self.propulsor battery = self.battery conditions = state.conditions numerics = state.numerics results = propulsor.evaluate_thrust(state) Pe = np.multiply(results.thrust_force_vector[:, 0], conditions.freestream.velocity[0]) try: initial_energy = conditions.propulsion.battery_energy if initial_energy[0][ 0] == 0: #beginning of segment; initialize battery battery.current_energy = battery.current_energy[ -1] * np.ones_like(initial_energy) except AttributeError: #battery energy not initialized, e.g. in takeoff battery.current_energy = np.transpose( np.array([battery.current_energy[-1] * np.ones_like(Pe)])) pbat = -Pe / self.motor_efficiency battery_logic = Data() battery_logic.power_in = pbat battery_logic.current = 90. #use 90 amps as a default for now; will change this for higher fidelity methods battery.inputs = battery_logic tol = 1e-6 battery.energy_calc(numerics) #allow for mass gaining batteries try: mdot = find_mass_gain_rate( battery, -(pbat - battery.resistive_losses)) #put in transpose for solver except AttributeError: mdot = np.zeros_like(results.thrust_force_vector[:, 0]) mdot = np.reshape(mdot, np.shape(conditions.freestream.velocity)) #Pack the conditions for outputs battery_draw = battery.inputs.power_in battery_energy = battery.current_energy conditions.propulsion.battery_draw = battery_draw conditions.propulsion.battery_energy = battery_energy results.vehicle_mass_rate = mdot return results
def evaluate_thrust(self,state): """ Calculate thrust given the current state of the vehicle Assumptions: None Source: N/A Inputs: state [state()] Outputs: results.thrust_force_vector [newtons] results.vehicle_mass_rate [kg/s] Properties Used: Defaulted values """ # unpack propulsor = self.propulsor battery = self.battery conditions = state.conditions numerics = state.numerics results = propulsor.evaluate_thrust(state) Pe = np.multiply(results.thrust_force_vector[:,0],conditions.freestream.velocity[0]) try: initial_energy = conditions.propulsion.battery_energy if initial_energy[0][0]==0: #beginning of segment; initialize battery battery.current_energy = battery.current_energy[-1]*np.ones_like(initial_energy) except AttributeError: #battery energy not initialized, e.g. in takeoff battery.current_energy=np.transpose(np.array([battery.current_energy[-1]*np.ones_like(Pe)])) pbat = -Pe/self.motor_efficiency battery_logic = Data() battery_logic.power_in = pbat battery_logic.current = 90. #use 90 amps as a default for now; will change this for higher fidelity methods battery.inputs = battery_logic tol = 1e-6 battery.energy_calc(numerics) #allow for mass gaining batteries try: mdot=find_mass_gain_rate(battery,-(pbat-battery.resistive_losses)) #put in transpose for solver except AttributeError: mdot=np.zeros_like(results.thrust_force_vector[:,0]) mdot=np.reshape(mdot, np.shape(conditions.freestream.velocity)) #Pack the conditions for outputs battery_draw = battery.inputs.power_in battery_energy = battery.current_energy conditions.propulsion.battery_draw = battery_draw conditions.propulsion.battery_energy = battery_energy results.vehicle_mass_rate = mdot return results
def evaluate_thrust(self,state): # unpack propulsor = self.propulsor primary_battery = self.primary_battery auxiliary_battery = self.auxiliary_battery conditions = state.conditions numerics = state.numerics results=propulsor.evaluate_thrust(state) Pe =results.power try: initial_energy = conditions.propulsion.primary_battery_energy initial_energy_auxiliary = conditions.propulsion.auxiliary_battery_energy if initial_energy[0][0]==0: #beginning of segment; initialize battery primary_battery.current_energy = primary_battery.current_energy[-1]*np.ones_like(initial_energy) auxiliary_battery.current_energy = auxiliary_battery.current_energy[-1]*np.ones_like(initial_energy) except AttributeError: #battery energy not initialized, e.g. in takeoff primary_battery.current_energy = np.transpose(np.array([primary_battery.current_energy[-1]*np.ones_like(Pe)])) auxiliary_battery.current_energy = np.transpose(np.array([auxiliary_battery.current_energy[-1]*np.ones_like(Pe)])) pbat=-Pe/self.motor_efficiency pbat_primary=copy.copy(pbat) #prevent deep copy nonsense pbat_auxiliary=np.zeros_like(pbat) #print 'pbat=', pbat/10**6. #print 'max_power prim=', primary_battery.max_power/10**6. #print 'max_power aux=', auxiliary_battery.max_power/10**6. for i in range(len(pbat)): if pbat[i]<-primary_battery.max_power: #limit power output of primary_battery pbat_primary[i] = -primary_battery.max_power #-power means discharge pbat_auxiliary[i] = pbat[i]-pbat_primary[i] elif pbat[i]>primary_battery.max_power: #limit charging rate of battery pbat_primary[i] = primary_battery.max_power pbat_auxiliary[i] = pbat[i]-pbat_primary[i] if pbat_primary[i]>0: #don't allow non-rechargable battery to charge pbat_primary[i] = 0 pbat_auxiliary[i] = pbat[i] primary_battery_logic = Data() primary_battery_logic.power_in = pbat_primary primary_battery_logic.current = 90. #use 90 amps as a default for now; will change this for higher fidelity methods auxiliary_battery_logic = copy.copy(primary_battery_logic) auxiliary_battery_logic.power_in = pbat_auxiliary primary_battery.inputs = primary_battery_logic auxiliary_battery.inputs = auxiliary_battery_logic tol = 1e-6 primary_battery.energy_calc(numerics) auxiliary_battery.energy_calc(numerics) #allow for mass gaining batteries try: mdot_primary = find_mass_gain_rate(primary_battery,-(pbat_primary-primary_battery.resistive_losses)) except AttributeError: mdot_primary = np.zeros_like(results.thrust_force_vector[:,0]) try: mdot_auxiliary = find_mass_gain_rate(auxiliary_battery,-(pbat_auxiliary-auxiliary_battery.resistive_losses)) except AttributeError: mdot_auxiliary = np.zeros_like(results.thrust_force_vector[:,0]) mdot=mdot_primary+mdot_auxiliary mdot=np.reshape(mdot, np.shape(conditions.freestream.velocity)) #Pack the conditions for outputs primary_battery_draw = primary_battery.inputs.power_in primary_battery_energy = primary_battery.current_energy auxiliary_battery_draw = auxiliary_battery.inputs.power_in auxiliary_battery_energy = auxiliary_battery.current_energy conditions.propulsion.primary_battery_draw = primary_battery_draw conditions.propulsion.primary_battery_energy = primary_battery_energy conditions.propulsion.auxiliary_battery_draw = auxiliary_battery_draw conditions.propulsion.auxiliary_battery_energy = auxiliary_battery_energy results.vehicle_mass_rate = mdot #from SUAVE.Core import Units #print 'primary power=',primary_battery_draw/Units.MJ #print 'aux power=',auxiliary_battery_draw/Units.MJ return results
def evaluate_thrust(self,state): """ Calculate thrust given the current state of the vehicle Assumptions: None Source: N/A Inputs: state [state()] Outputs: results.thrust_force_vector [newtons] results.vehicle_mass_rate [kg/s] conditions.propulsion.primary_battery_draw [watts] conditions.propulsion.primary_battery_energy [joules] conditions.propulsion.auxiliary_battery_draw [watts] conditions.propulsion.auxiliary_battery_energy [joules] Properties Used: Defaulted values """ # unpack propulsor = self.propulsor primary_battery = self.primary_battery auxiliary_battery = self.auxiliary_battery conditions = state.conditions numerics = state.numerics results=propulsor.evaluate_thrust(state) Pe=results.power try: initial_energy = conditions.propulsion.primary_battery_energy initial_energy_auxiliary = conditions.propulsion.auxiliary_battery_energy if initial_energy[0][0]==0: #beginning of segment; initialize battery primary_battery.current_energy = primary_battery.current_energy[-1]*np.ones_like(initial_energy) auxiliary_battery.current_energy = auxiliary_battery.current_energy[-1]*np.ones_like(initial_energy) except AttributeError: #battery energy not initialized, e.g. in takeoff primary_battery.current_energy = np.transpose(np.array([primary_battery.current_energy[-1]*np.ones_like(Pe)])) auxiliary_battery.current_energy = np.transpose(np.array([auxiliary_battery.current_energy[-1]*np.ones_like(Pe)])) pbat=-Pe/self.motor_efficiency pbat_primary=copy.copy(pbat) #prevent deep copy nonsense pbat_auxiliary=np.zeros_like(pbat) for i in range(len(pbat)): if pbat[i]<-primary_battery.max_power: #limit power output of primary_battery pbat_primary[i] = -primary_battery.max_power #-power means discharge pbat_auxiliary[i] = pbat[i]-pbat_primary[i] elif pbat[i]>primary_battery.max_power: #limit charging rate of battery pbat_primary[i] = primary_battery.max_power pbat_auxiliary[i] = pbat[i]-pbat_primary[i] if pbat_primary[i]>0: #don't allow non-rechargable battery to charge pbat_primary[i] = 0 pbat_auxiliary[i] = pbat[i] primary_battery_logic = Data() primary_battery_logic.power_in = pbat_primary primary_battery_logic.current = 90. #use 90 amps as a default for now; will change this for higher fidelity methods auxiliary_battery_logic = copy.copy(primary_battery_logic) auxiliary_battery_logic.power_in = pbat_auxiliary primary_battery.inputs = primary_battery_logic auxiliary_battery.inputs = auxiliary_battery_logic tol = 1e-6 primary_battery.energy_calc(numerics) auxiliary_battery.energy_calc(numerics) #allow for mass gaining batteries try: mdot_primary = find_mass_gain_rate(primary_battery,-(pbat_primary-primary_battery.resistive_losses)) except AttributeError: mdot_primary = np.zeros_like(results.thrust_force_vector[:,0]) try: mdot_auxiliary = find_mass_gain_rate(auxiliary_battery,-(pbat_auxiliary-auxiliary_battery.resistive_losses)) except AttributeError: mdot_auxiliary = np.zeros_like(results.thrust_force_vector[:,0]) mdot=mdot_primary+mdot_auxiliary mdot=np.reshape(mdot, np.shape(conditions.freestream.velocity)) #Pack the conditions for outputs primary_battery_draw = primary_battery.inputs.power_in primary_battery_energy = primary_battery.current_energy auxiliary_battery_draw = auxiliary_battery.inputs.power_in auxiliary_battery_energy = auxiliary_battery.current_energy conditions.propulsion.primary_battery_draw = primary_battery_draw conditions.propulsion.primary_battery_energy = primary_battery_energy conditions.propulsion.auxiliary_battery_draw = auxiliary_battery_draw conditions.propulsion.auxiliary_battery_energy = auxiliary_battery_energy results.vehicle_mass_rate = mdot return results
def simple_sizing(interface, Ereq, Preq): from SUAVE.Methods.Geometry.Two_Dimensional.Planform import wing_planform # unpack configs = interface.configs analyses = interface.analyses airport=interface.analyses.missions.base.airport atmo = airport.atmosphere mission=interface.analyses.missions.base.segments base = configs.base base.pull_base() base = configs.base base.pull_base() Vcruise=mission['cruise'].air_speed design_thrust=Preq*1.3/Vcruise; #approximate sealevel thrust of ducted fan #determine geometry of fuselage as well as wings fuselage=base.fuselages['fuselage'] SUAVE.Methods.Geometry.Two_Dimensional.Planform.fuselage_planform(fuselage) fuselage.areas.side_projected = fuselage.heights.maximum*fuselage.lengths.cabin*1.1 # Not correct c_vt =.08 c_ht =.6 w2v =8.54 w2h =8.54 base.wings['main_wing'] = wing_planform(base.wings['main_wing']) SUAVE.Methods.Geometry.Two_Dimensional.Planform.vertical_tail_planform_raymer(base.wings['vertical_stabilizer'],base.wings['main_wing'], w2v, c_vt) SUAVE.Methods.Geometry.Two_Dimensional.Planform.horizontal_tail_planform_raymer(base.wings['horizontal_stabilizer'],base.wings['main_wing'], w2h, c_ht) base.wings['horizontal_stabilizer'] = wing_planform(base.wings['horizontal_stabilizer']) base.wings['vertical_stabilizer'] = wing_planform(base.wings['vertical_stabilizer']) # wing areas for wing in base.wings: wing.areas.wetted = 2.00 * wing.areas.reference wing.areas.affected = 0.60 * wing.areas.reference wing.areas.exposed = 0.75 * wing.areas.wetted battery=base.energy_network['battery'] ducted_fan=base.propulsors['ducted_fan'] #SUAVE.Methods.Power.Battery.Sizing.initialize_from_energy_and_power(battery,Ereq,Preq) battery.mass_properties.mass = Ereq/battery.specific_energy battery.max_energy=Ereq battery.max_power =Preq battery.current_energy=[battery.max_energy] #initialize list of current energy from SUAVE.Methods.Power.Battery.Variable_Mass import find_mass_gain_rate m_air =-find_mass_gain_rate(battery,Ereq) #normally uses power as input to find mdot, but can use E to find m m_water =battery.find_water_mass(Ereq) #now add the electric motor weight motor_mass=ducted_fan.number_of_engines*SUAVE.Methods.Weights.Correlations.Propulsion.air_cooled_motor((Preq)*Units.watts/ducted_fan.number_of_engines) propulsion_mass=SUAVE.Methods.Weights.Correlations.Propulsion.integrated_propulsion(motor_mass/ducted_fan.number_of_engines,ducted_fan.number_of_engines) #more geometry sizing of ducted fan cruise_altitude= mission['climb_3'].altitude_end conditions = atmo.compute_values(cruise_altitude) sizing_segment = SUAVE.Components.Propulsors.Segments.Segment() sizing_segment.M = mission['cruise'].air_speed/conditions.speed_of_sound sizing_segment.alt = cruise_altitude sizing_segment.T = conditions.temperature sizing_segment.p = conditions.pressure ducted_fan.design_thrust =design_thrust ducted_fan.mass_properties.mass=propulsion_mass ducted_fan.engine_sizing_ducted_fan(sizing_segment) #compute overall mass properties breakdown = analyses.configs.base.weights.evaluate() breakdown.battery=battery.mass_properties.mass breakdown.water =m_water breakdown.air =m_air base.mass_properties.breakdown=breakdown #print breakdown m_fuel=0. base.mass_properties.operating_empty = breakdown.empty #weight =SUAVE.Methods.Weights.Correlations.Tube_Wing.empty_custom_eng(vehicle, ducted_fan) m_full=breakdown.empty+battery.mass_properties.mass+breakdown.payload+m_water m_end=m_full+m_air base.mass_properties.takeoff = m_full base.store_diff() # Update all configs with new base data for config in configs: config.pull_base() ############################################################################## # ------------------------------------------------------------------ # Define Landing Configurations # ------------------------------------------------------------------ landing_config=configs.landing landing_config.wings['main_wing'].flaps.angle = 50. * Units.deg landing_config.wings['main_wing'].slats.angle = 25. * Units.deg landing_config.mass_properties.landing = m_end landing_config.store_diff() #analyses.weights=configs.base.mass_properties.takeoff # ------------------------------------------------------------------ # Vehicle Definition Complete # --------------------------------- return