Basilisk CFD
Adaptive Cartesian mesh PDE framework
Loading...
Searching...
No Matches
common.h
Go to the documentation of this file.
1/** @file common.h
2 */
3typedef double number; // used in macros to indicate "any numeric type"
4#define pi 3.14159265358979
5#undef HUGE
6#define HUGE 1e30f
7#define nodata HUGE
8
9static inline number max (number a, number b) { return a > b ? a : b; }
10static inline number min (number a, number b) { return a < b ? a : b; }
11static inline number sq (number x) { return x*x; }
12static inline number cube (number x) { return x*x*x; }
13static inline int sign (number x) { return (int)(x > 0 ? 1 : -1); }
14static inline int sign2 (number x) { return (int)(x > 0 ? 1 : x < 0 ? -1 : 0); }
15static inline number clamp (number x, number a, number b) {
16 return x < a ? a : x > b ? b : x;
17}
18
19#define swap(type,a,b) do { type _tmp_ = a; a = b; b = _tmp_; } while(false)
20
21#include "grid/config.h"
22
23static inline double noise() { return 1. - 2.*rand()/(double)RAND_MAX; }
24
25// the grid
26typedef struct {
27 long n; // number of (leaf) cells for this process
28 long tn; // number of (leaf) cells for all processes
29 int depth; // the depth for this process
30 int maxdepth; // the maximum depth for all processes
31} Grid;
33// coordinates of the lower-left corner of the box
34double X0 = 0., Y0 = 0., Z0 = 0.;
35// size of the box
36double L0 = 1. [1];
37// number of grid points
38#if dimension <= 2
39int N = 64;
40#else
41int N = 16;
42#endif
43
44typedef struct { int i; } scalar;
45
46typedef struct {
48#if dimension > 1
50#endif
51#if dimension > 2
52 scalar z;
53#endif
54} vector;
55
56typedef struct {
58#if dimension > 1
60#endif
61#if dimension > 2
62 scalar * z;
63#endif
64} vectorl;
65
66typedef struct {
68#if dimension > 1
70#endif
71#if dimension > 2
72 vector z;
73#endif
74} tensor;
75
76struct { int x, y, z; } Period = {false, false, false};
77
78typedef struct {
79 double x, y, z;
80} coord;
81
83 omp_out.x += omp_in.x,
84 omp_out.y += omp_in.y,
85 omp_out.z += omp_in.z))
86
87#if dimension == 1
88# define norm(v) fabs(v.x[])
89# define dv() (Delta*cm[])
90#elif dimension == 2
91# define norm(v) (sqrt(sq(v.x[]) + sq(v.y[])))
93#else // dimension == 3
94# define norm(v) (sqrt(sq(v.x[]) + sq(v.y[]) + sq(v.z[])))
95# define dv() (cube(Delta)*cm[])
96#endif
97
99{
100 double norm = 0.;
101 for (int _d = 0; _d < dimension; _d++)
102 norm += sq(n->x);
103 norm = sqrt(norm);
104 for (int _d = 0; _d < dimension; _d++)
105 n->x /= norm;
106}
107
108void origin (double x = 0., double y = 0., double z = 0.) {
109 X0 = x; Y0 = y; Z0 = z;
110}
111
112void size (double L) {
113 L0 = L;
114}
115
116double zero (double s0, double s1, double s2) { return 0.; }
117
118// boundary conditions for each direction/variable
119
120#if dimension == 1
121 enum { right, left };
122#elif dimension == 2
123 enum { right, left, top, bottom };
124#else
125 enum { right, left, top, bottom, front, back };
126#endif
128
129#define none -1
130
131double * _constant = NULL;
132size_t datasize = 0;
133typedef struct _Point Point;
134
135#include "grid/boundaries.h"
136
137// attributes for each scalar
138
139typedef struct {
140 int x;
141#if dimension > 1
142 int y;
143#endif
144#if dimension > 2
145 int z;
146#endif
147} ivec;
148typedef double (* BoundaryFunc) (Point, Point, scalar, bool *);
149typedef void (* BoundaryStencilFunc) (Point, Point, scalar, void *);
150typedef struct {
155 void (* delete) (scalar);
156 char * name;
157 ivec d; // staggering
159 int face;
160 bool nodump, freed;
161 int block;
162 scalar * depends; // boundary conditions depend on other fields
164
166
167#define /* foreach_block */ // treatment of block data is disabled by default
168#define /* foreach_blockf */
169
170#if dimension == 1
171ivec Dimensions = {1};
172#elif dimension == 2
174#elif dimension == 3
175ivec Dimensions = {1,1,1};
176#endif
177
178// lists
179
181{
182 if (!list) return 0;
183 int ns = 0;
184 for (int _s = 0; _s < 1; _s++) /* scalar in list */ ns++;
185 return ns;
186}
187
189{
190 int len = list_len (list);
191 list = (scalar *)realloc(list, (len + 2)*sizeof(scalar));
192 list[len] = s;
193 list[len + 1].i = -1;
194 return list;
195}
196
198{
199 int len = list_len (list);
200 list = (scalar *)realloc(list, (len + 2)*sizeof(scalar));
201 for (int i = len; i >= 1; i--)
202 list[i] = list[i-1];
203 list[0] = s;
204 list[len + 1].i = -1;
205 return list;
206}
207
209{
210 for (int _t = 0; _t < 1; _t++) /* scalar in list */
211 if (t.i == s.i)
212 return list;
213 return list_append (list, s);
214}
215
217{
218 if (l != NULL)
219 for (int _s1 = 0; _s1 < 1; _s1++) /* scalar in l */
220 if (s1.i == s.i)
221 return true;
222 return false;
223}
224
226{
227 scalar * list = NULL;
228 if (l != NULL)
229 for (int _s = 0; _s < 1; _s++) /* scalar in l */
230 list = list_append (list, s);
231 return list;
232}
233
235{
236 scalar * l3 = list_copy (l1);
237 for (int _s = 0; _s < 1; _s++) /* scalar in l2 */
238 l3 = list_append (l3, s);
239 return l3;
240}
241
243{
244 int i = 0;
245 for (int _s = 0; _s < 1; _s++) /* scalar in l */
246 fprintf (fp, "%s%s", i++ == 0 ? "{" : ",", s.name);
247 fputs (i > 0 ? "}\n" : "{}\n", fp);
248}
249
251{
252 if (!list) return 0;
253 int nv = 0;
254 for (int _v = 0; _v < 1; _v++) /* vector in list */ nv++;
255 return nv;
256}
257
259{
260 int len = vectors_len (list);
261 list = (vector *)realloc(list, (len + 2)*sizeof(vector));
262 list[len] = v;
263 list[len + 1] = (vector){{-1}};
264 return list;
265}
266
268{
269 for (int _w = 0; _w < 1; _w++) /* vector in list */ {
270 bool id = true;
271 for (int _d = 0; _d < dimension; _d++)
272 if (w.x.i != v.x.i)
273 id = false;
274 if (id)
275 return list;
276 }
277 return vectors_append (list, v);
278}
279
281{
282 vector * list = NULL;
283 if (l != NULL)
284 for (int _v = 0; _v < 1; _v++) /* vector in l */
286 return list;
287}
288
290{
291 vector * list = NULL;
292 while (s->i >= 0) {
293 vector v;
294 for (int _d = 0; _d < dimension; _d++) {
295 assert (s->i >= 0);
296 v.x = *s++;
297 }
299 }
300 return list;
301}
302
304{
305 if (!list) return 0;
306 int nt = 0;
307 for (int _t = 0; _t < 1; _t++) /* tensor in list */ nt++;
308 return nt;
309}
310
312{
313 int len = tensors_len (list);
314 list = (tensor *)realloc(list, (len + 2)*sizeof(tensor));
315 list[len] = t;
316 list[len + 1] = (tensor){{{-1}}};
317 return list;
318}
319
321{
322 tensor * list = NULL;
323 while (v->x.i >= 0) {
324 tensor t;
325 for (int _d = 0; _d < dimension; _d++) {
326 assert (v->x.i >= 0);
327 t.x = *v++;
328 }
330 }
331 return list;
332}
333
334static inline bool is_vertex_scalar (scalar s)
335{
336 for (int _d = 0; _d < dimension; _d++)
337 if (s.d.x != -1)
338 return false;
339 return true;
340}
341
342scalar * all = NULL; // all the fields
343scalar * baseblock = NULL; // base block fields
344
345// basic methods
346
347scalar (* init_scalar) (scalar, const char *);
348scalar (* init_vertex_scalar) (scalar, const char *);
349vector (* init_vector) (vector, const char *);
350vector (* init_face_vector) (vector, const char *);
351tensor (* init_tensor) (tensor, const char *);
353
354#define vector(x) (*((vector *)&(x)))
355
356// timers
357
358#if _MPI
359static double mpi_time = 0.;
360#endif
361
362typedef struct {
364 struct timeval tv;
365 double tm;
366} timer;
367
369{
370 timer t;
371 t.c = clock();
372 gettimeofday (&t.tv, NULL);
373#if _MPI
374 t.tm = mpi_time;
375#endif
376 return t;
377}
378
380{
381 struct timeval tvend;
383 return ((tvend.tv_sec - t.tv.tv_sec) +
384 (tvend.tv_usec - t.tv.tv_usec)/1e6);
385}
386
387// Constant fields
388
389const vector zerof[] = {0.,0.,0.};
390const vector unityf[] = {1.,1.,1.};
391const scalar unity[] = 1.;
392const scalar zeroc[] = 0.;
393
394// Metric
395
396const vector fm[] = {1.[0],1.[0],1.[0]};
397const scalar cm[] = 1.[0];
398
399// Embedded boundaries
400// these macros are overloaded in embed.h
401
402#define SEPS 0.
403#define face_gradient_x(a,i) ((a[i] - a[i-1])/Delta)
404#define face_gradient_y(a,i) ((a[0,i] - a[0,i-1])/Delta)
405#define face_gradient_z(a,i) ((a[0,0,i] - a[0,0,i-1])/Delta)
406#define face_value(a,i) ((a[i] + a[i-1])/2.)
407#define center_gradient(a) ((a[1] - a[-1])/(2.*Delta))
408
409// matrices
410
411void matrix_inverse3 (double m[3][3])
412{
413 double det = (m[0][0]*(m[1][1]*m[2][2] - m[2][1]*m[1][2]) -
414 m[0][1]*(m[1][0]*m[2][2] - m[2][0]*m[1][2]) +
415 m[0][2]*(m[1][0]*m[2][1] - m[2][0]*m[1][1]));
416 assert (det);
417 double m00 = m[0][0];
418 m[0][0] = (m[1][1]*m[2][2] - m[1][2]*m[2][1])/det;
419 double m01 = m[0][1];
420 m[0][1] = (m[2][1]*m[0][2] - m[0][1]*m[2][2])/det;
421 double m02 = m[0][2];
422 m[0][2] = (m01*m[1][2] - m[1][1]*m[0][2])/det;
423 double m10 = m[1][0];
424 m[1][0] = (m[1][2]*m[2][0] - m[1][0]*m[2][2])/det;
425 double m11 = m[1][1];
426 m[1][1] = (m00*m[2][2] - m[2][0]*m02)/det;
427 m[1][2] = (m10*m02 - m00*m[1][2])/det;
428 double m20 = m[2][0];
429 m[2][0] = (m10*m[2][1] - m[2][0]*m11)/det;
430 m[2][1] = (m20*m01 - m00*m[2][1])/det;
431 m[2][2] = (m00*m11 - m01*m10)/det;
432}
433
434double smatrix_inverse (const int n, double m[n][n], double pivmin)
435{
436 int indxc[n], indxr[n], ipiv[n];
437 int i, icol = 0, irow = 0, j, k, l, ll;
438 double big, dum, pivinv, minpiv = HUGE;
439
440 for (j = 0; j < n; j++)
441 ipiv[j] = -1;
442
443 for (i = 0; i < n; i++) {
444 big = 0.0;
445 for (j = 0; j < n; j++)
446 if (ipiv[j] != 0)
447 for (k = 0; k < n; k++) {
448 if (ipiv[k] == -1) {
449 if (fabs (m[j][k]) >= big) {
450 big = fabs (m[j][k]);
451 irow = j;
452 icol = k;
453 }
454 }
455 }
456 ipiv[icol]++;
457 if (irow != icol)
458 for (l = 0; l < n; l++)
459 swap (double, m[irow][l], m[icol][l]);
460 indxr[i] = irow;
461 indxc[i] = icol;
462 if (fabs (m[icol][icol]) < minpiv)
463 minpiv = fabs (m[icol][icol]);
464 if (minpiv < pivmin)
465 break;
466 pivinv = 1.0/m[icol][icol];
467 m[icol][icol] = 1.0;
468 for (l = 0; l < n; l++) m[icol][l] *= pivinv;
469 for (ll = 0; ll < n; ll++)
470 if (ll != icol) {
471 dum = m[ll][icol];
472 m[ll][icol] = 0.0;
473 for (l = 0; l < n; l++)
474 m[ll][l] -= m[icol][l]*dum;
475 }
476 }
477 if (minpiv >= pivmin)
478 for (l = n - 1; l >= 0; l--) {
479 if (indxr[l] != indxc[l])
480 for (k = 0; k < n; k++)
481 swap (double, m[k][indxr[l]], m[k][indxc[l]]);
482 }
483 return minpiv < pivmin ? 0. : minpiv;
484}
485
486void * matrix_new (int n, int p, size_t size)
487{
488 void ** m = qmalloc (n, void *);
489 char * a = qmalloc (n*p*size, char);
490 for (int i = 0; i < n; i++)
491 m[i] = a + i*p*size;
492 return m;
493}
494
495double matrix_inverse (double ** m, int n, double pivmin)
496{
497 return smatrix_inverse (n, (double (*)[n])m[0], pivmin);
498}
499
500void matrix_free (void * m)
501{
502 free (((void **) m)[0]);
503 free (m);
504}
505
506// Solver cleanup
507
509
511
518
519// Default objects to display
520
521static char * display_defaults = NULL;
522
525}
526
546
547#define display_control(val, ...)
548
549typedef struct {
550 double x;
551#if dimension > 1
552 double y;
553#endif
554#if dimension > 2
555 double z;
556#endif
557} _coord;
558
559// Types and macros for compatibility with GLSL
560
561typedef struct {
562 float r, g, b, a;
563} vec4;
564
565#if dimension == 1
566# define avector(x, ...) {x}
567#elif dimension == 2
568# define avector(x, y, ...) {x, y}
569#else // dimension == 3
570# define avector(x, y, z) {x, y, z}
571#endif
572
573typedef struct {
575} mat3;
576
578 omp_out.x.x += omp_in.x.x,
579 omp_out.x.y += omp_in.x.y,
580 omp_out.x.z += omp_in.x.z,
581 omp_out.y.x += omp_in.y.x,
582 omp_out.y.y += omp_in.y.y,
583 omp_out.y.z += omp_in.y.z,
584 omp_out.z.x += omp_in.z.x,
585 omp_out.z.y += omp_in.z.y,
586 omp_out.z.z += omp_in.z.z
587 ))
588
592
593static
595{
596 hash->s = 0;
597}
598
599static
600inline void a32_hash_add (Adler32Hash * hash, const void * data, size_t size)
601{
602 const uint8_t * buffer = (const uint8_t*) data;
603 for (size_t n = 0; n < size; n++, buffer++)
604 hash->s = *buffer + (hash->s << 6) + (hash->s << 16) - hash->s;
605}
606
607static
609{
610 return hash->s;
611}
double(* gradient)(double, double, double)
Definition advection.h:31
vector g[]
We store the combined pressure gradient and acceleration field in g*.
Definition all-mach.h:65
const vector a
Definition all-mach.h:59
Array * array_new()
Definition array.h:10
void * array_append(Array *a, void *elem, size_t size)
Definition array.h:24
int min
Definition balance.h:192
#define dimension
Definition bitree.h:3
define k
define l
define m((k)==0 &&(l)==0 &&(m)==0) macro2 foreach_point(double _x=0.
free(list1)
define VT _attribute[s.i] v y scalar * list
Definition cartesian.h:276
int y
Definition common.h:76
scalar * list_prepend(scalar *list, scalar s)
Definition common.h:197
#define define
int x
Definition common.h:76
double zero(double s0, double s1, double s2)
Definition common.h:116
int z
Definition common.h:76
vector(* init_vector)(vector, const char *)
Definition common.h:349
struct _Point Point
Definition common.h:133
void free_solver_func_add(free_solver_func func)
Definition common.h:512
scalar(* init_vertex_scalar)(scalar, const char *)
Definition common.h:348
const scalar zeroc[]
Definition common.h:392
void(* scalar_clone)(scalar, scalar)
Definition common.h:352
static int sign2(number x)
Definition common.h:14
scalar * all
Definition common.h:342
vector * vectors_copy(vector *l)
Definition common.h:280
const scalar cm[]
Definition common.h:397
void display(const char *commands, bool overwrite=false)
Definition common.h:527
vector * vectors_add(vector *list, vector v)
Definition common.h:267
void list_print(scalar *l, FILE *fp)
Definition common.h:242
double Z0
Definition common.h:34
void normalize(coord *n)
Definition common.h:98
static _Attributes * _attribute
Definition common.h:165
scalar * list_concat(scalar *l1, scalar *l2)
Definition common.h:234
scalar * list_add(scalar *list, scalar s)
Definition common.h:208
#define HUGE
Definition common.h:6
int list_lookup(scalar *l, scalar s)
Definition common.h:216
tensor(* init_tensor)(tensor, const char *)
Definition common.h:351
tensor * tensors_append(tensor *list, tensor t)
Definition common.h:311
ivec Dimensions
Definition common.h:173
double L0
Definition common.h:36
void(* free_solver_func)(void)
Definition common.h:508
static Array * free_solver_funcs
Definition common.h:510
int N
Definition common.h:39
const scalar unity[]
Definition common.h:391
struct @0 Period
static uint32_t a32_hash(const Adler32Hash *hash)
Definition common.h:608
static number sq(number x)
Definition common.h:11
scalar * baseblock
Definition common.h:343
void origin(double x=0., double y=0., double z=0.)
Definition common.h:108
scalar * list_copy(scalar *l)
Definition common.h:225
Grid * grid
Definition common.h:32
void matrix_free(void *m)
Definition common.h:500
int list_len(scalar *list)
Definition common.h:180
double timer_elapsed(timer t)
Definition common.h:379
static char * display_defaults
Definition common.h:521
#define swap(type, a, b)
Definition common.h:19
void(* BoundaryStencilFunc)(Point, Point, scalar, void *)
Definition common.h:149
#define vector(x)
Definition common.h:354
vector(* init_face_vector)(vector, const char *)
Definition common.h:350
void * matrix_new(int n, int=(type *) realloc(p,(size) *sizeof(type)) p=(type *) realloc(p,(size) *sizeof(type)), size_t size)
Definition common.h:486
static number clamp(number x, number a, number b)
Definition common.h:15
static void a32_hash_add(Adler32Hash *hash, const void *data, size_t size)
Definition common.h:600
double matrix_inverse(double **m, int n, double pivmin)
Definition common.h:495
double X0
Definition common.h:34
void matrix_inverse3(double m[3][3])
Definition common.h:411
tensor * tensors_from_vectors(vector *v)
Definition common.h:320
static int sign(number x)
Definition common.h:13
scalar * list_append(scalar *list, scalar s)
Definition common.h:188
static bool is_vertex_scalar(scalar s)
Definition common.h:334
const vector zerof[]
Definition common.h:389
double smatrix_inverse(const int n, double m[n][n], double pivmin)
Definition common.h:434
#define dv()
Definition common.h:92
scalar(* init_scalar)(scalar, const char *)
Definition common.h:347
int tensors_len(tensor *list)
Definition common.h:303
double Y0
Definition common.h:34
@ top
Definition common.h:123
@ bottom
Definition common.h:123
@ left
Definition common.h:123
@ right
Definition common.h:123
int nboundary
Definition common.h:127
int vectors_len(vector *list)
Definition common.h:250
static void free_display_defaults()
Definition common.h:523
double(* BoundaryFunc)(Point, Point, scalar, bool *)
Definition common.h:148
static void a32_hash_init(Adler32Hash *hash)
Definition common.h:594
static double noise()
Definition common.h:23
double * _constant
Definition common.h:131
const vector fm[]
Definition common.h:396
vector * vectors_from_scalars(scalar *s)
Definition common.h:289
double number
Definition common.h:3
static number cube(number x)
Definition common.h:12
const vector unityf[]
Definition common.h:390
size_t datasize
Definition common.h:132
vector * vectors_append(vector *list, vector v)
Definition common.h:258
timer timer_start(void)
Definition common.h:368
vector w[]
#define p
Definition tree.h:320
#define qmalloc(size, type)
define sysmalloc malloc define syscalloc calloc define sysrealloc realloc define sysfree free define systrdup strdup define func
Definition config.h:120
#define assert(a)
Definition config.h:107
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
else return n
Definition curvature.h:101
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
scalar s
Definition embed-tree.h:56
*cs[i, 0, 0] a *[i -1, 0, 0] j
Definition embed.h:88
double v[2]
Definition embed.h:383
scalar int i
Definition embed.h:74
double t
Definition events.h:24
#define data(k, l)
Definition linear.h:26
size_t max
Definition mtrace.h:8
FILE * fp
Definition mtrace.h:7
size_t size
size *double * b
uint32_t s
Definition common.h:590
Definition array.h:5
Definition common.h:26
long n
Definition common.h:27
long tn
Definition common.h:28
int depth
Definition common.h:29
int maxdepth
Definition common.h:30
Definition linear.h:21
BoundaryStencilFunc * boundary_stencil
Definition common.h:153
int block
Definition common.h:161
scalar * depends
Definition common.h:162
BoundaryFunc * boundary_homogeneous
Definition common.h:152
bool freed
Definition common.h:160
char * name
Definition common.h:156
vector v
Definition common.h:158
BoundaryFunc * boundary
Definition common.h:151
double y
Definition common.h:552
double x
Definition common.h:550
Definition common.h:78
double x
Definition common.h:79
Definition common.h:139
int y
Definition common.h:142
int x
Definition common.h:140
Definition common.h:573
coord x
Definition common.h:574
Definition utils.h:138
int i
Definition common.h:44
vector x
Definition common.h:67
vector y
Definition common.h:69
clock_t c
Definition common.h:363
double tm
Definition common.h:365
Definition common.h:561
float a
Definition common.h:562
scalar x
Definition common.h:47
scalar y
Definition common.h:49
scalar * y
Definition common.h:59
scalar * x
Definition common.h:57
scalar nt
Definition terrain.h:17