def relative_position_and_velocity_from_orbital_elements(
        mass1, mass2, semimajor_axis, eccentricity, mean_anomaly, seed=None):
    """
  Function that returns relative positions and velocity vectors or orbiters with masses 
  mass2 of the central body with mass mass1 in Cartesian coordinates;
  for vectors of orbital elements -- semi-major axes, eccentricities, mean anomalies.
  3D orientation of orbits (inclination, longitude of ascending node and argument of periapsis) are random.
  (cos(incl) is uniform -1--1, longitude of ascending node and argument of periapsis are uniform 0--2pi)
  Assuming mass1 is static in the center [0,0,0] m, [0,0,0] km/s (that is mass2<<mass1)
  """
    position_vectors = []
    velocity_vectors = []
    converter = nbody_system.nbody_to_si(1 | units.MSun, 1 | units.AU)
    kepler = Kepler(converter)
    kepler.initialize_code()
    r_vec = (0., 0., 0.) | units.AU
    v_vec = (0., 0., 0.) | units.kms
    # to change seed for each particle
    if seed is not None:
        i = 0
    for m2_i, a_i, ecc_i, ma_i in zip(mass2, semimajor_axis, eccentricity,
                                      mean_anomaly):
        #print m2_i, a_i, ecc_i, ma_i
        if seed is not None:
            kepler.set_random(seed + i)
            i = i + 1
        kepler.initialize_from_elements(mass=(mass1 + m2_i),
                                        semi=a_i,
                                        ecc=ecc_i,
                                        mean_anomaly=ma_i,
                                        random_orientation=-1)
        ri = kepler.get_separation_vector()
        vi = kepler.get_velocity_vector()
        # this is to get ~half of the orbits retrograde (that is with inclination
        # of 90--180 degrees) --> velocity = -velocity
        vel_vec_dir = numpy.random.random()
        if (vel_vec_dir <= 0.5):
            vel_orientation = 1.
        else:
            vel_orientation = -1.
        position_vectors.append([ri[0], ri[1], ri[2]])
        velocity_vectors.append([
            vel_orientation * vi[0], vel_orientation * vi[1],
            vel_orientation * vi[2]
        ])
    kepler.stop()
    return position_vectors, velocity_vectors
Exemplo n.º 2
0
def relative_position_and_velocity_from_orbital_elements(mass1,
                                                         mass2,
                                                         semimajor_axis,
                                                         eccentricity,
                                                         mean_anomaly,
                                                         seed=None):
  """
  Function that returns relative positions and velocity vectors or orbiters with masses 
  mass2 of the central body with mass mass1 in Cartesian coordinates;
  for vectors of orbital elements -- semi-major axes, eccentricities, mean anomalies.
  3D orientation of orbits (inclination, longitude of ascending node and argument of periapsis) are random.
  (cos(incl) is uniform -1--1, longitude of ascending node and argument of periapsis are uniform 0--2pi)
  Assuming mass1 is static in the center [0,0,0] m, [0,0,0] km/s (that is mass2<<mass1)
  """
  position_vectors = []
  velocity_vectors = []
  converter = nbody_system.nbody_to_si(1|units.MSun,1|units.AU)
  kepler = Kepler(converter)
  kepler.initialize_code()
  r_vec = (0.,0.,0.) | units.AU
  v_vec = (0.,0.,0.) | units.kms
  # to change seed for each particle
  if seed is not None:
    i=0
  for m2_i, a_i, ecc_i, ma_i in zip(mass2, semimajor_axis, eccentricity, mean_anomaly):
    #print m2_i, a_i, ecc_i, ma_i
    if seed is not None:
      kepler.set_random(seed+i)
      i=i+1
    kepler.initialize_from_elements(mass=(mass1+m2_i),semi=a_i,ecc=ecc_i,mean_anomaly=ma_i,random_orientation=-1)
    ri = kepler.get_separation_vector()
    vi = kepler.get_velocity_vector()
    # this is to get ~half of the orbits retrograde (that is with inclination
    # of 90--180 degrees) --> velocity = -velocity
    vel_vec_dir = numpy.random.random()
    if (vel_vec_dir<=0.5):
      vel_orientation = 1.
    else:
      vel_orientation = -1.
    position_vectors.append([ri[0], ri[1], ri[2]])
    velocity_vectors.append([vel_orientation*vi[0], vel_orientation*vi[1], vel_orientation*vi[2]])
  kepler.stop()
  return position_vectors, velocity_vectors
