private void PartialSortY(MatrixSortParticleSection particleSection)
        {
            for (var i = 0; i < particleSection.ParticlesMatrix.GetLength(0); i++)
            {
                for (var j = 0; j < particleSection.ParticlesMatrix.GetLength(1) - 1; j++)
                {
                    for (var k = 0; k < particleSection.ParticlesMatrix.GetLength(2); k++)
                    {
                        if (particleSection.ParticlesMatrix[i, j, k].Position.Y >
                            particleSection.ParticlesMatrix[i, j + 1, k].Position.Y)
                        {
                            SwapParticles(particleSection, i, j, k, i, j + 1, k);
                        }
                        var otherj = particleSection.ParticlesMatrix.GetLength(1) - j - 2;

                        if (particleSection.ParticlesMatrix[i, otherj, k].Position.Y >
                            particleSection.ParticlesMatrix[i, otherj + 1, k].Position.Y)
                        {
                            SwapParticles(particleSection, i, otherj, k, i, otherj + 1, k);
                        }

                        // throw new Exception("Edit to swap from A to B, B to A");
                    }
                }
            }
        }
        private void SwapParticles(MatrixSortParticleSection particleSection, int x1, int y1, int z1, int x2, int y2,
                                   int z2)
        {
            var swap = particleSection.ParticlesMatrix[x1, y1, z1];

            particleSection.ParticlesMatrix[x1, y1, z1] = particleSection.ParticlesMatrix[x2, y2, z2];
            particleSection.ParticlesMatrix[x2, y2, z2] = swap;
            totalSwaps++;
        }
 private void SwapZBorderSection(MatrixSortParticleSection lower, MatrixSortParticleSection upper, int step,
                                 SimulationStructure structure)
 {
     for (int i = 0; i < lower.ParticlesMatrix.GetLength(0); i++)
     {
         for (int j = 0; j < lower.ParticlesMatrix.GetLength(1); j++)
         {
             Particle particle1 = upper.ParticlesMatrix[i, j, 0];
             Particle particle2 = lower.ParticlesMatrix[i, j, lower.ParticlesMatrix.GetLength(2) - 1];
             if (particle2.Position.Z <= particle1.Position.Z)
             {
                 continue;
             }
             lower.ParticlesMatrix[i, j, lower.ParticlesMatrix.GetLength(2) - 1] = particle1;
             upper.ParticlesMatrix[i, j, 0] = particle2;
         }
     }
     costCalculator.AddTransmissionCost(lower, upper,
                                        lower.ParticlesMatrix.GetLength(2) * lower.ParticlesMatrix.GetLength(1), structure, step);
 }
 private void SwapXBorderSection(MatrixSortParticleSection lower, MatrixSortParticleSection upper, int step,
                                 SimulationStructure structure)
 {
     for (int i = 1; i < lower.ParticlesMatrix.GetLength(1); i++)
     {
         for (int j = 1; j < lower.ParticlesMatrix.GetLength(2); j++)
         {
             Particle particle1 = lower.ParticlesMatrix[lower.ParticlesMatrix.GetLength(0) - 1, i, j];
             Particle particle2 = upper.ParticlesMatrix[0, i, j];
             if (particle1.Position.X <= particle2.Position.X)
             {
                 continue;
             }
             lower.ParticlesMatrix[lower.ParticlesMatrix.GetLength(0) - 1, i, j] = particle2;
             upper.ParticlesMatrix[0, i, j] = particle1;
         }
     }
     costCalculator.AddTransmissionCost(lower, upper,
                                        lower.ParticlesMatrix.GetLength(2) * lower.ParticlesMatrix.GetLength(1), structure, step);
 }
 private void PartialSortX(MatrixSortParticleSection particleSection)
 {
     for (var i = 0; i < particleSection.ParticlesMatrix.GetLength(0) - 1; i++)
     {
         for (var j = 0; j < particleSection.ParticlesMatrix.GetLength(1); j++)
         {
             for (var k = 0; k < particleSection.ParticlesMatrix.GetLength(2); k++)
             {
                 if (particleSection.ParticlesMatrix[i, j, k].Position.X >
                     particleSection.ParticlesMatrix[i + 1, j, k].Position.X)
                 {
                     SwapParticles(particleSection, i + 1, j, k, i, j, k);
                 }
                 var otheri = particleSection.ParticlesMatrix.GetLength(0) - i - 2;
                 if (particleSection.ParticlesMatrix[otheri, j, k].Position.X >
                     particleSection.ParticlesMatrix[otheri + 1, j, k].Position.X)
                 {
                     SwapParticles(particleSection, otheri + 1, j, k, otheri, j, k);
                 }
             }
         }
     }
 }
        private void PartialSortZ(MatrixSortParticleSection particleSection)
        {
            for (var i = 0; i < particleSection.ParticlesMatrix.GetLength(0); i++)
            {
                for (var j = 0; j < particleSection.ParticlesMatrix.GetLength(1); j++)
                {
                    for (var k = 0; k < particleSection.ParticlesMatrix.GetLength(2) - 1; k++)
                    {
                        if (particleSection.ParticlesMatrix[i, j, k].Position.Z >
                            particleSection.ParticlesMatrix[i, j, k + 1].Position.Z)
                        {
                            SwapParticles(particleSection, i, j, k, i, j, k + 1);
                        }
                        var otherk = particleSection.ParticlesMatrix.GetLength(2) - k - 2;

                        if (particleSection.ParticlesMatrix[i, j, otherk].Position.Z >
                            particleSection.ParticlesMatrix[i, j, otherk + 1].Position.Z)
                        {
                            SwapParticles(particleSection, i, j, otherk, i, j, otherk + 1);
                        }
                    }
                }
            }
        }