Exemplo n.º 1
0
def main():
    #Parameters Required
    #Using values for a Boeing 747-200  
    vehicle = SUAVE.Vehicle()
    #print vehicle
    vehicle.mass_properties.max_zero_fuel=238780*Units.kg
    vehicle.mass_properties.max_takeoff  =785000.*Units.lbs
    wing = SUAVE.Components.Wings.Wing()
    wing.tag = 'main_wing'
    wing.areas.reference           = 5500.0 * Units.feet**2
    wing.spans.projected           = 196.0  * Units.feet
    wing.chords.mean_aerodynamic   = 27.3 * Units.feet
    wing.chords.root               = 42.9 * Units.feet  #54.5ft
    wing.sweeps.quarter_chord      = 42.0   * Units.deg  # Leading edge
    wing.sweeps.leading_edge       = 42.0   * Units.deg  # Same as the quarter chord sweep (ignore why EMB)
    wing.taper          = 14.7/42.9  #14.7/54.5
    wing.aspect_ratio   = wing.spans.projected**2/wing.areas.reference
    wing.symmetric      = True
    wing.vertical       = False
    wing.origin         = np.array([58.6,0,0]) * Units.feet  
    wing.aerodynamic_center     = np.array([112.2*Units.feet,0.,0.])-wing.origin#16.16 * Units.meters,0.,0,])
    wing.dynamic_pressure_ratio = 1.0
    wing.ep_alpha               = 0.0
    
    span_location_mac                        =compute_span_location_from_chord_length(wing, wing.chords.mean_aerodynamic)
    mac_le_offset                            =.8*np.sin(wing.sweeps.leading_edge)*span_location_mac  #assume that 80% of the chord difference is from leading edge sweep
    wing.mass_properties.center_of_gravity[0]=.3*wing.chords.mean_aerodynamic+mac_le_offset
    
    
    Mach                         = np.array([0.198])
    conditions                   = Data()
    conditions.weights           = Data()
    conditions.lift_curve_slope  = datcom(wing,Mach)
    conditions.weights.total_mass=np.array([[vehicle.mass_properties.max_takeoff]]) 
   
    wing.CL_alpha                = conditions.lift_curve_slope
    vehicle.reference_area       = wing.areas.reference
    vehicle.append_component(wing)
    
    main_wing_CLa = wing.CL_alpha
    main_wing_ar  = wing.aspect_ratio
    
    wing                     = SUAVE.Components.Wings.Wing()
    wing.tag = 'horizontal_stabilizer'
    wing.areas.reference      = 1490.55* Units.feet**2
    wing.spans.projected      = 71.6   * Units.feet
    wing.sweeps.quarter_chord = 44.0   * Units.deg # leading edge
    wing.sweeps.leading_edge  = 44.0   * Units.deg # Same as the quarter chord sweep (ignore why EMB)
    wing.taper                = 7.5/32.6
    wing.aspect_ratio         = wing.spans.projected**2/wing.areas.reference
    wing.origin               = np.array([187.0,0,0])  * Units.feet
    wing.symmetric            = True
    wing.vertical             = False
    wing.dynamic_pressure_ratio = 0.95
    wing.ep_alpha             = 2.0*main_wing_CLa/np.pi/main_wing_ar    
    wing.aerodynamic_center   = [trapezoid_ac_x(wing), 0.0, 0.0]
    wing.CL_alpha             = datcom(wing,Mach)
    vehicle.append_component(wing)
    
    fuselage = SUAVE.Components.Fuselages.Fuselage()
    fuselage.tag = 'fuselage'
    fuselage.x_root_quarter_chord = 77.0 * Units.feet
    fuselage.lengths.total     = 229.7  * Units.feet
    fuselage.width      = 20.9   * Units.feet 
    vehicle.append_component(fuselage)
    vehicle.mass_properties.center_of_gravity=np.array([112.2,0,0]) * Units.feet  
    
    
    
 
    #configuration.mass_properties.zero_fuel_center_of_gravity=np.array([76.5,0,0])*Units.feet #just put a number here that got the expected value output; may want to change
    fuel                                                     =SUAVE.Components.Physical_Component()
    fuel.origin                                              =wing.origin
    fuel.mass_properties.center_of_gravity                   =wing.mass_properties.center_of_gravity
    fuel.mass_properties.mass                                =vehicle.mass_properties.max_takeoff-vehicle.mass_properties.max_zero_fuel
   
    
    #find zero_fuel_center_of_gravity
    cg                   =vehicle.mass_properties.center_of_gravity
    MTOW                 =vehicle.mass_properties.max_takeoff
    fuel_cg              =fuel.origin+fuel.mass_properties.center_of_gravity
    fuel_mass            =fuel.mass_properties.mass
    
    
    sum_moments_less_fuel=(cg*MTOW-fuel_cg*fuel_mass)
    
    
    #now define configuration for calculation
    configuration = Data()
    configuration.mass_properties                            = Data()
    configuration.mass_properties.center_of_gravity          = vehicle.mass_properties.center_of_gravity
    configuration.mass_properties.max_zero_fuel              =vehicle.mass_properties.max_zero_fuel
    configuration.fuel                                       =fuel
    
    configuration.mass_properties.zero_fuel_center_of_gravity=sum_moments_less_fuel/vehicle.mass_properties.max_zero_fuel
  
    
    #print configuration
    cm_a = taw_cmalpha(vehicle,Mach,conditions,configuration)
    expected =-1.56222373 #Should be -1.45
    error = Data()
    error.cm_a_747 = (cm_a - expected)/expected
    
    
    #Parameters Required
    #Using values for a Beech 99 
    
    vehicle = SUAVE.Vehicle()
    vehicle.mass_properties.max_takeoff  =4727*Units.kg #from Wikipedia
    vehicle.mass_properties.empty        =2515*Units.kg
    vehicle.mass_properties.max_zero_fuel=vehicle.mass_properties.max_takeoff-vehicle.mass_properties.empty+15.*225*Units.lbs #15 passenger ac
    
    wing = SUAVE.Components.Wings.Wing()
    wing.tag = 'main_wing'
    wing.areas.reference           = 280.0 * Units.feet**2
    wing.spans.projected           = 46.0  * Units.feet
    wing.chords.mean_aerodynamic   = 6.5 * Units.feet
    wing.chords.root               = 7.9 * Units.feet
    wing.sweeps.leading_edge       = 4.0   * Units.deg # Same as the quarter chord sweep (ignore why EMB)
    wing.sweeps.quarter_chord      = 4.0   * Units.deg # Leading edge
    wing.taper                     = 0.47
    wing.aspect_ratio              = wing.spans.projected**2/wing.areas.reference
    wing.symmetric                 = True
    wing.vertical                  = False
    wing.origin                    = np.array([15.,0,0]) * Units.feet  
    wing.aerodynamic_center        = np.array([trapezoid_ac_x(wing), 0. , 0. ])
    wing.dynamic_pressure_ratio    = 1.0
    wing.ep_alpha                  = 0.0
    span_location_mac                        =compute_span_location_from_chord_length(wing, wing.chords.mean_aerodynamic)
    mac_le_offset                            =.8*np.sin(wing.sweeps.leading_edge)*span_location_mac  #assume that 80% of the chord difference is from leading edge sweep
    wing.mass_properties.center_of_gravity[0]=.3*wing.chords.mean_aerodynamic+mac_le_offset
    
    
    
    
    
    Mach = np.array([0.152])
    reference = SUAVE.Core.Container()
    conditions = Data()
    conditions.lift_curve_slope = datcom(wing,Mach)
    
    conditions.weights=Data()
    conditions.weights.total_mass=np.array([[vehicle.mass_properties.max_takeoff]]) 
   
    wing.CL_alpha               = conditions.lift_curve_slope
    vehicle.reference_area      = wing.areas.reference
    vehicle.append_component(wing)
    
    main_wing_CLa = wing.CL_alpha
    main_wing_ar  = wing.aspect_ratio
    
    wing = SUAVE.Components.Wings.Wing()
    wing.tag                      = 'horizontal_stabilizer'
    wing.areas.reference          = 100.5 * Units.feet**2
    wing.spans.projected          = 22.5  * Units.feet
    wing.sweeps.leading_edge      = 21.0   * Units.deg # Same as the quarter chord sweep (ignore why EMB)
    wing.sweeps.quarter_chord     = 21.0   * Units.deg # leading edge
    wing.taper                    = 3.1/6.17
    wing.aspect_ratio             = wing.spans.projected**2/wing.areas.reference
    wing.origin                   = np.array([36.3,0,0])  * Units.feet
    wing.symmetric                = True
    wing.vertical                 = False
    wing.dynamic_pressure_ratio   = 0.95
    wing.ep_alpha                 = 2.0*main_wing_CLa/np.pi/main_wing_ar
    wing.aerodynamic_center       = np.array([trapezoid_ac_x(wing), 0.0, 0.0])
    wing.CL_alpha                 = datcom(wing,Mach)
    vehicle.append_component(wing)
    
    fuselage = SUAVE.Components.Fuselages.Fuselage()
    fuselage.tag                  = 'fuselage'
    fuselage.x_root_quarter_chord = 5.4 * Units.feet
    fuselage.lengths.total        = 44.0  * Units.feet
    fuselage.width                = 5.4   * Units.feet 
    vehicle.append_component(fuselage)
    
    vehicle.mass_properties.center_of_gravity = np.array([17.2,0,0]) * Units.feet   
    
    
    fuel.origin                                              =wing.origin
    fuel.mass_properties.center_of_gravity                   =wing.mass_properties.center_of_gravity
    fuel.mass_properties.mass                                =vehicle.mass_properties.max_takeoff-vehicle.mass_properties.max_zero_fuel
   
    
    
    #find zero_fuel_center_of_gravity
    cg                   =vehicle.mass_properties.center_of_gravity
    MTOW                 =vehicle.mass_properties.max_takeoff
    fuel_cg              =fuel.origin+fuel.mass_properties.center_of_gravity
    fuel_mass            =fuel.mass_properties.mass

    
    sum_moments_less_fuel=(cg*MTOW-fuel_cg*fuel_mass)
    
    
    #now define configuration for calculation
    configuration = Data()
    configuration.mass_properties                            = Data()
    configuration.mass_properties.center_of_gravity          = vehicle.mass_properties.center_of_gravity
    configuration.mass_properties.max_zero_fuel              = vehicle.mass_properties.max_zero_fuel
    configuration.fuel                                       =fuel
    
    configuration.mass_properties.zero_fuel_center_of_gravity=sum_moments_less_fuel/vehicle.mass_properties.max_zero_fuel
    
    
    #Method Test   
    #print configuration
    cm_a = taw_cmalpha(vehicle,Mach,conditions,configuration)
    expected = -2.48843437 #Should be -2.08
    error.cm_a_beech_99 = (cm_a - expected)/expected   
    
    
    #Parameters Required
    #Using values for an SIAI Marchetti S-211
    
    vehicle = SUAVE.Vehicle()
    vehicle.mass_properties.max_takeoff  =2750*Units.kg #from Wikipedia
    vehicle.mass_properties.empty        =1850*Units.kg
    vehicle.mass_properties.max_zero_fuel=vehicle.mass_properties.max_takeoff-vehicle.mass_properties.empty+2.*225*Units.lbs #2 passenger ac
    
    wing = SUAVE.Components.Wings.Wing()
    wing.tag = 'main_wing'
    wing.areas.reference           = 136.0 * Units.feet**2
    wing.spans.projected           = 26.3  * Units.feet
    wing.chords.mean_aerodynamic   = 5.4   * Units.feet
    wing.chords.root               = 7.03  * Units.feet
    wing.chords.tip                = 3.1   * Units.feet
    wing.sweeps.quarter_chord      = 19.5  * Units.deg # Leading edge
    wing.sweeps.leading_edge       = 19.5  * Units.deg # Same as the quarter chord sweep (ignore why EMB)
    wing.taper          = 3.1/7.03
    wing.aspect_ratio   = wing.spans.projected**2/wing.areas.reference
    wing.symmetric      = True
    wing.vertical       = False
    wing.origin         = np.array([13.5,0,0]) * Units.feet  
    wing.aerodynamic_center  = np.array([trapezoid_ac_x(wing),0.,0.])#16.6, 0. , 0. ]) * Units.feet - wing.origin
    wing.dynamic_pressure_ratio = 1.0
    wing.ep_alpha       = 0.0
    
    span_location_mac                        =compute_span_location_from_chord_length(wing, wing.chords.mean_aerodynamic)
    mac_le_offset                            =.8*np.sin(wing.sweeps.leading_edge)*span_location_mac  #assume that 80% of the chord difference is from leading edge sweep
    wing.mass_properties.center_of_gravity[0]=.3*wing.chords.mean_aerodynamic+mac_le_offset
    
       
    
    Mach = np.array([0.111])
    conditions = Data()
    conditions.lift_curve_slope = datcom(wing,Mach)
    conditions.weights=Data()
    conditions.weights.total_mass=np.array([[vehicle.mass_properties.max_takeoff]]) 
   
    
    
    
    wing.CL_alpha               = conditions.lift_curve_slope
    vehicle.reference_area      = wing.areas.reference
    vehicle.append_component(wing)
    
    main_wing_CLa = wing.CL_alpha
    main_wing_ar  = wing.aspect_ratio

    wing = SUAVE.Components.Wings.Wing()
    wing.tag                 = 'horizontal_stabilizer'
    wing.areas.reference     = 36.46 * Units.feet**2
    wing.spans.projected     = 13.3   * Units.feet
    wing.sweeps.quarter_chord= 18.5  * Units.deg  # leading edge
    wing.sweeps.leading_edge = 18.5  * Units.deg  # Same as the quarter chord sweep (ignore why EMB)
    wing.taper               = 1.6/3.88
    wing.aspect_ratio        = wing.spans.projected**2/wing.areas.reference
    wing.origin              = np.array([26.07,0.,0.]) * Units.feet
    wing.symmetric           = True
    wing.vertical            = False
    wing.dynamic_pressure_ratio = 0.9
    wing.ep_alpha            = 2.0*main_wing_CLa/np.pi/main_wing_ar
    wing.aerodynamic_center  = np.array([trapezoid_ac_x(wing), 0.0, 0.0])
    wing.CL_alpha            = datcom(wing,Mach)
    
    span_location_mac                        =compute_span_location_from_chord_length(wing, wing.chords.mean_aerodynamic)
    mac_le_offset                            =.8*np.sin(wing.sweeps.leading_edge)*span_location_mac  #assume that 80% of the chord difference is from leading edge sweep
    wing.mass_properties.center_of_gravity[0]=.3*wing.chords.mean_aerodynamic+mac_le_offset
    
    
    
    
    
    
    
    vehicle.append_component(wing)
    
    fuselage = SUAVE.Components.Fuselages.Fuselage()
    fuselage.tag = 'fuselage'
    fuselage.x_root_quarter_chord = 12.67 * Units.feet
    fuselage.lengths.total        = 30.9  * Units.feet
    fuselage.width                = ((2.94+5.9)/2)   * Units.feet 
    vehicle.append_component(fuselage)
    vehicle.mass_properties.center_of_gravity = np.array([16.6,0,0]) * Units.feet    
    
    
    
    
    fuel.origin                                              =wing.origin
    fuel.mass_properties.center_of_gravity                   =wing.mass_properties.center_of_gravity
    fuel.mass_properties.mass                                =vehicle.mass_properties.max_takeoff-vehicle.mass_properties.max_zero_fuel
   
    
    
    #find zero_fuel_center_of_gravity
    cg                   =vehicle.mass_properties.center_of_gravity
    MTOW                 =vehicle.mass_properties.max_takeoff
    fuel_cg              =fuel.origin+fuel.mass_properties.center_of_gravity
    fuel_mass            =fuel.mass_properties.mass

    sum_moments_less_fuel=(cg*MTOW-fuel_cg*fuel_mass)
    
    
    #now define configuration for calculation
    configuration = Data()
    configuration.mass_properties                            = Data()
    configuration.mass_properties.center_of_gravity          = vehicle.mass_properties.center_of_gravity
    configuration.mass_properties.max_zero_fuel              = vehicle.mass_properties.max_zero_fuel
    configuration.fuel                                       =fuel
    
    configuration.mass_properties.zero_fuel_center_of_gravity=sum_moments_less_fuel/vehicle.mass_properties.max_zero_fuel
    
    
    
    #Method Test   
    #print configuration
    cm_a = taw_cmalpha(vehicle,Mach,conditions,configuration)
   
    expected = -0.54071741 #Should be -0.6
    error.cm_a_SIAI = (cm_a - expected)/expected
    print error
    for k,v in error.items():
        assert(np.abs(v)<0.01)
        
    return
