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