def merge_two_stars(bodies, particles_in_encounter): """ Merge two stars into one """ com_pos = particles_in_encounter.center_of_mass() com_vel = particles_in_encounter.center_of_mass_velocity() star_0 = particles_in_encounter[0] star_1 = particles_in_encounter[1] new_particle = Particles(1) new_particle.birth_age = particles_in_encounter.birth_age.min() new_particle.mass = particles_in_encounter.total_mass() new_particle.age = min(particles_in_encounter.age) \ * max(particles_in_encounter.mass)/new_particle.mass new_particle.position = com_pos new_particle.velocity = com_vel new_particle.name = "Star" new_particle.radius = particles_in_encounter.radius.max() print("# old radius:", particles_in_encounter.radius.in_(units.AU)) print("# new radius:", new_particle.radius.in_(units.AU)) bodies.add_particles(new_particle) print("# Two stars (M=", particles_in_encounter.mass.in_(units.MSun), ") collided at d=", (star_0.position - star_1.position).length().in_(units.AU)) bodies.remove_particles(particles_in_encounter)
def resolve_sinks(self): print "processing high dens particles...", highdens=self.gas_particles.select_array(lambda rho:rho>self.density_threshold,["rho"]) print "N=", len(highdens) candidate_stars=highdens.copy() self.gas_particles.remove_particles(highdens) self.gas_particles.synchronize_to(self.code.gas_particles) print "new sinks..." if len(candidate_stars)>0: # had to make some changes to prevent double adding particles print "Adding stars, N=", len(candidate_stars) newstars_in_code = self.code.dm_particles.add_particles(candidate_stars) newstars = Particles() for nsi in newstars_in_code: if nsi not in self.star_particles: newstars.add_particle(nsi) else: print "this star should not exicst" newstars.name = "Star" newstars.birth_age = self.code.model_time newstars.Lx = 0 | (units.g * units.m**2)/units.s newstars.Ly = 0 | (units.g * units.m**2)/units.s newstars.Lz = 0 | (units.g * units.m**2)/units.s print "pre N=", len(self.star_particles), len(newstars), len(self.code.dm_particles) #self.star_particles.add_sinks(newstars) self.star_particles.add_particles(newstars) print "post N=", len(self.star_particles), len(newstars), len(self.code.dm_particles) else: print "N candidates:", len(candidate_stars)
def merge_two_stars(bodies, particles_in_encounter): com_pos = particles_in_encounter.center_of_mass() com_vel = particles_in_encounter.center_of_mass_velocity() new_particle=Particles(1) mu = particles_in_encounter[0].mass/particles_in_encounter.mass.sum() new_particle.birth_age = particles_in_encounter.birth_age.min() new_particle.mass = particles_in_encounter.total_mass() new_particle.position = com_pos new_particle.velocity = com_vel new_particle.name = "Star" new_particle.radius = particles_in_encounter.radius.max() print "old radius:", particles_in_encounter.radius.value_in(units.AU) print "new radius:", new_particle.radius.value_in(units.AU) bodies.add_particles(new_particle) print "Two stars (M=",particles_in_encounter.mass,") collided at d=", com_pos.length() bodies.remove_particles(particles_in_encounter)
def merge_two_stars(bodies, particles_in_encounter): com_pos = particles_in_encounter.center_of_mass() com_vel = particles_in_encounter.center_of_mass_velocity() new_particle = Particles(1) mu = particles_in_encounter[0].mass / particles_in_encounter.mass.sum() new_particle.birth_age = particles_in_encounter.birth_age.min() new_particle.mass = particles_in_encounter.total_mass() new_particle.position = com_pos new_particle.velocity = com_vel new_particle.name = "Star" new_particle.radius = particles_in_encounter.radius.max() print("old radius:", particles_in_encounter.radius.value_in(units.AU)) print("new radius:", new_particle.radius.value_in(units.AU)) bodies.add_particles(new_particle) print("Two stars (M=", particles_in_encounter.mass, ") collided at d=", com_pos.length()) bodies.remove_particles(particles_in_encounter)
def resolve_sinks(self): print("processing high dens particles...", end=' ') highdens = self.gas_particles.select_array( lambda rho: rho > self.density_threshold, ["rho"]) print("N=", len(highdens)) candidate_stars = highdens.copy() self.gas_particles.remove_particles(highdens) self.gas_particles.synchronize_to(self.code.gas_particles) print("new sinks...") if len( candidate_stars ) > 0: # had to make some changes to prevent double adding particles print("Adding stars, N=", len(candidate_stars)) newstars_in_code = self.code.dm_particles.add_particles( candidate_stars) newstars = Particles() for nsi in newstars_in_code: if nsi not in self.star_particles: newstars.add_particle(nsi) else: print("this star should not exicst") newstars.name = "Star" newstars.birth_age = self.code.model_time newstars.Lx = 0 | (units.g * units.m**2) / units.s newstars.Ly = 0 | (units.g * units.m**2) / units.s newstars.Lz = 0 | (units.g * units.m**2) / units.s print("pre N=", len(self.star_particles), len(newstars), len(self.code.dm_particles)) # self.star_particles.add_sinks(newstars) self.star_particles.add_particles(newstars) print("post N=", len(self.star_particles), len(newstars), len(self.code.dm_particles)) else: print("N candidates:", len(candidate_stars))