diff --git a/src/cell.c b/src/cell.c index 23e5e5781bdc07448684a037a4389630b84aad59..9bd2a104c90e3d6f7c7a7b71932e741677cd6f16 100644 --- a/src/cell.c +++ b/src/cell.c @@ -879,15 +879,9 @@ int cell_unskip_tasks(struct cell *c, struct scheduler *s) { } /* Activate the drift on both sides */ - if (t->type == task_type_pair || t->type == task_type_sub_pair) { - if (ci->drift != NULL) scheduler_activate(s, ci->drift); - if (cj->drift != NULL) scheduler_activate(s, cj->drift); - } + if (ci == c && cj != NULL) scheduler_activate(s, cj->drift); + if (cj == c && ci != NULL) scheduler_activate(s, ci->drift); - if (t->type == task_type_self || t->type == task_type_sub_self) { - if (ci->drift != NULL) scheduler_activate(s, ci->drift); - } - /* Check whether there was too much particle motion */ if (t->type == task_type_pair || t->type == task_type_sub_pair) { if (t->tight && diff --git a/src/engine.c b/src/engine.c index 879fbc28bf7827501acf2116ff814fca6c3bb202..e892f674e5c4dabebff0acd41fd7bc94db820780 100644 --- a/src/engine.c +++ b/src/engine.c @@ -139,9 +139,6 @@ void engine_make_hierarchical_tasks(struct engine *e, struct cell *c) { c->init = scheduler_addtask(s, task_type_init, task_subtype_none, 0, 0, c, NULL, 0); - /* c->drift = scheduler_addtask(s, task_type_drift, task_subtype_none, 0, 0, */ - /* c, NULL, 0); */ - c->kick = scheduler_addtask(s, task_type_kick, task_subtype_none, 0, 0, c, NULL, 0); @@ -1993,9 +1990,9 @@ void engine_marktasks_mapper(void *map_data, int num_elements, const struct cell *ci = t->ci; /* Activate the drift */ - if(ci->drift) scheduler_activate(s, ci->drift); + if (ci->drift) scheduler_activate(s, ci->drift); } - + /* Pair? */ else if (t->type == task_type_pair || t->type == task_type_sub_pair) { @@ -2004,8 +2001,8 @@ void engine_marktasks_mapper(void *map_data, int num_elements, const struct cell *cj = t->cj; /* Activate the drift on both sides */ - if(ci->drift) scheduler_activate(s, ci->drift); - if(cj->drift) scheduler_activate(s, cj->drift); + if (ci->drift) scheduler_activate(s, ci->drift); + if (cj->drift) scheduler_activate(s, cj->drift); /* Too much particle movement? */ if (t->tight && diff --git a/src/runner.c b/src/runner.c index a62fb87a8cf904331d894f1b98c9f5e71dd87641..c5975c12a9ddad061f3c9ec3f8069dd8f8a35235 100644 --- a/src/runner.c +++ b/src/runner.c @@ -1127,7 +1127,8 @@ void *runner_main(void *data) { /* Check that we haven't scheduled an inactive task */ #ifdef SWIFT_DEBUG_CHECKS if (cj == NULL) { /* self */ - if (!cell_is_active(ci, e) && t->type != task_type_sort && t->type != task_type_drift) + if (!cell_is_active(ci, e) && t->type != task_type_sort && + t->type != task_type_drift) error( "Task (type='%s/%s') should have been skipped ti_current=%d " "c->ti_end_min=%d", @@ -1143,10 +1144,11 @@ void *runner_main(void *data) { taskID_names[t->type], subtaskID_names[t->subtype], e->ti_current, ci->ti_end_min, t->flags); - /* Special treatement for drifts */ - if (!cell_is_active(ci, e) && t->type == task_type_drift) - {;} - + /* Special treatement for drifts */ + if (!cell_is_active(ci, e) && t->type == task_type_drift) { + ; + } + } else { /* pair */ if (!cell_is_active(ci, e) && !cell_is_active(cj, e)) error( @@ -1237,7 +1239,7 @@ void *runner_main(void *data) { break; #endif case task_type_drift: - // runner_do_drift(r, ci, 1); + runner_do_drift(r, ci, 1); break; case task_type_kick: runner_do_kick(r, ci, 1); diff --git a/src/scheduler.c b/src/scheduler.c index 4574d4a1d91b8b88ee897ba2a202c007a2796234..55ec764e5153fdfe9b282d1a58f6fc2da20e157c 100644 --- a/src/scheduler.c +++ b/src/scheduler.c @@ -133,7 +133,7 @@ static void scheduler_splittask(struct task *t, struct scheduler *s) { /* Non-splittable task? */ if ((t->ci == NULL || (t->type == task_type_pair && t->cj == NULL)) || ((t->type == task_type_kick) && t->ci->nodeID != s->nodeID) || - ((t->type == task_type_drift) && t->ci->nodeID != s->nodeID) || + ((t->type == task_type_drift) && t->ci->nodeID != s->nodeID) || ((t->type == task_type_init) && t->ci->nodeID != s->nodeID)) { t->type = task_type_none; t->skip = 1; @@ -614,19 +614,17 @@ static void scheduler_splittask(struct task *t, struct scheduler *s) { 1 << sid, 0, ci, NULL, 0); else ci->sorts->flags |= (1 << sid); - - scheduler_addunlock(s, ci->sorts, t); - /* Create the drift for ci. */ - if (ci->drift == NULL) { - ci->drift = scheduler_addtask(s, task_type_drift, task_subtype_none, + scheduler_addunlock(s, ci->sorts, t); + + /* Create the drift for ci. */ + if (ci->drift == NULL) { + ci->drift = scheduler_addtask(s, task_type_drift, task_subtype_none, 0, 0, ci, NULL, 0); - scheduler_addunlock(s, ci->drift, ci->sorts); - } + scheduler_addunlock(s, ci->drift, ci->sorts); + } lock_unlock_blind(&ci->lock); - - /* Create the sort for cj. */ lock_lock(&cj->lock); if (cj->sorts == NULL) @@ -637,13 +635,13 @@ static void scheduler_splittask(struct task *t, struct scheduler *s) { scheduler_addunlock(s, cj->sorts, t); - /* Create the drift for cj. */ - if (cj->drift == NULL) { - cj->drift = scheduler_addtask(s, task_type_drift, task_subtype_none, + /* Create the drift for cj. */ + if (cj->drift == NULL) { + cj->drift = scheduler_addtask(s, task_type_drift, task_subtype_none, 0, 0, cj, NULL, 0); - scheduler_addunlock(s, cj->drift, cj->sorts); - } - lock_unlock_blind(&cj->lock); + scheduler_addunlock(s, cj->drift, cj->sorts); + } + lock_unlock_blind(&cj->lock); } } /* pair interaction? */ @@ -802,8 +800,9 @@ void scheduler_set_unlocks(struct scheduler *s) { for (int j = i + 1; j < t->nr_unlock_tasks; j++) { if (t->unlock_tasks[i] == t->unlock_tasks[j]) error("duplicate unlock! t->type=%s/%s unlocking type=%s/%s", - taskID_names[t->type], subtaskID_names[t->subtype], - taskID_names[t->unlock_tasks[i]->type], subtaskID_names[t->unlock_tasks[i]->subtype]); + taskID_names[t->type], subtaskID_names[t->subtype], + taskID_names[t->unlock_tasks[i]->type], + subtaskID_names[t->unlock_tasks[i]->subtype]); } } } @@ -1102,10 +1101,11 @@ void scheduler_start(struct scheduler *s) { taskID_names[t->type], subtaskID_names[t->subtype], ti_current, ci->ti_end_min, t->flags); - /* Special treatement for drifts */ + /* Special treatement for drifts */ if (ci->ti_end_min == ti_current && t->skip && - t->type == task_type_drift) - {;} + t->type == task_type_drift) { + ; + } } else { /* pair */ @@ -1174,7 +1174,7 @@ void scheduler_enqueue(struct scheduler *s, struct task *t) { case task_type_sort: case task_type_ghost: case task_type_kick: - case task_type_drift: + case task_type_drift: case task_type_init: qid = t->ci->super->owner; break; diff --git a/src/space.c b/src/space.c index 935677a9ebed97acfde8341ec1545ef4f33a56c0..f3b19ab598d762f4c89fd8fc4ff937651d4bb87f 100644 --- a/src/space.c +++ b/src/space.c @@ -409,6 +409,7 @@ void space_regrid(struct space *s, int verbose) { s->cells_top[k].extra_ghost = NULL; s->cells_top[k].ghost = NULL; s->cells_top[k].kick = NULL; + s->cells_top[k].drift = NULL; s->cells_top[k].cooling = NULL; s->cells_top[k].sourceterms = NULL; s->cells_top[k].super = &s->cells_top[k]; diff --git a/src/task.c b/src/task.c index 19a8959153761d53fbce2b87b7008c3ca1055590..ceea09126c4461135c53c5a5b70355398bb475e7 100644 --- a/src/task.c +++ b/src/task.c @@ -48,10 +48,10 @@ /* Task type names. */ const char *taskID_names[task_type_count] = { - "none", "sort", "self", "pair", "sub_self", - "sub_pair", "init", "ghost", "extra_ghost", "drift", "kick", - "send", "recv", "grav_gather_m", "grav_fft", "grav_mm", - "grav_up", "cooling", "sourceterms"}; + "none", "sort", "self", "pair", "sub_self", + "sub_pair", "init", "ghost", "extra_ghost", "drift", + "kick", "send", "recv", "grav_gather_m", "grav_fft", + "grav_mm", "grav_up", "cooling", "sourceterms"}; const char *subtaskID_names[task_subtype_count] = { "none", "density", "gradient", "force", "grav", "external_grav", "tend"};