55 for (
int l = 0;
l <= rcv->
depth;
l++)
75 for (
int i = 0;
i <= rcv->
depth;
i++)
93 for (
i = 0;
i <
p->npid;
i++)
94 if (pid ==
p->rcv[
i].pid)
99 Rcv * rcv = &
p->rcv[
p->npid-1];
117 for (
int i = 0;
i <
p->npid;
i++) {
118 int pid =
p->rcv[
i].pid,
j, *
a;
122 if (
j ==
pids->len/
sizeof(
int))
129 for (
int i = 0;
i <
p->npid;
i++) {
130 Rcv * rcv = &
p->rcv[
i];
141 for (
int i = 0;
i <
p->npid;
i++)
147 for (
int i = 0;
i <
p->npid;
i++)
156#define BOUNDARY_TAG(level) (level)
157#define COARSEN_TAG(level) ((level) + 64)
158#define REFINE_TAG() (128)
159#define MOVED_TAG() (256)
166 double *
b = rcv->
buf;
168 for (
int _s = 0;
_s < 1;
_s++) {
169 memcpy (&
s[],
b,
sizeof(
double)*
s.block);
172 for (
int _v = 0;
_v < 1;
_v++)
174 memcpy (&
v.x[],
b,
sizeof(
double)*
v.x.block);
177 memcpy (&
v.x[1],
b,
sizeof(
double)*
v.x.block);
180 for (
int _s = 0;
_s < 1;
_s++) {
181 for (
int i = 0;
i <= 1;
i++)
182 for (
int j = 0;
j <= 1;
j++)
184 for (
int k = 0;
k <= 1;
k++) {
198 size_t size =
b - (
double *) rcv->
buf;
206 "rlen (%d) != size (%ld), %d receiving from %d at level %d\n"
207 "Calling debug_mpi(NULL)...\n"
225 "ERROR MPI_Recv \"%s\" (count = %d, source = %d, tag = %d):\n"
227 "Calling debug_mpi(NULL)...\n"
263 its.it_value.tv_sec = 10;
264 its.it_value.tv_nsec = 0;
265 its.it_interval.tv_sec = 0;
266 its.it_interval.tv_nsec = 0;
277 "ERROR MPI_Recv \"%s\" (count = %d, source = %d, tag = %d):\n%s\n"
278 "Calling debug_mpi(NULL)...\n"
301 for (
int _s = 0;
_s < 1;
_s++)
308 for (
int _v = 0;
_v < 1;
_v++)
327 for (
int i = 0;
i <
m->npid;
i++) {
328 Rcv * rcv = &
m->rcv[
i];
333 fprintf (
stderr,
"%s receiving %d doubles from %d level %d\n",
371 for (
int i = 0;
i <
m->npid;
i++)
387 for (
int i = 0;
i <
m->npid;
i++) {
388 Rcv * rcv = &
m->rcv[
i];
392 double *
b = rcv->
buf;
394 for (
int _s = 0;
_s < 1;
_s++) {
395 memcpy (
b, &
s[],
sizeof(
double)*
s.block);
398 for (
int _v = 0;
_v < 1;
_v++)
400 memcpy (
b, &
v.x[],
sizeof(
double)*
v.x.block);
403 memcpy (
b, &
v.x[1],
sizeof(
double)*
v.x.block);
408 for (
int _s = 0;
_s < 1;
_s++) {
409 for (
int i = 0;
i <= 1;
i++)
410 for (
int j = 0;
j <= 1;
j++)
412 for (
int k = 0;
k <= 1;
k++) {
448 for (
int _s = 0;
_s < 1;
_s++)
557 sprintf (name,
"mpi-level-root-rcv-%d", pid());
remove (name);
558 sprintf (name,
"mpi-level-root-snd-%d", pid());
remove (name);
559 sprintf (name,
"mpi-restriction-rcv-%d", pid());
remove (name);
560 sprintf (name,
"mpi-restriction-snd-%d", pid());
remove (name);
571 for (
int _c = 0;
_c < 4;
_c++)
597 for (
int _n = 0;
_n < 1;
_n++)
669 fprintf (
fp,
"======= mpi_level.snd ======\n");
671 for (
int i = 0;
i < snd->
npid;
i++)
673 fprintf (
fp,
"======= mpi_level.rcv ======\n");
675 for (
int i = 0;
i < snd->
npid;
i++)
681 for (
int _i = 0;
_i < 1;
_i++)
689 char name[
strlen(
p->rcv->name) + 1];
701 for (
int _c = 0;
_c < 4;
_c++)
724#define is_remote(cell) (cell.pid >= 0 && cell.pid != pid())
739 for (
int _n = 0;
_n < 1;
_n++) {
744 for (
int _c = 0;
_c < 4;
_c++)
751 for (
int _n = 0;
_n < 1;
_n++) {
755 for (
int _c = 0;
_c < 4;
_c++)
764 for (
int _c = 0;
_c < 4;
_c++)
778 for (
int i = 0;
i <
npe();
i++)
780 for (
int i = 0;
i <
m->npid;
i++) {
781 Rcv * rcv = &
m->rcv[
i];
789 int maxlevel =
depth();
792 for (
int l = 0;
l <= maxlevel;
l++) {
807 for (
int i = 0;
i <
npe();
i++)
809 for (
int i = 0;
i <
npe();
i++)
810 for (
int j = 0;
j <
npe();
j++)
811 if (send[
i][
j] != receive[
j][
i]) {
813 name,
i, send[
i][
j],
j,
l);
815 name,
j, receive[
j][
i],
i,
l);
817 for (
int k =
i - 2;
k <=
i + 2;
k++)
818 if (
k >= 0 &&
k <
npe())
820 for (
int k =
j - 2;
k <=
j + 2;
k++)
821 if (
k >= 0 &&
k <
npe())
839 "check_snd_rcv_matrix \"%s\" failed\n"
840 "Calling debug_mpi(NULL)...\n"
853 for (
int _c = 0;
_c < 4;
_c++)
868 SndRcv * mpi_level = &
m->mpi_level;
869 SndRcv * mpi_level_root = &
m->mpi_level_root;
876 static const unsigned short used = 1 <<
user;
884 if (
cell.neighbors) {
889 for (
int _c = 0;
_c < 4;
_c++)
891 for (
int i = 0, *
p = (
int *)
pids.p;
i <
n;
i++,
p++)
900 for (
int _n = 0;
_n < 1;
_n++)
909 for (
int _n = 0;
_n < 1;
_n++)
914 for (
int _c = 0;
_c < 4;
_c++)
927 for (
int _n = 0;
_n < ;
_n++)
928 for (
int i = 0, *
p = (
int *)
pids.p;
i <
n;
i++,
p++)
932 for (
int i = 0, *
p = (
int *)
pids.p;
i <
n;
i++,
p++)
940 for (
int _c = 0;
_c < 4;
_c++)
946 for (
int _n = 0;
_n < ;
_n++)
966 for (
int i = 0, *
p = (
int *)
pids.p;
i <
n;
i++,
p++)
983 static const unsigned short keep = 1 << (
user + 1);
996 m->send->len =
m->receive->len = 0;
1031 int len =
tree->refined.n;
1047 "mpi_boundary_refine (len)");
1053 "mpi_boundary_refine (p)");
1054 Cache refined = {
p, len, len};
1055 for (
int _i = 0;
_i < 1;
_i++)
1058 bool neighbors =
false;
1059 for (
int _n = 0;
_n < ;
_n++)
1061 neighbors =
true;
break;
1086 for (
int _s = 0;
_s < 1;
_s++)
1100 for (
int l = 0;
l <=
depth();
l++) {
1102 fprintf (
fp,
"Layer level = %d, nc = %d, len = %d\n",
l, L->
nc, L->
len);
1103 for (
int i = 0;
i < L->
len;
i++)
1106 *((
int *)(((
char *)L->
m[
i]) + L->
len*
sizeof(
char *))));
1107 for (
int j = 0;
j < L->
len;
j++)
1111 X0 + (
i - 1.5)*
L0/(1 <<
l),
Y0 + (
j - 1.5)*
L0/(1 <<
l),
1129#define REMOTE() ((Remote *)&val(remote,0))
1149 REMOTE()->refined =
true;
1166 for (
int _c = 0;
_c < 4;
_c++)
1205 for (
int _n = 0;
_n < ;
_n++) {
1211 for (
int _c = 0;
_c < 4;
_c++)
1225 if (
cell.neighbors) {
1226 for (
int _c = 0;
_c < 4;
_c++)
1235 for (
int _c = 0;
_c < 4;
_c++)
1270 if (
cell.neighbors > 0) {
1272 for (
int _c = 0;
_c < 4;
_c++)
1281 for (
int _c = 0;
_c < 4;
_c++)
1304 static const unsigned short set = 1 <<
user;
1313 for (
int _s = 0;
_s < 1;
_s++) {
1315 if (
fread (&
val,
sizeof(
double), 1,
fp) != 1) {
1351 for (
int _s = 0;
_s < 1;
_s++) {
1353 if (
fread (&
val,
sizeof(
double), 1,
fp) != 1) {
1363 for (
int _c = 0;
_c < 4;
_c++)
1369 for (
int _n = 0;
_n < 1;
_n++)
1391 if (
cell.neighbors > 0) {
1393 for (
int _c = 0;
_c < 4;
_c++)
1401 for (
int _c = 0;
_c < 4;
_c++)
1414 for (
int _s = 0;
_s < 1;
_s++)
1464 for (
int _l = 0;
_l < 0;
_l++)
1466 for (
int l = 0;
l <
depth();
l++) {
1473 for (
int _c = 0;
_c < 4;
_c++)
1480 for (
int _c = 0;
_c < 4;
_c++)
1486 for (
int _c = 0;
_c < 4;
_c++) {
void array_free(Array *a)
void * array_append(Array *a, void *elem, size_t size)
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 mpi_boundary_update(scalar *list)
#define boundary_iterate(type,...)
void add_boundary(Boundary *b)
define double double char flags
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)
scalar * list_concat(scalar *l1, scalar *l2)
scalar * list_add(scalar *list, scalar s)
void matrix_free(void *m)
int list_len(scalar *list)
void * matrix_new(int n, int=(type *) realloc(p,(size) *sizeof(type)) p=(type *) realloc(p,(size) *sizeof(type)), size_t size)
scalar * list_append(scalar *list, scalar s)
#define qcalloc(size, type)
#define qmalloc(size, type)
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
*cs[i, 0, 0] a *[i -1, 0, 0] j
macro2 foreach_cell_all()
macro2 foreach_cell_post(bool condition)
void(* restriction)(Point, scalar)
static void restriction_vertex(Point point, scalar s)
void subtree_size(scalar size, bool leaves)
define is_active() cell(true) @define is_leaf(cell)(point.level
static void set_dirty_stencil(scalar s)
void(* destroy)(Boundary *b)
void(* restriction)(const Boundary *b, scalar *list, int l)
void(* level)(const Boundary *b, scalar *list, int l)
void coarsen_cell_recursive(Point point, scalar *list)
bool coarsen_cell(Point point, scalar *list)
int refine_cell(Point point, scalar *list, int flag, Cache *refined)
static Boundary * mpi_boundary
static void rcv_pid_sync(SndRcv *m, scalar *list, int l)
static void rcv_pid_receive(RcvPid *m, scalar *list, scalar *listv, vector *listf, int l)
static int locals_pids(Point point, Array *pids)
static void snd_rcv_init(SndRcv *m, const char *name)
static void rcv_pid_print(RcvPid *p, FILE *fp, const char *prefix)
static void check_depth()
trace void mpi_boundary_update_buffers()
static void cache_level_init(CacheLevel *c)
trace void mpi_boundary_refine(scalar *list)
static void rcv_pid_append(RcvPid *p, int pid, Point point)
static bool is_local_prolongation(Point point, Point p)
static trace void mpi_boundary_level(const Boundary *b, scalar *list, int l)
trace void mpi_boundary_coarsen(int l, int too_fine)
static void append_pid(Array *pids, int pid)
#define BOUNDARY_TAG(level)
static void rcv_destroy(Rcv *rcv)
static void rcv_pid_destroy(RcvPid *p)
static Rcv * rcv_pid_pointer(RcvPid *p, int pid)
static RcvPid * rcv_pid_new(const char *name)
static trace void rcv_pid_wait(RcvPid *m)
void debug_mpi(FILE *fp1)
static int list_lenb(scalar *list)
static void rcv_pid_send(RcvPid *m, scalar *list, scalar *listv, vector *listf, int l)
void check_snd_rcv_matrix(SndRcv *sndrcv, const char *name)
void rcv_pid_write(RcvPid *p, const char *name)
trace void mpi_partitioning()
static void mpi_boundary_destroy(Boundary *b)
static void apply_bc(Rcv *rcv, scalar *list, scalar *listv, vector *listf, int l, MPI_Status s)
static void snd_rcv_destroy(SndRcv *m)
static int vectors_lenb(vector *list)
static void mpi_recv_check(void *buf, int count, MPI_Datatype datatype, int source, int tag, MPI_Comm comm, MPI_Status *status, const char *name)
static bool has_local_child(Point point)
static FILE * fopen_prefix(FILE *fp, const char *name, char *prefix)
static void flag_border_cells()
static trace void mpi_boundary_restriction(const Boundary *b, scalar *list, int l)
static bool is_root(Point point)
void restore_mpi(FILE *fp, scalar *list1)
static void snd_rcv_free(SndRcv *p)
static int balanced_pid(long index, long nt, int nproc)
void rcv_print(Rcv *rcv, FILE *fp, const char *prefix)
static void rcv_pid_row(RcvPid *m, int l, int *row)
trace double z_indexing(scalar index, bool leaves)
static trace int mpi_waitany(int count, MPI_Request array_of_requests[], int *indx, MPI_Status *status)
static int root_pids(Point point, Array *pids)
static void rcv_pid_append_pids(RcvPid *p, Array *pids)
static void rcv_append(Point point, Rcv *rcv)
static void rcv_free_buf(Rcv *rcv)
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 cache_level_append(CacheLevel *c, Point p)
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 foreach_halo(type, l)
foreach_cache_level(_boundary, _l, reductions)