Commit 24e1164b authored by Peter W. Draper's avatar Peter W. Draper
Browse files

Merge remote-tracking branch 'origin/master' into random_fixes

parents 28e61904 a0106530
...@@ -2589,134 +2589,164 @@ void engine_marktasks_mapper(void *map_data, int num_elements, ...@@ -2589,134 +2589,164 @@ void engine_marktasks_mapper(void *map_data, int num_elements,
struct cell *ci = t->ci; struct cell *ci = t->ci;
struct cell *cj = t->cj; struct cell *cj = t->cj;
/* Set this task's skip, otherwise nothing to do. */ /* If this task does not involve any active cells, skip it. */
if (cell_is_active(t->ci, e) || cell_is_active(t->cj, e)) if (!cell_is_active(t->ci, e) && !cell_is_active(t->cj, e)) continue;
scheduler_activate(s, t);
else
continue;
/* If this is not a density task, we don't have to do any of the below. */
if (t->subtype != task_subtype_density) continue;
/* Too much particle movement? */ /* Too much particle movement? */
if (cell_need_rebuild_for_pair(ci, cj)) *rebuild_space = 1; if (cell_need_rebuild_for_pair(ci, cj)) *rebuild_space = 1;
/* Set the correct sorting flags */ /* Only activate tasks that involve a local active cell. */
if (t->type == task_type_pair) { if ((cell_is_active(ci, e) && ci->nodeID == engine_rank) ||
/* Store some values. */ (cj != NULL && cell_is_active(cj, e) && cj->nodeID == engine_rank)) {
atomic_or(&ci->requires_sorts, 1 << t->flags); scheduler_activate(s, t);
atomic_or(&cj->requires_sorts, 1 << t->flags);
ci->dx_max_sort_old = ci->dx_max_sort; /* Set the correct sorting flags */
cj->dx_max_sort_old = cj->dx_max_sort; if (t->type == task_type_pair && t->subtype == task_subtype_density) {
/* Store some values. */
/* Activate the drift tasks. */ atomic_or(&ci->requires_sorts, 1 << t->flags);
if (ci->nodeID == engine_rank) cell_activate_drift_part(ci, s); atomic_or(&cj->requires_sorts, 1 << t->flags);
if (cj->nodeID == engine_rank) cell_activate_drift_part(cj, s); ci->dx_max_sort_old = ci->dx_max_sort;
cj->dx_max_sort_old = cj->dx_max_sort;
/* Activate the sorts where needed. */
cell_activate_sorts(ci, t->flags, s); /* Activate the drift tasks. */
cell_activate_sorts(cj, t->flags, s); if (ci->nodeID == engine_rank) cell_activate_drift_part(ci, s);
} if (cj->nodeID == engine_rank) cell_activate_drift_part(cj, s);
/* Store current values of dx_max and h_max. */
else if (t->type == task_type_sub_pair) { /* Check the sorts and activate them if needed. */
cell_activate_subcell_tasks(t->ci, t->cj, s); cell_activate_sorts(ci, t->flags, s);
cell_activate_sorts(cj, t->flags, s);
}
/* Store current values of dx_max and h_max. */
else if (t->type == task_type_sub_pair &&
t->subtype == task_subtype_density) {
cell_activate_subcell_tasks(t->ci, t->cj, s);
}
} }
#ifdef WITH_MPI /* Only interested in density tasks as of here. */
/* Activate the send/recv flags. */ if (t->subtype == task_subtype_density) {
if (ci->nodeID != engine_rank) {
/* Activate the tasks to recv foreign cell ci's data. */ #ifdef WITH_MPI
scheduler_activate(s, ci->recv_xv); /* Activate the send/recv tasks. */
if (cell_is_active(ci, e)) { if (ci->nodeID != engine_rank) {
scheduler_activate(s, ci->recv_rho);
/* If the local cell is active, receive data from the foreign cell. */
if (cell_is_active(cj, e)) {
scheduler_activate(s, ci->recv_xv);
if (cell_is_active(ci, e)) {
scheduler_activate(s, ci->recv_rho);
#ifdef EXTRA_HYDRO_LOOP #ifdef EXTRA_HYDRO_LOOP
scheduler_activate(s, ci->recv_gradient); scheduler_activate(s, ci->recv_gradient);
#endif #endif
scheduler_activate(s, ci->recv_ti); }
} }
/* Look for the local cell cj's send tasks. */ /* If the foreign cell is active, we want its ti_end values. */
struct link *l = NULL; if (cell_is_active(ci, e)) scheduler_activate(s, ci->recv_ti);
for (l = cj->send_xv; l != NULL && l->t->cj->nodeID != ci->nodeID;
l = l->next) /* Look for the local cell cj's send tasks. */
; if (cell_is_active(ci, e)) {
if (l == NULL) error("Missing link to send_xv task."); struct link *l = NULL;
scheduler_activate(s, l->t); for (l = cj->send_xv; l != NULL && l->t->cj->nodeID != ci->nodeID;
l = l->next)
/* Drift the cell which will be sent at the level at which it is sent, ;
i.e. drift the cell specified in the send task (l->t) itself. */ if (l == NULL) error("Missing link to send_xv task.");
cell_activate_drift_part(l->t->ci, s); scheduler_activate(s, l->t);
if (cell_is_active(cj, e)) { /* Drift the cell which will be sent at the level at which it is
for (l = cj->send_rho; l != NULL && l->t->cj->nodeID != ci->nodeID; sent,
l = l->next) i.e. drift the cell specified in the send task (l->t) itself. */
; cell_activate_drift_part(l->t->ci, s);
if (l == NULL) error("Missing link to send_rho task.");
scheduler_activate(s, l->t); if (cell_is_active(cj, e)) {
struct link *l = NULL;
for (l = cj->send_rho;
l != NULL && l->t->cj->nodeID != ci->nodeID; l = l->next)
;
if (l == NULL) error("Missing link to send_rho task.");
scheduler_activate(s, l->t);
#ifdef EXTRA_HYDRO_LOOP #ifdef EXTRA_HYDRO_LOOP
for (l = cj->send_gradient; for (l = cj->send_gradient;
l != NULL && l->t->cj->nodeID != ci->nodeID; l = l->next) l != NULL && l->t->cj->nodeID != ci->nodeID; l = l->next)
; ;
if (l == NULL) error("Missing link to send_gradient task."); if (l == NULL) error("Missing link to send_gradient task.");
scheduler_activate(s, l->t); scheduler_activate(s, l->t);
#endif #endif
}
}
for (l = cj->send_ti; l != NULL && l->t->cj->nodeID != ci->nodeID; /* If the local cell is active, send its ti_end values. */
l = l->next) if (cell_is_active(cj, e)) {
; struct link *l = NULL;
if (l == NULL) error("Missing link to send_ti task."); for (l = cj->send_ti; l != NULL && l->t->cj->nodeID != ci->nodeID;
scheduler_activate(s, l->t); l = l->next)
} ;
if (l == NULL) error("Missing link to send_ti task.");
scheduler_activate(s, l->t);
}
} else if (cj->nodeID != engine_rank) { } else if (cj->nodeID != engine_rank) {
/* Activate the tasks to recv foreign cell cj's data. */ /* If the local cell is active, receive data from the foreign cell. */
scheduler_activate(s, cj->recv_xv); if (cell_is_active(ci, e)) {
if (cell_is_active(cj, e)) { scheduler_activate(s, cj->recv_xv);
scheduler_activate(s, cj->recv_rho); if (cell_is_active(cj, e)) {
scheduler_activate(s, cj->recv_rho);
#ifdef EXTRA_HYDRO_LOOP #ifdef EXTRA_HYDRO_LOOP
scheduler_activate(s, cj->recv_gradient); scheduler_activate(s, cj->recv_gradient);
#endif #endif
scheduler_activate(s, cj->recv_ti); }
} }
/* If the foreign cell is active, we want its ti_end values. */
if (cell_is_active(cj, e)) scheduler_activate(s, cj->recv_ti);
/* Look for the local cell ci's send tasks. */
if (cell_is_active(cj, e)) {
struct link *l = NULL;
for (l = ci->send_xv; l != NULL && l->t->cj->nodeID != cj->nodeID;
l = l->next)
;
if (l == NULL) error("Missing link to send_xv task.");
scheduler_activate(s, l->t);
/* Look for the local cell ci's send tasks. */ /* Drift the cell which will be sent at the level at which it is
struct link *l = NULL; sent,
for (l = ci->send_xv; l != NULL && l->t->cj->nodeID != cj->nodeID; i.e. drift the cell specified in the send task (l->t) itself. */
l = l->next) cell_activate_drift_part(l->t->ci, s);
;
if (l == NULL) error("Missing link to send_xv task."); if (cell_is_active(ci, e)) {
scheduler_activate(s, l->t);
struct link *l = NULL;
/* Drift the cell which will be sent at the level at which it is sent, for (l = ci->send_rho;
i.e. drift the cell specified in the send task (l->t) itself. */ l != NULL && l->t->cj->nodeID != cj->nodeID; l = l->next)
cell_activate_drift_part(l->t->ci, s); ;
if (l == NULL) error("Missing link to send_rho task.");
if (cell_is_active(ci, e)) { scheduler_activate(s, l->t);
for (l = ci->send_rho; l != NULL && l->t->cj->nodeID != cj->nodeID;
l = l->next)
;
if (l == NULL) error("Missing link to send_rho task.");
scheduler_activate(s, l->t);
#ifdef EXTRA_HYDRO_LOOP #ifdef EXTRA_HYDRO_LOOP
for (l = ci->send_gradient; for (l = ci->send_gradient;
l != NULL && l->t->cj->nodeID != cj->nodeID; l = l->next) l != NULL && l->t->cj->nodeID != cj->nodeID; l = l->next)
; ;
if (l == NULL) error("Missing link to send_gradient task."); if (l == NULL) error("Missing link to send_gradient task.");
scheduler_activate(s, l->t); scheduler_activate(s, l->t);
#endif #endif
}
}
for (l = ci->send_ti; l != NULL && l->t->cj->nodeID != cj->nodeID; /* If the local cell is active, send its ti_end values. */
l = l->next) if (cell_is_active(ci, e)) {
; struct link *l = NULL;
if (l == NULL) error("Missing link to send_ti task."); for (l = ci->send_ti; l != NULL && l->t->cj->nodeID != cj->nodeID;
scheduler_activate(s, l->t); l = l->next)
;
if (l == NULL) error("Missing link to send_ti task.");
scheduler_activate(s, l->t);
}
} }
}
#endif #endif
}
} }
/* Kick/Drift/init ? */ /* Kick/Drift/init ? */
...@@ -3368,19 +3398,20 @@ void engine_init_particles(struct engine *e, int flag_entropy_ICs, ...@@ -3368,19 +3398,20 @@ void engine_init_particles(struct engine *e, int flag_entropy_ICs,
int failed = 0; int failed = 0;
double *prev_x = s->parts[0].x; double *prev_x = s->parts[0].x;
for (size_t k = 1; k < s->nr_parts; k++) { for (size_t k = 1; k < s->nr_parts; k++) {
if (prev_x[0] == s->parts[k].x[0] && if (prev_x[0] == s->parts[k].x[0] && prev_x[1] == s->parts[k].x[1] &&
prev_x[1] == s->parts[k].x[1] &&
prev_x[2] == s->parts[k].x[2]) { prev_x[2] == s->parts[k].x[2]) {
if (e->verbose) if (e->verbose)
message("Two particles occupy location: %f %f %f", message("Two particles occupy location: %f %f %f", prev_x[0],
prev_x[0], prev_x[1], prev_x[2]); prev_x[1], prev_x[2]);
failed++; failed++;
} }
prev_x = s->parts[k].x; prev_x = s->parts[k].x;
} }
if (failed > 0) if (failed > 0)
error("Have %d particle pairs with the same locations.\n" error(
"Cannot continue", failed); "Have %d particle pairs with the same locations.\n"
"Cannot continue",
failed);
} }
/* Also check any gparts. This is not supposed to be fatal so only warn. */ /* Also check any gparts. This is not supposed to be fatal so only warn. */
...@@ -3388,20 +3419,21 @@ void engine_init_particles(struct engine *e, int flag_entropy_ICs, ...@@ -3388,20 +3419,21 @@ void engine_init_particles(struct engine *e, int flag_entropy_ICs,
int failed = 0; int failed = 0;
double *prev_x = s->gparts[0].x; double *prev_x = s->gparts[0].x;
for (size_t k = 1; k < s->nr_gparts; k++) { for (size_t k = 1; k < s->nr_gparts; k++) {
if (prev_x[0] == s->gparts[k].x[0] && if (prev_x[0] == s->gparts[k].x[0] && prev_x[1] == s->gparts[k].x[1] &&
prev_x[1] == s->gparts[k].x[1] &&
prev_x[2] == s->gparts[k].x[2]) { prev_x[2] == s->gparts[k].x[2]) {
if (e->verbose) if (e->verbose)
message("Two gparts occupy location: %f %f %f / %f %f %f", message("Two gparts occupy location: %f %f %f / %f %f %f", prev_x[0],
prev_x[0], prev_x[1], prev_x[2], prev_x[1], prev_x[2], s->gparts[k].x[0], s->gparts[k].x[1],
s->gparts[k].x[0], s->gparts[k].x[1], s->gparts[k].x[2] ); s->gparts[k].x[2]);
failed++; failed++;
} }
prev_x = s->gparts[k].x; prev_x = s->gparts[k].x;
} }
if (failed > 0) if (failed > 0)
message("WARNING: found %d gpart pairs at the same location. " message(
"That is not optimal", failed); "WARNING: found %d gpart pairs at the same location. "
"That is not optimal",
failed);
} }
/* Check the top-level cell h_max matches the particles as these can be /* Check the top-level cell h_max matches the particles as these can be
......
...@@ -1180,7 +1180,7 @@ void scheduler_start(struct scheduler *s) { ...@@ -1180,7 +1180,7 @@ void scheduler_start(struct scheduler *s) {
} }
/* Check we have not missed an active task */ /* Check we have not missed an active task */
#if 0 //SWIFT_DEBUG_CHECKS #ifdef SWIFT_DEBUG_CHECKS
const integertime_t ti_current = s->space->e->ti_current; const integertime_t ti_current = s->space->e->ti_current;
......
...@@ -37,6 +37,9 @@ check_PROGRAMS = testGreetings testReading testSingle testTimeIntegration \ ...@@ -37,6 +37,9 @@ check_PROGRAMS = testGreetings testReading testSingle testTimeIntegration \
testRiemannHLLC testMatrixInversion testDump testLogger \ testRiemannHLLC testMatrixInversion testDump testLogger \
testVoronoi1D testVoronoi2D testVoronoi3D testPeriodicBC testVoronoi1D testVoronoi2D testVoronoi3D testPeriodicBC
# Rebuild tests when SWIFT is updated.
$(check_PROGRAMS): ../src/.libs/libswiftsim.a
# Sources for the individual programs # Sources for the individual programs
testGreetings_SOURCES = testGreetings.c testGreetings_SOURCES = testGreetings.c
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment