public GenData(AeroPredictor vessel, Conditions conditions, float speed, CalculationManager manager) { this.vessel = vessel; this.conditions = conditions; this.speed = speed; this.storeState = manager.GetStateToken(); }
public GenData(AeroPredictor vessel, Conditions conditions, float speed, float altitude, CalculationManager manager, float AoA_guess = float.NaN, float maxA_guess = float.NaN, float pitchI_guess = float.NaN) { this.vessel = vessel; this.conditions = conditions; this.speed = speed; this.altitude = altitude; this.storeState = manager.GetStateToken(); this.AoA_guess = AoA_guess; this.maxA_guess = maxA_guess; this.pitchI_guess = pitchI_guess; }
public LineGenData(CalculationManager manager, AeroPredictor vessel, Conditions conditions, float exitSpeed, float exitAlt, float initialSpeed, float initialAlt, CostIncreaseFunction costIncreaseFunc, Predicate <float> neighborPredicate, float[,] predicateData, CostIncreaseFunction timeDifferenceFunc) { this.state = manager.GetStateToken(); this.vessel = vessel; this.conditions = conditions; this.exitSpeed = exitSpeed; this.exitAlt = exitAlt; this.initialSpeed = initialSpeed; this.initialAlt = initialAlt; this.costIncreaseFunc = costIncreaseFunc; this.timeDifferenceFunc = timeDifferenceFunc; this.neighborPredicate = neighborPredicate; this.predicateData = predicateData; }
private static void GenerateLevel(Conditions conditions, CalculationManager manager, ref CalculationManager.State[,] results, AeroPredictor vessel, Conditions basisConditions = new Conditions(), EnvelopePoint[,] resultPoints = null) { float[,] AoAs_guess = null, maxAs_guess = null, pitchIs_guess = null; if (resultPoints != null) { AoAs_guess = resultPoints.SelectToArray(pt => pt.AoA_level); maxAs_guess = resultPoints.SelectToArray(pt => pt.AoA_max); pitchIs_guess = resultPoints.SelectToArray(pt => pt.pitchInput); } else if (results != null) { AoAs_guess = results.SelectToArray(pt => ((EnvelopePoint)pt.Result).AoA_level); maxAs_guess = results.SelectToArray(pt => ((EnvelopePoint)pt.Result).AoA_max); pitchIs_guess = results.SelectToArray(pt => ((EnvelopePoint)pt.Result).pitchInput); resultPoints = results.SelectToArray(pt => (EnvelopePoint)pt.Result); } int numPtsX = (int)Math.Ceiling((conditions.upperBoundSpeed - conditions.lowerBoundSpeed) / conditions.stepSpeed); int numPtsY = (int)Math.Ceiling((conditions.upperBoundAltitude - conditions.lowerBoundAltitude) / conditions.stepAltitude); float trueStepX = (conditions.upperBoundSpeed - conditions.lowerBoundSpeed) / numPtsX; float trueStepY = (conditions.upperBoundAltitude - conditions.lowerBoundAltitude) / numPtsY; results = new CalculationManager.State[numPtsX + 1, numPtsY + 1]; for (int j = 0; j <= numPtsY; j++) { for (int i = 0; i <= numPtsX; i++) { if (manager.Cancelled) { return; } float x = (float)i / numPtsX; float y = (float)j / numPtsY; float aoa_guess = AoAs_guess != null?AoAs_guess.Lerp2(x, y) : float.NaN; float maxA_guess = maxAs_guess != null?maxAs_guess.Lerp2(x, y) : float.NaN; float pi_guess = pitchIs_guess != null?pitchIs_guess.Lerp2(x, y) : float.NaN; float speed = conditions.lowerBoundSpeed + trueStepX * i; float altitude = conditions.lowerBoundAltitude + trueStepY * j; GenData genData = new GenData(vessel, conditions, speed, altitude, manager, aoa_guess, maxA_guess, pi_guess); results[i, j] = genData.storeState; if (!basisConditions.Equals(Conditions.Blank) && !basisConditions.Equals(new Conditions()) && basisConditions.Contains(speed, altitude, out int ii, out int jj)) { results[i, j].StoreResult(resultPoints[ii, jj]); }
private IEnumerator RefinementProcessing(CalculationManager manager, Conditions conditions, AeroPredictor vessel, EnvelopePoint[,] basisData, Conditions basisConditions = new Conditions(), Queue <Conditions> followOnConditions = null, bool forcePushToGraph = false) { int numPtsX = (int)Math.Ceiling((conditions.upperBoundSpeed - conditions.lowerBoundSpeed) / conditions.stepSpeed); int numPtsY = (int)Math.Ceiling((conditions.upperBoundAltitude - conditions.lowerBoundAltitude) / conditions.stepAltitude); EnvelopePoint[,] newEnvelopePoints = new EnvelopePoint[numPtsX + 1, numPtsY + 1]; CalculationManager backgroundManager = new CalculationManager(); manager.OnCancelCallback += backgroundManager.Cancel; CalculationManager.State[,] results = new CalculationManager.State[numPtsX + 1, numPtsY + 1]; GenData rootData = new GenData(vessel, conditions, 0, 0, backgroundManager); ThreadPool.QueueUserWorkItem(ContinueInBackground, new object[] { rootData, results, basisData, basisConditions }); while (!backgroundManager.Completed) { if (manager.Status == CalculationManager.RunStatus.Cancelled) { backgroundManager.Cancel(); yield break; } yield return(0); } manager.OnCancelCallback -= backgroundManager.Cancel; newEnvelopePoints = ((CalculationManager.State[, ])rootData.storeState.Result) .SelectToArray(pt => (EnvelopePoint)pt.Result); AddToCache(conditions, newEnvelopePoints); if (currentConditions.Equals(conditions) || (forcePushToGraph && !backgroundManager.Cancelled)) { envelopePoints = newEnvelopePoints; currentConditions = conditions; UpdateGraphs(); valuesSet = true; } backgroundManager.Dispose(); if (!manager.Cancelled && followOnConditions != null && followOnConditions.Count > 0) { yield return(0); Conditions nextConditions = followOnConditions.Dequeue(); WindTunnel.Instance.StartCoroutine(RefinementProcessing(manager, nextConditions, vessel, newEnvelopePoints, conditions, followOnConditions, forcePushToGraph)); } }
private IEnumerator Processing(CalculationManager manager, Conditions conditions, AeroPredictor vessel) { int numPts = (int)Math.Ceiling((conditions.upperBound - conditions.lowerBound) / conditions.step); AoAPoint[] newAoAPoints = new AoAPoint[numPts + 1]; float trueStep = (conditions.upperBound - conditions.lowerBound) / numPts; CalculationManager.State[] results = new CalculationManager.State[numPts + 1]; for (int i = 0; i <= numPts; i++) { //newAoAPoints[i] = new AoAPoint(vessel, conditions.body, conditions.altitude, conditions.speed, conditions.lowerBound + trueStep * i); GenData genData = new GenData(vessel, conditions, conditions.lowerBound + trueStep * i, manager); results[i] = genData.storeState; ThreadPool.QueueUserWorkItem(GenerateAoAPoint, genData); } while (!manager.Completed) { if (manager.Status == CalculationManager.RunStatus.Cancelled) { yield break; } yield return(0); } for (int i = 0; i <= numPts; i++) { newAoAPoints[i] = (AoAPoint)results[i].Result; } if (!manager.Cancelled) { cache.Add(conditions, newAoAPoints); AoAPoints = newAoAPoints; AverageLiftSlope = AoAPoints.Select(pt => pt.dLift / pt.dynamicPressure).Where(v => !float.IsNaN(v) && !float.IsInfinity(v)).Average(); currentConditions = conditions; UpdateGraphs(); valuesSet = true; } }
private IEnumerator Processing(CalculationManager manager, Conditions conditions, AeroPredictor vessel) { int numPts = (int)Math.Ceiling((conditions.upperBound - conditions.lowerBound) / conditions.step); VelPoint[] newVelPoints = new VelPoint[numPts + 1]; float trueStep = (conditions.upperBound - conditions.lowerBound) / numPts; CalculationManager.State[] results = new CalculationManager.State[numPts + 1]; for (int i = 0; i <= numPts; i++) { //newAoAPoints[i] = new AoAPoint(vessel, conditions.body, conditions.altitude, conditions.speed, conditions.lowerBound + trueStep * i); GenData genData = new GenData(vessel, conditions, conditions.lowerBound + trueStep * i, manager); results[i] = genData.storeState; ThreadPool.QueueUserWorkItem(GenerateVelPoint, genData); } while (!manager.Completed) { if (manager.Status == CalculationManager.RunStatus.Cancelled) { yield break; } yield return(0); } for (int i = 0; i <= numPts; i++) { newVelPoints[i] = (VelPoint)results[i].Result; } if (!manager.Cancelled) { cache.Add(conditions, newVelPoints); VelPoints = newVelPoints; currentConditions = conditions; GenerateGraphs(); valuesSet = true; } }
private static void GenerateLevel(Conditions conditions, CalculationManager manager, ref CalculationManager.State[,] results, AeroPredictor vessel) { float[,] AoAs_guess = null, maxAs_guess = null, pitchIs_guess = null; if (results != null) { AoAs_guess = results.SelectToArray(pt => ((EnvelopePoint)pt.Result).AoA_level); maxAs_guess = results.SelectToArray(pt => ((EnvelopePoint)pt.Result).AoA_max); pitchIs_guess = results.SelectToArray(pt => ((EnvelopePoint)pt.Result).pitchInput); } int numPtsX = (int)Math.Ceiling((conditions.upperBoundSpeed - conditions.lowerBoundSpeed) / conditions.stepSpeed); int numPtsY = (int)Math.Ceiling((conditions.upperBoundAltitude - conditions.lowerBoundAltitude) / conditions.stepAltitude); float trueStepX = (conditions.upperBoundSpeed - conditions.lowerBoundSpeed) / numPtsX; float trueStepY = (conditions.upperBoundAltitude - conditions.lowerBoundAltitude) / numPtsY; results = new CalculationManager.State[numPtsX + 1, numPtsY + 1]; for (int j = 0; j <= numPtsY; j++) { for (int i = 0; i <= numPtsX; i++) { if (manager.Cancelled) { return; } float x = (float)i / numPtsX; float y = (float)j / numPtsY; float aoa_guess = AoAs_guess != null?AoAs_guess.Lerp2(x, y) : float.NaN; float maxA_guess = maxAs_guess != null?maxAs_guess.Lerp2(x, y) : float.NaN; float pi_guess = pitchIs_guess != null?pitchIs_guess.Lerp2(x, y) : float.NaN; GenData genData = new GenData(vessel, conditions, conditions.lowerBoundSpeed + trueStepX * i, conditions.lowerBoundAltitude + trueStepY * j, manager, aoa_guess, maxA_guess, pi_guess); results[i, j] = genData.storeState; ThreadPool.QueueUserWorkItem(GenerateSurfPoint, genData); } } }