diff --git a/src/cell.c b/src/cell.c index a1f57edcca3ff1fb42a93cdf6e222d48a00797ac..d767ac608f212030748f4528a53b10f0a174f135 100644 --- a/src/cell.c +++ b/src/cell.c @@ -1216,6 +1216,12 @@ void cell_make_multipoles(struct cell *c, integertime_t ti_current) { if (c->split) { + /* Start by recursing */ + for (int k = 0; k < 8; ++k) { + if (c->progeny[k] != NULL) + cell_make_multipoles(c->progeny[k], ti_current); + } + /* Compute CoM of all progenies */ double CoM[3] = {0., 0., 0.}; double mass = 0.; @@ -1229,9 +1235,11 @@ void cell_make_multipoles(struct cell *c, integertime_t ti_current) { mass += m->m_pole.M_000; } } - c->multipole->CoM[0] = CoM[0] / mass; - c->multipole->CoM[1] = CoM[1] / mass; - c->multipole->CoM[2] = CoM[2] / mass; + + const double mass_inv = 1. / mass; + c->multipole->CoM[0] = CoM[0] * mass_inv; + c->multipole->CoM[1] = CoM[1] * mass_inv; + c->multipole->CoM[2] = CoM[2] * mass_inv; /* Now shift progeny multipoles and add them up */ struct multipole temp; @@ -1254,13 +1262,13 @@ void cell_make_multipoles(struct cell *c, integertime_t ti_current) { } } /* Alternative upper limit of max CoM<->gpart distance */ - const double dx = c->multipole->CoM[0] > c->loc[0] + c->width[0] / 2. + const double dx = c->multipole->CoM[0] > c->loc[0] + c->width[0] * 0.5 ? c->multipole->CoM[0] - c->loc[0] : c->loc[0] + c->width[0] - c->multipole->CoM[0]; - const double dy = c->multipole->CoM[1] > c->loc[1] + c->width[1] / 2. + const double dy = c->multipole->CoM[1] > c->loc[1] + c->width[1] * 0.5 ? c->multipole->CoM[1] - c->loc[1] : c->loc[1] + c->width[1] - c->multipole->CoM[1]; - const double dz = c->multipole->CoM[2] > c->loc[2] + c->width[2] / 2. + const double dz = c->multipole->CoM[2] > c->loc[2] + c->width[2] * 0.5 ? c->multipole->CoM[2] - c->loc[2] : c->loc[2] + c->width[2] - c->multipole->CoM[2]; @@ -1271,25 +1279,31 @@ void cell_make_multipoles(struct cell *c, integertime_t ti_current) { if (c->gcount > 0) { gravity_P2M(c->multipole, c->gparts, c->gcount); - const double dx = c->multipole->CoM[0] > c->loc[0] + c->width[0] / 2. + const double dx = c->multipole->CoM[0] > c->loc[0] + c->width[0] * 0.5 ? c->multipole->CoM[0] - c->loc[0] : c->loc[0] + c->width[0] - c->multipole->CoM[0]; - const double dy = c->multipole->CoM[1] > c->loc[1] + c->width[1] / 2. + const double dy = c->multipole->CoM[1] > c->loc[1] + c->width[1] * 0.5 ? c->multipole->CoM[1] - c->loc[1] : c->loc[1] + c->width[1] - c->multipole->CoM[1]; - const double dz = c->multipole->CoM[2] > c->loc[2] + c->width[2] / 2. + const double dz = c->multipole->CoM[2] > c->loc[2] + c->width[2] * 0.5 ? c->multipole->CoM[2] - c->loc[2] : c->loc[2] + c->width[2] - c->multipole->CoM[2]; c->multipole->r_max = sqrt(dx * dx + dy * dy + dz * dz); } else { gravity_multipole_init(&c->multipole->m_pole); - c->multipole->CoM[0] = c->loc[0] + c->width[0] / 2.; - c->multipole->CoM[1] = c->loc[1] + c->width[1] / 2.; - c->multipole->CoM[2] = c->loc[2] + c->width[2] / 2.; + c->multipole->CoM[0] = c->loc[0] + c->width[0] * 0.5; + c->multipole->CoM[1] = c->loc[1] + c->width[1] * 0.5; + c->multipole->CoM[2] = c->loc[2] + c->width[2] * 0.5; c->multipole->r_max = 0.; } } + /* Also update the values at rebuild time */ + c->multipole->r_max_rebuild = c->multipole->r_max; + c->multipole->CoM_rebuild[0] = c->multipole->CoM[0]; + c->multipole->CoM_rebuild[1] = c->multipole->CoM[1]; + c->multipole->CoM_rebuild[2] = c->multipole->CoM[2]; + c->ti_old_multipole = ti_current; } @@ -1431,10 +1445,12 @@ void cell_activate_drift_gpart(struct cell *c, struct scheduler *s) { * @brief Activate the sorts up a cell hierarchy. */ void cell_activate_sorts_up(struct cell *c, struct scheduler *s) { + if (c == c->super_hydro) { scheduler_activate(s, c->sorts); if (c->nodeID == engine_rank) cell_activate_drift_part(c, s); } else { + for (struct cell *parent = c->parent; parent != NULL && !parent->do_sub_sort; parent = parent->parent) { parent->do_sub_sort = 1; @@ -1495,8 +1511,9 @@ void cell_activate_subcell_hydro_tasks(struct cell *ci, struct cell *cj, /* Self interaction? */ if (cj == NULL) { + /* Do anything? */ - if (!cell_is_active_hydro(ci, e)) return; + if (ci->count == 0 || !cell_is_active_hydro(ci, e)) return; /* Recurse? */ if (cell_can_recurse_in_self_task(ci)) { @@ -1518,239 +1535,318 @@ void cell_activate_subcell_hydro_tasks(struct cell *ci, struct cell *cj, } } - /* Otherwise, pair interation, recurse? */ - else if (cell_can_recurse_in_pair_task(ci) && - cell_can_recurse_in_pair_task(cj)) { + /* Otherwise, pair interation */ + else { + + /* Should we even bother? */ + if (!cell_is_active_hydro(ci, e) && !cell_is_active_hydro(cj, e)) return; + if (ci->count == 0 || cj->count == 0) return; - /* Get the type of pair if not specified explicitly. */ + /* Get the orientation of the pair. */ double shift[3]; int sid = space_getsid(s->space, &ci, &cj, shift); - /* Different types of flags. */ - switch (sid) { - - /* Regular sub-cell interactions of a single cell. */ - case 0: /* ( 1 , 1 , 1 ) */ - if (ci->progeny[7] != NULL && cj->progeny[0] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[0], s); - break; - - case 1: /* ( 1 , 1 , 0 ) */ - if (ci->progeny[6] != NULL && cj->progeny[0] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[0], s); - if (ci->progeny[6] != NULL && cj->progeny[1] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[1], s); - if (ci->progeny[7] != NULL && cj->progeny[0] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[0], s); - if (ci->progeny[7] != NULL && cj->progeny[1] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[1], s); - break; - - case 2: /* ( 1 , 1 , -1 ) */ - if (ci->progeny[6] != NULL && cj->progeny[1] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[1], s); - break; - - case 3: /* ( 1 , 0 , 1 ) */ - if (ci->progeny[5] != NULL && cj->progeny[0] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[0], s); - if (ci->progeny[5] != NULL && cj->progeny[2] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[2], s); - if (ci->progeny[7] != NULL && cj->progeny[0] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[0], s); - if (ci->progeny[7] != NULL && cj->progeny[2] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[2], s); - break; - - case 4: /* ( 1 , 0 , 0 ) */ - if (ci->progeny[4] != NULL && cj->progeny[0] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[4], cj->progeny[0], s); - if (ci->progeny[4] != NULL && cj->progeny[1] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[4], cj->progeny[1], s); - if (ci->progeny[4] != NULL && cj->progeny[2] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[4], cj->progeny[2], s); - if (ci->progeny[4] != NULL && cj->progeny[3] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[4], cj->progeny[3], s); - if (ci->progeny[5] != NULL && cj->progeny[0] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[0], s); - if (ci->progeny[5] != NULL && cj->progeny[1] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[1], s); - if (ci->progeny[5] != NULL && cj->progeny[2] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[2], s); - if (ci->progeny[5] != NULL && cj->progeny[3] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[3], s); - if (ci->progeny[6] != NULL && cj->progeny[0] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[0], s); - if (ci->progeny[6] != NULL && cj->progeny[1] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[1], s); - if (ci->progeny[6] != NULL && cj->progeny[2] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[2], s); - if (ci->progeny[6] != NULL && cj->progeny[3] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[3], s); - if (ci->progeny[7] != NULL && cj->progeny[0] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[0], s); - if (ci->progeny[7] != NULL && cj->progeny[1] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[1], s); - if (ci->progeny[7] != NULL && cj->progeny[2] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[2], s); - if (ci->progeny[7] != NULL && cj->progeny[3] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[3], s); - break; - - case 5: /* ( 1 , 0 , -1 ) */ - if (ci->progeny[4] != NULL && cj->progeny[1] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[4], cj->progeny[1], s); - if (ci->progeny[4] != NULL && cj->progeny[3] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[4], cj->progeny[3], s); - if (ci->progeny[6] != NULL && cj->progeny[1] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[1], s); - if (ci->progeny[6] != NULL && cj->progeny[3] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[3], s); - break; - - case 6: /* ( 1 , -1 , 1 ) */ - if (ci->progeny[5] != NULL && cj->progeny[2] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[2], s); - break; - - case 7: /* ( 1 , -1 , 0 ) */ - if (ci->progeny[4] != NULL && cj->progeny[2] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[4], cj->progeny[2], s); - if (ci->progeny[4] != NULL && cj->progeny[3] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[4], cj->progeny[3], s); - if (ci->progeny[5] != NULL && cj->progeny[2] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[2], s); - if (ci->progeny[5] != NULL && cj->progeny[3] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[3], s); - break; - - case 8: /* ( 1 , -1 , -1 ) */ - if (ci->progeny[4] != NULL && cj->progeny[3] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[4], cj->progeny[3], s); - break; - - case 9: /* ( 0 , 1 , 1 ) */ - if (ci->progeny[3] != NULL && cj->progeny[0] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[3], cj->progeny[0], s); - if (ci->progeny[3] != NULL && cj->progeny[4] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[3], cj->progeny[4], s); - if (ci->progeny[7] != NULL && cj->progeny[0] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[0], s); - if (ci->progeny[7] != NULL && cj->progeny[4] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[4], s); - break; - - case 10: /* ( 0 , 1 , 0 ) */ - if (ci->progeny[2] != NULL && cj->progeny[0] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[2], cj->progeny[0], s); - if (ci->progeny[2] != NULL && cj->progeny[1] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[2], cj->progeny[1], s); - if (ci->progeny[2] != NULL && cj->progeny[4] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[2], cj->progeny[4], s); - if (ci->progeny[2] != NULL && cj->progeny[5] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[2], cj->progeny[5], s); - if (ci->progeny[3] != NULL && cj->progeny[0] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[3], cj->progeny[0], s); - if (ci->progeny[3] != NULL && cj->progeny[1] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[3], cj->progeny[1], s); - if (ci->progeny[3] != NULL && cj->progeny[4] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[3], cj->progeny[4], s); - if (ci->progeny[3] != NULL && cj->progeny[5] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[3], cj->progeny[5], s); - if (ci->progeny[6] != NULL && cj->progeny[0] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[0], s); - if (ci->progeny[6] != NULL && cj->progeny[1] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[1], s); - if (ci->progeny[6] != NULL && cj->progeny[4] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[4], s); - if (ci->progeny[6] != NULL && cj->progeny[5] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[5], s); - if (ci->progeny[7] != NULL && cj->progeny[0] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[0], s); - if (ci->progeny[7] != NULL && cj->progeny[1] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[1], s); - if (ci->progeny[7] != NULL && cj->progeny[4] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[4], s); - if (ci->progeny[7] != NULL && cj->progeny[5] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[5], s); - break; - - case 11: /* ( 0 , 1 , -1 ) */ - if (ci->progeny[2] != NULL && cj->progeny[1] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[2], cj->progeny[1], s); - if (ci->progeny[2] != NULL && cj->progeny[5] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[2], cj->progeny[5], s); - if (ci->progeny[6] != NULL && cj->progeny[1] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[1], s); - if (ci->progeny[6] != NULL && cj->progeny[5] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[5], s); - break; + /* recurse? */ + if (cell_can_recurse_in_pair_task(ci) && + cell_can_recurse_in_pair_task(cj)) { + + /* Different types of flags. */ + switch (sid) { + + /* Regular sub-cell interactions of a single cell. */ + case 0: /* ( 1 , 1 , 1 ) */ + if (ci->progeny[7] != NULL && cj->progeny[0] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[0], + s); + break; + + case 1: /* ( 1 , 1 , 0 ) */ + if (ci->progeny[6] != NULL && cj->progeny[0] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[0], + s); + if (ci->progeny[6] != NULL && cj->progeny[1] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[1], + s); + if (ci->progeny[7] != NULL && cj->progeny[0] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[0], + s); + if (ci->progeny[7] != NULL && cj->progeny[1] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[1], + s); + break; + + case 2: /* ( 1 , 1 , -1 ) */ + if (ci->progeny[6] != NULL && cj->progeny[1] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[1], + s); + break; + + case 3: /* ( 1 , 0 , 1 ) */ + if (ci->progeny[5] != NULL && cj->progeny[0] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[0], + s); + if (ci->progeny[5] != NULL && cj->progeny[2] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[2], + s); + if (ci->progeny[7] != NULL && cj->progeny[0] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[0], + s); + if (ci->progeny[7] != NULL && cj->progeny[2] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[2], + s); + break; + + case 4: /* ( 1 , 0 , 0 ) */ + if (ci->progeny[4] != NULL && cj->progeny[0] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[4], cj->progeny[0], + s); + if (ci->progeny[4] != NULL && cj->progeny[1] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[4], cj->progeny[1], + s); + if (ci->progeny[4] != NULL && cj->progeny[2] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[4], cj->progeny[2], + s); + if (ci->progeny[4] != NULL && cj->progeny[3] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[4], cj->progeny[3], + s); + if (ci->progeny[5] != NULL && cj->progeny[0] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[0], + s); + if (ci->progeny[5] != NULL && cj->progeny[1] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[1], + s); + if (ci->progeny[5] != NULL && cj->progeny[2] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[2], + s); + if (ci->progeny[5] != NULL && cj->progeny[3] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[3], + s); + if (ci->progeny[6] != NULL && cj->progeny[0] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[0], + s); + if (ci->progeny[6] != NULL && cj->progeny[1] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[1], + s); + if (ci->progeny[6] != NULL && cj->progeny[2] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[2], + s); + if (ci->progeny[6] != NULL && cj->progeny[3] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[3], + s); + if (ci->progeny[7] != NULL && cj->progeny[0] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[0], + s); + if (ci->progeny[7] != NULL && cj->progeny[1] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[1], + s); + if (ci->progeny[7] != NULL && cj->progeny[2] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[2], + s); + if (ci->progeny[7] != NULL && cj->progeny[3] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[3], + s); + break; + + case 5: /* ( 1 , 0 , -1 ) */ + if (ci->progeny[4] != NULL && cj->progeny[1] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[4], cj->progeny[1], + s); + if (ci->progeny[4] != NULL && cj->progeny[3] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[4], cj->progeny[3], + s); + if (ci->progeny[6] != NULL && cj->progeny[1] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[1], + s); + if (ci->progeny[6] != NULL && cj->progeny[3] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[3], + s); + break; + + case 6: /* ( 1 , -1 , 1 ) */ + if (ci->progeny[5] != NULL && cj->progeny[2] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[2], + s); + break; + + case 7: /* ( 1 , -1 , 0 ) */ + if (ci->progeny[4] != NULL && cj->progeny[2] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[4], cj->progeny[2], + s); + if (ci->progeny[4] != NULL && cj->progeny[3] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[4], cj->progeny[3], + s); + if (ci->progeny[5] != NULL && cj->progeny[2] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[2], + s); + if (ci->progeny[5] != NULL && cj->progeny[3] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[3], + s); + break; + + case 8: /* ( 1 , -1 , -1 ) */ + if (ci->progeny[4] != NULL && cj->progeny[3] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[4], cj->progeny[3], + s); + break; + + case 9: /* ( 0 , 1 , 1 ) */ + if (ci->progeny[3] != NULL && cj->progeny[0] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[3], cj->progeny[0], + s); + if (ci->progeny[3] != NULL && cj->progeny[4] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[3], cj->progeny[4], + s); + if (ci->progeny[7] != NULL && cj->progeny[0] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[0], + s); + if (ci->progeny[7] != NULL && cj->progeny[4] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[4], + s); + break; + + case 10: /* ( 0 , 1 , 0 ) */ + if (ci->progeny[2] != NULL && cj->progeny[0] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[2], cj->progeny[0], + s); + if (ci->progeny[2] != NULL && cj->progeny[1] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[2], cj->progeny[1], + s); + if (ci->progeny[2] != NULL && cj->progeny[4] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[2], cj->progeny[4], + s); + if (ci->progeny[2] != NULL && cj->progeny[5] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[2], cj->progeny[5], + s); + if (ci->progeny[3] != NULL && cj->progeny[0] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[3], cj->progeny[0], + s); + if (ci->progeny[3] != NULL && cj->progeny[1] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[3], cj->progeny[1], + s); + if (ci->progeny[3] != NULL && cj->progeny[4] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[3], cj->progeny[4], + s); + if (ci->progeny[3] != NULL && cj->progeny[5] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[3], cj->progeny[5], + s); + if (ci->progeny[6] != NULL && cj->progeny[0] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[0], + s); + if (ci->progeny[6] != NULL && cj->progeny[1] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[1], + s); + if (ci->progeny[6] != NULL && cj->progeny[4] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[4], + s); + if (ci->progeny[6] != NULL && cj->progeny[5] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[5], + s); + if (ci->progeny[7] != NULL && cj->progeny[0] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[0], + s); + if (ci->progeny[7] != NULL && cj->progeny[1] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[1], + s); + if (ci->progeny[7] != NULL && cj->progeny[4] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[4], + s); + if (ci->progeny[7] != NULL && cj->progeny[5] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[5], + s); + break; + + case 11: /* ( 0 , 1 , -1 ) */ + if (ci->progeny[2] != NULL && cj->progeny[1] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[2], cj->progeny[1], + s); + if (ci->progeny[2] != NULL && cj->progeny[5] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[2], cj->progeny[5], + s); + if (ci->progeny[6] != NULL && cj->progeny[1] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[1], + s); + if (ci->progeny[6] != NULL && cj->progeny[5] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[5], + s); + break; + + case 12: /* ( 0 , 0 , 1 ) */ + if (ci->progeny[1] != NULL && cj->progeny[0] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[1], cj->progeny[0], + s); + if (ci->progeny[1] != NULL && cj->progeny[2] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[1], cj->progeny[2], + s); + if (ci->progeny[1] != NULL && cj->progeny[4] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[1], cj->progeny[4], + s); + if (ci->progeny[1] != NULL && cj->progeny[6] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[1], cj->progeny[6], + s); + if (ci->progeny[3] != NULL && cj->progeny[0] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[3], cj->progeny[0], + s); + if (ci->progeny[3] != NULL && cj->progeny[2] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[3], cj->progeny[2], + s); + if (ci->progeny[3] != NULL && cj->progeny[4] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[3], cj->progeny[4], + s); + if (ci->progeny[3] != NULL && cj->progeny[6] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[3], cj->progeny[6], + s); + if (ci->progeny[5] != NULL && cj->progeny[0] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[0], + s); + if (ci->progeny[5] != NULL && cj->progeny[2] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[2], + s); + if (ci->progeny[5] != NULL && cj->progeny[4] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[4], + s); + if (ci->progeny[5] != NULL && cj->progeny[6] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[6], + s); + if (ci->progeny[7] != NULL && cj->progeny[0] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[0], + s); + if (ci->progeny[7] != NULL && cj->progeny[2] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[2], + s); + if (ci->progeny[7] != NULL && cj->progeny[4] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[4], + s); + if (ci->progeny[7] != NULL && cj->progeny[6] != NULL) + cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[6], + s); + break; + } - case 12: /* ( 0 , 0 , 1 ) */ - if (ci->progeny[1] != NULL && cj->progeny[0] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[1], cj->progeny[0], s); - if (ci->progeny[1] != NULL && cj->progeny[2] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[1], cj->progeny[2], s); - if (ci->progeny[1] != NULL && cj->progeny[4] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[1], cj->progeny[4], s); - if (ci->progeny[1] != NULL && cj->progeny[6] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[1], cj->progeny[6], s); - if (ci->progeny[3] != NULL && cj->progeny[0] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[3], cj->progeny[0], s); - if (ci->progeny[3] != NULL && cj->progeny[2] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[3], cj->progeny[2], s); - if (ci->progeny[3] != NULL && cj->progeny[4] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[3], cj->progeny[4], s); - if (ci->progeny[3] != NULL && cj->progeny[6] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[3], cj->progeny[6], s); - if (ci->progeny[5] != NULL && cj->progeny[0] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[0], s); - if (ci->progeny[5] != NULL && cj->progeny[2] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[2], s); - if (ci->progeny[5] != NULL && cj->progeny[4] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[4], s); - if (ci->progeny[5] != NULL && cj->progeny[6] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[6], s); - if (ci->progeny[7] != NULL && cj->progeny[0] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[0], s); - if (ci->progeny[7] != NULL && cj->progeny[2] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[2], s); - if (ci->progeny[7] != NULL && cj->progeny[4] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[4], s); - if (ci->progeny[7] != NULL && cj->progeny[6] != NULL) - cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[6], s); - break; } - } - - /* Otherwise, activate the sorts and drifts. */ - else if (cell_is_active_hydro(ci, e) || cell_is_active_hydro(cj, e)) { - - /* Get the type of pair if not specified explicitly. */ - double shift[3]; - int sid = space_getsid(s->space, &ci, &cj, shift); + /* Otherwise, activate the sorts and drifts. */ + else if (cell_is_active_hydro(ci, e) || cell_is_active_hydro(cj, e)) { - /* We are going to interact this pair, so store some values. */ - atomic_or(&ci->requires_sorts, 1 << sid); - atomic_or(&cj->requires_sorts, 1 << sid); - ci->dx_max_sort_old = ci->dx_max_sort; - cj->dx_max_sort_old = cj->dx_max_sort; + /* We are going to interact this pair, so store some values. */ + atomic_or(&ci->requires_sorts, 1 << sid); + atomic_or(&cj->requires_sorts, 1 << sid); + ci->dx_max_sort_old = ci->dx_max_sort; + cj->dx_max_sort_old = cj->dx_max_sort; - /* Activate the drifts if the cells are local. */ - if (ci->nodeID == engine_rank) cell_activate_drift_part(ci, s); - if (cj->nodeID == engine_rank) cell_activate_drift_part(cj, s); + /* Activate the drifts if the cells are local. */ + if (ci->nodeID == engine_rank) cell_activate_drift_part(ci, s); + if (cj->nodeID == engine_rank) cell_activate_drift_part(cj, s); - /* Do we need to sort the cells? */ - cell_activate_sorts(ci, sid, s); - cell_activate_sorts(cj, sid, s); - } + /* Do we need to sort the cells? */ + cell_activate_sorts(ci, sid, s); + cell_activate_sorts(cj, sid, s); + } + } /* Otherwise, pair interation */ } /** - * @brief Traverse a sub-cell task and activate the gravity drift tasks that are - * required - * by a self gravity task. + * @brief Traverse a sub-cell task and activate the gravity drift tasks that + * are required by a self gravity task. * * @param ci The first #cell we recurse in. * @param cj The second #cell we recurse in. @@ -1769,7 +1865,7 @@ void cell_activate_subcell_grav_tasks(struct cell *ci, struct cell *cj, if (cj == NULL) { /* Do anything? */ - if (!cell_is_active_gravity(ci, e)) return; + if (ci->gcount || !cell_is_active_gravity(ci, e)) return; /* Recurse? */ if (ci->split) { @@ -1797,15 +1893,20 @@ void cell_activate_subcell_grav_tasks(struct cell *ci, struct cell *cj, /* Anything to do here? */ if (!cell_is_active_gravity(ci, e) && !cell_is_active_gravity(cj, e)) return; + if (ci->gcount == 0 || cj->gcount == 0) return; /* Atomically drift the multipole in ci */ lock_lock(&ci->mlock); - if (ci->ti_old_multipole < e->ti_current) cell_drift_multipole(ci, e); + if (ci->ti_old_multipole < e->ti_current) { /* message("oo"); */ + cell_drift_multipole(ci, e); + } if (lock_unlock(&ci->mlock) != 0) error("Impossible to unlock m-pole"); /* Atomically drift the multipole in cj */ lock_lock(&cj->mlock); - if (cj->ti_old_multipole < e->ti_current) cell_drift_multipole(cj, e); + if (cj->ti_old_multipole < e->ti_current) { /* message("bb"); */ + cell_drift_multipole(cj, e); + } if (lock_unlock(&cj->mlock) != 0) error("Impossible to unlock m-pole"); /* Recover the multipole information */ @@ -1891,9 +1992,8 @@ void cell_activate_subcell_grav_tasks(struct cell *ci, struct cell *cj, } /** - * @brief Traverse a sub-cell task and activate the gravity drift tasks that are - * required - * by an external gravity task. + * @brief Traverse a sub-cell task and activate the gravity drift tasks that + * are required by an external gravity task. * * @param ci The #cell we recurse in. * @param s The task #scheduler. @@ -2095,8 +2195,8 @@ int cell_unskip_hydro_tasks(struct cell *c, struct scheduler *s) { } /** - * @brief Un-skips all the gravity tasks associated with a given cell and checks - * if the space needs to be rebuilt. + * @brief Un-skips all the gravity tasks associated with a given cell and + * checks if the space needs to be rebuilt. * * @param c the #cell. * @param s the #scheduler. @@ -2210,7 +2310,8 @@ int cell_unskip_gravity_tasks(struct cell *c, struct scheduler *s) { * @brief Set the super-cell pointers for all cells in a hierarchy. * * @param c The top-level #cell to play with. - * @param super Pointer to the deepest cell with tasks in this part of the tree. + * @param super Pointer to the deepest cell with tasks in this part of the + * tree. */ void cell_set_super(struct cell *c, struct cell *super) { @@ -2230,8 +2331,8 @@ void cell_set_super(struct cell *c, struct cell *super) { * @brief Set the super-cell pointers for all cells in a hierarchy. * * @param c The top-level #cell to play with. - * @param super_hydro Pointer to the deepest cell with tasks in this part of the - * tree. + * @param super_hydro Pointer to the deepest cell with tasks in this part of + * the tree. */ void cell_set_super_hydro(struct cell *c, struct cell *super_hydro) { @@ -2580,6 +2681,8 @@ void cell_drift_all_multipoles(struct cell *c, const struct engine *e) { if (ti_current < ti_old_multipole) error("Attempt to drift to the past"); #endif + // error("aaa"); + /* Drift from the last time the cell was drifted to the current time */ double dt_drift; if (e->policy & engine_policy_cosmology) @@ -2623,6 +2726,8 @@ void cell_drift_multipole(struct cell *c, const struct engine *e) { if (ti_current < ti_old_multipole) error("Attempt to drift to the past"); #endif + // error("aaa"); + /* Drift from the last time the cell was drifted to the current time */ double dt_drift; if (e->policy & engine_policy_cosmology)