active.h 15.8 KB
Newer Older
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
/*******************************************************************************
 * This file is part of SWIFT.
 * Copyright (c) 2016 Matthieu Schaller (matthieu.schaller@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/>.
 *
 ******************************************************************************/
#ifndef SWIFT_ACTIVE_H
#define SWIFT_ACTIVE_H

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

/* Local includes. */
#include "cell.h"
#include "engine.h"
#include "part.h"
29
#include "timeline.h"
30

31
/**
32
 * @brief Check that the #part in a #cell have been drifted to the current time.
33
34
35
 *
 * @param c The #cell.
 * @param e The #engine containing information about the current time.
36
 * @return 1 if the #cell has been drifted to the current time, 0 otherwise.
37
 */
38
__attribute__((always_inline)) INLINE static int cell_are_part_drifted(
39
40
41
    const struct cell *c, const struct engine *e) {

#ifdef SWIFT_DEBUG_CHECKS
42
  if (c->hydro.ti_old_part > e->ti_current)
43
    error(
44
45
        "Cell has been drifted too far forward in time! c->ti_old_part=%lld "
        "(t=%e) "
46
        "and e->ti_current=%lld (t=%e, a=%e)",
47
48
        c->hydro.ti_old_part, c->hydro.ti_old_part * e->time_base,
        e->ti_current, e->ti_current * e->time_base, e->cosmology->a);
49
#endif
Matthieu Schaller's avatar
Matthieu Schaller committed
50

51
  return (c->hydro.ti_old_part == e->ti_current);
52
53
54
55
56
57
58
59
60
61
62
63
64
65
}

/**
 * @brief Check that the #gpart in a #cell have been drifted to the current
 * time.
 *
 * @param c The #cell.
 * @param e The #engine containing information about the current time.
 * @return 1 if the #cell has been drifted to the current time, 0 otherwise.
 */
__attribute__((always_inline)) INLINE static int cell_are_gpart_drifted(
    const struct cell *c, const struct engine *e) {

#ifdef SWIFT_DEBUG_CHECKS
66
  if (c->grav.ti_old_part > e->ti_current)
67
68
69
    error(
        "Cell has been drifted too far forward in time! c->ti_old=%lld (t=%e) "
        "and e->ti_current=%lld (t=%e)",
70
71
        c->grav.ti_old_part, c->grav.ti_old_part * e->time_base, e->ti_current,
        e->ti_current * e->time_base);
72
73
#endif

74
  return (c->grav.ti_old_part == e->ti_current);
75
76
}

Loic Hausammann's avatar
Loic Hausammann committed
77
78
79
80
81
82
83
84
85
86
87
/**
 * @brief Check that the #spart in a #cell have been drifted to the current
 * time.
 *
 * @param c The #cell.
 * @param e The #engine containing information about the current time.
 * @return 1 if the #cell has been drifted to the current time, 0 otherwise.
 */
__attribute__((always_inline)) INLINE static int cell_are_spart_drifted(
    const struct cell *c, const struct engine *e) {

88
89
90
91
92
93
94
95
96
97
#ifdef SWIFT_DEBUG_CHECKS
  if (c->stars.ti_old_part > e->ti_current)
    error(
        "Cell has been drifted too far forward in time! c->ti_old=%lld (t=%e) "
        "and e->ti_current=%lld (t=%e)",
        c->stars.ti_old_part, c->stars.ti_old_part * e->time_base,
        e->ti_current, e->ti_current * e->time_base);
#endif

  return (c->stars.ti_old_part == e->ti_current);
Loic Hausammann's avatar
Loic Hausammann committed
98
99
}

100
101
/* Are cells / particles active for regular tasks ? */

102
/**
103
 * @brief Does a cell contain any particle finishing their time-step now ?
104
105
106
 *
 * @param c The #cell.
 * @param e The #engine containing information about the current time.
Matthieu Schaller's avatar
Matthieu Schaller committed
107
 * @return 1 if the #cell contains at least an active particle, 0 otherwise.
108
 */
