PLUTO  4.4-patch2
macros.h
Go to the documentation of this file.
1 /* ///////////////////////////////////////////////////////////////////// */
9 /* ///////////////////////////////////////////////////////////////////// */
10 #ifndef DEBUG
11  #define DEBUG FALSE
12 #endif
13 
14 #if DEBUG == TRUE
15  #define DEBUG_FUNC_BEG(a) \
16  char d_funcName[64]; \
17  sprintf (d_funcName,"%s",a); \
18  d_indent += 2; \
19  if (d_condition) { printLog("%*c", d_indent, ' '); \
20  printLog (">>[%s]\n",a ); }
21 
22  #define DEBUG_FUNC_END(a) \
23  if (d_condition) {print("%*c", d_indent, ' '); \
24  printLog("<<[%s]\n",a ); } \
25  d_indent -= 2;
26 
27  #define DEBUG_FUNC_NAME d_funcName
28 
29 #else
30  #define DEBUG_FUNC_BEG(a)
31  #define DEBUG_FUNC_END(a)
32  #define DEBUG_FUNC_NAME "Not Set"
33 #endif
34 
35 #define POW2(x) ((x)*(x))
36 #define POW3(x) ((x)*(x)*(x))
37 #define POW4(x) ((x)*(x)*(x)*(x))
38 #define SECH(x) ((x) > 30.0 ? 0.0:1.0/cosh(x))
39 
40 /* #####################################################################
41  1. Macros that can be placed at any point in the code
42  ##################################################################### */
43 
55 #define IBEG_LOOP(i) for ((i) = IBEG; (i)--; )
56 #define JBEG_LOOP(j) for ((j) = JBEG; (j)--; )
57 #define KBEG_LOOP(k) for ((k) = KBEG; (k)--; )
58 
59 #define IEND_LOOP(i) for ((i) = IEND + 1; (i) < NX1_TOT; (i)++)
60 #define JEND_LOOP(j) for ((j) = JEND + 1; (j) < NX2_TOT; (j)++)
61 #define KEND_LOOP(k) for ((k) = KEND + 1; (k) < NX3_TOT; (k)++)
62 
63 #define IDOM_LOOP(i) for ((i) = IBEG; (i) <= IEND; (i)++)
64 #define JDOM_LOOP(j) for ((j) = JBEG; (j) <= JEND; (j)++)
65 #define KDOM_LOOP(k) for ((k) = KBEG; (k) <= KEND; (k)++)
66 
67 #define ITOT_LOOP(i) for ((i) = 0; (i) < NX1_TOT; (i)++)
68 #define JTOT_LOOP(j) for ((j) = 0; (j) < NX2_TOT; (j)++)
69 #define KTOT_LOOP(k) for ((k) = 0; (k) < NX3_TOT; (k)++)
70 
71 #define DOM_LOOP(k,j,i) KDOM_LOOP(k) JDOM_LOOP(j) IDOM_LOOP(i)
72 
73 #define TOT_LOOP(k,j,i) KTOT_LOOP(k) JTOT_LOOP(j) ITOT_LOOP(i)
74 
75 #define X1_BEG_LOOP(k,j,i) KTOT_LOOP(k) JTOT_LOOP(j) IBEG_LOOP(i)
76 #define X2_BEG_LOOP(k,j,i) KTOT_LOOP(k) JBEG_LOOP(j) ITOT_LOOP(i)
77 #define X3_BEG_LOOP(k,j,i) KBEG_LOOP(k) JTOT_LOOP(j) ITOT_LOOP(i)
78 
79 #define X1_END_LOOP(k,j,i) KTOT_LOOP(k) JTOT_LOOP(j) IEND_LOOP(i)
80 #define X2_END_LOOP(k,j,i) KTOT_LOOP(k) JEND_LOOP(j) ITOT_LOOP(i)
81 #define X3_END_LOOP(k,j,i) KEND_LOOP(k) JTOT_LOOP(j) ITOT_LOOP(i)
82 
93 #define BOX_LOOP(B,k,j,i) \
94  for ((B)->dk = ((k=(B)->kbeg) <= (B)->kend ? 1:-1); k != (B)->kend+(B)->dk; k += (B)->dk)\
95  for ((B)->dj = ((j=(B)->jbeg) <= (B)->jend ? 1:-1); j != (B)->jend+(B)->dj; j += (B)->dj)\
96  for ((B)->di = ((i=(B)->ibeg) <= (B)->iend ? 1:-1); i != (B)->iend+(B)->di; i += (B)->di)
97 
98 
99 #define IBOX_LOOP(B,i) \
100  for ((B)->di = ((i=(B)->ibeg) <= (B)->iend ? 1:-1); i != (B)->iend+(B)->di; i += (B)->di)
101 
102 #define JBOX_LOOP(B,j) \
103  for ((B)->dj = ((j=(B)->jbeg) <= (B)->jend ? 1:-1); j != (B)->jend+(B)->dj; j += (B)->dj)
104 
105 #define KBOX_LOOP(B,k) \
106  for ((B)->dk = ((k=(B)->kbeg) <= (B)->kend ? 1:-1); k != (B)->kend+(B)->dk; k += (B)->dk)
107 
108 #define BOX_TRANSVERSE_LOOP(box,k,j,i) \
109  if (g_dir == IDIR) {(box)->n = &i; (box)->t = &j; (box)->b = &k;} \
110  else if (g_dir == JDIR) {(box)->n = &j; (box)->t = &i; (box)->b = &k;} \
111  else if (g_dir == KDIR) {(box)->n = &k; (box)->t = &i; (box)->b = &j;} \
112  for (*((box)->b) = *(box)->bbeg; *((box)->b) <= *(box)->bend; *((box)->b) +=1) \
113  for (*((box)->t) = *(box)->tbeg; *((box)->t) <= *(box)->tend; *((box)->t) +=1)
114 
115 
129 #define FOR_EACH(nv, list) \
130  for ((list)->i = 0, nv = (list)->indx[0]; \
131  (list)->i < (list)->nvar; \
132  nv = (list)->indx[++((list)->i)])
133 
134 
138 #define INT_FLOOR(z) ((int)((z) + 32768.) - 32768)
139 
141 #define MAX(a,b) ( (a) >= (b) ? (a) : (b) )
142 
144 #define MIN(a,b) ( (a) <= (b) ? (a) : (b) )
145 
147 #define ABS_MIN(a,b) (fabs(a) < fabs(b) ? (a):(b))
148 
150 #define DSIGN(x) ( (x) >= 0.0 ? (1.0) : (-1.0))
151 #define DSIGN2(x) ( (x == 0) ? 0.5:((x) > 0.0 ? (1.0) : (-1.0)))
152 
154 #define MINMOD_LIMITER(a,b) ((a)*(b) > 0.0 ? (fabs(a) < fabs(b) ? (a):(b)):0.0)
155 #define VANLEER_LIMITER(a,b) ((a)*(b) > 0.0 ? 2.0*(a)*(b)/((a)+(b)):0.0)
156 #define MC_LIMITER(a,b) (MINMOD_LIMITER(0.5*((a)+(b)), 2.0*MINMOD_LIMITER((a),(b))))
157 #define SWAP_VAR(x) SwapEndian(&x, sizeof(x));
158 
160 /* See
161 http://stackoverflow.com/questions/11303135/broadcast-message-for-all-processes-to-exitmpi
162 */
163 #ifdef CHOMBO
164  #ifdef PARALLEL
165  #define QUIT_PLUTO(e_code) \
166  {error("Abort"); MPI_Abort(MPI_COMM_WORLD, e_code); exit(e_code);}
167  #else
168  #define QUIT_PLUTO(e_code) \
169  {error("Abort"); exit(e_code);}
170  #endif
171 #else
172 
173  #ifdef PARALLEL
174  #define QUIT_PLUTO(e_code) \
175  {printLog ("! Abort\n"); \
176  LogFileFlush(); \
177  MPI_Abort(MPI_COMM_WORLD, e_code); \
178  MPI_Finalize(); \
179  exit(e_code);}
180  #else
181  #define QUIT_PLUTO(e_code) exit(e_code);
182  #endif
183 #endif
184 
185 /* #####################################################################
186  2. Macros that must be placed only *AFTER* definitions.h has been
187  included
188  ##################################################################### */
189 
190 /* *******************************************************
191  Expand dimension- or component-dependent expressions
192  ******************************************************* */
193 
227 #if DIMENSIONS == 1
228  #define INCLUDE_IDIR TRUE
229  #define INCLUDE_JDIR FALSE
230  #define INCLUDE_KDIR FALSE
231 
232  #define DIM_EXPAND(a,b,c) a
233  #define DIM_SELECT(a,b,c) a
234 #endif
235 
236 #if DIMENSIONS == 2
237  #define INCLUDE_IDIR TRUE
238  #ifndef INCLUDE_JDIR
239  #define INCLUDE_JDIR TRUE
240  #endif
241  #ifndef INCLUDE_KDIR
242  #define INCLUDE_KDIR FALSE
243  #endif
244 
245  #if INCLUDE_JDIR
246  #define DIM_EXPAND(a,b,c) a b
247  #define DIM_SELECT(a,b,c) b
248  #endif
249 
250  #if !INCLUDE_JDIR && INCLUDE_KDIR
251  #define DIM_EXPAND(a,b,c) a c
252  #define DIM_SELECT(a,b,c) c
253  #endif
254 
255 #endif
256 
257 #if DIMENSIONS == 3
258  #define INCLUDE_IDIR TRUE
259  #ifndef INCLUDE_JDIR
260  #define INCLUDE_JDIR TRUE
261  #endif
262  #ifndef INCLUDE_KDIR
263  #define INCLUDE_KDIR TRUE
264  #endif
265 
266  #if INCLUDE_JDIR == TRUE
267  #define DIM_EXPAND(a,b,c) a b c
268  #define DIM_SELECT(a,b,c) c
269  #else
270  #define DIM_EXPAND(a,b,c) a c
271  #define DIM_SELECT(a,b,c) c
272  #endif
273 
274 #endif
275 
276 /*
277  last inc
278 1 1 1 3 1
279 1 1 0 2 1
280 1 0 1 3 2
281 1 0 0 1 1
282 */
283 #if DIMENSIONS == 3 || DIMENSIONS == 1
284 #define DIM_LOOP(d) for ((d) = 0; (d) < DIMENSIONS; \
285  (d) += 2*INCLUDE_IDIR - INCLUDE_JDIR)
286 #else
287 #define DIM_LOOP(d) for ((d) = 0; \
288  (d) < MAX(3*INCLUDE_KDIR, MAX(INCLUDE_IDIR,2*INCLUDE_JDIR)); \
289  (d) += 2*INCLUDE_IDIR - INCLUDE_JDIR)
290 #endif
291 
292 
293 #define DOT_PRODUCT(a,b) ((a)[0]*(b)[0] + (a)[1]*(b)[1] + (a)[2]*(b)[2])
294 
295 #if WARNING_MESSAGES == YES
296  #define WARNING(a) a
297 #else
298  #define WARNING(a)
299 #endif
300 
313 #if INCLUDE_IDIR
314  #define FDIFF_X1(Q,k,j,i) (Q[k][j][i+1] - Q[k][j][i])
315  #define CDIFF_X1(Q,k,j,i) (0.5*(Q[k][j][i+1] - Q[k][j][i-1]))
316 #else
317  #define FDIFF_X1(Q,k,j,i) (0.0)
318  #define CDIFF_X1(Q,k,j,i) (0.0)
319 #endif
320 
321 #if INCLUDE_JDIR
322  #define FDIFF_X2(Q,k,j,i) (Q[k][j+1][i] - Q[k][j][i])
323  #define CDIFF_X2(Q,k,j,i) (0.5*(Q[k][j+1][i] - Q[k][j-1][i]))
324 #else
325  #define FDIFF_X2(Q,k,j,i) (0.0)
326  #define CDIFF_X2(Q,k,j,i) (0.0)
327 #endif
328 
329 #if INCLUDE_KDIR
330  #define FDIFF_X3(Q,k,j,i) (Q[k+1][j][i] - Q[k][j][i])
331  #define CDIFF_X3(Q,k,j,i) (0.5*(Q[k+1][j][i] - Q[k-1][j][i]))
332 #else
333  #define FDIFF_X3(Q,k,j,i) (0.0)
334  #define CDIFF_X3(Q,k,j,i) (0.0)
335 #endif
336 
349 #if INCLUDE_IDIR
350  #define AVERAGE_X(q,k,j,i) (0.5*(q[k][j][i] + q[k][j][i+1]))
351 #else
352  #define AVERAGE_X(q,k,j,i) (q[k][j][i])
353 #endif
354 
355 #if INCLUDE_JDIR
356  #define AVERAGE_Y(q,k,j,i) (0.5*(q[k][j][i] + q[k][j+1][i]))
357  #define AVERAGE_XY(q,k,j,i) (0.5*(AVERAGE_X(q,k,j,i) + AVERAGE_X(q,k,j+1,i)));
358 #else
359  #define AVERAGE_Y(q,k,j,i) (q[k][0][i])
360  #define AVERAGE_XY(q,k,j,i) AVERAGE_X(q,k,0,i)
361 #endif
362 
363 #if INCLUDE_KDIR
364  #define AVERAGE_Z(q,k,j,i) (0.5*(q[k][j][i] + q[k+1][j][i]))
365  #define AVERAGE_XZ(q,k,j,i) (0.5*(AVERAGE_X(q,k,j,i) + AVERAGE_X(q,k+1,j,i)))
366  #define AVERAGE_YZ(q,k,j,i) (0.5*(AVERAGE_Y(q,k,j,i) + AVERAGE_Y(q,k+1,j,i)))
367  #define AVERAGE_XYZ(q,k,j,i) (0.5*(AVERAGE_XY(q,k,j,i) + AVERAGE_XY(q,k+1,j,i)))
368 #else
369  #define AVERAGE_Z(q,k,j,i) (q[0][j][i])
370  #define AVERAGE_XZ(q,k,j,i) AVERAGE_X(q,0,j,i)
371  #define AVERAGE_YZ(q,k,j,i) AVERAGE_Y(q,0,j,i)
372  #define AVERAGE_XYZ(q,k,j,i) AVERAGE_XY(q,0,j,i)
373 #endif