Exemple #1
0
def calcPhiLESpoiler(outerEta, innerEta, outerXsi, innerXsi, myWing, cpacsWing):
    '''
    Calculates the angle phi of the leading edge of a spoiler given
    a combination of eta and xsi coordinates 
    '''
    span = myWing.span.getValue() / 2.
    phiLE = myWing.phiLE.getValue()
    
    deltaY = (outerEta - innerEta) * span

    absInnerX = innerXsi * calcChordLengthAtEta(innerEta, myWing, cpacsWing) + tan(phiLE * rad) * span * innerEta
    absOuterX = outerXsi * calcChordLengthAtEta(outerEta, myWing, cpacsWing) + tan(phiLE * rad) * span * outerEta
    deltaX = absOuterX - absInnerX
    
    phiSpoilerLE = atan(deltaX / deltaY)
    
    return phiSpoilerLE
Exemple #2
0
def calcPhiLESpoiler(outerEta, innerEta, outerXsi, innerXsi, myWing,
                     cpacsWing):
    '''
    Calculates the angle phi of the leading edge of a spoiler given
    a combination of eta and xsi coordinates 
    '''
    span = myWing.span.getValue() / 2.
    phiLE = myWing.phiLE.getValue()

    deltaY = (outerEta - innerEta) * span

    absInnerX = innerXsi * calcChordLengthAtEta(
        innerEta, myWing, cpacsWing) + tan(phiLE * rad) * span * innerEta
    absOuterX = outerXsi * calcChordLengthAtEta(
        outerEta, myWing, cpacsWing) + tan(phiLE * rad) * span * outerEta
    deltaX = absOuterX - absInnerX

    phiSpoilerLE = atan(deltaX / deltaY)

    return phiSpoilerLE