Exemplo n.º 2
0
def main():
    #Parameters Required
    #Using values for a Boeing 747-200
    vehicle = SUAVE.Vehicle()
    wing = SUAVE.Components.Wings.Wing()
    wing.tag = 'main_wing'
    wing.areas.reference = 5500.0 * Units.feet**2
    wing.spans.projected = 196.0 * Units.feet
    wing.chords.mean_aerodynamic = 27.3 * Units.feet
    wing.chords.root = 42.9 * Units.feet  #54.5ft
    wing.sweep = 42.0 * Units.deg  # Leading edge
    wing.taper = 14.7 / 42.9  #14.7/54.5
    wing.aspect_ratio = wing.spans.projected**2 / wing.areas.reference
    wing.symmetric = True
    wing.vertical = False
    wing.origin = np.array([58.6, 0, 0]) * Units.feet
    wing.aerodynamic_center = np.array([
        112.2 * Units.feet, 0., 0.
    ]) - wing.origin  #16.16 * Units.meters,0.,0,])
    wing.dynamic_pressure_ratio = 1.0
    wing.ep_alpha = 0.0

    Mach = np.array([0.198])
    conditions = Data()
    conditions.lift_curve_slope = datcom(wing, Mach)
    wing.CL_alpha = conditions.lift_curve_slope
    vehicle.reference_area = wing.areas.reference
    vehicle.append_component(wing)

    main_wing_CLa = wing.CL_alpha
    main_wing_ar = wing.aspect_ratio

    wing = SUAVE.Components.Wings.Wing()
    wing.tag = 'horizontal_stabilizer'
    wing.areas.reference = 1490.55 * Units.feet**2
    wing.spans.projected = 71.6 * Units.feet
    wing.sweep = 44.0 * Units.deg  # leading edge
    wing.taper = 7.5 / 32.6
    wing.aspect_ratio = wing.spans.projected**2 / wing.areas.reference
    wing.origin = np.array([187.0, 0, 0]) * Units.feet
    wing.symmetric = True
    wing.vertical = False
    wing.dynamic_pressure_ratio = 0.95
    wing.ep_alpha = 2.0 * main_wing_CLa / np.pi / main_wing_ar
    wing.aerodynamic_center = [trapezoid_ac_x(wing), 0.0, 0.0]
    wing.CL_alpha = datcom(wing, Mach)
    vehicle.append_component(wing)

    fuselage = SUAVE.Components.Fuselages.Fuselage()
    fuselage.tag = 'fuselage'
    fuselage.x_root_quarter_chord = 77.0 * Units.feet
    fuselage.lengths.total = 229.7 * Units.feet
    fuselage.width = 20.9 * Units.feet
    vehicle.append_component(fuselage)

    configuration = Data()
    configuration.mass_properties = Data()
    configuration.mass_properties.center_of_gravity = Data()
    configuration.mass_properties.center_of_gravity = np.array([112.2, 0, 0
                                                                ]) * Units.feet

    cm_a = taw_cmalpha(vehicle, Mach, conditions, configuration)

    expected = -1.627  #Should be -1.45
    error = Data()
    error.cm_a_747 = (cm_a - expected) / expected

    #Parameters Required
    #Using values for a Beech 99

    vehicle = SUAVE.Vehicle()
    wing = SUAVE.Components.Wings.Wing()
    wing.tag = 'main_wing'
    wing.areas.reference = 280.0 * Units.feet**2
    wing.spans.projected = 46.0 * Units.feet
    wing.chords.mean_aerodynamic = 6.5 * Units.feet
    wing.chords.root = 7.9 * Units.feet
    wing.sweep = 4.0 * Units.deg  # Leading edge
    wing.taper = 0.47
    wing.aspect_ratio = wing.spans.projected**2 / wing.areas.reference
    wing.symmetric = True
    wing.vertical = False
    wing.origin = np.array([15., 0, 0]) * Units.feet
    wing.aerodynamic_center = np.array([trapezoid_ac_x(wing), 0., 0.])
    wing.dynamic_pressure_ratio = 1.0
    wing.ep_alpha = 0.0

    Mach = np.array([0.152])
    reference = SUAVE.Core.Container()
    conditions = Data()
    conditions.lift_curve_slope = datcom(wing, Mach)
    wing.CL_alpha = conditions.lift_curve_slope
    vehicle.reference_area = wing.areas.reference
    vehicle.append_component(wing)

    main_wing_CLa = wing.CL_alpha
    main_wing_ar = wing.aspect_ratio

    wing = SUAVE.Components.Wings.Wing()
    wing.tag = 'horizontal_stabilizer'
    wing.areas.reference = 100.5 * Units.feet**2
    wing.spans.projected = 22.5 * Units.feet
    wing.sweep = 21. * Units.deg  # leading edge
    wing.taper = 3.1 / 6.17
    wing.aspect_ratio = wing.spans.projected**2 / wing.areas.reference
    wing.origin = np.array([36.3, 0, 0]) * Units.feet
    wing.symmetric = True
    wing.vertical = False
    wing.dynamic_pressure_ratio = 0.95
    wing.ep_alpha = 2.0 * main_wing_CLa / np.pi / main_wing_ar
    wing.aerodynamic_center = np.array([trapezoid_ac_x(wing), 0.0, 0.0])
    wing.CL_alpha = datcom(wing, Mach)
    vehicle.append_component(wing)

    fuselage = SUAVE.Components.Fuselages.Fuselage()
    fuselage.tag = 'fuselage'
    fuselage.x_root_quarter_chord = 5.4 * Units.feet
    fuselage.lengths.total = 44.0 * Units.feet
    fuselage.width = 5.4 * Units.feet
    vehicle.append_component(fuselage)

    configuration = Data()
    configuration.mass_properties = Data()
    configuration.mass_properties.center_of_gravity = Data()
    configuration.mass_properties.center_of_gravity = np.array([17.2, 0, 0
                                                                ]) * Units.feet

    #Method Test

    cm_a = taw_cmalpha(vehicle, Mach, conditions, configuration)

    expected = -2.521  #Should be -2.08
    error.cm_a_beech_99 = (cm_a - expected) / expected

    #Parameters Required
    #Using values for an SIAI Marchetti S-211

    vehicle = SUAVE.Vehicle()
    wing = SUAVE.Components.Wings.Wing()
    wing.tag = 'main_wing'
    wing.areas.reference = 136.0 * Units.feet**2
    wing.spans.projected = 26.3 * Units.feet
    wing.chords.mean_aerodynamic = 5.4 * Units.feet
    wing.chords.root = 7.03 * Units.feet
    wing.chords.tip = 3.1 * Units.feet
    wing.sweep = 19.5 * Units.deg  # Leading edge
    wing.taper = 3.1 / 7.03
    wing.aspect_ratio = wing.spans.projected**2 / wing.areas.reference
    wing.symmetric = True
    wing.vertical = False
    wing.origin = np.array([13.5, 0, 0]) * Units.feet
    wing.aerodynamic_center = np.array(
        [trapezoid_ac_x(wing), 0.,
         0.])  #16.6, 0. , 0. ]) * Units.feet - wing.origin
    wing.dynamic_pressure_ratio = 1.0
    wing.ep_alpha = 0.0

    Mach = np.array([0.111])
    conditions = Data()
    conditions.lift_curve_slope = datcom(wing, Mach)
    wing.CL_alpha = conditions.lift_curve_slope
    vehicle.reference_area = wing.areas.reference
    vehicle.append_component(wing)

    main_wing_CLa = wing.CL_alpha
    main_wing_ar = wing.aspect_ratio

    wing = SUAVE.Components.Wings.Wing()
    wing.tag = 'horizontal_stabilizer'
    wing.areas.reference = 36.46 * Units.feet**2
    wing.spans.projected = 13.3 * Units.feet
    wing.sweep = 18.5 * Units.deg  # leading edge
    wing.taper = 1.6 / 3.88
    wing.aspect_ratio = wing.spans.projected**2 / wing.areas.reference
    wing.origin = np.array([26.07, 0., 0.]) * Units.feet
    wing.symmetric = True
    wing.vertical = False
    wing.dynamic_pressure_ratio = 0.9
    wing.ep_alpha = 2.0 * main_wing_CLa / np.pi / main_wing_ar
    wing.aerodynamic_center = np.array([trapezoid_ac_x(wing), 0.0, 0.0])
    wing.CL_alpha = datcom(wing, Mach)
    vehicle.append_component(wing)

    fuselage = SUAVE.Components.Fuselages.Fuselage()
    fuselage.tag = 'fuselage'
    fuselage.x_root_quarter_chord = 12.67 * Units.feet
    fuselage.lengths.total = 30.9 * Units.feet
    fuselage.width = ((2.94 + 5.9) / 2) * Units.feet
    vehicle.append_component(fuselage)

    configuration = Data()
    configuration.mass_properties = Data()
    configuration.mass_properties.center_of_gravity = Data()
    configuration.mass_properties.center_of_gravity = np.array([16.6, 0, 0
                                                                ]) * Units.feet

    #Method Test

    cm_a = taw_cmalpha(vehicle, Mach, conditions, configuration)

    expected = -0.5409  #Should be -0.6
    error.cm_a_SIAI = (cm_a - expected) / expected

    for k, v in error.items():
        assert (np.abs(v) < 0.01)

    return
