Example #1
0
        public static void AddRXMCStep(this Matrix matrix, double jb, NucleationModuleType nucleationType, NucleationArea nucleationArea, int nucleationSize, int currentStep)
        {
            switch (nucleationType)
            {
            case NucleationModuleType.Constant:
            {
                matrix.AddRecrystalisedNucleons(nucleationSize, nucleationArea);
                break;
            }

            case NucleationModuleType.Increasing:
            {
                matrix.AddRecrystalisedNucleons(nucleationSize * currentStep, nucleationArea);
                break;
            }
            }

            var random          = new Random();
            var notVisitedCells = new List <Cell>(matrix.ShuffledCells);

            foreach (var currentCell in notVisitedCells)
            {
                currentCell.Id = matrix.Cells[currentCell.X, currentCell.Y];

                var randomNeighbour = matrix.GetRandomNeighbour(currentCell, random);

                if (matrix.Energy[randomNeighbour.X, randomNeighbour.Y] != 0)
                {
                    continue;
                }

                var currentEnergy = matrix.CalculateEnergy(currentCell, jb) + matrix.Energy[currentCell.X, currentCell.Y];

                if (currentEnergy == 0)
                {
                    continue;
                }

                var currentCellValue = currentCell.Id;

                var tempCellValue = matrix.Cells[randomNeighbour.X, randomNeighbour.Y];

                if (tempCellValue == currentCellValue)
                {
                    continue;
                }

                currentCell.Id = tempCellValue;

                var newEnergy = matrix.CalculateEnergy(currentCell, jb);

                if (newEnergy < currentEnergy)
                {
                    matrix.Cells[currentCell.X, currentCell.Y]  = tempCellValue;
                    matrix.Energy[currentCell.X, currentCell.Y] = 0;
                }
            }
        }
Example #2
0
        public static void SRXMonteCarloStep(this Grid grid, double jb, NucleationModuleType nucleationType, NucleationArea nucleationArea, int nucleationSize, int currentStep)
        {
            switch (nucleationType)
            {
            case NucleationModuleType.Constant:
            {
                grid.AddRecrystalisedNucleons(nucleationSize, nucleationArea);
                break;
            }
            }

            var random          = new Random();
            var notVisitedCells = new List <Cell>(grid.ShuffledCells);

            foreach (var currentCell in notVisitedCells)
            {
                currentCell.Id = grid.Cells[currentCell.X, currentCell.Y];

                var randomNeighbour = grid.GetRandomNeighbour(currentCell, random);

                if (grid.Energy[randomNeighbour.X, randomNeighbour.Y] != 0)
                {
                    continue;
                }

                var currentEnergy = grid.CalculateEnergy(currentCell, jb) + grid.Energy[currentCell.X, currentCell.Y];

                if (currentEnergy == 0)
                {
                    continue;
                }

                var currentCellValue = currentCell.Id;

                var tempCellValue = grid.Cells[randomNeighbour.X, randomNeighbour.Y];

                if (tempCellValue == currentCellValue)
                {
                    continue;
                }

                currentCell.Id = tempCellValue;

                var newEnergy = grid.CalculateEnergy(currentCell, jb);

                if (newEnergy < currentEnergy)
                {
                    grid.Cells[currentCell.X, currentCell.Y]  = tempCellValue;
                    grid.Energy[currentCell.X, currentCell.Y] = 0;
                }
            }
        }