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 calculateGroundVelocity(airspeed, groundDirection, wind): windDirection = Spatial.calculateRadians(wind) windspeed = Spatial.calculateMagnitude(wind) aDirection = (windDirection - groundDirection) % ( 2 * math.pi) precision = 1e-6 # no wind, groundspeed is airspeed if windspeed <= precision: return airspeed elif math.fAbs(aDirection) <= precision: # then // Same direction return airspeed + windspeed elif math.fabs(aDirection - math.pi) <= precision: # then // Opposite direction return airspeed - windspeed else: w = math.asin((windspeed * math.sin(aDirection)) / airspeed) g = math.pi - aDirection - w return airspeed * math.sin(g) / math.sin(aDirection)
def calculateGroundVelocity(airspeed, groundDirection, wind): windDirection = Spatial.calculateRadians(wind) windspeed = Spatial.calculateMagnitude(wind) aDirection = (windDirection - groundDirection) % (2 * math.pi) precision = 1e-6 # no wind, groundspeed is airspeed if windspeed <= precision: return airspeed elif math.fAbs(aDirection) <= precision: # then // Same direction return airspeed + windspeed elif math.fabs(aDirection - math.pi) <= precision: # then // Opposite direction return airspeed - windspeed else: w = math.asin((windspeed * math.sin(aDirection)) / airspeed) g = math.pi - aDirection - w return airspeed * math.sin(g) / math.sin(aDirection)
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, [])