Exemple #3
0
def createSpoilers(parentWingCPACS, parentWingVAMPzero, mySpoiler):
    '''
    This is the main export method for the wing's spoilers
    
    * It assumes a constant absolut chord for all spoilers
    * Spoiler start outboard and move inboard close behind the rearspar
    * They are rectangular
    
    '''
    cpacsPath = '/cpacs/vehicles/aircraft/model/wings/wing[' + parentWingVAMPzero.id + ']'
    cpacsWing = getObjfromXpath(parentWingCPACS, cpacsPath)
    cpacsComponentSegment = cpacsWing.get_componentSegments().get_componentSegment()[0]
    mySpoilers = []

    #===========================================================================
    # Initialization, i.e. fetching values throughout the code
    #===========================================================================
    span = parentWingVAMPzero.span.getValue() / 2.
    etaKink = parentWingVAMPzero.etaKink.getValue()
    yFus = parentWingVAMPzero.yFuselage.getValue()
    etaFus = yFus / span
 
    spoilerArea = mySpoiler.refArea.getValue()
    spoilerChord = mySpoiler.chord.getValue()
    spoilerOuterEta = mySpoiler.outerEta.getValue()
    
    sparOffset = 0.02

    #===========================================================================
    # Rear spar locations
    #===========================================================================
    xsiSparRoot = eval(cpacsComponentSegment.get_structure().get_spars().get_sparPositions().get_sparPosition()[3].get_xsi().valueOf_)
    xsiSparFuselage = eval(cpacsComponentSegment.get_structure().get_spars().get_sparPositions().get_sparPosition()[4].get_xsi().valueOf_)
    xsiSparKink = eval(cpacsComponentSegment.get_structure().get_spars().get_sparPositions().get_sparPosition()[5].get_xsi().valueOf_)
    xsiSparTip = eval(cpacsComponentSegment.get_structure().get_spars().get_sparPositions().get_sparPosition()[6].get_xsi().valueOf_)

    etaSparRoot = eval(cpacsComponentSegment.get_structure().get_spars().get_sparPositions().get_sparPosition()[3].get_eta().valueOf_)
    etaSparFuselage = eval(cpacsComponentSegment.get_structure().get_spars().get_sparPositions().get_sparPosition()[4].get_eta().valueOf_)
    etaSparKink = eval(cpacsComponentSegment.get_structure().get_spars().get_sparPositions().get_sparPosition()[5].get_eta().valueOf_)
    etaSparTip = eval(cpacsComponentSegment.get_structure().get_spars().get_sparPositions().get_sparPosition()[6].get_eta().valueOf_)

    xsiSpar_interp = scipy.interpolate.interp1d([etaSparRoot, etaSparFuselage, etaSparKink, etaSparTip], [xsiSparRoot, xsiSparFuselage, xsiSparKink, xsiSparTip])

    
    #===========================================================================
    # Outer Spoilers 
    #===========================================================================
    outerSpan = (spoilerOuterEta - etaKink) * span
    outerArea = spoilerChord * outerSpan
    nOuterSpoiler = outerSpan ** 2 / (outerArea * 2.)
    log.debug('VAMPzero SPOILER: Exporting %s Spoiler outside of the kink for an area of %s m2.' % (str(nOuterSpoiler), str(outerArea)))


    #===========================================================================
    # 1 Spoiler
    #===========================================================================
    if nOuterSpoiler <= 1.:
        # The outer eta of the leading Edge is correspondent to the outerEta of the spoiler 
        outerEtaLE = spoilerOuterEta
        # The inner eta of the leading edge is the outer eta minus the span of the outer spoiler 
        innerEtaLE = spoilerOuterEta - outerSpan / span
        # The inner and outer Xsi coordinate of the leading edge are defined by the rear spar location and the sparOffset
        outerXsiLE = xsiSpar_interp(outerEtaLE) + sparOffset
        innerXsiLE = xsiSpar_interp(innerEtaLE) + sparOffset
        
        spoilerPhi = calcPhiLESpoiler(outerEtaLE, innerEtaLE, outerXsiLE, innerXsiLE, parentWingVAMPzero, cpacsWing)
        deltaEta = sin(spoilerPhi) * spoilerChord
        deltaXsi = cos(spoilerPhi) * spoilerChord
        
        outerEtaTE = outerEtaLE - deltaEta / span
        outerXsiTE = outerXsiLE + deltaXsi / calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing)
        innerEtaTE = innerEtaLE - deltaEta / span
        innerXsiTE = innerXsiLE + deltaXsi / calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing)
        # We do not want the spoiler to overlap the kink as the inner Spoilers will start here
        if innerEtaTE < etaKink:
            innerEtaTE = etaKink
            innerXsiTE = innerXsiLE + spoilerChord / calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing)
        
        mySpoilers.append(createSpoiler('OuterSpoiler1', parentWingVAMPzero.id, innerEtaLE, innerEtaTE, innerXsiLE, innerXsiTE, outerEtaLE, outerEtaTE, outerXsiLE, outerXsiTE))

    #===========================================================================
    # 2 Spoiler
    #===========================================================================
    elif nOuterSpoiler > 1. and nOuterSpoiler <= 2.:
        # The outer eta of the leading Edge is correspondent to the outerEta of the spoiler 
        outerEtaLE = spoilerOuterEta
        # The inner eta of the leading edge is the outer eta minus the span of the outer spoiler 
        innerEtaLE = spoilerOuterEta - outerSpan / span / 2.
        # The inner and outer Xsi coordinate of the leading edge are defined by the rear spar location and the sparOffset
        outerXsiLE = xsiSpar_interp(outerEtaLE) + sparOffset
        innerXsiLE = xsiSpar_interp(innerEtaLE) + sparOffset
        
        spoilerPhi = calcPhiLESpoiler(outerEtaLE, innerEtaLE, outerXsiLE, innerXsiLE, parentWingVAMPzero, cpacsWing)
        deltaEta = sin(spoilerPhi) * spoilerChord
        deltaXsi = cos(spoilerPhi) * spoilerChord
        
        outerEtaTE = outerEtaLE - deltaEta / span
        outerXsiTE = outerXsiLE + deltaXsi / calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing)
        innerEtaTE = innerEtaLE - deltaEta / span
        innerXsiTE = innerXsiLE + deltaXsi / calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing)
        
        mySpoilers.append(createSpoiler('OuterSpoiler2', parentWingVAMPzero.id, innerEtaLE, innerEtaTE, innerXsiLE, innerXsiTE, outerEtaLE, outerEtaTE, outerXsiLE, outerXsiTE))

        # old outer is new inner 
        outerEtaLE = innerEtaLE
        # new inner is min next to kink  
        innerEtaLE = spoilerOuterEta - outerSpan / span
        # The inner and outer Xsi coordinate of the leading edge are defined by the rear spar location and the sparOffset
        outerXsiLE = xsiSpar_interp(outerEtaLE) + sparOffset
        innerXsiLE = xsiSpar_interp(innerEtaLE) + sparOffset
        
        spoilerPhi = calcPhiLESpoiler(outerEtaLE, innerEtaLE, outerXsiLE, innerXsiLE, parentWingVAMPzero, cpacsWing)
        deltaEta = sin(spoilerPhi) * spoilerChord
        deltaXsi = cos(spoilerPhi) * spoilerChord
        
        outerEtaTE = outerEtaLE - deltaEta / span
        outerXsiTE = outerXsiLE + deltaXsi / calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing)
        innerEtaTE = innerEtaLE - deltaEta / span
        innerXsiTE = innerXsiLE + deltaXsi / calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing)
        # We do not want the spoiler to overlap the kink as the inner Spoilers will start here
        if innerEtaTE < etaKink:
            innerEtaTE = etaKink
            innerXsiTE = innerXsiLE + spoilerChord / calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing)
        mySpoilers.append(createSpoiler('OuterSpoiler1', parentWingVAMPzero.id, innerEtaLE, innerEtaTE, innerXsiLE, innerXsiTE, outerEtaLE, outerEtaTE, outerXsiLE, outerXsiTE))

    #===========================================================================
    # n Spoiler
    #===========================================================================
    elif nOuterSpoiler > 2.:
        n = int(ceil(nOuterSpoiler))
        # The outer eta of the leading Edge is correspondent to the outerEta of the spoiler 
        outerEtaLE = spoilerOuterEta
        # The inner eta of the leading edge is the outer eta minus the span of the outer spoiler 
        innerEtaLE = outerEtaLE - outerSpan / span / n
        # The inner and outer Xsi coordinate of the leading edge are defined by the rear spar location and the sparOffset
        outerXsiLE = xsiSpar_interp(outerEtaLE) + sparOffset
        innerXsiLE = xsiSpar_interp(innerEtaLE) + sparOffset
        
        spoilerPhi = calcPhiLESpoiler(outerEtaLE, innerEtaLE, outerXsiLE, innerXsiLE, parentWingVAMPzero, cpacsWing)
        deltaEta = sin(spoilerPhi) * spoilerChord
        deltaXsi = cos(spoilerPhi) * spoilerChord
        
        outerEtaTE = outerEtaLE - deltaEta / span
        outerXsiTE = outerXsiLE + deltaXsi / calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing)
        innerEtaTE = innerEtaLE - deltaEta / span
        innerXsiTE = innerXsiLE + deltaXsi / calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing)
        mySpoilers.append(createSpoiler('OuterSpoiler' + str(n), parentWingVAMPzero.id, innerEtaLE, innerEtaTE, innerXsiLE, innerXsiTE, outerEtaLE, outerEtaTE, outerXsiLE, outerXsiTE))

        for i in range(2, n):
            # old outer is new inner 
            outerEtaLE = innerEtaLE
            # new inner is min next to kink  
            innerEtaLE = outerEtaLE - outerSpan / span / n
            # The inner and outer Xsi coordinate of the leading edge are defined by the rear spar location and the sparOffset
            outerXsiLE = xsiSpar_interp(outerEtaLE) + sparOffset
            innerXsiLE = xsiSpar_interp(innerEtaLE) + sparOffset
            
            spoilerPhi = calcPhiLESpoiler(outerEtaLE, innerEtaLE, outerXsiLE, innerXsiLE, parentWingVAMPzero, cpacsWing)
            deltaEta = sin(spoilerPhi) * spoilerChord
            deltaXsi = cos(spoilerPhi) * spoilerChord
            
            outerEtaTE = outerEtaLE - deltaEta / span
            outerXsiTE = outerXsiLE + deltaXsi / calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing)
            innerEtaTE = innerEtaLE - deltaEta / span
            innerXsiTE = innerXsiLE + deltaXsi / calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing)
            mySpoilers.append(createSpoiler('OuterSpoiler' + str(n - i + 1), parentWingVAMPzero.id, innerEtaLE, innerEtaTE, innerXsiLE, innerXsiTE, outerEtaLE, outerEtaTE, outerXsiLE, outerXsiTE))
        
        # old outer is new inner 
        outerEtaLE = innerEtaLE
        # new inner is min next to kink  
        innerEtaLE = spoilerOuterEta - outerSpan / span
        # The inner and outer Xsi coordinate of the leading edge are defined by the rear spar location and the sparOffset
        outerXsiLE = xsiSpar_interp(outerEtaLE) + sparOffset
        innerXsiLE = xsiSpar_interp(innerEtaLE) + sparOffset
        
        spoilerPhi = calcPhiLESpoiler(outerEtaLE, innerEtaLE, outerXsiLE, innerXsiLE, parentWingVAMPzero, cpacsWing)
        deltaEta = sin(spoilerPhi) * spoilerChord
        deltaXsi = cos(spoilerPhi) * spoilerChord
        
        outerEtaTE = outerEtaLE - deltaEta / span
        outerXsiTE = outerXsiLE + deltaXsi / calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing)
        innerEtaTE = innerEtaLE - deltaEta / span
        innerXsiTE = innerXsiLE + deltaXsi / calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing)
        # We do not want the spoiler to overlap the kink as the inner Spoilers will start here
        if innerEtaTE < etaKink:
            innerEtaTE = etaKink
            innerXsiTE = innerXsiLE + spoilerChord / calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing)
        mySpoilers.append(createSpoiler('OuterSpoiler1', parentWingVAMPzero.id, innerEtaLE, innerEtaTE, innerXsiLE, innerXsiTE, outerEtaLE, outerEtaTE, outerXsiLE, outerXsiTE))

    #===============================================================================
    # Inner Spoilers 
    #===============================================================================
    deltaArea = spoilerArea - outerArea
    noExport = False
    if deltaArea <= 0.:
        log.warning('VAMPzero SPOILER: Outboard Spoiler area already exceeds the required spoiler area by: %s' % str(deltaArea))
        noExport = True

    calcArea = 0.
    maxInnerArea = (etaKink - etaFus) * span * spoilerChord
    if maxInnerArea >= deltaArea and noExport == False:
        innerSpan = 0.
        while True:
            innerSpan += .01
            oldArea = calcArea
            calcArea = innerSpan * spoilerChord
            
            # This is the break condition that should be hit normally
            if abs(deltaArea - calcArea) < 0.1:
                break
            
            if innerSpan > (etaKink - etaFus) * span:
                log.warning('VAMPzero SPOILER: The spoiler span of the inner spoiler exceeds the available span betweent fuselage and kink, continuing with calcArea = %s' % str(calcArea))
                break 
            if oldArea > calcArea:
                log.warning('VAMPzero SPOILER: Inner spoiler area apparently reached a maximum, continuing with calcArea = %s' % str(calcArea))
                break 

    elif noExport == False:
        log.warning('VAMPzero SPOILER: There is not sufficient space for the inner spoiler(s) between the kink and the fuselage!')
        spoilerChord = deltaArea / ((etaKink - etaFus) * span)
        innerSpan = (etaKink - etaFus) * span
        calcArea = deltaArea
        log.warning('VAMPzero SPOILER: The spoilerchord will be enlarged to %s!' % str(spoilerChord))
    
    if noExport == True:
        nInnerSpoiler = 0
        log.debug('VAMPzero SPOILER: Exporting %s Spoiler inside of the kink.' % (str(nInnerSpoiler)))
    else: 
        nInnerSpoiler = innerSpan ** 2 / (calcArea * 3.)
        log.debug('VAMPzero SPOILER: Exporting %s Spoiler inside of the kink for an area of %s m2.' % (str(nInnerSpoiler), str(calcArea)))
    
        

    #===========================================================================
    # 1 Spoiler
    #===========================================================================
    if nInnerSpoiler == 0:
        pass
    
    elif nInnerSpoiler <= 1:
        # The outer eta of the leading Edge to the eta of the kink
        outerEtaLE = etaKink
        # The inner eta of the leading edge is the outer eta minus the span of the inner spoiler 
        innerEtaLE = outerEtaLE - innerSpan / span
        # The outer Xsi at the leading Edge is defined by the sparLocation of the Kink
        outerXsiLE = xsiSpar_interp(outerEtaLE) + sparOffset
        # The innner Xsi remains an absolute chord of the spoiler
        chordInnerSpoiler = (1-outerXsiLE) * calcChordLengthAtEta(outerEtaLE, parentWingVAMPzero, cpacsWing)
        innerXsiLE = 1 - chordInnerSpoiler / calcChordLengthAtEta(innerEtaLE, parentWingVAMPzero, cpacsWing)
        
        # Eta Coordinates stay constant
        # Xsi Coordinates are shifted by spoilerChord
        outerEtaTE = outerEtaLE
        outerXsiTE = outerXsiLE + spoilerChord / calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing)
        innerEtaTE = innerEtaLE
        innerXsiTE = innerXsiLE + spoilerChord / calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing)
        mySpoilers.append(createSpoiler('InnerSpoiler1', parentWingVAMPzero.id, innerEtaLE, innerEtaTE, innerXsiLE, innerXsiTE, outerEtaLE, outerEtaTE, outerXsiLE, outerXsiTE))
    
    #===========================================================================
    # 2 Spoiler
    #===========================================================================
    elif nInnerSpoiler > 1. and nInnerSpoiler <= 2.:
        # First inner spoiler 
        # The outer eta of the leading Edge to the eta of the kink
        outerEtaLE = etaKink
        # The inner eta of the leading edge is the outer eta minus the span of the inner spoiler 
        innerEtaLE = outerEtaLE - innerSpan / span / 2.
        # The outer Xsi at the leading Edge is defined by the sparLocation of the Kink
        outerXsiLE = xsiSpar_interp(outerEtaLE) + sparOffset
        # The innner Xsi remains an absolute chord of the spoiler
        chordInnerSpoiler = (1-outerXsiLE) * calcChordLengthAtEta(outerEtaLE, parentWingVAMPzero, cpacsWing)
        innerXsiLE = 1 - chordInnerSpoiler / calcChordLengthAtEta(innerEtaLE, parentWingVAMPzero, cpacsWing)
        
        # Eta Coordinates stay constant
        # Xsi Coordinates are shifted by spoilerChord
        outerEtaTE = outerEtaLE
        outerXsiTE = outerXsiLE + spoilerChord / calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing)
        innerEtaTE = innerEtaLE
        innerXsiTE = innerXsiLE + spoilerChord / calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing)
        mySpoilers.append(createSpoiler('InnerSpoiler2', parentWingVAMPzero.id, innerEtaLE, innerEtaTE, innerXsiLE, innerXsiTE, outerEtaLE, outerEtaTE, outerXsiLE, outerXsiTE))
        
        # Second inner spoiler
        # old inner becomes new outer
        outerEtaLE = innerEtaLE
        # The inner eta of the leading edge is the outer eta minus the span of the inner spoiler 
        innerEtaLE = outerEtaLE - innerSpan / span / 2.
        # The outer Xsi at the leading Edge is defined by the sparLocation of the Kink
        outerXsiLE = xsiSpar_interp(outerEtaLE) + sparOffset
        # The innner Xsi remains an absolute chord of the spoiler
        chordInnerSpoiler = (1-outerXsiLE) * calcChordLengthAtEta(outerEtaLE, parentWingVAMPzero, cpacsWing)
        innerXsiLE = 1 - chordInnerSpoiler / calcChordLengthAtEta(innerEtaLE, parentWingVAMPzero, cpacsWing)
        
        # Eta Coordinates stay constant
        # Xsi Coordinates are shifted by spoilerChord
        outerEtaTE = outerEtaLE
        outerXsiTE = outerXsiLE + spoilerChord / calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing)
        innerEtaTE = innerEtaLE
        innerXsiTE = innerXsiLE + spoilerChord / calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing)
        mySpoilers.append(createSpoiler('InnerSpoiler1', parentWingVAMPzero.id, innerEtaLE, innerEtaTE, innerXsiLE, innerXsiTE, outerEtaLE, outerEtaTE, outerXsiLE, outerXsiTE))

    #===========================================================================
    # Output to CPACS
    #===========================================================================
    if type(cpacsComponentSegment.get_controlSurfaces()) == NoneType:
        cpacsComponentSegment.set_controlSurfaces(controlSurfacesType())
    if type(cpacsComponentSegment.get_controlSurfaces().get_spoilers()) == NoneType:
        cpacsComponentSegment.get_controlSurfaces().set_spoilers(spoilersType())
    
    log.debug('VAMPzero Spoiler: Exporting %s Spoilers to CPACS.' % (str(len(mySpoilers))))
    for spoiler in mySpoilers:
        cpacsComponentSegment.get_controlSurfaces().get_spoilers().add_spoiler(spoiler)