Exemplo n.º 3
0
    def __call__(self, conditions):
        """ process vehicle to setup geometry, condititon and configuration
            
            Inputs:
                conditions - DataDict() of aerodynamic conditions
                results - DataDict() of 
                
            Outputs:

                
            Assumptions:

                
        """

        # unpack
        configuration = self.configuration
        geometry = self.geometry
        stability_model = self.stability_model

        q = conditions.freestream.dynamic_pressure
        Sref = geometry.reference_area
        mach = conditions.freestream.mach_number
        velocity = conditions.freestream.velocity
        density = conditions.freestream.density
        Span = geometry.wings['main_wing'].spans.projected
        mac = geometry.wings['main_wing'].chords.mean_aerodynamic
        aero = conditions.aerodynamics

        # set up data structures
        static_stability = Data()
        dynamic_stability = Data()

        # Calculate CL_alpha
        if not conditions.has_key('lift_curve_slope'):
            conditions.lift_curve_slope = datcom(geometry.wings['main_wing'],
                                                 mach)

        # Calculate change in downwash with respect to change in angle of attack
        for surf in geometry.wings:
            sref = surf.areas.reference
            span = (surf.aspect_ratio * sref)**0.5
            surf.CL_alpha = datcom(surf, mach)
            surf.ep_alpha = Supporting_Functions.ep_alpha(
                surf.CL_alpha, sref, span)

        # Static Stability Methods
        static_stability.cm_alpha = taw_cmalpha(geometry, mach, conditions,
                                                configuration)
        static_stability.cn_beta = taw_cnbeta(geometry, conditions,
                                              configuration)

        # Dynamic Stability
        if np.count_nonzero(
                configuration.mass_properties.moments_of_inertia.tensor) > 0:
            # Dynamic Stability Approximation Methods - valid for non-zero I tensor

            # Derivative of yawing moment with respect to the rate of yaw
            cDw = aero.drag_breakdown.parasite[
                'main_wing'].parasite_drag_coefficient  # Might not be the correct value
            l_v = geometry.wings['vertical_stabilizer'].origin[
                0] + geometry.wings['vertical_stabilizer'].aerodynamic_center[
                    0] - geometry.wings['main_wing'].origin[
                        0] - geometry.wings['main_wing'].aerodynamic_center[0]
            dynamic_stability.cn_r = Supporting_Functions.cn_r(
                cDw, geometry.wings['vertical_stabilizer'].areas.reference,
                Sref, l_v, span,
                geometry.wings['vertical_stabilizer'].dynamic_pressure_ratio,
                geometry.wings['vertical_stabilizer'].CL_alpha)

            # Derivative of rolling moment with respect to roll rate
            dynamic_stability.cl_p = 0  # Need to see if there is a low fidelity way to calculate cl_p

            # Derivative of roll rate with respect to sideslip (dihedral effect)
            dynamic_stability.cl_beta = 0  # Need to see if there is a low fidelity way to calculate cl_beta

            # Derivative of pitching moment with respect to pitch rate
            l_t = geometry.wings['horizontal_stabilizer'].origin[
                0] + geometry.wings['horizontal_stabilizer'].aerodynamic_center[
                    0] - geometry.wings['main_wing'].origin[
                        0] - geometry.wings['main_wing'].aerodynamic_center[
                            0]  #Need to check this is the length of the horizontal tail moment arm
            dynamic_stability.cm_q = Supporting_Functions.cm_q(
                conditions.lift_curve_slope, l_t,
                mac)  # Need to check Cm_i versus Cm_alpha

            # Derivative of pitching rate with respect to d(alpha)/d(t)
            dynamic_stability.cm_alpha_dot = Supporting_Functions.cm_alphadot(
                static_stability.cm_alpha,
                geometry.wings['horizontal_stabilizer'].ep_alpha, l_t,
                mac)  # Need to check Cm_i versus Cm_alpha

            # Derivative of Z-axis force with respect to angle of attack
            dynamic_stability.cz_alpha = Supporting_Functions.cz_alpha(
                aero.drag_coefficient, conditions.lift_curve_slope)

            stability_model.dutch_roll = Approximations.dutch_roll(
                velocity, static_stability.cn_beta, Sref, density, Span,
                configuration.mass_properties.moments_of_inertia.tensor[2][2],
                dynamic_stability.cn_r)

            if dynamic_stability.cl_p != 0:
                stability_model.roll_tau = Approximations.roll(
                    configuration.mass_properties.momen[2][2], Sref, density,
                    velocity, Span, dynamic_stability.cl_p)
                dynamic_stability.cy_phi = Supporting_Functions.cy_phi(
                    aero.lift_coefficient)
                dynamic_stability.cl_r = Supporting_Functions.cl_r(
                    aero.lift_coefficient)  # Will need to be changed
                stability_model.spiral_tau = Approximations.spiral(
                    conditions.weights.total_mass, velocity, density, Sref,
                    dynamic_stability.cl_p, static_stability.cn_beta,
                    dynamic_stability.cy_phi, dynamic_stability.cl_beta,
                    dynamic_stability.cn_r, dynamic_stability.cl_r)
            stability_model.short_period = Approximations.short_period(
                velocity, density, Sref, mac, dynamic_stability.cm_q,
                dynamic_stability.cz_alpha, conditions.weights.total_mass,
                static_stability.cm_alpha,
                configuration.mass_properties.moments_of_inertia.tensor[1][1],
                dynamic_stability.cm_alpha_dot)
            stability_model.phugoid = Approximations.phugoid(
                conditions.freestream.gravity, conditions.freestream.velocity,
                aero.drag_coefficient, aero.lift_coefficient)

            # Dynamic Stability Full Linearized Methods
            if aero.has_key(
                    'cy_beta'
            ) and dynamic_stability.cl_p != 0 and dynamic_stability.cl_beta != 0:
                theta = conditions.frames.wind.body_rotations[:, 1]
                dynamic_stability.cy_beta = aero.cy_beta
                dynamic_stability.cl_psi = Supporting_Functions.cy_psi(
                    aero.lift_coefficient, theta)
                dynamic_stability.cL_u = 0
                dynamic_stability.cz_u = Supporting_Functions.cz_u(
                    aero.lift_coefficient, velocity, dynamic_stability.cL_u)
                dynamic_stability.cz_alpha_dot = Supporting_Functions.cz_alphadot(
                    static_stability.cm_alpha,
                    geometry.wings['horizontal_stabilizer'].ep_alpha)
                dynamic_stability.cz_q = Supporting_Functions.cz_q(
                    static_stability.cm_alpha)
                dynamic_stability.cx_u = Supporting_Functions.cx_u(
                    aero.drag_coefficient)
                dynamic_stability.cx_alpha = Supporting_Functions.cx_alpha(
                    aero.lift_coefficient, conditions.lift_curve_slope)

                lateral_directional = Full_Linearized_Equations.lateral_directional(
                    velocity, static_stability.cn_beta, Sref, density, Span,
                    configuration.mass_properties.moments_of_inertia.tensor[2]
                    [2], dynamic_stability.cn_r,
                    configuration.mass_properties.Moments_Of_Inertia.tensor[0]
                    [0], dynamic_stability.cl_p,
                    configuration.mass_properties.moments_of_inertia.tensor[0]
                    [2], dynamic_stability.cl_r, dynamic_stability.cl_beta,
                    dynamic_stability.cn_p, dynamic_stability.cy_phi,
                    dynamic_stability.cy_psi, dynamic_stability.cy_beta,
                    conditions.weights.total_mass)
                longitudinal = Full_Linearized_Equations.longitudinal(
                    velocity, density, Sref, mac, dynamic_stability.cm_q,
                    dynamic_stability.cz_alpha, conditions.weights.total_mass,
                    static_stability.cm_alpha,
                    configuration.mass_properties.moments_of_inertia.tensor[1]
                    [1], dynamic_stability.cm_alpha_dot,
                    dynamic_stability.cz_u, dynamic_stability.cz_alpha_dot,
                    dynamic_stability.cz_q, -aero.lift_coefficient, theta,
                    dynamic_stability.cx_u, dynamic_stability.cx_alpha)
                stability_model.dutch_roll.natural_frequency = lateral_directional.dutch_natural_frequency
                stability_model.dutch_roll.damping_ratio = lateral_directional.dutch_damping_ratio
                stability_model.spiral_tau = lateral_directional.spiral_tau
                stability_model.roll_tau = lateral_directional.roll_tau
                stability_model.short_period.natural_frequency = longitudinal.short_natural_frequency
                stability_model.short_period.damping_ratio = longitudinal.short_damping_ratio
                stability_model.phugoid.natural_frequency = longitudinal.phugoid_natural_frequency
                stability_model.phugoid.damping_ratio = longitudinal.phugoid_damping_ratio

        # pack results
        results = Data()
        results.static = static_stability
        results.dynamic = dynamic_stability

        return results
Exemplo n.º 4
0
    def __call__(self, conditions):
        """ Process vehicle to setup geometry, condititon and configuration

        Assumptions:
        None

        Source:
        N/A

        Inputs:
        conditions - DataDict() of aerodynamic conditions
        results    - DataDict() of moment coeffients and stability and body axis derivatives

        Outputs:
        None

        Properties Used:
        self.geometry
        """

        # unpack
        configuration = self.configuration
        geometry = self.geometry

        q = conditions.freestream.dynamic_pressure
        Sref = geometry.reference_area
        mach = conditions.freestream.mach_number
        velocity = conditions.freestream.velocity
        density = conditions.freestream.density
        Span = geometry.wings['main_wing'].spans.projected
        mac = geometry.wings['main_wing'].chords.mean_aerodynamic
        aero = conditions.aerodynamics

        # set up data structures
        stability = Data()
        stability.static = Data()
        stability.dynamic = Data()

        # Calculate CL_alpha
        conditions.lift_curve_slope = datcom(geometry.wings['main_wing'], mach)

        # Calculate change in downwash with respect to change in angle of attack
        for surf in geometry.wings:
            sref = surf.areas.reference
            span = (surf.aspect_ratio * sref)**0.5
            surf.CL_alpha = datcom(surf, mach)
            surf.ep_alpha = Supporting_Functions.ep_alpha(
                surf.CL_alpha, sref, span)

        # Static Stability Methods
        stability.static.Cm_alpha, stability.static.Cm0, stability.static.CM = taw_cmalpha(
            geometry, mach, conditions, configuration)

        if 'vertical_stabilizer' in geometry.wings:
            stability.static.Cn_beta = taw_cnbeta(geometry, conditions,
                                                  configuration)
        else:
            stability.static.Cn_beta = np.zeros_like(mach)

        # calculate the static margin
        stability.static.static_margin = -stability.static.Cm_alpha / conditions.lift_curve_slope

        # Dynamic Stability
        if np.count_nonzero(
                configuration.mass_properties.moments_of_inertia.tensor) > 0:
            # Dynamic Stability Approximation Methods - valid for non-zero I tensor

            # Derivative of yawing moment with respect to the rate of yaw
            cDw = aero.drag_breakdown.parasite[
                'main_wing'].parasite_drag_coefficient  # Might not be the correct value
            l_v = geometry.wings['vertical_stabilizer'].origin[
                0] + geometry.wings['vertical_stabilizer'].aerodynamic_center[
                    0] - geometry.wings['main_wing'].origin[
                        0] - geometry.wings['main_wing'].aerodynamic_center[0]
            stability.static.Cn_r = Supporting_Functions.cn_r(
                cDw, geometry.wings['vertical_stabilizer'].areas.reference,
                Sref, l_v, span,
                geometry.wings['vertical_stabilizer'].dynamic_pressure_ratio,
                geometry.wings['vertical_stabilizer'].CL_alpha)

            # Derivative of rolling moment with respect to roll rate
            stability.static.Cl_p = Supporting_Functions.cl_p(
                conditions.lift_curve_slope, geometry)

            # Derivative of roll rate with respect to sideslip (dihedral effect)
            if 'dihedral' in geometry.wings['main_wing']:
                stability.static.Cl_beta = Supporting_Functions.cl_beta(
                    geometry, stability.static.Cl_p)
            else:
                stability.static.Cl_beta = np.zeros(1)

            stability.static.Cy_beta = 0

            # Derivative of pitching moment with respect to pitch rate
            l_t = geometry.wings['horizontal_stabilizer'].origin[
                0] + geometry.wings['horizontal_stabilizer'].aerodynamic_center[
                    0] - geometry.wings['main_wing'].origin[
                        0] - geometry.wings['main_wing'].aerodynamic_center[
                            0]  #Need to check this is the length of the horizontal tail moment arm
            stability.static.Cm_q = Supporting_Functions.cm_q(
                conditions.lift_curve_slope, l_t,
                mac)  # Need to check Cm_i versus Cm_alpha

            # Derivative of pitching rate with respect to d(alpha)/d(t)
            stability.static.Cm_alpha_dot = Supporting_Functions.cm_alphadot(
                stability.static.Cm_alpha,
                geometry.wings['horizontal_stabilizer'].ep_alpha, l_t,
                mac)  # Need to check Cm_i versus Cm_alpha

            # Derivative of Z-axis force with respect to angle of attack
            stability.static.Cz_alpha = Supporting_Functions.cz_alpha(
                aero.drag_coefficient, conditions.lift_curve_slope)

            dutch_roll = Approximations.dutch_roll(
                velocity, stability.static.Cn_beta, Sref, density, Span,
                configuration.mass_properties.moments_of_inertia.tensor[2][2],
                stability.static.Cn_r)
            stability.dynamic.dutchRollFreqHz = dutch_roll.natural_frequency
            stability.dynamic.dutchRollDamping = dutch_roll.damping_ratio

            if stability.static.Cl_p.all() != 0:
                stability.dynamic.rollSubsistenceTimeConstant = Approximations.roll(
                    configuration.mass_properties.moments_of_inertia.tensor[2]
                    [2], Sref, density, velocity, Span, stability.static.Cl_p)
                stability.static.Cy_phi = Supporting_Functions.cy_phi(
                    aero.lift_coefficient)
                stability.static.Cl_r = Supporting_Functions.cl_r(
                    aero.lift_coefficient)  # Will need to be changed
                stability.dynamic.spiralSubsistenceTimeConstant = Approximations.spiral(conditions.weights.total_mass, velocity, density, Sref, stability.static.Cl_p, stability.static.Cn_beta, stability.static.Cy_phi,\
                                                                            stability.static.Cl_beta, stability.static.Cn_r, stability.static.Cl_r)

            short_period_res                               = Approximations.short_period(velocity, density, Sref, mac, stability.static.Cm_q, stability.static.Cz_alpha, conditions.weights.total_mass, stability.static.Cm_alpha,\
                                                            configuration.mass_properties.moments_of_inertia.tensor[1][1], stability.static.Cm_alpha_dot)
            stability.dynamic.shortPeriodFreqHz = short_period_res.natural_frequency
            stability.dynamic.shortPeriodDamp = short_period_res.damping_ratio

            phugoid_res = Approximations.phugoid(
                conditions.freestream.gravity, conditions.freestream.velocity,
                aero.drag_coefficient, aero.lift_coefficient)
            stability.dynamic.phugoidFreqHz = phugoid_res.natural_frequency
            stability.dynamic.phugoidDamp = phugoid_res.damping_ratio

            # Dynamic Stability Full Linearized Methods
            if stability.static.Cy_beta != 0 and stability.static.Cl_p.all(
            ) != 0 and stability.static.Cl_beta.all() != 0:
                theta = conditions.frames.wind.body_rotations[:, 1]
                stability.static.Cy_psi = Supporting_Functions.cy_psi(
                    aero.lift_coefficient, theta)
                stability.static.CL_u = 0
                stability.static.Cz_u = Supporting_Functions.cz_u(
                    aero.lift_coefficient, velocity, stability.static.cL_u)
                stability.static.Cz_alpha_dot = Supporting_Functions.cz_alphadot(
                    stability.static.Cm_alpha,
                    geometry.wings['horizontal_stabilizer'].ep_alpha)
                stability.static.Cz_q = Supporting_Functions.cz_q(
                    stability.static.Cm_alpha)
                stability.static.Cx_u = Supporting_Functions.cx_u(
                    aero.drag_coefficient)
                stability.static.Cx_alpha = Supporting_Functions.cx_alpha(
                    aero.lift_coefficient, conditions.lift_curve_slope)

                lateral_directional = Full_Linearized_Equations.lateral_directional(velocity, stability.static.cn_beta , Sref, density, Span, configuration.mass_properties.moments_of_inertia.tensor[2][2], stability.static.Cn_r,\
                                    configuration.mass_properties.moments_of_inertia.tensor[0][0], stability.static.Cl_p, configuration.mass_properties.moments_of_inertia.tensor[0][2], stability.static.Cl_r, stability.static.Cl_beta,\
                                    stability.static.Cn_p, stability.static.Cy_phi, stability.static.Cy_psi, stability.static.Cy_beta, conditions.weights.total_mass)
                longitudinal        = Full_Linearized_Equations.longitudinal(velocity, density, Sref, mac, stability.static.Cm_q, stability.static.Cz_alpha, conditions.weights.total_mass, stability.static.Cm_alpha, \
                                    configuration.mass_properties.moments_of_inertia.tensor[1][1], stability.static.Cm_alpha_dot, stability.static.Cz_u, stability.static.Cz_alpha_dot, stability.static.Cz_q, -aero.lift_coefficient,\
                                    theta, stability.static.Cx_u, stability.static.Cx_alpha)
                stability.dynamic.dutchRollFreqHz = lateral_directional.dutch_natural_frequency
                stability.dynamic.dutchRollDamping = lateral_directional.dutch_damping_ratio
                stability.dynamic.spiralSubsistenceTimeConstant = lateral_directional.spiral_tau
                stability.dynamic.rollSubsistenceTimeConstant = lateral_directional.roll_tau
                stability.dynamic.shortPeriodFreqHz = longitudinal.short_natural_frequency
                stability.dynamic.shortPeriodDamp = longitudinal.short_damping_ratio
                stability.dynamic.phugoidFreqHz = longitudinal.phugoid_natural_frequency
                stability.dynamic.phugoidDamp = longitudinal.phugoid_damping_ratio

        # pack results
        results = Data()
        results = stability

        return results
Exemplo n.º 5
0
    def __call__(self,conditions):
            """ process vehicle to setup geometry, condititon and configuration
                
                Inputs:
                    conditions - DataDict() of aerodynamic conditions
                    results - DataDict() of 
                    
                Outputs:

                    
                Assumptions:

                    
            """
            
            # unpack
            configuration = self.configuration
            geometry      = self.geometry
            q             = conditions.freestream.dynamic_pressure
            Sref          = geometry.reference_area    
            mach          = conditions.freestream.mach_number
            velocity      = conditions.freestream.velocity
            density       = conditions.freestream.density
            Span          = geometry.Wings['Main Wing'].span
            mac           = geometry.Wings['Main Wing'].chord_mac
            aero          = conditions.aerodynamics
            
            # Calculate CL_alpha 
            if not conditions.has_key('lift_curve_slope'):
                conditions.lift_curve_slope = (datcom(geometry.Wings['Main Wing'],mach))
            
            # Calculate change in downwash with respect to change in angle of attack
            for surf in geometry.Wings:
                e = surf.e
                sref = surf.sref
                span = (surf.ar * sref ) ** 0.5
                surf.CL_alpha = datcom(surf,mach)
                surf.ep_alpha = Supporting_Functions.ep_alpha(surf.CL_alpha, sref, span, e)
            
            # Static Stability Methods
            aero.cm_alpha = taw_cmalpha(geometry,mach,conditions,configuration)
            aero.cn_beta = taw_cnbeta(geometry,conditions,configuration)
            
            if np.count_nonzero(configuration.mass_props.I_cg) > 0:         
                # Dynamic Stability Approximation Methods
                if not aero.has_key('cn_r'):  
                    cDw = aero.drag_breakdown.parasite['Main Wing'].parasite_drag_coefficient # Might not be the correct value
                    l_v = geometry.Wings['Vertical Stabilizer'].origin[0] + geometry.Wings['Vertical Stabilizer'].aero_center[0] - geometry.Wings['Main Wing'].origin[0] - geometry.Wings['Main Wing'].aero_center[0]
                    aero.cn_r = Supporting_Functions.cn_r(cDw, geometry.Wings['Vertical Stabilizer'].sref, Sref, l_v, span, geometry.Wings['Vertical Stabilizer'].eta, geometry.Wings['Vertical Stabilizer'].CL_alpha)
                if not aero.has_key('cl_p'):
                    aero.cl_p = 0 # Need to see if there is a low fidelity way to calculate cl_p
                    
                if not aero.has_key('cl_beta'):
                    aero.cl_beta = 0 # Need to see if there is a low fidelity way to calculate cl_beta
                
                l_t = geometry.Wings['Horizontal Stabilizer'].origin[0] + geometry.Wings['Horizontal Stabilizer'].aero_center[0] - geometry.Wings['Main Wing'].origin[0] - geometry.Wings['Main Wing'].aero_center[0] #Need to check this is the length of the horizontal tail moment arm       
                
                if not aero.has_key('cm_q'):
                    aero.cm_q = Supporting_Functions.cm_q(conditions.lift_curve_slope, l_t,mac) # Need to check Cm_i versus Cm_alpha
                
                if not aero.has_key('cm_alpha_dot'):
                    aero.cm_alpha_dot = Supporting_Functions.cm_alphadot(aero.cm_alpha, geometry.Wings['Horizontal Stabilizer'].ep_alpha, l_t, mac) # Need to check Cm_i versus Cm_alpha
                    
                if not aero.has_key('cz_alpha'):
                    aero.cz_alpha = Supporting_Functions.cz_alpha(aero.drag_coefficient,conditions.lift_curve_slope)                   
                
                conditions.dutch_roll = Approximations.dutch_roll(velocity, aero.cn_beta, Sref, density, Span, configuration.mass_props.I_cg[2][2], aero.cn_r)
                
                if aero.cl_p != 0:                 
                    roll_tau = Approximations.roll(configuration.mass_props.I_cg[2][2], Sref, density, velocity, Span, aero.cl_p)
                    if aero.cl_beta != 0:
                        aero.cy_phi = Supporting_Functions.cy_phi(aero.lift_coefficient)
                        aero.cl_r = Supporting_Functions.cl_r( aero.lift_coefficient) # Will need to be changed
                        spiral_tau = Approximations.spiral(conditions.weights.total_mass, velocity, density, Sref, aero.cl_p, aero.cn_beta, aero.cy_phi, aero.cl_beta, aero.cn_r, aero.cl_r)
                conditions.short_period = Approximations.short_period(velocity, density, Sref, mac, aero.cm_q, aero.cz_alpha, conditions.weights.total_mass, aero.cm_alpha, configuration.mass_props.I_cg[1][1], aero.cm_alpha_dot)
                conditions.phugoid = Approximations.phugoid(conditions.freestream.gravity, conditions.freestream.velocity, aero.drag_coefficient, aero.lift_coefficient)
                
                # Dynamic Stability Full Linearized Methods
                if aero.has_key('cy_beta') and aero.cl_p != 0 and aero.cl_beta != 0:
                    if not aero.has_key('cy_psi'):
                        theta = conditions.frames.wind.body_rotations[:,1]
                        aero.cl_psi = Supporting_Functions.cy_psi(aero.lift_coefficient, theta)                     
                    if not aero.has_key('cz_u'):
                        if not aero.has_key('cL_u'):
                            aero.cL_u = 0
                        aero.cz_u = Supporting_Functions.cz_u(aero.lift_coefficient,velocity,aero.cL_u)
                    if not aero.has_key('cz_alpha_dot'):
                        aero.cz_alpha_dot = Supporting_Functions.cz_alphadot(aero.cm_alpha, geometry.Wings['Horizontal Stabilizer'].ep_alpha)
                    if not aero.has_key('cz_q'):
                        aero.cz_q = Supporting_Functions.cz_q(aero.cm_alpha)
                    if not aero.has_key('cx_u'):
                        aero.cx_u = Supporting_Functions.cx_u(aero.drag_coefficient)
                    if not aero.has_key('cx_alpha'):
                        aero.cx_alpha = Supporting_Functions.cx_alpha(aero.lift_coefficient, conditions.lift_curve_slope)
                
                    lateral_directional = Full_Linearized_Equations.lateral_directional(velocity, aero.cn_beta , Sref, density, Span, configuration.mass_props.I_cg[2][2], aero.cn_r, configuration.mass_props.I_cg[0][0], aero.cl_p, configuration.mass_props.I_cg[0][2], aero.cl_r, aero.cl_beta, aero.cn_p, aero.cy_phi, aero.cy_psi, aero.cy_beta, conditions.weights.total_mass)
                    longitudinal = Full_Linearized_Equations.longitudinal(velocity, density, Sref, mac, aero.cm_q, aero.cz_alpha, conditions.weights.total_mass, aero.cm_alpha, configuration.mass_props.I_cg[1][1], aero.cm_alpha_dot, aero.cz_u, aero.cz_alpha_dot, aero.cz_q, -aero.lift_coefficient, theta, aero.cx_u, aero.cx_alpha)
            
            return 
