10# define GRIDNAME "Multigrid"
22# define ND(i) ((size_t)(1 << point.level))
24# define ND(i) ((size_t)(1 << point.level)*((int *)&Dimensions)[i])
27#define _I (point.i - GHOSTS)
28#define _J (point.j - GHOSTS)
29#define _K (point.k - GHOSTS)
32#define _DELTA (1./((1 << point.level)*Dimensions_scale))
52 struct {
int x,
y; }
n;
54 struct {
int x,
y,
z; }
n;
69#define multigrid ((Multigrid *)grid)
70#define CELL(m,level,i) (*((Cell *) &m[level][(i)*datasize]))
225# define SET_DIMENSIONS() point.n.x = 1 << point.level
227# define SET_DIMENSIONS() point.n.x = point.n.y = 1 << point.level
229# define SET_DIMENSIONS() point.n.x = point.n.y = point.n.z = 1 << point.level
233# define SET_DIMENSIONS() point.n.x = (1 << point.level)*Dimensions.x
235# define SET_DIMENSIONS() \
236 point.n.x = (1 << point.level)*Dimensions.x, \
237 point.n.y = (1 << point.level)*Dimensions.y
239# define SET_DIMENSIONS() \
240 point.n.x = (1 << point.level)*Dimensions.x, \
241 point.n.y = (1 << point.level)*Dimensions.y, \
242 point.n.z = (1 << point.level)*Dimensions.z
301 const char *
order =
"xyz")
340 for (
int _k = 0;
_k < 2;
_k++) {
352#define foreach_edge() for (int _i = 0; _i < _N; _i++)
374 for (
int _k = 0;
_k < 2;
_k++)
375 for (
int _l = 0;
_l < 2;
_l++) {
416 for (
int _l = 0;
_l < 2;
_l++)
417 for (
int _m = 0;
_m < 2;
_m++)
418 for (
int _n = 0;
_n < 2;
_n++) {
442 for (
int _s = 0;
_s < 1;
_s++)
444 for (
int b = 0;
b <
s.block;
b++) {
547 else if (
d ==
back) {
599 for (
int _s = 0;
_s < 1;
_s++)
602 s.boundary[
d] =
s.boundary_homogeneous[
d] =
NULL;
603 else if (
s.face &&
s.v.x.
i >= 0) {
605 v.x.boundary[
d] =
v.x.boundary_homogeneous[
d] =
NULL;
612 for (
int _s = 0;
_s < 1;
_s++)
619 while ((&
s.v.x)[
j].i !=
s.
i)
j++;
637 s[(
ig + 1)/2,(
jg + 1)/2,(
kg + 1)/2] =
667 for (
int _s = 0;
_s < 1;
_s++)
675 for (
int _s = 0;
_s < 1;
_s++)
676 for (
int b = 0;
b <
s.block;
b++) {
679 for (
int _n = 0;
_n < ;
_n++)
690 for (
int _s = 0;
_s < 1;
_s++)
691 for (
int b = 0;
b <
s.block;
b++) {
696 for (
int _s = 0;
_s < 1;
_s++)
697 for (
int b = 0;
b <
s.block;
b++) {
727 for (
int _s = 0;
_s < 1;
_s++)
728 for (
int b = 0;
b <
s.block;
b++) {
731 for (
int _n = 0;
_n < ;
_n++)
747 for (
int _s = 0;
_s < 1;
_s++)
748 for (
int b = 0;
b <
s.block;
b++) {
753 for (
int _s = 0;
_s < 1;
_s++)
754 for (
int b = 0;
b <
s.block;
b++) {
765 for (
int _s = 0;
_s < 1;
_s++)
766 for (
int b = 0;
b <
s.block;
b++) {
771 for (
int _s = 0;
_s < 1;
_s++)
772 for (
int b = 0;
b <
s.block;
b++) {
804 return (1 << r) <
n ? r + 1 : r;
839 for (
int l = 0;
l <=
depth() + 1;
l++) {
864#define _I (point.i - GHOSTS + mpi_coords[0]*(1 << point.level))
865#define _J (point.j - GHOSTS + mpi_coords[1]*(1 << point.level))
866#define _K (point.k - GHOSTS + mpi_coords[2]*(1 << point.level))
940 if (
nx != 0 ||
ny != 0 ||
nz != 0) {
956#define for (int _i = 0; _i < _N; _i++) foreach_cell_restore()
vector q[]
The primitive variables are the momentum , pressure , density , (face) specific volume ,...
void add_boundary(Boundary *b)
BoundaryFunc default_scalar_bc[]
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.
static void periodic_boundary_level_x(const Boundary *b, scalar *list, int l)
define neighbor(o, p, q)((Point)
macro1 is_face_y(Point p=point)
if TRASH undef trash define trash(list) reset(list
macro2 foreach_face_generic(char flags=0, Reduce reductions=None, const char *order="xyz")
macro2 foreach_boundary_dir(int l, int d)
static _Attributes * _attribute
scalar * list_add(scalar *list, scalar s)
scalar * list_append(scalar *list, scalar s)
static bool is_vertex_scalar(scalar s)
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)
*cs[i, 0, 0] a *[i -1, 0, 0] j
#define realloc_scalar(size)
macro
We also redefine the "per field" (inner) traversal.
Point locate(double xp=0, double yp=0, double zp=0)
define is_active() cell(true) @define is_leaf(cell)(point.level
undef val def val(a, k, l, m)(((real *)((Multigrid *) grid) -> d)[point.j+(l)+(point.i+(k)) *(((size_t)(1<< point.level) *((int *)&Dimensions)[1])+2 *2)+((Multigrid *) grid) ->shift[point.level]+_index(a, m) *((Multigrid *) grid) ->shift[depth()+1]]) @ @define allocated(...) true @def allocated_child(k, l, m)(level< depth() &&point.i > 0 &&point.i<=((size_t)(1<< point.level) *((int *)&Dimensions)[0])+2 &&point.j > 0 &&point.j<=((size_t)(1<< point.level) *((int *)&Dimensions)[1])+2) @ @define depth()(grid->depth) @def fine(a, k, l, m)(((real *)((Multigrid *) grid) ->d)[2 *point.j - 2+(l)+(2 *point.i - 2+(k)) *(((size_t)(1<< point.level) *((int *)&Dimensions)[1]) *2+2 *2)+((Multigrid *) grid) ->shift[point.level+1]+_index(a, m) *((Multigrid *) grid) ->shift[depth()+1]]) @ @def coarse(a, k, l, m)(((real *)((Multigrid *) grid) ->d)[(point.j+2)/2+(l)+((point.i+2)/2+(k)) *(((size_t)(1<< point.level) *((int *)&Dimensions)[1])/2+2 *2)+((Multigrid *) grid) ->shift[point.level - 1]+_index(a, m) *((Multigrid *) grid) ->shift[depth()+1]]) @ macro POINT_VARIABLES(Point point=point)
undef VT void free_grid(void)
#define for
Similarly, on trees we need prolongation functions which also follow this definition.
static double periodic_bc(Point point, Point neighbor, scalar s, bool *data)
define VT _attribute[s.i] v y scalar * list
define neighborp(k, l, o) neighbor(k
define static o void box_boundary_level(const Boundary *b, scalar *scalars, int l)
int refine_cell(Point point, scalar *list, int flag, Cache *refined)
define n n define coarse(a, k, p, n)((double *)(PARENT(k
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 n n define n n macro POINT_VARIABLES(Point point=point)
macro1 foreach_child(Point point=point, break=(_k=_l=2))
#define is_boundary(cell)
macro VARIABLES(Point point=point, int _ig=ig, int _jg=jg, int _kg=kg)