engine_marktasks.c 37.7 KB
Newer Older
Pedro Gonnet's avatar
Pedro Gonnet committed
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/*******************************************************************************
 * This file is part of SWIFT.
 * Copyright (c) 2012 Pedro Gonnet (pedro.gonnet@durham.ac.uk)
 *                    Matthieu Schaller (matthieu.schaller@durham.ac.uk)
 *               2015 Peter W. Draper (p.w.draper@durham.ac.uk)
 *                    Angus Lepper (angus.lepper@ed.ac.uk)
 *               2016 John A. Regan (john.a.regan@durham.ac.uk)
 *                    Tom Theuns (tom.theuns@durham.ac.uk)
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published
 * by the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 ******************************************************************************/

/* Config parameters. */
#include "../config.h"

/* Some standard headers. */
#include <stdlib.h>
#include <unistd.h>

/* MPI headers. */
#ifdef WITH_MPI
#include <mpi.h>
#endif

/* Load the profiler header, if needed. */
#ifdef WITH_PROFILER
#include <gperftools/profiler.h>
#endif

/* This object's header. */
#include "engine.h"

/* Local headers. */
#include "active.h"
#include "atomic.h"
#include "cell.h"
#include "clocks.h"
#include "cycle.h"
#include "debug.h"
#include "error.h"
#include "proxy.h"
54
#include "task_order.h"
Pedro Gonnet's avatar
Pedro Gonnet committed
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include "timers.h"

/**
 * @brief Mark tasks to be un-skipped and set the sort flags accordingly.
 *        Threadpool mapper function.
 *
 * @param map_data pointer to the tasks
 * @param num_elements number of tasks
 * @param extra_data pointer to int that will define if a rebuild is needed.
 */