Exemple #4
0
def createSlats(parentWingCPACS, parentWingVAMPzero, mySlat):
    '''
    This is the main export method for the wing's slats
    It assumes a constant absolut chord for all slats.
    At the engine position a 5% span gap is included for the slats
    Slats end 5% prior to the wing tip
    '''
    cpacsPath = '/cpacs/vehicles/aircraft/model/wings/wing[' + parentWingVAMPzero.id + ']'
    cpacsWing = getObjfromXpath(parentWingCPACS, cpacsPath)
    cpacsComponentSegment = cpacsWing.get_componentSegments().get_componentSegment()[0]
    mySlats = []
    
    # Initialization, i.e. fetching values throughout the code
    yFus = parentWingVAMPzero.yFuselage.getValue()
    span = parentWingVAMPzero.span.getValue() / 2.
    etaFus = yFus / span

    slatArea = mySlat.refArea.getValue()

    # The absolut chord of all slats is equal it is determined by the  
    # total slat area over the remaining span
    # the remaining span is the span minus the fuselage section minus 5% around the engine
    # and 5% at the tip
    cSlat = slatArea / ((1.0 - etaFus - 0.1) * span)
    
    if cSlat > calcChordLengthAtEta(etaFus, parentWingVAMPzero, cpacsWing) * 0.075:
        log.warning('VAMPzero SLAT: The slat chord is larger than 7.5% of the wing\'s chord at the fuselage intersection.')
    # Inner Wing Slats
    # At first inner wing slats are defined. These do only extend up to the engine
    # a plus minus 2.5% span are reserved for the slats
    # Note the calculation is only valid for nEngine == 2
    # The aspect ratio of a slat should not be higher than 5.5    
    etaEngine = parentWingVAMPzero.etaEngine.getValue()
    innerSpan = span * (etaEngine - 0.025 - etaFus)
    innerArea = innerSpan * cSlat
    nInnerSlats = innerSpan ** 2. / (innerArea * 5.5)
    log.debug('VAMPzero SLAT: Exporting %s Slats inside of the engine for an area of %s m2.' % (str(nInnerSlats), str(innerArea)))

    # 1 Slat
    if nInnerSlats <= 1.:
        # the inner border eta is located at the Fuselage
        innerEtaTE = etaFus
        innerXsiTE = cSlat / calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing)

        # the outer border eta is determined from the span of the outer flap
        outerEtaTE = etaFus + innerSpan / span
        outerXsiTE = cSlat / calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing)

        #Slats extend 50% of their chord lenght
        innerX = innerXsiTE * calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing) * 0.5
        outerX = outerXsiTE * calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing) * 0.5
        
        mySlats.append(createSlat('InnerSlat1', parentWingVAMPzero.id, innerEtaTE, innerXsiTE, outerEtaTE, outerXsiTE, innerX=innerX, outerX=outerX))
    
    # 2 Slats
    elif nInnerSlats > 1. and nInnerSlats < 2.:
        # the inner border eta is located at the Fuselage
        innerEtaTE = etaFus
        innerXsiTE = cSlat / calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing)

        # the outer border eta is determined from the span of the outer flap
        outerEtaTE = etaFus + innerSpan / 2. / span
        outerXsiTE = cSlat / calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing)

        #Slats extend 50% of their chord lenght
        innerX = innerXsiTE * calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing) * 0.5
        outerX = outerXsiTE * calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing) * 0.5

        mySlats.append(createSlat('InnerSlat1', parentWingVAMPzero.id, innerEtaTE, innerXsiTE, outerEtaTE, outerXsiTE, innerX=innerX, outerX=outerX))
        
        # new inner is the old outer 
        innerEtaLE = outerEtaTE
        innerXsiLE = outerXsiTE
        # the outer border eta is determined from the full span of the total outer flap
        outerEtaLE = etaFus + innerSpan / span
        outerXsiLE = cSlat / calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing)

        #Slats extend 50% of their chord lenght
        innerX = innerXsiTE * calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing) * 0.5
        outerX = outerXsiTE * calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing) * 0.5

        mySlats.append(createSlat('InnerSlat2', parentWingVAMPzero.id, innerEtaLE, innerXsiLE, outerEtaLE, outerXsiLE, innerX=innerX, outerX=outerX))
    else:
        log.warning('VAMPzero EXPORT: Need more inner slats')

    # Outer Wing Slats
    # Determine the number of remaining slats
    # The aspect ratio of a slat should not be higher than 5.5 
    slatArea = slatArea - innerArea
    calcArea = 0.
    spanSlat = 0.
     
    while abs(calcArea - slatArea) > 0.5:
        spanSlat += .01
        calcArea = spanSlat * cSlat

    # Determine the number of slats
    # The aspect ratio of a slats should not be higher than 5.5 
    nSlats = spanSlat ** 2. / (slatArea * 5.5)
    log.debug('VAMPzero SLAT: Exporting %s Slats outboard of the engine for an area of %s m2.' % (str(nSlats), str(slatArea)))
    
    # 1 Slat
    if nSlats <= 1.:
        # the inner border eta is located at the Fuselage
        innerEtaTE = etaEngine + 0.025
        innerXsiTE = cSlat / calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing)

        # the outer border eta is determined from the span of the outer flap
        outerEtaTE = innerEtaTE + spanSlat / span
        outerXsiTE = cSlat / calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing)

        #Slats extend 50% of their chord lenght
        innerX = innerXsiTE * calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing) * 0.5
        outerX = outerXsiTE * calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing) * 0.5

        mySlats.append(createSlat('OuterSlat1', parentWingVAMPzero.id, innerEtaTE, innerXsiTE, outerEtaTE, outerXsiTE, innerX=innerX, outerX=outerX))
    
    # 2 Slats
    elif nSlats > 1. and nSlats < 2.:
        # the inner border eta is located at the Fuselage
        innerEtaTE = etaEngine + 0.025
        innerXsiTE = cSlat / calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing)

        # the outer border eta is determined from the span of the outer flap
        outerEtaTE = innerEtaTE + spanSlat / 2. / span
        outerXsiTE = cSlat / calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing)

        #Slats extend 50% of their chord lenght
        innerX = innerXsiTE * calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing) * 0.5
        outerX = outerXsiTE * calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing) * 0.5

        mySlats.append(createSlat('OuterSlat1', parentWingVAMPzero.id, innerEtaTE, innerXsiTE, outerEtaTE, outerXsiTE, innerX=innerX, outerX=outerX))
        
        # new inner is the old outer 
        innerEtaTE = outerEtaTE
        innerXsiTE = outerXsiTE
        # the outer border eta is determined from the full span of the total outer flap
        outerEtaTE = innerEtaTE + spanSlat / span
        outerXsiTE = cSlat / calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing)

        #Slats extend 50% of their chord lenght
        innerX = innerXsiTE * calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing) * 0.5
        outerX = outerXsiTE * calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing) * 0.5

        mySlats.append(createSlat('OuterSlat2', parentWingVAMPzero.id, innerEtaTE, innerXsiTE, outerEtaTE, outerXsiTE, innerX=innerX, outerX=outerX))
    # n Slats
    else:
        # the inner border eta is located at the Fuselage
        n = int(ceil(nSlats))
        innerEtaTE = etaEngine + 0.025
        innerXsiTE = cSlat / calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing)
        
        # First Slat
        # the outer border eta is determined from the span of the outer flap
        outerEtaTE = innerEtaTE + spanSlat / n / span
        outerXsiTE = cSlat / calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing)

        #Slats extend 50% of their chord lenght
        innerX = innerXsiTE * calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing) * 0.5
        outerX = outerXsiTE * calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing) * 0.5

        mySlats.append(createSlat('OuterSlat1', parentWingVAMPzero.id, innerEtaTE, innerXsiTE, outerEtaTE, outerXsiTE, innerX=innerX, outerX=outerX))
        
        for i in range(2, n):
            # new inner is the old outer 
            innerEtaTE = outerEtaTE
            innerXsiTE = outerXsiTE
            # the outer border eta is determined from the full span of the total outer flap
            outerEtaTE = innerEtaTE + spanSlat / n / span
            outerXsiTE = cSlat / calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing)
            
            #Slats extend 50% of their chord lenght
            innerX = innerXsiTE * calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing) * 0.5
            outerX = outerXsiTE * calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing) * 0.5
            
            mySlats.append(createSlat('OuterSlat' + str(i), parentWingVAMPzero.id, innerEtaTE, innerXsiTE, outerEtaTE, outerXsiTE, innerX=innerX, outerX=outerX))

        # Last Slat
        # new inner is the old outer 
        innerEtaTE = outerEtaTE
        innerXsiTE = outerXsiTE
        # the outer border eta is determined from the full span of the total outer flap
        outerEtaTE = innerEtaTE + spanSlat / n / span
        outerXsiTE = cSlat / calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing)

        #Slats extend 50% of their chord lenght
        innerX = innerXsiTE * calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing) * 0.5
        outerX = outerXsiTE * calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing) * 0.5
        
        mySlats.append(createSlat('OuterSlat' + str(n), parentWingVAMPzero.id, innerEtaTE, innerXsiTE, outerEtaTE, outerXsiTE, innerX=innerX, outerX=outerX))
    
    # Output to CPACS
    if type(cpacsComponentSegment.get_controlSurfaces()) == NoneType:
        cpacsComponentSegment.set_controlSurfaces(controlSurfacesType())
    if type(cpacsComponentSegment.get_controlSurfaces().get_leadingEdgeDevices()) == NoneType:
        cpacsComponentSegment.get_controlSurfaces().set_leadingEdgeDevices(leadingEdgeDevicesType())
    
    log.debug('VAMPzero SLAT: Exporting %s Slats to CPACS.' % (str(len(mySlats))))
    for slat in mySlats:
        cpacsComponentSegment.get_controlSurfaces().get_leadingEdgeDevices().add_leadingEdgeDevice(slat)
