Nek5000
SEM for Incompressible NS
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
sarray_transfer_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 "sort.h"
12 #include "sarray_sort.h"
13 #include "crystal.h"
14 #include "sarray_transfer.h"
15 
16 typedef struct {
17  double d;
18  ulong l,l2;
21 } r_work;
22 
23 int main(int narg, char *arg[])
24 {
25  comm_ext world; int np;
26  struct comm comm;
27  struct crystal crystal;
28  struct array A, A0=null_array; r_work *row, *row_0;
29  uint i;
30 #ifdef MPI
31  MPI_Init(&narg,&arg);
32  world = MPI_COMM_WORLD;
33  MPI_Comm_size(world,&np);
34 #else
35  world=0, np=1;
36 #endif
37 
38  comm_init(&comm,world);
39  crystal_init(&crystal,&comm);
40 
41  array_init(r_work,&A,np*3), A.n=np*3, row=A.ptr;
42  for(i=0;i<A.n;++i) {
43  row[i].i = rand();
44  row[i].l = row[i].l2 = rand();
45  row[i].p = rand()%np;
46  row[i].d = rand()/(double)rand();
47  }
48 
49  sarray_sort_3(r_work,row,A.n, i,0, l,1, p,0, &crystal.data);
50 
51  for(i=0;i<A.n;++i)
52  printf("%02d send -> %02d: %08x %08x %d %g\n",
53  (int)comm.id,(int)row[i].p,(int)row[i].i,
54  (int)row[i].l,(int)row[i].p,row[i].d);
55 
56  array_cat(r_work,&A0, row,A.n);
57 
58  sarray_transfer(r_work,&A, p,1, &crystal);
59 
60  row=A.ptr;
61  for(i=0;i<A.n;++i)
62  printf("%02d recv <- %02d: %08x %08x %d %g\n",
63  (int)comm.id,(int)row[i].p,(int)row[i].i,
64  (int)row[i].l,(int)row[i].p,row[i].d);
65 
66  sarray_transfer(r_work,&A, p,1, &crystal);
67  sarray_sort_3(r_work,row,A.n, i,0, l,1, p,0, &crystal.data);
68  if(A.n!=A0.n)
69  fail(1,__FILE__,__LINE__,"final array has different length than original");
70  row=A.ptr, row_0=A0.ptr;
71  for(i=0;i<A.n;++i)
72  if( row[i].d != row_0[i].d
73  || row[i].l != row_0[i].l
74  || row[i].l2!= row_0[i].l2
75  || row[i].i != row_0[i].i
76  || row[i].p != row_0[i].p)
77  fail(1,__FILE__,__LINE__,"final array differs from original");
78 
79  array_free(&A0);
80  array_free(&A);
81  crystal_free(&crystal);
82 
83  fflush(stdout); comm_barrier(&comm);
84  if(comm.id==0) printf("tests passed\n"), fflush(stdout);
85 
86  comm_free(&comm);
87 
88 #ifdef MPI
89  MPI_Finalize();
90 #endif
91 
92  return 0;
93 }
static void comm_barrier(const struct comm *c)
Definition: comm.h:192
#define uint
Definition: types.h:70
size_t n
Definition: mem.h:111
#define sarray_sort_3(T, A, n, field1, is_long1, field2, is_long2, field3, is_long3, buf)
Definition: sarray_sort.h:66
#define crystal_free
Definition: crystal.c:47
#define crystal_init
Definition: crystal.c:46
Definition: comm.h:85
static void comm_free(struct comm *c)
Definition: comm.h:176
buffer data
Definition: crystal.c:52
int main(int narg, char *arg[])
p
Definition: xxt_test2.m:1
int comm_ext
Definition: comm.h:69
Definition: mem.h:111
#define ulong
Definition: types.h:75
#define array_init(T, a, max)
Definition: mem.h:136
#define array_cat(T, d, s, n)
Definition: mem.h:148
for i
Definition: xxt_test.m:74
#define null_array
Definition: mem.h:112
void * ptr
Definition: mem.h:111
#define array_free(a)
Definition: mem.h:135
uint id
Definition: comm.h:86
#define sarray_transfer(T, A, proc_field, set_src, cr)
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 fail(int status, const char *file, unsigned line, const char *fmt,...)
Definition: fail.c:47