109
__attribute__((always_inline)) INLINE static int cell_is_active_hydro(
110
111
    const struct cell *c, const struct engine *e) {

112
#ifdef SWIFT_DEBUG_CHECKS
113
  if (c->hydro.ti_end_min < e->ti_current)
114
    error(
115
        "cell in an impossible time-zone! c->ti_end_min=%lld (t=%e) and "
116
        "e->ti_current=%lld (t=%e, a=%e)",
117
        c->hydro.ti_end_min, c->hydro.ti_end_min * e->time_base, e->ti_current,
118
        e->ti_current * e->time_base, e->cosmology->a);
119
120
#endif

121
  return (c->hydro.ti_end_min == e->ti_current);
122
123
124
}

/**
125
 * @brief Are *all* particles in a cell finishing their time-step now ?
126
127
128
 *
 * @param c The #cell.
 * @param e The #engine containing information about the current time.
Matthieu Schaller's avatar
Matthieu Schaller committed
129
 * @return 1 if all particles in a #cell are active, 0 otherwise.
130
 */
131
__attribute__((always_inline)) INLINE static int cell_is_all_active_hydro(
132
133
    const struct cell *c, const struct engine *e) {

134
#ifdef SWIFT_DEBUG_CHECKS
135
  if (c->hydro.ti_end_max < e->ti_current)
136
137
138
    error(
        "cell in an impossible time-zone! c->ti_end_max=%lld "
        "e->ti_current=%lld",
139
        c->hydro.ti_end_max, e->ti_current);
140
141
#endif

142
  return (c->hydro.ti_end_max == e->ti_current);
143
144
145
146
147
148
149
150
151
152
153
154
155
}

/**
 * @brief Does a cell contain any g-particle finishing their time-step now ?
 *
 * @param c The #cell.
 * @param e The #engine containing information about the current time.
 * @return 1 if the #cell contains at least an active particle, 0 otherwise.
 */
__attribute__((always_inline)) INLINE static int cell_is_active_gravity(
    const struct cell *c, const struct engine *e) {

#ifdef SWIFT_DEBUG_CHECKS
156
  if (c->grav.ti_end_min < e->ti_current)
157
158
    error(
        "cell in an impossible time-zone! c->ti_end_min=%lld (t=%e) and "
159
        "e->ti_current=%lld (t=%e, a=%e)",
160
161
        c->grav.ti_end_min, c->grav.ti_end_min * e->time_base, e->ti_current,
        e->ti_current * e->time_base, e->cosmology->a);
162
163
#endif

164
  return (c->grav.ti_end_min == e->ti_current);
165
166
}

167
/**
Matthieu Schaller's avatar
Matthieu Schaller committed
168
 * @brief Does a cell contain any multipole requiring calculation ?
169
170
171
172
173
174
175
176
 *
 * @param c The #cell.
 * @param e The #engine containing information about the current time.
 * @return 1 if the #cell contains at least an active particle, 0 otherwise.
 */
__attribute__((always_inline)) INLINE static int cell_is_active_gravity_mm(
    const struct cell *c, const struct engine *e) {

177
  return (c->grav.ti_end_min == e->ti_current);
178
179
}

180
181
182
183
184
185
186
187
188
189
190
/**
 * @brief Are *all* g-particles in a cell finishing their time-step now ?
 *
 * @param c The #cell.
 * @param e The #engine containing information about the current time.
 * @return 1 if all particles in a #cell are active, 0 otherwise.
 */
__attribute__((always_inline)) INLINE static int cell_is_all_active_gravity(
    const struct cell *c, const struct engine *e) {

#ifdef SWIFT_DEBUG_CHECKS
191
  if (c->grav.ti_end_max < e->ti_current)
192
193
194
    error(
        "cell in an impossible time-zone! c->ti_end_max=%lld "
        "e->ti_current=%lld",
195
        c->grav.ti_end_max, e->ti_current);
196
197
#endif

198
  return (c->grav.ti_end_max == e->ti_current);
199
200
}