Exemple #5
0
def createSpoilers(parentWingCPACS, parentWingVAMPzero, mySpoiler):
    '''
    This is the main export method for the wing's spoilers
    
    * It assumes a constant absolut chord for all spoilers
    * Spoiler start outboard and move inboard close behind the rearspar
    * They are rectangular
    
    '''
    cpacsPath = '/cpacs/vehicles/aircraft/model/wings/wing[' + parentWingVAMPzero.id + ']'
    cpacsWing = getObjfromXpath(parentWingCPACS, cpacsPath)
    cpacsComponentSegment = cpacsWing.get_componentSegments(
    ).get_componentSegment()[0]
    mySpoilers = []

    #===========================================================================
    # Initialization, i.e. fetching values throughout the code
    #===========================================================================
    span = parentWingVAMPzero.span.getValue() / 2.
    etaKink = parentWingVAMPzero.etaKink.getValue()
    yFus = parentWingVAMPzero.yFuselage.getValue()
    etaFus = yFus / span

    spoilerArea = mySpoiler.refArea.getValue()
    spoilerChord = mySpoiler.chord.getValue()
    spoilerOuterEta = mySpoiler.outerEta.getValue()

    sparOffset = 0.02

    #===========================================================================
    # Rear spar locations
    #===========================================================================
    xsiSparRoot = eval(cpacsComponentSegment.get_structure().get_spars(
    ).get_sparPositions().get_sparPosition()[3].get_xsi().valueOf_)
    xsiSparFuselage = eval(cpacsComponentSegment.get_structure().get_spars(
    ).get_sparPositions().get_sparPosition()[4].get_xsi().valueOf_)
    xsiSparKink = eval(cpacsComponentSegment.get_structure().get_spars(
    ).get_sparPositions().get_sparPosition()[5].get_xsi().valueOf_)
    xsiSparTip = eval(cpacsComponentSegment.get_structure().get_spars(
    ).get_sparPositions().get_sparPosition()[6].get_xsi().valueOf_)

    etaSparRoot = eval(cpacsComponentSegment.get_structure().get_spars(
    ).get_sparPositions().get_sparPosition()[3].get_eta().valueOf_)
    etaSparFuselage = eval(cpacsComponentSegment.get_structure().get_spars(
    ).get_sparPositions().get_sparPosition()[4].get_eta().valueOf_)
    etaSparKink = eval(cpacsComponentSegment.get_structure().get_spars(
    ).get_sparPositions().get_sparPosition()[5].get_eta().valueOf_)
    etaSparTip = eval(cpacsComponentSegment.get_structure().get_spars(
    ).get_sparPositions().get_sparPosition()[6].get_eta().valueOf_)

    xsiSpar_interp = scipy.interpolate.interp1d(
        [etaSparRoot, etaSparFuselage, etaSparKink, etaSparTip],
        [xsiSparRoot, xsiSparFuselage, xsiSparKink, xsiSparTip])

    #===========================================================================
    # Outer Spoilers
    #===========================================================================
    outerSpan = (spoilerOuterEta - etaKink) * span
    outerArea = spoilerChord * outerSpan
    nOuterSpoiler = outerSpan**2 / (outerArea * 2.)
    log.debug(
        'VAMPzero SPOILER: Exporting %s Spoiler outside of the kink for an area of %s m2.'
        % (str(nOuterSpoiler), str(outerArea)))

    #===========================================================================
    # 1 Spoiler
    #===========================================================================
    if nOuterSpoiler <= 1.:
        # The outer eta of the leading Edge is correspondent to the outerEta of the spoiler
        outerEtaLE = spoilerOuterEta
        # The inner eta of the leading edge is the outer eta minus the span of the outer spoiler
        innerEtaLE = spoilerOuterEta - outerSpan / span
        # The inner and outer Xsi coordinate of the leading edge are defined by the rear spar location and the sparOffset
        outerXsiLE = xsiSpar_interp(outerEtaLE) + sparOffset
        innerXsiLE = xsiSpar_interp(innerEtaLE) + sparOffset

        spoilerPhi = calcPhiLESpoiler(outerEtaLE, innerEtaLE, outerXsiLE,
                                      innerXsiLE, parentWingVAMPzero,
                                      cpacsWing)
        deltaEta = sin(spoilerPhi) * spoilerChord
        deltaXsi = cos(spoilerPhi) * spoilerChord

        outerEtaTE = outerEtaLE - deltaEta / span
        outerXsiTE = outerXsiLE + deltaXsi / calcChordLengthAtEta(
            outerEtaTE, parentWingVAMPzero, cpacsWing)
        innerEtaTE = innerEtaLE - deltaEta / span
        innerXsiTE = innerXsiLE + deltaXsi / calcChordLengthAtEta(
            innerEtaTE, parentWingVAMPzero, cpacsWing)
        # We do not want the spoiler to overlap the kink as the inner Spoilers will start here
        if innerEtaTE < etaKink:
            innerEtaTE = etaKink
            innerXsiTE = innerXsiLE + spoilerChord / calcChordLengthAtEta(
                innerEtaTE, parentWingVAMPzero, cpacsWing)

        mySpoilers.append(
            createSpoiler('OuterSpoiler1', parentWingVAMPzero.id, innerEtaLE,
                          innerEtaTE, innerXsiLE, innerXsiTE, outerEtaLE,
                          outerEtaTE, outerXsiLE, outerXsiTE))

    #===========================================================================
    # 2 Spoiler
    #===========================================================================
    elif nOuterSpoiler > 1. and nOuterSpoiler <= 2.:
        # The outer eta of the leading Edge is correspondent to the outerEta of the spoiler
        outerEtaLE = spoilerOuterEta
        # The inner eta of the leading edge is the outer eta minus the span of the outer spoiler
        innerEtaLE = spoilerOuterEta - outerSpan / span / 2.
        # The inner and outer Xsi coordinate of the leading edge are defined by the rear spar location and the sparOffset
        outerXsiLE = xsiSpar_interp(outerEtaLE) + sparOffset
        innerXsiLE = xsiSpar_interp(innerEtaLE) + sparOffset

        spoilerPhi = calcPhiLESpoiler(outerEtaLE, innerEtaLE, outerXsiLE,
                                      innerXsiLE, parentWingVAMPzero,
                                      cpacsWing)
        deltaEta = sin(spoilerPhi) * spoilerChord
        deltaXsi = cos(spoilerPhi) * spoilerChord

        outerEtaTE = outerEtaLE - deltaEta / span
        outerXsiTE = outerXsiLE + deltaXsi / calcChordLengthAtEta(
            outerEtaTE, parentWingVAMPzero, cpacsWing)
        innerEtaTE = innerEtaLE - deltaEta / span
        innerXsiTE = innerXsiLE + deltaXsi / calcChordLengthAtEta(
            innerEtaTE, parentWingVAMPzero, cpacsWing)

        mySpoilers.append(
            createSpoiler('OuterSpoiler2', parentWingVAMPzero.id, innerEtaLE,
                          innerEtaTE, innerXsiLE, innerXsiTE, outerEtaLE,
                          outerEtaTE, outerXsiLE, outerXsiTE))

        # old outer is new inner
        outerEtaLE = innerEtaLE
        # new inner is min next to kink
        innerEtaLE = spoilerOuterEta - outerSpan / span
        # The inner and outer Xsi coordinate of the leading edge are defined by the rear spar location and the sparOffset
        outerXsiLE = xsiSpar_interp(outerEtaLE) + sparOffset
        innerXsiLE = xsiSpar_interp(innerEtaLE) + sparOffset

        spoilerPhi = calcPhiLESpoiler(outerEtaLE, innerEtaLE, outerXsiLE,
                                      innerXsiLE, parentWingVAMPzero,
                                      cpacsWing)
        deltaEta = sin(spoilerPhi) * spoilerChord
        deltaXsi = cos(spoilerPhi) * spoilerChord

        outerEtaTE = outerEtaLE - deltaEta / span
        outerXsiTE = outerXsiLE + deltaXsi / calcChordLengthAtEta(
            outerEtaTE, parentWingVAMPzero, cpacsWing)
        innerEtaTE = innerEtaLE - deltaEta / span
        innerXsiTE = innerXsiLE + deltaXsi / calcChordLengthAtEta(
            innerEtaTE, parentWingVAMPzero, cpacsWing)
        # We do not want the spoiler to overlap the kink as the inner Spoilers will start here
        if innerEtaTE < etaKink:
            innerEtaTE = etaKink
            innerXsiTE = innerXsiLE + spoilerChord / calcChordLengthAtEta(
                innerEtaTE, parentWingVAMPzero, cpacsWing)
        mySpoilers.append(
            createSpoiler('OuterSpoiler1', parentWingVAMPzero.id, innerEtaLE,
                          innerEtaTE, innerXsiLE, innerXsiTE, outerEtaLE,
                          outerEtaTE, outerXsiLE, outerXsiTE))

    #===========================================================================
    # n Spoiler
    #===========================================================================
    elif nOuterSpoiler > 2.:
        n = int(ceil(nOuterSpoiler))
        # The outer eta of the leading Edge is correspondent to the outerEta of the spoiler
        outerEtaLE = spoilerOuterEta
        # The inner eta of the leading edge is the outer eta minus the span of the outer spoiler
        innerEtaLE = outerEtaLE - outerSpan / span / n
        # The inner and outer Xsi coordinate of the leading edge are defined by the rear spar location and the sparOffset
        outerXsiLE = xsiSpar_interp(outerEtaLE) + sparOffset
        innerXsiLE = xsiSpar_interp(innerEtaLE) + sparOffset

        spoilerPhi = calcPhiLESpoiler(outerEtaLE, innerEtaLE, outerXsiLE,
                                      innerXsiLE, parentWingVAMPzero,
                                      cpacsWing)
        deltaEta = sin(spoilerPhi) * spoilerChord
        deltaXsi = cos(spoilerPhi) * spoilerChord

        outerEtaTE = outerEtaLE - deltaEta / span
        outerXsiTE = outerXsiLE + deltaXsi / calcChordLengthAtEta(
            outerEtaTE, parentWingVAMPzero, cpacsWing)
        innerEtaTE = innerEtaLE - deltaEta / span
        innerXsiTE = innerXsiLE + deltaXsi / calcChordLengthAtEta(
            innerEtaTE, parentWingVAMPzero, cpacsWing)
        mySpoilers.append(
            createSpoiler('OuterSpoiler' + str(n), parentWingVAMPzero.id,
                          innerEtaLE, innerEtaTE, innerXsiLE, innerXsiTE,
                          outerEtaLE, outerEtaTE, outerXsiLE, outerXsiTE))

        for i in range(2, n):
            # old outer is new inner
            outerEtaLE = innerEtaLE
            # new inner is min next to kink
            innerEtaLE = outerEtaLE - outerSpan / span / n
            # The inner and outer Xsi coordinate of the leading edge are defined by the rear spar location and the sparOffset
            outerXsiLE = xsiSpar_interp(outerEtaLE) + sparOffset
            innerXsiLE = xsiSpar_interp(innerEtaLE) + sparOffset

            spoilerPhi = calcPhiLESpoiler(outerEtaLE, innerEtaLE, outerXsiLE,
                                          innerXsiLE, parentWingVAMPzero,
                                          cpacsWing)
            deltaEta = sin(spoilerPhi) * spoilerChord
            deltaXsi = cos(spoilerPhi) * spoilerChord

            outerEtaTE = outerEtaLE - deltaEta / span
            outerXsiTE = outerXsiLE + deltaXsi / calcChordLengthAtEta(
                outerEtaTE, parentWingVAMPzero, cpacsWing)
            innerEtaTE = innerEtaLE - deltaEta / span
            innerXsiTE = innerXsiLE + deltaXsi / calcChordLengthAtEta(
                innerEtaTE, parentWingVAMPzero, cpacsWing)
            mySpoilers.append(
                createSpoiler('OuterSpoiler' + str(n - i + 1),
                              parentWingVAMPzero.id, innerEtaLE, innerEtaTE,
                              innerXsiLE, innerXsiTE, outerEtaLE, outerEtaTE,
                              outerXsiLE, outerXsiTE))

        # old outer is new inner
        outerEtaLE = innerEtaLE
        # new inner is min next to kink
        innerEtaLE = spoilerOuterEta - outerSpan / span
        # The inner and outer Xsi coordinate of the leading edge are defined by the rear spar location and the sparOffset
        outerXsiLE = xsiSpar_interp(outerEtaLE) + sparOffset
        innerXsiLE = xsiSpar_interp(innerEtaLE) + sparOffset

        spoilerPhi = calcPhiLESpoiler(outerEtaLE, innerEtaLE, outerXsiLE,
                                      innerXsiLE, parentWingVAMPzero,
                                      cpacsWing)
        deltaEta = sin(spoilerPhi) * spoilerChord
        deltaXsi = cos(spoilerPhi) * spoilerChord

        outerEtaTE = outerEtaLE - deltaEta / span
        outerXsiTE = outerXsiLE + deltaXsi / calcChordLengthAtEta(
            outerEtaTE, parentWingVAMPzero, cpacsWing)
        innerEtaTE = innerEtaLE - deltaEta / span
        innerXsiTE = innerXsiLE + deltaXsi / calcChordLengthAtEta(
            innerEtaTE, parentWingVAMPzero, cpacsWing)
        # We do not want the spoiler to overlap the kink as the inner Spoilers will start here
        if innerEtaTE < etaKink:
            innerEtaTE = etaKink
            innerXsiTE = innerXsiLE + spoilerChord / calcChordLengthAtEta(
                innerEtaTE, parentWingVAMPzero, cpacsWing)
        mySpoilers.append(
            createSpoiler('OuterSpoiler1', parentWingVAMPzero.id, innerEtaLE,
                          innerEtaTE, innerXsiLE, innerXsiTE, outerEtaLE,
                          outerEtaTE, outerXsiLE, outerXsiTE))

    #===============================================================================
    # Inner Spoilers
    #===============================================================================
    deltaArea = spoilerArea - outerArea
    noExport = False
    if deltaArea <= 0.:
        log.warning(
            'VAMPzero SPOILER: Outboard Spoiler area already exceeds the required spoiler area by: %s'
            % str(deltaArea))
        noExport = True

    calcArea = 0.
    maxInnerArea = (etaKink - etaFus) * span * spoilerChord
    if maxInnerArea >= deltaArea and noExport == False:
        innerSpan = 0.
        while True:
            innerSpan += .01
            oldArea = calcArea
            calcArea = innerSpan * spoilerChord

            # This is the break condition that should be hit normally
            if abs(deltaArea - calcArea) < 0.1:
                break

            if innerSpan > (etaKink - etaFus) * span:
                log.warning(
                    'VAMPzero SPOILER: The spoiler span of the inner spoiler exceeds the available span betweent fuselage and kink, continuing with calcArea = %s'
                    % str(calcArea))
                break
            if oldArea > calcArea:
                log.warning(
                    'VAMPzero SPOILER: Inner spoiler area apparently reached a maximum, continuing with calcArea = %s'
                    % str(calcArea))
                break

    elif noExport == False:
        log.warning(
            'VAMPzero SPOILER: There is not sufficient space for the inner spoiler(s) between the kink and the fuselage!'
        )
        spoilerChord = deltaArea / ((etaKink - etaFus) * span)
        innerSpan = (etaKink - etaFus) * span
        calcArea = deltaArea
        log.warning(
            'VAMPzero SPOILER: The spoilerchord will be enlarged to %s!' %
            str(spoilerChord))

    if noExport == True:
        nInnerSpoiler = 0
        log.debug(
            'VAMPzero SPOILER: Exporting %s Spoiler inside of the kink.' %
            (str(nInnerSpoiler)))
    else:
        nInnerSpoiler = innerSpan**2 / (calcArea * 3.)
        log.debug(
            'VAMPzero SPOILER: Exporting %s Spoiler inside of the kink for an area of %s m2.'
            % (str(nInnerSpoiler), str(calcArea)))

    #===========================================================================
    # 1 Spoiler
    #===========================================================================
    if nInnerSpoiler == 0:
        pass

    elif nInnerSpoiler <= 1:
        # The outer eta of the leading Edge to the eta of the kink
        outerEtaLE = etaKink
        # The inner eta of the leading edge is the outer eta minus the span of the inner spoiler
        innerEtaLE = outerEtaLE - innerSpan / span
        # The outer Xsi at the leading Edge is defined by the sparLocation of the Kink
        outerXsiLE = xsiSpar_interp(outerEtaLE) + sparOffset
        # The innner Xsi remains an absolute chord of the spoiler
        chordInnerSpoiler = (1 - outerXsiLE) * calcChordLengthAtEta(
            outerEtaLE, parentWingVAMPzero, cpacsWing)
        innerXsiLE = 1 - chordInnerSpoiler / calcChordLengthAtEta(
            innerEtaLE, parentWingVAMPzero, cpacsWing)

        # Eta Coordinates stay constant
        # Xsi Coordinates are shifted by spoilerChord
        outerEtaTE = outerEtaLE
        outerXsiTE = outerXsiLE + spoilerChord / calcChordLengthAtEta(
            outerEtaTE, parentWingVAMPzero, cpacsWing)
        innerEtaTE = innerEtaLE
        innerXsiTE = innerXsiLE + spoilerChord / calcChordLengthAtEta(
            innerEtaTE, parentWingVAMPzero, cpacsWing)
        mySpoilers.append(
            createSpoiler('InnerSpoiler1', parentWingVAMPzero.id, innerEtaLE,
                          innerEtaTE, innerXsiLE, innerXsiTE, outerEtaLE,
                          outerEtaTE, outerXsiLE, outerXsiTE))

    #===========================================================================
    # 2 Spoiler
    #===========================================================================
    elif nInnerSpoiler > 1. and nInnerSpoiler <= 2.:
        # First inner spoiler
        # The outer eta of the leading Edge to the eta of the kink
        outerEtaLE = etaKink
        # The inner eta of the leading edge is the outer eta minus the span of the inner spoiler
        innerEtaLE = outerEtaLE - innerSpan / span / 2.
        # The outer Xsi at the leading Edge is defined by the sparLocation of the Kink
        outerXsiLE = xsiSpar_interp(outerEtaLE) + sparOffset
        # The innner Xsi remains an absolute chord of the spoiler
        chordInnerSpoiler = (1 - outerXsiLE) * calcChordLengthAtEta(
            outerEtaLE, parentWingVAMPzero, cpacsWing)
        innerXsiLE = 1 - chordInnerSpoiler / calcChordLengthAtEta(
            innerEtaLE, parentWingVAMPzero, cpacsWing)

        # Eta Coordinates stay constant
        # Xsi Coordinates are shifted by spoilerChord
        outerEtaTE = outerEtaLE
        outerXsiTE = outerXsiLE + spoilerChord / calcChordLengthAtEta(
            outerEtaTE, parentWingVAMPzero, cpacsWing)
        innerEtaTE = innerEtaLE
        innerXsiTE = innerXsiLE + spoilerChord / calcChordLengthAtEta(
            innerEtaTE, parentWingVAMPzero, cpacsWing)
        mySpoilers.append(
            createSpoiler('InnerSpoiler2', parentWingVAMPzero.id, innerEtaLE,
                          innerEtaTE, innerXsiLE, innerXsiTE, outerEtaLE,
                          outerEtaTE, outerXsiLE, outerXsiTE))

        # Second inner spoiler
        # old inner becomes new outer
        outerEtaLE = innerEtaLE
        # The inner eta of the leading edge is the outer eta minus the span of the inner spoiler
        innerEtaLE = outerEtaLE - innerSpan / span / 2.
        # The outer Xsi at the leading Edge is defined by the sparLocation of the Kink
        outerXsiLE = xsiSpar_interp(outerEtaLE) + sparOffset
        # The innner Xsi remains an absolute chord of the spoiler
        chordInnerSpoiler = (1 - outerXsiLE) * calcChordLengthAtEta(
            outerEtaLE, parentWingVAMPzero, cpacsWing)
        innerXsiLE = 1 - chordInnerSpoiler / calcChordLengthAtEta(
            innerEtaLE, parentWingVAMPzero, cpacsWing)

        # Eta Coordinates stay constant
        # Xsi Coordinates are shifted by spoilerChord
        outerEtaTE = outerEtaLE
        outerXsiTE = outerXsiLE + spoilerChord / calcChordLengthAtEta(
            outerEtaTE, parentWingVAMPzero, cpacsWing)
        innerEtaTE = innerEtaLE
        innerXsiTE = innerXsiLE + spoilerChord / calcChordLengthAtEta(
            innerEtaTE, parentWingVAMPzero, cpacsWing)
        mySpoilers.append(
            createSpoiler('InnerSpoiler1', parentWingVAMPzero.id, innerEtaLE,
                          innerEtaTE, innerXsiLE, innerXsiTE, outerEtaLE,
                          outerEtaTE, outerXsiLE, outerXsiTE))

    #===========================================================================
    # Output to CPACS
    #===========================================================================
    if type(cpacsComponentSegment.get_controlSurfaces()) == NoneType:
        cpacsComponentSegment.set_controlSurfaces(controlSurfacesType())
    if type(cpacsComponentSegment.get_controlSurfaces().get_spoilers()
            ) == NoneType:
        cpacsComponentSegment.get_controlSurfaces().set_spoilers(
            spoilersType())

    log.debug('VAMPzero Spoiler: Exporting %s Spoilers to CPACS.' %
              (str(len(mySpoilers))))
    for spoiler in mySpoilers:
        cpacsComponentSegment.get_controlSurfaces().get_spoilers().add_spoiler(
            spoiler)