Exemplo n.º 6
0
def main():
    #Parameters Required
    #Using values for a Boeing 747-200 
    vehicle = SUAVE.Vehicle()
    wing = SUAVE.Components.Wings.Wing()
    wing.tag = 'Main Wing'
    wing.areas.reference           = 5500.0 * Units.feet**2
    wing.spans.projected           = 196.0  * Units.feet
    wing.chords.mean_aerodynamic = 27.3 * Units.feet
    wing.sweep       = 42.0   * Units.deg # Leading edge
    wing.taper          = 14.7/54.5
    wing.aspect_ratio   = wing.spans.projected**2/wing.areas.reference
    wing.symmetric      = True
    wing.origin           = np.array([58.6,0,0]) * Units.feet  
    wing.aerodynamic_center  = np.array([112., 0. , 0. ]) * Units.feet- wing.origin
    wing.eta            = 1.0
    wing.downwash_adj   = 1.0
    wing.ep_alpha       = 1. - wing.downwash_adj
    
    Mach                    = np.array([0.198])
    reference               = SUAVE.Structure.Container()
    conditions = Data()
    conditions.lift_curve_slope = datcom(wing,Mach)
    wing.CL_alpha = conditions.lift_curve_slope
    vehicle.reference_area   = wing.areas.reference
    vehicle.append_component(wing)
    
    lifting_surfaces    = []
    lifting_surfaces.append(wing)
    
    wing          = SUAVE.Components.Wings.Wing()
    wing.tag = 'Horizontal Stabilizer'
    wing.areas.reference     = 1490.55* Units.feet**2
    wing.spans.projected     = 71.6   * Units.feet
    wing.sweep = 44.0   * Units.deg # leading edge
    wing.taper    = 7.5/32.6
    wing.aspect_ratio = wing.spans.projected**2/wing.areas.reference
    wing.origin     = np.array([187.0,0,0])  * Units.feet
    wing.symmetric= True
    wing.eta      = 0.95
    wing.downwash_adj = 1.0 - 2.0*vehicle.wings['Main Wing'].CL_alpha/np.pi/wing.aspect_ratio
    wing.ep_alpha       = 1. - wing.downwash_adj    
    wing.aerodynamic_center  = [trapezoid_ac_x(wing), 0.0, 0.0] - wing.origin
    wing.CL_alpha = datcom(wing,Mach)
    vehicle.append_component(wing)
    lifting_surfaces.append(wing)
    
    fuselage = SUAVE.Components.Fuselages.Fuselage()
    fuselage.tag = 'Fuselage'
    fuselage.x_root_quarter_chord = 77.0 * Units.feet
    fuselage.lengths.total     = 229.7  * Units.feet
    fuselage.width      = 20.9   * Units.feet 
    vehicle.append_component(fuselage)
    
    configuration = Data()
    configuration.mass_properties = Data()
    configuration.mass_properties.center_of_gravity = Data()
    configuration.mass_properties.center_of_gravity = np.array([112.,0,0]) * Units.feet    
    
    #Method Test    
    cm_a = taw_cmalpha(vehicle,Mach,conditions,configuration)
    
    expected = 0.93 # Should be -1.45
    error = Data()
    error.cm_a_747 = (cm_a - expected)/expected
    
    #Parameters Required
    #Using values for a Beech 99 
    
    vehicle = SUAVE.Vehicle()
    wing = SUAVE.Components.Wings.Wing()
    wing.tag = 'Main Wing'
    wing.areas.reference           = 280.0 * Units.feet**2
    wing.spans.projected           = 46.0  * Units.feet
    wing.chords.mean_aerodynamic = 6.5 * Units.feet
    wing.sweep       = 3.0   * Units.deg # Leading edge
    wing.taper          = 0.47
    wing.aspect_ratio   = wing.spans.projected**2/wing.areas.reference
    wing.symmetric      = True
    wing.origin           = np.array([14.0,0,0]) * Units.feet  
    wing.aerodynamic_center  = np.array([trapezoid_ac_x(wing), 0. , 0. ]) - wing.origin
    wing.eta            = 1.0
    wing.downwash_adj   = 1.0
    wing.ep_alpha       = 1. - wing.downwash_adj
    
    Mach                    = np.array([0.152])
    reference               = SUAVE.Structure.Container()
    conditions = Data()
    conditions.lift_curve_slope = datcom(wing,Mach)
    wing.CL_alpha = conditions.lift_curve_slope
    vehicle.reference_area   = wing.areas.reference
    vehicle.append_component(wing)
    
    lifting_surfaces    = []
    lifting_surfaces.append(wing)
    
    wing          = SUAVE.Components.Wings.Wing()
    wing.tag = 'Horizontal Stabilizer'
    wing.areas.reference     = 100.5 * Units.feet**2
    wing.spans.projected     = 22.5   * Units.feet
    wing.sweep = 21   * Units.deg # leading edge
    wing.taper    = 3.1/6.17
    wing.aspect_ratio = wing.spans.projected**2/wing.areas.reference
    wing.origin     = np.array([36.3,0,0])  * Units.feet
    wing.symmetric= True
    wing.eta      = 0.95
    wing.downwash_adj = 1.0 - 2.0*vehicle.wings['Main Wing'].CL_alpha/np.pi/wing.aspect_ratio
    wing.ep_alpha       = 1. - wing.downwash_adj    
    wing.aerodynamic_center  = [trapezoid_ac_x(wing), 0.0, 0.0] - wing.origin
    wing.CL_alpha = datcom(wing,Mach)
    vehicle.append_component(wing)
    lifting_surfaces.append(wing)
    
    fuselage = SUAVE.Components.Fuselages.Fuselage()
    fuselage.tag = 'Fuselage'
    fuselage.x_root_quarter_chord = 5.4 * Units.feet
    fuselage.lengths.total     = 44.0  * Units.feet
    fuselage.width      = 5.4   * Units.feet 
    vehicle.append_component(fuselage)
    
    configuration = Data()
    configuration.mass_properties = Data()
    configuration.mass_properties.center_of_gravity = Data()
    configuration.mass_properties.center_of_gravity = np.array([17.2,0,0]) * Units.feet    
    
    #Method Test   
    
    cm_a = taw_cmalpha(vehicle,Mach,conditions,configuration)
    
    expected = 12.57 # Should be -2.08
    error.cm_a_beech_99 = (cm_a - expected)/expected   
    
    #Parameters Required
    #Using values for an SIAI Marchetti S-211
    vehicle = SUAVE.Vehicle()
    wing = SUAVE.Components.Wings.Wing()
    wing.tag = 'Main Wing'
    wing.areas.reference           = 136.0 * Units.feet**2
    wing.spans.projected           = 26.3  * Units.feet
    wing.chords.mean_aerodynamic = 5.4 * Units.feet
    wing.sweep       = 195   * Units.deg # Leading edge
    wing.taper          = 3.1/7.03
    wing.aspect_ratio   = wing.spans.projected**2/wing.areas.reference
    wing.symmetric      = True
    wing.origin           = np.array([12.11,0,0]) * Units.feet  
    wing.aerodynamic_center  = np.array([16.6, 0. , 0. ]) - wing.origin
    wing.eta            = 1.0
    wing.downwash_adj   = 1.0
    wing.ep_alpha       = 1. - wing.downwash_adj
    
    Mach                    = np.array([0.111])
    reference               = SUAVE.Structure.Container()
    conditions = Data()
    conditions.lift_curve_slope = datcom(wing,Mach)
    wing.CL_alpha = conditions.lift_curve_slope
    vehicle.reference_area   = wing.areas.reference
    vehicle.append_component(wing)
    
    lifting_surfaces    = []
    lifting_surfaces.append(wing)
    
    wing          = SUAVE.Components.Wings.Wing()
    wing.tag = 'Horizontal Stabilizer'
    wing.areas.reference     = 36.46 * Units.feet**2
    wing.spans.projected     = 13.3   * Units.feet
    wing.sweep = 18.5   * Units.deg # leading edge
    wing.taper    = 1.6/3.88
    wing.aspect_ratio = wing.spans.projected**2/wing.areas.reference
    wing.origin     = np.array([26.07,0.,0.]) * Units.feet
    wing.symmetric= True
    wing.eta      = 0.9
    wing.downwash_adj = 1.0 - 2.0*vehicle.wings['Main Wing'].CL_alpha/np.pi/wing.aspect_ratio
    wing.ep_alpha       = 1. - wing.downwash_adj    
    wing.aerodynamic_center  = [trapezoid_ac_x(wing), 0.0, 0.0] - wing.origin
    wing.CL_alpha = datcom(wing,Mach)
    vehicle.append_component(wing)
    lifting_surfaces.append(wing)
    
    fuselage = SUAVE.Components.Fuselages.Fuselage()
    fuselage.tag = 'Fuselage'
    fuselage.x_root_quarter_chord = 12.67 * Units.feet
    fuselage.lengths.total     = 30.9  * Units.feet
    fuselage.width      = ((2.94+5.9)/2)   * Units.feet 
    vehicle.append_component(fuselage)
    
    configuration = Data()
    configuration.mass_properties = Data()
    configuration.mass_properties.center_of_gravity = Data()
    configuration.mass_properties.center_of_gravity = np.array([16.6,0,0]) * Units.feet    
    
    #Method Test   
    
    cm_a = taw_cmalpha(vehicle,Mach,conditions,configuration)
    
    expected = -27.9 # should be -0.6

    error.cm_a_SIAI = (cm_a - expected)/expected

    for k,v in error.items():
        assert(np.abs(v)<0.005)
        
    return