201
202
203
204
205
206
207
/**
 * @brief Does a cell contain any s-particle finishing their time-step now ?
 *
 * @param c The #cell.
 * @param e The #engine containing information about the current time.
 * @return 1 if the #cell contains at least an active particle, 0 otherwise.
 */
Loic Hausammann's avatar
Loic Hausammann committed
208
__attribute__((always_inline)) INLINE static int cell_is_active_stars(
209
210
    const struct cell *c, const struct engine *e) {

Loic Hausammann's avatar
Loic Hausammann committed
211
212
213
214
215
216
217
218
#ifdef SWIFT_DEBUG_CHECKS
  if (c->stars.ti_end_min < e->ti_current)
    error(
        "cell in an impossible time-zone! c->ti_end_min=%lld (t=%e) and "
        "e->ti_current=%lld (t=%e, a=%e)",
        c->stars.ti_end_min, c->stars.ti_end_min * e->time_base, e->ti_current,
        e->ti_current * e->time_base, e->cosmology->a);
#endif
219

Loic Hausammann's avatar
Loic Hausammann committed
220
  return (c->stars.ti_end_min == e->ti_current);
221
222
}

223
/**
224
 * @brief Is this particle finishing its time-step now ?
225
226
227
 *
 * @param p The #part.
 * @param e The #engine containing information about the current time.
228
 * @return 1 if the #part is active, 0 otherwise.
229
230
231
232
 */
__attribute__((always_inline)) INLINE static int part_is_active(
    const struct part *p, const struct engine *e) {

233
234
  const timebin_t max_active_bin = e->max_active_bin;
  const timebin_t part_bin = p->time_bin;
235

236
#ifdef SWIFT_DEBUG_CHECKS
237
238
  const integertime_t ti_current = e->ti_current;
  const integertime_t ti_end = get_integer_time_end(ti_current, p->time_bin);
239
240
241
242
243
  if (ti_end < ti_current)
    error(
        "particle in an impossible time-zone! p->ti_end=%lld "
        "e->ti_current=%lld",
        ti_end, ti_current);
244
245
#endif

246
  return (part_bin <= max_active_bin);
247
248
}

249
250
251
252
253
254
255
256
__attribute__((always_inline)) INLINE static int part_is_active_no_debug(
    const struct part *p, const timebin_t max_active_bin) {

  const timebin_t part_bin = p->time_bin;

  return (part_bin <= max_active_bin);
}

257
/**
258
 * @brief Is this g-particle finishing its time-step now ?
259
260
261
 *
 * @param gp The #gpart.
 * @param e The #engine containing information about the current time.
262
 * @return 1 if the #gpart is active, 0 otherwise.
263
264
265
266
 */
__attribute__((always_inline)) INLINE static int gpart_is_active(
    const struct gpart *gp, const struct engine *e) {

267
268
269
270
  const timebin_t max_active_bin = e->max_active_bin;
  const timebin_t gpart_bin = gp->time_bin;

#ifdef SWIFT_DEBUG_CHECKS
271
272
273
274
  const integertime_t ti_current = e->ti_current;
  const integertime_t ti_end = get_integer_time_end(ti_current, gp->time_bin);

  if (ti_end < ti_current)
275
    error(
276
277
278
        "g-particle in an impossible time-zone! gp->ti_end=%lld "
        "e->ti_current=%lld",
        ti_end, ti_current);
279
280
#endif

281
  return (gpart_bin <= max_active_bin);
282
283
}

284
/**
Matthieu Schaller's avatar
Matthieu Schaller committed
285
 * @brief Is this s-particle finishing its time-step now ?
286
287
288
289
290
291
292
293
 *
 * @param sp The #spart.
 * @param e The #engine containing information about the current time.
 * @return 1 if the #spart is active, 0 otherwise.
 */
