def test3(self): self.assertRaises( AmuseException, StickySpheres, mass_loss=-0.1, expected_message="Mass-loss fraction must be in the range [0, 1)") self.assertRaises( AmuseException, StickySpheres, mass_loss=1.0, expected_message="Mass-loss fraction must be in the range [0, 1)") particles = Particles(6) particles.mass = range(1, 7) | units.kg particles.position = [[i, 1.0, 2.0] for i in range(1, 7)] | units.m particles.velocity = [[1.0, 0.0, 1.0], [0.0, -1.0, -1.0] ] | units.m / units.s for fraction in [0.01, 0.1, 0.5]: sticky_spheres = StickySpheres(mass_loss=fraction) for i in range(0, 6, 2): colliders = particles[i:i + 2] merged = sticky_spheres.handle_collision( colliders[0], colliders[1]) self.assertTrue(isinstance(merged, Particles)) self.assertAlmostEqual(merged.mass, (2 * i + 3.0) * (1 - fraction) | units.kg) self.assertAlmostEqual(merged.position, [((i + 1)**2 + (i + 2)**2) / (2 * i + 3.0), 1.0, 2.0] | units.m) self.assertAlmostEqual( merged.velocity, ([i + 1, -(i + 2), -1.0] | units.m / units.s) / (2 * i + 3.0))
def test2(self): colliders = Particles(2) colliders.mass = [5, 5] | units.kg colliders.position = [[0.0, 0.0, 0.0], [1.0, 1.0, 1.0]] | units.m colliders.velocity = [[0.0, 0.0, 0.0], [2.0, 2.0, 2.0]] | units.m / units.s merged = StickySpheres(mass_loss=0.2).handle_collision(colliders[0], colliders[1]) self.assertTrue(isinstance(merged, Particles)) self.assertEqual(merged.mass, 8 | units.kg) self.assertAlmostEqual(merged.position, [0.5, 0.5, 0.5] | units.m) self.assertAlmostEqual(merged.velocity, [1.0, 1.0, 1.0] | units.m / units.s) copy = colliders.copy() copy.move_to_center() self.assertAlmostEqual(colliders.kinetic_energy(), merged.as_set().kinetic_energy() / 0.8 + copy.kinetic_energy())
def test1(self): colliders = Particles(2) colliders.mass = [5, 2] | units.kg colliders.position = [[0.0, 0.0, 0.0], [0.7, 1.4, -0.35]] | units.m colliders.velocity = [[0.4, -0.6, 0.0], [0.0, 0.0, -3.0]] | units.m / units.s self.assertAlmostEqual(colliders.center_of_mass_velocity().length(), 1.0 | units.m / units.s) merged = StickySpheres().handle_collision(colliders[0], colliders[1]) self.assertTrue(isinstance(merged, Particles)) self.assertEqual(merged.mass, 7 | units.kg) self.assertAlmostEqual(merged.position, [0.2, 0.4, -0.1] | units.m) self.assertAlmostEqual(merged.velocity, ([2.0, -3.0, -6.0] | units.m / units.s) / 7.0) self.assertAlmostEqual(merged.velocity.length(), 1.0 | units.m / units.s) copy = colliders.copy() copy.move_to_center() self.assertAlmostEqual(colliders.kinetic_energy(), merged.as_set().kinetic_energy() + copy.kinetic_energy())
def test9(self): print "Test CollisionHandler with gravity code and StickySpheres collision code" gravity = GravityCodeForTesting() self.assertEqual(len(gravity.particles), 6) gravity.particles.mass = [ 1, 1, 2, 2, 3, 3, ] | units.MSun gravity.particles.radius = range(101, 107) | units.RSun collision_code = StickySpheres(mass_loss=0.1) handler = CollisionHandler(collision_code, gravity_code=gravity) merged = handler.handle_collisions(gravity.particles[::2], gravity.particles[1::2]) self.assertTrue(isinstance(merged, Particles)) self.assertEqual(len(merged), 3) self.assertEqual(merged.mass, 0.9 * ([2, 4, 6] | units.MSun)) self.assertEqual(len(gravity.particles), 3) self.assertEqual(gravity.particles.mass, 0.9 * ([2, 4, 6] | units.MSun)) self.assertEqual(gravity.particles.radius, [102, 104, 106] | units.RSun) self.assertAlmostEqual( gravity.particles.position, [[0.5, 1.0, 1.5], [2.5, 5.0, 7.5], [4.5, 9.0, 13.5]] | units.AU) self.assertAlmostEqual( gravity.particles.velocity, [[0.5, 0.5, 0.5], [2.5, 6.5, 17.5], [4.5, 20.5, 94.5]] | units.km / units.s)
def test3(self): self.assertRaises(AmuseException, StickySpheres, mass_loss=-0.1, expected_message= "Mass-loss fraction must be in the range [0, 1)") self.assertRaises(AmuseException, StickySpheres, mass_loss=1.0, expected_message= "Mass-loss fraction must be in the range [0, 1)") particles = Particles(6) particles.mass = range(1, 7) | units.kg particles.position = [[i, 1.0, 2.0] for i in range(1, 7)] | units.m particles.velocity = [[1.0, 0.0, 1.0], [0.0, -1.0, -1.0]] | units.m / units.s for fraction in [0.01, 0.1, 0.5]: sticky_spheres = StickySpheres(mass_loss=fraction) for i in range(0, 6, 2): colliders = particles[i:i+2] merged = sticky_spheres.handle_collision(colliders[0], colliders[1]) self.assertTrue(isinstance(merged, Particles)) self.assertAlmostEqual(merged.mass, (2 * i +3.0) * (1 - fraction) | units.kg) self.assertAlmostEqual(merged.position, [((i+1)**2 + (i+2)**2)/(2*i+3.0), 1.0, 2.0] | units.m) self.assertAlmostEqual(merged.velocity, ([i+1, -(i+2), -1.0] | units.m / units.s) / (2*i+3.0))