diff --git a/examples/parameter_example.yml b/examples/parameter_example.yml index 63a61af3e714d5dd6b19312e9a233f51deda0011..9ae5fef66546aca2822a2887f9ca2104a169b2d0 100644 --- a/examples/parameter_example.yml +++ b/examples/parameter_example.yml @@ -59,10 +59,10 @@ Scheduler: cell_sub_size_self_hydro: 32000 # (Optional) Maximal number of interactions per sub-self hydro task (this is the default value). cell_sub_size_pair_grav: 256000000 # (Optional) Maximal number of interactions per sub-pair gravity task (this is the default value). cell_sub_size_self_grav: 32000 # (Optional) Maximal number of interactions per sub-self gravity task (this is the default value). - cell_sub_size_pair_stars: 256000000 # (Optional) Maximal number of interactions per sub-pair stars task (this is the default value). - cell_sub_size_self_stars: 32000 # (Optional) Maximal number of interactions per sub-self stars task (this is the default value). + cell_sub_size_pair_stars: 256000000 # (Optional) Maximal number of interactions per sub-pair stars task (this is the default value). + cell_sub_size_self_stars: 32000 # (Optional) Maximal number of interactions per sub-self stars task (this is the default value). cell_split_size: 400 # (Optional) Maximal number of particles per cell (this is the default value). - cell_subdepth_grav: 2 # (Optional) Maximal depth the gravity tasks can be pushed down (this is the default value). + cell_subdepth_diff_grav: 4 # (Optional) Maximal depth difference between leaves and a cell that gravity tasks can be pushed down to (this is the default value). max_top_level_cells: 12 # (Optional) Maximal number of top-level cells in any dimension. The number of top-level cells will be the cube of this (this is the default value). tasks_per_cell: 0 # (Optional) The average number of tasks per cell. If not large enough the simulation will fail (means guess...). mpi_message_limit: 4096 # (Optional) Maximum MPI task message size to send non-buffered, KB. diff --git a/src/cell.c b/src/cell.c index 37b7be42f3aa04d79496d2913d30654af93ea45e..645dfbd3eaa94c4266243f19309c205824ce79f8 100644 --- a/src/cell.c +++ b/src/cell.c @@ -190,6 +190,7 @@ int cell_pack(struct cell *restrict c, struct pcell *restrict pc, pc->hydro.count = c->hydro.count; pc->grav.count = c->grav.count; pc->stars.count = c->stars.count; + pc->maxdepth = c->maxdepth; /* Copy the Multipole related information */ if (with_gravity) { @@ -292,6 +293,8 @@ int cell_unpack(struct pcell *restrict pc, struct cell *restrict c, c->hydro.count = pc->hydro.count; c->grav.count = pc->grav.count; c->stars.count = pc->stars.count; + c->maxdepth = pc->maxdepth; + #ifdef SWIFT_DEBUG_CHECKS c->cellID = pc->cellID; #endif @@ -1626,6 +1629,8 @@ void cell_activate_drift_gpart(struct cell *c, struct scheduler *s) { /* Mark this cell for drifting. */ c->grav.do_drift = 1; + if (c->grav.drift_out != NULL) scheduler_activate(s, c->grav.drift_out); + /* Set the do_grav_sub_drifts all the way up and activate the super drift if this has not yet been done. */ if (c == c->grav.super) { @@ -1639,6 +1644,11 @@ void cell_activate_drift_gpart(struct cell *c, struct scheduler *s) { parent != NULL && !parent->grav.do_sub_drift; parent = parent->parent) { parent->grav.do_sub_drift = 1; + + if (parent->grav.drift_out) { + scheduler_activate(s, parent->grav.drift_out); + } + if (parent == c->grav.super) { #ifdef SWIFT_DEBUG_CHECKS if (parent->grav.drift == NULL) @@ -2909,16 +2919,18 @@ int cell_unskip_gravity_tasks(struct cell *c, struct scheduler *s) { if (c->kick2 != NULL) scheduler_activate(s, c->kick2); if (c->timestep != NULL) scheduler_activate(s, c->timestep); if (c->end_force != NULL) scheduler_activate(s, c->end_force); - if ((e->policy & engine_policy_cooling) && c->hydro.cooling != NULL) - scheduler_activate(s, c->hydro.cooling); - if ((e->policy & engine_policy_star_formation) && - c->hydro.star_formation != NULL) - scheduler_activate(s, c->hydro.star_formation); if (c->grav.down != NULL) scheduler_activate(s, c->grav.down); if (c->grav.down_in != NULL) scheduler_activate(s, c->grav.down_in); if (c->grav.mesh != NULL) scheduler_activate(s, c->grav.mesh); if (c->grav.long_range != NULL) scheduler_activate(s, c->grav.long_range); if (c->logger != NULL) scheduler_activate(s, c->logger); + + /* Subgrid tasks */ + if ((e->policy & engine_policy_cooling) && c->hydro.cooling != NULL) + scheduler_activate(s, c->hydro.cooling); + if ((e->policy & engine_policy_star_formation) && + c->hydro.star_formation != NULL) + scheduler_activate(s, c->hydro.star_formation); } return rebuild; diff --git a/src/cell.h b/src/cell.h index 89f7c954c29f23845cb9c876b93c6bb3d469fbe5..bc3a21dbbdbb1e03b6d51a4363e0153a750340f8 100644 --- a/src/cell.h +++ b/src/cell.h @@ -149,6 +149,9 @@ struct pcell { } stars; + /*! Maximal depth in that part of the tree */ + int maxdepth; + /*! Relative indices of the cell's progeny. */ int progeny[8]; @@ -404,6 +407,9 @@ struct cell { /*! The drift task for gparts */ struct task *drift; + /*! Implicit task (going up- and down the tree) for the #gpart drifts */ + struct task *drift_out; + /*! Linked list of the tasks computing this cell's gravity forces. */ struct link *grav; @@ -808,8 +814,8 @@ __attribute__((always_inline)) INLINE static int cell_can_split_self_stars_task( __attribute__((always_inline)) INLINE static int cell_can_split_pair_gravity_task(const struct cell *c) { - /* Is the cell split ? */ - return c->split && c->depth < space_subdepth_grav; + /* Is the cell split and still far from the leaves ? */ + return c->split && ((c->maxdepth - c->depth) > space_subdepth_diff_grav); } /** @@ -821,8 +827,8 @@ cell_can_split_pair_gravity_task(const struct cell *c) { __attribute__((always_inline)) INLINE static int cell_can_split_self_gravity_task(const struct cell *c) { - /* Is the cell split ? */ - return c->split && c->depth < space_subdepth_grav; + /* Is the cell split and still far from the leaves ? */ + return c->split && ((c->maxdepth - c->depth) > space_subdepth_diff_grav); } /** diff --git a/src/engine.c b/src/engine.c index f728862487f1666302dd10c5b1bb7c128ae0a0ee..123c692edfbfbe6f6d8cef027998b43c0fa79c9d 100644 --- a/src/engine.c +++ b/src/engine.c @@ -1044,6 +1044,8 @@ void engine_repartition_trigger(struct engine *e) { #ifdef WITH_MPI + const ticks tic = getticks(); + /* Do nothing if there have not been enough steps since the last * repartition, don't want to repeat this too often or immediately after * a repartition step. Also nothing to do when requested. */ @@ -1112,6 +1114,10 @@ void engine_repartition_trigger(struct engine *e) { /* We always reset CPU time for next check, unless it will not be used. */ if (e->reparttype->type != REPART_NONE) e->cputime_last_step = clocks_get_cputime_used(); + + if (e->verbose) + message("took %.3f %s", clocks_from_ticks(getticks() - tic), + clocks_getunit()); #endif } @@ -1591,6 +1597,8 @@ void engine_exchange_top_multipoles(struct engine *e) { #ifdef WITH_MPI + ticks tic = getticks(); + #ifdef SWIFT_DEBUG_CHECKS for (int i = 0; i < e->s->nr_cells; ++i) { const struct gravity_tensors *m = &e->s->multipoles_top[i]; @@ -1654,6 +1662,9 @@ void engine_exchange_top_multipoles(struct engine *e) { counter, e->total_nr_gparts); #endif + if (e->verbose) + message("took %.3f %s.", clocks_from_ticks(getticks() - tic), + clocks_getunit()); #else error("SWIFT was not compiled with MPI support."); #endif @@ -1988,6 +1999,8 @@ void engine_rebuild(struct engine *e, int repartitioned, /* Re-build the space. */ space_rebuild(e->s, repartitioned, e->verbose); + const ticks tic2 = getticks(); + /* Update the global counters of particles */ long long num_particles[3] = {(long long)e->s->nr_parts, (long long)e->s->nr_gparts, @@ -2005,6 +2018,10 @@ void engine_rebuild(struct engine *e, int repartitioned, e->nr_inhibited_gparts = 0; e->nr_inhibited_sparts = 0; + if (e->verbose) + message("updating particle counts took %.3f %s.", + clocks_from_ticks(getticks() - tic2), clocks_getunit()); + /* Re-compute the mesh forces */ if ((e->policy & engine_policy_self_gravity) && e->s->periodic) pm_mesh_compute_potential(e->mesh, e->s, &e->threadpool, e->verbose); @@ -3860,6 +3877,8 @@ void engine_makeproxies(struct engine *e) { void engine_split(struct engine *e, struct partition *initial_partition) { #ifdef WITH_MPI + const ticks tic = getticks(); + struct space *s = e->s; /* Do the initial partition of the cells. */ @@ -3940,6 +3959,10 @@ void engine_split(struct engine *e, struct partition *initial_partition) { s->nr_sparts, e->verbose); #endif + if (e->verbose) + message("took %.3f %s.", clocks_from_ticks(getticks() - tic), + clocks_getunit()); + #else error("SWIFT was not compiled with MPI support."); #endif @@ -5113,6 +5136,8 @@ void engine_init_output_lists(struct engine *e, struct swift_params *params) { */ void engine_recompute_displacement_constraint(struct engine *e) { + const ticks tic = getticks(); + /* Get the cosmological information */ const struct cosmology *cosmo = e->cosmology; const float Om = cosmo->Omega_m; @@ -5223,6 +5248,10 @@ void engine_recompute_displacement_constraint(struct engine *e) { if (e->verbose) message("max_dt_RMS_displacement = %e", e->dt_max_RMS_displacement); + + if (e->verbose) + message("took %.3f %s.", clocks_from_ticks(getticks() - tic), + clocks_getunit()); } /** diff --git a/src/engine_maketasks.c b/src/engine_maketasks.c index e4431a8cf14998774623e3575ecfdae08333e556..54a73513935cbd73db7362711bd992e669cbe7ca 100644 --- a/src/engine_maketasks.c +++ b/src/engine_maketasks.c @@ -462,6 +462,7 @@ void engine_make_hierarchical_tasks_common(struct engine *e, struct cell *c) { c->end_force = scheduler_addtask(s, task_type_end_force, task_subtype_none, 0, 0, c, NULL); + /* Subgrid tasks */ if (is_with_cooling) { c->hydro.cooling = scheduler_addtask(s, task_type_cooling, @@ -485,13 +486,13 @@ void engine_make_hierarchical_tasks_common(struct engine *e, struct cell *c) { } else { scheduler_addunlock(s, c->kick2, c->timestep); } + scheduler_addunlock(s, c->timestep, c->kick1); #if defined(WITH_LOGGER) scheduler_addunlock(s, c->kick1, c->logger); #endif } - } else { /* We are above the super-cell so need to go deeper */ /* Recurse. */ @@ -544,6 +545,8 @@ void engine_make_hierarchical_tasks_gravity(struct engine *e, struct cell *c) { task_subtype_none, 0, 0, c, NULL); /* Implicit tasks for the up and down passes */ + c->grav.drift_out = scheduler_addtask(s, task_type_drift_gpart_out, + task_subtype_none, 0, 1, c, NULL); c->grav.init_out = scheduler_addtask(s, task_type_init_grav_out, task_subtype_none, 0, 1, c, NULL); c->grav.down_in = scheduler_addtask(s, task_type_grav_down_in, @@ -562,19 +565,24 @@ void engine_make_hierarchical_tasks_gravity(struct engine *e, struct cell *c) { /* Link in the implicit tasks */ scheduler_addunlock(s, c->grav.init, c->grav.init_out); + scheduler_addunlock(s, c->grav.drift, c->grav.drift_out); scheduler_addunlock(s, c->grav.down_in, c->grav.down); } } } /* We are below the super-cell but not below the maximal splitting depth */ - else if (c->grav.super != NULL && c->depth < space_subdepth_grav) { + else if ((c->grav.super != NULL) && + ((c->maxdepth - c->depth) >= space_subdepth_diff_grav)) { /* Local tasks only... */ if (c->nodeID == e->nodeID) { if (is_self_gravity) { + c->grav.drift_out = scheduler_addtask(s, task_type_drift_gpart_out, + task_subtype_none, 0, 1, c, NULL); + c->grav.init_out = scheduler_addtask(s, task_type_init_grav_out, task_subtype_none, 0, 1, c, NULL); @@ -582,13 +590,14 @@ void engine_make_hierarchical_tasks_gravity(struct engine *e, struct cell *c) { task_subtype_none, 0, 1, c, NULL); scheduler_addunlock(s, c->parent->grav.init_out, c->grav.init_out); + scheduler_addunlock(s, c->parent->grav.drift_out, c->grav.drift_out); scheduler_addunlock(s, c->grav.down_in, c->parent->grav.down_in); } } } /* Recurse but not below the maximal splitting depth */ - if (c->split && c->depth <= space_subdepth_grav) + if (c->split && ((c->maxdepth - c->depth) >= space_subdepth_diff_grav)) for (int k = 0; k < 8; k++) if (c->progeny[k] != NULL) engine_make_hierarchical_tasks_gravity(e, c->progeny[k]); @@ -1128,7 +1137,7 @@ void engine_link_gravity_tasks(struct engine *e) { /* drift ---+-> gravity --> grav_down */ /* init --/ */ - scheduler_addunlock(sched, ci->grav.super->grav.drift, t); + scheduler_addunlock(sched, ci_parent->grav.drift_out, t); scheduler_addunlock(sched, ci_parent->grav.init_out, t); scheduler_addunlock(sched, t, ci_parent->grav.down_in); } @@ -1152,7 +1161,7 @@ void engine_link_gravity_tasks(struct engine *e) { /* drift ---+-> gravity --> grav_down */ /* init --/ */ - scheduler_addunlock(sched, ci->grav.super->grav.drift, t); + scheduler_addunlock(sched, ci_parent->grav.drift_out, t); scheduler_addunlock(sched, ci_parent->grav.init_out, t); scheduler_addunlock(sched, t, ci_parent->grav.down_in); } @@ -1160,10 +1169,8 @@ void engine_link_gravity_tasks(struct engine *e) { /* drift ---+-> gravity --> grav_down */ /* init --/ */ - if (ci->grav.super != cj->grav.super) /* Avoid double unlock */ - scheduler_addunlock(sched, cj->grav.super->grav.drift, t); - if (ci_parent != cj_parent) { /* Avoid double unlock */ + scheduler_addunlock(sched, cj_parent->grav.drift_out, t); scheduler_addunlock(sched, cj_parent->grav.init_out, t); scheduler_addunlock(sched, t, cj_parent->grav.down_in); } @@ -1178,7 +1185,7 @@ void engine_link_gravity_tasks(struct engine *e) { #endif /* drift ---+-> gravity --> grav_down */ /* init --/ */ - scheduler_addunlock(sched, ci->grav.super->grav.drift, t); + scheduler_addunlock(sched, ci_parent->grav.drift_out, t); scheduler_addunlock(sched, ci_parent->grav.init_out, t); scheduler_addunlock(sched, t, ci_parent->grav.down_in); } @@ -1203,7 +1210,7 @@ void engine_link_gravity_tasks(struct engine *e) { /* drift ---+-> gravity --> grav_down */ /* init --/ */ - scheduler_addunlock(sched, ci->grav.super->grav.drift, t); + scheduler_addunlock(sched, ci_parent->grav.drift_out, t); scheduler_addunlock(sched, ci_parent->grav.init_out, t); scheduler_addunlock(sched, t, ci_parent->grav.down_in); } @@ -1211,10 +1218,8 @@ void engine_link_gravity_tasks(struct engine *e) { /* drift ---+-> gravity --> grav_down */ /* init --/ */ - if (ci->grav.super != cj->grav.super) /* Avoid double unlock */ - scheduler_addunlock(sched, cj->grav.super->grav.drift, t); - if (ci_parent != cj_parent) { /* Avoid double unlock */ + scheduler_addunlock(sched, cj_parent->grav.drift_out, t); scheduler_addunlock(sched, cj_parent->grav.init_out, t); scheduler_addunlock(sched, t, cj_parent->grav.down_in); } diff --git a/src/engine_marktasks.c b/src/engine_marktasks.c index c891fb2ca7aa66538adbbb8e1fd694f3af6acf07..3d607bcf85fde93fc58581132e8b443a5b257fe4 100644 --- a/src/engine_marktasks.c +++ b/src/engine_marktasks.c @@ -261,6 +261,7 @@ void engine_marktasks_mapper(void *map_data, int num_elements, } } + /* Gravity */ if ((t_subtype == task_subtype_grav) && ((ci_active_gravity && ci_nodeID == nodeID) || (cj_active_gravity && cj_nodeID == nodeID))) { @@ -474,6 +475,7 @@ void engine_marktasks_mapper(void *map_data, int num_elements, t_type == task_type_grav_long_range || t_type == task_type_init_grav || t_type == task_type_init_grav_out || + t_type == task_type_drift_gpart_out || t_type == task_type_grav_down_in) { if (cell_is_active_gravity(t->ci, e)) scheduler_activate(s, t); } diff --git a/src/runner.c b/src/runner.c index cf5492dad4702d3090393809e02c526b45c293eb..0026d833b98ec9f07bdec7f13d3d5bccf6a4b1e8 100644 --- a/src/runner.c +++ b/src/runner.c @@ -1353,7 +1353,7 @@ static void runner_do_unskip_gravity(struct cell *c, struct engine *e) { if (!cell_is_active_gravity(c, e)) return; /* Recurse */ - if (c->split && c->depth < space_subdepth_grav) { + if (c->split && ((c->maxdepth - c->depth) >= space_subdepth_diff_grav)) { for (int k = 0; k < 8; k++) { if (c->progeny[k] != NULL) { struct cell *cp = c->progeny[k]; diff --git a/src/space.c b/src/space.c index bda2f4882588d2c183d5e013077723b30fb81512..983e1d2a933f717ca446300ae04b94e53c092262 100644 --- a/src/space.c +++ b/src/space.c @@ -68,7 +68,7 @@ int space_subsize_pair_grav = space_subsize_pair_grav_default; int space_subsize_self_grav = space_subsize_self_grav_default; int space_subsize_pair_stars = space_subsize_pair_stars_default; int space_subsize_self_stars = space_subsize_self_stars_default; -int space_subdepth_grav = space_subdepth_grav_default; +int space_subdepth_diff_grav = space_subdepth_diff_grav_default; int space_maxsize = space_maxsize_default; #ifdef SWIFT_DEBUG_CHECKS int last_cell_id; @@ -505,6 +505,14 @@ void space_regrid(struct space *s, int verbose) { c->grav.ti_old_multipole = ti_current; #ifdef WITH_MPI c->mpi.tag = -1; + c->mpi.hydro.recv_xv = NULL; + c->mpi.hydro.recv_rho = NULL; + c->mpi.hydro.recv_gradient = NULL; + c->mpi.hydro.send_xv = NULL; + c->mpi.hydro.send_rho = NULL; + c->mpi.hydro.send_gradient = NULL; + c->mpi.grav.recv = NULL; + c->mpi.grav.send = NULL; #endif // WITH_MPI if (s->gravity) c->grav.multipole = &s->multipoles_top[cid]; #ifdef SWIFT_DEBUG_CHECKS @@ -3159,13 +3167,14 @@ void space_init(struct space *s, struct swift_params *params, space_subsize_self_stars_default); space_splitsize = parser_get_opt_param_int( params, "Scheduler:cell_split_size", space_splitsize_default); - space_subdepth_grav = parser_get_opt_param_int( - params, "Scheduler:cell_subdepth_grav", space_subdepth_grav_default); + space_subdepth_diff_grav = + parser_get_opt_param_int(params, "Scheduler:cell_subdepth_diff_grav", + space_subdepth_diff_grav_default); if (verbose) { message("max_size set to %d split_size set to %d", space_maxsize, space_splitsize); - message("subdepth_grav set to %d", space_subdepth_grav); + message("subdepth_grav set to %d", space_subdepth_diff_grav); message("sub_size_pair_hydro set to %d, sub_size_self_hydro set to %d", space_subsize_pair_hydro, space_subsize_self_hydro); message("sub_size_pair_grav set to %d, sub_size_self_grav set to %d", diff --git a/src/space.h b/src/space.h index d0ec372d6fdec518c77d3b3c016dce44282a8d26..e6d774200be1a31d622419dceafb16b3826ce177 100644 --- a/src/space.h +++ b/src/space.h @@ -50,7 +50,7 @@ struct cosmology; #define space_subsize_self_grav_default 32000 #define space_subsize_pair_stars_default 256000000 #define space_subsize_self_stars_default 32000 -#define space_subdepth_grav_default 2 +#define space_subdepth_diff_grav_default 4 #define space_max_top_level_cells_default 12 #define space_stretch 1.10f #define space_maxreldx 0.1f @@ -67,7 +67,7 @@ extern int space_subsize_pair_grav; extern int space_subsize_self_grav; extern int space_subsize_pair_stars; extern int space_subsize_self_stars; -extern int space_subdepth_grav; +extern int space_subdepth_diff_grav; /** * @brief The space in which the cells and particles reside. diff --git a/src/task.c b/src/task.c index 996c5113bac9935f70a3aafafd58da965b13f5aa..9d4be3aaa5aaa074b19f7a22bddab99629ef9085 100644 --- a/src/task.c +++ b/src/task.c @@ -47,18 +47,39 @@ #include "lock.h" /* Task type names. */ -const char *taskID_names[task_type_count] = { - "none", "sort", "self", - "pair", "sub_self", "sub_pair", - "init_grav", "init_grav_out", "ghost_in", - "ghost", "ghost_out", "extra_ghost", - "drift_part", "drift_gpart", "end_force", - "kick1", "kick2", "timestep", - "send", "recv", "grav_long_range", - "grav_mm", "grav_down_in", "grav_down", - "grav_mesh", "cooling", "star_formation", - "sourceterms", "logger", "stars_ghost_in", - "stars_ghost", "stars_ghost_out"}; +const char *taskID_names[task_type_count] = {"none", + "sort", + "self", + "pair", + "sub_self", + "sub_pair", + "init_grav", + "init_grav_out", + "ghost_in", + "ghost", + "ghost_out", + "extra_ghost", + "drift_part", + "drift_gpart", + "drift_gpart_out", + "end_force", + "kick1", + "kick2", + "timestep", + "send", + "recv", + "grav_long_range", + "grav_mm", + "grav_down_in", + "grav_down", + "grav_mesh", + "cooling", + "star_formation", + "sourceterms", + "logger", + "stars_ghost_in", + "stars_ghost", + "stars_ghost_out"}; /* Sub-task type names. */ const char *subtaskID_names[task_subtype_count] = { @@ -390,8 +411,10 @@ int task_lock(struct task *t) { char buff[MPI_MAX_ERROR_STRING]; int len; MPI_Error_string(err, buff, &len); - error("Failed to test request on send/recv task (tag=%lld, %s).", - t->flags, buff); + error( + "Failed to test request on send/recv task (type=%s/%s tag=%lld, " + "%s).", + taskID_names[t->type], subtaskID_names[t->subtype], t->flags, buff); } return res; #else diff --git a/src/task.h b/src/task.h index 9b3225fcf27b768059a2984847d20750d184f8d2..64b611534ed10e3c34b628e2c733a508e5d42a1c 100644 --- a/src/task.h +++ b/src/task.h @@ -53,6 +53,7 @@ enum task_types { task_type_extra_ghost, task_type_drift_part, task_type_drift_gpart, + task_type_drift_gpart_out, /* Implicit */ task_type_end_force, task_type_kick1, task_type_kick2, diff --git a/tools/task_plots/analyse_tasks.py b/tools/task_plots/analyse_tasks.py index 603417a3c2d6b79ac1534d011e03b0907774f4ab..0b6439ff481367b8fa1748d89a8396bef4c2c006 100755 --- a/tools/task_plots/analyse_tasks.py +++ b/tools/task_plots/analyse_tasks.py @@ -77,6 +77,7 @@ TASKTYPES = [ "extra_ghost", "drift_part", "drift_gpart", + "drift_gpart_out", "end_force", "kick1", "kick2", diff --git a/tools/task_plots/plot_tasks.py b/tools/task_plots/plot_tasks.py index ad26a2965044c07cccff8c5387900ee687211a88..e9b676d92832e5c4667aa25bd9458472466500cd 100755 --- a/tools/task_plots/plot_tasks.py +++ b/tools/task_plots/plot_tasks.py @@ -41,7 +41,6 @@ along with this program. If not, see <http://www.gnu.org/licenses/>. """ import matplotlib - matplotlib.use("Agg") import matplotlib.collections as collections import matplotlib.ticker as plticker @@ -163,6 +162,7 @@ TASKTYPES = [ "extra_ghost", "drift_part", "drift_gpart", + "drift_gpart_out", "end_force", "kick1", "kick2",