/// <summary>
        ///
        /// </summary>
        /// <param name="initcond">[0]длина трубы;
        /// [1]высота трубы;
        /// [2]отностиельная граница по Икс
        /// [3]Давление слева
        /// [4]Плотность слева
        /// [5]Давление справа
        /// [6]Плотность справа
        /// [7]Интервал между частицами
        /// </param>
        /// <returns></returns>
        public static Tuple <IEnumerable <GasParticleVer3>, IEnumerable <IGasParticleVer3> > TestTrubaParticles(params double[] initcond)
        {
            double lt     = initcond[0]; //длина трубы
            double ht     = initcond[1]; //высота трубы
            double x0t    = initcond[2]; //отностиельная граница по Икс
            double p1t    = initcond[3]; //Давление слева
            double ro1t   = initcond[4]; //Плотность слева
            double p2t    = initcond[5]; //Давление справа
            double ro2t   = initcond[6]; //Плотность справа
            double delta0 = initcond[7]; //Плотность справа

            options = options ?? GasParticleOptions.DiffOnlyE();

            var bounds = new List <BorderSegment>(4);

            bounds.Add(new BorderSegment(0, 0, 0, ht));
            bounds.Add(new BorderSegment(0, ht, lt, ht));
            bounds.Add(new BorderSegment(lt, ht, lt, 0));
            bounds.Add(new BorderSegment(lt, 0, 0, 0));

            int    Nx = (int)Round(lt / delta0);
            double dx = lt / Nx;

            int    Ny = (int)Round(ht / delta0);
            double dy = ht / Ny;

            double delta = Min(dx, dy);
            double m1    = GetMass(delta, h_default, ro1t);
            double m2    = GetMass(delta, h_default, ro2t);

            var particles = new List <GasParticleVer3>(Nx * Ny + 10);

            double x = 0.5 * delta;

            do
            {
                double y = 0.5 * delta;
                do
                {
                    var p = new GasParticleVer3(h_default, 2 * h_default, bounds);
                    p.X  = x;
                    p.Y  = y;
                    p.P  = x < lt * x0t ? p1t : p2t;
                    p.Ro = x < lt * x0t ? ro1t : ro2t;
                    p.M  = x < lt * x0t ? m1 : m2;
                    p.k  = k;
                    particles.Add(p);

                    y += delta;
                } while(y < ht);
                x += delta;
            } while(x < lt);

            particles.ForEach(p => {
                p.E = p.P / ((p.k - 1d) * p.Ro);
            });
            return(new Tuple <IEnumerable <GasParticleVer3>, IEnumerable <IGasParticleVer3> >(particles, null));
        }
        /// <summary>
        ///
        /// </summary>
        /// <param name="initcond"> [0]давление внутри шара;
        /// [1]плотность внутри шара;
        /// [2]скорость шара (мах)</param>
        /// <returns></returns>
        public static Tuple <IEnumerable <GasParticleVer3>, IEnumerable <IGasParticleVer3> > TestGasBallParticles(params double[] initcond)
        {
            options = options ?? GasParticleOptions.DiffOnlyE();
            double p1    = initcond[0];
            double ro1   = initcond[1];
            double mach1 = initcond[2];
            //
            double e_check = 4.29 * 10E6;

            ro1 = 1.63;
            p1  = 0.65 * e_check;

            double E  = p1 / ((k - 1d) * ro1);
            double Vx = (k * (k - 1) * E) * mach1;

            double ht = 1;
            double lt = 1;

            int    Nx    = (int)Round(lt / h_default);
            double delta = lt / Nx;

            int    Ny = Nx;
            double m1 = GetMass(delta, h_default, ro1);

            var particles = new List <GasParticleVer3>(Nx * Ny + 10);
            var center    = new Particle2DDummyBase(1)
            {
                X = lt * 0.5,
                Y = lt * 0.5
            };

            var bounds = new List <BorderSegment>(1);
            // bounds.Add(new BorderSegment(lt + 0.5 * delta,-0.25 * lt,lt + 0.5 * delta,1.5 * lt));

            double x = 0.5 * delta;
            double y;

            do
            {
                y = 0.5 * delta;
                do
                {
                    var p = new GasParticleVer3(h_default, 2.01 * h_default, bounds);
                    p.X     = x;
                    p.Y     = y;
                    p.P     = p1;
                    p.Ro    = ro1;
                    p.M     = m1;
                    p.E     = E;
                    p.Vel.X = Vx;
                    p.k     = k;
                    if (p.GetDistTo(center) < lt * 0.5)
                    {
                        particles.Add(p);
                    }

                    y += delta;
                } while(y < lt);
                x += delta;
            } while(x < lt);

            var borders = new List <IGasParticleVer3>(400);

            borders.Add(new GasParticleVer3Dummy(2 * h_default)
            {
                X = -0.25 * lt * 5, Y = -0.25 * lt * 5, isboundary = true
            });
            borders.Add(new GasParticleVer3Dummy(2 * h_default)
            {
                X = -0.25 * lt * 5, Y = 1.25 * lt * 5, isboundary = true
            });

            //borders.Add(new GasParticleVer3Dummy(2 * h_default) { X = 1.25 * lt,Y = -0.25 * lt,isboundary = true });
            //borders.Add(new GasParticleVer3Dummy(2 * h_default) { X = 1.25 * lt,Y = 1.25 * lt,isboundary = true });

            y = -0.25 * lt;
            //do {
            //    borders.Add(new GasParticleVer3Dummy(2 * h_default) { X = bounds[0].p1.X + h_default,Y = y,isboundary = true });
            //    y += (delta / 5);
            //} while(y < 1.25 * lt);

            return(new Tuple <IEnumerable <GasParticleVer3>, IEnumerable <IGasParticleVer3> >(particles, borders));
        }