/******************************************************************************* * This file is part of SWIFT. * Copyright (c) 2012 Pedro Gonnet (pedro.gonnet@durham.ac.uk) * Matthieu Schaller (schaller@strw.leidenuniv.nl) * 2015 Peter W. Draper (p.w.draper@durham.ac.uk) * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published * by the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . * ******************************************************************************/ /* Config parameters. */ #include /* This object's header. */ #include "space.h" /* Local headers. */ #include "adaptive_softening.h" #include "black_holes.h" #include "chemistry.h" #include "engine.h" #include "gravity.h" #include "mhd.h" #include "rt.h" #include "sink.h" #include "star_formation.h" #include "stars.h" #include "threadpool.h" #include "tracers.h" void space_init_parts_mapper(void *restrict map_data, int count, void *restrict extra_data) { struct part *restrict parts = (struct part *)map_data; const struct engine *restrict e = (struct engine *)extra_data; const struct hydro_space *restrict hs = &e->s->hs; const int with_cosmology = (e->policy & engine_policy_cosmology); size_t ind = parts - e->s->parts; struct xpart *restrict xparts = e->s->xparts + ind; for (int k = 0; k < count; k++) { hydro_init_part(&parts[k], hs); adaptive_softening_init_part(&parts[k]); mhd_init_part(&parts[k]); black_holes_init_potential(&parts[k].black_holes_data); chemistry_init_part(&parts[k], e->chemistry); rt_init_part(&parts[k]); rt_reset_part(&parts[k], e->cosmology); star_formation_init_part(&parts[k], e->star_formation); tracers_after_init(&parts[k], &xparts[k], e->internal_units, e->physical_constants, with_cosmology, e->cosmology, e->hydro_properties, e->cooling_func, e->time); sink_init_part(&parts[k], e->sink_properties); } } /** * @brief Calls the #part initialisation function on all particles in the space. * * @param s The #space. * @param verbose Are we talkative? */ void space_init_parts(struct space *s, int verbose) { const ticks tic = getticks(); if (s->nr_parts > 0) threadpool_map(&s->e->threadpool, space_init_parts_mapper, s->parts, s->nr_parts, sizeof(struct part), threadpool_auto_chunk_size, s->e); if (verbose) message("took %.3f %s.", clocks_from_ticks(getticks() - tic), clocks_getunit()); } void space_init_gparts_mapper(void *restrict map_data, int count, void *restrict extra_data) { struct gpart *gparts = (struct gpart *)map_data; for (int k = 0; k < count; k++) gravity_init_gpart(&gparts[k]); } /** * @brief Calls the #gpart initialisation function on all particles in the * space. * * @param s The #space. * @param verbose Are we talkative? */ void space_init_gparts(struct space *s, int verbose) { const ticks tic = getticks(); if (s->nr_gparts > 0) threadpool_map(&s->e->threadpool, space_init_gparts_mapper, s->gparts, s->nr_gparts, sizeof(struct gpart), threadpool_auto_chunk_size, /*extra_data=*/NULL); if (verbose) message("took %.3f %s.", clocks_from_ticks(getticks() - tic), clocks_getunit()); } void space_init_sparts_mapper(void *restrict map_data, int scount, void *restrict extra_data) { struct spart *restrict sparts = (struct spart *)map_data; for (int k = 0; k < scount; k++) { stars_init_spart(&sparts[k]); rt_init_spart(&sparts[k]); rt_reset_spart(&sparts[k]); } } /** * @brief Calls the #spart initialisation function on all particles in the * space. * * @param s The #space. * @param verbose Are we talkative? */ void space_init_sparts(struct space *s, int verbose) { const ticks tic = getticks(); if (s->nr_sparts > 0) threadpool_map(&s->e->threadpool, space_init_sparts_mapper, s->sparts, s->nr_sparts, sizeof(struct spart), threadpool_auto_chunk_size, /*extra_data=*/NULL); if (verbose) message("took %.3f %s.", clocks_from_ticks(getticks() - tic), clocks_getunit()); } void space_init_bparts_mapper(void *restrict map_data, int bcount, void *restrict extra_data) { struct bpart *restrict bparts = (struct bpart *)map_data; for (int k = 0; k < bcount; k++) black_holes_init_bpart(&bparts[k]); } /** * @brief Calls the #bpart initialisation function on all particles in the * space. * * @param s The #space. * @param verbose Are we talkative? */ void space_init_bparts(struct space *s, int verbose) { const ticks tic = getticks(); if (s->nr_bparts > 0) threadpool_map(&s->e->threadpool, space_init_bparts_mapper, s->bparts, s->nr_bparts, sizeof(struct bpart), threadpool_auto_chunk_size, /*extra_data=*/NULL); if (verbose) message("took %.3f %s.", clocks_from_ticks(getticks() - tic), clocks_getunit()); } void space_init_sinks_mapper(void *restrict map_data, int sink_count, void *restrict extra_data) { struct sink *restrict sinks = (struct sink *)map_data; for (int k = 0; k < sink_count; k++) sink_init_sink(&sinks[k]); } /** * @brief Calls the #sink initialisation function on all particles in the * space. * * @param s The #space. * @param verbose Are we talkative? */ void space_init_sinks(struct space *s, int verbose) { const ticks tic = getticks(); if (s->nr_sinks > 0) threadpool_map(&s->e->threadpool, space_init_sinks_mapper, s->sinks, s->nr_sinks, sizeof(struct sink), threadpool_auto_chunk_size, /*extra_data=*/NULL); if (verbose) message("took %.3f %s.", clocks_from_ticks(getticks() - tic), clocks_getunit()); }