Streamer fluid modeling - An overview of ARCoS  1.0
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
grid.h
Go to the documentation of this file.
1 
4 #ifndef _GRID_H_
5 
6 #ifndef _TREE_H_
7 # include "tree.h"
8 #endif
9 
10 #define RECT_COORDS int r0, r1, z0, z1, ntheta
11 
13 #define BND_AT_R 0
14 #define BND_AT_Z 2
15 #define BND_MIN 0
16 #define BND_MAX 1
17 
18 #define BND_LEFT (BND_AT_R | BND_MIN)
19 #define BND_RIGHT (BND_AT_R | BND_MAX)
20 #define BND_BOTTOM (BND_AT_Z | BND_MIN)
21 #define BND_TOP (BND_AT_Z | BND_MAX)
22 
23 #define BND_MASK(B_) (1 << (B_))
24 #define BND_NONE 0
25 #define BND_MASK_LEFT BND_MASK(BND_LEFT)
26 #define BND_MASK_RIGHT BND_MASK(BND_RIGHT)
27 #define BND_MASK_BOTTOM BND_MASK(BND_BOTTOM)
28 #define BND_MASK_TOP BND_MASK(BND_TOP)
29 #define BND_MASK_ALL (BND_MASK_LEFT | BND_MASK_RIGHT\
30  | BND_MASK_BOTTOM | BND_MASK_TOP)
31 
32 #define GRID_INSIDE (1 << (BND_TOP + 1))
33 
34 /* Locations of the cell centers. */
35 #define r_at(r_, level_) (((double) (r_) + 0.5) * dr[level_])
36 #define z_at(z_, level_) (((double) (z_) + 0.5) * dz[level_])
37 #define theta_at(theta_) ((double) (theta_) * dtheta)
38 
39 /* Locations of the electric field. */
40 #define er_r_at(i_, level_) ((i_ + 1) * dr[level_])
41 #define er_z_at(j_, level_) (((double) (j_) + 0.5) * dz[level_])
42 #define ez_r_at(i_, level_) (((double) (i_) + 0.5) * dr[level_])
43 #define ez_z_at(j_, level_) ((j_ + 1) * dz[level_])
44 #define etheta_theta_at(i_) (((double) (i_) + 0.5) * dtheta)
45 
46 
52 /* Locations of the electric field. */
53 #ifdef TRUE2D
54 # define cyl_q(X_) 1
55 # define cyl_er_r_at(i_, level_) 1
56 # define cyl_r_at(r_, level_) 1
57 #else
58 # define cyl_q(X_) (X_)
59 # define cyl_er_r_at(i_, level_) er_r_at(i_, level_)
60 # define cyl_r_at(r_, level_) r_at(r_, level_)
61 #endif
62 
63 /* These are shortcuts to make the iteration over grid cells easier.
64  * Note that it is important that the inner loop has the smallest
65  * stride to minimize the cache faults.
66  */
67 #define iter_grid_z(grid_, iz_) \
68  for(iz_ = grid_->z0; iz_ < grid_->z1; iz_++)
69 
70 #define iter_grid_r(grid_, ir_) \
71  for(ir_ = grid_->r0; ir_ < grid_->r1; ir_++)
72 
73 #define iter_grid_theta(grid_, it_) \
74  for(it_ = 0; it_ < grid_->ntheta; it_++)
75 
76 #define iter_grid(grid_, ir_, iz_) \
77  iter_grid_z(grid_, iz_) \
78  iter_grid_r(grid_, ir_)
79 
80 #define iter_grid_3d(grid_, ir_, iz_, it_) \
81  iter_grid_theta(grid_, it_) \
82  iter_grid_z(grid_, iz_) \
83  iter_grid_r(grid_, ir_)
84 
85 
86 /* Functions to iterate over the grids _including_ 1 extra boundary */
87 #define iter_grid_z_1(grid_, iz_) \
88  for(iz_ = grid_->z0 - 1; iz_ < grid_->z1 + 1; iz_++)
89 
90 #define iter_grid_r_1(grid_, ir_) \
91  for(ir_ = grid_->r0 - 1; ir_ < grid_->r1 + 1; ir_++)
92 
93 #define iter_grid_1(grid_, ir_, iz_) \
94  iter_grid_z_1(grid_, iz_) \
95  iter_grid_r(grid_, ir_)
96 
97 #define iter_grid_3d_1(grid_, ir_, iz_, it_) \
98  iter_grid_theta(grid_, it_) \
99  iter_grid_z_1(grid_, iz_) \
100  iter_grid_r_1(grid_, ir_)
101 
102 
103 /* These include n extra cells in the boundary. We avoid that when
104  * ntheta == 1 because we are in the 2D case and there are no boundaries
105  * in theta*/
106 #define iter_grid_theta_n(grid_, it_, n_) \
107  for(it_ = (grid_->ntheta == 1? 0: -n_); it_ < grid_->ntheta \
108  + (grid_->ntheta == 1? 0: n_); it_++)
109 
110 #define iter_grid_z_n(grid_, iz_, n_) \
111  for(iz_ = grid_->z0 - n_; iz_ < grid_->z1 + n_; iz_++)
112 
113 #define iter_grid_r_n(grid_, ir_, n_) \
114  for(ir_ = grid_->r0 - n_; ir_ < grid_->r1 + n_; ir_++)
115 
116 #define iter_grid_n(grid_, ir_, iz_, n_) \
117  iter_grid_z_n(grid_, iz_, n_) \
118  iter_grid_r_n(grid_, ir_, n_)
119 
120 #define iter_grid_3d_n(grid_, ir_, iz_, it_, n_) \
121  iter_grid_theta_n(grid_, it_, n_) \
122  iter_grid_z_n(grid_, iz_, n_) \
123  iter_grid_r_n(grid_, ir_, n_)
124 
125 
126 /* Iter through the parent indices that fill one grid. */
127 #define iter_grid_parent(grid_, ir_, iz_) \
128  for(ir_ = (grid_->r0 >> 1) + (grid_->r0 % 2); \
129  ir_ < (grid_->r1 >> 1); ir_++) \
130  for(iz_ = (grid_->z0 >> 1) + (grid_->z0 % 2); \
131  iz_ < (grid_->z1 >> 1); iz_++)
132 
133 
141 typedef struct grid_t grid_t;
142 struct grid_t {
145  /* ext_bound indicates which boundaries are external boundaries.
146  e.g. ext_bound & BND_LEFT_TOP tells us whether the left-top boundary
147  is an external one. */
149 };
150 
154 #define grid_printf_str "{r0 = %d, z0 = %d, r1 = %d, z1 = %d, level = %d}"
155 #define grid_printf_args(G_) (G_)->r0, (G_)->z0, (G_)->r1, (G_)->z1, \
156  (G_)->level
157 
158 #define _GRID_H_
159 #endif