Exemplo n.º 7
0
    def __call__(self,conditions):
        """ process vehicle to setup geometry, condititon and configuration
            
            Inputs:
                conditions - DataDict() of aerodynamic conditions
                results - DataDict() of 
                
            Outputs:

                
            Assumptions:

                
        """
        
        # unpack
        configuration   = self.configuration
        geometry        = self.geometry
        stability_model = self.stability_model
        
        q             = conditions.freestream.dynamic_pressure
        Sref          = geometry.reference_area    
        mach          = conditions.freestream.mach_number
        velocity      = conditions.freestream.velocity
        density       = conditions.freestream.density
        Span          = geometry.wings['main_wing'].spans.projected
        mac           = geometry.wings['main_wing'].chords.mean_aerodynamic
        aero          = conditions.aerodynamics
        
        # set up data structures
        static_stability = Data()
        dynamic_stability = Data()
        
        # Calculate CL_alpha 
        if not conditions.has_key('lift_curve_slope'):
            conditions.lift_curve_slope = datcom(geometry.wings['main_wing'],mach)
        
        # Calculate change in downwash with respect to change in angle of attack
        for surf in geometry.wings:
            sref = surf.areas.reference
            span = (surf.aspect_ratio * sref ) ** 0.5
            surf.CL_alpha = datcom(surf,mach)
            surf.ep_alpha = Supporting_Functions.ep_alpha(surf.CL_alpha, sref, span)
        
        # Static Stability Methods
        static_stability.cm_alpha = taw_cmalpha(geometry,mach,conditions,configuration)
        static_stability.cn_beta = taw_cnbeta(geometry,conditions,configuration)
        
        # Dynamic Stability
        if np.count_nonzero(configuration.mass_properties.moments_of_inertia.tensor) > 0:    
            # Dynamic Stability Approximation Methods - valid for non-zero I tensor
            
            # Derivative of yawing moment with respect to the rate of yaw
            cDw = aero.drag_breakdown.parasite['main_wing'].parasite_drag_coefficient # Might not be the correct value
            l_v = geometry.wings['vertical_stabilizer'].origin[0] + geometry.wings['vertical_stabilizer'].aerodynamic_center[0] - geometry.wings['main_wing'].origin[0] - geometry.wings['main_wing'].aerodynamic_center[0]
            dynamic_stability.cn_r = Supporting_Functions.cn_r(cDw, geometry.wings['vertical_stabilizer'].areas.reference, Sref, l_v, span, geometry.wings['vertical_stabilizer'].dynamic_pressure_ratio, geometry.wings['vertical_stabilizer'].CL_alpha)
            
            # Derivative of rolling moment with respect to roll rate
            dynamic_stability.cl_p = 0 # Need to see if there is a low fidelity way to calculate cl_p
            
            # Derivative of roll rate with respect to sideslip (dihedral effect)
            dynamic_stability.cl_beta = 0 # Need to see if there is a low fidelity way to calculate cl_beta
            
            # Derivative of pitching moment with respect to pitch rate
            l_t = geometry.wings['horizontal_stabilizer'].origin[0] + geometry.wings['horizontal_stabilizer'].aerodynamic_center[0] - geometry.wings['main_wing'].origin[0] - geometry.wings['main_wing'].aerodynamic_center[0] #Need to check this is the length of the horizontal tail moment arm       
            dynamic_stability.cm_q = Supporting_Functions.cm_q(conditions.lift_curve_slope, l_t,mac) # Need to check Cm_i versus Cm_alpha
            
            # Derivative of pitching rate with respect to d(alpha)/d(t)
            dynamic_stability.cm_alpha_dot = Supporting_Functions.cm_alphadot(static_stability.cm_alpha, geometry.wings['horizontal_stabilizer'].ep_alpha, l_t, mac) # Need to check Cm_i versus Cm_alpha
              
            # Derivative of Z-axis force with respect to angle of attack  
            dynamic_stability.cz_alpha = Supporting_Functions.cz_alpha(aero.drag_coefficient,conditions.lift_curve_slope)                   
            
            
            stability_model.dutch_roll = Approximations.dutch_roll(velocity, static_stability.cn_beta, Sref, density, Span, configuration.mass_properties.moments_of_inertia.tensor[2][2], dynamic_stability.cn_r)
            
            if dynamic_stability.cl_p != 0:                 
                stability_model.roll_tau = Approximations.roll(configuration.mass_properties.momen[2][2], Sref, density, velocity, Span, dynamic_stability.cl_p)
                dynamic_stability.cy_phi = Supporting_Functions.cy_phi(aero.lift_coefficient)
                dynamic_stability.cl_r = Supporting_Functions.cl_r( aero.lift_coefficient) # Will need to be changed
                stability_model.spiral_tau = Approximations.spiral(conditions.weights.total_mass, velocity, density, Sref, dynamic_stability.cl_p, static_stability.cn_beta, dynamic_stability.cy_phi, dynamic_stability.cl_beta, dynamic_stability.cn_r, dynamic_stability.cl_r)
            stability_model.short_period = Approximations.short_period(velocity, density, Sref, mac, dynamic_stability.cm_q, dynamic_stability.cz_alpha, conditions.weights.total_mass, static_stability.cm_alpha, configuration.mass_properties.moments_of_inertia.tensor[1][1], dynamic_stability.cm_alpha_dot)
            stability_model.phugoid = Approximations.phugoid(conditions.freestream.gravity, conditions.freestream.velocity, aero.drag_coefficient, aero.lift_coefficient)
            
            # Dynamic Stability Full Linearized Methods
            if aero.has_key('cy_beta') and dynamic_stability.cl_p != 0 and dynamic_stability.cl_beta != 0:
                theta = conditions.frames.wind.body_rotations[:,1]
                dynamic_stability.cy_beta = aero.cy_beta
                dynamic_stability.cl_psi = Supporting_Functions.cy_psi(aero.lift_coefficient, theta)                     
                dynamic_stability.cL_u = 0
                dynamic_stability.cz_u = Supporting_Functions.cz_u(aero.lift_coefficient,velocity,dynamic_stability.cL_u)
                dynamic_stability.cz_alpha_dot = Supporting_Functions.cz_alphadot(static_stability.cm_alpha, geometry.wings['horizontal_stabilizer'].ep_alpha)
                dynamic_stability.cz_q = Supporting_Functions.cz_q(static_stability.cm_alpha)
                dynamic_stability.cx_u = Supporting_Functions.cx_u(aero.drag_coefficient)
                dynamic_stability.cx_alpha = Supporting_Functions.cx_alpha(aero.lift_coefficient, conditions.lift_curve_slope)
            
                lateral_directional = Full_Linearized_Equations.lateral_directional(velocity, static_stability.cn_beta , Sref, density, Span, configuration.mass_properties.moments_of_inertia.tensor[2][2], dynamic_stability.cn_r, configuration.mass_properties.Moments_Of_Inertia.tensor[0][0], dynamic_stability.cl_p, configuration.mass_properties.moments_of_inertia.tensor[0][2], dynamic_stability.cl_r, dynamic_stability.cl_beta, dynamic_stability.cn_p, dynamic_stability.cy_phi, dynamic_stability.cy_psi, dynamic_stability.cy_beta, conditions.weights.total_mass)
                longitudinal = Full_Linearized_Equations.longitudinal(velocity, density, Sref, mac, dynamic_stability.cm_q, dynamic_stability.cz_alpha, conditions.weights.total_mass, static_stability.cm_alpha, configuration.mass_properties.moments_of_inertia.tensor[1][1], dynamic_stability.cm_alpha_dot, dynamic_stability.cz_u, dynamic_stability.cz_alpha_dot, dynamic_stability.cz_q, -aero.lift_coefficient, theta, dynamic_stability.cx_u, dynamic_stability.cx_alpha)                    
                stability_model.dutch_roll.natural_frequency = lateral_directional.dutch_natural_frequency
                stability_model.dutch_roll.damping_ratio = lateral_directional.dutch_damping_ratio
                stability_model.spiral_tau = lateral_directional.spiral_tau
                stability_model.roll_tau = lateral_directional.roll_tau
                stability_model.short_period.natural_frequency = longitudinal.short_natural_frequency
                stability_model.short_period.damping_ratio = longitudinal.short_damping_ratio
                stability_model.phugoid.natural_frequency = longitudinal.phugoid_natural_frequency
                stability_model.phugoid.damping_ratio = longitudinal.phugoid_damping_ratio
        
        # pack results
        results = Data()
        results.static  = static_stability
        results.dynamic = dynamic_stability
        
        return results
Exemplo n.º 8
0
    def __call__(self, conditions):
        """ process vehicle to setup geometry, condititon and configuration
                
                Inputs:
                    conditions - DataDict() of aerodynamic conditions
                    results - DataDict() of 
                    
                Outputs:

                    
                Assumptions:

                    
            """

        # unpack
        configuration = self.configuration
        geometry = self.geometry
        stability_model = self.stability_model
        q = conditions.freestream.dynamic_pressure
        Sref = geometry.reference_area
        mach = conditions.freestream.mach_number
        velocity = conditions.freestream.velocity
        density = conditions.freestream.density
        Span = geometry.wings['Main Wing'].spans.projected
        mac = geometry.wings['Main Wing'].chords.mean_aerodynamic
        aero = conditions.aerodynamics

        # Calculate CL_alpha
        if not conditions.has_key('lift_curve_slope'):
            conditions.lift_curve_slope = datcom(geometry.wings['Main Wing'],
                                                 mach)

        # Calculate change in downwash with respect to change in angle of attack
        for surf in geometry.wings:
            e = surf.span_efficiency
            sref = surf.areas.reference
            span = (surf.aspect_ratio * sref)**0.5
            surf.CL_alpha = datcom(surf, mach)
            surf.ep_alpha = Supporting_Functions.ep_alpha(
                surf.CL_alpha, sref, span, e)

        # Static Stability Methods
        aero.cm_alpha = taw_cmalpha(geometry, mach, conditions, configuration)
        aero.cn_beta = taw_cnbeta(geometry, conditions, configuration)

        if np.count_nonzero(
                configuration.mass_properties.moments_of_inertia.tensor) > 0:
            # Dynamic Stability Approximation Methods
            if not aero.has_key('cn_r'):
                cDw = aero.drag_breakdown.parasite[
                    'Main Wing'].parasite_drag_coefficient  # Might not be the correct value
                l_v = geometry.wings['Vertical Stabilizer'].origin[
                    0] + geometry.wings[
                        'Vertical Stabilizer'].aerodynamic_center[
                            0] - geometry.wings['Main Wing'].origin[
                                0] - geometry.wings[
                                    'Main Wing'].aerodynamic_center[0]
                aero.cn_r = Supporting_Functions.cn_r(
                    cDw, geometry.wings['Vertical Stabilizer'].areas.reference,
                    Sref, l_v, span, geometry.wings['Vertical Stabilizer'].eta,
                    geometry.wings['Vertical Stabilizer'].CL_alpha)
            if not aero.has_key('cl_p'):
                aero.cl_p = 0  # Need to see if there is a low fidelity way to calculate cl_p

            if not aero.has_key('cl_beta'):
                aero.cl_beta = 0  # Need to see if there is a low fidelity way to calculate cl_beta

                l_t = geometry.wings['Horizontal Stabilizer'].origin[
                    0] + geometry.wings['Horizontal Stabilizer'].aerodynamic_center[
                        0] - geometry.wings['Main Wing'].origin[
                            0] - geometry.wings['Main Wing'].aerodynamic_center[
                                0]  #Need to check this is the length of the horizontal tail moment arm

            if not aero.has_key('cm_q'):
                aero.cm_q = Supporting_Functions.cm_q(
                    conditions.lift_curve_slope, l_t,
                    mac)  # Need to check Cm_i versus Cm_alpha

            if not aero.has_key('cm_alpha_dot'):
                aero.cm_alpha_dot = Supporting_Functions.cm_alphadot(
                    aero.cm_alpha,
                    geometry.wings['Horizontal Stabilizer'].ep_alpha, l_t,
                    mac)  # Need to check Cm_i versus Cm_alpha

            if not aero.has_key('cz_alpha'):
                aero.cz_alpha = Supporting_Functions.cz_alpha(
                    aero.drag_coefficient, conditions.lift_curve_slope)

            stability_model.dutch_roll = Approximations.dutch_roll(
                velocity, aero.cn_beta, Sref, density, Span,
                configuration.mass_properties.moments_of_inertia.tensor[2][2],
                aero.cn_r)

            if aero.cl_p != 0:
                stability_model.roll_tau = Approximations.roll(
                    configuration.mass_properties.momen[2][2], Sref, density,
                    velocity, Span, aero.cl_p)
                if aero.cl_beta != 0:
                    aero.cy_phi = Supporting_Functions.cy_phi(
                        aero.lift_coefficient)
                    aero.cl_r = Supporting_Functions.cl_r(
                        aero.lift_coefficient)  # Will need to be changed
                    stability_model.spiral_tau = Approximations.spiral(
                        conditions.weights.total_mass, velocity, density, Sref,
                        aero.cl_p, aero.cn_beta, aero.cy_phi, aero.cl_beta,
                        aero.cn_r, aero.cl_r)
            stability_model.short_period = Approximations.short_period(
                velocity, density, Sref, mac, aero.cm_q, aero.cz_alpha,
                conditions.weights.total_mass, aero.cm_alpha,
                configuration.mass_properties.moments_of_inertia.tensor[1][1],
                aero.cm_alpha_dot)
            stability_model.phugoid = Approximations.phugoid(
                conditions.freestream.gravity, conditions.freestream.velocity,
                aero.drag_coefficient, aero.lift_coefficient)

            # Dynamic Stability Full Linearized Methods
            if aero.has_key(
                    'cy_beta') and aero.cl_p != 0 and aero.cl_beta != 0:
                if not aero.has_key('cy_psi'):
                    theta = conditions.frames.wind.body_rotations[:, 1]
                    aero.cl_psi = Supporting_Functions.cy_psi(
                        aero.lift_coefficient, theta)
                if not aero.has_key('cz_u'):
                    if not aero.has_key('cL_u'):
                        aero.cL_u = 0
                    aero.cz_u = Supporting_Functions.cz_u(
                        aero.lift_coefficient, velocity, aero.cL_u)
                if not aero.has_key('cz_alpha_dot'):
                    aero.cz_alpha_dot = Supporting_Functions.cz_alphadot(
                        aero.cm_alpha,
                        geometry.wings['Horizontal Stabilizer'].ep_alpha)
                if not aero.has_key('cz_q'):
                    aero.cz_q = Supporting_Functions.cz_q(aero.cm_alpha)
                if not aero.has_key('cx_u'):
                    aero.cx_u = Supporting_Functions.cx_u(
                        aero.drag_coefficient)
                if not aero.has_key('cx_alpha'):
                    aero.cx_alpha = Supporting_Functions.cx_alpha(
                        aero.lift_coefficient, conditions.lift_curve_slope)

                lateral_directional = Full_Linearized_Equations.lateral_directional(
                    velocity, aero.cn_beta, Sref, density, Span,
                    configuration.mass_properties.moments_of_inertia.tensor[2]
                    [2], aero.cn_r,
                    configuration.mass_properties.Moments_Of_Inertia.tensor[0]
                    [0], aero.cl_p,
                    configuration.mass_properties.moments_of_inertia.tensor[0]
                    [2], aero.cl_r, aero.cl_beta, aero.cn_p, aero.cy_phi,
                    aero.cy_psi, aero.cy_beta, conditions.weights.total_mass)
                longitudinal = Full_Linearized_Equations.longitudinal(
                    velocity, density, Sref, mac, aero.cm_q, aero.cz_alpha,
                    conditions.weights.total_mass, aero.cm_alpha,
                    configuration.mass_properties.moments_of_inertia.tensor[1]
                    [1], aero.cm_alpha_dot, aero.cz_u, aero.cz_alpha_dot,
                    aero.cz_q, -aero.lift_coefficient, theta, aero.cx_u,
                    aero.cx_alpha)
                stability_model.dutch_roll.natural_frequency = lateral_directional.dutch_natural_frequency
                stability_model.dutch_roll.damping_ratio = lateral_directional.dutch_damping_ratio
                stability_model.spiral_tau = lateral_directional.spiral_tau
                stability_model.roll_tau = lateral_directional.roll_tau
                stability_model.short_period.natural_frequency = longitudinal.short_natural_frequency
                stability_model.short_period.damping_ratio = longitudinal.short_damping_ratio
                stability_model.phugoid.natural_frequency = longitudinal.phugoid_natural_frequency
                stability_model.phugoid.damping_ratio = longitudinal.phugoid_damping_ratio

        return
