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
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
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()
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:
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()