def calculateMovement(coreFunctions, parameters, weather, state, instruction): # (coreFunctions:SimulationCoreFunctions) # (parameters:FlightParameters) # (weather:WeatherState) (state:FlightState) (instruction:Instruction) time = parameters.ActualGateDepartureTime + state.TimeElapsed*1.0 # <Time/Hours> currentPosition = state.AircraftPosition altitude = Spatial.positionToAltitude(currentPosition) grossWeight = coreFunctions.WeightModel(parameters, state) (destination, instructedAirSpeed) = instruction currentLocation = Spatial.positionToLocation(currentPosition) destinationLocation = Spatial.positionToLocation(destination) destinationAltitude = coreFunctions.AltitudeLimiter(grossWeight, Spatial.positionToAltitude(destination)) airSpeed = coreFunctions.AirSpeedLimiter( parameters.AircraftType.MaximumMachSpeed, grossWeight, altitude, instructedAirSpeed) deltaVector = Spatial.calculateLocationDifference(currentLocation, destinationLocation) distance = Spatial.calculateDistance1(currentLocation, destinationLocation) if distance <= 0.0 : zeroGroundSpeed = Spatial.Vector(0.0, 0.0) return (0.0, zeroGroundSpeed, 0.0, 0.0, 0.0, []) else: #windVector = getWindVelocity(weather, time, currentPosition) windVector = Weather.zeroWindVelocity groundSpeed = Movement.calculateGroundVelocity(airSpeed, Spatial.calculateRadians(deltaVector), windVector) groundVector = Movement.rescale(deltaVector, groundSpeed) (cruiseBurn, verticalCruiseFuelDiff, verticalVelocity) = \ coreFunctions.FuelModel(FuelModel.flightFunctions, grossWeight, altitude, airSpeed, FlightTypes.getVerticalState(altitude, destinationAltitude)) return (cruiseBurn, groundVector, verticalCruiseFuelDiff, verticalVelocity, airSpeed, [])
def stepToWaypoint(coreFunctions, timeStep, arrivalRadius, parameters, weather, airspace, state, instruction): #(coreFunctions:SimulationCoreFunctions) (timeStep:float<Hours>) (arrivalRadius:float<NauticalMiles>) #(parameters:FlightParameters) (weather:WeatherState) (airspace:Airspace) (state:FlightState) (instruction:Instruction) = (currentX, currentY, currentZ) = state.AircraftPosition (destinationX, destinationY, destinationZRaw) = instruction.Waypoint grossWeight = coreFunctions.WeightModel(parameters, state) destinationZ = coreFunctions.AltitudeLimiter(grossWeight, destinationZRaw) distanceRemaining = Spatial.calculateDistance1( Spatial.Location(currentX, currentY), Spatial.Location(destinationX, destinationY)) (cruiseBurn, groundVector, verticalCruiseFuelDiff, VerticalVelocity, airSpeed, messages) = \ calculateMovement(coreFunctions, parameters, weather, state, instruction) # assertNonNegative "cruiseBurn" cruiseBurn groundSpeed = Movement.calculateSpeed(groundVector) distanceTravelled = groundSpeed * timeStep reachedDestination = distanceRemaining <= (distanceTravelled + arrivalRadius) # print 'distanceRemaing: ' + str(distanceRemaining) + 'distanceTravelled: ' + str(distanceTravelled + arrivalRadius) (groundSpeedX, groundSpeedY) = groundVector (groundX, groundY) = (float(groundSpeedX * timeStep), float(groundSpeedY * timeStep)) elapsedRatio = 0.0 if distanceTravelled > 0.0: elapsedRatio = min(distanceRemaining, distanceTravelled) / distanceTravelled timeElapsed = elapsedRatio * timeStep climbTimeElapsed = 0.0 if math.fabs(VerticalVelocity) > 0.0: climbTimeElapsed = \ min(1.0, ((destinationZ - currentZ)/(VerticalVelocity * timeElapsed)) * timeElapsed) newPosition = Spatial.Position( currentX + groundX * elapsedRatio, currentY + groundY * elapsedRatio, currentZ + VerticalVelocity * climbTimeElapsed) totalFuelBurn = cruiseBurn * timeElapsed + verticalCruiseFuelDiff * climbTimeElapsed # print 'totalFuelBurn:' + str(totalFuelBurn) + 'curise:' + str(cruiseBurn * timeElapsed) + \ # 'verticalBurn:' + str(verticalCruiseFuelDiff * climbTimeElapsed) intersectedAirspace = Airspace.aircraftInAirspace(airspace, state.AircraftPosition, newPosition) timeInTurbulence = 0.0 if intersectedAirspace.TurbulentZone: timeInTurbulence = timeElapsed # Aircraft's new state return (reachedDestination, FlightTypes.FlightState(AircraftPosition=newPosition, AirSpeed=airSpeed, GroundSpeed=groundSpeed, TimeElapsed=timeElapsed, FuelConsumed=totalFuelBurn, IntersectedAirspace=intersectedAirspace, TimeElapsedInTurbulence=timeInTurbulence, Messages=[]))
def stepToWaypoint(coreFunctions, timeStep, arrivalRadius, parameters, weather, airspace, state, instruction): #(coreFunctions:SimulationCoreFunctions) (timeStep:float<Hours>) (arrivalRadius:float<NauticalMiles>) #(parameters:FlightParameters) (weather:WeatherState) (airspace:Airspace) (state:FlightState) (instruction:Instruction) = (currentX, currentY, currentZ) = state.AircraftPosition (destinationX, destinationY, destinationZRaw) = instruction.Waypoint grossWeight = coreFunctions.WeightModel(parameters, state) destinationZ = coreFunctions.AltitudeLimiter(grossWeight, destinationZRaw) distanceRemaining = Spatial.calculateDistance1(Spatial.Location(currentX, currentY), Spatial.Location(destinationX, destinationY)) (cruiseBurn, groundVector, verticalCruiseFuelDiff, VerticalVelocity, airSpeed, messages) = \ calculateMovement(coreFunctions, parameters, weather, state, instruction) # assertNonNegative "cruiseBurn" cruiseBurn groundSpeed = Movement.calculateSpeed(groundVector) distanceTravelled = groundSpeed * timeStep reachedDestination = distanceRemaining <= (distanceTravelled + arrivalRadius) # print 'distanceRemaing: ' + str(distanceRemaining) + 'distanceTravelled: ' + str(distanceTravelled + arrivalRadius) (groundSpeedX, groundSpeedY) = groundVector (groundX, groundY) = (float (groundSpeedX * timeStep), float (groundSpeedY * timeStep)) elapsedRatio = 0.0 if distanceTravelled > 0.0: elapsedRatio = min(distanceRemaining, distanceTravelled)/distanceTravelled timeElapsed = elapsedRatio * timeStep climbTimeElapsed = 0.0 if math.fabs(VerticalVelocity) > 0.0: climbTimeElapsed = \ min(1.0, ((destinationZ - currentZ)/(VerticalVelocity * timeElapsed)) * timeElapsed) newPosition = Spatial.Position(currentX+groundX*elapsedRatio, currentY+groundY*elapsedRatio, currentZ + VerticalVelocity*climbTimeElapsed) totalFuelBurn = cruiseBurn * timeElapsed + verticalCruiseFuelDiff * climbTimeElapsed # print 'totalFuelBurn:' + str(totalFuelBurn) + 'curise:' + str(cruiseBurn * timeElapsed) + \ # 'verticalBurn:' + str(verticalCruiseFuelDiff * climbTimeElapsed) intersectedAirspace = Airspace.aircraftInAirspace(airspace, state.AircraftPosition, newPosition) timeInTurbulence = 0.0 if intersectedAirspace.TurbulentZone: timeInTurbulence = timeElapsed # Aircraft's new state return (reachedDestination, FlightTypes.FlightState( AircraftPosition=newPosition, AirSpeed = airSpeed, GroundSpeed = groundSpeed, TimeElapsed = timeElapsed, FuelConsumed = totalFuelBurn, IntersectedAirspace = intersectedAirspace, TimeElapsedInTurbulence = timeInTurbulence, Messages = []))
def calculateMovement(coreFunctions, parameters, weather, state, instruction): # (coreFunctions:SimulationCoreFunctions) # (parameters:FlightParameters) # (weather:WeatherState) (state:FlightState) (instruction:Instruction) time = parameters.ActualGateDepartureTime + state.TimeElapsed * 1.0 # <Time/Hours> currentPosition = state.AircraftPosition altitude = Spatial.positionToAltitude(currentPosition) grossWeight = coreFunctions.WeightModel(parameters, state) (destination, instructedAirSpeed) = instruction currentLocation = Spatial.positionToLocation(currentPosition) destinationLocation = Spatial.positionToLocation(destination) destinationAltitude = coreFunctions.AltitudeLimiter( grossWeight, Spatial.positionToAltitude(destination)) airSpeed = coreFunctions.AirSpeedLimiter( parameters.AircraftType.MaximumMachSpeed, grossWeight, altitude, instructedAirSpeed) deltaVector = Spatial.calculateLocationDifference(currentLocation, destinationLocation) distance = Spatial.calculateDistance1(currentLocation, destinationLocation) if distance <= 0.0: zeroGroundSpeed = Spatial.Vector(0.0, 0.0) return (0.0, zeroGroundSpeed, 0.0, 0.0, 0.0, []) else: #windVector = getWindVelocity(weather, time, currentPosition) windVector = Weather.zeroWindVelocity groundSpeed = Movement.calculateGroundVelocity( airSpeed, Spatial.calculateRadians(deltaVector), windVector) groundVector = Movement.rescale(deltaVector, groundSpeed) (cruiseBurn, verticalCruiseFuelDiff, verticalVelocity) = \ coreFunctions.FuelModel(FuelModel.flightFunctions, grossWeight, altitude, airSpeed, FlightTypes.getVerticalState(altitude, destinationAltitude)) return (cruiseBurn, groundVector, verticalCruiseFuelDiff, verticalVelocity, airSpeed, [])