Skip to content
Snippets Groups Projects
Commit db8c453d authored by Matthieu Schaller's avatar Matthieu Schaller
Browse files

Merge branch 'improve_unskip' into 'master'

Improve unskip by escaping early

See merge request !528
parents b30f76d2 4771e9a3
Branches
No related tags found
1 merge request!528Improve unskip by escaping early
...@@ -1221,6 +1221,12 @@ void cell_make_multipoles(struct cell *c, integertime_t ti_current) { ...@@ -1221,6 +1221,12 @@ void cell_make_multipoles(struct cell *c, integertime_t ti_current) {
if (c->split) { 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 */ /* Compute CoM of all progenies */
double CoM[3] = {0., 0., 0.}; double CoM[3] = {0., 0., 0.};
double mass = 0.; double mass = 0.;
...@@ -1234,9 +1240,11 @@ void cell_make_multipoles(struct cell *c, integertime_t ti_current) { ...@@ -1234,9 +1240,11 @@ void cell_make_multipoles(struct cell *c, integertime_t ti_current) {
mass += m->m_pole.M_000; mass += m->m_pole.M_000;
} }
} }
c->multipole->CoM[0] = CoM[0] / mass;
c->multipole->CoM[1] = CoM[1] / mass; const double mass_inv = 1. / mass;
c->multipole->CoM[2] = CoM[2] / 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 */ /* Now shift progeny multipoles and add them up */
struct multipole temp; struct multipole temp;
...@@ -1259,13 +1267,13 @@ void cell_make_multipoles(struct cell *c, integertime_t ti_current) { ...@@ -1259,13 +1267,13 @@ void cell_make_multipoles(struct cell *c, integertime_t ti_current) {
} }
} }
/* Alternative upper limit of max CoM<->gpart distance */ /* 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->multipole->CoM[0] - c->loc[0]
: c->loc[0] + c->width[0] - c->multipole->CoM[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->multipole->CoM[1] - c->loc[1]
: c->loc[1] + c->width[1] - c->multipole->CoM[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->multipole->CoM[2] - c->loc[2]
: c->loc[2] + c->width[2] - c->multipole->CoM[2]; : c->loc[2] + c->width[2] - c->multipole->CoM[2];
...@@ -1276,25 +1284,31 @@ void cell_make_multipoles(struct cell *c, integertime_t ti_current) { ...@@ -1276,25 +1284,31 @@ void cell_make_multipoles(struct cell *c, integertime_t ti_current) {
if (c->gcount > 0) { if (c->gcount > 0) {
gravity_P2M(c->multipole, c->gparts, c->gcount); 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->multipole->CoM[0] - c->loc[0]
: c->loc[0] + c->width[0] - c->multipole->CoM[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->multipole->CoM[1] - c->loc[1]
: c->loc[1] + c->width[1] - c->multipole->CoM[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->multipole->CoM[2] - c->loc[2]
: c->loc[2] + c->width[2] - c->multipole->CoM[2]; : c->loc[2] + c->width[2] - c->multipole->CoM[2];
c->multipole->r_max = sqrt(dx * dx + dy * dy + dz * dz); c->multipole->r_max = sqrt(dx * dx + dy * dy + dz * dz);
} else { } else {
gravity_multipole_init(&c->multipole->m_pole); gravity_multipole_init(&c->multipole->m_pole);
c->multipole->CoM[0] = c->loc[0] + c->width[0] / 2.; c->multipole->CoM[0] = c->loc[0] + c->width[0] * 0.5;
c->multipole->CoM[1] = c->loc[1] + c->width[1] / 2.; c->multipole->CoM[1] = c->loc[1] + c->width[1] * 0.5;
c->multipole->CoM[2] = c->loc[2] + c->width[2] / 2.; c->multipole->CoM[2] = c->loc[2] + c->width[2] * 0.5;
c->multipole->r_max = 0.; 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; c->ti_old_multipole = ti_current;
} }
...@@ -1436,10 +1450,12 @@ void cell_activate_drift_gpart(struct cell *c, struct scheduler *s) { ...@@ -1436,10 +1450,12 @@ void cell_activate_drift_gpart(struct cell *c, struct scheduler *s) {
* @brief Activate the sorts up a cell hierarchy. * @brief Activate the sorts up a cell hierarchy.
*/ */
void cell_activate_sorts_up(struct cell *c, struct scheduler *s) { void cell_activate_sorts_up(struct cell *c, struct scheduler *s) {
if (c == c->super_hydro) { if (c == c->super_hydro) {
scheduler_activate(s, c->sorts); scheduler_activate(s, c->sorts);
if (c->nodeID == engine_rank) cell_activate_drift_part(c, s); if (c->nodeID == engine_rank) cell_activate_drift_part(c, s);
} else { } else {
for (struct cell *parent = c->parent; for (struct cell *parent = c->parent;
parent != NULL && !parent->do_sub_sort; parent = parent->parent) { parent != NULL && !parent->do_sub_sort; parent = parent->parent) {
parent->do_sub_sort = 1; parent->do_sub_sort = 1;
...@@ -1500,8 +1516,9 @@ void cell_activate_subcell_hydro_tasks(struct cell *ci, struct cell *cj, ...@@ -1500,8 +1516,9 @@ void cell_activate_subcell_hydro_tasks(struct cell *ci, struct cell *cj,
/* Self interaction? */ /* Self interaction? */
if (cj == NULL) { if (cj == NULL) {
/* Do anything? */ /* Do anything? */
if (!cell_is_active_hydro(ci, e)) return; if (ci->count == 0 || !cell_is_active_hydro(ci, e)) return;
/* Recurse? */ /* Recurse? */
if (cell_can_recurse_in_self_task(ci)) { if (cell_can_recurse_in_self_task(ci)) {
...@@ -1523,207 +1540,290 @@ void cell_activate_subcell_hydro_tasks(struct cell *ci, struct cell *cj, ...@@ -1523,207 +1540,290 @@ void cell_activate_subcell_hydro_tasks(struct cell *ci, struct cell *cj,
} }
} }
/* Otherwise, pair interation, recurse? */ /* Otherwise, pair interation */
else if (cell_can_recurse_in_pair_task(ci) && else {
cell_can_recurse_in_pair_task(cj)) {
/* 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]; double shift[3];
int sid = space_getsid(s->space, &ci, &cj, shift); int sid = space_getsid(s->space, &ci, &cj, shift);
/* recurse? */
if (cell_can_recurse_in_pair_task(ci) &&
cell_can_recurse_in_pair_task(cj)) {
/* Different types of flags. */ /* Different types of flags. */
switch (sid) { switch (sid) {
/* Regular sub-cell interactions of a single cell. */ /* Regular sub-cell interactions of a single cell. */
case 0: /* ( 1 , 1 , 1 ) */ case 0: /* ( 1 , 1 , 1 ) */
if (ci->progeny[7] != NULL && cj->progeny[0] != NULL) if (ci->progeny[7] != NULL && cj->progeny[0] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[0], s); cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[0],
s);
break; break;
case 1: /* ( 1 , 1 , 0 ) */ case 1: /* ( 1 , 1 , 0 ) */
if (ci->progeny[6] != NULL && cj->progeny[0] != NULL) if (ci->progeny[6] != NULL && cj->progeny[0] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[0], s); cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[0],
s);
if (ci->progeny[6] != NULL && cj->progeny[1] != NULL) if (ci->progeny[6] != NULL && cj->progeny[1] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[1], s); cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[1],
s);
if (ci->progeny[7] != NULL && cj->progeny[0] != NULL) if (ci->progeny[7] != NULL && cj->progeny[0] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[0], s); cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[0],
s);
if (ci->progeny[7] != NULL && cj->progeny[1] != NULL) if (ci->progeny[7] != NULL && cj->progeny[1] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[1], s); cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[1],
s);
break; break;
case 2: /* ( 1 , 1 , -1 ) */ case 2: /* ( 1 , 1 , -1 ) */
if (ci->progeny[6] != NULL && cj->progeny[1] != NULL) if (ci->progeny[6] != NULL && cj->progeny[1] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[1], s); cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[1],
s);
break; break;
case 3: /* ( 1 , 0 , 1 ) */ case 3: /* ( 1 , 0 , 1 ) */
if (ci->progeny[5] != NULL && cj->progeny[0] != NULL) if (ci->progeny[5] != NULL && cj->progeny[0] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[0], s); cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[0],
s);
if (ci->progeny[5] != NULL && cj->progeny[2] != NULL) if (ci->progeny[5] != NULL && cj->progeny[2] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[2], s); cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[2],
s);
if (ci->progeny[7] != NULL && cj->progeny[0] != NULL) if (ci->progeny[7] != NULL && cj->progeny[0] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[0], s); cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[0],
s);
if (ci->progeny[7] != NULL && cj->progeny[2] != NULL) if (ci->progeny[7] != NULL && cj->progeny[2] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[2], s); cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[2],
s);
break; break;
case 4: /* ( 1 , 0 , 0 ) */ case 4: /* ( 1 , 0 , 0 ) */
if (ci->progeny[4] != NULL && cj->progeny[0] != NULL) if (ci->progeny[4] != NULL && cj->progeny[0] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[4], cj->progeny[0], s); cell_activate_subcell_hydro_tasks(ci->progeny[4], cj->progeny[0],
s);
if (ci->progeny[4] != NULL && cj->progeny[1] != NULL) if (ci->progeny[4] != NULL && cj->progeny[1] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[4], cj->progeny[1], s); cell_activate_subcell_hydro_tasks(ci->progeny[4], cj->progeny[1],
s);
if (ci->progeny[4] != NULL && cj->progeny[2] != NULL) if (ci->progeny[4] != NULL && cj->progeny[2] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[4], cj->progeny[2], s); cell_activate_subcell_hydro_tasks(ci->progeny[4], cj->progeny[2],
s);
if (ci->progeny[4] != NULL && cj->progeny[3] != NULL) if (ci->progeny[4] != NULL && cj->progeny[3] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[4], cj->progeny[3], s); cell_activate_subcell_hydro_tasks(ci->progeny[4], cj->progeny[3],
s);
if (ci->progeny[5] != NULL && cj->progeny[0] != NULL) if (ci->progeny[5] != NULL && cj->progeny[0] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[0], s); cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[0],
s);
if (ci->progeny[5] != NULL && cj->progeny[1] != NULL) if (ci->progeny[5] != NULL && cj->progeny[1] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[1], s); cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[1],
s);
if (ci->progeny[5] != NULL && cj->progeny[2] != NULL) if (ci->progeny[5] != NULL && cj->progeny[2] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[2], s); cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[2],
s);
if (ci->progeny[5] != NULL && cj->progeny[3] != NULL) if (ci->progeny[5] != NULL && cj->progeny[3] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[3], s); cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[3],
s);
if (ci->progeny[6] != NULL && cj->progeny[0] != NULL) if (ci->progeny[6] != NULL && cj->progeny[0] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[0], s); cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[0],
s);
if (ci->progeny[6] != NULL && cj->progeny[1] != NULL) if (ci->progeny[6] != NULL && cj->progeny[1] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[1], s); cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[1],
s);
if (ci->progeny[6] != NULL && cj->progeny[2] != NULL) if (ci->progeny[6] != NULL && cj->progeny[2] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[2], s); cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[2],
s);
if (ci->progeny[6] != NULL && cj->progeny[3] != NULL) if (ci->progeny[6] != NULL && cj->progeny[3] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[3], s); cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[3],
s);
if (ci->progeny[7] != NULL && cj->progeny[0] != NULL) if (ci->progeny[7] != NULL && cj->progeny[0] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[0], s); cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[0],
s);
if (ci->progeny[7] != NULL && cj->progeny[1] != NULL) if (ci->progeny[7] != NULL && cj->progeny[1] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[1], s); cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[1],
s);
if (ci->progeny[7] != NULL && cj->progeny[2] != NULL) if (ci->progeny[7] != NULL && cj->progeny[2] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[2], s); cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[2],
s);
if (ci->progeny[7] != NULL && cj->progeny[3] != NULL) if (ci->progeny[7] != NULL && cj->progeny[3] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[3], s); cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[3],
s);
break; break;
case 5: /* ( 1 , 0 , -1 ) */ case 5: /* ( 1 , 0 , -1 ) */
if (ci->progeny[4] != NULL && cj->progeny[1] != NULL) if (ci->progeny[4] != NULL && cj->progeny[1] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[4], cj->progeny[1], s); cell_activate_subcell_hydro_tasks(ci->progeny[4], cj->progeny[1],
s);
if (ci->progeny[4] != NULL && cj->progeny[3] != NULL) if (ci->progeny[4] != NULL && cj->progeny[3] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[4], cj->progeny[3], s); cell_activate_subcell_hydro_tasks(ci->progeny[4], cj->progeny[3],
s);
if (ci->progeny[6] != NULL && cj->progeny[1] != NULL) if (ci->progeny[6] != NULL && cj->progeny[1] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[1], s); cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[1],
s);
if (ci->progeny[6] != NULL && cj->progeny[3] != NULL) if (ci->progeny[6] != NULL && cj->progeny[3] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[3], s); cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[3],
s);
break; break;
case 6: /* ( 1 , -1 , 1 ) */ case 6: /* ( 1 , -1 , 1 ) */
if (ci->progeny[5] != NULL && cj->progeny[2] != NULL) if (ci->progeny[5] != NULL && cj->progeny[2] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[2], s); cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[2],
s);
break; break;
case 7: /* ( 1 , -1 , 0 ) */ case 7: /* ( 1 , -1 , 0 ) */
if (ci->progeny[4] != NULL && cj->progeny[2] != NULL) if (ci->progeny[4] != NULL && cj->progeny[2] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[4], cj->progeny[2], s); cell_activate_subcell_hydro_tasks(ci->progeny[4], cj->progeny[2],
s);
if (ci->progeny[4] != NULL && cj->progeny[3] != NULL) if (ci->progeny[4] != NULL && cj->progeny[3] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[4], cj->progeny[3], s); cell_activate_subcell_hydro_tasks(ci->progeny[4], cj->progeny[3],
s);
if (ci->progeny[5] != NULL && cj->progeny[2] != NULL) if (ci->progeny[5] != NULL && cj->progeny[2] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[2], s); cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[2],
s);
if (ci->progeny[5] != NULL && cj->progeny[3] != NULL) if (ci->progeny[5] != NULL && cj->progeny[3] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[3], s); cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[3],
s);
break; break;
case 8: /* ( 1 , -1 , -1 ) */ case 8: /* ( 1 , -1 , -1 ) */
if (ci->progeny[4] != NULL && cj->progeny[3] != NULL) if (ci->progeny[4] != NULL && cj->progeny[3] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[4], cj->progeny[3], s); cell_activate_subcell_hydro_tasks(ci->progeny[4], cj->progeny[3],
s);
break; break;
case 9: /* ( 0 , 1 , 1 ) */ case 9: /* ( 0 , 1 , 1 ) */
if (ci->progeny[3] != NULL && cj->progeny[0] != NULL) if (ci->progeny[3] != NULL && cj->progeny[0] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[3], cj->progeny[0], s); cell_activate_subcell_hydro_tasks(ci->progeny[3], cj->progeny[0],
s);
if (ci->progeny[3] != NULL && cj->progeny[4] != NULL) if (ci->progeny[3] != NULL && cj->progeny[4] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[3], cj->progeny[4], s); cell_activate_subcell_hydro_tasks(ci->progeny[3], cj->progeny[4],
s);
if (ci->progeny[7] != NULL && cj->progeny[0] != NULL) if (ci->progeny[7] != NULL && cj->progeny[0] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[0], s); cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[0],
s);
if (ci->progeny[7] != NULL && cj->progeny[4] != NULL) if (ci->progeny[7] != NULL && cj->progeny[4] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[4], s); cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[4],
s);
break; break;
case 10: /* ( 0 , 1 , 0 ) */ case 10: /* ( 0 , 1 , 0 ) */
if (ci->progeny[2] != NULL && cj->progeny[0] != NULL) if (ci->progeny[2] != NULL && cj->progeny[0] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[2], cj->progeny[0], s); cell_activate_subcell_hydro_tasks(ci->progeny[2], cj->progeny[0],
s);
if (ci->progeny[2] != NULL && cj->progeny[1] != NULL) if (ci->progeny[2] != NULL && cj->progeny[1] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[2], cj->progeny[1], s); cell_activate_subcell_hydro_tasks(ci->progeny[2], cj->progeny[1],
s);
if (ci->progeny[2] != NULL && cj->progeny[4] != NULL) if (ci->progeny[2] != NULL && cj->progeny[4] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[2], cj->progeny[4], s); cell_activate_subcell_hydro_tasks(ci->progeny[2], cj->progeny[4],
s);
if (ci->progeny[2] != NULL && cj->progeny[5] != NULL) if (ci->progeny[2] != NULL && cj->progeny[5] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[2], cj->progeny[5], s); cell_activate_subcell_hydro_tasks(ci->progeny[2], cj->progeny[5],
s);
if (ci->progeny[3] != NULL && cj->progeny[0] != NULL) if (ci->progeny[3] != NULL && cj->progeny[0] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[3], cj->progeny[0], s); cell_activate_subcell_hydro_tasks(ci->progeny[3], cj->progeny[0],
s);
if (ci->progeny[3] != NULL && cj->progeny[1] != NULL) if (ci->progeny[3] != NULL && cj->progeny[1] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[3], cj->progeny[1], s); cell_activate_subcell_hydro_tasks(ci->progeny[3], cj->progeny[1],
s);
if (ci->progeny[3] != NULL && cj->progeny[4] != NULL) if (ci->progeny[3] != NULL && cj->progeny[4] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[3], cj->progeny[4], s); cell_activate_subcell_hydro_tasks(ci->progeny[3], cj->progeny[4],
s);
if (ci->progeny[3] != NULL && cj->progeny[5] != NULL) if (ci->progeny[3] != NULL && cj->progeny[5] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[3], cj->progeny[5], s); cell_activate_subcell_hydro_tasks(ci->progeny[3], cj->progeny[5],
s);
if (ci->progeny[6] != NULL && cj->progeny[0] != NULL) if (ci->progeny[6] != NULL && cj->progeny[0] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[0], s); cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[0],
s);
if (ci->progeny[6] != NULL && cj->progeny[1] != NULL) if (ci->progeny[6] != NULL && cj->progeny[1] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[1], s); cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[1],
s);
if (ci->progeny[6] != NULL && cj->progeny[4] != NULL) if (ci->progeny[6] != NULL && cj->progeny[4] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[4], s); cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[4],
s);
if (ci->progeny[6] != NULL && cj->progeny[5] != NULL) if (ci->progeny[6] != NULL && cj->progeny[5] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[5], s); cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[5],
s);
if (ci->progeny[7] != NULL && cj->progeny[0] != NULL) if (ci->progeny[7] != NULL && cj->progeny[0] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[0], s); cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[0],
s);
if (ci->progeny[7] != NULL && cj->progeny[1] != NULL) if (ci->progeny[7] != NULL && cj->progeny[1] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[1], s); cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[1],
s);
if (ci->progeny[7] != NULL && cj->progeny[4] != NULL) if (ci->progeny[7] != NULL && cj->progeny[4] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[4], s); cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[4],
s);
if (ci->progeny[7] != NULL && cj->progeny[5] != NULL) if (ci->progeny[7] != NULL && cj->progeny[5] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[5], s); cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[5],
s);
break; break;
case 11: /* ( 0 , 1 , -1 ) */ case 11: /* ( 0 , 1 , -1 ) */
if (ci->progeny[2] != NULL && cj->progeny[1] != NULL) if (ci->progeny[2] != NULL && cj->progeny[1] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[2], cj->progeny[1], s); cell_activate_subcell_hydro_tasks(ci->progeny[2], cj->progeny[1],
s);
if (ci->progeny[2] != NULL && cj->progeny[5] != NULL) if (ci->progeny[2] != NULL && cj->progeny[5] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[2], cj->progeny[5], s); cell_activate_subcell_hydro_tasks(ci->progeny[2], cj->progeny[5],
s);
if (ci->progeny[6] != NULL && cj->progeny[1] != NULL) if (ci->progeny[6] != NULL && cj->progeny[1] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[1], s); cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[1],
s);
if (ci->progeny[6] != NULL && cj->progeny[5] != NULL) if (ci->progeny[6] != NULL && cj->progeny[5] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[5], s); cell_activate_subcell_hydro_tasks(ci->progeny[6], cj->progeny[5],
s);
break; break;
case 12: /* ( 0 , 0 , 1 ) */ case 12: /* ( 0 , 0 , 1 ) */
if (ci->progeny[1] != NULL && cj->progeny[0] != NULL) if (ci->progeny[1] != NULL && cj->progeny[0] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[1], cj->progeny[0], s); cell_activate_subcell_hydro_tasks(ci->progeny[1], cj->progeny[0],
s);
if (ci->progeny[1] != NULL && cj->progeny[2] != NULL) if (ci->progeny[1] != NULL && cj->progeny[2] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[1], cj->progeny[2], s); cell_activate_subcell_hydro_tasks(ci->progeny[1], cj->progeny[2],
s);
if (ci->progeny[1] != NULL && cj->progeny[4] != NULL) if (ci->progeny[1] != NULL && cj->progeny[4] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[1], cj->progeny[4], s); cell_activate_subcell_hydro_tasks(ci->progeny[1], cj->progeny[4],
s);
if (ci->progeny[1] != NULL && cj->progeny[6] != NULL) if (ci->progeny[1] != NULL && cj->progeny[6] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[1], cj->progeny[6], s); cell_activate_subcell_hydro_tasks(ci->progeny[1], cj->progeny[6],
s);
if (ci->progeny[3] != NULL && cj->progeny[0] != NULL) if (ci->progeny[3] != NULL && cj->progeny[0] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[3], cj->progeny[0], s); cell_activate_subcell_hydro_tasks(ci->progeny[3], cj->progeny[0],
s);
if (ci->progeny[3] != NULL && cj->progeny[2] != NULL) if (ci->progeny[3] != NULL && cj->progeny[2] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[3], cj->progeny[2], s); cell_activate_subcell_hydro_tasks(ci->progeny[3], cj->progeny[2],
s);
if (ci->progeny[3] != NULL && cj->progeny[4] != NULL) if (ci->progeny[3] != NULL && cj->progeny[4] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[3], cj->progeny[4], s); cell_activate_subcell_hydro_tasks(ci->progeny[3], cj->progeny[4],
s);
if (ci->progeny[3] != NULL && cj->progeny[6] != NULL) if (ci->progeny[3] != NULL && cj->progeny[6] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[3], cj->progeny[6], s); cell_activate_subcell_hydro_tasks(ci->progeny[3], cj->progeny[6],
s);
if (ci->progeny[5] != NULL && cj->progeny[0] != NULL) if (ci->progeny[5] != NULL && cj->progeny[0] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[0], s); cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[0],
s);
if (ci->progeny[5] != NULL && cj->progeny[2] != NULL) if (ci->progeny[5] != NULL && cj->progeny[2] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[2], s); cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[2],
s);
if (ci->progeny[5] != NULL && cj->progeny[4] != NULL) if (ci->progeny[5] != NULL && cj->progeny[4] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[4], s); cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[4],
s);
if (ci->progeny[5] != NULL && cj->progeny[6] != NULL) if (ci->progeny[5] != NULL && cj->progeny[6] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[6], s); cell_activate_subcell_hydro_tasks(ci->progeny[5], cj->progeny[6],
s);
if (ci->progeny[7] != NULL && cj->progeny[0] != NULL) if (ci->progeny[7] != NULL && cj->progeny[0] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[0], s); cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[0],
s);
if (ci->progeny[7] != NULL && cj->progeny[2] != NULL) if (ci->progeny[7] != NULL && cj->progeny[2] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[2], s); cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[2],
s);
if (ci->progeny[7] != NULL && cj->progeny[4] != NULL) if (ci->progeny[7] != NULL && cj->progeny[4] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[4], s); cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[4],
s);
if (ci->progeny[7] != NULL && cj->progeny[6] != NULL) if (ci->progeny[7] != NULL && cj->progeny[6] != NULL)
cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[6], s); cell_activate_subcell_hydro_tasks(ci->progeny[7], cj->progeny[6],
s);
break; break;
} }
...@@ -1732,10 +1832,6 @@ void cell_activate_subcell_hydro_tasks(struct cell *ci, struct cell *cj, ...@@ -1732,10 +1832,6 @@ void cell_activate_subcell_hydro_tasks(struct cell *ci, struct cell *cj,
/* Otherwise, activate the sorts and drifts. */ /* Otherwise, activate the sorts and drifts. */
else if (cell_is_active_hydro(ci, e) || cell_is_active_hydro(cj, e)) { 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);
/* We are going to interact this pair, so store some values. */ /* We are going to interact this pair, so store some values. */
atomic_or(&ci->requires_sorts, 1 << sid); atomic_or(&ci->requires_sorts, 1 << sid);
atomic_or(&cj->requires_sorts, 1 << sid); atomic_or(&cj->requires_sorts, 1 << sid);
...@@ -1750,12 +1846,12 @@ void cell_activate_subcell_hydro_tasks(struct cell *ci, struct cell *cj, ...@@ -1750,12 +1846,12 @@ void cell_activate_subcell_hydro_tasks(struct cell *ci, struct cell *cj,
cell_activate_sorts(ci, sid, s); cell_activate_sorts(ci, sid, s);
cell_activate_sorts(cj, 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 * @brief Traverse a sub-cell task and activate the gravity drift tasks that
* required * are required by a self gravity task.
* by a self gravity task.
* *
* @param ci The first #cell we recurse in. * @param ci The first #cell we recurse in.
* @param cj The second #cell we recurse in. * @param cj The second #cell we recurse in.
...@@ -1774,7 +1870,7 @@ void cell_activate_subcell_grav_tasks(struct cell *ci, struct cell *cj, ...@@ -1774,7 +1870,7 @@ void cell_activate_subcell_grav_tasks(struct cell *ci, struct cell *cj,
if (cj == NULL) { if (cj == NULL) {
/* Do anything? */ /* Do anything? */
if (!cell_is_active_gravity(ci, e)) return; if (ci->gcount || !cell_is_active_gravity(ci, e)) return;
/* Recurse? */ /* Recurse? */
if (ci->split) { if (ci->split) {
...@@ -1802,6 +1898,7 @@ void cell_activate_subcell_grav_tasks(struct cell *ci, struct cell *cj, ...@@ -1802,6 +1898,7 @@ void cell_activate_subcell_grav_tasks(struct cell *ci, struct cell *cj,
/* Anything to do here? */ /* Anything to do here? */
if (!cell_is_active_gravity(ci, e) && !cell_is_active_gravity(cj, e)) if (!cell_is_active_gravity(ci, e) && !cell_is_active_gravity(cj, e))
return; return;
if (ci->gcount == 0 || cj->gcount == 0) return;
/* Atomically drift the multipole in ci */ /* Atomically drift the multipole in ci */
lock_lock(&ci->mlock); lock_lock(&ci->mlock);
...@@ -1896,9 +1993,8 @@ void cell_activate_subcell_grav_tasks(struct cell *ci, struct cell *cj, ...@@ -1896,9 +1993,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 * @brief Traverse a sub-cell task and activate the gravity drift tasks that
* required * are required by an external gravity task.
* by an external gravity task.
* *
* @param ci The #cell we recurse in. * @param ci The #cell we recurse in.
* @param s The task #scheduler. * @param s The task #scheduler.
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment