active.h 14.7 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
88
89
90
/**
 * @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) {

  return cell_are_gpart_drifted(c, e);
}

91
92
/* Are cells / particles active for regular tasks ? */

93
/**
94
 * @brief Does a cell contain any particle finishing their time-step now ?
95
96
97
 *
 * @param c The #cell.
 * @param e The #engine containing information about the current time.
Matthieu Schaller's avatar
Matthieu Schaller committed
98
 * @return 1 if the #cell contains at least an active particle, 0 otherwise.
99
 */
100
__attribute__((always_inline)) INLINE static int cell_is_active_hydro(
101
102
    const struct cell *c, const struct engine *e) {

103
#ifdef SWIFT_DEBUG_CHECKS
104
  if (c->hydro.ti_end_min < e->ti_current)
105
    error(
106
        "cell in an impossible time-zone! c->ti_end_min=%lld (t=%e) and "
107
        "e->ti_current=%lld (t=%e, a=%e)",
108
        c->hydro.ti_end_min, c->hydro.ti_end_min * e->time_base, e->ti_current,
109
        e->ti_current * e->time_base, e->cosmology->a);
110
111
#endif

112
  return (c->hydro.ti_end_min == e->ti_current);
113
114
115
}

/**
116
 * @brief Are *all* particles in a cell finishing their time-step now ?
117
118
119
 *
 * @param c The #cell.
 * @param e The #engine containing information about the current time.
Matthieu Schaller's avatar
Matthieu Schaller committed
120
 * @return 1 if all particles in a #cell are active, 0 otherwise.
121
 */
122
__attribute__((always_inline)) INLINE static int cell_is_all_active_hydro(
123
124
    const struct cell *c, const struct engine *e) {

125
#ifdef SWIFT_DEBUG_CHECKS
126
  if (c->hydro.ti_end_max < e->ti_current)
127
128
129
    error(
        "cell in an impossible time-zone! c->ti_end_max=%lld "
        "e->ti_current=%lld",
130
        c->hydro.ti_end_max, e->ti_current);
131
132
#endif

133
  return (c->hydro.ti_end_max == e->ti_current);
134
135
136
137
138
139
140
141
142
143
144
145
146
}

/**
 * @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
147
  if (c->grav.ti_end_min < e->ti_current)
148
149
    error(
        "cell in an impossible time-zone! c->ti_end_min=%lld (t=%e) and "
150
        "e->ti_current=%lld (t=%e, a=%e)",
151
152
        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);
153
154
#endif

155
  return (c->grav.ti_end_min == e->ti_current);
156
157
}

158
/**
Matthieu Schaller's avatar
Matthieu Schaller committed
159
 * @brief Does a cell contain any multipole requiring calculation ?
160
161
162
163
164
165
166
167
 *
 * @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) {

168
  return (c->grav.ti_end_min == e->ti_current);
169
170
}

171
172
173
174
175
176
177
178
179
180
181
/**
 * @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
182
  if (c->grav.ti_end_max < e->ti_current)
183
184
185
    error(
        "cell in an impossible time-zone! c->ti_end_max=%lld "
        "e->ti_current=%lld",
186
        c->grav.ti_end_max, e->ti_current);
187
188
#endif

189
  return (c->grav.ti_end_max == e->ti_current);
190
191
}

192
193
194
195
196
197
198
/**
 * @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
199
__attribute__((always_inline)) INLINE static int cell_is_active_stars(
200
201
    const struct cell *c, const struct engine *e) {

Loic Hausammann's avatar
Loic Hausammann committed
202
203
204
205
206
207
208
209
#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
210

Loic Hausammann's avatar
Loic Hausammann committed
211
  return (c->stars.ti_end_min == e->ti_current);
212
213
}

214
/**
215
 * @brief Is this particle finishing its time-step now ?
216
217
218
 *
 * @param p The #part.
 * @param e The #engine containing information about the current time.
219
 * @return 1 if the #part is active, 0 otherwise.
220
221
222
223
 */
__attribute__((always_inline)) INLINE static int part_is_active(
    const struct part *p, const struct engine *e) {

224
225
  const timebin_t max_active_bin = e->max_active_bin;
  const timebin_t part_bin = p->time_bin;
226

227
#ifdef SWIFT_DEBUG_CHECKS
228
229
  const integertime_t ti_current = e->ti_current;
  const integertime_t ti_end = get_integer_time_end(ti_current, p->time_bin);
230
231
232
233
234
  if (ti_end < ti_current)
    error(
        "particle in an impossible time-zone! p->ti_end=%lld "
        "e->ti_current=%lld",
        ti_end, ti_current);
235
236
#endif

237
  return (part_bin <= max_active_bin);
238
239
}

240
241
242
243
244
245
246
247
__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);
}

248
/**
249
 * @brief Is this g-particle finishing its time-step now ?
250
251
252
 *
 * @param gp The #gpart.
 * @param e The #engine containing information about the current time.
253
 * @return 1 if the #gpart is active, 0 otherwise.
254
255
256
257
 */
__attribute__((always_inline)) INLINE static int gpart_is_active(
    const struct gpart *gp, const struct engine *e) {

258
259
260
261
  const timebin_t max_active_bin = e->max_active_bin;
  const timebin_t gpart_bin = gp->time_bin;

#ifdef SWIFT_DEBUG_CHECKS
262
263
264
265
  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)
266
    error(
267
268
269
        "g-particle in an impossible time-zone! gp->ti_end=%lld "
        "e->ti_current=%lld",
        ti_end, ti_current);
270
271
#endif

272
  return (gpart_bin <= max_active_bin);
273
274
}

275
/**
Matthieu Schaller's avatar
Matthieu Schaller committed
276
 * @brief Is this s-particle finishing its time-step now ?
277
278
279
280
281
282
283
284
 *
 * @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) {

285
286
287
288
  const timebin_t max_active_bin = e->max_active_bin;
  const timebin_t spart_bin = sp->time_bin;

#ifdef SWIFT_DEBUG_CHECKS
289
290
291
292
293
  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
294
        "s-particle in an impossible time-zone! sp->ti_end=%lld "
295
296
297
298
        "e->ti_current=%lld",
        ti_end, ti_current);
#endif

299
  return (spart_bin <= max_active_bin);
300
301
}

302
303
304
305
306
307
308
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
/**
 * @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;
}

338
339
340
341
342
343
344
345
346
/* 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.
 */
347
__attribute__((always_inline)) INLINE static int cell_is_starting_hydro(
348
349
350
    const struct cell *c, const struct engine *e) {

#ifdef SWIFT_DEBUG_CHECKS
351
  if (c->hydro.ti_beg_max > e->ti_current)
352
353
    error(
        "cell in an impossible time-zone! c->ti_beg_max=%lld (t=%e) and "
354
        "e->ti_current=%lld (t=%e, a=%e)",
355
        c->hydro.ti_beg_max, c->hydro.ti_beg_max * e->time_base, e->ti_current,
356
        e->ti_current * e->time_base, e->cosmology->a);
357
358
#endif

359
  return (c->hydro.ti_beg_max == e->ti_current);
360
361
362
363
364
365
366
367
368
369
370
371
372
}

/**
 * @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
373
  if (c->grav.ti_beg_max > e->ti_current)
374
375
    error(
        "cell in an impossible time-zone! c->ti_beg_max=%lld (t=%e) and "
376
        "e->ti_current=%lld (t=%e, a=%e)",
377
378
        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);
379
380
#endif

381
  return (c->grav.ti_beg_max == e->ti_current);
382
383
384
385
386
387
388
389
390
391
392
393
}

/**
 * @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) {

394
395
396
397
  const timebin_t max_active_bin = e->max_active_bin;
  const timebin_t part_bin = p->time_bin;

#ifdef SWIFT_DEBUG_CHECKS
398
  const integertime_t ti_current = e->ti_current;
Matthieu Schaller's avatar
Matthieu Schaller committed
399
400
  const integertime_t ti_beg =
      get_integer_time_begin(ti_current + 1, p->time_bin);
401
402
403
404
405
406
407
408

  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

409
  return (part_bin <= max_active_bin);
410
411
412
413
414
415
416
417
418
419
420
421
}

/**
 * @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) {

422
423
424
425
  const timebin_t max_active_bin = e->max_active_bin;
  const timebin_t gpart_bin = gp->time_bin;

#ifdef SWIFT_DEBUG_CHECKS
426
  const integertime_t ti_current = e->ti_current;
Matthieu Schaller's avatar
Matthieu Schaller committed
427
428
  const integertime_t ti_beg =
      get_integer_time_begin(ti_current + 1, gp->time_bin);
429
430
431
432
433
434
435
436

  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

437
  return (gpart_bin <= max_active_bin);
438
}
Matthieu Schaller's avatar
Matthieu Schaller committed
439
440
441
442
443
444
445
446
447
448
449

/**
 * @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) {

450
451
452
453
  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
454
455
456
457
458
459
460
461
462
463
464
  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

465
  return (spart_bin <= max_active_bin);
Matthieu Schaller's avatar
Matthieu Schaller committed
466
}
Loikki's avatar
Loikki committed
467

468
#endif /* SWIFT_ACTIVE_H */