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; } } }
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; } } }