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(Conditions conditions) { int numPts = (int)Math.Ceiling((conditions.upperBound - conditions.lowerBound) / conditions.step); primaryProgress = new AoAPoint[numPts + 1]; float trueStep = (conditions.upperBound - conditions.lowerBound) / numPts; CancellationTokenSource closureCancellationTokenSource = this.cancellationTokenSource; stopwatch.Reset(); stopwatch.Start(); task = Task.Factory.StartNew <AoAPoint[]>( () => { try { //OrderablePartitioner<EnvelopePoint> partitioner = Partitioner.Create(primaryProgress, true); Parallel.For <AeroPredictor>(0, primaryProgress.Length, new ParallelOptions() { CancellationToken = closureCancellationTokenSource.Token }, WindTunnelWindow.Instance.GetAeroPredictor, (index, state, predictor) => { primaryProgress[index] = new AoAPoint(predictor, conditions.body, conditions.altitude, conditions.speed, conditions.lowerBound + trueStep * index); return(predictor); }, (predictor) => (predictor as VesselCache.IReleasable)?.Release()); closureCancellationTokenSource.Token.ThrowIfCancellationRequested(); return(cache[conditions] = primaryProgress); } catch (AggregateException aggregateException) { foreach (var ex in aggregateException.Flatten().InnerExceptions) { Debug.LogException(ex); } throw aggregateException; } }, closureCancellationTokenSource.Token); while (task.Status < TaskStatus.RanToCompletion) { //Debug.Log(manager.PercentComplete + "% done calculating..."); yield return(0); } if (task.Status > TaskStatus.RanToCompletion) { if (task.Status == TaskStatus.Faulted) { Debug.LogError("Wind tunnel task faulted (AoA)"); Debug.LogException(task.Exception); } else if (task.Status == TaskStatus.Canceled) { Debug.Log("Wind tunnel task was canceled. (AoA)"); } yield break; } if (!closureCancellationTokenSource.IsCancellationRequested) { AoAPoints = primaryProgress; currentConditions = conditions; UpdateGraphs(); valuesSet = true; } }