diff --git a/src/cell.c b/src/cell.c index 480bad5681d09ab143b4f878016ef80dc772eb30..6aad840164847b5159b740b75fa120bb987fa96e 100644 --- a/src/cell.c +++ b/src/cell.c @@ -3098,7 +3098,7 @@ int cell_unskip_hydro_tasks(struct cell *c, struct scheduler *s) { } /* Store current values of dx_max and h_max. */ else if (t->type == task_type_sub_pair || t->type == task_type_sub_self) { - cell_activate_subcell_hydro_tasks(t->ci, t->cj, s); + cell_activate_subcell_hydro_tasks(ci, cj, s); } } @@ -3402,11 +3402,11 @@ int cell_unskip_gravity_tasks(struct cell *c, struct scheduler *s) { int cell_unskip_stars_tasks(struct cell *c, struct scheduler *s) { struct engine *e = s->space->e; - const int with_feedback = (e->policy & engine_policy_feedback); + // const int with_feedback = (e->policy & engine_policy_feedback); const int nodeID = e->nodeID; int rebuild = 0; - if (!with_feedback && c->stars.drift != NULL && cell_is_active_stars(c, e)) { + if (c->stars.drift != NULL && cell_is_active_stars(c, e)) { cell_activate_drift_spart(c, s); } @@ -3434,6 +3434,8 @@ int cell_unskip_stars_tasks(struct cell *c, struct scheduler *s) { /* Only activate tasks that involve a local active cell. */ if ((ci_active || cj_active) && (ci_nodeID == nodeID || cj_nodeID == nodeID)) { + // if ((ci_active && ci_nodeID == nodeID) || + // (cj_active && cj_nodeID == nodeID)) { scheduler_activate(s, t); @@ -3497,7 +3499,7 @@ int cell_unskip_stars_tasks(struct cell *c, struct scheduler *s) { if (cj_active) { scheduler_activate(s, ci->mpi.hydro.recv_xv); - scheduler_activate(s, ci->mpi.hydro.recv_rho); + scheduler_activate(s, ci->mpi.hydro.recv_force); /* If the local cell is active, more stuff will be needed. */ scheduler_activate_send(s, cj->mpi.stars.send, ci_nodeID); @@ -3515,7 +3517,7 @@ int cell_unskip_stars_tasks(struct cell *c, struct scheduler *s) { /* Is the foreign cell active and will need stuff from us? */ scheduler_activate_send(s, cj->mpi.hydro.send_xv, ci_nodeID); - scheduler_activate_send(s, cj->mpi.hydro.send_rho, ci_nodeID); + scheduler_activate_send(s, cj->mpi.hydro.send_force, ci_nodeID); /* Drift the cell which will be sent; note that not all sent particles will be drifted, only those that are needed. */ @@ -3527,7 +3529,7 @@ int cell_unskip_stars_tasks(struct cell *c, struct scheduler *s) { /* If the local cell is active, receive data from the foreign cell. */ if (ci_active) { scheduler_activate(s, cj->mpi.hydro.recv_xv); - scheduler_activate(s, cj->mpi.hydro.recv_rho); + scheduler_activate(s, cj->mpi.hydro.recv_force); /* If the local cell is active, more stuff will be needed. */ scheduler_activate_send(s, ci->mpi.stars.send, cj_nodeID); @@ -3545,7 +3547,7 @@ int cell_unskip_stars_tasks(struct cell *c, struct scheduler *s) { /* Is the foreign cell active and will need stuff from us? */ scheduler_activate_send(s, ci->mpi.hydro.send_xv, cj_nodeID); - scheduler_activate_send(s, ci->mpi.hydro.send_rho, cj_nodeID); + scheduler_activate_send(s, ci->mpi.hydro.send_force, cj_nodeID); /* Drift the cell which will be sent; note that not all sent particles will be drifted, only those that are needed. */ diff --git a/src/cell.h b/src/cell.h index b13889abda54f77ec2030bf2262dca30440bdc4e..a026a04fc135ba3c1a1437c78f129c50ea226dbd 100644 --- a/src/cell.h +++ b/src/cell.h @@ -594,6 +594,9 @@ struct cell { /* Task receiving hydro data (gradient). */ struct task *recv_gradient; + /* Task receiving hydro data (force). */ + struct task *recv_force; + /* Linked list for sending hydro data (positions). */ struct link *send_xv; @@ -603,6 +606,9 @@ struct cell { /* Linked list for sending hydro data (gradient). */ struct link *send_gradient; + /* Linked list for sending hydro data (force). */ + struct link *send_force; + } hydro; struct { diff --git a/src/drift.h b/src/drift.h index 7e874fe0ceabe5b091cc7c5bb53adbef2c9a3efd..477ec789c845864b1372cd72b6e3d9c1ec269994 100644 --- a/src/drift.h +++ b/src/drift.h @@ -85,7 +85,7 @@ __attribute__((always_inline)) INLINE static void drift_part( p->ti_drift = ti_current; #endif - + /* Drift... */ p->x[0] += xp->v_full[0] * dt_drift; p->x[1] += xp->v_full[1] * dt_drift; diff --git a/src/engine_maketasks.c b/src/engine_maketasks.c index d3d467c7947e63226ce1e4a5982b5ca3b625e7fa..c2e9a2dd0a7709f62b4140ebd81c5f642f76b7fa 100644 --- a/src/engine_maketasks.c +++ b/src/engine_maketasks.c @@ -120,7 +120,8 @@ void engine_addtasks_send_gravity(struct engine *e, struct cell *ci, */ void engine_addtasks_send_hydro(struct engine *e, struct cell *ci, struct cell *cj, struct task *t_xv, - struct task *t_rho, struct task *t_gradient) { + struct task *t_rho, struct task *t_gradient, + struct task *t_force) { #ifdef WITH_MPI struct link *l = NULL; @@ -146,11 +147,15 @@ void engine_addtasks_send_hydro(struct engine *e, struct cell *ci, 0, ci, cj); t_rho = scheduler_addtask(s, task_type_send, task_subtype_rho, ci->mpi.tag, 0, ci, cj); + #ifdef EXTRA_HYDRO_LOOP t_gradient = scheduler_addtask(s, task_type_send, task_subtype_gradient, ci->mpi.tag, 0, ci, cj); #endif + t_force = scheduler_addtask(s, task_type_send, task_subtype_force, + ci->mpi.tag, 0, ci, cj); + #ifdef EXTRA_HYDRO_LOOP scheduler_addunlock(s, t_gradient, ci->hydro.super->hydro.end_force); @@ -179,6 +184,9 @@ void engine_addtasks_send_hydro(struct engine *e, struct cell *ci, #endif + scheduler_addunlock(s, ci->hydro.super->hydro.end_force, t_force); + scheduler_addunlock(s, ci->hydro.super->hydro.drift, t_force); + /* Drift before you send */ scheduler_addunlock(s, ci->hydro.super->hydro.drift, t_xv); } @@ -189,6 +197,7 @@ void engine_addtasks_send_hydro(struct engine *e, struct cell *ci, #ifdef EXTRA_HYDRO_LOOP engine_addlink(e, &ci->mpi.hydro.send_gradient, t_gradient); #endif + engine_addlink(e, &ci->mpi.hydro.send_force, t_force); } /* Recurse? */ @@ -196,7 +205,7 @@ void engine_addtasks_send_hydro(struct engine *e, struct cell *ci, for (int k = 0; k < 8; k++) if (ci->progeny[k] != NULL) engine_addtasks_send_hydro(e, ci->progeny[k], cj, t_xv, t_rho, - t_gradient); + t_gradient, t_force); #else error("SWIFT was not compiled with MPI support."); @@ -355,7 +364,7 @@ void engine_addtasks_send_timestep(struct engine *e, struct cell *ci, */ void engine_addtasks_recv_hydro(struct engine *e, struct cell *c, struct task *t_xv, struct task *t_rho, - struct task *t_gradient) { + struct task *t_gradient, struct task *t_force) { #ifdef WITH_MPI struct scheduler *s = &e->sched; @@ -377,14 +386,21 @@ void engine_addtasks_recv_hydro(struct engine *e, struct cell *c, t_gradient = scheduler_addtask(s, task_type_recv, task_subtype_gradient, c->mpi.tag, 0, c, NULL); #endif + + t_force = scheduler_addtask(s, task_type_recv, task_subtype_force, + c->mpi.tag, 0, c, NULL); } c->mpi.hydro.recv_xv = t_xv; c->mpi.hydro.recv_rho = t_rho; c->mpi.hydro.recv_gradient = t_gradient; + c->mpi.hydro.recv_force = t_force; /* Add dependencies. */ - if (c->hydro.sorts != NULL) scheduler_addunlock(s, t_xv, c->hydro.sorts); + if (c->hydro.sorts != NULL) { + scheduler_addunlock(s, t_xv, c->hydro.sorts); + scheduler_addunlock(s, c->hydro.sorts, t_force); + } for (struct link *l = c->hydro.density; l != NULL; l = l->next) { scheduler_addunlock(s, t_xv, l->t); @@ -404,16 +420,20 @@ void engine_addtasks_recv_hydro(struct engine *e, struct cell *c, } #endif + for (struct link *l = c->hydro.force; l != NULL; l = l->next) { + scheduler_addunlock(s, l->t, t_force); + } + for (struct link *l = c->stars.density; l != NULL; l = l->next) { - scheduler_addunlock(s, t_xv, l->t); - scheduler_addunlock(s, t_rho, l->t); + scheduler_addunlock(s, t_force, l->t); } /* Recurse? */ if (c->split) for (int k = 0; k < 8; k++) if (c->progeny[k] != NULL) - engine_addtasks_recv_hydro(e, c->progeny[k], t_xv, t_rho, t_gradient); + engine_addtasks_recv_hydro(e, c->progeny[k], t_xv, t_rho, t_gradient, + t_force); #else error("SWIFT was not compiled with MPI support."); @@ -847,7 +867,7 @@ void engine_make_hierarchical_tasks_hydro(struct engine *e, struct cell *c) { c->stars.drift = scheduler_addtask(s, task_type_drift_spart, task_subtype_none, 0, 0, c, NULL); - scheduler_addunlock(s, c->stars.drift, c->super->kick2); + scheduler_addunlock(s, c->stars.drift, c->super->kick2); } /* Subgrid tasks: cooling */ @@ -2173,7 +2193,7 @@ void engine_addtasks_send_mapper(void *map_data, int num_elements, * connection. */ if ((e->policy & engine_policy_hydro) && (type & proxy_cell_type_hydro)) engine_addtasks_send_hydro(e, ci, cj, /*t_xv=*/NULL, - /*t_rho=*/NULL, /*t_gradient=*/NULL); + /*t_rho=*/NULL, /*t_gradient=*/NULL, NULL); /* Add the send tasks for the cells in the proxy that have a stars * connection. */ @@ -2205,7 +2225,7 @@ void engine_addtasks_recv_mapper(void *map_data, int num_elements, /* Add the recv tasks for the cells in the proxy that have a hydro * connection. */ if ((e->policy & engine_policy_hydro) && (type & proxy_cell_type_hydro)) - engine_addtasks_recv_hydro(e, ci, NULL, NULL, NULL); + engine_addtasks_recv_hydro(e, ci, NULL, NULL, NULL, NULL); /* Add the recv tasks for the cells in the proxy that have a stars * connection. */ diff --git a/src/engine_marktasks.c b/src/engine_marktasks.c index c02eb5d2bd272111808701269faed07cef505449..6923b6565f70478aaa61921ec04d0e6f83bb7c53 100644 --- a/src/engine_marktasks.c +++ b/src/engine_marktasks.c @@ -445,7 +445,7 @@ void engine_marktasks_mapper(void *map_data, int num_elements, if (cj_active_stars) { scheduler_activate(s, ci->mpi.hydro.recv_xv); - scheduler_activate(s, ci->mpi.hydro.recv_rho); + scheduler_activate(s, ci->mpi.hydro.recv_force); /* If the local cell is active, more stuff will be needed. */ scheduler_activate_send(s, cj->mpi.stars.send, ci_nodeID); @@ -463,7 +463,7 @@ void engine_marktasks_mapper(void *map_data, int num_elements, /* Is the foreign cell active and will need stuff from us? */ scheduler_activate_send(s, cj->mpi.hydro.send_xv, ci_nodeID); - scheduler_activate_send(s, cj->mpi.hydro.send_rho, ci_nodeID); + scheduler_activate_send(s, cj->mpi.hydro.send_force, ci_nodeID); /* Drift the cell which will be sent; note that not all sent particles will be drifted, only those that are needed. */ @@ -475,7 +475,7 @@ void engine_marktasks_mapper(void *map_data, int num_elements, /* If the local cell is active, receive data from the foreign cell. */ if (ci_active_stars) { scheduler_activate(s, cj->mpi.hydro.recv_xv); - scheduler_activate(s, cj->mpi.hydro.recv_rho); + scheduler_activate(s, cj->mpi.hydro.recv_force); /* If the local cell is active, more stuff will be needed. */ scheduler_activate_send(s, ci->mpi.stars.send, cj_nodeID); @@ -493,7 +493,7 @@ void engine_marktasks_mapper(void *map_data, int num_elements, /* Is the foreign cell active and will need stuff from us? */ scheduler_activate_send(s, ci->mpi.hydro.send_xv, cj_nodeID); - scheduler_activate_send(s, ci->mpi.hydro.send_rho, cj_nodeID); + scheduler_activate_send(s, ci->mpi.hydro.send_force, cj_nodeID); /* Drift the cell which will be sent; note that not all sent particles will be drifted, only those that are needed. */ diff --git a/src/error.h b/src/error.h index d384ec56ba0dc3562160d94911e3e3d3bb786211..6cd06863abff3778c855cc8c296b50372c6e0df3 100644 --- a/src/error.h +++ b/src/error.h @@ -54,7 +54,7 @@ extern int engine_rank; fprintf(stderr, "[%04i] %s %s:%s():%i: " s "\n", engine_rank, \ clocks_get_timesincestart(), __FILE__, __FUNCTION__, __LINE__, \ ##__VA_ARGS__); \ - MPI_Abort(MPI_COMM_WORLD, -1); \ + swift_abort(-1); \ }) #else #define error(s, ...) \ diff --git a/src/runner.c b/src/runner.c index cfe3398684bef7b5a04cbfcefce1ebfe7729e24b..1584f2df90678ac4fd6e245a80a39c00deaad101 100644 --- a/src/runner.c +++ b/src/runner.c @@ -931,7 +931,7 @@ void runner_do_hydro_sort(struct runner *r, struct cell *c, int flags, /* Fill the sort array. */ for (int k = 0; k < count; k++) { - const double px[3] = {parts[k].x[0], parts[k].x[1], parts[k].x[2]}; + const double px[3] = {parts[k].x[0], parts[k].x[1], parts[k].x[2]}; for (int j = 0; j < 13; j++) if (flags & (1 << j)) { c->hydro.sort[j][k].i = k; @@ -3273,7 +3273,7 @@ void *runner_main(void *data) { break; #endif case task_type_stars_ghost: - runner_do_stars_ghost(r, ci, 1); + runner_do_stars_ghost(r, ci, 1); break; case task_type_drift_part: runner_do_drift_part(r, ci, 1); @@ -3321,6 +3321,8 @@ void *runner_main(void *data) { runner_do_recv_part(r, ci, 0, 1); } else if (t->subtype == task_subtype_gradient) { runner_do_recv_part(r, ci, 0, 1); + } else if (t->subtype == task_subtype_force) { + runner_do_recv_part(r, ci, 0, 1); } else if (t->subtype == task_subtype_limiter) { runner_do_recv_part(r, ci, 0, 1); } else if (t->subtype == task_subtype_gpart) { diff --git a/src/runner_doiact.h b/src/runner_doiact.h index 383fa64c56f6e6e7a134452f9eef8f715171be0c..99e2f25d6a4685fd674f8aba65cc0ad55830c779 100644 --- a/src/runner_doiact.h +++ b/src/runner_doiact.h @@ -1233,9 +1233,9 @@ void DOPAIR1_BRANCH(struct runner *r, struct cell *ci, struct cell *cj) { error( "particle shift diff exceeds dx_max_sort in cell ci. ci->nodeID=%d " "cj->nodeID=%d d=%e sort_i[pid].d=%e ci->hydro.dx_max_sort=%e " - "ci->hydro.dx_max_sort_old=%e", + "ci->hydro.dx_max_sort_old=%e pid=%d count=%d", ci->nodeID, cj->nodeID, d, sort_i[pid].d, ci->hydro.dx_max_sort, - ci->hydro.dx_max_sort_old); + ci->hydro.dx_max_sort_old, pid, ci->hydro.count); } for (int pjd = 0; pjd < cj->hydro.count; pjd++) { const struct part *p = &cj->hydro.parts[sort_j[pjd].i]; diff --git a/src/scheduler.c b/src/scheduler.c index 3b5a50b9b24c0d9ba2fdfe4fea7e2f3297660965..6a746cf8faca4600aa56bdd653d11958ad4df000 100644 --- a/src/scheduler.c +++ b/src/scheduler.c @@ -1849,13 +1849,11 @@ void scheduler_enqueue(struct scheduler *s, struct task *t) { subtaskMPI_comms[t->subtype], &t->req); } else if (t->subtype == task_subtype_xv || t->subtype == task_subtype_rho || - t->subtype == task_subtype_gradient) { + t->subtype == task_subtype_gradient || + t->subtype == task_subtype_force) { err = MPI_Irecv(t->ci->hydro.parts, t->ci->hydro.count, part_mpi_type, t->ci->nodeID, t->flags, subtaskMPI_comms[t->subtype], &t->req); - // message( "receiving %i parts with tag=%i from %i to %i." , - // t->ci->hydro.count , t->flags , t->ci->nodeID , s->nodeID ); - // fflush(stdout); } else if (t->subtype == task_subtype_gpart) { err = MPI_Irecv(t->ci->grav.parts, t->ci->grav.count, gpart_mpi_type, t->ci->nodeID, t->flags, subtaskMPI_comms[t->subtype], @@ -1900,7 +1898,8 @@ void scheduler_enqueue(struct scheduler *s, struct task *t) { subtaskMPI_comms[t->subtype], &t->req); } else if (t->subtype == task_subtype_xv || t->subtype == task_subtype_rho || - t->subtype == task_subtype_gradient) { + t->subtype == task_subtype_gradient || + t->subtype == task_subtype_force) { if ((t->ci->hydro.count * sizeof(struct part)) > s->mpi_message_limit) err = MPI_Isend(t->ci->hydro.parts, t->ci->hydro.count, part_mpi_type, t->cj->nodeID, t->flags, @@ -1909,9 +1908,6 @@ void scheduler_enqueue(struct scheduler *s, struct task *t) { err = MPI_Issend(t->ci->hydro.parts, t->ci->hydro.count, part_mpi_type, t->cj->nodeID, t->flags, subtaskMPI_comms[t->subtype], &t->req); - // message( "sending %i parts with tag=%i from %i to %i." , - // t->ci->hydro.count , t->flags , s->nodeID , t->cj->nodeID ); - // fflush(stdout); } else if (t->subtype == task_subtype_gpart) { if ((t->ci->grav.count * sizeof(struct gpart)) > s->mpi_message_limit) err = MPI_Isend(t->ci->grav.parts, t->ci->grav.count, diff --git a/src/space.c b/src/space.c index 0d7621d4809662ec513c2717722d13871540470e..2a7891ca35c3f0312b149947416ab645ffd4b376 100644 --- a/src/space.c +++ b/src/space.c @@ -275,6 +275,7 @@ void space_rebuild_recycle_mapper(void *map_data, int num_elements, c->mpi.hydro.recv_xv = NULL; c->mpi.hydro.recv_rho = NULL; c->mpi.hydro.recv_gradient = NULL; + c->mpi.hydro.recv_force = NULL; c->mpi.grav.recv = NULL; c->mpi.stars.recv = NULL; c->mpi.recv_ti = NULL; @@ -283,6 +284,7 @@ void space_rebuild_recycle_mapper(void *map_data, int num_elements, c->mpi.hydro.send_xv = NULL; c->mpi.hydro.send_rho = NULL; c->mpi.hydro.send_gradient = NULL; + c->mpi.hydro.send_force = NULL; c->mpi.grav.send = NULL; c->mpi.stars.send = NULL; c->mpi.send_ti = NULL; @@ -550,9 +552,11 @@ void space_regrid(struct space *s, int verbose) { c->mpi.hydro.recv_xv = NULL; c->mpi.hydro.recv_rho = NULL; c->mpi.hydro.recv_gradient = NULL; + c->mpi.hydro.recv_force = NULL; c->mpi.hydro.send_xv = NULL; c->mpi.hydro.send_rho = NULL; c->mpi.hydro.send_gradient = NULL; + c->mpi.hydro.send_force = NULL; c->mpi.stars.send = NULL; c->mpi.stars.recv = NULL; c->mpi.grav.recv = NULL; diff --git a/src/task.c b/src/task.c index 34c636b48ed6ff3fefdf1e7847a67ca56ea79c89..2257ed6f9ca84f956adb1adfc555dfdca6badb0b 100644 --- a/src/task.c +++ b/src/task.c @@ -688,7 +688,11 @@ void task_get_group_name(int type, int subtype, char *cluster) { } break; case task_subtype_force: - strcpy(cluster, "Force"); + if (type == task_type_send || type == task_type_recv) { + strcpy(cluster, "None"); + } else { + strcpy(cluster, "Force"); + } break; case task_subtype_grav: strcpy(cluster, "Gravity");