Streamer fluid modeling - An overview of ARCoS  1.0
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
grid.c
Go to the documentation of this file.
1 
4 #include <stdlib.h>
5 #include <stdio.h>
6 #include <math.h>
7 
8 #include "grid.h"
9 #include "parameters.h"
10 #include "proto.h"
11 #include "species.h"
12 
14 int
16 {
17  int l, lc;
18  grid_t *child;
19 
20  l = grid->level;
21  iter_childs (grid, child) {
22  lc = grid_max_depth_r (child);
23  l = (l > lc)? l: lc;
24  }
25  return l;
26 }
27 
29 double
31 {
32  int lev;
33  double minr, cminr;
34  grid_t *child;
35 
36  lev = grid->level;
37  minr = r_at (grid->r0, lev);
38 
39  iter_childs (grid, child) {
40  cminr = grid_rmin_r (child);
41  minr = (minr > cminr)? cminr: minr;
42  }
43  return minr;
44 }
45 
47 void
48 grid_print_r (grid_t *grid, int indent)
49 {
50  int i;
51  grid_t *child;
52 
53  for (i = 0; i < indent; i++) fputs (" ", stdout);
54  printf ("grid (" grid_printf_str") {\n", grid_printf_args(grid));
55 
56  iter_childs (grid, child) {
57  grid_print_r (child, indent + 1);
58  }
59  for (i = 0; i < indent; i++) fputs (" ", stdout);
60  fputs ("}\n", stdout);
61 }
62 
72 int
73 grid_contains (grid_t *grid, int i, int j, int check)
74 {
75  int r0, r1, z0, z1;
76  int r;
77 
78  r0 = grid->r0;
79  z0 = grid->z0;
80  r1 = grid->r1 - 1;
81  z1 = grid->z1 - 1;
82 
83  r = FALSE;
84 
85  if (check & BND_MASK_LEFT) {
86  r0 -= 1;
87  }
88 
89  if (check & BND_MASK_RIGHT) {
90  r1 += 1;
91  }
92 
93  if (check & BND_MASK_BOTTOM) {
94  z0 -= 1;
95  }
96 
97  if (check & BND_MASK_TOP) {
98  z1 += 1;
99  }
100 
101  if (r0 < i && i < r1 && z0 < j && j < z1)
102  r = TRUE;
103 
104  if (check & GRID_INSIDE) {
105  return r;
106  } else {
107  return (r && !grid_contains (grid, i, j, GRID_INSIDE));
108  }
109 }
110 
123 int
124 grid_overlap (grid_t *grid1, grid_t *grid2, int buff1, int buff2,
125  int *left, int *bottom, int *right, int *top, int *level_diff)
126 {
127  return grid_overlap_with_shifts (grid1, grid2, buff1, buff2,
128  left, bottom, right, top, level_diff,
129  0, 0);
130 }
131 
144 int
145 grid_overlap_with_shifts (grid_t *grid1, grid_t *grid2, int buff1, int buff2,
146  int *left, int *bottom, int *right, int *top,
147  int *level_diff, int shift_r, int shift_z)
148 {
149  int sign;
150 
151  debug (3, "grid_overlap(" grid_printf_str", " grid_printf_str
152  ", buff1 = %d, buff2 = %d)\n",
153  grid_printf_args(grid1), grid_printf_args(grid2),
154  buff1, buff2);
155 
156  sign = 1;
157 
158  /* If level_diff < 0, grid2 is finer */
159  *level_diff = grid1->level - grid2->level;
160 
161  if (*level_diff < 0) {
162  sign = -1;
163  *level_diff = - *level_diff;
164  XCHG (grid1, grid2);
165  XCHG (buff1, buff2);
166  }
167 
168  /* At this point, level_diff >= 0 and grid1 is finer
169  or equivalent to grid2 */
170 
171  *left = MAX_AT_LEVEL_WITH_SHIFT (grid1->r0 - buff1, grid2->r0 - buff2,
172  *level_diff, shift_r);
173  *right = MIN_AT_LEVEL_WITH_SHIFT (grid1->r1 + buff1, grid2->r1 + buff2,
174  *level_diff, shift_r);
175 
176  /* Note: *right is not contained in the grid. Hence, if *left == *right
177  the two grids do not overlap. Same for *bottom and *top, below. */
178  debug (3, "*left = %d, *right = %d\n", *left, *right);
179  if (*left >= *right) {
180  *level_diff *= sign;
181  return FALSE;
182  }
183 
184  *bottom = MAX_AT_LEVEL_WITH_SHIFT (grid1->z0 - buff1, grid2->z0 - buff2,
185  *level_diff, shift_z);
186  *top = MIN_AT_LEVEL_WITH_SHIFT (grid1->z1 + buff1, grid2->z1 + buff2,
187  *level_diff, shift_z);
188 
189  debug (3, "*bottom = %d, *top = %d\n", *bottom, *top);
190  if (*bottom >= *top) {
191  *level_diff *= sign;
192  return FALSE;
193  }
194  debug (3, "pois_overlap = TRUE\n");
195 
196  *level_diff *= sign;
197  return TRUE;
198 }
199 
204 void
206 {
207  grid_t *parent = grid->parent;
208 
209  debug (3, "grid_inherit_ext_bound (...)\n");
210 
211  grid->ext_bound = BND_NONE;
212 
213  /* If the parent does not have any external boundary, the child will also
214  not have */
215  if (BND_NONE == parent->ext_bound) {
216  return;
217  }
218 
219  if (parent->ext_bound & BND_MASK_LEFT) {
220  if ((parent->r0 << 1) == grid->r0) grid->ext_bound |= BND_MASK_LEFT;
221  }
222 
223  if (parent->ext_bound & BND_MASK_RIGHT) {
224  if ((parent->r1 << 1) == grid->r1) grid->ext_bound |= BND_MASK_RIGHT;
225  }
226 
227  if (parent->ext_bound & BND_MASK_BOTTOM) {
228  if ((parent->z0 << 1) == grid->z0) grid->ext_bound |= BND_MASK_BOTTOM;
229  }
230 
231  if (parent->ext_bound & BND_MASK_TOP) {
232  if ((parent->z1 << 1) == grid->z1) grid->ext_bound |= BND_MASK_TOP;
233  }
234 
235 }
236 
237 
244 grid_t *
245 grid_finest_containing_r (grid_t *grid, double r, double z)
246 {
247  grid_t *leaf, *ret;
248 
249  if (r < er_r_at(grid->r0 - 1, grid->level) ||
250  r > er_r_at(grid->r1 - 1, grid->level))
251  return NULL;
252 
253  if (z < ez_z_at(grid->z0 - 1, grid->level) ||
254  z > ez_z_at(grid->z1 - 1, grid->level))
255  return NULL;
256 
257  iter_childs (grid, leaf) {
258  ret = grid_finest_containing_r (leaf, r, z);
259  if (NULL != ret)
260  return ret;
261  }
262  return grid;
263 }
264 
266 int
268 {
269  grid_t *leaf;
270  int count;
271 
272  count = 0;
273  iter_childs (grid, leaf) {
274  count ++;
275  }
276  return count;
277 }
278 
283 grid_t*
284 grid_get_child (grid_t *grid, int n)
285 {
286  grid_t *leaf;
287  int count;
288 
289  count = 0;
290  iter_childs (grid, leaf) {
291  if (count == n) return leaf;
292  count ++;
293  }
294  return NULL;
295 }