public void Simulate(Simulation grainGrowth, Graphics gB, Graphics g) { Grain[,] grains = grainGrowth.Tab; List <Grain> all = grains.OfType <Grain>().ToList(); while (all.Count > 0) { if (BREAK_SIMULATION) { BREAK_SIMULATION = false; break; } int index = random.Next(all.Count); Grain grain = all.ElementAt(index); all.RemoveAt(index); int stateBefore = grain.State; List <int> neighbours = NeighbourhoodFactory.GetNeighboursMonteCarlo(grains, grain.X, grain.Y); int energyBefore = CalculateEnergy(neighbours, stateBefore); grains[grain.Y, grain.X].Q = energyBefore; int stateAfter = (neighbours.ElementAt(random.Next(neighbours.Count))); int energyAfter = CalculateEnergy(neighbours, stateAfter); int deltaEnergy = energyAfter - energyBefore; if (deltaEnergy <= 0) { grains[grain.Y, grain.X].State = stateAfter; grain.Display(g, gB); grains[grain.Y, grain.X].Q = energyAfter; } else { float probability = (float)Math.Exp(-(deltaEnergy / this.KT)) * 100; float value = (float)random.NextDouble() * 100; if (value <= probability) { grains[grain.Y, grain.X].State = stateAfter; grain.Display(g, gB); grains[grain.Y, grain.X].Q = energyAfter; } } } }
public Grain[,] Inclusion(Grain[,] grains, Graphics g) { List <Grain> all = grains.OfType <Grain>().ToList(); List <Grain> allOnBorder = all.Where(s => s.OnBorder == true).ToList(); foreach (Grain grain in allOnBorder) { if (grain.Density > criticallRo && !grain.Recrystallized) { currentlyRecrystalized[grain.Y, grain.X] = true; grains[grain.Y, grain.X].Density = criticallRo; // grains[grain.Y, grain.X].Recrystallized = true; grains[grain.Y, grain.X].DisplayRecrystallized(g, Colors.GetRecrystallizationColor()); } else if (grain.Density > criticallRo && grain.Recrystallized) { currentlyRecrystalized[grain.Y, grain.X] = true; grains[grain.Y, grain.X].Density = criticallRo; } } return(grains); }
public Grain[,] DislocationsPartition(Grain[,] grains, Graphics g) { List <Grain> all = grains.OfType <Grain>().ToList(); List <Grain> allOnBorder = all.Where(s => s.OnBorder == true).ToList(); List <Grain> allNotOnBorder = all.Where(s => s.OnBorder == false).ToList(); if (allOnBorder == null || allNotOnBorder == null || all == null) { return(grains); } time += deltaTime; for (int y = 0; y < SIZE_Y; y++) { for (int x = 0; x < SIZE_X; x++) { currentlyRecrystalized[y, x] = false; } } Console.WriteLine(time); double _ro = (A / B) + (1 - (A / B)) * (Math.Exp(-B * time)); double _sigma = sigma0 + value * A0 * B0 * Math.Sqrt(_ro); ro.Add(_ro); sigma.Add(_sigma); double deltaRo = ro.ElementAt(ro.Count - 1) - ro.ElementAt(ro.Count - 2); double oneCellRo = deltaRo / (SIZE_X * SIZE_Y); double firstPackage = oneCellRo * cellPercent; foreach (Grain grain in grains) { grain.Density += firstPackage; } double checkRo = firstPackage * all.Count; random = new Random(); deltaRo -= firstPackage * all.Count; double smallPackage = deltaRo * smallPackagePercent; while (deltaRo > 0) { int probability = random.Next(101); if (probability >= 20) { int index = random.Next(allOnBorder.Count); Grain grain = allOnBorder.ElementAt(index); //if (!grain.Recrystallized) //{ grains[grain.Y, grain.X].Density += smallPackage; deltaRo -= smallPackage; checkRo += smallPackage; //} } else { int index = random.Next(allNotOnBorder.Count); Grain grain = allNotOnBorder.ElementAt(index); //if (!grain.Recrystallized) //{ grains[grain.Y, grain.X].Density += smallPackage; deltaRo -= smallPackage; checkRo += smallPackage; //} } } double _density = 0; foreach (Grain grain in grains) { _density += grain.Density; } checkedRo.Add(checkRo); checkedRoFromGrians.Add(_density); grains = Inclusion(grains, g); grains = Simulation(grains, g); for (int y = 0; y < SIZE_Y; y++) { for (int x = 0; x < SIZE_X; x++) { grains[y, x].Recrystallized = currentlyRecrystalized[y, x] ? true : grains[y, x].Recrystallized; lastRecrystalized[y, x] = currentlyRecrystalized[y, x]; } } return(grains); }