コード例 #1
0
 private void FillBestNeibsPlusRO()
 {
     BestNeibs = Neibs.Where(n => !ReferenceEquals(n, this)).Concat(MiracleStack).Where(n => GetDistTo(n) < hmax).Cast <IGasParticleVer3>().ToList();
     if (!options.diffRo)
     {
         Ro = BestNeibs.Where(bn => !bn.isboundary).Sum(n => {
             double w = W_func(GetDistTo(n), h);
             return(n.M * w);
         });
         Ro += M * W_func(0, h);
     }
 }
コード例 #2
0
        public override void SetP()
        {
            //Ro = Neibs.Cast<IsotropicGasParticle>().Sum(n => {
            //    double h = alpha * (D + n.D) * 0.5;
            //    double w = W_func(GetDistTo(n),h);
            //    return n.M * w;

            //}) + M* W_func(0,1);
            P        = (k - 1d) * Ro * E;
            Ro       = M * W_func(0, hmax);
            dE       = 0d;
            dV.Vec2D = Vector2D.Zero;
            foreach (var neib in Neibs.Cast <My_IsotropicGas>())
            {
                Ro += neib.M * W_func(this.GetDistTo(neib), hmax);
            }
        }
コード例 #3
0
        public virtual void FillDts()
        {
            foreach (var neib in Neibs.Where(n => GetDistTo(n) < hmax).Cast <IsotropicGasParticle>())
            {
                double h  = alpha * (D + neib.D) * 0.5;
                double dw = dW_func(GetDistTo(neib), h);
                if (dw == 0d)
                {
                    continue;
                }
                double m_j  = neib.M;
                double Ro_j = neib.Ro;
                double P_j  = neib.P;
                double Cl_j = neib.GetCl(); //скорость звука
                double Cl_i = neib.GetCl();

                double x = X;

                Vector2D Rji_norm  = (neib.Vec2D - Vec2D).Norm;
                double   U_Ri      = Vel.Vec2D * Rji_norm;
                double   U_Rj      = neib.Vel.Vec2D * Rji_norm;
                double   U_starRij = (U_Rj * Ro_j * Cl_j + U_Ri * Ro * Cl_i - P_j + P) / (Ro_j * Cl_j + Ro * Cl_i);                           // 1.20
                double   P_starij  = (P_j * Ro * Cl_i + P * Ro * Cl_j + Ro_j * Cl_j * Ro * Cl_i * (U_Rj - U_Rj)) / (Ro_j * Cl_j + Ro * Cl_i); //1.21

                double mn4VandE = 2d * m_j * P_starij / (Ro * Ro_j) * dw;

                dRo += -2d * m_j * Ro / Ro_j * dw * (U_Ri - U_starRij); //1.24
                var dVelVec = mn4VandE * Rji_norm;
                dV.X += dVelVec.X;
                dV.Y += dVelVec.Y;
                dE   += -0.5 * mn4VandE * (U_Ri - U_starRij);//1.26
                if (X == 0d)
                {
                    int i = 1;
                }
            }
        }
コード例 #4
0
        //
        public override void FillDts()
        {
            //Список зеркальных частиц
            var miracleList = new List <IMy_IsotropicGas>();



            //Создаем зеркальные частицы
            //if(Neibs.Any(n => (n as My_IsotropicGas).isboundary))
            foreach (var neib in Neibs.Cast <My_IsotropicGas>().Where(n => !n.isboundary).Concat(new[] { this }))
            {
                //Если у соседа есть в соседях граница, то
                if (neib.Neibs.Cast <My_IsotropicGas>().Any(nn => nn.isboundary))
                {
                    //Отображаем соседа
                    var mir = neib.CreateMiracleClone(My_Sph2D.boundaries);
                    miracleList.Add(mir);
                }
            }

            foreach (var neib in Neibs.Where(n => GetDistTo(n) < hmax).Cast <IMy_IsotropicGas>())//.Concat(miracleList.Where(mp => mp.GetDistTo(this) < hmax)))
            {
                Vector2D deltaV = Vel.Vec2D - neib.Vel.Vec2D;
                Vector2D deltaR = Vec2D - neib.Vec2D;
                if (!neib.isboundary)
                {
                    double mj = neib.M;
                    double r  = deltaR.GetLength();
                    //
                    double H      = 0;
                    double scalar = deltaV * deltaR;
                    if (scalar < 0)
                    {
                        double alpha_ = 0.9;
                        double beta_  = 0.9;
                        double phi_   = 0.1;
                        double phi    = hmax * scalar / (Math.Pow(r, 2) + Math.Pow(phi_ * hmax, 2));
                        double Ro_    = (Ro + neib.Ro) / 2;
                        double C_     = (C() + neib.C()) / 2;

                        H = (-alpha_ * C_ * phi + beta_ * Math.Pow(phi, 2)) / Ro_;
                    }
                    //
                    double brackets = mj * (P / (Ro * Ro) + neib.P / (neib.Ro * neib.Ro) + 0);
                    if (H > 1)
                    {
                        double res = brackets / H;
                        int    a   = 0;
                    }
                    Vector2D dW = new Vector2D((deltaR.X / r) * dW_func(r, hmax), (deltaR.Y / r) * dW_func(r, hmax));
                    //плотность
                    //Ro += mj * W_func(r, hmax);
                    //скорости
                    dV.X += -brackets * dW.X;
                    dV.Y += -brackets * dW.Y;
                    //энергия
                    dE += 0.5 * brackets * deltaV * dW;
                }
                else
                {
                    double r0  = 2;
                    double rij = deltaR.GetLength();
                    if (r0 / rij <= 1)
                    {
                        double n1 = 12;
                        double n2 = 4;
                        double D  = (Vel.Vec2D.GetLength() > neib.Vel.Vec2D.GetLength()) ?
                                    Vel.Vec2D.GetLength() * Vel.Vec2D.GetLength() :
                                    neib.Vel.Vec2D.GetLength() * neib.Vel.Vec2D.GetLength();
                        D = D * 2;
                        double brackets = -D * (Math.Pow(r0 / rij, n1) - Math.Pow(r0 / rij, n2)) / (rij * rij);
                        double PDijx    = brackets * deltaR.X;
                        double PDijy    = brackets * deltaR.Y;
                        //
                        dV.X += PDijx / M;
                        dV.Y += PDijy / M;
                    }
                }
            }
        }