Exemple #6
0
def createSpoilersSBW(parentWingCPACS, parentWingVAMPzero, mySpoiler):
    '''
    This is the main export method for the wing's spoilers

    * It assumes a constant absolut chord for all spoilers
    * Spoiler start outboard and move inboard close behind the rearspar
    * They are rectangular

    '''
    cpacsPath = '/cpacs/vehicles/aircraft/model/wings/wing[' + parentWingVAMPzero.id + ']'
    cpacsWing = getObjfromXpath(parentWingCPACS, cpacsPath)
    cpacsComponentSegment = cpacsWing.get_componentSegments().get_componentSegment()[0]
    mySpoilers = []

    # Initialization, i.e. fetching values throughout the code
    span = parentWingVAMPzero.span.getValue() / 2.
    yFus = parentWingVAMPzero.yFuselage.getValue()
    etaFus = yFus / span

    spoilerArea = mySpoiler.refArea.getValue()
    spoilerChord = mySpoiler.chord.getValue()
    spoilerOuterEta = mySpoiler.outerEta.getValue()

    sparOffset = 0.02

    # Rear spar locations
    xsis = []
    etas = []
    for i in range(3,7):
        try:
            xsis.append(eval(cpacsComponentSegment.get_structure().get_spars().get_sparPositions().get_sparPosition()[i].get_xsi().valueOf_))
            etas.append(eval(cpacsComponentSegment.get_structure().get_spars().get_sparPositions().get_sparPosition()[i].get_eta().valueOf_))
        except IndexError:
            pass

    xsiSpar_interp = scipy.interpolate.interp1d(etas, xsis)

    # Outer Spoilers
    outerSpan = (spoilerOuterEta - etaFus) * span
    #outerArea = spoilerChord * outerSpan
    #nOuterSpoiler = outerSpan ** 2 / (outerArea * 2.)
    #log.debug('VAMPzero SPOILER: Exporting %s Spoiler outside of the kink for an area of %s m2.' % (str(nOuterSpoiler), str(outerArea)))

    calcArea = 0.
    maxInnerArea = (spoilerOuterEta - etaFus) * span * spoilerChord
    innerSpan = 0.
    while True:
        innerSpan += .01
        oldArea = calcArea
        calcArea = innerSpan * spoilerChord

        # This is the break condition that should be hit normally
        if abs(spoilerArea - calcArea) < 0.1:
            break

        if innerSpan > (spoilerOuterEta - etaFus) * span:
            log.warning('VAMPzero SPOILER: The spoiler span of the  spoiler exceeds the available span between fuselage and kink, continuing with calcArea = %s' % str(calcArea))
            break
        if oldArea > calcArea:
            log.warning('VAMPzero SPOILER: Spoiler area apparently reached a maximum, continuing with calcArea = %s' % str(calcArea))
            break

    nSpoiler = innerSpan ** 2 / (calcArea * 3.)
    log.debug('VAMPzero SPOILER: Exporting %s Spoiler inside of the kink for an area of %s m2.' % (str(nSpoiler), str(calcArea)))

    # 1 Spoiler
    if nSpoiler <= 1.:
        # The outer eta of the leading Edge is correspondent to the outerEta of the spoiler
        outerEtaLE = spoilerOuterEta
        # The inner eta of the leading edge is the outer eta minus the span of the outer spoiler
        innerEtaLE = spoilerOuterEta - outerSpan / span
        # The inner and outer Xsi coordinate of the leading edge are defined by the rear spar location and the sparOffset
        outerXsiLE = xsiSpar_interp(outerEtaLE) + sparOffset
        innerXsiLE = xsiSpar_interp(innerEtaLE) + sparOffset

        spoilerPhi = calcPhiLESpoiler(outerEtaLE, innerEtaLE, outerXsiLE, innerXsiLE, parentWingVAMPzero, cpacsWing)
        deltaEta = sin(spoilerPhi) * spoilerChord
        deltaXsi = cos(spoilerPhi) * spoilerChord

        outerEtaTE = outerEtaLE - deltaEta / span
        outerXsiTE = outerXsiLE + deltaXsi / calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing)
        innerEtaTE = innerEtaLE - deltaEta / span
        innerXsiTE = innerXsiLE + deltaXsi / calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing)
        # We do not want the spoiler to overlap the kink as the inner Spoilers will start here
        if innerEtaTE < etaFus:
            innerEtaTE = etaFus
            innerXsiTE = innerXsiLE + spoilerChord / calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing)

        mySpoilers.append(createSpoiler('Spoiler1', parentWingVAMPzero.id, innerEtaLE, innerEtaTE, innerXsiLE, innerXsiTE, outerEtaLE, outerEtaTE, outerXsiLE, outerXsiTE))

    # 2 Spoiler
    elif nSpoiler > 1. and nSpoiler <= 2.:
        # The outer eta of the leading Edge is correspondent to the outerEta of the spoiler
        outerEtaLE = spoilerOuterEta
        # The inner eta of the leading edge is the outer eta minus the span of the outer spoiler
        innerEtaLE = spoilerOuterEta - outerSpan / span / 2.
        # The inner and outer Xsi coordinate of the leading edge are defined by the rear spar location and the sparOffset
        outerXsiLE = xsiSpar_interp(outerEtaLE) + sparOffset
        innerXsiLE = xsiSpar_interp(innerEtaLE) + sparOffset

        spoilerPhi = calcPhiLESpoiler(outerEtaLE, innerEtaLE, outerXsiLE, innerXsiLE, parentWingVAMPzero, cpacsWing)
        deltaEta = sin(spoilerPhi) * spoilerChord
        deltaXsi = cos(spoilerPhi) * spoilerChord

        outerEtaTE = outerEtaLE - deltaEta / span
        outerXsiTE = outerXsiLE + deltaXsi / calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing)
        innerEtaTE = innerEtaLE - deltaEta / span
        innerXsiTE = innerXsiLE + deltaXsi / calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing)

        mySpoilers.append(createSpoiler('Spoiler2', parentWingVAMPzero.id, innerEtaLE, innerEtaTE, innerXsiLE, innerXsiTE, outerEtaLE, outerEtaTE, outerXsiLE, outerXsiTE))

        # old outer is new inner
        outerEtaLE = innerEtaLE
        # new inner is min next to kink
        innerEtaLE = spoilerOuterEta - outerSpan / span
        # The inner and outer Xsi coordinate of the leading edge are defined by the rear spar location and the sparOffset
        outerXsiLE = xsiSpar_interp(outerEtaLE) + sparOffset
        innerXsiLE = xsiSpar_interp(innerEtaLE) + sparOffset

        spoilerPhi = calcPhiLESpoiler(outerEtaLE, innerEtaLE, outerXsiLE, innerXsiLE, parentWingVAMPzero, cpacsWing)
        deltaEta = sin(spoilerPhi) * spoilerChord
        deltaXsi = cos(spoilerPhi) * spoilerChord

        outerEtaTE = outerEtaLE - deltaEta / span
        outerXsiTE = outerXsiLE + deltaXsi / calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing)
        innerEtaTE = innerEtaLE - deltaEta / span
        innerXsiTE = innerXsiLE + deltaXsi / calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing)
        # We do not want the spoiler to overlap the kink as the inner Spoilers will start here
        if innerEtaTE < etaFus:
            innerEtaTE = etaFus
            innerXsiTE = innerXsiLE + spoilerChord / calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing)
        mySpoilers.append(createSpoiler('Spoiler1', parentWingVAMPzero.id, innerEtaLE, innerEtaTE, innerXsiLE, innerXsiTE, outerEtaLE, outerEtaTE, outerXsiLE, outerXsiTE))

    # n Spoiler
    elif nSpoiler > 2.:
        n = int(ceil(nSpoiler))
        # The outer eta of the leading Edge is correspondent to the outerEta of the spoiler
        outerEtaLE = spoilerOuterEta
        # The inner eta of the leading edge is the outer eta minus the span of the outer spoiler
        innerEtaLE = outerEtaLE - outerSpan / span / n
        # The inner and outer Xsi coordinate of the leading edge are defined by the rear spar location and the sparOffset
        outerXsiLE = xsiSpar_interp(outerEtaLE) + sparOffset
        innerXsiLE = xsiSpar_interp(innerEtaLE) + sparOffset

        spoilerPhi = calcPhiLESpoiler(outerEtaLE, innerEtaLE, outerXsiLE, innerXsiLE, parentWingVAMPzero, cpacsWing)
        deltaEta = sin(spoilerPhi) * spoilerChord
        deltaXsi = cos(spoilerPhi) * spoilerChord

        outerEtaTE = outerEtaLE - deltaEta / span
        outerXsiTE = outerXsiLE + deltaXsi / calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing)
        innerEtaTE = innerEtaLE - deltaEta / span
        innerXsiTE = innerXsiLE + deltaXsi / calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing)
        mySpoilers.append(createSpoiler('Spoiler' + str(n), parentWingVAMPzero.id, innerEtaLE, innerEtaTE, innerXsiLE, innerXsiTE, outerEtaLE, outerEtaTE, outerXsiLE, outerXsiTE))

        for i in range(2, n):
            # old outer is new inner
            outerEtaLE = innerEtaLE
            # new inner is min next to kink
            innerEtaLE = outerEtaLE - outerSpan / span / n
            # The inner and outer Xsi coordinate of the leading edge are defined by the rear spar location and the sparOffset
            outerXsiLE = xsiSpar_interp(outerEtaLE) + sparOffset
            innerXsiLE = xsiSpar_interp(innerEtaLE) + sparOffset

            spoilerPhi = calcPhiLESpoiler(outerEtaLE, innerEtaLE, outerXsiLE, innerXsiLE, parentWingVAMPzero, cpacsWing)
            deltaEta = sin(spoilerPhi) * spoilerChord
            deltaXsi = cos(spoilerPhi) * spoilerChord

            outerEtaTE = outerEtaLE - deltaEta / span
            outerXsiTE = outerXsiLE + deltaXsi / calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing)
            innerEtaTE = innerEtaLE - deltaEta / span
            innerXsiTE = innerXsiLE + deltaXsi / calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing)
            mySpoilers.append(createSpoiler('Spoiler' + str(n - i + 1), parentWingVAMPzero.id, innerEtaLE, innerEtaTE, innerXsiLE, innerXsiTE, outerEtaLE, outerEtaTE, outerXsiLE, outerXsiTE))

        # old outer is new inner
        outerEtaLE = innerEtaLE
        # new inner is min next to kink
        innerEtaLE = spoilerOuterEta - outerSpan / span
        # The inner and outer Xsi coordinate of the leading edge are defined by the rear spar location and the sparOffset
        outerXsiLE = xsiSpar_interp(outerEtaLE) + sparOffset
        innerXsiLE = xsiSpar_interp(innerEtaLE) + sparOffset

        spoilerPhi = calcPhiLESpoiler(outerEtaLE, innerEtaLE, outerXsiLE, innerXsiLE, parentWingVAMPzero, cpacsWing)
        deltaEta = sin(spoilerPhi) * spoilerChord
        deltaXsi = cos(spoilerPhi) * spoilerChord

        outerEtaTE = outerEtaLE - deltaEta / span
        outerXsiTE = outerXsiLE + deltaXsi / calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing)
        innerEtaTE = innerEtaLE - deltaEta / span
        innerXsiTE = innerXsiLE + deltaXsi / calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing)
        # We do not want the spoiler to overlap the kink as the inner Spoilers will start here
        if innerEtaTE < etaFus:
            innerEtaTE = etaFus
            innerXsiTE = innerXsiLE + spoilerChord / calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing)
        mySpoilers.append(createSpoiler('Spoiler1', parentWingVAMPzero.id, innerEtaLE, innerEtaTE, innerXsiLE, innerXsiTE, outerEtaLE, outerEtaTE, outerXsiLE, outerXsiTE))

    # Output to CPACS
    if type(cpacsComponentSegment.get_controlSurfaces()) == NoneType:
        cpacsComponentSegment.set_controlSurfaces(controlSurfacesType())
    if type(cpacsComponentSegment.get_controlSurfaces().get_spoilers()) == NoneType:
        cpacsComponentSegment.get_controlSurfaces().set_spoilers(spoilersType())

    log.debug('VAMPzero Spoiler: Exporting %s Spoilers to CPACS.' % (str(len(mySpoilers))))
    for spoiler in mySpoilers:
        cpacsComponentSegment.get_controlSurfaces().get_spoilers().add_spoiler(spoiler)
Exemple #7
0
def createAileron(parentWingCPACS, parentWingVAMPzero, myAileron):
    '''
    This is the main export method for the wings aileron
    '''
    cpacsPath = '/cpacs/vehicles/aircraft/model/wings/wing[' + parentWingVAMPzero.id + ']'
    cpacsWing = getObjfromXpath(parentWingCPACS, cpacsPath)
    cpacsComponentSegment = cpacsWing.get_componentSegments().get_componentSegment()[0]

    # Header
    myName = stringBaseType(None, None, None, 'aileron')
    myDescription = stringBaseType(None, None, None, 'aileron from VAMPzero')
    myParentUID = stringUIDBaseType(None, None, 'True', None, 'wing_Cseg')

    # Initialization, i.e. fetching values throughout the code
    xsis = []
    etas = []
    for i in range(3,7):
        try:
            xsis.append(eval(cpacsComponentSegment.get_structure().get_spars().get_sparPositions().get_sparPosition()[i].get_xsi().valueOf_))
            etas.append(eval(cpacsComponentSegment.get_structure().get_spars().get_sparPositions().get_sparPosition()[i].get_eta().valueOf_))
        except IndexError:
            pass

    xsiSpar_interp = scipy.interpolate.interp1d(etas, xsis)
    
    sparOffset = 0.1
    wingSpan = parentWingVAMPzero.span.getValue() / 2.

    # Outer Shape
    # The outer border eta station is set to 96 percent
    outerEtaLE = 0.96
    # The outer chord station is determined from the wing's chord at eta = 0.96
    # and the rear spar location + the spar offset
    outerXsiLE = xsiSpar_interp(0.96) + sparOffset
    outerWingChord = calcChordLengthAtEta(outerEtaLE, parentWingVAMPzero, cpacsWing)
    
    cTip = (1 - outerXsiLE) * outerWingChord
    
    # now we need to determine the necessary span for the aileron by gently increasing the span
    # this is an iterative process as the chord of the aileron is a function of the inbound span
    aileronArea = parentWingVAMPzero.aileron.refArea.getValue()
    delta = 0.01
    calcArea = 0.
    while abs(calcArea - aileronArea) > 0.1:
        if delta > outerEtaLE:
            parentWingVAMPzero.log.warning('VAMPzero EXPORT: Cannot determine the span of the aileron')
            parentWingVAMPzero.log.warning('VAMPzero EXPORT: aileronArea= '+str(aileronArea))
            parentWingVAMPzero.log.warning('VAMPzero EXPORT: Decreasing Spar Offset')
            sparOffset = sparOffset - 0.02
            delta = 0.01
            
        innerEtaLE = outerEtaLE - delta
        innerXsiLE = xsiSpar_interp(innerEtaLE) + sparOffset        
        innerWingChord = calcChordLengthAtEta(innerEtaLE, parentWingVAMPzero, cpacsWing)
        cRoot = (1 - innerXsiLE) * innerWingChord

        calcArea = (cTip + cRoot) / 2 * (outerEtaLE - innerEtaLE) * wingSpan
        delta += 0.005
 
    # start outer shape
    myleadingEdgeShape = leadingEdgeShapeType(relHeightLE=doubleBaseType(valueOf_=str(0.5)), xsiUpperSkin=doubleBaseType(valueOf_=str(0.85)), xsiLowerSkin=doubleBaseType(valueOf_=str(0.85)))
    innerBorder = controlSurfaceBorderTrailingEdgeType(etaLE=doubleBaseType(valueOf_=str(innerEtaLE)), etaTE=doubleBaseType(valueOf_=str(innerEtaLE)), xsiLE=doubleBaseType(valueOf_=str(innerXsiLE)), leadingEdgeShape=myleadingEdgeShape)
    outerBorder = controlSurfaceBorderTrailingEdgeType(etaLE=doubleBaseType(valueOf_=str(outerEtaLE)), etaTE=doubleBaseType(valueOf_=str(outerEtaLE)), xsiLE=doubleBaseType(valueOf_=str(outerXsiLE)), leadingEdgeShape=myleadingEdgeShape)
    myOuterShape = controlSurfaceOuterShapeTrailingEdgeType(innerBorder=innerBorder, outerBorder=outerBorder)
    
    # structure
    myStructure = wingComponentSegmentStructureType()
    cpacsAileron = trailingEdgeDeviceType(uID='aileronUID', name=myName, description=myDescription, parentUID=myParentUID, outerShape=myOuterShape, structure=myStructure)
    createAileronStructure(cpacsAileron)
    
    # Forward information about innerEtaLE to the flap
    parentWingVAMPzero.flap.maxEta = parameter(value=innerEtaLE, doc='This it the inner position of the aileron, the flap may not exceed it')
    
    # moveables
    deltaEta = outerEtaLE - innerEtaLE 
    innerParentXsi = xsiSpar_interp(innerEtaLE + 0.3 * deltaEta) + 0.02
    outerParentXsi = xsiSpar_interp(innerEtaLE + 0.7 * deltaEta) + 0.02

    createPath(cpacsAileron, 'aileron')
    createTracks(cpacsAileron, 'aileron')
    createActuators(cpacsAileron, 'aileron', [innerParentXsi, outerParentXsi])

    if type(cpacsComponentSegment.get_controlSurfaces()) == NoneType:
        cpacsComponentSegment.set_controlSurfaces(controlSurfacesType())
    if type(cpacsComponentSegment.get_controlSurfaces().get_trailingEdgeDevices()) == NoneType:
        cpacsComponentSegment.get_controlSurfaces().set_trailingEdgeDevices(trailingEdgeDevicesType())
    
    cpacsComponentSegment.get_controlSurfaces().get_trailingEdgeDevices().add_trailingEdgeDevice(cpacsAileron)
