Esempio n. 1
0
 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;
 }
Esempio n. 3
0
 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));
            }
        }
Esempio n. 6
0
        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;
            }
        }
Esempio n. 7
0
        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);
                }
            }
        }