cell.h 8.78 KB
Newer Older
1
/*******************************************************************************
2
 * This file is part of SWIFT.
3
 * Copyright (c) 2012 Pedro Gonnet (pedro.gonnet@durham.ac.uk)
4
5
6
7
 *                    Matthieu Schaller (matthieu.schaller@durham.ac.uk)
 *               2015 Peter W. Draper (p.w.draper@durham.ac.uk)
 *               2016 John A. Regan (john.a.regan@durham.ac.uk)
 *                    Tom Theuns (tom.theuns@durham.ac.uk)
8
 *
9
10
11
12
 * 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.
13
 *
14
15
16
17
 * 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.
18
 *
19
20
 * 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/>.
21
 *
22
 ******************************************************************************/
23
24
#ifndef SWIFT_CELL_H
#define SWIFT_CELL_H
25

26
27
28
/* Config parameters. */
#include "../config.h"

29
/* Includes. */
30
31
32
#include <stddef.h>

/* Local includes. */
33
#include "align.h"
Pedro Gonnet's avatar
Pedro Gonnet committed
34
#include "lock.h"
35
#include "multipole.h"
36
#include "part.h"
37
#include "task.h"
38

39
/* Avoid cyclic inclusions */
40
struct engine;
41
struct space;
42
struct scheduler;
43

44
45
46
/* Max tag size set to 2^29 to take into account some MPI implementations
 * that use 2^31 as the upper bound on MPI tags and the fact that
 * cell_next_tag is multiplied by 2 when passed to an MPI function.
47
48
 * The maximum was lowered by a further factor of 2 to be on the safe side.*/
#define cell_max_tag (1 << 29)
49

50
#define cell_align 128
51

52
53
54
/* Global variables. */
extern int cell_next_tag;

55
56
57
58
/* Struct to temporarily buffer the particle locations and bin id. */
struct cell_buff {
  double x[3];
  int ind;
59
} SWIFT_STRUCT_ALIGN;
60

61
62
63
64
65
66
67
68
69
70
/* Mini struct to link cells to tasks. Used as a linked list. */
struct link {

  /* The task pointer. */
  struct task *t;

  /* The next pointer. */
  struct link *next;
};

71
72
73
/* Packed cell. */
struct pcell {

74
  /* Stats on this cell's particles. */
75
  double h_max;
76
  integertime_t ti_end_min, ti_end_max, ti_old;
77
78

  /* Number of particles in this cell. */
79
  int count, gcount, scount;
Pedro Gonnet's avatar
Pedro Gonnet committed
80

81
82
  /* tag used for MPI communication. */
  int tag;
83

84
85
  /* Relative indices of the cell's progeny. */
  int progeny[8];
86
87

} SWIFT_STRUCT_ALIGN;
88

89
90
91
92
93
/**
 * @brief Cell within the tree structure.
 *
 * Contains particles, links to tasks, a multipole object and counters.
 */
94
95
struct cell {

96
97
98
99
  /*! This cell's multipole. */
  struct multipole multipole;

  /*! The cell location on the grid. */
100
101
  double loc[3];

102
  /*! The cell dimensions. */
103
  double width[3];
104

105
  /*! Max smoothing length in this cell. */
106
107
  double h_max;

108
109
  /*! Linking pointer for "memory management". */
  struct cell *next;
110

111
  /*! Pointer to the #part data. */
112
113
  struct part *parts;

114
  /*! Pointer to the #xpart data. */
115
116
  struct xpart *xparts;

117
  /*! Pointer to the #gpart data. */
118
119
  struct gpart *gparts;

120
  /*! Pointer to the #spart data. */
121
  struct spart *sparts;
122

123
  /*! Pointer for the sorted indices. */
124
  struct entry *sort;
125

126
  /*! Pointers to the next level of cells. */
127
128
  struct cell *progeny[8];

129
  /*! Parent cell. */
130
131
  struct cell *parent;

132
  /*! Super cell, i.e. the highest-level parent cell that has pair/self tasks */
133
  struct cell *super;
134

135
  /*! The task computing this cell's sorts. */
136
  struct task *sorts;
137

138
139
  /*! Linked list of the tasks computing this cell's hydro density. */
  struct link *density;
140

141
142
  /* Linked list of the tasks computing this cell's hydro gradients. */
  struct link *gradient;
143

144
145
  /*! Linked list of the tasks computing this cell's hydro forces. */
  struct link *force;
146

147
148
  /*! Linked list of the tasks computing this cell's gravity forces. */
  struct link *grav;
149

150
151
  /*! The initialistation task */
  struct task *init;
152

153
154
  /*! The ghost task */
  struct task *ghost;
155

156
157
  /*! The extra ghost task for complex hydro schemes */
  struct task *extra_ghost;
158

159
160
161
  /*! The drift task */
  struct task *drift;

162
163
164
165
166
  /*! The first kick task */
  struct task *kick1;

