diff --git a/src/cell.c b/src/cell.c index 5d6363450e6f36cf797086da32e41d4cd53ed0ed..6d85877e13f4171c76d4261b94b10e8968fa4e66 100644 --- a/src/cell.c +++ b/src/cell.c @@ -1791,7 +1791,7 @@ int cell_unskip_tasks(struct cell *c, struct scheduler *s) { if (l == NULL) error("Missing link to send_ti task."); scheduler_activate(s, l->t); } - } + } else if (t->type == task_type_pair) { /* ci and cj on same node */ scheduler_activate(s, ci->drift_part); @@ -1857,8 +1857,9 @@ void cell_set_super(struct cell *c, struct cell *super) { * * @param c The #cell. * @param e The #engine (to get ti_current). + * @param force Drift the particles irrespective of the #cell flags. */ -void cell_drift_part(struct cell *c, const struct engine *e) { +void cell_drift_part(struct cell *c, const struct engine *e, int force) { const float hydro_h_max = e->hydro_properties->h_max; const double timeBase = e->timeBase; @@ -1873,6 +1874,9 @@ void cell_drift_part(struct cell *c, const struct engine *e) { float dx_max_sort = 0.0f, dx2_max_sort = 0.f; float cell_h_max = 0.f; + /* Drift irrespective of cell flags? */ + force |= c->do_drift; + #ifdef SWIFT_DEBUG_CHECKS /* Check that we only drift local cells. */ if (c->nodeID != engine_rank) error("Drifting a foreign cell is nope."); @@ -1882,7 +1886,7 @@ void cell_drift_part(struct cell *c, const struct engine *e) { #endif // SWIFT_DEBUG_CHECKS /* Are we not in a leaf ? */ - if (c->split) { + if (c->split && (force || c->do_sub_drift)) { /* Loop over the progeny and collect their data. */ for (int k = 0; k < 8; k++) @@ -1890,7 +1894,7 @@ void cell_drift_part(struct cell *c, const struct engine *e) { struct cell *cp = c->progeny[k]; /* Collect */ - cell_drift_part(cp, e); + cell_drift_part(cp, e, force); /* Update */ dx_max = max(dx_max, cp->dx_max_part); @@ -1898,7 +1902,15 @@ void cell_drift_part(struct cell *c, const struct engine *e) { cell_h_max = max(cell_h_max, cp->h_max); } - } else if (ti_current > ti_old_part) { + /* Store the values */ + c->h_max = cell_h_max; + c->dx_max_part = dx_max; + c->dx_max_sort = dx_max_sort; + + /* Update the time of the last drift */ + c->ti_old_part = ti_current; + + } else if (force && ti_current > ti_old_part) { /* Loop over all the gas particles in the cell */ const size_t nr_parts = c->count; @@ -1937,20 +1949,14 @@ void cell_drift_part(struct cell *c, const struct engine *e) { dx_max = sqrtf(dx2_max); dx_max_sort = sqrtf(dx2_max_sort); - } else { + /* Store the values */ + c->h_max = cell_h_max; + c->dx_max_part = dx_max; + c->dx_max_sort = dx_max_sort; - cell_h_max = c->h_max; - dx_max = c->dx_max_part; - dx_max_sort = c->dx_max_sort; + /* Update the time of the last drift */ + c->ti_old_part = ti_current; } - - /* Store the values */ - c->h_max = cell_h_max; - c->dx_max_part = dx_max; - c->dx_max_sort = dx_max_sort; - - /* Update the time of the last drift */ - c->ti_old_part = ti_current; } /** diff --git a/src/cell.h b/src/cell.h index 6623e812d4e206c449d59847b95763eeac4ddf69..dc4d5df19998a523fcc0c308baf917bad8c2eeec 100644 --- a/src/cell.h +++ b/src/cell.h @@ -333,10 +333,10 @@ struct cell { /* Will this cell do anything that relies on its sorts being set correctly? */ integertime_t requires_sorts; - + /*! Does this cell need to be drifted? */ char do_drift; - + /*! Does any of this cell's sub-cells need to be drifted? */ char do_sub_drift; @@ -387,7 +387,7 @@ void cell_reset_task_counters(struct cell *c); int cell_is_drift_needed(struct cell *c, const struct engine *e); int cell_unskip_tasks(struct cell *c, struct scheduler *s); void cell_set_super(struct cell *c, struct cell *super); -void cell_drift_part(struct cell *c, const struct engine *e); +void cell_drift_part(struct cell *c, const struct engine *e, int force); void cell_drift_gpart(struct cell *c, const struct engine *e); void cell_drift_multipole(struct cell *c, const struct engine *e); void cell_drift_all_multipoles(struct cell *c, const struct engine *e);