Nek5000
SEM for Incompressible NS
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
crystal_test.c
Go to the documentation of this file.
1 #include <stddef.h>
2 #include <stdlib.h>
3 #include <stdio.h>
4 #include <string.h>
5 #include "c99.h"
6 #include "name.h"
7 #include "fail.h"
8 #include "types.h"
9 #include "comm.h"
10 #include "mem.h"
11 #include "crystal.h"
12 
13 int main(int narg, char *arg[])
14 {
15  comm_ext world; int np;
16  struct comm comm;
17  struct crystal cr;
18  uint i,sum, *data, *end;
19 #ifdef MPI
20  MPI_Init(&narg,&arg);
21  world = MPI_COMM_WORLD;
22  MPI_Comm_size(world,&np);
23 #else
24  world=0, np=1;
25 #endif
26 
27  comm_init(&comm,world);
28 
29  crystal_init(&cr,&comm);
30 
31  cr.data.n = (4+(comm.id&1))*comm.np;
32  buffer_reserve(&cr.data,cr.data.n*sizeof(uint));
33  data = cr.data.ptr;
34  for(i=0;i<comm.np;++i, data+=3+data[2]) {
35  data[0] = i, data[1] = comm.id, data[2] = 1;
36  data[3] = 2*comm.id;
37  if(comm.id&1) data[2] = 2, data[4] = data[3]+1;
38  }
39 
40 #if 0
41  data = cr.data.ptr, end = data + cr.data.n;
42  for(;data!=end; data+=3+data[2]) {
43  uint i;
44  printf("%u -> %u:",data[1],data[0]);
45  for(i=0;i<data[2];++i) printf(" %u",data[3+i]);
46  printf("\n");
47  }
48 #endif
49 
50  crystal_router(&cr);
51 
52 #if 0
53  printf("\n");
54  data = cr.data.ptr, end = data + cr.data.n;
55  for(;data!=end; data+=3+data[2]) {
56  uint i;
57  printf("%u <- %u:",data[0],data[1]);
58  for(i=0;i<data[2];++i) printf(" %u",data[3+i]);
59  printf("\n");
60  }
61 #endif
62 
63  if(cr.data.n != comm.np*4 + (comm.np/2))
64  fail(1,__FILE__,__LINE__,"failure on %u",comm.id);
65  sum = 0;
66  data = cr.data.ptr, end = data + cr.data.n;
67  for(;data!=end; data+=3+data[2]) {
68  sum+=data[1];
69  if(data[3]!=data[1]*2)
70  fail(1,__FILE__,__LINE__,"failure on %u",comm.id);
71  if(data[1]&1 && (data[2]!=2 || data[4]!=data[3]+1))
72  fail(1,__FILE__,__LINE__,"failure on %u",comm.id);
73  }
74  if(sum != comm.np*(comm.np-1)/2)
75  fail(1,__FILE__,__LINE__,"failure on %u",comm.id);
76 
77  crystal_free(&cr);
78  comm_free(&comm);
79 
80  diagnostic("",__FILE__,__LINE__,
81  "test successful %u/%u",(unsigned)comm.id,(unsigned)comm.np);
82 
83 #ifdef MPI
84  MPI_Finalize();
85 #endif
86 
87  return 0;
88 }
#define uint
Definition: types.h:70
static double sum(struct xxt *data, double v, uint n, uint tag)
Definition: xxt.c:400
size_t n
Definition: mem.h:111
#define crystal_router
Definition: crystal.c:48
#define crystal_free
Definition: crystal.c:47
#define crystal_init
Definition: crystal.c:46
int main(int narg, char *arg[])
Definition: crystal_test.c:13
Definition: comm.h:85
static void comm_free(struct comm *c)
Definition: comm.h:176
buffer data
Definition: crystal.c:52
#define buffer_reserve(b, max)
Definition: mem.h:157
int comm_ext
Definition: comm.h:69
uint np
Definition: comm.h:86
for i
Definition: xxt_test.m:74
void * ptr
Definition: mem.h:111
uint id
Definition: comm.h:86
establishes some macros to establish naming conventions
static uint np
Definition: findpts_test.c:63
static void comm_init(struct comm *c, comm_ext ce)
Definition: comm.h:133
void diagnostic(const char *prefix, const char *file, unsigned line, const char *fmt,...)
Definition: fail.c:32
void fail(int status, const char *file, unsigned line, const char *fmt,...)
Definition: fail.c:47