Exemplo n.º 9
0
def main():
    #Parameters Required
    #Using values for a Boeing 747-200  
    vehicle = SUAVE.Vehicle()
    #print vehicle
    vehicle.mass_properties.max_zero_fuel=238780*Units.kg
    vehicle.mass_properties.max_takeoff  =785000.*Units.lbs
    wing = SUAVE.Components.Wings.Wing()
    wing.tag = 'main_wing'
    wing.areas.reference           = 5500.0 * Units.feet**2
    wing.spans.projected           = 196.0  * Units.feet
    wing.chords.mean_aerodynamic   = 27.3 * Units.feet
    wing.chords.root               = 42.9 * Units.feet  #54.5ft
    wing.sweep          = 42.0   * Units.deg # Leading edge
    wing.taper          = 14.7/42.9  #14.7/54.5
    wing.aspect_ratio   = wing.spans.projected**2/wing.areas.reference
    wing.symmetric      = True
    wing.vertical       = False
    wing.origin         = np.array([58.6,0,0]) * Units.feet  
    wing.aerodynamic_center     = np.array([112.2*Units.feet,0.,0.])-wing.origin#16.16 * Units.meters,0.,0,])
    wing.dynamic_pressure_ratio = 1.0
    wing.ep_alpha               = 0.0
    
    span_location_mac                        =compute_span_location_from_chord_length(wing, wing.chords.mean_aerodynamic)
    mac_le_offset                            =.8*np.sin(wing.sweep)*span_location_mac  #assume that 80% of the chord difference is from leading edge sweep
    wing.mass_properties.center_of_gravity[0]=.3*wing.chords.mean_aerodynamic+mac_le_offset
    
    
    Mach                         = np.array([0.198])
    conditions                   = Data()
    conditions.weights           = Data()
    conditions.lift_curve_slope  = datcom(wing,Mach)
    conditions.weights.total_mass=np.array([[vehicle.mass_properties.max_takeoff]]) 
   
    wing.CL_alpha                = conditions.lift_curve_slope
    vehicle.reference_area       = wing.areas.reference
    vehicle.append_component(wing)
    
    main_wing_CLa = wing.CL_alpha
    main_wing_ar  = wing.aspect_ratio
    
    wing                     = SUAVE.Components.Wings.Wing()
    wing.tag = 'horizontal_stabilizer'
    wing.areas.reference     = 1490.55* Units.feet**2
    wing.spans.projected     = 71.6   * Units.feet
    wing.sweep               = 44.0   * Units.deg # leading edge
    wing.taper               = 7.5/32.6
    wing.aspect_ratio        = wing.spans.projected**2/wing.areas.reference
    wing.origin              = np.array([187.0,0,0])  * Units.feet
    wing.symmetric           = True
    wing.vertical            = False
    wing.dynamic_pressure_ratio = 0.95
    wing.ep_alpha            = 2.0*main_wing_CLa/np.pi/main_wing_ar    
    wing.aerodynamic_center  = [trapezoid_ac_x(wing), 0.0, 0.0]
    wing.CL_alpha            = datcom(wing,Mach)
    vehicle.append_component(wing)
    
    fuselage = SUAVE.Components.Fuselages.Fuselage()
    fuselage.tag = 'fuselage'
    fuselage.x_root_quarter_chord = 77.0 * Units.feet
    fuselage.lengths.total     = 229.7  * Units.feet
    fuselage.width      = 20.9   * Units.feet 
    vehicle.append_component(fuselage)
    vehicle.mass_properties.center_of_gravity=np.array([112.2,0,0]) * Units.feet  
    
    
    
 
    #configuration.mass_properties.zero_fuel_center_of_gravity=np.array([76.5,0,0])*Units.feet #just put a number here that got the expected value output; may want to change
    fuel                                                     =SUAVE.Components.Physical_Component()
    fuel.origin                                              =wing.origin
    fuel.mass_properties.center_of_gravity                   =wing.mass_properties.center_of_gravity
    fuel.mass_properties.mass                                =vehicle.mass_properties.max_takeoff-vehicle.mass_properties.max_zero_fuel
   
    
    #find zero_fuel_center_of_gravity
    cg                   =vehicle.mass_properties.center_of_gravity
    MTOW                 =vehicle.mass_properties.max_takeoff
    fuel_cg              =fuel.origin+fuel.mass_properties.center_of_gravity
    fuel_mass            =fuel.mass_properties.mass
    
    
    sum_moments_less_fuel=(cg*MTOW-fuel_cg*fuel_mass)
    
    
    #now define configuration for calculation
    configuration = Data()
    configuration.mass_properties                            = Data()
    configuration.mass_properties.center_of_gravity          = vehicle.mass_properties.center_of_gravity
    configuration.mass_properties.max_zero_fuel              =vehicle.mass_properties.max_zero_fuel
    configuration.fuel                                       =fuel
    
    configuration.mass_properties.zero_fuel_center_of_gravity=sum_moments_less_fuel/vehicle.mass_properties.max_zero_fuel
  
    
    #print configuration
    cm_a = taw_cmalpha(vehicle,Mach,conditions,configuration)
    expected =-1.56222373 #Should be -1.45
    error = Data()
    error.cm_a_747 = (cm_a - expected)/expected
    
    
    #Parameters Required
    #Using values for a Beech 99 
    
    vehicle = SUAVE.Vehicle()
    vehicle.mass_properties.max_takeoff  =4727*Units.kg #from Wikipedia
    vehicle.mass_properties.empty        =2515*Units.kg
    vehicle.mass_properties.max_zero_fuel=vehicle.mass_properties.max_takeoff-vehicle.mass_properties.empty+15.*225*Units.lbs #15 passenger ac
    
    wing = SUAVE.Components.Wings.Wing()
    wing.tag = 'main_wing'
    wing.areas.reference           = 280.0 * Units.feet**2
    wing.spans.projected           = 46.0  * Units.feet
    wing.chords.mean_aerodynamic   = 6.5 * Units.feet
    wing.chords.root               = 7.9 * Units.feet
    wing.sweep          = 4.0   * Units.deg # Leading edge
    wing.taper          = 0.47
    wing.aspect_ratio   = wing.spans.projected**2/wing.areas.reference
    wing.symmetric      = True
    wing.vertical       = False
    wing.origin         = np.array([15.,0,0]) * Units.feet  
    wing.aerodynamic_center     = np.array([trapezoid_ac_x(wing), 0. , 0. ])
    wing.dynamic_pressure_ratio = 1.0
    wing.ep_alpha               = 0.0
    span_location_mac                        =compute_span_location_from_chord_length(wing, wing.chords.mean_aerodynamic)
    mac_le_offset                            =.8*np.sin(wing.sweep)*span_location_mac  #assume that 80% of the chord difference is from leading edge sweep
    wing.mass_properties.center_of_gravity[0]=.3*wing.chords.mean_aerodynamic+mac_le_offset
    
    
    
    
    
    Mach = np.array([0.152])
    reference = SUAVE.Core.Container()
    conditions = Data()
    conditions.lift_curve_slope = datcom(wing,Mach)
    
    conditions.weights=Data()
    conditions.weights.total_mass=np.array([[vehicle.mass_properties.max_takeoff]]) 
   
    wing.CL_alpha               = conditions.lift_curve_slope
    vehicle.reference_area      = wing.areas.reference
    vehicle.append_component(wing)
    
    main_wing_CLa = wing.CL_alpha
    main_wing_ar  = wing.aspect_ratio
    
    wing = SUAVE.Components.Wings.Wing()
    wing.tag                 = 'horizontal_stabilizer'
    wing.areas.reference     = 100.5 * Units.feet**2
    wing.spans.projected     = 22.5  * Units.feet
    wing.sweep               = 21.   * Units.deg # leading edge
    wing.taper               = 3.1/6.17
    wing.aspect_ratio        = wing.spans.projected**2/wing.areas.reference
    wing.origin              = np.array([36.3,0,0])  * Units.feet
    wing.symmetric           = True
    wing.vertical            = False
    wing.dynamic_pressure_ratio = 0.95
    wing.ep_alpha            = 2.0*main_wing_CLa/np.pi/main_wing_ar
    wing.aerodynamic_center  = np.array([trapezoid_ac_x(wing), 0.0, 0.0])
    wing.CL_alpha            = datcom(wing,Mach)
    vehicle.append_component(wing)
    
    fuselage = SUAVE.Components.Fuselages.Fuselage()
    fuselage.tag                  = 'fuselage'
    fuselage.x_root_quarter_chord = 5.4 * Units.feet
    fuselage.lengths.total        = 44.0  * Units.feet
    fuselage.width                = 5.4   * Units.feet 
    vehicle.append_component(fuselage)
    
    vehicle.mass_properties.center_of_gravity = np.array([17.2,0,0]) * Units.feet   
    
    
    fuel.origin                                              =wing.origin
    fuel.mass_properties.center_of_gravity                   =wing.mass_properties.center_of_gravity
    fuel.mass_properties.mass                                =vehicle.mass_properties.max_takeoff-vehicle.mass_properties.max_zero_fuel
   
    
    
    #find zero_fuel_center_of_gravity
    cg                   =vehicle.mass_properties.center_of_gravity
    MTOW                 =vehicle.mass_properties.max_takeoff
    fuel_cg              =fuel.origin+fuel.mass_properties.center_of_gravity
    fuel_mass            =fuel.mass_properties.mass

    
    sum_moments_less_fuel=(cg*MTOW-fuel_cg*fuel_mass)
    
    
    #now define configuration for calculation
    configuration = Data()
    configuration.mass_properties                            = Data()
    configuration.mass_properties.center_of_gravity          = vehicle.mass_properties.center_of_gravity
    configuration.mass_properties.max_zero_fuel              = vehicle.mass_properties.max_zero_fuel
    configuration.fuel                                       =fuel
    
    configuration.mass_properties.zero_fuel_center_of_gravity=sum_moments_less_fuel/vehicle.mass_properties.max_zero_fuel
    
    
    #Method Test   
    #print configuration
    cm_a = taw_cmalpha(vehicle,Mach,conditions,configuration)
    expected = -2.48843437 #Should be -2.08
    error.cm_a_beech_99 = (cm_a - expected)/expected   
    
    
    #Parameters Required
    #Using values for an SIAI Marchetti S-211
    
    vehicle = SUAVE.Vehicle()
    vehicle.mass_properties.max_takeoff  =2750*Units.kg #from Wikipedia
    vehicle.mass_properties.empty        =1850*Units.kg
    vehicle.mass_properties.max_zero_fuel=vehicle.mass_properties.max_takeoff-vehicle.mass_properties.empty+2.*225*Units.lbs #2 passenger ac
    
    wing = SUAVE.Components.Wings.Wing()
    wing.tag = 'main_wing'
    wing.areas.reference           = 136.0 * Units.feet**2
    wing.spans.projected           = 26.3  * Units.feet
    wing.chords.mean_aerodynamic   = 5.4   * Units.feet
    wing.chords.root               = 7.03  * Units.feet
    wing.chords.tip                = 3.1   * Units.feet
    wing.sweep          = 19.5  * Units.deg # Leading edge
    wing.taper          = 3.1/7.03
    wing.aspect_ratio   = wing.spans.projected**2/wing.areas.reference
    wing.symmetric      = True
    wing.vertical       = False
    wing.origin         = np.array([13.5,0,0]) * Units.feet  
    wing.aerodynamic_center  = np.array([trapezoid_ac_x(wing),0.,0.])#16.6, 0. , 0. ]) * Units.feet - wing.origin
    wing.dynamic_pressure_ratio = 1.0
    wing.ep_alpha       = 0.0
    
    span_location_mac                        =compute_span_location_from_chord_length(wing, wing.chords.mean_aerodynamic)
    mac_le_offset                            =.8*np.sin(wing.sweep)*span_location_mac  #assume that 80% of the chord difference is from leading edge sweep
    wing.mass_properties.center_of_gravity[0]=.3*wing.chords.mean_aerodynamic+mac_le_offset
    
       
    
    Mach = np.array([0.111])
    conditions = Data()
    conditions.lift_curve_slope = datcom(wing,Mach)
    conditions.weights=Data()
    conditions.weights.total_mass=np.array([[vehicle.mass_properties.max_takeoff]]) 
   
    
    
    
    wing.CL_alpha               = conditions.lift_curve_slope
    vehicle.reference_area      = wing.areas.reference
    vehicle.append_component(wing)
    
    main_wing_CLa = wing.CL_alpha
    main_wing_ar  = wing.aspect_ratio

    wing = SUAVE.Components.Wings.Wing()
    wing.tag                 = 'horizontal_stabilizer'
    wing.areas.reference     = 36.46 * Units.feet**2
    wing.spans.projected     = 13.3   * Units.feet
    wing.sweep               = 18.5   * Units.deg # leading edge
    wing.taper               = 1.6/3.88
    wing.aspect_ratio        = wing.spans.projected**2/wing.areas.reference
    wing.origin              = np.array([26.07,0.,0.]) * Units.feet
    wing.symmetric           = True
    wing.vertical            = False
    wing.dynamic_pressure_ratio = 0.9
    wing.ep_alpha            = 2.0*main_wing_CLa/np.pi/main_wing_ar
    wing.aerodynamic_center  = np.array([trapezoid_ac_x(wing), 0.0, 0.0])
    wing.CL_alpha            = datcom(wing,Mach)
    
    span_location_mac                        =compute_span_location_from_chord_length(wing, wing.chords.mean_aerodynamic)
    mac_le_offset                            =.8*np.sin(wing.sweep)*span_location_mac  #assume that 80% of the chord difference is from leading edge sweep
    wing.mass_properties.center_of_gravity[0]=.3*wing.chords.mean_aerodynamic+mac_le_offset
    
    
    
    
    
    
    
    vehicle.append_component(wing)
    
    fuselage = SUAVE.Components.Fuselages.Fuselage()
    fuselage.tag = 'fuselage'
    fuselage.x_root_quarter_chord = 12.67 * Units.feet
    fuselage.lengths.total        = 30.9  * Units.feet
    fuselage.width                = ((2.94+5.9)/2)   * Units.feet 
    vehicle.append_component(fuselage)
    vehicle.mass_properties.center_of_gravity = np.array([16.6,0,0]) * Units.feet    
    
    
    
    
    fuel.origin                                              =wing.origin
    fuel.mass_properties.center_of_gravity                   =wing.mass_properties.center_of_gravity
    fuel.mass_properties.mass                                =vehicle.mass_properties.max_takeoff-vehicle.mass_properties.max_zero_fuel
   
    
    
    #find zero_fuel_center_of_gravity
    cg                   =vehicle.mass_properties.center_of_gravity
    MTOW                 =vehicle.mass_properties.max_takeoff
    fuel_cg              =fuel.origin+fuel.mass_properties.center_of_gravity
    fuel_mass            =fuel.mass_properties.mass

    sum_moments_less_fuel=(cg*MTOW-fuel_cg*fuel_mass)
    
    
    #now define configuration for calculation
    configuration = Data()
    configuration.mass_properties                            = Data()
    configuration.mass_properties.center_of_gravity          = vehicle.mass_properties.center_of_gravity
    configuration.mass_properties.max_zero_fuel              = vehicle.mass_properties.max_zero_fuel
    configuration.fuel                                       =fuel
    
    configuration.mass_properties.zero_fuel_center_of_gravity=sum_moments_less_fuel/vehicle.mass_properties.max_zero_fuel
    
    
    
    #Method Test   
    #print configuration
    cm_a = taw_cmalpha(vehicle,Mach,conditions,configuration)
   
    expected = -0.54071741 #Should be -0.6
    error.cm_a_SIAI = (cm_a - expected)/expected
    print error
    for k,v in error.items():
        assert(np.abs(v)<0.01)
        
    return
