diff --git a/src/engine_maketasks.c b/src/engine_maketasks.c index c344b17496322b4ebbe4543518efded21d8575d6..68628c7881e65b721af8cc6cdad6b297e0bedffb 100644 --- a/src/engine_maketasks.c +++ b/src/engine_maketasks.c @@ -556,8 +556,6 @@ void engine_addtasks_send_black_holes(struct engine *e, struct cell *ci, * created. * @param t_rt_transport The recv_rt_transport #task, if it has already been * created. - * @param t_rt_advance_cell_time The rt_advance_cell_time #task, if it has - * already been created * @param t_rt_sorts The rt_sort #task, if it has already been created. * @param tend The top-level time-step communication #task. * @param with_feedback Are we running with stellar feedback? @@ -570,8 +568,8 @@ 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_prep1, struct task *t_limiter, struct task *t_unpack_limiter, struct task *t_rt_gradient, - struct task *t_rt_transport, struct task *t_rt_advance_cell_time, - struct task *t_rt_sorts, struct task *const tend, const int with_feedback, + struct task *t_rt_transport, struct task *t_rt_sorts, + struct task *const tend, const int with_feedback, const int with_black_holes, const int with_limiter, const int with_sync, const int with_rt) { @@ -632,20 +630,34 @@ void engine_addtasks_recv_hydro( if (c->super == NULL) error("trying to add rt_advance_cell_time above super level..."); #endif - t_rt_advance_cell_time = - scheduler_addtask(s, task_type_rt_advance_cell_time, - task_subtype_none, 0, 0, c->super, NULL); - c->super->rt.rt_advance_cell_time = t_rt_advance_cell_time; /* Create the RT collect times task at the top level, if it hasn't * already. */ - if (c->top->rt.rt_collect_times == NULL) + if (c->top->rt.rt_collect_times == NULL) { c->top->rt.rt_collect_times = scheduler_addtask(s, task_type_rt_collect_times, task_subtype_none, 0, 0, c->top, NULL); - /* Don't run collect times before you run advance cell time */ - scheduler_addunlock(s, t_rt_advance_cell_time, - c->top->rt.rt_collect_times); + } + + /* Create the RT advance times task at the super level, if it hasn't + * already. Also set all the dependencies */ + if (c->super->rt.rt_advance_cell_time == NULL) { + + c->super->rt.rt_advance_cell_time = + scheduler_addtask(s, task_type_rt_advance_cell_time, + task_subtype_none, 0, 0, c->super, NULL); + + /* Don't run collect times before you run advance cell time */ + scheduler_addunlock(s, c->super->rt.rt_advance_cell_time, + c->top->rt.rt_collect_times); + + /* In normal steps, tend mustn't run before rt_advance_cell_time or the + * cell's ti_rt_end_min will be updated wrongly. In sub-cycles, we don't + * have the tend tasks, so there's no worry about that. (Them missing is + * the reason we need the rt_advanced_cell_time to complete the + * sub-cycles in the first place) */ + scheduler_addunlock(s, c->super->rt.rt_advance_cell_time, tend); + } /* Make sure we sort after receiving RT data. The hydro sorts may or may * not be active. Blocking them with dependencies deadlocks with MPI. So @@ -672,8 +684,8 @@ void engine_addtasks_recv_hydro( scheduler_addunlock(s, t_rt_sorts, t_rt_transport); /* If one or both recv tasks are active, make sure the * rt_advance_cell_time tasks doesn't run before them */ - scheduler_addunlock(s, t_rt_gradient, t_rt_advance_cell_time); - scheduler_addunlock(s, t_rt_transport, t_rt_advance_cell_time); + scheduler_addunlock(s, t_rt_gradient, c->super->rt.rt_advance_cell_time); + scheduler_addunlock(s, t_rt_transport, c->super->rt.rt_advance_cell_time); /* Make sure the gradient recv don't run before the xv is finished. * This can occur when a cell itself is inactive for both hydro and * RT, but needs to be sent over for some other cell's pair task. @@ -686,13 +698,6 @@ void engine_addtasks_recv_hydro( #ifdef EXTRA_HYDRO_LOOP scheduler_addunlock(s, t_gradient, t_rt_gradient); #endif - - /* In normal steps, tend mustn't run before rt_advance_cell_time or the - * cell's ti_rt_end_min will be updated wrongly. In sub-cycles, we don't - * have the tend tasks, so there's no worry about that. (Them missing is - * the reason we need the rt_advanced_cell_time to complete the sub-cycles - * in the first place) */ - scheduler_addunlock(s, t_rt_advance_cell_time, tend); } } @@ -804,7 +809,7 @@ void engine_addtasks_recv_hydro( * sure we don't receive data before we're done with all the work. */ scheduler_addunlock(s, l->t, tend); /* advance cell time mustn't run before transport is done */ - scheduler_addunlock(s, l->t, t_rt_advance_cell_time); + scheduler_addunlock(s, l->t, c->super->rt.rt_advance_cell_time); } } } @@ -815,9 +820,8 @@ void engine_addtasks_recv_hydro( if (c->progeny[k] != NULL) engine_addtasks_recv_hydro( e, c->progeny[k], t_xv, t_rho, t_gradient, t_prep1, t_limiter, - t_unpack_limiter, t_rt_gradient, t_rt_transport, - t_rt_advance_cell_time, t_rt_sorts, tend, with_feedback, - with_black_holes, with_limiter, with_sync, with_rt); + t_unpack_limiter, t_rt_gradient, t_rt_transport, t_rt_sorts, tend, + with_feedback, with_black_holes, with_limiter, with_sync, with_rt); #else error("SWIFT was not compiled with MPI support."); @@ -4305,8 +4309,8 @@ void engine_addtasks_recv_mapper(void *map_data, int num_elements, e, ci, /*t_xv=*/NULL, /*t_rho=*/NULL, /*t_gradient=*/NULL, /*t_prep1=*/NULL, /*t_limiter=*/NULL, /*t_unpack_limiter=*/NULL, /*t_rt_gradient=*/NULL, /*t_rt_transport=*/NULL, - /*t_rt_advance_cell_time=*/NULL, /*t_rt_sorts=*/NULL, tend, - with_feedback, with_black_holes, with_limiter, with_sync, with_rt); + /*t_rt_sorts=*/NULL, tend, with_feedback, with_black_holes, + with_limiter, with_sync, with_rt); } /* Add the recv tasks for the cells in the proxy that have a stars