def new_system(star_mass=1 | units.MSun, star_radius=1 | units.RSun, disk_minimum_radius=0.05 | units.AU, disk_maximum_radius=10 | units.AU, disk_mass=20 | MEarth, accurancy=0.0001, planet_density=3 | units.g / units.cm**3, rng=None, kepler=None): central_particle = Particle() central_particle.mass = star_mass central_particle.position = (0, 0, 0) | units.AU central_particle.velocity = (0, 0, 0) | units.kms central_particle.radius = star_radius central_particle.name = "star" central_particle.type = "star" central_particle.id = 0 if rng is None: rng = numpy.random converter = nbody_system.nbody_to_si(1 | units.MSun, 1 | units.AU) if kepler is None: kepler = Kepler(converter) kepler.initialize_code() m, r, f = new_planet_distribution(disk_minimum_radius, disk_maximum_radius, disk_mass, accurancy) planets = make_planets(central_particle, m, r, density=planet_density, phi=0, theta=None, kepler=kepler, rng=rng) planets.name = "planet" planets.type = "planet" for i in range(len(planets)): planets[i].id = i central_particle.planets = planets kepler.stop() p = Particles() p.add_particle(central_particle) return p
def get_moons_for_planet(planet, delta_JD=0. | units.day): """ The Earth's moon as for JD = 2457099.500000000 = A.D. 2015-Mar-18 00:00:00.0000 (CT) https://ssd.jpl.nasa.gov/?sat_elem """ data = numpy.array([tuple(entry) for entry in _lunar_data], dtype=[('planet_name', 'S10'), ('name', 'S10'), ('mass', '<f8'), ('radius', '<f8'), ('semimajor_axis', '<f8'), ('eccentricity', '<f8'), ('argument_of_peri', '<f8'), ('mean_anomaly', '<f8'), ('inclination', '<f8'), ('longitude_oan', '<f8')]) moon_data = data[data['planet_name'] == planet.name.encode('UTF-8')] print("Planet=", planet.name, "moon=", moon_data["name"]) moons = Particles() if len(moon_data["name"]): print(len(moon_data["name"])) for moon in moon_data: #Ignore the moon for now, because it's complicated if planet.name == "EarthMoon": planet.mass -= moon["mass"] * 1.e+16 | units.kg planet.name = "Earth" #print moon r, v = get_position(planet.mass, moon["mass"] * 1.e+16 | units.kg, moon["eccentricity"], moon["semimajor_axis"] | units.km, numpy.deg2rad(moon["mean_anomaly"]), numpy.deg2rad(moon["inclination"]), numpy.deg2rad(moon["longitude_oan"]), numpy.deg2rad(moon["argument_of_peri"]), delta_t=delta_JD) single_moon = Particle() single_moon.type = "moon" single_moon.name = moon["name"] single_moon.mass = moon["mass"] * 1.e+16 | units.kg single_moon.hostname = moon["planet_name"] single_moon.radius = moon["radius"] | units.km single_moon.position = r single_moon.position += planet.position single_moon.velocity = v single_moon.velocity += planet.velocity moons.add_particle(single_moon) return moons
def old_new_solar_system(): """ Create initial conditions describing the solar system. Returns a single particle set containing the sun, planets and Pluto. The model is centered at the origin (center-of-mass(-velocity) coordinates). Defined attributes: name, mass, radius, x, y, z, vx, vy, vz """ sun = Particle() sun.name = 'SUN' sun.mass = 1.0 | units.MSun sun.radius = 1.0 | units.RSun planets = _planets_only() particles = Particles() particles.add_particle(sun) particles.add_particles(planets) particles.move_to_center() return particles
def get_moons_for_planet(planet, delta_JD=0.|units.day): """ The Earth's moon as for JD = 2457099.500000000 = A.D. 2015-Mar-18 00:00:00.0000 (CT) https://ssd.jpl.nasa.gov/?sat_elem """ data = numpy.array([tuple(entry) for entry in _lunar_data], dtype=[('planet_name','S10'), ('name','S10'), ('mass','<f8'), ('radius','<f8'), ('semimajor_axis','<f8'), ('eccentricity','<f8'), ('argument_of_peri','<f8'), ('mean_anomaly','<f8'), ('inclination','<f8'), ('longitude_oan','<f8')]) moon_data = data[data['planet_name']==planet.name] print "Planet=", planet.name, "moon=", moon_data["name"] moons = Particles() if len(moon_data["name"]): print len(moon_data["name"]) for moon in moon_data: #print moon r, v = get_position(planet.mass, moon["mass"] * 1.e+16 | units.kg, moon["eccentricity"], moon["semimajor_axis"]|units.km, numpy.deg2rad(moon["mean_anomaly"]), numpy.deg2rad(moon["inclination"]), numpy.deg2rad(moon["longitude_oan"]), numpy.deg2rad(moon["argument_of_peri"]), delta_t=delta_JD) single_moon = Particle() single_moon.type = "moon" single_moon.name = moon["name"] single_moon.mass = moon["mass"] * 1.e+16 | units.kg single_moon.hostname = moon["planet_name"] single_moon.radius = moon["radius"] | units.km single_moon.position = r single_moon.position += planet.position single_moon.velocity = v single_moon.velocity += planet.velocity moons.add_particle(single_moon) return moons
def get_sun_and_planets(delta_JD=0.|units.day): """ eight planets of the Solar System as for JD = 2457099.500000000 = A.D. 2015-Mar-18 00:00:00.0000 (CT) http://ssd.jpl.nasa.gov/horizons.cgi """ planets = Particles(8) # mass planets.mass = [3.302e23, 48.685e23, 5.97219e24, 6.4185e23, 1898.13e24, 5.68319e26, 86.8103e24, 102.41e24] | units.kg # eccentricity planets_ecc = [2.056263501026885E-01, 6.756759719005901E-03, 1.715483324953308E-02, 9.347121362500883E-02, 4.877287772914470E-02, 5.429934603664216E-02, 4.911406962716518E-02, 8.494660388602767E-03] # semi-major axis planets_semi = [3.870989725156447E-01, 7.233252880006816E-01, 1.000816989613834E+00, 1.523624142457679E+00, 5.203543088590996E+00, 9.547316304899041E+00, 1.915982879739036E+01, 2.997013749028780E+01] | units.AU # mean anomaly [degrees] planets_mean_anomaly = [2.256667460183225E+02, 3.096834722926926E+02, 6.970055236286768E+01, 5.013506750245609E+01, 1.213203242081277E+02, 1.423311616732398E+02, 2.079860620353052E+02, 2.712246916734600E+02] planets_mean_anomaly = numpy.array(planets_mean_anomaly) * pi_over_180 # inclination [IN degrees] planets_inclination = [7.004026765179669E+00, 3.394480103844425E+00, 3.563477431351056E-03, 1.848403408106458E+00, 1.303457729562742E+00, 2.488017444885577E+00, 7.728000142736371E-01, 1.767720502209091E+00] planets_inclination = numpy.array(planets_inclination) * pi_over_180 # Longitude of Ascending Node [OM degrees] planets_longitude = [4.831163083479358E+01, 7.663982595051040E+01, 1.775515437672556E+02, 4.951282677064384E+01, 1.005036717671826E+02, 1.135683875842263E+02, 7.388411509910506E+01, 1.317497218434830E+02] planets_longitude = numpy.array(planets_longitude) * pi_over_180 # Argument of Perihelion [W degrees] planets_argument = [2.916964171964058E+01, 5.469102797401222E+01, 2.877495001117996E+02, 2.865420083537150E+02, 2.740725976811202E+02, 3.398666856578898E+02, 9.666856264946740E+01, 2.951871807292030E+02] planets_argument = numpy.array(planets_argument) * pi_over_180 planets.name = ['Mercury', 'Venus', 'Earth', 'Mars', 'Jupiter', 'Satrun', 'Uranus', 'Neptune'] ### to compare with JPL, mass of the Sun needs to be rescaled #mg_nasa = 1.32712440018e20 | (units.m**3 / units.s**2) #g_nasa = 6.67259e-11 | (units.m**3 / units.kg / units.s**2) #ms = mg_nasa / g_nasa sun = Particle() sun.name = 'Sun' #sun.mass = ms sun.mass = 1.0 | units.MSun sun.position = [0.,0.,0.] | units.AU sun.velocity = [0.,0.,0.] | units.kms # get the position and velocity vectors relative to sun # by evolving in Kepler for i,ecc_i in enumerate(planets_ecc): r, v = get_position(sun.mass, planets[i].mass, planets_ecc[i], planets_semi[i], planets_mean_anomaly[i], planets_inclination[i], planets_longitude[i], planets_argument[i], delta_t=delta_JD) planets[i].position = r planets[i].velocity = v return sun, planets