public void SynthesizeAirfoil(Airfoil.AirfoilManager[] airfoils, Double[] coefficients)
        {
            // Format Check
            var length = airfoils.Length;

            if (length != coefficients.Length)
            {
                throw new FormatException("Number of basis airfoils and coefficients did not match.");
            }


            Double[,] newCoordinate = new Double[length, 2];
            for (int i = 0; i < length; i++)
            {
                var basis = airfoils[i].ResizedCoordinate;

                newCoordinate[i, 0] += basis[i].X;
                newCoordinate[i, 1] += coefficients[i] * basis[i].Z;
            }
            var sAirfoil = new Airfoil.AirfoilCoordinate();

            sAirfoil.Import(newCoordinate);

            SynthesizedAirfoil = new Airfoil.AirfoilManager(sAirfoil);
        }
        private DataTable CreateTable(Airfoil.AirfoilManager airfoil)
        {
            var specifications = new System.Data.DataTable();

            specifications.Columns.Add();
            specifications.Columns.Add();

            specifications.Rows.Add("Airfoil Name", airfoil.AirfoilName);
            specifications.Rows.Add("Chord Length", airfoil.ChordLength);
            specifications.Rows.Add("Max Thickness", airfoil.MaximumThickness);
            specifications.Rows.Add("Max Camber", airfoil.MaximumCamber);
            specifications.Rows.Add("L.E. Radius", airfoil.LeadingEdgeRadius);

            return(specifications);
        }
        private static void InitializeTestVariables(out Airfoil.CoefficientOfCombination coefficients, out General.BasisAirfoils basisAirfoils)
        {
            StreamReader sr1 = new StreamReader(@"DAE-11.csv");
            StreamReader sr2 = new StreamReader(@"NACA4412.csv");

            var dae  = General.CsvManager.ConvertCsvToArray(sr1.ReadToEnd());
            var naca = General.CsvManager.ConvertCsvToArray(sr2.ReadToEnd());

            var daeCoordinate  = new Airfoil.AirfoilCoordinate();
            var nacaCoordinate = new Airfoil.AirfoilCoordinate();

            daeCoordinate.Import(dae);
            nacaCoordinate.Import(naca);

            var DAE11    = new Airfoil.AirfoilManager(daeCoordinate);
            var NACA4412 = new Airfoil.AirfoilManager(daeCoordinate);

            var coef = new double[][] { new[] { 0.7, 0.3, 0.6 }, new[] { 0.3, 0.7, 0.4 } };

            coefficients  = new Airfoil.CoefficientOfCombination(General.ArrayManager.ConvertJuggedArrayToArray(coef));
            basisAirfoils = new General.BasisAirfoils(new[] { DAE11, NACA4412 });
        }
        // DelegateCommand Action ==========================================================================
        private void AirfoilSelectionMethod()
        {
            Models.AirfoilCsvAnalyzer airfoilCsvAnalyzer = Models.AirfoilCsvAnalyzer.GetInstance();
            String _airfoil_path;

            // Issue the Messenger displaying OpenFileDialog
            _airfoil_path = General.Messenger.OpenFileMessenger.Show("CSV File (*.csv)|*.csv");

            if (_airfoil_path == null)
            {
                return;
            }

            // Analyze the CSV file located in _airfoil_path
            var result = airfoilCsvAnalyzer.Analyze(_airfoil_path);

            // Get Airfoil's name from csv file name.
            var newAirfoil = new Airfoil.AirfoilManager(result);

            newAirfoil.AirfoilName = Path.GetFileName(_airfoil_path).Replace(".csv", "");

            // Registrate imported Airfoil to the AirfoilGroupManager.
            ImportedAirfoil.Add(newAirfoil);
        }
        /// <summary>
        /// Execute the crossover with UNDX
        /// </summary>
        /// <param name="parents">Individuals of previous generation</param>
        /// <returns>If all crossovers are succesful, offsprings are returned, otherwise null is returned.</returns>
        public double[][] ExecuteCrossover(IndividualsGroup parents)
        {
            Airfoil.CombinedAirfoilsGroupManager          offsptingAirfoils     = new Airfoil.CombinedAirfoilsGroupManager(nCrossover);
            Airfoil.AirfoilManager[]                      selectedParents       = new Airfoil.AirfoilManager[2];
            General.RandomNumber.RandomNumberGenerator    randomNumberGenerator = new General.RandomNumber.RandomNumberGenerator();
            General.Statistics.SamplingWithoutReplacement sampling = new General.Statistics.SamplingWithoutReplacement();

            // Random Airfoil Selection
            uint[] pIndex = sampling.GetIndex(3, (uint)parents.NumberOfIndividuals);
            ParentsIndex[0] = (int)pIndex[0];
            ParentsIndex[1] = (int)pIndex[1];

            // Create Optimization Parameter Vector

            General.Vector p1 = new General.Vector(nParams);
            General.Vector p2 = new General.Vector(nParams);
            General.Vector p3 = new General.Vector(nParams);

            for (int i = 0; i < nParams; i++)
            {
                p1[i] = parents.IndivisualsGroup[(int)pIndex[0]].OptParameters[i];
                p2[i] = parents.IndivisualsGroup[(int)pIndex[1]].OptParameters[i];
                p3[i] = parents.IndivisualsGroup[(int)pIndex[2]].OptParameters[i];
            }
            // If same parameter vector are selected, return null to retry selection.
            if (p1.Equals(p2) && p1.Equals(p3))
            {
                return(null);
            }

            int n = parents.NumberOfIndividuals;

            double d1     = (p2 - p1).Norm();
            double d2     = (General.Vector.InnerProduct(p3 - p1, p2 - p1) / Math.Pow((p2 - p1).Norm(), 2) * (p2 - p1) - p3).Norm();
            double sigma1 = alpha * d1;
            double sigma2 = beta * d2 / Math.Sqrt(n);

            General.Vector m = (1.0 / 2.0) * (p1 + p2);

            // Create new parameter vector for offsprings
            General.Vector[] offspringParameter      = new General.Vector[nCrossover];
            double[][]       offspringParameterArray = new double[nCrossover][];

            // Create Offspring's parameter vector
            for (int i = 0; i < nCrossover; i++)
            {
                var StdOffspringPts = randomNumberGenerator.NormDistRandNumSeq(nParams);
                offspringParameter[i] = new General.Vector(StdOffspringPts);

                var e1        = 1 / (p2 - p1).Norm() * (p2 - p1);
                var pAxisComp = General.Vector.InnerProduct(offspringParameter[i], e1);

                offspringParameter[i] -= pAxisComp * e1;
                offspringParameter[i]  = sigma2 * offspringParameter[i];
                offspringParameter[i] += sigma1 * pAxisComp * e1;
                offspringParameter[i]  = offspringParameter[i] + m;

                offspringParameterArray[i] = offspringParameter[i].ToDoubleArray();
            }
            return(offspringParameterArray);
        }