  /*! The second kick task */
  struct task *kick2;
167

168
169
  /*! The task to compute time-steps */
  struct task *timestep;
170

171
172
  /*! Task constructing the multipole from the particles */
  struct task *grav_up;
Tom Theuns's avatar
Tom Theuns committed
173

174
175
  /*! Task propagating the multipole to the particles */
  struct task *grav_down;
176

177
178
  /*! Task for cooling */
  struct task *cooling;
179

180
181
  /*! Task for source terms */
  struct task *sourceterms;
182

183
#ifdef WITH_MPI
184

185
186
  /* Task receiving data (positions). */
  struct task *recv_xv;
187

188
189
  /* Task receiving data (density). */
  struct task *recv_rho;
190

191
192
  /* Task receiving data (gradient). */
  struct task *recv_gradient;
193

194
195
  /* Task receiving data (time-step). */
  struct task *recv_ti;
196

197
198
  /* Linked list for sending data (positions). */
  struct link *send_xv;
199

200
201
  /* Linked list for sending data (density). */
  struct link *send_rho;
202

203
204
205
206
207
  /* Linked list for sending data (gradient). */
  struct link *send_gradient;

  /* Linked list for sending data (time-step). */
  struct link *send_ti;
208

209
  /*! Bit mask of the proxies this cell is registered with. */
210
211
  unsigned long long int sendto;

212
  /*! Pointer to this cell's packed representation. */
213
  struct pcell *pcell;
214
215

  /*! Size of the packed representation */
216
  int pcell_size;
217
218

  /*! MPI tag associated with this cell */
219
220
  int tag;

221
#endif
222

223
  /*! Minimum end of (integer) time step in this cell. */
224
  integertime_t ti_end_min;
225
226

  /*! Maximum end of (integer) time step in this cell. */
227
  integertime_t ti_end_max;
228
229

  /*! Last (integer) time the cell's content was drifted forward in time. */
230
  integertime_t ti_old;
231
232
233
234
235
236
237
238
239
240
241
242
243

  /*! Minimum dimension, i.e. smallest edge of this cell (min(width)). */
  float dmin;

  /*! Maximum particle movement in this cell since last construction. */
  float dx_max;

  /*! Nr of #part in this cell. */
  int count;

  /*! Nr of #gpart in this cell. */
  int gcount;

244
245
246
  /*! Nr of #spart in this cell. */
  int scount;

247
248
249
250
251
252
253
254
255
256
257
258
  /*! The size of the sort array */
  int sortsize;

  /*! Bit-mask indicating the sorted directions */
  unsigned int sorted;

  /*! Spin lock for various uses (#part case). */
  swift_lock_type lock;

  /*! Spin lock for various uses (#gpart case). */
  swift_lock_type glock;

259
260
261
  /*! Spin lock for various uses (#spart case). */
  swift_lock_type slock;

262
263
264
265
266
267
268
269
270
  /*! ID of the previous owner, e.g. runner. */
  int owner;

  /*! Number of #part updated in this cell. */
  int updated;

  /*! Number of #gpart updated in this cell. */
  int g_updated;

271
272
273
  /*! Number of #spart updated in this cell. */
  int s_updated;

274
275
276
  /*! ID of the node this cell lives on. */
  int nodeID;

277
278
279
280
281
282
  /*! Is the #part data of this cell being used in a sub-cell? */
  int hold;

  /*! Is the #gpart data of this cell being used in a sub-cell? */
  int ghold;

283
284
285
  /*! Is the #spart data of this cell being used in a sub-cell? */
  int shold;

286
287
288
289
290
291
292
293
294
295
296
297
  /*! Number of tasks that are associated with this cell. */
  short int nr_tasks;

  /*! The depth of this cell in the tree. */
  char depth;

  /*! Is this cell split ? */
  char split;

  /*! The maximal depth of this cell and its progenies */
  char maxdepth;

298
} SWIFT_STRUCT_ALIGN;
299

300
301
302
303
/* Convert cell location to ID. */
#define cell_getid(cdim, i, j, k) \
  ((int)(k) + (cdim)[2] * ((int)(j) + (cdim)[1] * (int)(i)))

304
/* Function prototypes. */
305
306
void cell_split(struct cell *c, ptrdiff_t parts_offset, ptrdiff_t sparts_offset,
                struct cell_buff *buff, struct cell_buff *sbuff,
307
                struct cell_buff *gbuff);
308
void cell_sanitize(struct cell *c);
309
310
311
312
int cell_locktree(struct cell *c);
void cell_unlocktree(struct cell *c);
int cell_glocktree(struct cell *c);
void cell_gunlocktree(struct cell *c);
313
314
int cell_slocktree(struct cell *c);
void cell_sunlocktree(struct cell *c);
315
316
int cell_pack(struct cell *c, struct pcell *pc);
int cell_unpack(struct pcell *pc, struct cell *c, struct space *s);
317
318
int cell_pack_ti_ends(struct cell *c, int *ti_ends);
int cell_unpack_ti_ends(struct cell *c, int *ti_ends);
319
int cell_getsize(struct cell *c);
320
321
int cell_link_parts(struct cell *c, struct part *parts);
int cell_link_gparts(struct cell *c, struct gpart *gparts);
322
void cell_convert_hydro(struct cell *c, void *data);
323
void cell_clean_links(struct cell *c, void *data);
324
325
int cell_are_neighbours(const struct cell *restrict ci,
                        const struct cell *restrict cj);
326
void cell_check_multipole(struct cell *c, void *data);
327
void cell_clean(struct cell *c);
328
void cell_check_drift_point(struct cell *c, void *data);
329
int cell_is_drift_needed(struct cell *c, const struct engine *e);
330
int cell_unskip_tasks(struct cell *c, struct scheduler *s);
331
void cell_set_super(struct cell *c, struct cell *super);
332
void cell_drift(struct cell *c, const struct engine *e);
333
334

#endif /* SWIFT_CELL_H */