def test6(self): print "Testing additional parameters for initialization..." instance = BSE() instance.initialize_code() self.assertEqual(instance.parameters.reimers_mass_loss_coefficient, 0.5) myvalue = 0.7 instance.parameters.reimers_mass_loss_coefficient = myvalue self.assertEqual(instance.parameters.reimers_mass_loss_coefficient, myvalue) instance.commit_parameters() self.assertEqual(instance.parameters.reimers_mass_loss_coefficient, myvalue) instance.stop() instance = BSE() self.assertEqual(instance.parameters.reimers_mass_loss_coefficient, 0.5) myvalue = 0.7 instance.parameters.reimers_mass_loss_coefficient = myvalue instance.parameters.set_defaults() instance.commit_parameters() self.assertEqual(instance.parameters.reimers_mass_loss_coefficient, 0.5) instance.stop()
def test8(self): print( "Testing adding and removing particles from stellar evolution code..." ) instance = BSE() instance.initialize_code() stars = Particles(6) stars.mass = [1.0, 1.0, 1.0, 0.2, 0.2, 0.2] | units.MSun binaries = Particles(3) binaries.eccentricity = 0.0 for i in range(3): binaries[i].child1 = stars[i] binaries[i].child2 = stars[i + 3] orbital_period = 200.0 | units.day semi_major_axis = instance.orbital_period_to_semi_major_axis( orbital_period, binaries.child1.as_set().mass, binaries.child2.as_set().mass) binaries.semi_major_axis = semi_major_axis instance.commit_parameters() self.assertEqual(len(instance.particles), 0) self.assertEqual(len(instance.binaries), 0) # before creation instance.particles.add_particles(stars) instance.binaries.add_particles(binaries[:-1]) instance.commit_particles() instance.evolve_model(1.0 | units.Myr) self.assertEqual(len(instance.binaries), 2) # before remove self.assertAlmostEqual(instance.binaries.age, 1.0 | units.Myr) instance.binaries.remove_particle(binaries[0]) self.assertEqual(len(instance.binaries), 1) instance.evolve_model(2.0 | units.Myr) self.assertAlmostEqual(instance.binaries[0].age, 2.0 | units.Myr) instance.binaries.add_particles(binaries[::2]) self.assertEqual(len(instance.binaries), 3) # it's back... self.assertAlmostEqual(instance.binaries[0].age, 2.0 | units.Myr) self.assertAlmostEqual(instance.binaries[1].age, 0.0 | units.Myr) self.assertAlmostEqual(instance.binaries[2].age, 0.0 | units.Myr) # ... and rejuvenated. instance.evolve_model( 3.0 | units.Myr ) # The young stars keep their age offset from the old star self.assertAlmostEqual(instance.binaries.age, [3.0, 1.0, 1.0] | units.Myr) instance.evolve_model(4.0 | units.Myr) self.assertAlmostEqual(instance.binaries.age, [4.0, 2.0, 2.0] | units.Myr) instance.stop()
def test8(self): print "Testing adding and removing particles from stellar evolution code..." instance = BSE() instance.initialize_code() stars = Particles(6) stars.mass = [1.0, 1.0, 1.0, 0.2, 0.2, 0.2] | units.MSun binaries = Particles(3) binaries.eccentricity = 0.0 for i in range(3): binaries[i].child1 = stars[i] binaries[i].child2 = stars[i + 3] orbital_period = 200.0 | units.day semi_major_axis = instance.orbital_period_to_semi_major_axis( orbital_period, binaries.child1.as_set().mass, binaries.child2.as_set().mass ) binaries.semi_major_axis = semi_major_axis instance.commit_parameters() self.assertEquals(len(instance.particles), 0) self.assertEquals(len(instance.binaries), 0) # before creation instance.particles.add_particles(stars) instance.binaries.add_particles(binaries[:-1]) instance.commit_particles() instance.evolve_model(1.0 | units.Myr) self.assertEquals(len(instance.binaries), 2) # before remove self.assertAlmostEqual(instance.binaries.age, 1.0 | units.Myr) instance.binaries.remove_particle(binaries[0]) self.assertEquals(len(instance.binaries), 1) instance.evolve_model(2.0 | units.Myr) self.assertAlmostEqual(instance.binaries[0].age, 2.0 | units.Myr) instance.binaries.add_particles(binaries[::2]) self.assertEquals(len(instance.binaries), 3) # it's back... self.assertAlmostEqual(instance.binaries[0].age, 2.0 | units.Myr) self.assertAlmostEqual(instance.binaries[1].age, 0.0 | units.Myr) self.assertAlmostEqual(instance.binaries[2].age, 0.0 | units.Myr) # ... and rejuvenated. instance.evolve_model(3.0 | units.Myr) # The young stars keep their age offset from the old star self.assertAlmostEqual(instance.binaries.age, [3.0, 1.0, 1.0] | units.Myr) instance.evolve_model(4.0 | units.Myr) self.assertAlmostEqual(instance.binaries.age, [4.0, 2.0, 2.0] | units.Myr) instance.stop()
def test6(self): print "Testing additional parameters for initialization..." instance = BSE() instance.initialize_code() self.assertEqual(instance.parameters.reimers_mass_loss_coefficient, 0.5) myvalue = 0.7 instance.parameters.reimers_mass_loss_coefficient = myvalue self.assertEqual(instance.parameters.reimers_mass_loss_coefficient, myvalue) instance.commit_parameters() self.assertEqual(instance.parameters.reimers_mass_loss_coefficient, myvalue) instance.stop() instance = BSE() self.assertEqual(instance.parameters.reimers_mass_loss_coefficient, 0.5) myvalue = 0.7 instance.parameters.reimers_mass_loss_coefficient = myvalue instance.parameters.set_defaults() instance.commit_parameters() self.assertEqual(instance.parameters.reimers_mass_loss_coefficient, 0.5) instance.stop()
def test9(self): print "Testing BSE states" instance = BSE() stars = Particles(2) stars.mass = [1.0, 0.2] | units.MSun binaries = Particles(1) orbital_period = 200.0 | units.day semi_major_axis = instance.orbital_period_to_semi_major_axis( orbital_period, stars[0].mass, stars[1].mass) binaries.semi_major_axis = semi_major_axis binaries.eccentricity = 0.0 binaries[0].child1 = stars[0] binaries[0].child2 = stars[1] print "First do everything manually:", self.assertEquals(instance.get_name_of_current_state(), 'UNINITIALIZED') instance.initialize_code() self.assertEquals(instance.get_name_of_current_state(), 'INITIALIZED') instance.commit_parameters() self.assertEquals(instance.get_name_of_current_state(), 'RUN') instance.cleanup_code() self.assertEquals(instance.get_name_of_current_state(), 'END') instance.stop() print "ok" print "initialize_code(), commit_parameters(), " \ "and cleanup_code() should be called automatically:", instance = BSE() self.assertEquals(instance.get_name_of_current_state(), 'UNINITIALIZED') instance.parameters.reimers_mass_loss_coefficient = 0.5 self.assertEquals(instance.get_name_of_current_state(), 'INITIALIZED') instance.particles.add_particles(stars) instance.binaries.add_particles(binaries) self.assertEquals(instance.get_name_of_current_state(), 'RUN') instance.stop() self.assertEquals(instance.get_name_of_current_state(), 'STOPPED') print "ok"
def test9(self): print "Testing BSE states" instance = BSE() stars = Particles(2) stars.mass = [1.0, 0.2] | units.MSun binaries = Particles(1) orbital_period = 200.0 | units.day semi_major_axis = instance.orbital_period_to_semi_major_axis(orbital_period, stars[0].mass, stars[1].mass) binaries.semi_major_axis = semi_major_axis binaries.eccentricity = 0.0 binaries[0].child1 = stars[0] binaries[0].child2 = stars[1] print "First do everything manually:", self.assertEquals(instance.get_name_of_current_state(), "UNINITIALIZED") instance.initialize_code() self.assertEquals(instance.get_name_of_current_state(), "INITIALIZED") instance.commit_parameters() self.assertEquals(instance.get_name_of_current_state(), "RUN") instance.cleanup_code() self.assertEquals(instance.get_name_of_current_state(), "END") instance.stop() print "ok" print "initialize_code(), commit_parameters(), " "and cleanup_code() should be called automatically:", instance = BSE() self.assertEquals(instance.get_name_of_current_state(), "UNINITIALIZED") instance.parameters.reimers_mass_loss_coefficient = 0.5 self.assertEquals(instance.get_name_of_current_state(), "INITIALIZED") instance.particles.add_particles(stars) instance.binaries.add_particles(binaries) self.assertEquals(instance.get_name_of_current_state(), "RUN") instance.stop() self.assertEquals(instance.get_name_of_current_state(), "STOPPED") print "ok"
def test1(self): print "Testing evolution of a close binary system..." instance = BSE() instance.initialize_code() instance.parameters.metallicity = 0.001 instance.parameters.common_envelope_efficiency = 3.0 instance.parameters.Eddington_mass_transfer_limit_factor = 10.0 instance.commit_parameters() stars = Particles(2) stars[0].mass = 3.0 | units.MSun stars[1].mass = 0.3 | units.MSun orbital_period = 200.0 | units.day semi_major_axis = instance.orbital_period_to_semi_major_axis( orbital_period, stars[0].mass, stars[1].mass) instance.particles.add_particles(stars) binaries = Particles(1) binary = binaries[0] binary.semi_major_axis = semi_major_axis binary.eccentricity = 0.5 binary.child1 = stars[0] binary.child2 = stars[1] instance.binaries.add_particles(binaries) from_bse_to_model = instance.particles.new_channel_to(stars) from_bse_to_model.copy() from_bse_to_model_binaries = instance.binaries.new_channel_to(binaries) from_bse_to_model_binaries.copy() previous_type = binary.child1.stellar_type results = [] current_time = 0 | units.Myr while current_time < (480 | units.Myr): instance.update_time_steps() # The next line appears a bit weird, but saves time for this simple test. current_time = current_time + max( 5.0 * instance.binaries[0].time_step, 0.3 | units.Myr) instance.evolve_model(current_time) from_bse_to_model.copy() from_bse_to_model_binaries.copy() if not binary.child1.stellar_type == previous_type: results.append((binary.age, binary.child1.mass, binary.child1.stellar_type)) previous_type = binary.child1.stellar_type self.assertEqual(len(results), 6) types = ( "Hertzsprung Gap", "First Giant Branch", "Core Helium Burning", "First Asymptotic Giant Branch", "Hertzsprung Gap Naked Helium star", "Carbon/Oxygen White Dwarf", ) for result, expected in zip(results, types): self.assertEquals(str(result[2]), expected) times = ( 284.8516 | units.Myr, 287.0595 | units.Myr, 287.7848 | units.Myr, 331.1454 | units.Myr, 331.3983 | units.Myr, 332.2786 | units.Myr, ) for result, expected in zip(results, times): self.assertAlmostEqual(result[0].value_in(units.Myr), expected.value_in(units.Myr), 0) masses = ( 3.000 | units.MSun, 3.000 | units.MSun, 2.999 | units.MSun, 2.956 | units.MSun, 0.888 | units.MSun, 0.707 | units.MSun, ) for result, expected in zip(results, masses): self.assertAlmostEqual(result[1].value_in(units.MSun), expected.value_in(units.MSun), 2) instance.stop()
def test1(self): print "Testing evolution of a close binary system..." instance = BSE() instance.initialize_code() instance.parameters.metallicity = 0.001 instance.parameters.common_envelope_efficiency = 3.0 instance.parameters.Eddington_mass_transfer_limit_factor = 10.0 instance.commit_parameters() stars = Particles(2) stars[0].mass = 3.0 | units.MSun stars[1].mass = 0.3 | units.MSun orbital_period = 200.0 | units.day semi_major_axis = instance.orbital_period_to_semi_major_axis(orbital_period, stars[0].mass, stars[1].mass) instance.particles.add_particles(stars) binaries = Particles(1) binary = binaries[0] binary.semi_major_axis = semi_major_axis binary.eccentricity = 0.5 binary.child1 = stars[0] binary.child2 = stars[1] instance.binaries.add_particles(binaries) from_bse_to_model = instance.particles.new_channel_to(stars) from_bse_to_model.copy() from_bse_to_model_binaries = instance.binaries.new_channel_to(binaries) from_bse_to_model_binaries.copy() previous_type = binary.child1.stellar_type results = [] current_time = 0 | units.Myr while current_time < (480 | units.Myr): instance.update_time_steps() # The next line appears a bit weird, but saves time for this simple test. current_time = current_time + max(5.0 * instance.binaries[0].time_step, 0.3 | units.Myr) instance.evolve_model(current_time) from_bse_to_model.copy() from_bse_to_model_binaries.copy() if not binary.child1.stellar_type == previous_type: results.append((binary.age, binary.child1.mass, binary.child1.stellar_type)) previous_type = binary.child1.stellar_type self.assertEqual(len(results), 6) types = ( "Hertzsprung Gap", "First Giant Branch", "Core Helium Burning", "First Asymptotic Giant Branch", "Hertzsprung Gap Naked Helium star", "Carbon/Oxygen White Dwarf", ) for result, expected in zip(results, types): self.assertEquals(str(result[2]), expected) times = ( 284.8516 | units.Myr, 287.0595 | units.Myr, 287.7848 | units.Myr, 331.1454 | units.Myr, 331.3983 | units.Myr, 332.2786 | units.Myr, ) for result, expected in zip(results, times): self.assertAlmostEqual(result[0].value_in(units.Myr), expected.value_in(units.Myr), 0) masses = ( 3.000 | units.MSun, 3.000 | units.MSun, 2.999 | units.MSun, 2.956 | units.MSun, 0.888 | units.MSun, 0.707 | units.MSun, ) for result, expected in zip(results, masses): self.assertAlmostEqual(result[1].value_in(units.MSun), expected.value_in(units.MSun), 2) instance.stop()