diff --git a/src/cell.h b/src/cell.h index a2f7ab6912a6d5a9a788658e48ae160e4be049dc..9f3971dd59c943ebd49a9ac1c812b612ab68bdaf 100644 --- a/src/cell.h +++ b/src/cell.h @@ -128,9 +128,14 @@ struct cell { /* Parent cell. */ struct cell *parent; - /* Super cell, i.e. the highest-level supercell that has interactions. */ + /* Super cell, i.e. the highest-level supercell that has hydro interactions. + */ struct cell *super; + /* Super cell, i.e. the highest-level supercell that has gravity interactions. + */ + struct cell *gsuper; + /* The task computing this cell's sorts. */ struct task *sorts; int sortsize; diff --git a/src/engine.c b/src/engine.c index 5078c75873e41b1276d4bb8c5ec716a5a24fd467..8dde99b8eb6f6b4fe3364149635fc9aa7be89c70 100644 --- a/src/engine.c +++ b/src/engine.c @@ -118,10 +118,10 @@ void engine_addlink(struct engine *e, struct link **l, struct task *t) { * * @param e The #engine. * @param c The #cell. - * @param super The super #cell. + * @param gsuper The gsuper #cell. */ void engine_make_gravity_hierarchical_tasks(struct engine *e, struct cell *c, - struct cell *super) { + struct cell *gsuper) { struct scheduler *s = &e->sched; const int is_with_external_gravity = @@ -130,10 +130,10 @@ void engine_make_gravity_hierarchical_tasks(struct engine *e, struct cell *c, const int is_fixdt = (e->policy & engine_policy_fixdt) == engine_policy_fixdt; /* Is this the super-cell? */ - if (super == NULL && (c->grav != NULL || (!c->split && c->gcount > 0))) { + if (gsuper == NULL && (c->grav != NULL || (!c->split && c->gcount > 0))) { /* This is the super cell, i.e. the first with gravity tasks attached. */ - super = c; + gsuper = c; /* Local tasks only... */ if (c->nodeID == e->nodeID) { @@ -161,13 +161,13 @@ void engine_make_gravity_hierarchical_tasks(struct engine *e, struct cell *c, } /* Set the super-cell. */ - c->super = super; + c->gsuper = gsuper; /* Recurse. */ if (c->split) for (int k = 0; k < 8; k++) if (c->progeny[k] != NULL) - engine_make_gravity_hierarchical_tasks(e, c->progeny[k], super); + engine_make_gravity_hierarchical_tasks(e, c->progeny[k], gsuper); } /** @@ -1424,11 +1424,11 @@ static inline void engine_make_gravity_dependencies(struct scheduler *sched, struct cell *c) { /* init --> gravity --> kick */ - scheduler_addunlock(sched, c->super->init, gravity); - scheduler_addunlock(sched, gravity, c->super->kick); + scheduler_addunlock(sched, c->gsuper->init, gravity); + scheduler_addunlock(sched, gravity, c->gsuper->kick); /* grav_up --> gravity ( --> kick) */ - scheduler_addunlock(sched, c->super->grav_up, gravity); + scheduler_addunlock(sched, c->gsuper->grav_up, gravity); } /** @@ -1470,10 +1470,10 @@ void engine_link_gravity_tasks(struct engine *e) { /* Gather the multipoles --> mm interaction --> kick */ scheduler_addunlock(sched, gather, t); - scheduler_addunlock(sched, t, t->ci->super->kick); + scheduler_addunlock(sched, t, t->ci->gsuper->kick); /* init --> mm interaction */ - scheduler_addunlock(sched, t->ci->super->init, t); + scheduler_addunlock(sched, t->ci->gsuper->init, t); } /* Self-interaction? */ @@ -1491,7 +1491,7 @@ void engine_link_gravity_tasks(struct engine *e) { engine_make_gravity_dependencies(sched, t, t->ci); } - if (t->cj->nodeID == nodeID && t->ci->super != t->cj->super) { + if (t->cj->nodeID == nodeID && t->ci->gsuper != t->cj->gsuper) { engine_make_gravity_dependencies(sched, t, t->cj); } @@ -1513,7 +1513,7 @@ void engine_link_gravity_tasks(struct engine *e) { engine_make_gravity_dependencies(sched, t, t->ci); } - if (t->cj->nodeID == nodeID && t->ci->super != t->cj->super) { + if (t->cj->nodeID == nodeID && t->ci->gsuper != t->cj->gsuper) { engine_make_gravity_dependencies(sched, t, t->cj); } diff --git a/src/scheduler.c b/src/scheduler.c index ef4d19107fb48684ca299f286436a155a6fe0151..f121f21d579611b76f2b4438bae560863dae727d 100644 --- a/src/scheduler.c +++ b/src/scheduler.c @@ -1104,10 +1104,20 @@ void scheduler_enqueue(struct scheduler *s, struct task *t) { break; case task_type_pair: case task_type_sub_pair: - qid = t->ci->super->owner; - if (qid < 0 || - s->queues[qid].count > s->queues[t->cj->super->owner].count) - qid = t->cj->super->owner; + if (t->subtype == task_subtype_grav) { + + qid = t->ci->gsuper->owner; + if (qid < 0 || + s->queues[qid].count > s->queues[t->cj->gsuper->owner].count) + qid = t->cj->gsuper->owner; + + } else { + + qid = t->ci->super->owner; + if (qid < 0 || + s->queues[qid].count > s->queues[t->cj->super->owner].count) + qid = t->cj->super->owner; + } break; case task_type_recv: #ifdef WITH_MPI diff --git a/src/space.c b/src/space.c index de6ac7226f01b815d39f3c689bdf23d7ad234c20..cccd40ddd7ba5e1de75b1b609d77a919e0d07835 100644 --- a/src/space.c +++ b/src/space.c @@ -295,6 +295,7 @@ void space_regrid(struct space *s, double cell_max, int verbose) { c->count = 0; c->gcount = 0; c->super = c; + c->gsuper = c; c->ti_old = ti_current; lock_init(&c->lock); } @@ -366,6 +367,7 @@ void space_regrid(struct space *s, double cell_max, int verbose) { s->cells[k].ghost = NULL; s->cells[k].kick = NULL; s->cells[k].super = &s->cells[k]; + s->cells[k].gsuper = &s->cells[k]; } s->maxdepth = 0; } @@ -1290,6 +1292,8 @@ void space_split_mapper(void *map_data, int num_elements, void *extra_data) { temp->dx_max = 0.f; temp->nodeID = c->nodeID; temp->parent = c; + temp->super = NULL; + temp->gsuper = NULL; c->progeny[k] = temp; }