Exemple #8
0
def createSlats(parentWingCPACS, parentWingVAMPzero, mySlat):
    '''
    This is the main export method for the wing's slats
    It assumes a constant absolut chord for all slats.
    At the engine position a 5% span gap is included for the slats
    Slats end 5% prior to the wing tip
    '''
    cpacsPath = '/cpacs/vehicles/aircraft/model/wings/wing[' + parentWingVAMPzero.id + ']'
    cpacsWing = getObjfromXpath(parentWingCPACS, cpacsPath)
    cpacsComponentSegment = cpacsWing.get_componentSegments().get_componentSegment()[0]
    mySlats = []
    
    #===========================================================================
    # Initialization, i.e. fetching values throughout the code
    #===========================================================================
    yFus = parentWingVAMPzero.yFuselage.getValue()
    span = parentWingVAMPzero.span.getValue() / 2.
    etaFus = yFus / span

    slatArea = mySlat.refArea.getValue()

    # The absolut chord of all slats is equal it is determined by the  
    # total slat area over the remaining span
    # the remaining span is the span minus the fuselage section minus 5% around the engine
    # and 5% at the tip
    cSlat = slatArea / ((1.0 - etaFus - 0.1) * span)
    
    if cSlat > calcChordLengthAtEta(etaFus, parentWingVAMPzero, cpacsWing) * 0.075:
        log.warning('VAMPzero SLAT: The slat chord is larger than 7.5% of the wing\'s chord at the fuselage intersection.')

    
    #===========================================================================
    # Inner Wing Slats
    # ----------------
    #
    # At first inner wing slats are defined. These do only extend up to the engine
    # a plus minus 2.5% span are reserved for the slats
    # Note the calculation is only valid for nEngine == 2
    # The aspect ratio of a slat should not be higher than 5.5    
    #===========================================================================
    etaEngine = parentWingVAMPzero.etaEngine.getValue()
    innerSpan = span * (etaEngine - 0.025 - etaFus)
    innerArea = innerSpan * cSlat
    nInnerSlats = innerSpan ** 2. / (innerArea * 5.5)
    log.debug('VAMPzero SLAT: Exporting %s Slats inside of the engine for an area of %s m2.' % (str(nInnerSlats), str(innerArea)))

    #===========================================================================
    # 1 Slat
    #===========================================================================
    if nInnerSlats <= 1.:
        # the inner border eta is located at the Fuselage
        innerEtaTE = etaFus
        innerXsiTE = cSlat / calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing)

        # the outer border eta is determined from the span of the outer flap
        outerEtaTE = etaFus + innerSpan / span
        outerXsiTE = cSlat / calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing)

        #Slats extend 50% of their chord lenght
        innerX = innerXsiTE * calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing) * 0.5
        outerX = outerXsiTE * calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing) * 0.5
        
        mySlats.append(createSlat('InnerSlat1', parentWingVAMPzero.id, innerEtaTE, innerXsiTE, outerEtaTE, outerXsiTE, innerX=innerX, outerX=outerX))
    
    #===========================================================================
    # 2 Slats
    #===========================================================================
    elif nInnerSlats > 1. and nInnerSlats < 2.:
        # the inner border eta is located at the Fuselage
        innerEtaTE = etaFus
        innerXsiTE = cSlat / calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing)

        # the outer border eta is determined from the span of the outer flap
        outerEtaTE = etaFus + innerSpan / 2. / span
        outerXsiTE = cSlat / calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing)

        #Slats extend 50% of their chord lenght
        innerX = innerXsiTE * calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing) * 0.5
        outerX = outerXsiTE * calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing) * 0.5

        mySlats.append(createSlat('InnerSlat1', parentWingVAMPzero.id, innerEtaTE, innerXsiTE, outerEtaTE, outerXsiTE, innerX=innerX, outerX=outerX))
        
        # new inner is the old outer 
        innerEtaLE = outerEtaTE
        innerXsiLE = outerXsiTE
        # the outer border eta is determined from the full span of the total outer flap
        outerEtaLE = etaFus + innerSpan / span
        outerXsiLE = cSlat / calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing)

        #Slats extend 50% of their chord lenght
        innerX = innerXsiTE * calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing) * 0.5
        outerX = outerXsiTE * calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing) * 0.5

        mySlats.append(createSlat('InnerSlat2', parentWingVAMPzero.id, innerEtaLE, innerXsiLE, outerEtaLE, outerXsiLE, innerX=innerX, outerX=outerX))
    else:
        log.warning('VAMPzero EXPORT: Need more inner slats')

    #===========================================================================
    # Outer Wing Slats
    # ----------------
    #
    # Determine the number of remaining slats
    # The aspect ratio of a slat should not be higher than 5.5 
    #===========================================================================
    slatArea = slatArea - innerArea
    calcArea = 0.
    spanSlat = 0.
     
    while abs(calcArea - slatArea) > 0.5:
        spanSlat += .01
        calcArea = spanSlat * cSlat

    #===========================================================================
    # Determine the number of slats
    # The aspect ratio of a slats should not be higher than 5.5 
    #===========================================================================
    nSlats = spanSlat ** 2. / (slatArea * 5.5)
    log.debug('VAMPzero SLAT: Exporting %s Slats outboard of the engine for an area of %s m2.' % (str(nSlats), str(slatArea)))
    
    #===========================================================================
    # 1 Slat
    #===========================================================================
    if nSlats <= 1.:
        # the inner border eta is located at the Fuselage
        innerEtaTE = etaEngine + 0.025
        innerXsiTE = cSlat / calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing)

        # the outer border eta is determined from the span of the outer flap
        outerEtaTE = innerEtaTE + spanSlat / span
        outerXsiTE = cSlat / calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing)

        #Slats extend 50% of their chord lenght
        innerX = innerXsiTE * calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing) * 0.5
        outerX = outerXsiTE * calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing) * 0.5

        mySlats.append(createSlat('OuterSlat1', parentWingVAMPzero.id, innerEtaTE, innerXsiTE, outerEtaTE, outerXsiTE, innerX=innerX, outerX=outerX))
    
    #===========================================================================
    # 2 Slats
    #===========================================================================
    elif nSlats > 1. and nSlats < 2.:
        # the inner border eta is located at the Fuselage
        innerEtaTE = etaEngine + 0.025
        innerXsiTE = cSlat / calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing)

        # the outer border eta is determined from the span of the outer flap
        outerEtaTE = innerEtaTE + spanSlat / 2. / span
        outerXsiTE = cSlat / calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing)

        #Slats extend 50% of their chord lenght
        innerX = innerXsiTE * calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing) * 0.5
        outerX = outerXsiTE * calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing) * 0.5

        mySlats.append(createSlat('OuterSlat1', parentWingVAMPzero.id, innerEtaTE, innerXsiTE, outerEtaTE, outerXsiTE, innerX=innerX, outerX=outerX))
        
        # new inner is the old outer 
        innerEtaTE = outerEtaTE
        innerXsiTE = outerXsiTE
        # the outer border eta is determined from the full span of the total outer flap
        outerEtaTE = innerEtaTE + spanSlat / span
        outerXsiTE = cSlat / calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing)

        #Slats extend 50% of their chord lenght
        innerX = innerXsiTE * calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing) * 0.5
        outerX = outerXsiTE * calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing) * 0.5

        mySlats.append(createSlat('OuterSlat2', parentWingVAMPzero.id, innerEtaTE, innerXsiTE, outerEtaTE, outerXsiTE, innerX=innerX, outerX=outerX))
    else:
    #===========================================================================
    # n Slats
    #===========================================================================
        # the inner border eta is located at the Fuselage
        n = int(ceil(nSlats))
        innerEtaTE = etaEngine + 0.025
        innerXsiTE = cSlat / calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing)
        
        # First Slat
        # the outer border eta is determined from the span of the outer flap
        outerEtaTE = innerEtaTE + spanSlat / n / span
        outerXsiTE = cSlat / calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing)

        #Slats extend 50% of their chord lenght
        innerX = innerXsiTE * calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing) * 0.5
        outerX = outerXsiTE * calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing) * 0.5

        mySlats.append(createSlat('OuterSlat1', parentWingVAMPzero.id, innerEtaTE, innerXsiTE, outerEtaTE, outerXsiTE, innerX=innerX, outerX=outerX))
        
        for i in range(2, n):
            # new inner is the old outer 
            innerEtaTE = outerEtaTE
            innerXsiTE = outerXsiTE
            # the outer border eta is determined from the full span of the total outer flap
            outerEtaTE = innerEtaTE + spanSlat / n / span
            outerXsiTE = cSlat / calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing)
            
            #Slats extend 50% of their chord lenght
            innerX = innerXsiTE * calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing) * 0.5
            outerX = outerXsiTE * calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing) * 0.5
            
            mySlats.append(createSlat('OuterSlat' + str(i), parentWingVAMPzero.id, innerEtaTE, innerXsiTE, outerEtaTE, outerXsiTE, innerX=innerX, outerX=outerX))

        # Last Slat
        # new inner is the old outer 
        innerEtaTE = outerEtaTE
        innerXsiTE = outerXsiTE
        # the outer border eta is determined from the full span of the total outer flap
        outerEtaTE = innerEtaTE + spanSlat / n / span
        outerXsiTE = cSlat / calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing)

        #Slats extend 50% of their chord lenght
        innerX = innerXsiTE * calcChordLengthAtEta(innerEtaTE, parentWingVAMPzero, cpacsWing) * 0.5
        outerX = outerXsiTE * calcChordLengthAtEta(outerEtaTE, parentWingVAMPzero, cpacsWing) * 0.5
        
        mySlats.append(createSlat('OuterSlat' + str(n), parentWingVAMPzero.id, innerEtaTE, innerXsiTE, outerEtaTE, outerXsiTE, innerX=innerX, outerX=outerX))
    
    #===========================================================================
    # Output to CPACS
    #===========================================================================
    if type(cpacsComponentSegment.get_controlSurfaces()) == NoneType:
        cpacsComponentSegment.set_controlSurfaces(controlSurfacesType())
    if type(cpacsComponentSegment.get_controlSurfaces().get_leadingEdgeDevices()) == NoneType:
        cpacsComponentSegment.get_controlSurfaces().set_leadingEdgeDevices(leadingEdgeDevicesType())
    
    log.debug('VAMPzero SLAT: Exporting %s Slats to CPACS.' % (str(len(mySlats))))
    for slat in mySlats:
        cpacsComponentSegment.get_controlSurfaces().get_leadingEdgeDevices().add_leadingEdgeDevice(slat)