__attribute__((always_inline)) INLINE static int spart_is_active(
    const struct spart *sp, const struct engine *e) {

294
295
296
297
  const timebin_t max_active_bin = e->max_active_bin;
  const timebin_t spart_bin = sp->time_bin;

#ifdef SWIFT_DEBUG_CHECKS
298
299
300
301
302
  const integertime_t ti_current = e->ti_current;
  const integertime_t ti_end = get_integer_time_end(ti_current, sp->time_bin);

  if (ti_end < ti_current)
    error(
Matthieu Schaller's avatar
Matthieu Schaller committed
303
        "s-particle in an impossible time-zone! sp->ti_end=%lld "
304
305
306
307
        "e->ti_current=%lld",
        ti_end, ti_current);
#endif

308
  return (spart_bin <= max_active_bin);
309
310
}

311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
/**
 * @brief Has this particle been inhibited?
 *
 * @param p The #part.
 * @param e The #engine containing information about the current time.
 * @return 1 if the #part is inhibited, 0 otherwise.
 */
__attribute__((always_inline)) INLINE static int part_is_inhibited(
    const struct part *p, const struct engine *e) {
  return p->time_bin == time_bin_inhibited;
}

/**
 * @brief Has this gravity particle been inhibited?
 *
 * @param gp The #gpart.
 * @param e The #engine containing information about the current time.
 * @return 1 if the #part is inhibited, 0 otherwise.
 */
__attribute__((always_inline)) INLINE static int gpart_is_inhibited(
    const struct gpart *gp, const struct engine *e) {
  return gp->time_bin == time_bin_inhibited;
}

/**
 * @brief Has this star particle been inhibited?
 *
 * @param sp The #spart.
 * @param e The #engine containing information about the current time.
 * @return 1 if the #part is inhibited, 0 otherwise.
 */
__attribute__((always_inline)) INLINE static int spart_is_inhibited(
    const struct spart *sp, const struct engine *e) {
  return sp->time_bin == time_bin_inhibited;
}

347
348
349
350
351
352
353
354
355
/* Are cells / particles active for kick1 tasks ? */

/**
 * @brief Does a cell contain any particle starting their time-step now ?
 *
 * @param c The #cell.
 * @param e The #engine containing information about the current time.
 * @return 1 if the #cell contains at least an active particle, 0 otherwise.
 */
356
__attribute__((always_inline)) INLINE static int cell_is_starting_hydro(
357
358
359
    const struct cell *c, const struct engine *e) {

#ifdef SWIFT_DEBUG_CHECKS
360
  if (c->hydro.ti_beg_max > e->ti_current)
361
362
    error(
        "cell in an impossible time-zone! c->ti_beg_max=%lld (t=%e) and "
363
        "e->ti_current=%lld (t=%e, a=%e)",
364
        c->hydro.ti_beg_max, c->hydro.ti_beg_max * e->time_base, e->ti_current,
365
        e->ti_current * e->time_base, e->cosmology->a);
366
367
#endif

368
  return (c->hydro.ti_beg_max == e->ti_current);
369
370
371
372
373
374
375
376
377
378
379
380
381
}

/**
 * @brief Does a cell contain any g-particle starting their time-step now ?
 *
 * @param c The #cell.
 * @param e The #engine containing information about the current time.
 * @return 1 if the #cell contains at least an active particle, 0 otherwise.
 */
__attribute__((always_inline)) INLINE static int cell_is_starting_gravity(
    const struct cell *c, const struct engine *e) {

#ifdef SWIFT_DEBUG_CHECKS
382
  if (c->grav.ti_beg_max > e->ti_current)
383
384
    error(
        "cell in an impossible time-zone! c->ti_beg_max=%lld (t=%e) and "
385
        "e->ti_current=%lld (t=%e, a=%e)",
386
387
        c->grav.ti_beg_max, c->grav.ti_beg_max * e->time_base, e->ti_current,
        e->ti_current * e->time_base, e->cosmology->a);
388
389
#endif

390
  return (c->grav.ti_beg_max == e->ti_current);
391
392
}

393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
/**
 * @brief Does a cell contain any s-particle starting their time-step now ?
 *
 * @param c The #cell.
 * @param e The #engine containing information about the current time.
 * @return 1 if the #cell contains at least an active particle, 0 otherwise.
 */