Example #6
0
 public static AirfoilSelectorViewModel Create(Airfoil.AirfoilManager airfoil, Dictionary <Airfoil.AirfoilManager, String> airfoilsMap)
 {
     return(new AirfoilSelectorViewModel(airfoil, airfoilsMap[airfoil]));
 }
Example #7
0
 public AirfoilSelectorViewModel(Airfoil.AirfoilManager airfoil, String label)
 {
     this.SelectedAirfoil = airfoil;
     this.Label           = label;
 }
Example #8
0
 public FitnessCalculator(Airfoil.AirfoilManager airfoil, FitnessMode fitnessMode)
 {
     this.airfoil     = airfoil;
     this.fitnessMode = fitnessMode;
 }
Example #9
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="airfoil">Added Airfoil</param>
 public AirfoilRemovedEventArgs(Airfoil.AirfoilManager airfoil, String label)
 {
     this.Lable     = label;
     RemovedAirfoil = airfoil;
 }
Example #10
0
 /// <summary>
 ///
 /// </summary>
 /// <param name="airfoil">Added Airfoil</param>
 public AirfoilAddedEventArgs(Airfoil.AirfoilManager airfoil)
 {
     AddedAirfoil = airfoil;
 }
Example #11
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="airfoil">Previewing Airfoil</param>
        /// <param name="height">Preview Window Height</param>
        /// <param name="width">Preview Window Width</param>
        /// <returns></returns>
        public static System.Collections.ObjectModel.ObservableCollection <System.Windows.Point> GetPreviewPointList(Airfoil.AirfoilManager airfoil, double height, double width)
        {
            System.Collections.ObjectModel.ObservableCollection <System.Windows.Point> pointList = new System.Collections.ObjectModel.ObservableCollection <System.Windows.Point>();
            var airfoilCoordinates = airfoil.InterpolatedCoordinate;

            double airfoilLength = Airfoil.AirfoilCoordinate.GetMaximumValue(airfoilCoordinates, 0) - Airfoil.AirfoilCoordinate.GetMinimumValue(airfoilCoordinates, 0);
            double airfoilHeight = Airfoil.AirfoilCoordinate.GetMaximumValue(airfoilCoordinates, 1) - Airfoil.AirfoilCoordinate.GetMinimumValue(airfoilCoordinates, 1);

            double magnification = 0.8 * (double)width / (double)airfoilLength;

            // Adjustment variable
            double adjustX = (width - airfoilLength * magnification) / 2 - Airfoil.AirfoilCoordinate.GetMinimumValue(airfoilCoordinates, 0);
            double adjustZ = (height - airfoilHeight * magnification) / 2 + Airfoil.AirfoilCoordinate.GetMaximumValue(airfoilCoordinates, 1) * magnification;

            // Adjust Airfoil Coordinates to Fit Preview Window
            var adjustedCoordinate = Airfoil.AirfoilCoordinate.Scaling(airfoilCoordinates, magnification);
            var temp = new Double[adjustedCoordinate.Length, 2];

            for (int i = 0; i < adjustedCoordinate.Length; i++)
            {
                temp[i, 0] = adjustX + adjustedCoordinate[i].X;
                temp[i, 1] = adjustZ - adjustedCoordinate[i].Z;
            }
            adjustedCoordinate.Import(temp);

            // Convert adjustCoordinate to ObservableCollection
            for (int i = 0; i < adjustedCoordinate.Length; i++)
            {
                pointList.Add(new System.Windows.Point()
                {
                    X = adjustedCoordinate[i].X, Y = adjustedCoordinate[i].Z
                });
            }

            return(pointList);
        }