Basilisk CFD
Adaptive Cartesian mesh PDE framework
Loading...
Searching...
No Matches
config.h
Go to the documentation of this file.
1/** @file config.h
2 */
3#include <stdlib.h>
4#include <stdio.h>
5#include <stddef.h>
6#include <stdint.h>
7#include <stdbool.h>
8#include <stdarg.h>
9#include <string.h>
10#include <float.h>
11#include <limits.h>
12#include <math.h>
13#include <time.h>
14#include <sys/time.h>
15#include <sys/resource.h>
16#if NVTX
18#endif
19
21@define trash(x) // data trashing is disabled by default. Turn it on with
22 // -DTRASH=1
23
24auto macro2 BEGIN_FOREACH() {{...}}
25
26#if _OPENMP
27@ include <omp.h>
28@ define OMP(x) Pragma(#x)
29
31{
32 @undef OMP
33 @define OMP(x)
34 ; // necessary so that the preproc above is included
35 {...}
36 @undef OMP
37 @define OMP(x) Pragma(#x)
38 ; // necessary so that the preproc above is included
39}
40
41#elif _MPI
42
43@ define OMP(x)
44macro OMP_SERIAL() {{...}}
45
46@ include <mpi.h>
47static int mpi_rank, mpi_npe;
49@ define pid() mpi_rank
51
52#else // not MPI, not OpenMP
53
54@ define OMP(x)
56
57#endif // _MPI
58
59#if _CADNA
60# include <cadna.h>
61#endif // CADNA
62
63#if __cplusplus
64# define delete delete_qcc
65# define right right_qcc
66# define left left_qcc
67# define norm norm_qcc
68# define new new_qcc
69#endif // _cplusplus
70
71@define _NVARMAX 65536
73@define constant(v) (is_constant(v) ? _constant[(v).i - _NVARMAX] : nodata)
74
77#if _MPI
78FILE * qstderr (void);
79FILE * qstdout (void);
80FILE * ferr = NULL, * fout = NULL;
82do {
83 if (npe() > 1) {
84 fprintf (ferr, "%s() is not compatible with MPI (yet)\n", __func__);
85 exit (1);
86 }
87} while(0)
88@
89@ define system(command) (pid() == 0 ? system(command) : 0)
90#else
96#endif
97
98// redirect assert
100 fprintf (stderr, "%s:%d: Assertion `%s' failed.\n", file, line, cond);
101 abort();
102}
103#undef assert
104#ifndef LINENO
105# define LINENO __LINE__
106#endif
107#define assert(a) if (!(a)) qassert (__FILE__, LINENO, #a)
108
109// Memory tracing
115
116#if MTRACE
117# include "mtrace.h"
118#else // !MTRACE
124#endif // !MTRACE
125
126#define p = (type *)realloc(p, (size)*sizeof(type)) p = (type *) realloc (p, (size)*sizeof(type))
127#define qmalloc(size, type) ((type *) malloc ((size)*sizeof(type)))
128#define qcalloc(size, type) ((type *) calloc (size, sizeof(type)))
129
130#include "array.h"
131
132// Function tracing
133
134#if TRACE == 1 // with Extrae library
135#include <extrae_user_events.h>
136
137typedef struct {
140} Trace;
141
143 {NULL, 0, 0}, {NULL, 0, 0},
144 60000010,
145};
146
148 {NULL, 0, 0}, {NULL, 0, 0},
149 60000011,
150};
151
152static int lookup_func (Array * a, const char * func)
153{
154 for (int i = 0; i < a->len/sizeof(char *); i++) {
155 char * s = ((char **)a->p)[i];
156 if (!strcmp (func, s))
157 return i + 1;
158 }
159 char * s = strdup (func);
160 array_append (a, &s, sizeof(char *));
161 return a->len;
162}
163
164static void trace_push (Trace * t, const char * func)
165{
166 int value = lookup_func (&t->index, func);
167 Extrae_eventandcounters (t->type, value);
168 array_append (&t->stack, &value, sizeof(int));
169}
170
171static void trace_pop (Trace * t, const char * func)
172{
173 assert (t->stack.len > 0);
174 t->stack.len -= sizeof(int);
175 int value = t->stack.len > 0 ?
176 ((int *)t->stack.p)[t->stack.len/sizeof(int) - 1] : 0;
177 Extrae_eventandcounters (t->type, value);
178}
179
180static void trace_define (Trace * t, char * description)
181{
182 if (t->index.len > 0) {
183 extrae_value_t values[t->index.len/sizeof(char *) + 1];
184 char * names[t->index.len/sizeof(char *) + 1],
185 ** func = (char **) t->index.p;
186 names[0] = "OTHER";
187 values[0] = 0;
188 unsigned len = 1;
189 for (int i = 0; i < t->index.len/sizeof(char *); i++, func++) {
190 names[len] = *func;
191 values[len++] = i + 1;
192 }
194 }
195}
196
197static void trace_free (Trace * t)
198{
199 char ** func = (char **) t->index.p;
200 for (int i = 0; i < t->index.len/sizeof(char *); i++, func++)
201 free (*func);
202 free (t->index.p);
203 free (t->stack.p);
204}
205
206static void trace_off()
207{
208 trace_define (&trace_func, "Basilisk functions");
209 trace_define (&trace_mpi_func, "Basilisk functions (MPI-related)");
212}
213#if 0
214#define TRACE_TYPE(func) (strncmp (func, "mpi_", 4) ? \
215 &trace_func : &trace_func)
216#else
217#define TRACE_TYPE(func) &trace_func
218#endif
221
222#elif TRACE // built-in function tracing
223
224typedef struct {
225 char * func, * file;
226 int line, calls;
227 double total, self;
228#if _MPI
229 double min, max;
230#endif // _MPI
231} TraceIndex;
232
233struct {
235 double t0;
236} Trace = {
237 {NULL, 0, 0}, {NULL, 0, 0},
238 -1
239};
240
241static void trace_add (const char * func, const char * file, int line,
242 double total, double self)
243{
244 TraceIndex * t = (TraceIndex *) Trace.index.p;
245 int i, len = Trace.index.len/sizeof(TraceIndex);
246 for (i = 0; i < len; i++, t++)
247 if (t->line == line && !strcmp (func, t->func) && !strcmp (file, t->file))
248 break;
249 if (i == len) {
251 array_append (&Trace.index, &t, sizeof(TraceIndex));
252 }
253 else
254 t->calls++, t->total += total, t->self += self;
255}
256
257static void tracing (const char * func, const char * file, int line)
258{
259 struct timeval tv;
260 gettimeofday (&tv, NULL);
261 if (Trace.t0 < 0)
262 Trace.t0 = tv.tv_sec + tv.tv_usec/1e6;
263 double t[2] = {(tv.tv_sec - Trace.t0) + tv.tv_usec/1e6, 0.};
264 array_append (&Trace.stack, t, 2*sizeof(double));
265#if 0
266 fprintf (stderr, "trace %s:%s:%d t: %g sum: %g\n",
267 func, file, line, t[0], t[1]);
268#endif
269#if NVTX
271#endif
272}
273
274static void end_tracing (const char * func, const char * file, int line)
275{
276 struct timeval tv;
277 gettimeofday (&tv, NULL);
278 double te = (tv.tv_sec - Trace.t0) + tv.tv_usec/1e6;
279 double * t = (double *) Trace.stack.p;
280 assert (Trace.stack.len >= 2*sizeof(double));
281 t += Trace.stack.len/sizeof(double) - 2;
282 Trace.stack.len -= 2*sizeof(double);
283 double dt = te - t[0];
284#if 0
285 fprintf (stderr, "end trace %s:%s:%d ts: %g te: %g dt: %g sum: %g\n",
286 func, file, line, t[0], te, dt, t[1]);
287#endif
288 trace_add (func, file, line, dt, dt - t[1]);
289 if (Trace.stack.len >= 2*sizeof(double)) {
290 t -= 2;
291 t[1] += dt;
292 }
293#if NVTX
294 nvtxRangePop();
295#endif
296}
297
298static int compar_self (const void * p1, const void * p2)
299{
300 const TraceIndex * t1 = p1, * t2 = p2;
301 return t1->self < t2->self;
302}
303
304#if _MPI
305static int compar_func (const void * p1, const void * p2)
306{
307 const TraceIndex * t1 = p1, * t2 = p2;
308 if (t1->line != t2->line)
309 return t1->line < t2->line;
310 return strcmp (t1->file, t2->file);
311}
312#endif
313
314void trace_print (FILE * fp, double threshold)
315{
316 int i, len = Trace.index.len/sizeof(TraceIndex);
317 double total = 0.;
318 TraceIndex * t;
319 Array * index = array_new();
320 for (i = 0, t = (TraceIndex *) Trace.index.p; i < len; i++, t++)
321 array_append (index, t, sizeof(TraceIndex)), total += t->self;
322#if _MPI
323 qsort (index->p, len, sizeof(TraceIndex), compar_func);
324 double tot[len], self[len], min[len], max[len];
325 for (i = 0, t = (TraceIndex *) index->p; i < len; i++, t++)
326 tot[i] = t->total, self[i] = t->self;
329 MPI_Reduce (pid() ? self : MPI_IN_PLACE,
331 MPI_Reduce (pid() ? tot : MPI_IN_PLACE,
333 total = 0.;
334 for (i = 0, t = (TraceIndex *) index->p; i < len; i++, t++)
335 t->total = tot[i]/npe(), t->self = self[i]/npe(),
336 t->max = max[i], t->min = min[i], total += t->self;
337#endif // _MPI
338 qsort (index->p, len, sizeof(TraceIndex), compar_self);
339 fprintf (fp, " calls total self %% total function\n");
340 for (i = 0, t = (TraceIndex *) index->p; i < len; i++, t++)
341 if (t->self*100./total > threshold) {
342 fprintf (fp, "%8d %6.2f %6.2f %4.1f%%",
343 t->calls, t->total, t->self, t->self*100./total);
344#if _MPI
345 fprintf (fp, " (%4.1f%% - %4.1f%%)", t->min*100./total, t->max*100./total);
346#endif
347 fprintf (fp, " %s():%s:%d\n", t->func, t->file, t->line);
348 }
349 fflush (fp);
351 for (i = 0, t = (TraceIndex *) Trace.index.p; i < len; i++, t++)
352 t->calls = t->total = t->self = 0.;
353}
354
355static void trace_off()
356{
357 trace_print (fout, 0.);
358
359 int i, len = Trace.index.len/sizeof(TraceIndex);
360 TraceIndex * t;
361 for (i = 0, t = (TraceIndex *) Trace.index.p; i < len; i++, t++)
362 free (t->func), free (t->file);
363
364 free (Trace.index.p);
365 Trace.index.p = NULL;
366 Trace.index.len = Trace.index.max = 0;
367
368 free (Trace.stack.p);
369 Trace.stack.p = NULL;
370 Trace.stack.len = Trace.stack.max = 0;
371}
372
373#else // disable tracing
374@ define tracing(...)
375@ define end_tracing(...)
376#endif
377
378// OpenMP / MPI
379
380#if _OPENMP
381
383@define pid() 0
389
390#elif _MPI
391
392static bool in_prof = false;
393static double prof_start, _prof;
394@def prof_start(name)
395 assert (!in_prof); in_prof = true;
397@
398@def prof_stop()
400 _prof = MPI_Wtime();
402@
403
404#if FAKE_MPI
409#else // !FAKE_MPI
410trace
411int mpi_all_reduce0 (void *sendbuf, void *recvbuf, int count,
413{
415}
416
418 prof_start ("mpi_all_reduce");
419 union { int a; float b; double c;} global;
420 mpi_all_reduce0 (&(v), &global, 1, type, op, MPI_COMM_WORLD);
421 memcpy (&(v), &global, sizeof (v));
422 prof_stop();
423}
424@
425
427{
428 if (datatype == MPI_DOUBLE) return sizeof (double);
429 else if (datatype == MPI_INT) return sizeof (int);
430 else if (datatype == MPI_LONG) return sizeof (long);
431 else if (datatype == MPI_C_BOOL) return sizeof (bool);
432 else if (datatype == MPI_UNSIGNED_CHAR) return sizeof (unsigned char);
433 else {
434 fprintf (stderr, "unknown reduction type\n");
435 fflush (stderr);
436 abort();
437 }
438 return 0;
439}
440
441trace
443{
445 void * global = malloc (elem*size), * tmp = malloc (elem*size);
446 memcpy (tmp, v, elem*size);
448 memcpy (v, global, elem*size);
449 free (global), free (tmp);
450}
451
453{
455 void * s = malloc (elem*size);
456 memcpy (s, v, elem*size);
457 memset (v, 0, elem*size);
458 return s;
459}
460
462
463trace
464void mpi_sum_reduce_array (void * s, void * v, MPI_Datatype datatype, MPI_Op op, int elem)
465{
467 if (datatype == MPI_DOUBLE)
468 for (double * i = v, * j = s; elem; elem--, i++, j++)
469 *i += *j;
470 else if (datatype == MPI_INT)
471 for (int * i = v, * j = s; elem; elem--, i++, j++)
472 *i += *j;
473 else if (datatype == MPI_LONG)
474 for (long * i = v, * j = s; elem; elem--, i++, j++)
475 *i += *j;
476 else if (datatype == MPI_C_BOOL)
477 for (bool * i = v, * j = s; elem; elem--, i++, j++)
478 *i += *j;
479 else if (datatype == MPI_UNSIGNED_CHAR)
480 for (unsigned char * i = v, * j = s; elem; elem--, i++, j++)
481 *i += *j;
482 free (s);
483}
484#endif // !FAKE_MPI
485
486@define QFILE FILE // a dirty trick to avoid qcc 'static FILE *' rule
487
488FILE * qstderr (void)
489{
490 static QFILE * fp = NULL;
491 if (!fp) {
492 if (mpi_rank > 0) {
493 char name[80];
494 sprintf (name, "log-%d", mpi_rank);
495 fp = fopen (name, "w");
496 }
497 else
498 fp = systderr;
499 }
500 return fp;
501}
502
503FILE * qstdout (void)
504{
505 static QFILE * fp = NULL;
506 if (!fp) {
507 if (mpi_rank > 0) {
508 char name[80];
509 sprintf (name, "out-%d", mpi_rank);
510 fp = fopen (name, "w");
511 }
512 else
513 fp = systdout;
514 }
515 return fp;
516}
517
518static void finalize (void)
519{
520 MPI_Finalize();
521}
522
523void mpi_init()
524{
525 int initialized;
527 if (!initialized) {
528 MPI_Init (NULL, NULL);
531 }
534 srand (mpi_rank + 1);
535 if (ferr == NULL) {
536 if (mpi_rank > 0) {
537 ferr = fopen ("/dev/null", "w");
538 fout = fopen ("/dev/null", "w");
539 }
540 else {
541 ferr = systderr;
542 fout = systdout;
543 }
544 char * etrace = getenv ("MALLOC_TRACE"), name[80];
545 if (etrace && mpi_rank > 0) {
546 sprintf (name, "%s-%d", etrace, mpi_rank);
547 setenv ("MALLOC_TRACE", name, 1);
548 }
549#if MTRACE == 1
550 etrace = getenv ("MTRACE");
551 if (!etrace)
552 etrace = "mtrace";
553 if (mpi_rank > 0) {
554 sprintf (name, "%s-%d", etrace, mpi_rank);
555 pmtrace.fp = fopen (name, "w");
556 pmtrace.fname = systrdup(name);
557 }
558 else {
559 pmtrace.fp = fopen (etrace, "w");
560 pmtrace.fname = systrdup(etrace);
561 }
562#endif
563 }
564}
565
566#else // not MPI, not OpenMP
567
568@define tid() 0
569@define pid() 0
570@define npe() 1
575
576#endif // not MPI, not OpenMP
577
578macro2 OMP_PARALLEL() {{...}}
586
588
589/* undefined value */
590/* Initialises unused memory with "signaling NaNs".
591 * This is probably not very portable, tested with
592 * gcc (Debian 4.4.5-8) 4.4.5 on Linux 2.6.32-5-amd64.
593 * This blog was useful:
594 * http://codingcastles.blogspot.co.nz/2008/12/nans-in-c.html
595 */
597double undefined;
598@ if __APPLE__
599@ include <stdint.h>
600@ include "fp_osx.h"
601@ endif
602@if _GPU
604@else
606@endif
608static void set_fpe (void) {
609 int64_t lnan = 0x7ff0000000000001;
610 assert (sizeof (int64_t) == sizeof (double));
611 memcpy (&undefined, &lnan, sizeof (double));
613}
614@else // !((_GNU_SOURCE || __APPLE__) && !_OPENMP && !_CADNA && !_GPU)
618static void set_fpe (void) {}
619@endif
620
621// Pipes
622
624
625FILE * qpopen (const char * command, const char * type)
626{
627 if (pid() > 0)
628 return fopen ("/dev/null", type);
629 FILE * fp = popen (command, type);
630 if (fp) {
631 FILE ** i = qpopen_pipes;
632 int n = 0;
633 while (i && *i) { n++; i++; }
634 qrealloc (qpopen_pipes, n + 2, FILE *);
635 qpopen_pipes[n] = fp;
636 qpopen_pipes[n+1] = NULL;
637 }
638 return fp;
639}
640
642{
643 if (pid() > 0)
644 return fclose (fp);
645 FILE ** i = qpopen_pipes;
646 while (i && *i) {
647 if (*i == fp)
648 *i = (FILE *) 1;
649 i++;
650 }
651 return pclose (fp);
652}
653
654static void qpclose_all()
655{
656 FILE ** i = qpopen_pipes;
657 while (i && *i) {
658 if (*i != (FILE *) 1)
659 pclose (*i);
660 i++;
661 }
664}
665
666#define popen qpopen
667#define pclose qpclose
668
669// files with pid
670
671FILE * lfopen (const char * name, const char * mode)
672{
673 char fname[80];
674 sprintf (fname, "%s-%d", name, pid());
675 return fopen (fname, mode);
676}
677
678#include "../ast/symbols.h"
679
689
691
692/**
693These are placeholders for internally-defined macros. */
694
695typedef int Reduce;
696
698 const char * order = "xyz")
699{{...}}
701macro2 diagonalize (int a) {{...}}
702
703/**
704Macros overloaded by the interpreter. */
705
706@define /* dim: ... */
707#define show_dimension(...) show_dimension_internal (__VA_ARGS__ + 10293847566574839201.)
const vector a
Definition all-mach.h:59
Array * array_new()
Definition array.h:10
void array_free(Array *a)
Definition array.h:18
void * array_append(Array *a, void *elem, size_t size)
Definition array.h:24
int npe
Definition balance.h:195
if TRASH define &&NewPid *& val(newpid, 0, 0, 0)) -> pid > 0) @else @ define is_newpid()(((NewPid *)&val(newpid, 0, 0, 0)) ->pid > 0) @endif Array *linear_tree(size_t size, scalar newpid)
Definition balance.h:13
int min
Definition balance.h:192
struct @5 mpi
define double double char flags
define double double char Reduce reductions
define m((k)==0 &&(l)==0 &&(m)==0) macro2 foreach_point(double _x=0.
if TRASH undef trash define trash(list) reset(list
OMP_PARALLEL()
Definition cartesian.h:292
int y
Definition common.h:76
#define define
int x
Definition common.h:76
#define nodata
Definition common.h:7
double * _constant
Definition common.h:131
macro2 foreach_face(char flags=0, Reduce reductions=None, const char *order="xyz")
Definition config.h:697
define sysmalloc malloc define syscalloc calloc define sysrealloc realloc define sysfree free define systrdup strdup define line line line line type
Definition config.h:571
static void qpclose_all()
Definition config.h:654
#define p
Definition tree.h:320
int qpclose(FILE *fp)
Definition config.h:641
define k
Definition config.h:585
typedef_kind_t
Definition config.h:680
@ sym_VECTOR
Definition config.h:682
@ sym_IVEC
Definition config.h:687
@ sym_COORD
Definition config.h:684
@ sym_SCALAR
Definition config.h:681
@ sym_TENSOR
Definition config.h:683
@ sym_VEC4
Definition config.h:686
@ sym__COORD
Definition config.h:685
#define popen
Definition config.h:666
else define undefined((double) DBL_MAX) @ define enable_fpe(flags) @ define disable_fpe(flags) static void set_fpe(void)
Definition config.h:615
static endif FILE ** qpopen_pipes
Definition config.h:623
define sysmalloc malloc define syscalloc calloc define sysrealloc realloc define sysfree free define systrdup strdup define line line line line op define mpi_all_reduce_array(v, type, op, elem) @define mpi_sum_reduce_init(s
if __APPLE__ include< stdint.h > include fp_osx h endif if _GPU define enable_fpe(flags) @else @ define enable_fpe(flags) feenableexcept(flags) @endif @ define disable_fpe(flags) fedisableexcept(flags) static void set_fpe(void)
Definition config.h:603
define unmap(x, y) @define trash(x) auto macro2 BEGIN_FOREACH()
Definition config.h:20
define _index(a, m)(a.i) @define val(a
macro2 einstein_sum()
Definition config.h:700
define sysmalloc malloc define syscalloc calloc define sysrealloc realloc define sysfree free define systrdup strdup define s
Definition config.h:120
define sysmalloc malloc define syscalloc calloc define sysrealloc realloc define sysfree free define systrdup strdup define line calloc(n, s) @ define prealloc(p
#define pclose
Definition config.h:667
define sysmalloc malloc define syscalloc calloc define sysrealloc realloc define sysfree free define systrdup strdup define func
Definition config.h:120
define macro OMP_SERIAL()
Definition config.h:55
FILE * qpopen(const char *command, const char *type)
Definition config.h:625
define sysmalloc malloc define syscalloc calloc define sysrealloc realloc define sysfree free define systrdup strdup define line line line line op define op
Definition config.h:573
define m m double _val_higher_dimension
Definition config.h:587
define sysmalloc malloc define syscalloc calloc define sysrealloc realloc define sysfree free define systrdup strdup define line line line line op define elem define mpi_sum_reduce_array(s, v, type, op, elem) macro2 OMP_PARALLEL()
Definition config.h:574
define sysmalloc malloc define syscalloc calloc define sysrealloc realloc define sysfree free define systrdup strdup define file
Definition config.h:120
#define assert(a)
Definition config.h:107
define l
Definition config.h:585
define sysmalloc malloc define syscalloc calloc define sysrealloc realloc define sysfree free define systrdup strdup define pmalloc(s, func, file, line) malloc(s) @ define pcalloc(n
FILE * lfopen(const char *name, const char *mode)
Definition config.h:671
define sysmalloc malloc define syscalloc calloc define sysrealloc realloc define sysfree free define systrdup strdup define line line line free(p) @ define pstrdup(s
define sysmalloc malloc define syscalloc calloc define sysrealloc realloc define sysfree free define systrdup strdup define line line line line op define v
Definition config.h:573
define sysmalloc malloc define syscalloc calloc define sysrealloc realloc define sysfree free define systrdup strdup define line line realloc(p, s) @ define pfree(p
define sysmalloc malloc define syscalloc calloc define sysrealloc realloc define sysfree free define systrdup strdup define line line line line strdup(s) @ define tracing(...) @ define end_tracing(...) @define tid() 0 @define pid() 0 @define npe() 1 @define mpi_all_reduce(v
macro2 diagonalize(int a)
Definition config.h:701
else return n
Definition curvature.h:101
double dt
if(2.*fabs(alpha)< fabs(n.y))
We need to reconstruct the face fractions fs for the fine cells.
Definition embed-tree.h:102
else
Definition embed-tree.h:79
*cs[i, 0, 0] a *[i -1, 0, 0] j
Definition embed.h:88
scalar int i
Definition embed.h:74
static int line
Definition errors.c:754
static char * fname
Definition errors.c:753
double t
Definition events.h:24
int fedisableexcept(unsigned int excepts)
Definition fp_osx.h:216
int feenableexcept(unsigned int excepts)
Definition fp_osx.h:213
#define _GPU
Definition cartesian.h:8
macro2 BEGIN_FOREACH()
Definition gpu.h:230
end_tracing(func, file, line)
line do
Definition gpu.h:364
ifndef tracing def tracing(func, file, line) do
Definition gpu.h:360
int stack
Definition include.c:991
static int
Definition include.c:978
static int include(char *file, FILE *fin, FILE *fout)
Definition include.c:2801
macro
We also redefine the "per field" (inner) traversal.
Definition layers.h:18
#define data(k, l)
Definition linear.h:26
size_t max
Definition mtrace.h:8
static void * pcalloc(size_t nmemb, size_t size, const char *func, const char *file, int line)
Definition mtrace.h:142
size_t total
Definition mtrace.h:8
static void pfree(void *ptr, const char *func, const char *file, int line)
Definition mtrace.h:157
FILE * fp
Definition mtrace.h:7
static char * pstrdup(const char *s, const char *func, const char *file, int line)
Definition mtrace.h:163
static void * prealloc(void *ptr, size_t size, const char *func, const char *file, int line)
Definition mtrace.h:149
struct @9 pmtrace
size_t size
size *double * b
char ** names
Definition output.h:364
int parallel
Definition qcc.c:61
def false def true def false
Definition stencils.h:411
Definition array.h:5
void * p
Definition array.h:6
macro VARIABLES(Point point=point, int _ig=ig, int _jg=jg, int _kg=kg)
Definition variables.h:3
Array * index
scalar c
Definition vof.h:57
src vof fflush(ferr)