def create_stars_without_wind_attributes(self): stars = Particles(2) stars.mass = 2 | units.MSun stars.radius = 2 | units.RSun stars.temperature = 5000 | units.K stars.luminosity = 2 | units.LSun stars.age = 0 | units.Myr stars[0].position = [1, 1, 1] | units.parsec stars[1].position = [-1, -1, -1] | units.parsec stars[0].velocity = [-1000, 0, 1000] | units.ms stars[1].velocity = [0, 0, 0] | units.ms return stars
def new_stars_from_sink(origin, upper_mass_limit=125 | units.MSun, lower_mass_limit=0.1 | units.MSun, default_radius=0.25 | units.pc, velocity_dispersion=1 | units.kms, logger=None, initial_mass_function="kroupa", distribution="random", randomseed=None, **keyword_arguments): """ Form stars from an origin particle that keeps track of the properties of this region. """ logger = logger or logging.getLogger(__name__) if randomseed is not None: logger.info("setting random seed to %i", randomseed) numpy.random.seed(randomseed) try: initialised = origin.initialised except AttributeError: initialised = False if not initialised: logger.debug("Initialising origin particle %i for star formation", origin.key) next_mass = new_star_cluster( initial_mass_function=initial_mass_function, upper_mass_limit=upper_mass_limit, lower_mass_limit=lower_mass_limit, number_of_stars=1, **keyword_arguments) origin.next_primary_mass = next_mass[0].mass origin.initialised = True if origin.mass < origin.next_primary_mass: logger.debug( "Not enough in star forming region %i to form the next star", origin.key) return Particles() mass_reservoir = origin.mass - origin.next_primary_mass stellar_masses = new_star_cluster( stellar_mass=mass_reservoir, upper_mass_limit=upper_mass_limit, lower_mass_limit=lower_mass_limit, imf=initial_mass_function, ).mass number_of_stars = len(stellar_masses) new_stars = Particles(number_of_stars) new_stars.age = 0 | units.yr new_stars[0].mass = origin.next_primary_mass new_stars[1:].mass = stellar_masses[:-1] origin.next_primary_mass = stellar_masses[-1] new_stars.position = origin.position new_stars.velocity = origin.velocity try: radius = origin.radius except AttributeError: radius = default_radius rho = numpy.random.random(number_of_stars) * radius theta = (numpy.random.random(number_of_stars) * (2 * numpy.pi | units.rad)) phi = (numpy.random.random(number_of_stars) * numpy.pi | units.rad) x = rho * sin(phi) * cos(theta) y = rho * sin(phi) * sin(theta) z = rho * cos(phi) new_stars.x += x new_stars.y += y new_stars.z += z velocity_magnitude = numpy.random.normal( scale=velocity_dispersion.value_in(units.kms), size=number_of_stars, ) | units.kms velocity_theta = (numpy.random.random(number_of_stars) * (2 * numpy.pi | units.rad)) velocity_phi = (numpy.random.random(number_of_stars) * (numpy.pi | units.rad)) vx = velocity_magnitude * sin(velocity_phi) * cos(velocity_theta) vy = velocity_magnitude * sin(velocity_phi) * sin(velocity_theta) vz = velocity_magnitude * cos(velocity_phi) new_stars.vx += vx new_stars.vy += vy new_stars.vz += vz new_stars.origin = origin.key origin.mass -= new_stars.total_mass() return new_stars