Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Fix HAVE_FOOBAR flags handling
[simgrid.git] / teshsuite / smpi / mpich3-test / datatype / struct-verydeep.c
1 /* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
2 /*
3  *  (C) 2009 by Argonne National Laboratory.
4  *      See COPYRIGHT in top-level directory.
5  */
6 /* Regression test for MPICH trac ticket #972, originally written by
7  * Rob Latham <robl@mcs.anl.gov> as a simplification of a type
8  * encountered by the HDF5 library.
9  *
10  * Should be run with 1 process. */
11
12 #include <stdio.h>
13 #include "mpi.h"
14
15 /* uncomment to use debugging routine in MPICH
16 extern int MPIDU_Datatype_debug(MPI_Datatype type, int depth);
17 */
18
19 int makeHDF5type0(MPI_Datatype *type);
20 int makeHDF5type0(MPI_Datatype *type)
21 {
22     MPI_Datatype ctg, vect, structype, vec2, structype2,
23                  vec3, structype3, vec4, structype4, vec5;
24
25     int b[3];
26     MPI_Aint d[3];
27     MPI_Datatype t[3];
28
29     MPI_Type_contiguous(4, MPI_BYTE, &ctg);
30
31     MPI_Type_vector(1, 5, 1, ctg, &vect);
32
33     b[0] =         b[1] =       b[2] = 1;
34     d[0] = 0;      d[1] = 0;    d[2] = 40;
35     t[0] = MPI_LB; t[1] = vect; t[2] = MPI_UB;
36     MPI_Type_create_struct(3, b, d, t, &structype);
37
38     MPI_Type_vector(1, 5, 1, structype, &vec2);
39
40     b[0] =         b[1] =        b[2] = 1;
41     d[0] = 0;      d[1] = 2000;  d[2] = 400;
42     t[0] = MPI_LB; t[1] = vec2;  t[2] = MPI_UB;
43     MPI_Type_create_struct(3, b, d, t, &structype2);
44
45     MPI_Type_vector(1, 5, 1, structype2, &vec3);
46
47     b[0] =         b[1] =        b[2] = 1;
48     d[0] = 0;      d[1] = 0;     d[2] = 4000;
49     t[0] = MPI_LB; t[1] = vec3;  t[2] = MPI_UB;
50     MPI_Type_create_struct(3, b, d, t, &structype3);
51
52     MPI_Type_vector(1, 5, 1, structype3, &vec4);
53
54     b[0] =         b[1] =        b[2] = 1;
55     d[0] = 0;      d[1] = 0;     d[2] = 40000;
56     t[0] = MPI_LB; t[1] = vec4;  t[2] = MPI_UB;
57     MPI_Type_create_struct(3, b, d, t, &structype4);
58
59     MPI_Type_vector(1, 1, 1, structype4, &vec5);
60
61     b[0] =         b[1] =         b[2] = 1;
62     d[0] = 0;      d[1] = 160000; d[2] = 200000;
63     t[0] = MPI_LB; t[1] = vec5;   t[2] = MPI_UB;
64     MPI_Type_create_struct(3, b, d, t, type);
65
66     MPI_Type_free(&ctg);
67     MPI_Type_free(&vect);
68     MPI_Type_free(&structype);
69     MPI_Type_free(&vec2);
70     MPI_Type_free(&structype2);
71     MPI_Type_free(&vec3);
72     MPI_Type_free(&structype3);
73     MPI_Type_free(&vec4);
74     MPI_Type_free(&structype4);
75     MPI_Type_free(&vec5);
76     MPI_Type_commit(type);
77
78     return 0;
79 }
80
81 int makeHDF5type1(MPI_Datatype *type);
82 int makeHDF5type1(MPI_Datatype *type)
83 {
84     MPI_Datatype ctg, vect, structype, vec2, structype2,
85                  vec3, structype3, vec4, structype4, vec5;
86
87     int b[3];
88     MPI_Aint d[3];
89     MPI_Datatype t[3];
90
91     MPI_Type_contiguous(4, MPI_BYTE, &ctg);
92
93     MPI_Type_vector(1, 5, 1, ctg, &vect);
94
95     b[0] =         b[1] =       b[2] = 1;
96     d[0] = 0;      d[1] = 20;    d[2] = 40;
97     t[0] = MPI_LB; t[1] = vect; t[2] = MPI_UB;
98     MPI_Type_create_struct(3, b, d, t, &structype);
99
100     MPI_Type_vector(1, 5, 1, structype, &vec2);
101
102     b[0] =         b[1] =        b[2] = 1;
103     d[0] = 0;      d[1] = 0;     d[2] = 400;
104     t[0] = MPI_LB; t[1] = vec2; t[2] = MPI_UB;
105     MPI_Type_create_struct(3, b, d, t, &structype2);
106
107     MPI_Type_vector(1, 5, 1, structype2, &vec3);
108
109     b[0] =         b[1] =        b[2] = 1;
110     d[0] = 0;      d[1] = 0;     d[2] = 4000;
111     t[0] = MPI_LB; t[1] = vec3; t[2] = MPI_UB;
112     MPI_Type_create_struct(3, b, d, t, &structype3);
113
114     MPI_Type_vector(1, 5, 1, structype3, &vec4);
115
116     b[0] =         b[1] =        b[2] = 1;
117     d[0] = 0;      d[1] = 0;     d[2] = 40000;
118     t[0] = MPI_LB; t[1] = vec4; t[2] = MPI_UB;
119     MPI_Type_create_struct(3, b, d, t, &structype4);
120
121     MPI_Type_vector(1, 1, 1, structype4, &vec5);
122
123     b[0] =         b[1] =         b[2] = 1;
124     d[0] = 0;      d[1] = 160000; d[2] = 200000;
125     t[0] = MPI_LB; t[1] = vec5; t[2] = MPI_UB;
126     MPI_Type_create_struct(3, b, d, t, type);
127
128     MPI_Type_free(&ctg);
129     MPI_Type_free(&vect);
130     MPI_Type_free(&structype);
131     MPI_Type_free(&vec2);
132     MPI_Type_free(&structype2);
133     MPI_Type_free(&vec3);
134     MPI_Type_free(&structype3);
135     MPI_Type_free(&vec4);
136     MPI_Type_free(&structype4);
137     MPI_Type_free(&vec5);
138     MPI_Type_commit(type);
139
140     return 0;
141 }
142
143 int makeHDF5type(MPI_Datatype *type);
144 int makeHDF5type(MPI_Datatype *type)
145 {
146     int i;
147
148 #define NTYPES 2
149
150     int blocklens[NTYPES];
151     MPI_Aint disps[NTYPES];
152
153     MPI_Datatype types[NTYPES];
154     makeHDF5type0(&(types[0]));
155     makeHDF5type1(&(types[1]));
156
157     for (i=0; i< NTYPES; i++) {
158         blocklens[i] = 1;
159         disps[i] = 0;
160     }
161
162     MPI_Type_create_struct(NTYPES, blocklens, disps, types, type);
163     MPI_Type_commit(type);
164
165     for(i=0; i<NTYPES; i++) {
166         MPI_Type_free(&(types[i]));
167     }
168     return 0;
169 }
170
171 int main(int argc, char **argv)
172 {
173     MPI_Datatype hdf5type;
174
175     MPI_Init(&argc, &argv);
176     makeHDF5type(&hdf5type);
177
178     /*MPIDU_Datatype_debug(hdf5type, 32);*/
179
180     MPI_Type_free(&hdf5type);
181     MPI_Finalize();
182
183     printf(" No Errors\n");
184
185     return 0;
186 }
187