public void CollectDust(AccreteDisc Disc, ProtoPlanet p, double inner, double outer, double lastMass) { //ProtoStar star = p.Star; // declear working vars: double bandwidth = 0.0; double temp = 0.0; double temp1 = 0.0; double temp2 = 0.0; double width = 0.0; double volume = 0.0; double dustdensity, gasdensity, massdensity; foreach (AccreteBand band in Disc.Bands) { if (band.Intersect(inner, outer) && band.DustPresent) { bandwidth = outer - inner; temp1 = Math.Max(outer - band.OuterEdge, 0.0); temp2 = Math.Max(band.InnerEdge - inner, 0.0); width = bandwidth - temp1 - temp2; if (!band.DustPresent) { dustdensity = 0.0; gasdensity = 0.0; } else { if ((lastMass > p.CriticalLimit) && band.GasPresent) { massdensity = p.CloudDensity; gasdensity = massdensity - (Constants.Stargen.K * massdensity) / (1.0 + (Math.Sqrt(p.CriticalLimit / p.Mass) * (Constants.Stargen.K - 1.0))); dustdensity = massdensity - gasdensity; } else { dustdensity = p.CloudDensity; gasdensity = 0.0; } } temp = 4.0 * Math.PI * Math.Pow(p.SemiMajorAxis, 2.0) * p.ReducedMass * (1.0 - (p.Eccentricity * (temp1 - temp2) / bandwidth)); volume = temp * width; p.DustMass += volume * dustdensity; p.GasMass += volume * gasdensity; } } }
private void AccreteDust(AccreteDisc Disc, ProtoPlanet p) { //ProtoStar star = p.Star; double startDustMass = p.DustMass; double startGasMass = p.GasMass; //double minAccretion = 0.0001 * startMass; double gatherLast = 0.0; double rInner = 0; double rOuter = 0; do { //gatherLast = gatherNow; gatherLast = p.Mass; p.ReduceMass(); rInner = p.InnerEffectLimit; rOuter = p.OuterEffectLimit; p.DustMass = startDustMass; p.GasMass = startGasMass; //foreach (AccreteBand band in Disc.Bands) { //if(band.Intersect(rInner, rOuter)) { CollectDust(Disc, p, rInner, rOuter, gatherLast); } //band.CollectDust(rInner, rOuter, p, gatherLast); } }while ((p.Mass - gatherLast) >= (0.0001 * p.Mass)); Disc.UpdateDust(p); // Clear dust only on reduced mass? }
private void doCollisions(AccreteDisc Disc) { // create working vars: double miu1, miu2; double delta = 1, deltaMin = 0; double newE, newA; double temp; bool collision; do { collision = false; Disc.Planets = new List <ProtoPlanet>(Disc.Planets.OrderBy(x => x.SemiMajorAxis)); for (int i = 0; i < Disc.Planets.Count - 1; i++) { ProtoPlanet aPlanet = Disc.Planets[i]; ProtoPlanet bPlanet = Disc.Planets[i + 1]; miu1 = aPlanet.Mass / Disc.Mass; miu2 = bPlanet.Mass / Disc.Mass; deltaMin = 2.4 * (Math.Pow(miu1 + miu2, 1.0 / 3.0)); delta = Math.Abs((bPlanet.SemiMajorAxis - aPlanet.SemiMajorAxis) / aPlanet.SemiMajorAxis); if (delta <= deltaMin && !Disc.isMoonDisc) { // New orbital distance newA = (aPlanet.Mass + bPlanet.Mass) / ((aPlanet.Mass / aPlanet.SemiMajorAxis) + (bPlanet.Mass / bPlanet.SemiMajorAxis)); //#if LOG4NET_ENABLED //logger.Debug(String.Format("Collision between two planetesimals! {0:N4} AU ({1:N5}) + {2:N4} AU ({3:N5}) -> {4:N4} AU", bPlanet.SemiMajorAxis, bPlanet.MassInEarthMasses, aPlanet.SemiMajorAxis, aPlanet.MassInEarthMasses, newA)); //#endif // Compute new eccentricity temp = aPlanet.Mass * Math.Sqrt(aPlanet.SemiMajorAxis) * Math.Sqrt(1.0 - Math.Pow(aPlanet.Eccentricity, 2.0)); temp = temp + (bPlanet.Mass * Math.Sqrt(bPlanet.SemiMajorAxis) * Math.Sqrt(Math.Sqrt(1.0 - Math.Pow(bPlanet.Eccentricity, 2.0)))); temp = temp / ((aPlanet.Mass + bPlanet.Mass) * Math.Sqrt(newA)); temp = 1.0 - Math.Pow(temp, 2.0); temp = Math.Min(Math.Max(temp, 0.0), 1.0); newE = Math.Sqrt(temp); // Create a new Protoplanet to accrete additional material var newP = new ProtoPlanet(Disc.Star, Disc.Star) { SemiMajorAxis = newA, Eccentricity = newE, DustMass = aPlanet.DustMass + bPlanet.DustMass, GasMass = aPlanet.GasMass + bPlanet.GasMass, Star = Disc.Star, IsMoon = aPlanet.IsMoon, MoonOf = aPlanet.MoonOf }; newP.init(); //newP.CritMass = getCriticalMass(newP); //newP.CloudDensity = getCloudDensity(newP); //double startmass = newP.Mass; AccreteDust(Disc, newP); /* #if LOG4NET_ENABLED * if (newP.Mass < startmass) * logger.Debug("Accretion reduced mass, something is wrong!"); * else if (newP.Mass > startmass) * logger.Debug("Accretion increased mass!"); * else * logger.Debug("Accretion did not change mass!"); #endif */ //#if LOG4NET_ENABLED //logger.Debug(string.Format("New planet at {0:N4} AU with mass {1:N5}!", newP.SemiMajorAxis, newP.MassInEarthMasses)); //#endif Disc.Planets.Remove(aPlanet); Disc.Planets.Remove(bPlanet); Disc.Planets.Add(newP); collision = true; break; } } }while (collision == true); }
private void CoalescePlanetesimals(AccreteDisc Disc, ProtoPlanet p) { Disc.Planets.Add(p); doCollisions(Disc); }