dummyDescentGlideSlope.buildSimulatedGlideSlope()
    firstGlideSlopeWayPoint = dummyDescentGlideSlope.getVertex(v=0).getWeight()

    print('=============== init aircraft state vector =================')

    casKnots = 107.0
    casMetersPerSecond = casKnots * Knots2MetersPerSecond
    tasMetersPerSecond = atmosphere.cas2tas(casMetersPerSecond,
                                            950.0,
                                            speed_units='m/s',
                                            altitude_units='m')

    elapsedTimeSeconds = 0.0
    aircraft.initStateVector(
        elapsedTimeSeconds=elapsedTimeSeconds,
        trueAirSpeedMetersSecond=tasMetersPerSecond,
        altitudeMeanSeaLevelMeters=firstGlideSlopeWayPoint.
        getAltitudeMeanSeaLevelMeters(),
        deltaDistanceFlownMeters=0.0)

    aircraft.setApproachConfiguration(0.0)
    aircraftMassKilograms = 49000.0
    aircraft.setAircraftMassKilograms(aircraftMassKilograms)

    print(
        '===================== final 3 degrees descending glide slope ================'
    )
    descentGlideSlope = DescentGlideSlope(runway=arrivalRunway,
                                          aircraft=aircraft,
                                          arrivalAirport=arrivalAirport,
                                          descentGlideSlopeDegrees=3.0)
    if (acBd.aircraftExists(aircraftIcaoCode)
            and acBd.aircraftPerformanceFileExists(
                acBd.getAircraftPerformanceFile(aircraftIcaoCode))):
        aircraft = BadaAircraft(
            aircraftIcaoCode,
            acBd.getAircraftPerformanceFile(aircraftIcaoCode), atmosphere,
            earth)
        aircraft.dump()
    assert not (aircraft is None)

    elapsedTimeSeconds = 0.0
    deltaTimeSeconds = 1.0

    aircraft.initStateVector(elapsedTimeSeconds=0.0,
                             trueAirSpeedMetersSecond=0.0,
                             airportFieldElevationAboveSeaLevelMeters=0.0)

    aircraft.setTargetCruiseFlightLevel(RequestedFlightLevel=310.0,
                                        departureAirportAltitudeMSLmeters=0.0)
    aircraft.setAircraftMassKilograms(aircraftMassKilograms=285700.0)
    aircraft.setTargetCruiseMach(cruiseMachNumber=0.8)

    tas = aircraft.getCurrentTrueAirSpeedMetersSecond()
    previousAltitudeMSLmeters = 0.0
    t0 = time.clock()
    print('simulation start= {0} seconds'.format(t0))

    print('=========== simulation start ==================')
    endOfSimulation = False
    currentPosition = departureAirport
