/******************************************************************************* * 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 /* MPI headers. */ #ifdef WITH_MPI #include #endif /* This object's header. */ #include "runner.h" /* Local headers. */ #include "engine.h" #include "feedback.h" #include "scheduler.h" #include "space_getsid.h" #include "timers.h" /* Import the gravity loop functions. */ #include "runner_doiact_grav.h" /* Import the density loop functions. */ #define FUNCTION density #define FUNCTION_TASK_LOOP TASK_LOOP_DENSITY #include "runner_doiact_hydro.h" #include "runner_doiact_undef.h" /* Import the gradient loop functions (if required). */ #ifdef EXTRA_HYDRO_LOOP #define FUNCTION gradient #define FUNCTION_TASK_LOOP TASK_LOOP_GRADIENT #include "runner_doiact_hydro.h" #include "runner_doiact_undef.h" #endif /* Import the force loop functions. */ #define FUNCTION force #define FUNCTION_TASK_LOOP TASK_LOOP_FORCE #include "runner_doiact_hydro.h" #include "runner_doiact_undef.h" /* Import the limiter loop functions. */ #define FUNCTION limiter #define FUNCTION_TASK_LOOP TASK_LOOP_LIMITER #include "runner_doiact_limiter.h" #include "runner_doiact_undef.h" /* Import the stars density loop functions. */ #define FUNCTION density #define FUNCTION_TASK_LOOP TASK_LOOP_DENSITY #include "runner_doiact_stars.h" #include "runner_doiact_undef.h" #ifdef EXTRA_STAR_LOOPS /* Import the stars prepare1 loop functions. */ #define FUNCTION prep1 #define FUNCTION_TASK_LOOP TASK_LOOP_STARS_PREP1 #include "runner_doiact_stars.h" #include "runner_doiact_undef.h" /* Import the stars prepare2 loop functions. */ #define FUNCTION prep2 #define FUNCTION_TASK_LOOP TASK_LOOP_STARS_PREP2 #include "runner_doiact_stars.h" #include "runner_doiact_undef.h" #endif /* EXTRA_STAR_LOOPS */ /* Import the stars feedback loop functions. */ #define FUNCTION feedback #define FUNCTION_TASK_LOOP TASK_LOOP_FEEDBACK #include "runner_doiact_stars.h" #include "runner_doiact_undef.h" /* Import the black hole density loop functions. */ #define FUNCTION density #define FUNCTION_TASK_LOOP TASK_LOOP_DENSITY #include "runner_doiact_black_holes.h" #include "runner_doiact_undef.h" /* Import the black hole feedback loop functions. */ #define FUNCTION swallow #define FUNCTION_TASK_LOOP TASK_LOOP_SWALLOW #include "runner_doiact_black_holes.h" #include "runner_doiact_undef.h" /* Import the black hole feedback loop functions. */ #define FUNCTION feedback #define FUNCTION_TASK_LOOP TASK_LOOP_FEEDBACK #include "runner_doiact_black_holes.h" #include "runner_doiact_undef.h" /* Import the sink density loop functions. */ #define FUNCTION density #define FUNCTION_TASK_LOOP TASK_LOOP_DENSITY #include "runner_doiact_sinks.h" #include "runner_doiact_undef.h" /* Import the sink swallow loop functions. */ #define FUNCTION swallow #define FUNCTION_TASK_LOOP TASK_LOOP_SWALLOW #include "runner_doiact_sinks.h" #include "runner_doiact_undef.h" /* Import the RT gradient loop functions */ #define FUNCTION rt_gradient #define FUNCTION_TASK_LOOP TASK_LOOP_RT_GRADIENT #include "runner_doiact_hydro.h" #include "runner_doiact_undef.h" /* Import the RT transport (force) loop functions. */ #define FUNCTION rt_transport #define FUNCTION_TASK_LOOP TASK_LOOP_RT_TRANSPORT #include "runner_doiact_hydro.h" #include "runner_doiact_undef.h" /** * @brief The #runner main thread routine. * * @param data A pointer to this thread's data. */ void *runner_main(void *data) { struct runner *r = (struct runner *)data; struct engine *e = r->e; struct scheduler *sched = &e->sched; /* Main loop. */ while (1) { /* Wait at the barrier. */ engine_barrier(e); /* Can we go home yet? */ if (e->step_props & engine_step_prop_done) break; /* Re-set the pointer to the previous task, as there is none. */ struct task *t = NULL; struct task *prev = NULL; /* Loop while there are tasks... */ while (1) { /* If there's no old task, try to get a new one. */ if (t == NULL) { /* Get the task. */ TIMER_TIC t = scheduler_gettask(sched, r->qid, prev); TIMER_TOC(timer_gettask); /* Did I get anything? */ if (t == NULL) break; } /* Get the cells. */ struct cell *ci = t->ci; struct cell *cj = t->cj; #ifdef SWIFT_DEBUG_TASKS /* Mark the thread we run on */ t->rid = r->cpuid; /* And recover the pair direction */ if (t->type == task_type_pair || t->type == task_type_sub_pair) { struct cell *ci_temp = ci; struct cell *cj_temp = cj; double shift[3]; t->sid = space_getsid_and_swap_cells(e->s, &ci_temp, &cj_temp, shift); } else { t->sid = -1; } #endif #ifdef SWIFT_DEBUG_CHECKS /* Check that we haven't scheduled an inactive task */ t->ti_run = e->ti_current; /* Store the task that will be running (for debugging only) */ r->t = t; #endif const ticks task_beg = getticks(); /* Different types of tasks... */ switch (t->type) { case task_type_self: if (t->subtype == task_subtype_grav) runner_doself_recursive_grav(r, ci, 1); else if (t->subtype == task_subtype_external_grav) runner_do_grav_external(r, ci, 1); else if (t->subtype == task_subtype_density) runner_doself1_branch_density(r, ci, /*limit_h_min=*/0, /*limit_h_max=*/0); #ifdef EXTRA_HYDRO_LOOP else if (t->subtype == task_subtype_gradient) runner_doself1_branch_gradient(r, ci, /*limit_h_min=*/0, /*limit_h_max=*/0); #endif else if (t->subtype == task_subtype_force) runner_doself2_branch_force(r, ci, /*limit_h_min=*/0, /*limit_h_max=*/0); else if (t->subtype == task_subtype_limiter) runner_doself1_branch_limiter(r, ci, /*limit_h_min=*/0, /*limit_h_max=*/0); else if (t->subtype == task_subtype_stars_density) runner_doself_branch_stars_density(r, ci, /*limit_h_min=*/0, /*limit_h_max=*/0); #ifdef EXTRA_STAR_LOOPS else if (t->subtype == task_subtype_stars_prep1) runner_doself_branch_stars_prep1(r, ci, /*limit_h_min=*/0, /*limit_h_max=*/0); else if (t->subtype == task_subtype_stars_prep2) runner_doself_branch_stars_prep2(r, ci, /*limit_h_min=*/0, /*limit_h_max=*/0); #endif else if (t->subtype == task_subtype_stars_feedback) runner_doself_branch_stars_feedback(r, ci, /*limit_h_min=*/0, /*limit_h_max=*/0); else if (t->subtype == task_subtype_bh_density) runner_doself_branch_bh_density(r, ci); else if (t->subtype == task_subtype_bh_swallow) runner_doself_branch_bh_swallow(r, ci); else if (t->subtype == task_subtype_do_gas_swallow) runner_do_gas_swallow_self(r, ci, 1); else if (t->subtype == task_subtype_do_bh_swallow) runner_do_bh_swallow_self(r, ci, 1); else if (t->subtype == task_subtype_bh_feedback) runner_doself_branch_bh_feedback(r, ci); else if (t->subtype == task_subtype_rt_gradient) runner_doself1_branch_rt_gradient(r, ci, /*limit_h_min=*/0, /*limit_h_max=*/0); else if (t->subtype == task_subtype_rt_transport) runner_doself2_branch_rt_transport(r, ci, /*limit_h_min=*/0, /*limit_h_max=*/0); else if (t->subtype == task_subtype_sink_density) runner_doself_branch_sinks_density(r, ci); else if (t->subtype == task_subtype_sink_swallow) runner_doself_branch_sinks_swallow(r, ci); else if (t->subtype == task_subtype_sink_do_gas_swallow) runner_do_sinks_gas_swallow_self(r, ci, 1); else if (t->subtype == task_subtype_sink_do_sink_swallow) runner_do_sinks_sink_swallow_self(r, ci, 1); else error("Unknown/invalid task subtype (%s).", subtaskID_names[t->subtype]); break; case task_type_pair: if (t->subtype == task_subtype_grav) runner_dopair_recursive_grav(r, ci, cj, 1); else if (t->subtype == task_subtype_density) runner_dopair1_branch_density(r, ci, cj, /*limit_h_min=*/0, /*limit_h_max=*/0); #ifdef EXTRA_HYDRO_LOOP else if (t->subtype == task_subtype_gradient) runner_dopair1_branch_gradient(r, ci, cj, /*limit_h_min=*/0, /*limit_h_max=*/0); #endif else if (t->subtype == task_subtype_force) runner_dopair2_branch_force(r, ci, cj, /*limit_h_min=*/0, /*limit_h_max=*/0); else if (t->subtype == task_subtype_limiter) runner_dopair1_branch_limiter(r, ci, cj, /*limit_h_min=*/0, /*limit_h_max=*/0); else if (t->subtype == task_subtype_stars_density) runner_dopair_branch_stars_density(r, ci, cj, /*limit_h_min=*/0, /*limit_h_max=*/0); #ifdef EXTRA_STAR_LOOPS else if (t->subtype == task_subtype_stars_prep1) runner_dopair_branch_stars_prep1(r, ci, cj, /*limit_h_min=*/0, /*limit_h_max=*/0); else if (t->subtype == task_subtype_stars_prep2) runner_dopair_branch_stars_prep2(r, ci, cj, /*limit_h_min=*/0, /*limit_h_max=*/0); #endif else if (t->subtype == task_subtype_stars_feedback) runner_dopair_branch_stars_feedback(r, ci, cj, /*limit_h_min=*/0, /*limit_h_max=*/0); else if (t->subtype == task_subtype_bh_density) runner_dopair_branch_bh_density(r, ci, cj); else if (t->subtype == task_subtype_bh_swallow) runner_dopair_branch_bh_swallow(r, ci, cj); else if (t->subtype == task_subtype_do_gas_swallow) runner_do_gas_swallow_pair(r, ci, cj, 1); else if (t->subtype == task_subtype_do_bh_swallow) runner_do_bh_swallow_pair(r, ci, cj, 1); else if (t->subtype == task_subtype_bh_feedback) runner_dopair_branch_bh_feedback(r, ci, cj); else if (t->subtype == task_subtype_rt_gradient) runner_dopair1_branch_rt_gradient(r, ci, cj, /*limit_h_min=*/0, /*limit_h_max=*/0); else if (t->subtype == task_subtype_rt_transport) runner_dopair2_branch_rt_transport(r, ci, cj, /*limit_h_min=*/0, /*limit_h_max=*/0); else if (t->subtype == task_subtype_sink_density) runner_dopair_branch_sinks_density(r, ci, cj); else if (t->subtype == task_subtype_sink_swallow) runner_dopair_branch_sinks_swallow(r, ci, cj); else if (t->subtype == task_subtype_sink_do_gas_swallow) runner_do_sinks_gas_swallow_pair(r, ci, cj, 1); else if (t->subtype == task_subtype_sink_do_sink_swallow) runner_do_sinks_sink_swallow_pair(r, ci, cj, 1); else error("Unknown/invalid task subtype (%s/%s).", taskID_names[t->type], subtaskID_names[t->subtype]); break; case task_type_sub_self: if (t->subtype == task_subtype_density) runner_dosub_self1_density(r, ci, /*below_h_max=*/0, 1); #ifdef EXTRA_HYDRO_LOOP else if (t->subtype == task_subtype_gradient) runner_dosub_self1_gradient(r, ci, /*below_h_max=*/0, 1); #endif else if (t->subtype == task_subtype_force) runner_dosub_self2_force(r, ci, /*below_h_max=*/0, 1); else if (t->subtype == task_subtype_limiter) runner_dosub_self1_limiter(r, ci, /*below_h_max=*/0, 1); else if (t->subtype == task_subtype_stars_density) runner_dosub_self_stars_density(r, ci, /*below_h_max=*/0, 1); #ifdef EXTRA_STAR_LOOPS else if (t->subtype == task_subtype_stars_prep1) runner_dosub_self_stars_prep1(r, ci, /*below_h_max=*/0, 1); else if (t->subtype == task_subtype_stars_prep2) runner_dosub_self_stars_prep2(r, ci, /*below_h_max=*/0, 1); #endif else if (t->subtype == task_subtype_stars_feedback) runner_dosub_self_stars_feedback(r, ci, /*below_h_max=*/0, 1); else if (t->subtype == task_subtype_bh_density) runner_dosub_self_bh_density(r, ci, 1); else if (t->subtype == task_subtype_bh_swallow) runner_dosub_self_bh_swallow(r, ci, 1); else if (t->subtype == task_subtype_do_gas_swallow) runner_do_gas_swallow_self(r, ci, 1); else if (t->subtype == task_subtype_do_bh_swallow) runner_do_bh_swallow_self(r, ci, 1); else if (t->subtype == task_subtype_bh_feedback) runner_dosub_self_bh_feedback(r, ci, 1); else if (t->subtype == task_subtype_rt_gradient) runner_dosub_self1_rt_gradient(r, ci, /*below_h_max=*/0, 1); else if (t->subtype == task_subtype_rt_transport) runner_dosub_self2_rt_transport(r, ci, /*below_h_max=*/0, 1); else if (t->subtype == task_subtype_sink_density) runner_dosub_self_sinks_density(r, ci, 1); else if (t->subtype == task_subtype_sink_swallow) runner_dosub_self_sinks_swallow(r, ci, 1); else if (t->subtype == task_subtype_sink_do_gas_swallow) runner_do_sinks_gas_swallow_self(r, ci, 1); else if (t->subtype == task_subtype_sink_do_sink_swallow) runner_do_sinks_sink_swallow_self(r, ci, 1); else error("Unknown/invalid task subtype (%s/%s).", taskID_names[t->type], subtaskID_names[t->subtype]); break; case task_type_sub_pair: if (t->subtype == task_subtype_density) runner_dosub_pair1_density(r, ci, cj, /*below_h_max=*/0, 1); #ifdef EXTRA_HYDRO_LOOP else if (t->subtype == task_subtype_gradient) runner_dosub_pair1_gradient(r, ci, cj, /*below_h_max=*/0, 1); #endif else if (t->subtype == task_subtype_force) runner_dosub_pair2_force(r, ci, cj, /*below_h_max=*/0, 1); else if (t->subtype == task_subtype_limiter) runner_dosub_pair1_limiter(r, ci, cj, /*below_h_max=*/0, 1); else if (t->subtype == task_subtype_stars_density) runner_dosub_pair_stars_density(r, ci, cj, /*below_h_max=*/0, 1); #ifdef EXTRA_STAR_LOOPS else if (t->subtype == task_subtype_stars_prep1) runner_dosub_pair_stars_prep1(r, ci, cj, /*below_h_max=*/0, 1); else if (t->subtype == task_subtype_stars_prep2) runner_dosub_pair_stars_prep2(r, ci, cj, /*below_h_max=*/0, 1); #endif else if (t->subtype == task_subtype_stars_feedback) runner_dosub_pair_stars_feedback(r, ci, cj, /*below_h_max=*/0, 1); else if (t->subtype == task_subtype_bh_density) runner_dosub_pair_bh_density(r, ci, cj, 1); else if (t->subtype == task_subtype_bh_swallow) runner_dosub_pair_bh_swallow(r, ci, cj, 1); else if (t->subtype == task_subtype_do_gas_swallow) runner_do_gas_swallow_pair(r, ci, cj, 1); else if (t->subtype == task_subtype_do_bh_swallow) runner_do_bh_swallow_pair(r, ci, cj, 1); else if (t->subtype == task_subtype_bh_feedback) runner_dosub_pair_bh_feedback(r, ci, cj, 1); else if (t->subtype == task_subtype_rt_gradient) runner_dosub_pair1_rt_gradient(r, ci, cj, /*below_h_max=*/0, 1); else if (t->subtype == task_subtype_rt_transport) runner_dosub_pair2_rt_transport(r, ci, cj, /*below_h_max=*/0, 1); else if (t->subtype == task_subtype_sink_density) runner_dosub_pair_sinks_density(r, ci, cj, 1); else if (t->subtype == task_subtype_sink_swallow) runner_dosub_pair_sinks_swallow(r, ci, cj, 1); else if (t->subtype == task_subtype_sink_do_gas_swallow) runner_do_sinks_gas_swallow_pair(r, ci, cj, 1); else if (t->subtype == task_subtype_sink_do_sink_swallow) runner_do_sinks_sink_swallow_pair(r, ci, cj, 1); else error("Unknown/invalid task subtype (%s/%s).", taskID_names[t->type], subtaskID_names[t->subtype]); break; case task_type_sort: /* Cleanup only if any of the indices went stale. */ runner_do_hydro_sort( r, ci, t->flags, ci->hydro.dx_max_sort_old > space_maxreldx * ci->dmin, /*lock=*/0, cell_get_flag(ci, cell_flag_rt_requests_sort), /*clock=*/1); /* Reset the sort flags as our work here is done. */ t->flags = 0; break; case task_type_rt_sort: /* Cleanup only if any of the indices went stale. * NOTE: we check whether we reset the sort flags when the * recv tasks are running. Cells without an RT recv task * don't have rt_sort tasks. */ runner_do_hydro_sort( r, ci, t->flags, ci->hydro.dx_max_sort_old > space_maxreldx * ci->dmin, /*lock=*/0, /*rt_requests_sorts=*/1, /*clock=*/1); /* Reset the sort flags as our work here is done. */ t->flags = 0; break; case task_type_stars_sort: /* Cleanup only if any of the indices went stale. */ runner_do_stars_sort( r, ci, t->flags, ci->stars.dx_max_sort_old > space_maxreldx * ci->dmin, 1); /* Reset the sort flags as our work here is done. */ t->flags = 0; break; case task_type_init_grav: runner_do_init_grav(r, ci, 1); break; case task_type_ghost: runner_do_ghost(r, ci, 1); break; #ifdef EXTRA_HYDRO_LOOP case task_type_extra_ghost: runner_do_extra_ghost(r, ci, 1); break; #endif case task_type_stars_ghost: runner_do_stars_ghost(r, ci, 1); break; case task_type_bh_density_ghost: runner_do_black_holes_density_ghost(r, ci, 1); break; case task_type_bh_swallow_ghost3: runner_do_black_holes_swallow_ghost(r, ci, 1); break; case task_type_sink_density_ghost: runner_do_sinks_density_ghost(r, ci, 1); break; case task_type_drift_part: runner_do_drift_part(r, ci, 1); break; case task_type_drift_spart: runner_do_drift_spart(r, ci, 1); break; case task_type_drift_sink: runner_do_drift_sink(r, ci, 1); break; case task_type_drift_bpart: runner_do_drift_bpart(r, ci, 1); break; case task_type_drift_gpart: runner_do_drift_gpart(r, ci, 1); break; case task_type_kick1: runner_do_kick1(r, ci, 1); break; case task_type_kick2: runner_do_kick2(r, ci, 1); break; case task_type_end_hydro_force: runner_do_end_hydro_force(r, ci, 1); break; case task_type_end_grav_force: runner_do_end_grav_force(r, ci, 1); break; case task_type_csds: runner_do_csds(r, ci, 1); break; case task_type_timestep: runner_do_timestep(r, ci, 1); break; case task_type_timestep_limiter: runner_do_limiter(r, ci, 0, 1); break; case task_type_timestep_sync: runner_do_sync(r, ci, 0, 1); break; case task_type_collect: runner_do_timestep_collect(r, ci, 1); break; case task_type_rt_collect_times: runner_do_collect_rt_times(r, ci, 1); break; #ifdef WITH_MPI case task_type_send: if (t->subtype == task_subtype_tend) { free(t->buff); } else if (t->subtype == task_subtype_sf_counts) { free(t->buff); } else if (t->subtype == task_subtype_grav_counts) { free(t->buff); } else if (t->subtype == task_subtype_part_swallow) { free(t->buff); } else if (t->subtype == task_subtype_bpart_merger) { free(t->buff); } else if (t->subtype == task_subtype_limiter) { free(t->buff); } break; case task_type_recv: if (t->subtype == task_subtype_tend) { cell_unpack_end_step(ci, (struct pcell_step *)t->buff); free(t->buff); } else if (t->subtype == task_subtype_sf_counts) { cell_unpack_sf_counts(ci, (struct pcell_sf_stars *)t->buff); cell_clear_stars_sort_flags(ci, /*clear_unused_flags=*/0); free(t->buff); } else if (t->subtype == task_subtype_grav_counts) { cell_unpack_grav_counts(ci, (struct pcell_sf_grav *)t->buff); free(t->buff); } else if (t->subtype == task_subtype_xv) { runner_do_recv_part(r, ci, 1, 1); } else if (t->subtype == task_subtype_rho) { runner_do_recv_part(r, ci, 0, 1); } else if (t->subtype == task_subtype_gradient) { runner_do_recv_part(r, ci, 0, 1); } else if (t->subtype == task_subtype_rt_gradient) { runner_do_recv_part(r, ci, 2, 1); } else if (t->subtype == task_subtype_rt_transport) { runner_do_recv_part(r, ci, -1, 1); } else if (t->subtype == task_subtype_part_swallow) { cell_unpack_part_swallow(ci, (struct black_holes_part_data *)t->buff); free(t->buff); } else if (t->subtype == task_subtype_bpart_merger) { cell_unpack_bpart_swallow(ci, (struct black_holes_bpart_data *)t->buff); free(t->buff); } else if (t->subtype == task_subtype_limiter) { /* Nothing to do here. Unpacking done in a separate task */ } else if (t->subtype == task_subtype_gpart) { runner_do_recv_gpart(r, ci, 1); } else if (t->subtype == task_subtype_spart_density) { runner_do_recv_spart(r, ci, 1, 1); } else if (t->subtype == task_subtype_part_prep1) { runner_do_recv_part(r, ci, 0, 1); } else if (t->subtype == task_subtype_spart_prep2) { runner_do_recv_spart(r, ci, 0, 1); } else if (t->subtype == task_subtype_bpart_rho) { runner_do_recv_bpart(r, ci, 1, 1); } else if (t->subtype == task_subtype_bpart_feedback) { runner_do_recv_bpart(r, ci, 0, 1); } else { error("Unknown/invalid task subtype (%d).", t->subtype); } break; case task_type_pack: runner_do_pack_limiter(r, ci, &t->buff, 1); task_get_unique_dependent(t)->buff = t->buff; break; case task_type_unpack: runner_do_unpack_limiter(r, ci, t->buff, 1); break; #endif case task_type_grav_down: runner_do_grav_down(r, t->ci, 1); break; case task_type_grav_long_range: runner_do_grav_long_range(r, t->ci, 1); break; case task_type_grav_mm: runner_dopair_grav_mm_progenies(r, t->flags, t->ci, t->cj); break; case task_type_cooling: runner_do_cooling(r, t->ci, 1); break; case task_type_star_formation: runner_do_star_formation(r, t->ci, 1); break; case task_type_star_formation_sink: runner_do_star_formation_sink(r, t->ci, 1); break; case task_type_stars_resort: runner_do_stars_resort(r, t->ci, 1); break; case task_type_sink_formation: runner_do_sink_formation(r, t->ci); break; case task_type_fof_self: runner_do_fof_search_self(r, t->ci, 1); break; case task_type_fof_pair: runner_do_fof_search_pair(r, t->ci, t->cj, 1); break; case task_type_fof_attach_self: runner_do_fof_attach_self(r, t->ci, 1); break; case task_type_fof_attach_pair: runner_do_fof_attach_pair(r, t->ci, t->cj, 1); break; case task_type_neutrino_weight: runner_do_neutrino_weighting(r, ci, 1); break; case task_type_rt_ghost1: runner_do_rt_ghost1(r, t->ci, 1); break; case task_type_rt_ghost2: runner_do_rt_ghost2(r, t->ci, 1); break; case task_type_rt_tchem: runner_do_rt_tchem(r, t->ci, 1); break; case task_type_rt_advance_cell_time: runner_do_rt_advance_cell_time(r, t->ci, 1); break; default: error("Unknown/invalid task type (%d).", t->type); } r->active_time += (getticks() - task_beg); /* Mark that we have run this task on these cells */ #ifdef SWIFT_DEBUG_CHECKS if (ci != NULL) { ci->tasks_executed[t->type]++; ci->subtasks_executed[t->subtype]++; } if (cj != NULL) { cj->tasks_executed[t->type]++; cj->subtasks_executed[t->subtype]++; } /* This runner is not doing a task anymore */ r->t = NULL; #endif /* We're done with this task, see if we get a next one. */ prev = t; t = scheduler_done(sched, t); } /* main loop. */ } /* Be kind, rewind. */ return NULL; } ticks runner_get_active_time(const struct runner *restrict r) { return r->active_time; } void runner_reset_active_time(struct runner *restrict r) { r->active_time = 0; }