__attribute__((always_inline)) INLINE static int cell_is_starting_stars(
    const struct cell *c, const struct engine *e) {

#ifdef SWIFT_DEBUG_CHECKS
  if (c->stars.ti_beg_max > e->ti_current)
    error(
        "cell in an impossible time-zone! c->ti_beg_max=%lld (t=%e) and "
        "e->ti_current=%lld (t=%e, a=%e)",
        c->stars.ti_beg_max, c->stars.ti_beg_max * e->time_base, e->ti_current,
        e->ti_current * e->time_base, e->cosmology->a);
#endif

  return (c->stars.ti_beg_max == e->ti_current);
}


416
417
418
419
420
421
422
423
424
425
/**
 * @brief Is this particle starting its time-step now ?
 *
 * @param p The #part.
 * @param e The #engine containing information about the current time.
 * @return 1 if the #part is active, 0 otherwise.
 */
__attribute__((always_inline)) INLINE static int part_is_starting(
    const struct part *p, const struct engine *e) {

426
427
428
429
  const timebin_t max_active_bin = e->max_active_bin;
  const timebin_t part_bin = p->time_bin;

#ifdef SWIFT_DEBUG_CHECKS
430
  const integertime_t ti_current = e->ti_current;
Matthieu Schaller's avatar
Matthieu Schaller committed
431
432
  const integertime_t ti_beg =
      get_integer_time_begin(ti_current + 1, p->time_bin);
433
434
435
436
437
438
439
440

  if (ti_beg > ti_current)
    error(
        "particle in an impossible time-zone! p->ti_beg=%lld "
        "e->ti_current=%lld",
        ti_beg, ti_current);
#endif

441
  return (part_bin <= max_active_bin);
442
443
444
445
446
447
448
449
450
451
452
453
}

/**
 * @brief Is this g-particle starting its time-step now ?
 *
 * @param gp The #gpart.
 * @param e The #engine containing information about the current time.
 * @return 1 if the #gpart is active, 0 otherwise.
 */
__attribute__((always_inline)) INLINE static int gpart_is_starting(
    const struct gpart *gp, const struct engine *e) {

454
455
456
457
  const timebin_t max_active_bin = e->max_active_bin;
  const timebin_t gpart_bin = gp->time_bin;

#ifdef SWIFT_DEBUG_CHECKS
458
  const integertime_t ti_current = e->ti_current;
Matthieu Schaller's avatar
Matthieu Schaller committed
459
460
  const integertime_t ti_beg =
      get_integer_time_begin(ti_current + 1, gp->time_bin);
461
462
463
464
465
466
467
468

  if (ti_beg > ti_current)
    error(
        "g-particle in an impossible time-zone! gp->ti_beg=%lld "
        "e->ti_current=%lld",
        ti_beg, ti_current);
#endif

469
  return (gpart_bin <= max_active_bin);
470
}
Matthieu Schaller's avatar
Matthieu Schaller committed
471
472
473
474
475
476
477
478
479
480
481

/**
 * @brief Is this s-particle starting its time-step now ?
 *
 * @param sp The #spart.
 * @param e The #engine containing information about the current time.
 * @return 1 if the #spart is active, 0 otherwise.
 */
__attribute__((always_inline)) INLINE static int spart_is_starting(
    const struct spart *sp, const struct engine *e) {

482
483
484
485
  const timebin_t max_active_bin = e->max_active_bin;
  const timebin_t spart_bin = sp->time_bin;

#ifdef SWIFT_DEBUG_CHECKS
Matthieu Schaller's avatar
Matthieu Schaller committed
486
487
488
489
490
491
492
493
494
495
496
  const integertime_t ti_current = e->ti_current;
  const integertime_t ti_beg =
      get_integer_time_begin(ti_current + 1, sp->time_bin);

  if (ti_beg > ti_current)
    error(
        "s-particle in an impossible time-zone! sp->ti_beg=%lld "
        "e->ti_current=%lld",
        ti_beg, ti_current);
#endif

497
  return (spart_bin <= max_active_bin);
Matthieu Schaller's avatar
Matthieu Schaller committed
498
}
Loikki's avatar
Loikki committed
499

500
#endif /* SWIFT_ACTIVE_H */