コード例 #3
0
    if (acBd.aircraftExists(aircraftIcaoCode)
            and acBd.aircraftPerformanceFileExists(
                acBd.getAircraftPerformanceFile(aircraftIcaoCode))):
        aircraft = BadaAircraft(
            aircraftIcaoCode,
            acBd.getAircraftPerformanceFile(aircraftIcaoCode), atmosphere,
            earth)
        aircraft.dump()
    assert not (aircraft is None)

    elapsedTimeSeconds = 0.0
    deltaTimeSeconds = 1.0

    aircraft.initStateVector(elapsedTimeSeconds=0.0,
                             trueAirSpeedMetersSecond=0.0,
                             altitudeMeanSeaLevelMeters=0.0)

    aircraft.setTargetCruiseFlightLevel(RequestedFlightLevel=310.0,
                                        departureAirportAltitudeMSLmeters=0.0)
    aircraft.setAircraftMassKilograms(aircraftMassKilograms=64000.0)
    aircraft.setTargetCruiseMach(cruiseMach=0.8)

    tas = aircraft.getCurrentTrueAirSpeedMetersSecond()
    previousAltitudeMSLmeters = 0.0
    t0 = time.clock()
    print('simulation start= {0} seconds'.format(t0))
    print('=========== simulation start ==================')
    endOfSimulation = False
    currentPosition = departureAirport
 def test_Two(self):  
 
     t0 = time.clock()
     print ( " ========== Great Circle ======= time start= ", t0 )
     atmosphere = Atmosphere()
     earth = Earth()
     
     print ( '==================== Great Circle ==================== '+ time.strftime("%c") )
     acBd = BadaAircraftDatabase()
     aircraftICAOcode = 'A320'
     if acBd.read():
         if ( acBd.aircraftExists(aircraftICAOcode) 
              and acBd.aircraftPerformanceFileExists(aircraftICAOcode)):
             
             print ( '==================== aircraft found  ==================== '+ time.strftime("%c") )
             aircraft = BadaAircraft(ICAOcode = aircraftICAOcode, 
                                         aircraftFullName = acBd.getAircraftFullName(aircraftICAOcode),
                                         badaPerformanceFilePath = acBd.getAircraftPerformanceFile(aircraftICAOcode),
                                         atmosphere = atmosphere,
                                         earth = earth)
             print ( aircraft )
     
     else:
         
         print ( '====================  airport database ==================== '+ time.strftime("%c") )
         airportsDB = AirportsDatabase()
         assert not(airportsDB is None)
         
         wayPointsDb = WayPointsDatabase()
         assert (wayPointsDb.read())
     
         initialWayPoint = wayPointsDb.getWayPoint('TOU')
         finalWayPoint = wayPointsDb.getWayPoint('ALIVA') 
         print ( initialWayPoint.getBearingDegreesTo(finalWayPoint) )
         print ( finalWayPoint.getBearingDegreesTo(initialWayPoint) )
         
         ''' departure ground run => initial speed is null '''
         trueAirSpeedMetersSecond = 70.0
         elapsedTimeSeconds = 0.0
 
         aircraft.setCurrentAltitudeSeaLevelMeters( 
                                          elapsedTimeSeconds = 0.0 , 
                                          altitudeMeanSeaLevelMeters = 0.0,
                                          lastAltitudeMeanSeaLevelMeters = 0.0,
                                          targetCruiseAltitudeMslMeters = 10000.0)
                
         aircraft.initStateVector( 
                         elapsedTimeSeconds = 0.0,
                         trueAirSpeedMetersSecond = 70.0,
                         airportFieldElevationAboveSeaLevelMeters = 152.0)
         
         aircraft.setTargetCruiseFlightLevel(RequestedFlightLevel = 310, 
                                    departureAirportAltitudeMSLmeters = 152.0)
         
         print ( "=========== simulated descent glide slope  =========== " + time.strftime("%c") )
         MarseilleMarignane = airportsDB.getAirportFromICAOCode('LFML')
         
         
         print ( '==================== runways database ==================== '+ time.strftime("%c") )
         runWaysDatabase = RunWayDataBase()
         assert runWaysDatabase.read()
         runway = runWaysDatabase.getFilteredRunWays(airportICAOcode = 'LFML', runwayName = '')
 
         arrivalGroundRun = GroundRunLeg( runway   = runway,
                                          aircraft = aircraft,
                                          airport  = MarseilleMarignane )
         
         touchDownWayPoint = arrivalGroundRun.computeTouchDownWayPoint()
         aircraft.setArrivalRunwayTouchDownWayPoint(touchDownWayPoint)
 
         threeDegreesGlideSlope = DescentGlideSlope(runway = runway, 
                                                    aircraft = aircraft, 
                                                    arrivalAirport = MarseilleMarignane )
         threeDegreesGlideSlope.buildSimulatedGlideSlope(descentGlideSlopeSizeNautics = 5.0)
         approachWayPoint = threeDegreesGlideSlope.getLastVertex().getWeight()
         
         aircraft.setTargetApproachWayPoint(approachWayPoint)
         
         ''' =================================='''
         greatCircle = GreatCircleRoute(initialWayPoint = initialWayPoint, 
                                         finalWayPoint = finalWayPoint,
                                         aircraft = aircraft)
         
         distanceStillToFlyMeters = initialWayPoint.getDistanceMetersTo(approachWayPoint)
 
         greatCircle.computeGreatCircle( 
                            deltaTimeSeconds = 0.1,
                            elapsedTimeSeconds = 0.0,
                            distanceStillToFlyMeters = distanceStillToFlyMeters,
                            distanceToLastFixMeters = distanceStillToFlyMeters)
         
         print ( 'main great circle length= ' + str(greatCircle.computeLengthMeters()) + ' meters' )
 
         greatCircle.createKmlOutputFile()
         greatCircle.createXlsxOutputFile()
    assert runWaysDB.read()

    arrivalRunway = runWaysDB.getFilteredRunWays(
        arrivalAirportCode, 'Landing', aircraft.WakeTurbulenceCategory)
    print(arrivalRunway)

    aircraft.setArrivalAirportElevationMeters(
        arrivalAirport.getFieldElevationAboveSeaLevelMeters())

    CAS = aircraft.computeLandingStallSpeedCasKnots()
    TAS = cas2tas(
        cas=CAS,
        altitude=arrivalAirport.getFieldElevationAboveSeaLevelMeters(),
        temp='std',
        speed_units='kt',
        alt_units='m',
        temp_units=default_temp_units,
    )
    aircraft.initStateVector(elapsedTimeSeconds=0.0,
                             trueAirSpeedMetersSecond=TAS,
                             altitudeMeanSeaLevelMeters=arrivalAirport.
                             getFieldElevationAboveSeaLevelMeters(),
                             deltaDistanceFlownMeters=0.0)
    aircraft.setLandingConfiguration(0.0)
    groundRun = GroundRunLeg(runway=arrivalRunway,
                             aircraft=aircraft,
                             airport=arrivalAirport)

    groundRun.buildArrivalGroundRun(0.0)
    groundRun.createXlsxOutputFile()
    groundRun.createKmlOutputFile()
