Beispiel #1
0
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
Beispiel #2
0
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
Beispiel #3
0
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
Beispiel #4
0
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
Beispiel #7
0
    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
Beispiel #8
0
    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
Beispiel #10
0
    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