42#define _I (point.i - GHOSTS)
44# define _J (point.j - GHOSTS)
47# define _K (point.k - GHOSTS)
49#define _DELTA (1./(1 << point.level))
184#define tree ((Tree *)grid)
228 c->p[
c->n].level =
p.level;
360 for (
int _k = 0;
_k < 2;
_k++) {
374 for (
int _k = 0;
_k < 2;
_k++) {
376 for (
int _l = 0;
_l < 2;
_l++) {
391 for (
int _l = 0;
_l < 2;
_l++) {
393 for (
int _m = 0;
_m < 2;
_m++) {
395 for (
int _n = 0;
_n < 2;
_n++) {
408#define update_cache() { if (tree->dirty) update_cache_f(); }
410#define is_refined(cell) (!is_leaf (cell) && cell.neighbors && cell.pid >= 0)
411#define is_prolongation(cell) (!is_leaf(cell) && !cell.neighbors && cell.pid >= 0)
412#define is_boundary(cell) (cell.pid < 0)
439 for (
_k = 0;
_k < cache.n;
_k++) {
494#define bid(cell) (- cell.pid - 1)
516#define foreach_halo(type, l) foreach_halo_##type(l)
522 for (
int _c = 0;
_c < 4;
_c++)
545 for (
int i = 0;
i <= 1;
i++)
546 for (
int j = 0;
j <= 1;
j++)
560 for (
int _i = 0;
_i < 1;
_i++)
565 q->leaves.n =
q->faces.n =
q->vertices.n = 0;
567 q->active[
l].n =
q->prolongation[
l].n =
568 q->boundary[
l].n =
q->restriction[
l].n = 0;
612 unsigned short flags = 0;
624 for (
int i = 0;
i <= 1;
i++)
626 for (
int j = 0;
j <= 1;
j++)
629 for (
int k = 0;
k <= 1;
k++)
636 if (
cell.neighbors > 0)
641 unsigned short flags = 0;
663 for (
int l = 0;
l <=
depth();
l++) {
689 for (
int _i = 0;
_i < 1;
_i++)
694 const char *
order =
"xyz")
697 for (
int _i = 0;
_i < 1;
_i++)
726# define foreach_edge(...) \
727 for (int _i = 0; _i < _N; _i++) \
728 for (int _d = 0; _d < dimension; _d++) \
729 if (is_vertex(neighbor(1)))
731# define foreach_edge(...) for (int _i = 0; _i < _N; _i++)
766 for (
int l = 0;
l <=
depth();
l++) {
770 for (
int _s = 0;
_s < 1;
_s++) {
772 for (
int b = 0;
b <
s.block;
b++)
811 for (
int l = - 1;
l <= 1;
l += 2)
812 for (
int n =
i +
l*
nl;
n >= 0 &&
n < len;
n +=
l*
nl)
835 for (
int l = - 1;
l <= 1;
l += 2)
836 for (
int n =
i +
l*
nl;
n >= 0 &&
n < len;
n +=
l*
nl)
839 for (
int l = - 1;
l <= 1;
l += 2)
840 for (
int n =
j +
l*
nl;
n >= 0 &&
n < len;
n +=
l*
nl) {
842 for (
int o = - 1;
o <= 1;
o += 2)
843 for (
int p =
i +
o*
nl;
p >= 0 &&
p < len;
p +=
o*
nl)
849 for (
int l = - 1;
l <= 1;
l += 2)
850 for (
int n =
j +
l*
nl;
n >= 0 &&
n < len;
n +=
l*
nl)
873 for (
int l = - 1;
l <= 1;
l += 2)
874 for (
int n =
i +
l*
nl;
n >= 0 &&
n < len;
n +=
l*
nl)
877 for (
int l = - 1;
l <= 1;
l += 2)
878 for (
int n =
j +
l*
nl;
n >= 0 &&
n < len;
n +=
l*
nl) {
880 for (
int o = - 1;
o <= 1;
o += 2)
881 for (
int p =
i +
o*
nl;
p >= 0 &&
p < len;
p +=
o*
nl)
885 for (
int l = - 1;
l <= 1;
l += 2)
886 for (
int n =
k +
l*
nl;
n >= 0 &&
n < len;
n +=
l*
nl) {
888 for (
int q = - 1;
q <= 1;
q += 2)
889 for (
int r =
j +
q*
nl; r >= 0 && r < len; r +=
q*
nl)
890 f(
m,
i, r,
n, len,
b);
891 for (
int o = - 1;
o <= 1;
o += 2)
892 for (
int p =
i +
o*
nl;
p >= 0 &&
p < len;
p +=
o*
nl) {
894 for (
int q = - 1;
q <= 1;
q += 2)
895 for (
int r =
j +
q*
nl; r >= 0 && r < len; r +=
q*
nl)
896 f(
m,
p, r,
n, len,
b);
901 for (
int l = - 1;
l <= 1;
l += 2)
902 for (
int n =
k +
l*
nl;
n >= 0 &&
n < len;
n +=
l*
nl) {
904 for (
int o = - 1;
o <= 1;
o += 2)
905 for (
int p =
i +
o*
nl;
p >= 0 &&
p < len;
p +=
o*
nl)
911 for (
int l = - 1;
l <= 1;
l += 2)
912 for (
int n =
j +
l*
nl;
n >= 0 &&
n < len;
n +=
l*
nl)
915 for (
int l = - 1;
l <= 1;
l += 2)
916 for (
int n =
k +
l*
nl;
n >= 0 &&
n < len;
n +=
l*
nl) {
918 for (
int o = - 1;
o <= 1;
o += 2)
919 for (
int p =
j +
o*
nl;
p >= 0 &&
p < len;
p +=
o*
nl)
925 for (
int l = - 1;
l <= 1;
l += 2)
926 for (
int n =
k +
l*
nl;
n >= 0 &&
n < len;
n +=
l*
nl)
955 for (
int k = 0;
k < 2;
k++,
i++) {
961 for (
int l = 0;
l < 2;
l++,
j++) {
967 for (
int l = 0;
l < 2;
l++,
j++) {
969 for (
int n = 0;
n < 2;
n++,
m++) {
978 for (
int _c = 0;
_c < 4;
_c++) {
981 for (
int _s = 0;
_s < 1;
_s++)
995 for (
int k = 0;
k < 2;
k++,
i++)
1011 for (
int k = 0;
k < 2;
k++)
1012 for (
int l = 0;
l < 2;
l++)
1029 for (
int k = 0;
k < 2;
k++,
i++) {
1031 for (
int l = 0;
l < 2;
l++,
j++) {
1033 for (
int n = 0;
n < 2;
n++,
m++)
1048 if (
cell.neighbors++ == 0)
1051 if (
cell.neighbors++ == 0)
1062 if (
cell.neighbors == 0)
1065 if (
cell.neighbors) {
1067 for (
int _c = 0;
_c < 4;
_c++) {
1098 for (
int l = 1;
l <=
depth();
l++) {
1105 for (
int k = 0;
k < 2;
k++) {
1111 for (
int k = 0;
k < 2;
k++)
1112 for (
int o = 0;
o < 2;
o++) {
1118 for (
int l = 0;
l < 2;
l++)
1119 for (
int m = 0;
m < 2;
m++)
1120 for (
int n = 0;
n < 2;
n++) {
1139#define is_neighbor(...) (allocated(__VA_ARGS__) && \
1140 !is_boundary(neighbor(__VA_ARGS__)))
1156 for (
int i = -
k;
i <=
k;
i += 2*
k)
1159 for (
int _s = 0;
_s < 1;
_s++)
1162 for (
int _v = 0;
_v < 1;
_v++) {
1190 for (
int i = -
k;
i <=
k;
i += 2*
k)
1191 for (
int j = -
k;
j <=
k;
j += 2*
k)
1196 for (
int _s = 0;
_s < 1;
_s++)
1201 for (
int _v = 0;
_v < 1;
_v++) {
1230 for (
int i = -
n;
i <=
n;
i += 2*
n)
1231 for (
int j = -
n;
j <=
n;
j += 2*
n)
1232 for (
int k = -
n;
k <=
n;
k += 2*
n)
1246 for (
int _s = 0;
_s < 1;
_s++)
1251 for (
int _v = 0;
_v < 1;
_v++) {
1277 for (
int j = -
k;
j <=
k;
j += 2*
k) {
1290 return (
Point){.level = -1};
1303 for (
int _s = 0;
_s < 1;
_s++)
1305 if (
s.v.x.
i ==
s.
i) {
1311 else if (
s.v.x.
i < 0 &&
s.boundary[0])
1320 for (
int _s = 0;
_s < 1;
_s++)
1323 for (
int _v = 0;
_v < 1;
_v++)
1331 for (
int i = -1;
i <= 1;
i += 2) {
1335 for (
int _v = 0;
_v < 1;
_v++) {
1337 if (
vn.boundary[
id])
1350 for (
int _v = 0;
_v < 1;
_v++) {
1362 for (
int _v = 0;
_v < 1;
_v++)
1386 double sum = 0.,
n = 0.;
1387 for (
int _c = 0;
_c < 4;
_c++)
1396 double sum = 0.,
n = 0.;
1397 for (
int _c = 0;
_c < 4;
_c++)
1409 for (
int _s = 0;
_s < 1;
_s++)
1411 if (
s.v.x.
i ==
s.
i &&
s.face)
1418 for (
int _s = 0;
_s < 1;
_s++)
1420 for (
int _v = 0;
_v < 1;
_v++)
1443 for (
int _c = 0;
_c < 4;
_c++)
1444 if (
cell.pid >= 0 || pid < 0)
1472 free (
q->vertices.p);
1473 free (
q->refined.p);
1523 q->L[0] =
NULL;
q->L = &(
q->L[1]);
1550 (
k < 0 ? -1 -
left :
1603 for (
int k = -1;
k <= 1;
k++)
1604 for (
int l = -1;
l <= 1;
l++) {
1623 fp =
fopen(
"check_two_one",
"w");
1635 for (
int l =
depth();
l >= 0;
l--) {
1681 for (
int _i = -1;
_i <= 1;
_i += 2) {
1712 for (
int _i = 0;
_i < 1;
_i++) {
1736#define periodic(dir) tree_periodic(dir)
1745 for (
int _s = 0;
_s < 1;
_s++)
vector q[]
The primitive variables are the momentum , pressure , density , (face) specific volume ,...
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)
void add_boundary(Boundary *b)
define double double char flags
define double double char Reduce reductions
void output_cells(FILE *fp=stdout, coord c={0}, double size=0.)
define m((k)==0 &&(l)==0 &&(m)==0) macro2 foreach_point(double _x=0.
define neighbor(o, p, q)((Point)
define VT _attribute[s.i] v y scalar * list
vector * vectors_add(vector *list, vector v)
static _Attributes * _attribute
scalar * list_add(scalar *list, scalar s)
static number sq(number x)
static number cube(number x)
scalar f[]
The primary fields are:
else define undefined((double) DBL_MAX) @ define enable_fpe(flags) @ define disable_fpe(flags) static void set_fpe(void)
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)
#define qcalloc(size, type)
define _index(a, m)(a.i) @define val(a
#define qmalloc(size, type)
define sysmalloc malloc define syscalloc calloc define sysrealloc realloc define sysfree free define systrdup strdup define line calloc(n, s) @ define prealloc(p
define sysmalloc malloc define syscalloc calloc define sysrealloc realloc define sysfree free define systrdup strdup define func
define sysmalloc malloc define syscalloc calloc define sysrealloc realloc define sysfree free define systrdup strdup define line line realloc(p, s) @ define pfree(p
*cs[i, 0, 0] a *[i -1, 0, 0] j
macro2 foreach_cell_all()
macro2 foreach_cell_post(bool condition)
define neighborp(k, l, o) neighbor(k
#define realloc_scalar(size)
macro
We also redefine the "per field" (inner) traversal.
void mempool_free(Mempool *m, void *p)
void mempool_destroy(Mempool *m)
void * mempool_alloc0(Mempool *m)
void * mempool_alloc(Mempool *m)
Mempool * mempool_new(size_t poolsize, size_t size)
void(* restriction)(Point, scalar)
static void no_restriction(Point point, scalar s)
#define CELL(m, level, i)
struct _Memindex * mem_new(int len)
The mem_new() function returns a new (empty) Memindex.
macro foreach_mem(struct _Memindex *index, int len, int _i)
The foreach_mem() macro traverses every _i allocated elements of array _m taking into account a perio...
void mem_free(struct _Memindex *m, int i, int j, int len, void *b)
The mem_free() function frees a given index.
void mem_assign(struct _Memindex *m, int i, int j, int len, void *b)
The mem_assign() function assigns a (pointer) value to a given index.
#define mem_data(m, i, j)
void mem_destroy(struct _Memindex *m, int len)
The mem_destroy() function frees all the memory allocated by a given Memindex.
#define mem_allocated(m, i, j)
The mem_data() macros return the data stored at a specific (multidimensional) index.
static void set_dirty_stencil(scalar s)
CacheLevel * prolongation
static bool diagonal_neighbor_3D(Point point, scalar *scalars, vector *vectors)
_i< 1;_i++) { OMP_PARALLEL(reductions) { int ig=0, jg=0, kg=0;NOT_UNUSED(ig);NOT_UNUSED(jg);NOT_UNUSED(kg);Point point={0};NOT_UNUSED(point);point.i=2 ;point.j=2 ;int _k;unsigned short _flags;NOT_UNUSED(_flags);for(_k=0;_k< cache.n;_k++) { point.i=cache.p[_k].i;point.j=cache.p[_k].j;point.level=cache.p[_k].level;_flags=cache.p[_k].flags;{...} } }}macro2 foreach_cache_level(Cache cache, int _l, Reduce reductions=None){ OMP_PARALLEL(reductions) { int ig=0, jg=0, kg=0;NOT_UNUSED(ig);NOT_UNUSED(jg);NOT_UNUSED(kg);Point point={0};NOT_UNUSED(point);point.i=2 ;point.j=2 ;point.level=_l;int _k;for(_k=0;_k< cache.n;_k++) { point.i=cache.p[_k].i;point.j=cache.p[_k].j;{...} } }}static void update_cache_f(void);macro2 foreach_boundary_level(int _l, Reduce reductions=None){ if(_l<=depth()) { { if(((Tree *) grid) ->dirty) update_cache_f();};CacheLevel _boundary=((Tree *) grid) -> boundary[_l]
def is_refined_check()((!is_leaf(cell) &&cell .neighbors &&cell .pid >=0) &&point.i > 0 &&point.i<(1<< level)+2 *2 - 1 &&point.j > 0 &&point.j<(1<< level)+2 *2 - 1) @ macro2 for(int _i=0
static void update_depth(int inc)
static bool is_boundary_point(Point point)
define n sizeof(Cell))) @define fine(a
define n n define coarse(a, k, p, n)((double *)(PARENT(k
static void update_cache_f(void)
static void cache_level_append(CacheLevel *c, Point p)
void cache_shrink(Cache *c)
if TRASH undef trash define trash(list) reset(list
macro2 foreach_face_generic(char flags=0, Reduce reductions=None, const char *order="xyz")
void mpi_boundary_coarsen(int a, int b)
def allocated(k, l, n)(mem_allocated(((Tree *) grid) -> L[point.level]->m, point.i+k, point.j+l)) @ @def NEIGHBOR(k, l, n)(((((Tree *) grid) ->L[point.level]->m) ->b[point.i+k][point.j+l])) @ @def PARENT(k, l, n)(((((Tree *) grid) ->L[point.level-1]->m) ->b[(point.i+2)/2+k][(point.j+2)/2+l])) @ @def allocated_child(k, l, n)(level< depth() &&mem_allocated(((Tree *) grid) ->L[point.level+1]->m, 2 *point.i- 2+k, 2 *point.j- 2+l)) @ @def CHILD(k, l, n)(((((Tree *) grid) ->L[point.level+1]->m) ->b[2 *point.i- 2+k][2 *point.j- 2+l])) @ @define CELL(m)(*((Cell *)(m))) @define depth()(grid->depth) @define aparent(k, l, n) CELL(PARENT(k, l, n)) @define child(k, l, n) CELL(CHILD(k, l, n)) @define cell CELL(NEIGHBOR(0, 0, 0)) @define neighbor(k, l, n) CELL(NEIGHBOR(k, l, n)) @def neighborp(l, m, n)(Point)
Point locate(double xp=0., double yp=0., double zp=0.)
static size_t _size(size_t depth)
static bool diagonal_neighbor_2D(Point point, scalar *scalars, vector *vectors)
define n n define n n macro POINT_VARIABLES(Point point=point)
#define is_prolongation(cell)
static void periodic_function(struct _Memindex *m, int i, int j, int len, void *b, PeriodicFunction f)
static void free_cache(CacheLevel *c)
static Layer * new_layer(int depth)
if else void mpi_boundary_refine(scalar *list)
#define foreach_halo(type, l)
static void box_boundary_level(const Boundary *b, scalar *list, int l)
macro2 foreach_halo_restriction(int _l)
undef VN undef VT define VN _attribute[s.i] v x define VT _attribute[s.i] v static y double masked_average(Point point, scalar s)
static void free_periodic(struct _Memindex *m, int i, int j, int len)
void decrement_neighbors(Point point)
void tree_periodic(int dir)
static void assign_periodic(struct _Memindex *m, int i, int j, int len, void *b)
static void cache_append(Cache *c, Point p, unsigned short flags)
static void refine_level(int depth)
macro2 for(int _l=0;_l< int l, char flags=0, Reduce reductions=None;_l++)
macro1 is_face_y(unsigned short _f=_flags)
macro2 foreach_halo_prolongation(int _l)
if define disable_fpe_for_mpi() disable_fpe(FE_DIVBYZERO|FE_INVALID) @ define enable_fpe_for_mpi() enable_fpe(FE_DIVBYZERO|FE_INVALID) @else @ define disable_fpe_for_mpi() @ define enable_fpe_for_mpi() @endif static inline void no_restriction(Point point
macro1 foreach_child(Point point=point, break=(_k=_l=2))
static void free_children(Point point)
static void cache_level_shrink(CacheLevel *c)
static size_t poolsize(size_t depth, size_t size)
void(* PeriodicFunction)(struct _Memindex *, int, int, int, void *)
static void masked_boundary_restriction(const Boundary *b, scalar *list, int l)
define is_active() cell((cell).flags &active) @define is_leaf(cell)((cell).flags &leaf) @define is_coarse()((cell).neighbors > 0) @define is_border(cell)((cell).flags &border) @define is_local(cell)((cell).pid
static void destroy_layer(Layer *l)
foreach_cache_level(_boundary, _l, reductions)
void increment_neighbors(Point point)
void mpi_boundary_update(scalar *list)
static void alloc_children(Point point)
static void cache_append_face(Point point, unsigned short flags)
static bool has_local_children(Point point)
static CacheLevel * cache_level_resize(CacheLevel *name, int a)
#define is_boundary(cell)
static bool normal_neighbor(Point point, scalar *scalars, vector *vectors)
macro VARIABLES(Point point=point, int _ig=ig, int _jg=jg, int _kg=kg)