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