def get_galaxies_in_orbit(m_a=10.e11|units.MSun, m_b=10.e11|units.MSun, ecc=0.5, r_min=25.|units.kpc, t_start=None): """ binary galaxy with orbit of given parameters -- if ecc=>1, start at t_start (p625, t_start=-10=-10*100Myr) -- if ecc<1, start at apocenter (p644) """ converter=nbody_system.nbody_to_si(m_a+m_b,1|units.kpc) semi = r_min/(1.-ecc) # relative position and velocity vectors at the pericenter using kepler kepler = Kepler_twobody(converter) kepler.initialize_code() kepler.initialize_from_elements(mass=(m_a+m_b), semi=semi, ecc=ecc, periastron=r_min) # at periastron # evolve back till initial position if ( ecc<1. ): kepler.return_to_apastron() else: kepler.transform_to_time(t_start) # get time of the orbit t_orbit = kepler.get_time() rl = kepler.get_separation_vector() r = [rl[0].value_in(units.AU), rl[1].value_in(units.AU), rl[2].value_in(units.AU)] | units.AU vl = kepler.get_velocity_vector() v = [vl[0].value_in(units.kms), vl[1].value_in(units.kms), vl[2].value_in(units.kms)] | units.kms kepler.stop() # assign particle atributes galaxies = Particles(2) galaxies[0].mass = m_a galaxies[0].position = (0,0,0) | units.AU galaxies[0].velocity = (0,0,0) | units.kms galaxies[1].mass = m_b galaxies[1].position = r galaxies[1].velocity = v # identification galaxies[0].id = 'a0' galaxies[1].id = 'b0' galaxies.move_to_center() return galaxies, t_orbit