Streamer fluid modeling - An overview of ARCoS
1.0
Main Page
Related Pages
Data Types List
Files
File List
File Members
All
Classes
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Pages
include
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
{
143
RECT_COORDS
;
144
LEAF_FIELDS
(
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. */
148
int
ext_bound
;
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
Generated on Fri Jul 4 2014 15:40:19 for Streamer fluid modeling - An overview of ARCoS by
1.8.2