Exemple #9
0
def createAileron(parentWingCPACS, parentWingVAMPzero, myAileron):
    '''
    This is the main export method for the wings aileron
    '''
    cpacsPath = '/cpacs/vehicles/aircraft/model/wings/wing[' + parentWingVAMPzero.id + ']'
    cpacsWing = getObjfromXpath(parentWingCPACS, cpacsPath)
    cpacsComponentSegment = cpacsWing.get_componentSegments(
    ).get_componentSegment()[0]

    #===========================================================================
    # Header
    #===========================================================================
    myName = stringBaseType(None, None, None, 'aileron')
    myDescription = stringBaseType(None, None, None, 'aileron from VAMPzero')
    myParentUID = stringUIDBaseType(None, None, 'True', None, 'wing_Cseg')

    #===========================================================================
    # Initialization, i.e. fetching values throughout the code
    #===========================================================================
    xsiSparRoot = eval(cpacsComponentSegment.get_structure().get_spars(
    ).get_sparPositions().get_sparPosition()[3].get_xsi().valueOf_)
    xsiSparFuselage = eval(cpacsComponentSegment.get_structure().get_spars(
    ).get_sparPositions().get_sparPosition()[4].get_xsi().valueOf_)
    xsiSparKink = eval(cpacsComponentSegment.get_structure().get_spars(
    ).get_sparPositions().get_sparPosition()[5].get_xsi().valueOf_)
    xsiSparTip = eval(cpacsComponentSegment.get_structure().get_spars(
    ).get_sparPositions().get_sparPosition()[6].get_xsi().valueOf_)

    etaSparRoot = eval(cpacsComponentSegment.get_structure().get_spars(
    ).get_sparPositions().get_sparPosition()[3].get_eta().valueOf_)
    etaSparFuselage = eval(cpacsComponentSegment.get_structure().get_spars(
    ).get_sparPositions().get_sparPosition()[4].get_eta().valueOf_)
    etaSparKink = eval(cpacsComponentSegment.get_structure().get_spars(
    ).get_sparPositions().get_sparPosition()[5].get_eta().valueOf_)
    etaSparTip = eval(cpacsComponentSegment.get_structure().get_spars(
    ).get_sparPositions().get_sparPosition()[6].get_eta().valueOf_)

    xsiSpar_interp = scipy.interpolate.interp1d(
        [etaSparRoot, etaSparFuselage, etaSparKink, etaSparTip],
        [xsiSparRoot, xsiSparFuselage, xsiSparKink, xsiSparTip])

    sparOffset = 0.1
    wingSpan = parentWingVAMPzero.span.getValue() / 2.
    #===========================================================================
    # Outer Shape
    #===========================================================================
    # The outer border eta station is set to 96 percent
    outerEtaLE = 0.96
    # The outer chord station is determined from the wing's chord at eta = 0.96
    # and the rear spar location + the spar offset
    outerXsiLE = xsiSpar_interp(0.96) + sparOffset
    outerWingChord = calcChordLengthAtEta(outerEtaLE, parentWingVAMPzero,
                                          cpacsWing)

    cTip = (1 - outerXsiLE) * outerWingChord

    # now we need to determine the necessary span for the aileron by gently increasing the span
    # this is an iterative process as the chord of the aileron is a function of the inbound span
    aileronArea = parentWingVAMPzero.aileron.refArea.getValue()
    delta = 0.01
    calcArea = 0.
    while abs(calcArea - aileronArea) > 0.1:
        if delta > outerEtaLE:
            parentWingVAMPzero.log.warning(
                'VAMPzero EXPORT: Cannot determine the span of the aileron')
            parentWingVAMPzero.log.warning('VAMPzero EXPORT: aileronArea= ' +
                                           str(aileronArea))
            parentWingVAMPzero.log.warning(
                'VAMPzero EXPORT: Decreasing Spar Offset')
            sparOffset = sparOffset - 0.02
            delta = 0.01

        innerEtaLE = outerEtaLE - delta
        innerXsiLE = xsiSpar_interp(innerEtaLE) + sparOffset
        innerWingChord = calcChordLengthAtEta(innerEtaLE, parentWingVAMPzero,
                                              cpacsWing)
        cRoot = (1 - innerXsiLE) * innerWingChord

        calcArea = (cTip + cRoot) / 2 * (outerEtaLE - innerEtaLE) * wingSpan
        delta += 0.005

    # start outer shape
    myleadingEdgeShape = leadingEdgeShapeType(
        relHeightLE=doubleBaseType(valueOf_=str(0.5)),
        xsiUpperSkin=doubleBaseType(valueOf_=str(0.85)),
        xsiLowerSkin=doubleBaseType(valueOf_=str(0.85)))
    innerBorder = controlSurfaceBorderTrailingEdgeType(
        etaLE=doubleBaseType(valueOf_=str(innerEtaLE)),
        etaTE=doubleBaseType(valueOf_=str(innerEtaLE)),
        xsiLE=doubleBaseType(valueOf_=str(innerXsiLE)),
        leadingEdgeShape=myleadingEdgeShape)
    outerBorder = controlSurfaceBorderTrailingEdgeType(
        etaLE=doubleBaseType(valueOf_=str(outerEtaLE)),
        etaTE=doubleBaseType(valueOf_=str(outerEtaLE)),
        xsiLE=doubleBaseType(valueOf_=str(outerXsiLE)),
        leadingEdgeShape=myleadingEdgeShape)
    myOuterShape = controlSurfaceOuterShapeTrailingEdgeType(
        innerBorder=innerBorder, outerBorder=outerBorder)

    # structure
    myStructure = wingComponentSegmentStructureType()
    cpacsAileron = trailingEdgeDeviceType(uID='aileronUID',
                                          name=myName,
                                          description=myDescription,
                                          parentUID=myParentUID,
                                          outerShape=myOuterShape,
                                          structure=myStructure)
    createAileronStructure(cpacsAileron)

    # Forward information about innerEtaLE to the flap
    parentWingVAMPzero.flap.maxEta = parameter(
        value=innerEtaLE,
        doc=
        'This it the inner position of the aileron, the flap may not exceed it'
    )

    # moveables
    deltaEta = outerEtaLE - innerEtaLE
    innerParentXsi = xsiSpar_interp(innerEtaLE + 0.3 * deltaEta) + 0.02
    outerParentXsi = xsiSpar_interp(innerEtaLE + 0.7 * deltaEta) + 0.02

    createPath(cpacsAileron, 'aileron')
    createTracks(cpacsAileron, 'aileron')
    createActuators(cpacsAileron, 'aileron', [innerParentXsi, outerParentXsi])

    if type(cpacsComponentSegment.get_controlSurfaces()) == NoneType:
        cpacsComponentSegment.set_controlSurfaces(controlSurfacesType())
    if type(cpacsComponentSegment.get_controlSurfaces().
            get_trailingEdgeDevices()) == NoneType:
        cpacsComponentSegment.get_controlSurfaces().set_trailingEdgeDevices(
            trailingEdgeDevicesType())

    cpacsComponentSegment.get_controlSurfaces().get_trailingEdgeDevices(
    ).add_trailingEdgeDevice(cpacsAileron)