void engine_marktasks_mapper(void *map_data, int num_elements,
                             void *extra_data) {
  /* Unpack the arguments. */
  struct task *tasks = (struct task *)map_data;
  size_t *rebuild_space = &((size_t *)extra_data)[1];
  struct scheduler *s = (struct scheduler *)(((size_t *)extra_data)[2]);
  struct engine *e = (struct engine *)((size_t *)extra_data)[0];
  const int nodeID = e->nodeID;
73
74
  const int with_timestep_limiter = e->policy & engine_policy_timestep_limiter;
  const int with_timestep_sync = e->policy & engine_policy_timestep_sync;
75
  const int with_star_formation = e->policy & engine_policy_star_formation;
76
  const int with_feedback = e->policy & engine_policy_feedback;
Pedro Gonnet's avatar
Pedro Gonnet committed
77
78
79
80
81
82
83
84
85
86
87
88
89
90

  for (int ind = 0; ind < num_elements; ind++) {

    /* Get basic task information */
    struct task *t = &tasks[ind];
    const enum task_types t_type = t->type;
    const enum task_subtypes t_subtype = t->subtype;

    /* Single-cell task? */
    if (t_type == task_type_self || t_type == task_type_sub_self) {

      /* Local pointer. */
      struct cell *ci = t->ci;

91
#ifdef SWIFT_DEBUG_CHECKS
92
      if (ci->nodeID != nodeID) error("Non-local self task found");
93
94
95
96
#endif
      const int ci_active_hydro = cell_is_active_hydro(ci, e);
      const int ci_active_gravity = cell_is_active_gravity(ci, e);
      const int ci_active_black_holes = cell_is_active_black_holes(ci, e);
97
98
99
      const int ci_active_stars = cell_is_active_stars(ci, e) ||
                                  (with_star_formation && ci_active_hydro);

Pedro Gonnet's avatar
Pedro Gonnet committed
100
101
      /* Activate the hydro drift */
      if (t_type == task_type_self && t_subtype == task_subtype_density) {
102
        if (ci_active_hydro) {
Pedro Gonnet's avatar
Pedro Gonnet committed
103
104
          scheduler_activate(s, t);
          cell_activate_drift_part(ci, s);
105
          if (with_timestep_limiter) cell_activate_limiter(ci, s);
Pedro Gonnet's avatar
Pedro Gonnet committed
106
107
108
109
110
111
        }
      }

      /* Store current values of dx_max and h_max. */
      else if (t_type == task_type_sub_self &&
               t_subtype == task_subtype_density) {
112
        if (ci_active_hydro) {
Pedro Gonnet's avatar
Pedro Gonnet committed
113
          scheduler_activate(s, t);
114
          cell_activate_subcell_hydro_tasks(ci, NULL, s, with_timestep_limiter);
115
          if (with_timestep_limiter) cell_activate_limiter(ci, s);
Pedro Gonnet's avatar
Pedro Gonnet committed
116
117
118
119
        }
      }

      else if (t_type == task_type_self && t_subtype == task_subtype_force) {
120
        if (ci_active_hydro) scheduler_activate(s, t);
Pedro Gonnet's avatar
Pedro Gonnet committed
121
122
123
124
      }

      else if (t_type == task_type_sub_self &&
               t_subtype == task_subtype_force) {
125
        if (ci_active_hydro) scheduler_activate(s, t);
Pedro Gonnet's avatar
Pedro Gonnet committed
126
127
      }

128
129
      else if (t->type == task_type_self &&
               t->subtype == task_subtype_limiter) {
130
        if (ci_active_hydro) scheduler_activate(s, t);
131
132
133
134
      }

      else if (t->type == task_type_sub_self &&
               t->subtype == task_subtype_limiter) {
135
        if (ci_active_hydro) scheduler_activate(s, t);
136
137
      }

Pedro Gonnet's avatar
Pedro Gonnet committed
138
      else if (t_type == task_type_self && t_subtype == task_subtype_gradient) {
139
        if (ci_active_hydro) scheduler_activate(s, t);
Pedro Gonnet's avatar
Pedro Gonnet committed
140
141
142
143
      }

      else if (t_type == task_type_sub_self &&
               t_subtype == task_subtype_gradient) {
144
        if (ci_active_hydro) scheduler_activate(s, t);
Pedro Gonnet's avatar
Pedro Gonnet committed
145
146
147
148
149
      }

      /* Activate the star density */
      else if (t_type == task_type_self &&
               t_subtype == task_subtype_stars_density) {
150
        if (ci_active_stars) {
Pedro Gonnet's avatar
Pedro Gonnet committed
151
152
          scheduler_activate(s, t);
          cell_activate_drift_part(ci, s);
Loic Hausammann's avatar
Loic Hausammann committed
153
          cell_activate_drift_spart(ci, s);
154
          if (with_timestep_sync) cell_activate_sync_part(ci, s);
Pedro Gonnet's avatar
Pedro Gonnet committed
155
156
157
158
159
160
        }
      }

      /* Store current values of dx_max and h_max. */
      else if (t_type == task_type_sub_self &&
               t_subtype == task_subtype_stars_density) {
161
        if (ci_active_stars) {
Pedro Gonnet's avatar
Pedro Gonnet committed
162
          scheduler_activate(s, t);
163
164
          cell_activate_subcell_stars_tasks(ci, NULL, s, with_star_formation,
                                            with_timestep_sync);
Pedro Gonnet's avatar
Pedro Gonnet committed
165
166
167
        }
      }

Alexei Borissov's avatar
Alexei Borissov committed
168
169
      else if (t_type == task_type_self &&
               t_subtype == task_subtype_stars_feedback) {
170
        if (ci_active_stars) {
Alexei Borissov's avatar
Alexei Borissov committed
171
172
173
174
175
176
          scheduler_activate(s, t);
        }
      }

      else if (t_type == task_type_sub_self &&
               t_subtype == task_subtype_stars_feedback) {
177
        if (ci_active_stars) scheduler_activate(s, t);
Alexei Borissov's avatar
Alexei Borissov committed
178
179
      }

180
181
182
      /* Activate the black hole density */
      else if (t_type == task_type_self &&
               t_subtype == task_subtype_bh_density) {
183
        if (ci_active_black_holes) {
184
185
186
187
188
189
190
191
192
          scheduler_activate(s, t);
          cell_activate_drift_part(ci, s);
          cell_activate_drift_bpart(ci, s);
        }
      }

      /* Store current values of dx_max and h_max. */
      else if (t_type == task_type_sub_self &&
               t_subtype == task_subtype_bh_density) {
193
        if (ci_active_black_holes) {
194
          scheduler_activate(s, t);
195
196
          cell_activate_subcell_black_holes_tasks(ci, NULL, s,
                                                  with_timestep_sync);
197
198
199
        }
      }

200
201
202
203
204
205
206
207
208
209
210
211
212
      else if (t_type == task_type_self &&
               t_subtype == task_subtype_bh_swallow) {
        if (ci_active_black_holes) {
          scheduler_activate(s, t);
        }
      }

      else if (t_type == task_type_sub_self &&
               t_subtype == task_subtype_bh_swallow) {
        if (ci_active_black_holes) scheduler_activate(s, t);
      }

      else if (t_type == task_type_self &&
213
               t_subtype == task_subtype_do_gas_swallow) {
214
215
216
217
218
219
        if (ci_active_black_holes) {
          scheduler_activate(s, t);
        }
      }

      else if (t_type == task_type_sub_self &&
220
221
222
223
224
225
226
227
228
229
230
231
232
               t_subtype == task_subtype_do_gas_swallow) {
        if (ci_active_black_holes) scheduler_activate(s, t);
      }

      else if (t_type == task_type_self &&
               t_subtype == task_subtype_do_bh_swallow) {
        if (ci_active_black_holes) {
          scheduler_activate(s, t);
        }
      }

      else if (t_type == task_type_sub_self &&
               t_subtype == task_subtype_do_bh_swallow) {
233
234
235
        if (ci_active_black_holes) scheduler_activate(s, t);
      }

236
237
      else if (t_type == task_type_self &&
               t_subtype == task_subtype_bh_feedback) {
238
        if (ci_active_black_holes) {
239
240
241
242
243
244
          scheduler_activate(s, t);
        }
      }

      else if (t_type == task_type_sub_self &&
               t_subtype == task_subtype_bh_feedback) {
245
        if (ci_active_black_holes) scheduler_activate(s, t);
246
247
      }

Pedro Gonnet's avatar
Pedro Gonnet committed
248
249
      /* Activate the gravity drift */
      else if (t_type == task_type_self && t_subtype == task_subtype_grav) {
250
        if (ci_active_gravity) {
Pedro Gonnet's avatar
Pedro Gonnet committed
251
252
253
254
255
256
257
258
          scheduler_activate(s, t);
          cell_activate_subcell_grav_tasks(t->ci, NULL, s);
        }
      }

      /* Activate the gravity drift */
      else if (t_type == task_type_self &&
               t_subtype == task_subtype_external_grav) {
259
        if (ci_active_gravity) {
Pedro Gonnet's avatar
Pedro Gonnet committed
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
          scheduler_activate(s, t);
          cell_activate_drift_gpart(t->ci, s);
        }
      }

#ifdef SWIFT_DEBUG_CHECKS
      else {
        error("Invalid task type / sub-type encountered");
      }
#endif
    }

    /* Pair? */
    else if (t_type == task_type_pair || t_type == task_type_sub_pair) {

      /* Local pointers. */
      struct cell *ci = t->ci;
      struct cell *cj = t->cj;
#ifdef WITH_MPI
      const int ci_nodeID = ci->nodeID;
      const int cj_nodeID = cj->nodeID;
#else
      const int ci_nodeID = nodeID;
      const int cj_nodeID = nodeID;
#endif
      const int ci_active_hydro = cell_is_active_hydro(ci, e);
      const int cj_active_hydro = cell_is_active_hydro(cj, e);
287

Pedro Gonnet's avatar
Pedro Gonnet committed
288
289
      const int ci_active_gravity = cell_is_active_gravity(ci, e);
      const int cj_active_gravity = cell_is_active_gravity(cj, e);
290

291
292
293
      const int ci_active_black_holes = cell_is_active_black_holes(ci, e);
      const int cj_active_black_holes = cell_is_active_black_holes(cj, e);

294
295
296
297
298
      const int ci_active_stars = cell_is_active_stars(ci, e) ||
                                  (with_star_formation && ci_active_hydro);
      const int cj_active_stars = cell_is_active_stars(cj, e) ||
                                  (with_star_formation && cj_active_hydro);

Pedro Gonnet's avatar
Pedro Gonnet committed
299
300
301
      /* Only activate tasks that involve a local active cell. */
      if ((t_subtype == task_subtype_density ||
           t_subtype == task_subtype_gradient ||
302
           t_subtype == task_subtype_limiter ||
Pedro Gonnet's avatar
Pedro Gonnet committed
303
304
305
306
307
308
309
           t_subtype == task_subtype_force) &&
          ((ci_active_hydro && ci_nodeID == nodeID) ||
           (cj_active_hydro && cj_nodeID == nodeID))) {

        scheduler_activate(s, t);

        /* Set the correct sorting flags */
Loic Hausammann's avatar
Loic Hausammann committed
310
        if (t_type == task_type_pair && t_subtype == task_subtype_density) {
Pedro Gonnet's avatar
Pedro Gonnet committed
311
312
313
314
315
316
317
318
319
320
321

          /* Store some values. */
          atomic_or(&ci->hydro.requires_sorts, 1 << t->flags);
          atomic_or(&cj->hydro.requires_sorts, 1 << t->flags);
          ci->hydro.dx_max_sort_old = ci->hydro.dx_max_sort;
          cj->hydro.dx_max_sort_old = cj->hydro.dx_max_sort;

          /* Activate the hydro drift tasks. */
          if (ci_nodeID == nodeID) cell_activate_drift_part(ci, s);
          if (cj_nodeID == nodeID) cell_activate_drift_part(cj, s);

322
          /* And the limiter */
323
324
325
326
          if (ci_nodeID == nodeID && with_timestep_limiter)
            cell_activate_limiter(ci, s);
          if (cj_nodeID == nodeID && with_timestep_limiter)
            cell_activate_limiter(cj, s);
327

Pedro Gonnet's avatar
Pedro Gonnet committed
328
          /* Check the sorts and activate them if needed. */
329
330
          cell_activate_hydro_sorts(ci, t->flags, s);
          cell_activate_hydro_sorts(cj, t->flags, s);
Pedro Gonnet's avatar
Pedro Gonnet committed
331
332
333
334
335

        }

        /* Store current values of dx_max and h_max. */
        else if (t_type == task_type_sub_pair &&
Loic Hausammann's avatar
Loic Hausammann committed
336
                 t_subtype == task_subtype_density) {
337
338
          cell_activate_subcell_hydro_tasks(t->ci, t->cj, s,
                                            with_timestep_limiter);
Pedro Gonnet's avatar
Pedro Gonnet committed
339
340
341
        }
      }

342
343
      /* Stars density */
      else if ((t_subtype == task_subtype_stars_density) &&
344
345
346
               (ci_active_stars || cj_active_stars) &&
               (ci_nodeID == nodeID || cj_nodeID == nodeID)) {

loikki's avatar
loikki committed
347
        scheduler_activate(s, t);
348

Pedro Gonnet's avatar
Pedro Gonnet committed
349
350
351
        /* Set the correct sorting flags */
        if (t_type == task_type_pair) {

Loic Hausammann's avatar
Loic Hausammann committed
352
          /* Do ci */
loikki's avatar
loikki committed
353
          if (ci_active_stars) {
354

355
            /* stars for ci */
356
            atomic_or(&ci->stars.requires_sorts, 1 << t->flags);
357
            ci->stars.dx_max_sort_old = ci->stars.dx_max_sort;
Loic Hausammann's avatar
Loic Hausammann committed
358

359
            /* hydro for cj */
360
            atomic_or(&cj->hydro.requires_sorts, 1 << t->flags);
361
            cj->hydro.dx_max_sort_old = cj->hydro.dx_max_sort;
Pedro Gonnet's avatar
Pedro Gonnet committed
362

363
            /* Activate the drift tasks. */
364
365
            if (ci_nodeID == nodeID) cell_activate_drift_spart(ci, s);
            if (cj_nodeID == nodeID) cell_activate_drift_part(cj, s);
366
            if (cj_nodeID == nodeID && with_timestep_sync)
367
              cell_activate_sync_part(cj, s);
Pedro Gonnet's avatar
Pedro Gonnet committed
368

369
370
371
372
            /* Check the sorts and activate them if needed. */
            cell_activate_hydro_sorts(cj, t->flags, s);
            cell_activate_stars_sorts(ci, t->flags, s);
          }
Loic Hausammann's avatar
Loic Hausammann committed
373
374

          /* Do cj */
loikki's avatar
loikki committed
375
          if (cj_active_stars) {
Loic Hausammann's avatar
Loic Hausammann committed
376

377
            /* hydro for ci */
378
            atomic_or(&ci->hydro.requires_sorts, 1 << t->flags);
379
            ci->hydro.dx_max_sort_old = ci->hydro.dx_max_sort;
380

381
            /* stars for cj */
382
            atomic_or(&cj->stars.requires_sorts, 1 << t->flags);
383
            cj->stars.dx_max_sort_old = cj->stars.dx_max_sort;
Loic Hausammann's avatar
Loic Hausammann committed
384

385
            /* Activate the drift tasks. */
386
387
            if (ci_nodeID == nodeID) cell_activate_drift_part(ci, s);
            if (cj_nodeID == nodeID) cell_activate_drift_spart(cj, s);
388
            if (ci_nodeID == nodeID && with_timestep_sync)
389
              cell_activate_sync_part(ci, s);
Loic Hausammann's avatar
Loic Hausammann committed
390

391
392
393
394
            /* Check the sorts and activate them if needed. */
            cell_activate_hydro_sorts(ci, t->flags, s);
            cell_activate_stars_sorts(cj, t->flags, s);
          }
Pedro Gonnet's avatar
Pedro Gonnet committed
395
396
397
        }

        /* Store current values of dx_max and h_max. */
398
        else if (t_type == task_type_sub_pair &&
399
                 t_subtype == task_subtype_stars_density) {
400
401
          cell_activate_subcell_stars_tasks(ci, cj, s, with_star_formation,
                                            with_timestep_sync);
Pedro Gonnet's avatar
Pedro Gonnet committed
402
403
404
        }
      }

405
      /* Stars feedback */
406
      else if (t_subtype == task_subtype_stars_feedback) {
407

408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
        /* We only want to activate the task if the cell is active and is
           going to update some gas on the *local* node */
        if ((ci_nodeID == nodeID && cj_nodeID == nodeID) &&
            (ci_active_stars || cj_active_stars)) {

          scheduler_activate(s, t);

        } else if ((ci_nodeID == nodeID && cj_nodeID != nodeID) &&
                   (cj_active_stars)) {

          scheduler_activate(s, t);

        } else if ((ci_nodeID != nodeID && cj_nodeID == nodeID) &&
                   (ci_active_stars)) {

          scheduler_activate(s, t);
        }
425
      }
426

427
      /* Black_Holes density */
428
429
      else if ((t_subtype == task_subtype_bh_density ||
                t_subtype == task_subtype_bh_swallow ||
430
                t_subtype == task_subtype_do_gas_swallow ||
431
                t_subtype == task_subtype_do_bh_swallow ||
432
                t_subtype == task_subtype_bh_feedback) &&
433
434
435
436
437
               (ci_active_black_holes || cj_active_black_holes) &&
               (ci_nodeID == nodeID || cj_nodeID == nodeID)) {

        scheduler_activate(s, t);

438
        /* Set the correct drifting flags */
439
440
441
        if (t_type == task_type_pair && t_subtype == task_subtype_bh_density) {
          if (ci_nodeID == nodeID) cell_activate_drift_bpart(ci, s);
          if (ci_nodeID == nodeID) cell_activate_drift_part(ci, s);
442

443
444
          if (cj_nodeID == nodeID) cell_activate_drift_part(cj, s);
          if (cj_nodeID == nodeID) cell_activate_drift_bpart(cj, s);
445
446
447
448
449
        }

        /* Store current values of dx_max and h_max. */
        else if (t_type == task_type_sub_pair &&
                 t_subtype == task_subtype_bh_density) {
450
451
          cell_activate_subcell_black_holes_tasks(ci, cj, s,
                                                  with_timestep_sync);
452
453
454
        }
      }

455
      /* Gravity */
456
      else if ((t_subtype == task_subtype_grav) &&
457
458
               ((ci_active_gravity && ci_nodeID == nodeID) ||
                (cj_active_gravity && cj_nodeID == nodeID))) {
Pedro Gonnet's avatar
Pedro Gonnet committed
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478

        scheduler_activate(s, t);

        if (t_type == task_type_pair && t_subtype == task_subtype_grav) {
          /* Activate the gravity drift */
          cell_activate_subcell_grav_tasks(t->ci, t->cj, s);
        }

#ifdef SWIFT_DEBUG_CHECKS
        else if (t_type == task_type_sub_pair &&
                 t_subtype == task_subtype_grav) {
          error("Invalid task sub-type encountered");
        }
#endif
      }

      /* Only interested in density tasks as of here. */
      if (t_subtype == task_subtype_density) {

        /* Too much particle movement? */
Alexei Borissov's avatar
Alexei Borissov committed
479
        if (cell_need_rebuild_for_hydro_pair(ci, cj)) *rebuild_space = 1;
Pedro Gonnet's avatar
Pedro Gonnet committed
480
481
482
483
484
485
486

#ifdef WITH_MPI
        /* Activate the send/recv tasks. */
        if (ci_nodeID != nodeID) {

          /* If the local cell is active, receive data from the foreign cell. */
          if (cj_active_hydro) {
487
            scheduler_activate_recv(s, ci->mpi.recv, task_subtype_xv);
Pedro Gonnet's avatar
Pedro Gonnet committed
488
            if (ci_active_hydro) {
489
              scheduler_activate_recv(s, ci->mpi.recv, task_subtype_rho);
Pedro Gonnet's avatar
Pedro Gonnet committed
490
#ifdef EXTRA_HYDRO_LOOP
491
              scheduler_activate_recv(s, ci->mpi.recv, task_subtype_gradient);
Pedro Gonnet's avatar
Pedro Gonnet committed
492
493
494
495
#endif
            }
          }

496
497
498
499
500
          /* If the foreign cell is active, we want its particles for the
           * limiter */
          if (ci_active_hydro && with_timestep_limiter)
            scheduler_activate_recv(s, ci->mpi.recv, task_subtype_limiter);

Pedro Gonnet's avatar
Pedro Gonnet committed
501
          /* If the foreign cell is active, we want its ti_end values. */
502
503
          if (ci_active_hydro)
            scheduler_activate_recv(s, ci->mpi.recv, task_subtype_tend_part);
Pedro Gonnet's avatar
Pedro Gonnet committed
504
505
506

          /* Is the foreign cell active and will need stuff from us? */
          if (ci_active_hydro) {
507
            struct link *l = scheduler_activate_send(
508
                s, cj->mpi.send, task_subtype_xv, ci_nodeID);
Pedro Gonnet's avatar
Pedro Gonnet committed
509
510
511
512
513
514
515
516

            /* 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. */
            cell_activate_drift_part(l->t->ci, s);

            /* If the local cell is also active, more stuff will be needed. */
            if (cj_active_hydro) {
517
518
              scheduler_activate_send(s, cj->mpi.send, task_subtype_rho,
                                      ci_nodeID);
Pedro Gonnet's avatar
Pedro Gonnet committed
519
520

#ifdef EXTRA_HYDRO_LOOP
521
522
              scheduler_activate_send(s, cj->mpi.send, task_subtype_gradient,
                                      ci_nodeID);
Pedro Gonnet's avatar
Pedro Gonnet committed
523
524
525
526
#endif
            }
          }

527
528
529
530
531
532
          /* If the local cell is active, send its particles for the limiting.
           */
          if (cj_active_hydro && with_timestep_limiter)
            scheduler_activate_send(s, cj->mpi.send, task_subtype_limiter,
                                    ci_nodeID);

Pedro Gonnet's avatar
Pedro Gonnet committed
533
534
          /* If the local cell is active, send its ti_end values. */
          if (cj_active_hydro)
535
536
            scheduler_activate_send(s, cj->mpi.send, task_subtype_tend_part,
                                    ci_nodeID);
Pedro Gonnet's avatar
Pedro Gonnet committed
537

538
539
540
          /* Propagating new star counts? */
          if (with_star_formation && with_feedback) {
            if (ci_active_hydro && ci->hydro.count > 0) {
541
              if (task_order_star_formation_before_feedback) {
Loic Hausammann's avatar
Format    
Loic Hausammann committed
542
543
                scheduler_activate_recv(s, ci->mpi.recv,
                                        task_subtype_sf_counts);
544
              }
545
              scheduler_activate_recv(s, ci->mpi.recv, task_subtype_tend_spart);
546
547
            }
            if (cj_active_hydro && cj->hydro.count > 0) {
548
549
              if (task_order_star_formation_before_feedback) {
                scheduler_activate_send(s, cj->mpi.send, task_subtype_sf_counts,
Loic Hausammann's avatar
Format    
Loic Hausammann committed
550
                                        ci_nodeID);
551
              }
552
553
              scheduler_activate_send(s, cj->mpi.send, task_subtype_tend_spart,
                                      ci_nodeID);
554
555
556
            }
          }

Pedro Gonnet's avatar
Pedro Gonnet committed
557
558
559
560
        } else if (cj_nodeID != nodeID) {

          /* If the local cell is active, receive data from the foreign cell. */
          if (ci_active_hydro) {
561

562
            scheduler_activate_recv(s, cj->mpi.recv, task_subtype_xv);
Pedro Gonnet's avatar
Pedro Gonnet committed
563
            if (cj_active_hydro) {
564
              scheduler_activate_recv(s, cj->mpi.recv, task_subtype_rho);
Pedro Gonnet's avatar
Pedro Gonnet committed
565
#ifdef EXTRA_HYDRO_LOOP
566
              scheduler_activate_recv(s, cj->mpi.recv, task_subtype_gradient);
Pedro Gonnet's avatar
Pedro Gonnet committed
567
568
569
570
#endif
            }
          }

571
572
573
574
575
          /* If the foreign cell is active, we want its particles for the
           * limiter */
          if (cj_active_hydro && with_timestep_limiter)
            scheduler_activate_recv(s, cj->mpi.recv, task_subtype_limiter);

Pedro Gonnet's avatar
Pedro Gonnet committed
576
          /* If the foreign cell is active, we want its ti_end values. */
577
578
          if (cj_active_hydro)
            scheduler_activate_recv(s, cj->mpi.recv, task_subtype_tend_part);
Pedro Gonnet's avatar
Pedro Gonnet committed
579
580
581
582

          /* Is the foreign cell active and will need stuff from us? */
          if (cj_active_hydro) {

583
            struct link *l = scheduler_activate_send(
584
                s, ci->mpi.send, task_subtype_xv, cj_nodeID);
Pedro Gonnet's avatar
Pedro Gonnet committed
585
586
587
588
589
590
591
592
593

            /* 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. */
            cell_activate_drift_part(l->t->ci, s);

            /* If the local cell is also active, more stuff will be needed. */
            if (ci_active_hydro) {

594
595
              scheduler_activate_send(s, ci->mpi.send, task_subtype_rho,
                                      cj_nodeID);
Pedro Gonnet's avatar
Pedro Gonnet committed
596
597

#ifdef EXTRA_HYDRO_LOOP
598
599
              scheduler_activate_send(s, ci->mpi.send, task_subtype_gradient,
                                      cj_nodeID);
Pedro Gonnet's avatar
Pedro Gonnet committed
600
601
602
603
#endif
            }
          }

604
605
606
607
608
609
          /* If the local cell is active, send its particles for the limiting.
           */
          if (ci_active_hydro && with_timestep_limiter)
            scheduler_activate_send(s, ci->mpi.send, task_subtype_limiter,
                                    cj_nodeID);

Pedro Gonnet's avatar
Pedro Gonnet committed
610
611
          /* If the local cell is active, send its ti_end values. */
          if (ci_active_hydro)
612
613
            scheduler_activate_send(s, ci->mpi.send, task_subtype_tend_part,
                                    cj_nodeID);
614
615
616
617

          /* Propagating new star counts? */
          if (with_star_formation && with_feedback) {
            if (cj_active_hydro && cj->hydro.count > 0) {
618
              if (task_order_star_formation_before_feedback) {
Loic Hausammann's avatar
Format    
Loic Hausammann committed
619
620
                scheduler_activate_recv(s, cj->mpi.recv,
                                        task_subtype_sf_counts);
621
              }
622
              scheduler_activate_recv(s, cj->mpi.recv, task_subtype_tend_spart);
623
624
            }
            if (ci_active_hydro && ci->hydro.count > 0) {
625
626
627
628
              if (task_order_star_formation_before_feedback) {
                scheduler_activate_send(s, ci->mpi.send, task_subtype_sf_counts,
                                        cj_nodeID);
              }
629
630
              scheduler_activate_send(s, ci->mpi.send, task_subtype_tend_spart,
                                      cj_nodeID);
631
632
            }
          }
Pedro Gonnet's avatar
Pedro Gonnet committed
633
634
635
636
637
        }
#endif
      }

      /* Only interested in stars_density tasks as of here. */
638
      else if (t->subtype == task_subtype_stars_density) {
639
640
641
642
643

        /* Too much particle movement? */
        if (cell_need_rebuild_for_stars_pair(ci, cj)) *rebuild_space = 1;
        if (cell_need_rebuild_for_stars_pair(cj, ci)) *rebuild_space = 1;

644
#ifdef WITH_MPI
645
646
647
648
        /* Activate the send/recv tasks. */
        if (ci_nodeID != nodeID) {

          if (cj_active_stars) {
649
            scheduler_activate_recv(s, ci->mpi.recv, task_subtype_xv);
650
            scheduler_activate_recv(s, ci->mpi.recv, task_subtype_rho);
651
652

            /* If the local cell is active, more stuff will be needed. */
653
            scheduler_activate_send(s, cj->mpi.send, task_subtype_spart,
654
                                    ci_nodeID);
655
656
657
            cell_activate_drift_spart(cj, s);

            /* If the local cell is active, send its ti_end values. */
658
659
            scheduler_activate_send(s, cj->mpi.send, task_subtype_tend_spart,
                                    ci_nodeID);
660
661
662
          }

          if (ci_active_stars) {
663
            scheduler_activate_recv(s, ci->mpi.recv, task_subtype_spart);
664
665

            /* If the foreign cell is active, we want its ti_end values. */
666
            scheduler_activate_recv(s, ci->mpi.recv, task_subtype_tend_spart);
667
668

            /* Is the foreign cell active and will need stuff from us? */
669
            scheduler_activate_send(s, cj->mpi.send, task_subtype_xv,
670
                                    ci_nodeID);
671
            scheduler_activate_send(s, cj->mpi.send, task_subtype_rho,
672
                                    ci_nodeID);
673
674
675
676
677
678
679
680
681
682

            /* Drift the cell which will be sent; note that not all sent
               particles will be drifted, only those that are needed. */
            cell_activate_drift_part(cj, s);
          }

        } else if (cj_nodeID != nodeID) {

          /* If the local cell is active, receive data from the foreign cell. */
          if (ci_active_stars) {
683
            scheduler_activate_recv(s, cj->mpi.recv, task_subtype_xv);
684
            scheduler_activate_recv(s, cj->mpi.recv, task_subtype_rho);
685
686

            /* If the local cell is active, more stuff will be needed. */
687
            scheduler_activate_send(s, ci->mpi.send, task_subtype_spart,
688
                                    cj_nodeID);
689
690
691
            cell_activate_drift_spart(ci, s);

            /* If the local cell is active, send its ti_end values. */
692
693
            scheduler_activate_send(s, ci->mpi.send, task_subtype_tend_spart,
                                    cj_nodeID);
694
695
696
          }

          if (cj_active_stars) {
697
            scheduler_activate_recv(s, cj->mpi.recv, task_subtype_spart);
698
699

            /* If the foreign cell is active, we want its ti_end values. */
700
            scheduler_activate_recv(s, cj->mpi.recv, task_subtype_tend_spart);
701
702

            /* Is the foreign cell active and will need stuff from us? */
703
            scheduler_activate_send(s, ci->mpi.send, task_subtype_xv,
704
                                    cj_nodeID);
705
            scheduler_activate_send(s, ci->mpi.send, task_subtype_rho,
706
                                    cj_nodeID);
707
708
709
710
711
712

            /* Drift the cell which will be sent; note that not all sent
               particles will be drifted, only those that are needed. */
            cell_activate_drift_part(ci, s);
          }
        }
713
#endif
Pedro Gonnet's avatar
Pedro Gonnet committed
714
      }
715

716
      /* Only interested in black hole density tasks as of here. */
717
718
719
720
721
722
      else if (t->subtype == task_subtype_bh_density) {

        /* Too much particle movement? */
        if (cell_need_rebuild_for_black_holes_pair(ci, cj)) *rebuild_space = 1;
        if (cell_need_rebuild_for_black_holes_pair(cj, ci)) *rebuild_space = 1;

723
724
725
        scheduler_activate(s, ci->hydro.super->black_holes.swallow_ghost[0]);
        scheduler_activate(s, cj->hydro.super->black_holes.swallow_ghost[0]);

726
727
728
729
#ifdef WITH_MPI
        /* Activate the send/recv tasks. */
        if (ci_nodeID != nodeID) {

730
731
732
733
          /* Receive the foreign parts to compute BH accretion rates and do the
           * swallowing */
          scheduler_activate_recv(s, ci->mpi.recv, task_subtype_rho);
          scheduler_activate_recv(s, ci->mpi.recv, task_subtype_part_swallow);
734
          scheduler_activate_recv(s, ci->mpi.recv, task_subtype_bpart_merger);
735

736
737
738
739
740
741
          /* Send the local BHs to tag the particles to swallow and to do
           * feedback */
          scheduler_activate_send(s, cj->mpi.send, task_subtype_bpart_rho,
                                  ci_nodeID);
          scheduler_activate_send(s, cj->mpi.send, task_subtype_bpart_feedback,
                                  ci_nodeID);
742

743
744
          /* Drift before you send */
          cell_activate_drift_bpart(cj, s);
745

746
747
748
          /* Send the new BH time-steps */
          scheduler_activate_send(s, cj->mpi.send, task_subtype_tend_bpart,
                                  ci_nodeID);
749

750
751
752
753
          /* Receive the foreign BHs to tag particles to swallow and for
           * feedback */
          scheduler_activate_recv(s, ci->mpi.recv, task_subtype_bpart_rho);
          scheduler_activate_recv(s, ci->mpi.recv, task_subtype_bpart_feedback);
754

755
756
          /* Receive the foreign BH time-steps */
          scheduler_activate_recv(s, ci->mpi.recv, task_subtype_tend_bpart);
757

758
759
760
761
          /* Send the local part information */
          scheduler_activate_send(s, cj->mpi.send, task_subtype_rho, ci_nodeID);
          scheduler_activate_send(s, cj->mpi.send, task_subtype_part_swallow,
                                  ci_nodeID);
762
763
          scheduler_activate_send(s, cj->mpi.send, task_subtype_bpart_merger,
                                  ci_nodeID);
764
765
766
767

          /* Drift the cell which will be sent; note that not all sent
             particles will be drifted, only those that are needed. */
          cell_activate_drift_part(cj, s);
768
769
770

        } else if (cj_nodeID != nodeID) {

771
772
773
774
          /* Receive the foreign parts to compute BH accretion rates and do the
           * swallowing */
          scheduler_activate_recv(s, cj->mpi.recv, task_subtype_rho);
          scheduler_activate_recv(s, cj->mpi.recv, task_subtype_part_swallow);
775
          scheduler_activate_recv(s, cj->mpi.recv, task_subtype_bpart_merger);
776

777
778
779
780
781
782
          /* Send the local BHs to tag the particles to swallow and to do
           * feedback */
          scheduler_activate_send(s, ci->mpi.send, task_subtype_bpart_rho,
                                  cj_nodeID);
          scheduler_activate_send(s, ci->mpi.send, task_subtype_bpart_feedback,
                                  cj_nodeID);
783

784
785
          /* Drift before you send */
          cell_activate_drift_bpart(ci, s);
786

787
788
789
          /* Send the new BH time-steps */
          scheduler_activate_send(s, ci->mpi.send, task_subtype_tend_bpart,
                                  cj_nodeID);
790

791
792
793
794
          /* Receive the foreign BHs to tag particles to swallow and for
           * feedback */
          scheduler_activate_recv(s, cj->mpi.recv, task_subtype_bpart_rho);
          scheduler_activate_recv(s, cj->mpi.recv, task_subtype_bpart_feedback);
795

796
797
          /* Receive the foreign BH time-steps */
          scheduler_activate_recv(s, cj->mpi.recv, task_subtype_tend_bpart);
798

799
800
801
802
          /* Send the local part information */
          scheduler_activate_send(s, ci->mpi.send, task_subtype_rho, cj_nodeID);
          scheduler_activate_send(s, ci->mpi.send, task_subtype_part_swallow,
                                  cj_nodeID);
803
804
          scheduler_activate_send(s, ci->mpi.send, task_subtype_bpart_merger,
                                  cj_nodeID);
805
806
807
808

          /* Drift the cell which will be sent; note that not all sent
             particles will be drifted, only those that are needed. */
          cell_activate_drift_part(ci, s);
809
810
811
812
        }
#endif
      }

Pedro Gonnet's avatar
Pedro Gonnet committed
813
      /* Only interested in gravity tasks as of here. */
814
      else if (t_subtype == task_subtype_grav) {
Pedro Gonnet's avatar
Pedro Gonnet committed
815
816
817
818
819
820

#ifdef WITH_MPI
        /* Activate the send/recv tasks. */
        if (ci_nodeID != nodeID) {

          /* If the local cell is active, receive data from the foreign cell. */
821
822
          if (cj_active_gravity)
            scheduler_activate_recv(s, ci->mpi.recv, task_subtype_gpart);
Pedro Gonnet's avatar
Pedro Gonnet committed
823
824

          /* If the foreign cell is active, we want its ti_end values. */
825
826
          if (ci_active_gravity)
            scheduler_activate_recv(s, ci->mpi.recv, task_subtype_tend_gpart);
Pedro Gonnet's avatar
Pedro Gonnet committed
827
828
829
830

          /* Is the foreign cell active and will need stuff from us? */
          if (ci_active_gravity) {

831
            struct link *l = scheduler_activate_send(
832
                s, cj->mpi.send, task_subtype_gpart, ci_nodeID);
Pedro Gonnet's avatar
Pedro Gonnet committed
833
834
835
836
837
838
839
840
841

            /* 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. */
            cell_activate_drift_gpart(l->t->ci, s);
          }

          /* If the local cell is active, send its ti_end values. */
          if (cj_active_gravity)
842
843
            scheduler_activate_send(s, cj->mpi.send, task_subtype_tend_gpart,
                                    ci_nodeID);
Pedro Gonnet's avatar
Pedro Gonnet committed
844
845
846
847

        } else if (cj_nodeID != nodeID) {

          /* If the local cell is active, receive data from the foreign cell. */
848
849
          if (ci_active_gravity)
            scheduler_activate_recv(s, cj->mpi.recv, task_subtype_gpart);
Pedro Gonnet's avatar
Pedro Gonnet committed
850
851

          /* If the foreign cell is active, we want its ti_end values. */
852
853
          if (cj_active_gravity)
            scheduler_activate_recv(s, cj->mpi.recv, task_subtype_tend_gpart);
Pedro Gonnet's avatar
Pedro Gonnet committed
854
855
856
857

          /* Is the foreign cell active and will need stuff from us? */
          if (cj_active_gravity) {

858
            struct link *l = scheduler_activate_send(
859
                s, ci->mpi.send, task_subtype_gpart, cj_nodeID);
Pedro Gonnet's avatar
Pedro Gonnet committed
860
861
862
863
864
865
866
867
868

            /* 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. */
            cell_activate_drift_gpart(l->t->ci, s);
          }

          /* If the local cell is active, send its ti_end values. */
          if (ci_active_gravity)
869
870
            scheduler_activate_send(s, ci->mpi.send, task_subtype_tend_gpart,
                                    cj_nodeID);
Pedro Gonnet's avatar
Pedro Gonnet committed
871
872
873
874
875
        }
#endif
      }
    }

876
877
    /* End force for hydro ? */
    else if (t_type == task_type_end_hydro_force) {
Pedro Gonnet's avatar
Pedro Gonnet committed
878

879
880
881
882
883
884
885
      if (cell_is_active_hydro(t->ci, e)) scheduler_activate(s, t);
    }

    /* End force for gravity ? */
    else if (t_type == task_type_end_grav_force) {

      if (cell_is_active_gravity(t->ci, e)) scheduler_activate(s, t);
Pedro Gonnet's avatar
Pedro Gonnet committed
886
887
888
    }

    /* Kick ? */
889
    else if (t_type == task_type_kick1 || t_type == task_type_kick2) {
Pedro Gonnet's avatar
Pedro Gonnet committed
890

891
892
893
      if (cell_is_active_hydro(t->ci, e) || cell_is_active_gravity(t->ci, e) ||
          cell_is_active_stars(t->ci, e) ||
          cell_is_active_black_holes(t->ci, e))
Pedro Gonnet's avatar
Pedro Gonnet committed
894
895
896
897
898
899
900
901
902
903
904
905
        scheduler_activate(s, t);
    }

    /* Hydro ghost tasks ? */
    else if (t_type == task_type_ghost || t_type == task_type_extra_ghost ||
             t_type == task_type_ghost_in || t_type == task_type_ghost_out) {
      if (cell_is_active_hydro(t->ci, e)) scheduler_activate(s, t);
    }

    /* logger tasks ? */
    else if (t->type == task_type_logger) {
      if (cell_is_active_hydro(t->ci, e) || cell_is_active_gravity(t->ci, e) ||
906
          cell_is_active_stars(t->ci, e))
Pedro Gonnet's avatar
Pedro Gonnet committed
907
908
909
910
911
912
913
914
        scheduler_activate(s, t);
    }

    /* Gravity stuff ? */
    else if (t_type == task_type_grav_down || t_type == task_type_grav_mesh ||
             t_type == task_type_grav_long_range ||
             t_type == task_type_init_grav ||
             t_type == task_type_init_grav_out ||
915
             t_type == task_type_drift_gpart_out ||
Pedro Gonnet's avatar
Pedro Gonnet committed
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
             t_type == task_type_grav_down_in) {
      if (cell_is_active_gravity(t->ci, e)) scheduler_activate(s, t);
    }

    /* Multipole - Multipole interaction task */
    else if (t_type == task_type_grav_mm) {

      /* Local pointers. */
      const struct cell *ci = t->ci;
      const struct cell *cj = t->cj;
#ifdef WITH_MPI
      const int ci_nodeID = ci->nodeID;
      const int cj_nodeID = (cj != NULL) ? cj->nodeID : -1;
#else
      const int ci_nodeID = nodeID;
      const int cj_nodeID = nodeID;
#endif
      const int ci_active_gravity = cell_is_active_gravity_mm(ci, e);
      const int cj_active_gravity = cell_is_active_gravity_mm(cj, e);

      if ((ci_active_gravity && ci_nodeID == nodeID) ||
          (cj_active_gravity && cj_nodeID == nodeID))
        scheduler_activate(s, t);
    }

    /* Star ghost tasks ? */
942
    else if (t_type == task_type_stars_ghost) {
943
944
945
      if (cell_is_active_stars(t->ci, e) ||
          (with_star_formation && cell_is_active_hydro(t->ci, e)))
        scheduler_activate(s, t);
946
947
948
949
    }

    /* Feedback implicit tasks? */
    else if (t_type == task_type_stars_in || t_type == task_type_stars_out) {
950
951
952
      if (cell_is_active_stars(t->ci, e) ||
          (with_star_formation && cell_is_active_hydro(t->ci, e)))
        scheduler_activate(s, t);
Pedro Gonnet's avatar
Pedro Gonnet committed
953
954
    }

955
    /* Black hole ghost tasks ? */
956
957
    else if (t_type == task_type_bh_density_ghost ||
             t_type == task_type_bh_swallow_ghost1 ||
958
959
             t_type == task_type_bh_swallow_ghost2 ||
             t_type == task_type_bh_swallow_ghost3) {
960
961
962
963
964
965
966
967
      if (cell_is_active_black_holes(t->ci, e)) scheduler_activate(s, t);
    }

    /* Black holes implicit tasks? */
    else if (t_type == task_type_bh_in || t_type == task_type_bh_out) {
      if (cell_is_active_black_holes(t->ci, e)) scheduler_activate(s, t);
    }

Pedro Gonnet's avatar
Pedro Gonnet committed
968
    /* Time-step? */
969
    else if (t_type == task_type_timestep) {
Pedro Gonnet's avatar
Pedro Gonnet committed
970
971
972
      t->ci->hydro.updated = 0;
      t->ci->grav.updated = 0;
      t->ci->stars.updated = 0;
973
974
975
976
      t->ci->black_holes.updated = 0;
      if (cell_is_active_hydro(t->ci, e) || cell_is_active_gravity(t->ci, e) ||
          cell_is_active_stars(t->ci, e) ||
          cell_is_active_black_holes(t->ci, e))
Pedro Gonnet's avatar
Pedro Gonnet committed
977
978
979
        scheduler_activate(s, t);
    }

980
    /* Subgrid tasks: cooling */
981
982
    else if (t_type == task_type_cooling || t_type == task_type_cooling_in ||
             t_type == task_type_cooling_out) {
983
984
985
986
      if (cell_is_active_hydro(t->ci, e)) scheduler_activate(s, t);
    }

    /* Subgrid tasks: star formation */
987
    else if (t_type == task_type_star_formation) {
988
      if (cell_is_active_hydro(t->ci, e)) {
989
        cell_activate_star_formation_tasks(t->ci, s, with_feedback);
990
        cell_activate_super_spart_drifts(t->ci, s);
991
      }
Pedro Gonnet's avatar
Pedro Gonnet committed
992
993
994
995
996
997
998
999
1000
    }
  }
}

/**
 * @brief Mark tasks to be un-skipped and set the sort flags accordingly.
 *
 * @return 1 if the space has to be rebuilt, 0 otherwise.
 */
For faster browsing, not all history is shown. View entire blame