def initialize_huayno(bodies, converter, huayno_eta): stars_gravity = Huayno(converter,channel_type="sockets") stars_gravity.particles.add_particles(bodies) # either bodies or just stars stars_gravity.commit_particles() #stars_gravity.set_timestep_parameter(huayno_eta) stars_gravity.parameters.timestep_parameter = huayno_eta stars_gravity.set_inttype_parameter(12) # CC_KEPLER return stars_gravity
def initialize_huayno(bodies, converter, huayno_eta): stars_gravity = Huayno(converter,channel_type="sockets") stars_gravity.particles.add_particles(bodies) # either bodies or just stars stars_gravity.commit_particles() #stars_gravity.set_timestep_parameter(huayno_eta) stars_gravity.parameters.timestep_parameter = huayno_eta stars_gravity.set_inttype_parameter(12) # CC_KEPLER return stars_gravity
def orbit_evolve(bodies, time_peri, eta, n_steps=100): converter = nbody_system.nbody_to_si(1 | units.MSun, 1 | units.AU) gravity = Huayno(converter, channel_type="sockets") gravity.particles.add_particles(bodies) gravity.commit_particles() gravity.parameters.timestep_parameter = eta channel_from_gravity_to_framework = gravity.particles.new_channel_to( bodies) Etot_init = gravity.kinetic_energy + gravity.potential_energy Etot = Etot_init file_snap = "orbit_ini.hdf5" t_end = 2.0 * abs(time_peri.value_in(units.yr)) | units.yr dt = t_end / float(n_steps) time = 0.0 | units.yr while time <= t_end: gravity.evolve_model(time) channel_from_gravity_to_framework.copy() bodies.age = time # checking energy conservation Ekin = gravity.kinetic_energy Epot = gravity.potential_energy Etot = Ekin + Epot dE = Etot_init - Etot # output centerd on the bodies[0] star bodies.position -= bodies[0].position bodies.velocity -= bodies[0].velocity write_set_to_file(bodies, file_snap, "hdf5") rel_r = (bodies[1].position - bodies[0].position).lengths() print " \t\t", time, "\t", dE / Etot_init, rel_r.in_(units.AU) time += dt gravity.stop() bodies.position -= bodies[0].position bodies.velocity -= bodies[0].velocity print bodies return
def orbit_evolve(bodies, time_peri, eta, n_steps=100): converter=nbody_system.nbody_to_si(1|units.MSun,1|units.AU) gravity = Huayno(converter,channel_type="sockets") gravity.particles.add_particles(bodies) gravity.commit_particles() gravity.parameters.timestep_parameter = eta channel_from_gravity_to_framework = gravity.particles.new_channel_to(bodies) Etot_init = gravity.kinetic_energy + gravity.potential_energy Etot = Etot_init file_snap = "orbit_ini.hdf5" t_end = 2.0*abs(time_peri.value_in(units.yr)) | units.yr dt = t_end / float(n_steps) time = 0.0 | units.yr while time <= t_end: gravity.evolve_model(time) channel_from_gravity_to_framework.copy() bodies.age = time # checking energy conservation Ekin = gravity.kinetic_energy Epot = gravity.potential_energy Etot = Ekin + Epot dE = Etot_init-Etot # output centerd on the bodies[0] star bodies.position -= bodies[0].position bodies.velocity -= bodies[0].velocity write_set_to_file(bodies, file_snap, "hdf5") rel_r = (bodies[1].position - bodies[0].position).lengths() print " \t\t", time, "\t", dE/Etot_init, rel_r.in_(units.AU) time += dt gravity.stop() bodies.position -= bodies[0].position bodies.velocity -= bodies[0].velocity print bodies return
def integrate_disk_flyby(stars, planetesimals, t_end, n_steps, snap_dir, file_out, file_redir, huayno_eta): converter = nbody_system.nbody_to_si(1 | units.MSun, 1 | units.AU) planetesimals.position += stars[0].position planetesimals.velocity += stars[0].velocity bodies = ParticlesSuperset([stars, planetesimals]) if file_redir is None: gravity = Huayno(converter, channel_type="sockets", mode="openmp") # Add this (specify a number of cores) elif file_redir == "0": gravity = Huayno(converter, channel_type="sockets", redirection="none", mode="openmp") else: gravity = Huayno(converter, channel_type="sockets", redirection="file", redirect_file=file_redir, mode="openmp") gravity.particles.add_particles(bodies) gravity.commit_particles() gravity.parameters.timestep_parameter = huayno_eta time_step = gravity.get_timestep_parameter() #gravity.set_inttype_parameter(12) #gravity.set_inttype_parameter(8) gravity.set_eps2_parameter(0.001 * 0.001) # Softening Parameter print ' ** timestep: ', gravity.get_timestep_parameter() print ' ** inttype: ', gravity.get_inttype_parameter() print ' ** eps2: ', gravity.get_eps2_parameter(), numpy.sqrt( gravity.get_eps2_parameter()) t0 = time.time() evolve_disk_flyby(bodies, gravity, t_end, n_steps, converter, snap_dir, file_out) t1 = time.time() dt = t1 - t0 print "Performace data: N =", len( bodies), "dt=", dt, "s =", dt / 60.0, "min" return
def initialize_huayno(bodies, converter, huayno_eta): """ initialize huayno code """ gravity = Huayno(converter,channel_type="sockets") gravity.particles.add_particles(bodies) # either bodies or just stars gravity.commit_particles() #gravity.set_timestep_parameter(huayno_eta) gravity.parameters.timestep_parameter = huayno_eta gravity.set_inttype_parameter(8) # CC_KEPLER """ Huayno Options: (pass / hold / bridge / maybe shared? are described in the Huayno Paper) SHARED2=1 EXTRAPOLATE=5 PASS_KDK=2 PASS_DKD=7 HOLD_KDK=3 HOLD_DKD=8 <<<<------- PPASS_DKD=9 BRIDGE_KDK=4 BRIDGE_DKD=10 CC=11 CC_KEPLER=12 <<<<------- OK=13 KEPLER=14 SHARED4=15 SHARED6=18 SHARED8=19 SHARED10=20 SHAREDBS=21 **BS** CCC=22 CCC_KEPLER=23 CC_BS=24 **BS** CCC_BS=25 **BS** BS_CC_KEPLER=26 **BS** CC_BSA=27 **BS** ??? CCC_BSA=28 **BS** ??? SHARED2_COLLISIONS=29 SHARED4_COLLISIONS=30 SHARED6_COLLISIONS=31 SHARED8_COLLISIONS=32 SHARED10_COLLISIONS=33 """ return gravity
def test7(self): print("Test7: Testing effect of Huayno parameter epsilon_squared") convert_nbody = nbody_system.nbody_to_si(1.0 | units.MSun, 1.0 | units.AU) particles = datamodel.Particles(2) sun = particles[0] sun.mass = 1.0 | units.MSun sun.position = [0.0, 0.0, 0.0] | units.AU sun.velocity = [0.0, 0.0, 0.0] | units.AU / units.yr sun.radius = 1.0 | units.RSun earth = particles[1] earth.mass = 5.9736e24 | units.kg earth.radius = 6371.0 | units.km earth.position = [0.0, 1.0, 0.0] | units.AU earth.velocity = [2.0 * numpy.pi, -0.0001, 0.0] | units.AU / units.yr initial_direction = math.atan((earth.velocity[0] / earth.velocity[1])) final_direction = [] for log_eps2 in range(-9, 10, 2): instance = Huayno(convert_nbody) instance.initialize_code() instance.parameters.epsilon_squared = 10.0**log_eps2 | units.AU**2 instance.particles.add_particles(particles) instance.commit_particles() instance.evolve_model(0.25 | units.yr) final_direction.append( math.atan((instance.particles[1].velocity[0] / instance.particles[1].velocity[1]))) instance.stop() # Small values of epsilon_squared should result in normal earth-sun dynamics: rotation of 90 degrees self.assertAlmostEqual(abs(final_direction[0]), abs(initial_direction + math.pi / 2.0), 2) # Large values of epsilon_squared should result in ~ no interaction self.assertAlmostEqual(final_direction[-1], initial_direction, 2) # Outcome is most sensitive to epsilon_squared when epsilon_squared = d(earth, sun)^2 delta = [ abs(final_direction[i + 1] - final_direction[i]) for i in range(len(final_direction) - 1) ] self.assertEqual(delta[len(final_direction) // 2 - 1], max(delta))
def integrate_disk_flyby(stars, planetesimals, t_end, n_steps, snap_dir, file_out, file_redir, huayno_eta): converter=nbody_system.nbody_to_si(1|units.MSun,1|units.AU) planetesimals.position += stars[0].position planetesimals.velocity += stars[0].velocity bodies = ParticlesSuperset([stars, planetesimals]) if file_redir is None: gravity = Huayno(converter, channel_type="sockets", mode="openmp") # Add this (specify a number of cores) elif file_redir=="0": gravity = Huayno(converter, channel_type="sockets", redirection="none", mode="openmp") else: gravity = Huayno(converter, channel_type="sockets", redirection="file", redirect_file=file_redir, mode="openmp") gravity.particles.add_particles(bodies) gravity.commit_particles() gravity.parameters.timestep_parameter = huayno_eta time_step = gravity.get_timestep_parameter() #gravity.set_inttype_parameter(12) #gravity.set_inttype_parameter(8) gravity.set_eps2_parameter(0.001*0.001) # Softening Parameter print ' ** timestep: ', gravity.get_timestep_parameter() print ' ** inttype: ', gravity.get_inttype_parameter() print ' ** eps2: ', gravity.get_eps2_parameter(), numpy.sqrt(gravity.get_eps2_parameter()) t0 = time.time() evolve_disk_flyby(bodies, gravity, t_end, n_steps, converter, snap_dir, file_out) t1= time.time() dt = t1-t0 print "Performace data: N =", len(bodies), "dt=", dt, "s =", dt/60.0, "min" return
def test7(self): print "Test7: Testing effect of Huayno parameter epsilon_squared" convert_nbody = nbody_system.nbody_to_si(1.0 | units.MSun, 1.0 | units.AU) particles = datamodel.Particles(2) sun = particles[0] sun.mass = 1.0 | units.MSun sun.position = [0.0, 0.0, 0.0] | units.AU sun.velocity = [0.0, 0.0, 0.0] | units.AU / units.yr sun.radius = 1.0 | units.RSun earth = particles[1] earth.mass = 5.9736e24 | units.kg earth.radius = 6371.0 | units.km earth.position = [0.0, 1.0, 0.0] | units.AU earth.velocity = [2.0*numpy.pi, -0.0001, 0.0] | units.AU / units.yr initial_direction = math.atan((earth.velocity[0]/earth.velocity[1])) final_direction = [] for log_eps2 in range(-9,10,2): instance = Huayno(convert_nbody) instance.initialize_code() instance.parameters.epsilon_squared = 10.0**log_eps2 | units.AU ** 2 instance.particles.add_particles(particles) instance.commit_particles() instance.evolve_model(0.25 | units.yr) final_direction.append(math.atan((instance.particles[1].velocity[0]/ instance.particles[1].velocity[1]))) instance.stop() # Small values of epsilon_squared should result in normal earth-sun dynamics: rotation of 90 degrees self.assertAlmostEquals(abs(final_direction[0]), abs(initial_direction+math.pi/2.0), 2) # Large values of epsilon_squared should result in ~ no interaction self.assertAlmostEquals(final_direction[-1], initial_direction, 2) # Outcome is most sensitive to epsilon_squared when epsilon_squared = d(earth, sun)^2 delta = [abs(final_direction[i+1]-final_direction[i]) for i in range(len(final_direction)-1)] self.assertEquals(delta[len(final_direction)/2 -1], max(delta))