Exemplo n.º 10
0
fuselage            = SUAVE.Components.Fuselages.Fuselage()
fuselage.x_root_quarter_chord = 77.0 * Units.feet
fuselage.length     = 229.7  * Units.feet
fuselage.w_max      = 20.9   * Units.feet 

aircraft                  = SUAVE.Vehicle()
aircraft.reference        = reference
aircraft.Lifting_Surfaces = Lifting_Surfaces
aircraft.fuselage         = fuselage
aircraft.Mass_Props.pos_cg[0] = 112. * Units.feet    

#Method Test
print '<<Test run of the taw_cmalpha() method>>'
print '--Boeing 747 at Mach {0}--'.format(Mach)

cm_a = taw_cmalpha(aircraft,Mach)

expected = -1.45
print 'Cm_alpha       = {0:.4f}'.format(cm_a)
print 'Expected value = {}'.format(expected)
print 'Percent Error  = {0:.2f}%'.format(100.0*(cm_a-expected)/expected)
print 'Static Margin  = {0:.4f}'.format(-cm_a/reference.CL_alpha_wing)
print ' '


#Parameters Required
#Using values for a Beech 99  
wing                = SUAVE.Components.Wings.Wing()
wing.area           = 280.0 * Units.feet**2
wing.span           = 46.0  * Units.feet
wing.sweep_le       = 3.0   * Units.deg
Exemplo n.º 11
0
def main():

    from Boeing_747 import vehicle_setup, configs_setup
    vehicle = vehicle_setup()
    configs = configs_setup(vehicle)
    Mach                          = np.array([0.198])
    
    #conditions object used to create mission-like structure
    conditions                    = Data()
    conditions.weights            = Data()
    conditions.lift_curve_slope   = configs.base.wings['main_wing'].CL_alpha 
    conditions.weights.total_mass = np.array([[vehicle.mass_properties.max_takeoff]]) 
    conditions.aerodynamics       = Data()
    conditions.aerodynamics.angle_of_attack = 0.
   
    #print configuration
    cm_a           = taw_cmalpha(vehicle,Mach,conditions,configs.base)[0]
    expected       = -1.56222373 #Should be -1.45
    error          = Data()
    error.cm_a_747 = (cm_a - expected)/expected
    
    
    from Beech_99 import vehicle_setup, configs_setup
    vehicle = vehicle_setup()
    configs = configs_setup(vehicle)
    Mach    = np.array([0.152])
    
    #conditions object used to create mission-like structure
    conditions                    = Data()
    conditions.weights            = Data()
    conditions.lift_curve_slope   = configs.base.wings['main_wing'].CL_alpha 
    conditions.weights.total_mass = np.array([[vehicle.mass_properties.max_takeoff]]) 
    conditions.aerodynamics       = Data()
    conditions.aerodynamics.angle_of_attack = 0.    
   
    
    #Method Test   
    #print configuration
    cm_a = taw_cmalpha(vehicle,Mach,conditions,configs.base)[0]
    expected = -2.48843437 #Should be -2.08
    error.cm_a_beech_99 = (cm_a - expected)/expected   
    
    
    from SIAI_Marchetti_S211 import vehicle_setup, configs_setup
    vehicle = vehicle_setup()
    configs = configs_setup(vehicle)
    Mach                          = np.array([0.111])
    #conditions object used to create mission-like structure
    conditions                    = Data()
    conditions.weights            = Data()
    conditions.lift_curve_slope   = configs.base.wings['main_wing'].CL_alpha 
    conditions.weights.total_mass = np.array([[vehicle.mass_properties.max_takeoff]]) 
    conditions.aerodynamics       = Data()
    conditions.aerodynamics.angle_of_attack = 0.    
   
    
    
    cm_a = taw_cmalpha(vehicle,Mach,conditions,configs.base)[0]
   
    expected = -0.54071741 #Should be -0.6
    error.cm_a_SIAI = (cm_a - expected)/expected
    print error
    for k,v in error.items():
        assert(np.abs(v)<0.01)
        
    return
Exemplo n.º 12
0
def main():

    from Boeing_747 import vehicle_setup, configs_setup
    vehicle = vehicle_setup()
    configs = configs_setup(vehicle)
    Mach = np.array([0.198])

    #conditions object used to create mission-like structure
    conditions = Data()
    conditions.weights = Data()
    conditions.lift_curve_slope = configs.base.wings['main_wing'].CL_alpha
    conditions.weights.total_mass = np.array(
        [[vehicle.mass_properties.max_takeoff]])
    conditions.aerodynamics = Data()
    conditions.aerodynamics.angle_of_attack = 0.

    #print configuration
    cm_a = taw_cmalpha(vehicle, Mach, conditions, configs.base)[0]
    expected = -1.56222373  #Should be -1.45
    error = Data()
    error.cm_a_747 = (cm_a - expected) / expected

    from Beech_99 import vehicle_setup, configs_setup
    vehicle = vehicle_setup()
    configs = configs_setup(vehicle)
    Mach = np.array([0.152])

    #conditions object used to create mission-like structure
    conditions = Data()
    conditions.weights = Data()
    conditions.lift_curve_slope = configs.base.wings['main_wing'].CL_alpha
    conditions.weights.total_mass = np.array(
        [[vehicle.mass_properties.max_takeoff]])
    conditions.aerodynamics = Data()
    conditions.aerodynamics.angle_of_attack = 0.

    #Method Test
    #print configuration
    cm_a = taw_cmalpha(vehicle, Mach, conditions, configs.base)[0]
    expected = -2.48843437  #Should be -2.08
    error.cm_a_beech_99 = (cm_a - expected) / expected

    from SIAI_Marchetti_S211 import vehicle_setup, configs_setup
    vehicle = vehicle_setup()
    configs = configs_setup(vehicle)
    Mach = np.array([0.111])
    #conditions object used to create mission-like structure
    conditions = Data()
    conditions.weights = Data()
    conditions.lift_curve_slope = configs.base.wings['main_wing'].CL_alpha
    conditions.weights.total_mass = np.array(
        [[vehicle.mass_properties.max_takeoff]])
    conditions.aerodynamics = Data()
    conditions.aerodynamics.angle_of_attack = 0.

    cm_a = taw_cmalpha(vehicle, Mach, conditions, configs.base)[0]

    expected = -0.54071741  #Should be -0.6
    error.cm_a_SIAI = (cm_a - expected) / expected
    print error
    for k, v in error.items():
        assert (np.abs(v) < 0.01)

    return