Exemplo n.º 3
0
def run_kepler(mass, semi, ecc, time):

    kep = Kepler(redirection='none')
    kep.initialize_code()

    kep.set_longitudinal_unit_vector(1.0, 1.0,
                                     0.0)
    kep.initialize_from_elements(mass, semi, ecc)
    a,e = kep.get_elements()
    p = kep.get_periastron()
    print "elements:", a, e, p
    kep.transform_to_time(time)
    x,y,z = kep.get_separation_vector()
    print "separation:", x,y,z
    x,y,z = kep.get_longitudinal_unit_vector()
    print "longitudinal:", x,y,z

    pos = [1, 0, 0] | nbody_system.length
    vel = [0, 0.5, 0] | nbody_system.speed
    kep.initialize_from_dyn(mass, pos[0], pos[1], pos[2],
                            vel[0], vel[1], vel[2])
    a,e = kep.get_elements()
    p = kep.get_periastron()
    print "elements:", a, e, p
    kep.transform_to_time(time)
    x,y,z = kep.get_separation_vector()
    print "separation:", x,y,z
    x,y,z = kep.get_velocity_vector()
    print "velocity:", x,y,z
    x,y,z = kep.get_longitudinal_unit_vector()
    print "longitudinal:", x,y,z

    kep.set_random(42)
    kep.make_binary_scattering(0.5 | nbody_system.mass,
                               0.5,
                               0.5 | nbody_system.mass,
                               0.0 | nbody_system.speed,
                               0.0 | nbody_system.length,
                               1.e-6,
                               0)
    kep.stop()
Exemplo n.º 4
0
    assert is_mpd_running()

    # Instantiate workers once only and pass to scatter3 as arguments.

    gravity = SmallN(redirection="none")
    #gravity = SmallN(redirection = "none", debugger="valgrind") # search for
    # memory leaks
    gravity.initialize_code()
    gravity.parameters.set_defaults()
    gravity.parameters.timestep_parameter = accuracy_parameter
    gravity.parameters.unperturbed_threshold = gamma

    kep = Kepler(redirection="none")  #, debugger="gdb")
    kep.initialize_code()
    kep.set_random(random_seed)  # ** Note potential conflict between C++
    # ** and Python random generators.

    # Timing:

    cpu = numpy.zeros(4)

    for i in range(nscatter):

        final, dcpu = scatter3(init, kep, gravity, gamma, delta_t, t_end)
        cpu += dcpu

        print ''
        if final.is_over == 0:
            print 'interaction is not over'
        else:
Exemplo n.º 5
0
        random_seed = numpy.random.randint(1, pow(2,31)-1)
    numpy.random.seed(random_seed)
    print "random seed =", random_seed, numpy.random.random()

    #-----------------------------------------------------------------

    assert is_mpd_running()

    # Instantiate worker modules once only and pass them to scatter32
    # as arguments.

    # Kepler manages two-body dynamics.

    kep = Kepler(redirection = "none") #, debugger="gdb")
    kep.initialize_code()
    kep.set_random(random_seed)	  # ** Note potential conflict between C++
				  # ** and Python random generators.

    # Gravity manages the N-body integration.

    gravity = SmallN(redirection = "none")
    gravity.initialize_code()
    gravity.parameters.set_defaults()
    gravity.parameters.timestep_parameter = accuracy_parameter
    gravity.parameters.unperturbed_threshold = gamma

    # Treecheck determines the structure of the 3-body system.
    # Treecheck = gravity is OK.

    treecheck = SmallN(redirection = "none")
    treecheck.initialize_code()