class TestGreatCircleRoute(unittest.TestCase):
    def setUp(self) -> None:

        self.deltaTimeSeconds = 1.0
        atmosphere = Atmosphere()
        earth = Earth()

        print('==================== Aircraft ==================== ' +
              time.strftime("%c"))
        acBd = BadaAircraftDatabase()
        aircraftICAOcode = 'A320'
        if acBd.read():
            if (acBd.aircraftExists(aircraftICAOcode)
                    and acBd.aircraftPerformanceFileExists(aircraftICAOcode)):
                print(
                    '==================== aircraft found  ==================== '
                    + time.strftime("%c"))
                self.aircraft = BadaAircraft(
                    ICAOcode=aircraftICAOcode,
                    aircraftFullName=acBd.getAircraftFullName(
                        aircraftICAOcode),
                    badaPerformanceFilePath=acBd.getAircraftPerformanceFile(
                        aircraftICAOcode),
                    atmosphere=atmosphere,
                    earth=earth,
                    windSpeedMetersPerSecond=None,
                    windDirectionDegrees=None)
                print(self.aircraft)
                assert not (self.aircraft is None)

    def test_One(self):
        print('==================== departure airport ==================== ' +
              time.strftime("%c"))
        airportsDB = AirportsDatabase()
        assert (airportsDB.read())

        CharlesDeGaulle = airportsDB.getAirportFromICAOCode('LFPG')
        print(CharlesDeGaulle)

        print('==================== arrival airport ==================== ' +
              time.strftime("%c"))

        MarseilleMarignane = airportsDB.getAirportFromICAOCode('LFML')
        print(MarseilleMarignane)

        print('==================== Great Circle ==================== ' +
              time.strftime("%c"))

        self.aircraft.setCurrentAltitudeSeaLevelMeters(
            elapsedTimeSeconds=0.0,
            altitudeMeanSeaLevelMeters=0.0,
            lastAltitudeMeanSeaLevelMeters=0.0,
            targetCruiseAltitudeMslMeters=10000.0)

        self.aircraft.initStateVector(
            elapsedTimeSeconds=0.0,
            trueAirSpeedMetersSecond=70.0,
            airportFieldElevationAboveSeaLevelMeters=152.0)

        self.aircraft.setTargetCruiseFlightLevel(
            RequestedFlightLevel=310, departureAirportAltitudeMSLmeters=152.0)

        print('==================== runways database ==================== ' +
              time.strftime("%c"))
        runWaysDatabase = RunWayDataBase()
        assert runWaysDatabase.read()
        arrivalRunway = runWaysDatabase.getFilteredRunWays(
            airportICAOcode='LFML', runwayName='')

        print('==================== Compute touch down ==================== ' +
              time.strftime("%c"))

        arrivalGroundRun = GroundRunLeg(runway=arrivalRunway,
                                        aircraft=self.aircraft,
                                        airport=MarseilleMarignane)
        touchDownWayPoint = arrivalGroundRun.computeTouchDownWayPoint()
        self.aircraft.setArrivalRunwayTouchDownWayPoint(touchDownWayPoint)

        print("=========== simulated descent glide slope  =========== " +
              time.strftime("%c"))

        threeDegreesGlideSlope = DescentGlideSlope(
            runway=arrivalRunway,
            aircraft=self.aircraft,
            arrivalAirport=MarseilleMarignane)
        threeDegreesGlideSlope.buildSimulatedGlideSlope(
            descentGlideSlopeSizeNautics=5.0)
        approachWayPoint = threeDegreesGlideSlope.getLastVertex().getWeight()

        self.aircraft.setTargetApproachWayPoint(approachWayPoint)

        print('==================== Great Circle ==================== ' +
              time.strftime("%c"))

        greatCircle = GreatCircleRoute(initialWayPoint=CharlesDeGaulle,
                                       finalWayPoint=approachWayPoint,
                                       aircraft=self.aircraft)

        distanceStillToFlyMeters = CharlesDeGaulle.getDistanceMetersTo(
            approachWayPoint)
        greatCircle.computeGreatCircle(
            deltaTimeSeconds=1.0,
            elapsedTimeSeconds=0.0,
            distanceStillToFlyMeters=distanceStillToFlyMeters,
            distanceToLastFixMeters=distanceStillToFlyMeters)
        print('main great circle length= ' +
              str(greatCircle.computeLengthMeters()) + ' meters')

        greatCircle.createKmlOutputFile()
        greatCircle.createXlsxOutputFile()

    def test_Two(self):

        t0 = time.clock()
        print(" ========== Great Circle ======= time start= ", t0)
        atmosphere = Atmosphere()
        earth = Earth()

        print('==================== Great Circle ==================== ' +
              time.strftime("%c"))
        acBd = BadaAircraftDatabase()
        aircraftICAOcode = 'A320'
        if acBd.read():
            if (acBd.aircraftExists(aircraftICAOcode)
                    and acBd.aircraftPerformanceFileExists(aircraftICAOcode)):
                print(
                    '==================== aircraft found  ==================== '
                    + time.strftime("%c"))
                aircraft = BadaAircraft(
                    ICAOcode=aircraftICAOcode,
                    aircraftFullName=acBd.getAircraftFullName(
                        aircraftICAOcode),
                    badaPerformanceFilePath=acBd.getAircraftPerformanceFile(
                        aircraftICAOcode),
                    atmosphere=atmosphere,
                    earth=earth,
                    windSpeedMetersPerSecond=None,
                    windDirectionDegrees=None)
                print(aircraft)

            print(
                '====================  airport database ==================== '
                + time.strftime("%c"))
            airportsDB = AirportsDatabase()
            assert not (airportsDB is None)

            wayPointsDb = WayPointsDatabase()
            assert (wayPointsDb.read())

            initialWayPoint = wayPointsDb.getWayPoint('TOU')
            finalWayPoint = wayPointsDb.getWayPoint('ALIVA')
            print(initialWayPoint.getBearingDegreesTo(finalWayPoint))
            print(finalWayPoint.getBearingDegreesTo(initialWayPoint))
            ''' departure ground run => initial speed is null '''
            trueAirSpeedMetersSecond = 70.0
            elapsedTimeSeconds = 0.0

            aircraft.setCurrentAltitudeSeaLevelMeters(
                elapsedTimeSeconds=0.0,
                altitudeMeanSeaLevelMeters=0.0,
                lastAltitudeMeanSeaLevelMeters=0.0,
                targetCruiseAltitudeMslMeters=10000.0)

            aircraft.initStateVector(
                elapsedTimeSeconds=0.0,
                trueAirSpeedMetersSecond=70.0,
                airportFieldElevationAboveSeaLevelMeters=152.0)

            aircraft.setTargetCruiseFlightLevel(
                RequestedFlightLevel=310,
                departureAirportAltitudeMSLmeters=152.0)

            print("=========== simulated descent glide slope  =========== " +
                  time.strftime("%c"))
            MarseilleMarignane = airportsDB.getAirportFromICAOCode('LFML')

            print(
                '==================== runways database ==================== ' +
                time.strftime("%c"))
            runWaysDatabase = RunWayDataBase()
            assert runWaysDatabase.read()
            runway = runWaysDatabase.getFilteredRunWays(airportICAOcode='LFML',
                                                        runwayName='')

            arrivalGroundRun = GroundRunLeg(runway=runway,
                                            aircraft=aircraft,
                                            airport=MarseilleMarignane)

            touchDownWayPoint = arrivalGroundRun.computeTouchDownWayPoint()
            aircraft.setArrivalRunwayTouchDownWayPoint(touchDownWayPoint)

            threeDegreesGlideSlope = DescentGlideSlope(
                runway=runway,
                aircraft=aircraft,
                arrivalAirport=MarseilleMarignane)
            threeDegreesGlideSlope.buildSimulatedGlideSlope(
                descentGlideSlopeSizeNautics=5.0)
            approachWayPoint = threeDegreesGlideSlope.getLastVertex(
            ).getWeight()

            aircraft.setTargetApproachWayPoint(approachWayPoint)
            ''' =================================='''
            greatCircle = GreatCircleRoute(initialWayPoint=initialWayPoint,
                                           finalWayPoint=finalWayPoint,
                                           aircraft=aircraft)

            distanceStillToFlyMeters = initialWayPoint.getDistanceMetersTo(
                approachWayPoint)

            greatCircle.computeGreatCircle(
                deltaTimeSeconds=0.1,
                elapsedTimeSeconds=0.0,
                distanceStillToFlyMeters=distanceStillToFlyMeters,
                distanceToLastFixMeters=distanceStillToFlyMeters)

            print('main great circle length= ' +
                  str(greatCircle.computeLengthMeters()) + ' meters')

            greatCircle.createKmlOutputFile()
            greatCircle.createXlsxOutputFile()

    def test_compute_great_circle(self):
        # print(
        #     '==================== departure airport ==================== ' + time.strftime(
        #         "%c"))
        # airportsDB = AirportsDatabase()
        # assert (airportsDB.read())
        #
        # CharlesDeGaulle = airportsDB.getAirportFromICAOCode('LFPG')
        # print(CharlesDeGaulle)
        #
        # print(
        #     '==================== arrival airport ==================== ' + time.strftime(
        #         "%c"))
        #
        # MarseilleMarignane = airportsDB.getAirportFromICAOCode('LFML')
        # print(MarseilleMarignane)

        wayPointsDb = WayPointsDatabase()
        assert (wayPointsDb.read())
        Exona = wayPointsDb.getWayPoint('EXONA')
        Rosal = wayPointsDb.getWayPoint('ROSAL')
        Santa = wayPointsDb.getWayPoint('SANTA')

        print('==================== Great Circle ==================== ' +
              time.strftime("%c"))

        self.aircraft.setCurrentAltitudeSeaLevelMeters(
            elapsedTimeSeconds=0.0,
            altitudeMeanSeaLevelMeters=0.0,
            lastAltitudeMeanSeaLevelMeters=0.0,
            targetCruiseAltitudeMslMeters=10000.0)

        self.aircraft.initStateVector(
            elapsedTimeSeconds=0.0,
            trueAirSpeedMetersSecond=70.0,
            airportFieldElevationAboveSeaLevelMeters=152.0)

        self.aircraft.setTargetCruiseFlightLevel(
            RequestedFlightLevel=310, departureAirportAltitudeMSLmeters=152.0)

        print('==================== runways database ==================== ' +
              time.strftime("%c"))
        # runWaysDatabase = RunWayDataBase()
        # assert runWaysDatabase.read()
        # arrivalRunway = runWaysDatabase.getFilteredRunWays(
        #     airportICAOcode='LFML', runwayName='')

        print('==================== Compute touch down ==================== ' +
              time.strftime("%c"))

        # arrivalGroundRun = GroundRunLeg(runway=arrivalRunway,
        #                                 aircraft=self.aircraft,
        #                                 airport=MarseilleMarignane)
        # touchDownWayPoint = arrivalGroundRun.computeTouchDownWayPoint()
        # self.aircraft.setArrivalRunwayTouchDownWayPoint(touchDownWayPoint)

        print("=========== simulated descent glide slope  =========== " +
              time.strftime("%c"))

        # threeDegreesGlideSlope = DescentGlideSlope(runway=arrivalRunway,
        #                                            aircraft=self.aircraft,
        #                                            arrivalAirport=MarseilleMarignane)
        # threeDegreesGlideSlope.buildSimulatedGlideSlope(
        #     descentGlideSlopeSizeNautics=5.0)
        # approachWayPoint = threeDegreesGlideSlope.getLastVertex().getWeight()
        # self.aircraft.setTargetApproachWayPoint(approachWayPoint)

        print('==================== Great Circle ==================== ' +
              time.strftime("%c"))

        greatCircle = GreatCircleRoute(initialWayPoint=Exona,
                                       finalWayPoint=Rosal,
                                       aircraft=self.aircraft)

        distanceStillToFlyMeters = Exona.getDistanceMetersTo(Rosal)
        greatCircle.computeGreatCircle(
            deltaTimeSeconds=1.0,
            elapsedTimeSeconds=0.0,
            distanceStillToFlyMeters=distanceStillToFlyMeters,
            distanceToLastFixMeters=distanceStillToFlyMeters)

        greatCircle2 = GreatCircleRoute(initialWayPoint=Rosal,
                                        finalWayPoint=Santa,
                                        aircraft=self.aircraft)

        distanceStillToFlyMeters = Rosal.getDistanceMetersTo(Santa)
        greatCircle2.computeGreatCircle(
            deltaTimeSeconds=1.0,
            elapsedTimeSeconds=0.0,
            distanceStillToFlyMeters=distanceStillToFlyMeters,
            distanceToLastFixMeters=distanceStillToFlyMeters)

        greatCircle.addVertex(greatCircle2)
        print('main great circle length= ' +
              str(greatCircle.computeLengthMeters()) + ' meters')

        greatCircle.createKmlOutputFile()
        greatCircle.createXlsxOutputFile()
