Пример #1
0
    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;
                }
            }
        }
    }
Пример #2
0
    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);
    }
Пример #3
0
    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);
    }