diff --git a/src/engine.c b/src/engine.c index 892094896f357ffd040c63f102d4c7a640df18e2..a7e428370a50cfc3231a8c366e063e64fc614ba2 100644 --- a/src/engine.c +++ b/src/engine.c @@ -110,8 +110,8 @@ struct link *engine_addlink(struct engine *e, struct link *l, struct task *t) { } /** - * @brief Generate the hierarchical tasks for a hierarchy of cells - i.e. all - * the O(Npart) tasks. + * @brief Generate the gravity hierarchical tasks for a hierarchy of cells - + * i.e. all the O(Npart) tasks. * * Tasks are only created here. The dependencies will be added later on. * @@ -119,8 +119,8 @@ struct link *engine_addlink(struct engine *e, struct link *l, struct task *t) { * @param c The #cell. * @param super The super #cell. */ -void engine_make_hierarchical_tasks(struct engine *e, struct cell *c, - struct cell *super) { +void engine_make_gravity_hierarchical_tasks(struct engine *e, struct cell *c, + struct cell *super) { struct scheduler *s = &e->sched; const int is_with_external_gravity = @@ -128,10 +128,70 @@ void engine_make_hierarchical_tasks(struct engine *e, struct cell *c, engine_policy_external_gravity; const int is_fixdt = (e->policy & engine_policy_fixdt) == engine_policy_fixdt; - /* Is this the super-cell? - TODO(pedro): Add a condition for gravity tasks as well. */ - if (super == NULL && - (c->density != NULL || (!c->split && (c->count > 0 || c->gcount > 0)))) { + /* Is this the super-cell? */ + if (super == NULL && (c->grav != NULL || (c->gcount > 0 && !c->split))) { + + /* This is the super cell, i.e. the first with gravity tasks attached. */ + super = c; + + /* Local tasks only... */ + if (c->nodeID == e->nodeID) { + + /* Add the init task. */ + if (c->init == NULL) + c->init = scheduler_addtask(s, task_type_init, task_subtype_none, 0, 0, + c, NULL, 0); + + /* Add the drift task. */ + if (c->drift == NULL) + c->drift = scheduler_addtask(s, task_type_drift, task_subtype_none, 0, + 0, c, NULL, 0); + + /* Add the kick task that matches the policy. */ + if (is_fixdt) { + if (c->kick == NULL) + c->kick = scheduler_addtask(s, task_type_kick_fixdt, + task_subtype_none, 0, 0, c, NULL, 0); + } else { + if (c->kick == NULL) + c->kick = scheduler_addtask(s, task_type_kick, task_subtype_none, 0, + 0, c, NULL, 0); + } + + if (is_with_external_gravity) + c->grav_external = scheduler_addtask( + s, task_type_grav_external, task_subtype_none, 0, 0, c, NULL, 0); + } + } + + /* Set the super-cell. */ + c->super = super; + + /* 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); +} + +/** + * @brief Generate the hydro hierarchical tasks for a hierarchy of cells - + * i.e. all the O(Npart) tasks. + * + * Tasks are only created here. The dependencies will be added later on. + * + * @param e The #engine. + * @param c The #cell. + * @param super The super #cell. + */ +void engine_make_hydro_hierarchical_tasks(struct engine *e, struct cell *c, + struct cell *super) { + + struct scheduler *s = &e->sched; + const int is_fixdt = (e->policy & engine_policy_fixdt) == engine_policy_fixdt; + + /* Is this the super-cell? */ + if (super == NULL && (c->density != NULL || (c->count > 0 && !c->split))) { /* This is the super cell, i.e. the first with density tasks attached. */ super = c; @@ -156,20 +216,9 @@ void engine_make_hierarchical_tasks(struct engine *e, struct cell *c, c, NULL, 0); } - if (c->count > 0) { - - /* Generate the ghost task. */ - c->ghost = scheduler_addtask(s, task_type_ghost, task_subtype_none, 0, - 0, c, NULL, 0); - } - - if (c->gcount > 0) { - - /* Add the external gravity tasks */ - if (is_with_external_gravity) - c->grav_external = scheduler_addtask( - s, task_type_grav_external, task_subtype_none, 0, 0, c, NULL, 0); - } + /* Generate the ghost task. */ + c->ghost = scheduler_addtask(s, task_type_ghost, task_subtype_none, 0, 0, + c, NULL, 0); } } @@ -180,7 +229,7 @@ void engine_make_hierarchical_tasks(struct engine *e, struct cell *c, if (c->split) for (int k = 0; k < 8; k++) if (c->progeny[k] != NULL) - engine_make_hierarchical_tasks(e, c->progeny[k], super); + engine_make_hydro_hierarchical_tasks(e, c->progeny[k], super); } /** @@ -849,8 +898,7 @@ void engine_exchange_cells(struct engine *e) { * @param offset_parts The index in the parts array as of which the foreign * parts reside. * @param ind_part The foreign #cell ID of each part. - * @param Npart The number of stray parts, contains the number of parts - *received + * @param Npart The number of stray parts, contains the number of parts received * on return. * @param offset_gparts The index in the gparts array as of which the foreign * parts reside. @@ -1052,8 +1100,7 @@ void engine_exchange_strays(struct engine *e, size_t offset_parts, sizeof(struct gpart) * p->nr_gparts_in); /* for (int k = offset; k < offset + count; k++) message( - "received particle %lli, x=[%.3e %.3e %.3e], h=%.3e, from node - %i.", + "received particle %lli, x=[%.3e %.3e %.3e], h=%.3e, from node %i.", s->parts[k].id, s->parts[k].x[0], s->parts[k].x[1], s->parts[k].x[2], s->parts[k].h, p->nodeID); */ @@ -1167,8 +1214,7 @@ void engine_make_hydroloop_tasks(struct engine *e) { /** * @brief Counts the tasks associated with one cell and constructs the links * - * For each hydrodynamic task, construct the links with the corresponding - *cell. + * For each hydrodynamic task, construct the links with the corresponding cell. * Similarly, construct the dependencies for all the sorting tasks. * * @param e The #engine. @@ -1477,8 +1523,7 @@ void engine_maketasks(struct engine *e) { error("Failed to allocate cell-task links."); e->nr_links = 0; - /* Add the gravity up/down tasks at the top-level cells and push them down. - */ + /* Add the gravity up/down tasks at the top-level cells and push them down. */ if (e->policy & engine_policy_self_gravity) engine_make_gravityrecursive_tasks(e); @@ -1488,8 +1533,14 @@ void engine_maketasks(struct engine *e) { engine_count_and_link_tasks(e); /* Append hierarchical tasks to each cells */ - for (int k = 0; k < nr_cells; k++) - engine_make_hierarchical_tasks(e, &cells[k], NULL); + if (e->policy & engine_policy_hydro) + for (int k = 0; k < nr_cells; k++) + engine_make_hydro_hierarchical_tasks(e, &cells[k], NULL); + + if ((e->policy & engine_policy_self_gravity) || + (e->policy & engine_policy_external_gravity)) + for (int k = 0; k < nr_cells; k++) + engine_make_gravity_hierarchical_tasks(e, &cells[k], NULL); /* Run through the tasks and make force tasks for each density task. Each force task depends on the cell ghosts and unlocks the kick task @@ -2403,8 +2454,7 @@ void engine_makeproxies(struct engine *e) { } /** - * @brief Split the underlying space into regions and assign to separate - *nodes. + * @brief Split the underlying space into regions and assign to separatw nodes. * * @param e The #engine. * @param initial_partition structure defining the cell partition technique @@ -2803,8 +2853,7 @@ void engine_init(struct engine *e, struct space *s, /* Check we have sensible time bounds */ if (e->timeBegin >= e->timeEnd) error( - "Final simulation time (t_end = %e) must be larger than the start " - "time " + "Final simulation time (t_end = %e) must be larger than the start time " "(t_beg = %e)", e->timeEnd, e->timeBegin); @@ -2865,8 +2914,7 @@ void engine_init(struct engine *e, struct space *s, if (e->timeFirstSnapshot < e->timeBegin) error( - "Time of first snapshot (%e) must be after the simulation start " - "t=%e.", + "Time of first snapshot (%e) must be after the simulation start t=%e.", e->timeFirstSnapshot, e->timeBegin); /* Find the time of the first output */