class TestTurnLegGreatCircleRoute(unittest.TestCase):
    def setUp(self) -> None:
        self.atmosphere = Atmosphere()
        self.earth = Earth()
        self.acBd = BadaAircraftDatabase()
        self.aircraftICAOcode = 'A320'
        self.deltaTimeSeconds = 1.0

        assert self.acBd.read()
        assert self.acBd.aircraftExists(self.aircraftICAOcode)
        assert self.acBd.aircraftPerformanceFileExists(self.aircraftICAOcode)

        self.aircraft = BadaAircraft(
            ICAOcode=self.aircraftICAOcode,
            aircraftFullName=self.acBd.getAircraftFullName(
                self.aircraftICAOcode),
            badaPerformanceFilePath=self.acBd.getAircraftPerformanceFile(
                self.aircraftICAOcode),
            atmosphere=self.atmosphere,
            earth=self.earth,
            windSpeedMetersPerSecond=None,
            windDirectionDegrees=None)

    def test_turn_leg_fly_by_waypoint(self):
        wayPointsDb = WayPointsDatabase()
        assert (wayPointsDb.read())
        # Exona = wayPointsDb.getWayPoint('EXONA')
        # Rosal = wayPointsDb.getWayPoint('ROSAL')
        # Santa = wayPointsDb.getWayPoint('SANTA')

        p1 = wayPointsDb.getWayPoint('LAMSO')
        p2 = wayPointsDb.getWayPoint('EVELI')
        # p2 = wayPointsDb.getWayPoint('BASNO')
        # p3 = wayPointsDb.getWayPoint('PAMPUS')
        # ret = wayPointsDb.insertWayPoint('ENKOS', "N31°40'58.50" + '"', "N31°40'58.50" + '"')
        # ret = wayPointsDb.insertWayPoint('ENKOS', "N52°40'41.26" + '"', "E5°14'35.75" + '"')
        # if wayPointsDb.hasWayPoint('ENKOS'):
        #     self.assertFalse(ret, 'insertion not done')
        #     exit(1)
        # else:
        #     self.assertTrue(ret, 'insertion correct')
        p3 = wayPointsDb.getWayPoint('ENKOS')

        print(p1)
        print(p2)
        print(p3)
        # print(p4)

        self.aircraft.aircraftCurrentConfiguration = 'cruise'

        self.aircraft.initStateVector(
            elapsedTimeSeconds=0.0,
            trueAirSpeedMetersSecond=70.0,
            airportFieldElevationAboveSeaLevelMeters=10000.0)

        self.aircraft.setTargetCruiseFlightLevel(
            RequestedFlightLevel=310, departureAirportAltitudeMSLmeters=0.0)

        greatCircle = GreatCircleRoute(initialWayPoint=p1,
                                       finalWayPoint=p2,
                                       aircraft=self.aircraft)

        distanceStillToFlyMeters = p1.getDistanceMetersTo(p2)
        greatCircle.computeGreatCircle(
            deltaTimeSeconds=self.deltaTimeSeconds,
            elapsedTimeSeconds=p1.getElapsedTimeSeconds(),
            distanceStillToFlyMeters=distanceStillToFlyMeters,
            distanceToLastFixMeters=distanceStillToFlyMeters)
        finalRoute = greatCircle

        initialHeadingDegrees = p1.getBearingDegreesTo(p2)
        turn_leg = TurnLeg(initialWayPoint=p2,
                           finalWayPoint=p3,
                           initialHeadingDegrees=initialHeadingDegrees,
                           aircraft=self.aircraft,
                           reverse=False)

        last_gc_vertex = finalRoute.getLastVertex().getWeight()
        distance_to_fly = last_gc_vertex.getDistanceMetersTo(p3)
        turn_leg.buildTurnLeg(
            deltaTimeSeconds=self.deltaTimeSeconds,
            elapsedTimeSeconds=last_gc_vertex.getElapsedTimeSeconds(),
            distanceStillToFlyMeters=distance_to_fly,
            distanceToLastFixMeters=distance_to_fly)
        finalRoute.addGraph(turn_leg)

        last_turn_leg_vertex = turn_leg.getLastVertex().getWeight()
        # last_turn_leg_vertex = p2
        greatCircle2 = GreatCircleRoute(initialWayPoint=last_turn_leg_vertex,
                                        finalWayPoint=p3,
                                        aircraft=self.aircraft)
        distanceStillToFlyMeters = last_turn_leg_vertex.getDistanceMetersTo(p3)
        greatCircle2.computeGreatCircle(
            deltaTimeSeconds=self.deltaTimeSeconds,
            elapsedTimeSeconds=last_turn_leg_vertex.getElapsedTimeSeconds(),
            distanceStillToFlyMeters=distanceStillToFlyMeters,
            distanceToLastFixMeters=distanceStillToFlyMeters)
        finalRoute.addGraph(greatCircle2)

        finalRoute.createKmlOutputFile()
        finalRoute.createXlsxOutputFile()
        self.aircraft.createStateVectorOutputFile(
            filePrefix='turn-leg-great-circle')
        print ( '--------------- tas= {0:.2f} knots ----------------------'.format(tasKnots) )
        aircraft = BadaAircraft(aircraftIcaoCode, 
                                      acBd.getAircraftPerformanceFile(aircraftIcaoCode),
                                      atmosphere,
                                      earth)
        aircraft.dump()
    
        takeOffMassKilograms = 64000.0
        aircraft.setAircraftMassKilograms(takeOffMassKilograms)
            
        RequestedFlightLevel = 310.0
        fieldElevationAboveSeaLevelMeters = 150.0
        aircraft.setTargetCruiseFlightLevel(RequestedFlightLevel, fieldElevationAboveSeaLevelMeters)
        tasMetersPerSecond = tasKnots * Knots2MetersPerSecond
        aircraft.initStateVector(elapsedTimeSeconds = 0.0, 
                                     trueAirSpeedMetersSecond = tasMetersPerSecond, 
                                     altitudeMeanSeaLevelMeters = 3000.0 * Meter2Feet, 
                                     deltaDistanceFlownMeters = 0.0)
        aircraft.setCruiseConfiguration(elapsedTimeSeconds = 0.0)
            
        turnLeg =  TurnLeg(  initialWayPoint  = departureAirport,
                                finalWayPoint    = arrivalAirport,
                                initialHeadingDegrees = 215.0,
                                finalHeadingDegrees = 180.0,
                                aircraft = aircraft,
                                reverse = False)
        
        distanceStillToFlyMeters = 700000.0
        turnLeg.buildTurnLeg(elapsedTimeSeconds = 0.0, distanceStillToFlyMeters = distanceStillToFlyMeters)
        turnLeg.createKmlOutputFile()
        turnLeg.createXlsxOutputFile()