16#define periodic_clamp(a, level) do { \
17 if (a < GHOSTS) a += 1 << level; \
18 else if (a >= GHOSTS + (1 << level)) a -= 1 << level; } while(0)
60 for (
int _c = 0;
_c < 4;
_c++)
64 for (
int _s = 0;
_s < 1;
_s++)
73 for (
int _c = 0;
_c < 4;
_c++) {
75 for (
int _n = 0;
_n < ;
_n++) {
80 for (
int _c = 0;
_c < 4;
_c++)
108 for (
int _c = 0;
_c < 4;
_c++)
109 if (
cell.neighbors || (
cell.pid < 0 &&
cell.pid != pid))
114 for (
int _s = 0;
_s < 1;
_s++) {
129 for (
int _n = 0;
_n < 1;
_n++)
131 for (
int _c = 0;
_c < 4;
_c++)
144 for (
int _c = 0;
_c < 4;
_c++)
146 for (
int _n = 0;
_n < 1;
_n++)
162 for (
int _t = 0;
_t < 1;
_t++)
165 for (
int _d = 0;
_d < 1;
_d++)
192 for (
int _s = 0;
_s < 1;
_s++)
203 for (
int _s = 0;
_s < 1;
_s++)
223 if (
cell.flags & refined) {
231 for (
int _c = 0;
_c < 4;
_c++)
238 for (
int _s = 0;
_s < 1;
_s++) {
241 for (
int _c = 0;
_c < 4;
_c++)
246 for (
int _c = 0;
_c < 4;
_c++)
255 if (
level >= minlevel)
265 for (
int _c = 0;
_c < 4;
_c++) {
269 if (
level >= maxlevel)
285 for (
int l =
depth();
l >= 0;
l--) {
290 if (
cell.flags & refined)
398 for (
int _s = 0;
_s < 1;
_s++) {
403 for (
int l =
depth() - 1;
l >= 0;
l--)
409 for (
int _s = 0;
_s < 1;
_s++)
413 for (
int _s = 0;
_s < 1;
_s++)
418 for (
int _s = 0;
_s < 1;
_s++)
422 for (
int _s = 0;
_s < 1;
_s++)
427 for (
int _s = 0;
_s < 1;
_s++)
432 for (
int _s = 0;
_s < 1;
_s++)
445 s.refine =
s.prolongation;
453 fine(
s,1,1) = (
s[] +
s[1] +
s[0,1] +
s[1,1])/4.;
455 fine(
s,1,1,1) = (
s[] +
s[1] +
s[0,1] +
s[1,1] +
456 s[0,0,1] +
s[1,0,1] +
s[0,1,1] +
s[1,1,1])/8.;
459 for (
int i = 0;
i <= 1;
i++) {
460 for (
int j = 0;
j <= 1;
j++)
462 for (
int k = 0;
k <= 1;
k++)
475 fine(
s,2*
i,1,1) = (
s[
i,0,0] +
s[
i,1,0] +
s[
i,0,1] +
s[
i,1,1])/4.;
498 v.x.refine =
v.x.prolongation;
516 double g1 = (
v.x[0,+1] -
v.x[0,-1])/8.;
517 for (
int j = 0;
j <= 1;
j++)
524 double g1 = (
v.x[1,+1] -
v.x[1,-1])/8.;
525 for (
int j = 0;
j <= 1;
j++)
531 double g1 = (
v.x[0,+1] -
v.x[0,-1] +
v.x[1,+1] -
v.x[1,-1])/16.;
532 for (
int j = 0;
j <= 1;
j++)
533 fine(
v.x,1,
j) = (
v.x[] +
v.x[1])/2. + (2*
j - 1)*
g1;
540 double g1 = (
v.x[0,+1] -
v.x[0,-1])/8.;
541 double g2 = (
v.x[0,0,+1] -
v.x[0,0,-1])/8.;
542 for (
int j = 0;
j <= 1;
j++)
543 for (
int k = 0;
k <= 1;
k++)
550 double g1 = (
v.x[1,+1] -
v.x[1,-1])/8.;
551 double g2 = (
v.x[1,0,+1] -
v.x[1,0,-1])/8.;
552 for (
int j = 0;
j <= 1;
j++)
553 for (
int k = 0;
k <= 1;
k++)
559 double g1 = (
v.x[0,+1] -
v.x[0,-1] +
v.x[1,+1] -
v.x[1,-1])/16.;
560 double g2 = (
v.x[0,0,+1] -
v.x[0,0,-1] +
v.x[1,0,+1] -
v.x[1,0,-1])/16.;
561 for (
int j = 0;
j <= 1;
j++)
562 for (
int k = 0;
k <= 1;
k++)
585 for (
int _c = 0;
_c < 4;
_c++) {
588 d[
i] +=
v.x[1] -
v.x[];
593 p[1] = (3.*
d[3] +
d[0])/4. +
d[2]/2.;
594 p[2] = (
d[3] + 3.*
d[0])/4. +
d[2]/2.;
595 p[3] = (
d[3] +
d[0])/2. +
d[2];
601 static double m[7][7] = {
602 {7./12,5./24,3./8,5./24,3./8,1./4,1./3},
603 {5./24,7./12,3./8,5./24,1./4,3./8,1./3},
604 {3./8,3./8,3./4,1./4,3./8,3./8,1./2},
605 {5./24,5./24,1./4,7./12,3./8,3./8,1./3},
606 {3./8,1./4,3./8,3./8,3./4,3./8,1./2},
607 {1./4,3./8,3./8,3./8,3./8,3./4,1./2},
608 {1./3,1./3,1./2,1./3,1./2,1./2,5./6}
611 for (
int i = 0;
i < 7;
i++) {
613 for (
int j = 0;
j < 7;
j++)
616 for (
int k = 0;
k <= 1;
k++) {
622 fine(
v.z,0,0,1) +=
p[1] -
p[0];
623 fine(
v.z,0,1,1) +=
p[3] -
p[2];
624 fine(
v.z,1,0,1) +=
p[5] -
p[4];
625 fine(
v.z,1,1,1) +=
p[7] -
p[6];
662 for (
int _s = 0;
_s < 1;
_s++)
685 for (
int _s = 0;
_s < 1;
_s++)
693 for (
int _s = 0;
_s < 1;
_s++)
702 for (
int _s = 0;
_s < 1;
_s++)
715 for (
int _s = 0;
_s < 1;
_s++)
724 for (
int _s = 0;
_s < 1;
_s++)
728 (
s[0,-1,-1] +
s[0,1,-1] +
s[0,-1,1] +
s[0,1,1])/4. :
nodata;
735 for (
int _s = 0;
_s < 1;
_s++)
747 for (
int l =
depth - 1;
l >= 0;
l--) {
749 for (
int _s = 0;
_s < 1;
_s++)
751 for (
int _s = 0;
_s < 1;
_s++)
763 for (
int _s = 0;
_s < 1;
_s++)
771 if (
listr || listf) {
775 for (
int _s = 0;
_s < 1;
_s++)
777 for (
int _v = 0;
_v < 1;
_v++)
804 return treey(parent) + 4./(1 << 2*(
level - 1));
811 for (
int _c = 0;
_c < 4;
_c++)
834 for (
int _n = 0;
_n < 1;
_n++)
#define boundary_iterate(type,...)
void(* boundary_face)(vectorl)
define double double char flags
void(* boundary_level)(scalar *, int l)
vector cartesian_init_face_vector(vector v, const char *name)
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(* init_vector)(vector, const char *)
scalar(* init_vertex_scalar)(scalar, const char *)
vector * vectors_add(vector *list, vector v)
scalar * list_concat(scalar *l1, scalar *l2)
scalar * list_add(scalar *list, scalar s)
tensor(* init_tensor)(tensor, const char *)
scalar * list_copy(scalar *l)
vector(* init_face_vector)(vector, const char *)
scalar * list_append(scalar *list, scalar s)
scalar(* init_scalar)(scalar, const char *)
*cs[i, 0, 0] a *[i -1, 0, 0] j
macro2 foreach_cell_all()
macro
We also redefine the "per field" (inner) traversal.
static scalar multigrid_init_scalar(scalar s, const char *name)
static trace void multigrid_restriction(scalar *list)
static vector multigrid_init_vector(vector v, const char *name)
static scalar multigrid_init_vertex_scalar(scalar s, const char *name)
void(* restriction)(Point, scalar)
static void restriction_face(Point point, scalar s)
static void restriction_average(Point point, scalar s)
static tensor multigrid_init_tensor(tensor t, const char *name)
static void restriction_vertex(Point point, scalar s)
static void no_restriction(Point point, scalar s)
define is_active() cell(true) @define is_leaf(cell)(point.level
static scalar tree_init_scalar(scalar s, const char *name)
static scalar tree_init_vertex_scalar(scalar s, const char *name)
static tensor tree_init_tensor(tensor t, const char *name)
void refine_face_solenoidal(Point point, scalar s)
static void prolongation_vertex(Point point, scalar s)
void mpi_boundary_refine(scalar *)
static scalar * list_add_depend(scalar *list, scalar s)
void coarsen_cell_recursive(Point point, scalar *list)
void mpi_boundary_update(scalar *)
bool coarsen_cell(Point point, scalar *list)
static trace void tree_boundary_level(scalar *list, int l)
#define periodic_clamp(a, level)
void mpi_boundary_coarsen(int, int)
void refine_face(Point point, scalar s)
double treey(Point point)
static void refine_level(int depth)
static vector tree_init_vector(vector v, const char *name)
int refine_cell(Point point, scalar *list, int flag, Cache *refined)
void output_tree(FILE *fp)
trace astats adapt_wavelet(scalar *slist, double *max, int maxlevel, int minlevel=1, scalar *list=all)
static vector tree_init_face_vector(vector v, const char *name)
static trace void halo_face(vectorl vl)
macro unrefine(bool cond)
double treex(Point point)
static trace void tree_restriction(scalar *list)
static void tree_setup_vector(vector v)
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
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)
#define is_prolongation(cell)
#define foreach_halo(type, l)
void decrement_neighbors(Point point)
static void cache_append(Cache *c, Point p, unsigned short flags)
void increment_neighbors(Point point)
#define is_boundary(cell)