Exemplo n.º 1
0
def run_diagnostics(
    model,
    logger=None,
    length_unit=units.pc,
    mass_unit=units.MSun,
    time_unit=units.Myr,
):
    """
    Run diagnostics on model
    """
    logger = logger or logging.getLogger(__name__)
    stars = model.star_particles
    sinks = model.sink_particles
    gas = model.gas_particles
    converter = model.star_converter

    if not sinks.is_empty():
        non_collisional_bodies = Particles()
        non_collisional_bodies.add_particles(stars)
        non_collisional_bodies.add_particles(sinks)
    else:
        non_collisional_bodies = stars
    groups = identify_subgroups(
        converter,
        non_collisional_bodies,
        peak_density_threshold=1e-16 | units.g * units.cm**-3,
    )
    n_groups = len(groups)
    if hasattr(stars, 'group_id'):
        group_id_offset = 1 + max(stars.group_id)
    else:
        group_id_offset = 1  # a group id of 0 would mean "no group found"
    logger.info("Found %i groups", n_groups)
    for i, group in enumerate(groups):
        group_id = i + group_id_offset
        if hasattr(group, 'group_id'):
            group.previous_group_id = group.group_id
        else:
            group.previous_group_id = 0
        group.group_id = group_id
        stars_in_group = len(group)
        if (stars_in_group > 100):
            mass_in_group = group.total_mass().in_(mass_unit)
            mass_fraction = [0.01, 0.02, 0.05, 0.1, 0.25, 0.5, 0.75, 0.9, 1.0]
            radii, new_mass_fraction = group.LagrangianRadii(
                unit_converter=converter,
                mf=mass_fraction,
                cm=group.center_of_mass(),
            )
            assert (new_mass_fraction == mass_fraction)
            radii = radii.value_in(length_unit)

            x, y, z = group.center_of_mass().value_in(length_unit)
            median_previous_group_id = numpy.median(group.previous_group_id)
            logger.info(
                "step %i group %i nstars %i mass %s xyz %f %f %f %s origin %i "
                "LR %f %f %f %f %f %f %f %f %f %s",
                model.step,
                group_id,
                stars_in_group,
                mass_in_group,
                x,
                y,
                z,
                length_unit,
                median_previous_group_id,
                radii[0],
                radii[1],
                radii[2],
                radii[3],
                radii[4],
                radii[5],
                radii[6],
                radii[7],
                radii[8],
                length_unit,
            )
    groups = ParticlesSuperset(groups)
    group_identifiers = Particles(keys=groups.key)
    group_identifiers.group_id = groups.group_id
    group_identifiers.previous_group_id = groups.previous_group_id
    return group_identifiers