1 /*
2  * Copyright (C) by Argonne National Laboratory
3  *     See COPYRIGHT in top-level directory
4  */
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 #include "mpitest.h"
15 
16 /* uncomment to use debugging routine in MPICH
17 extern int MPIR_Datatype_debug(MPI_Datatype type, int depth);
18 */
19 
20 int makeHDF5type0(MPI_Datatype * type);
makeHDF5type0(MPI_Datatype * type)21 int makeHDF5type0(MPI_Datatype * type)
22 {
23     MPI_Datatype ctg, vect, structype, vec2, structype2, vec3, structype3, vec4, structype4, vec5;
24 
25     int b;
26     MPI_Aint d;
27     MPI_Datatype tmp_type;
28 
29     MPI_Type_contiguous(4, MPI_BYTE, &ctg);
30 
31     MPI_Type_vector(1, 5, 1, ctg, &vect);
32 
33     MPI_Type_create_resized(vect, 0, 40, &structype);
34 
35     MPI_Type_vector(1, 5, 1, structype, &vec2);
36 
37     b = 1;
38     d = 2000;
39     MPI_Type_create_struct(1, &b, &d, &vec2, &tmp_type);
40     MPI_Type_create_resized(tmp_type, 0, 400, &structype2);
41     MPI_Type_free(&tmp_type);
42 
43     MPI_Type_vector(1, 5, 1, structype2, &vec3);
44 
45     MPI_Type_create_resized(vec3, 0, 4000, &structype3);
46 
47     MPI_Type_vector(1, 5, 1, structype3, &vec4);
48 
49     MPI_Type_create_resized(vec4, 0, 40000, &structype4);
50 
51     MPI_Type_vector(1, 1, 1, structype4, &vec5);
52 
53     b = 1;
54     d = 160000;
55     MPI_Type_create_struct(1, &b, &d, &vec5, &tmp_type);
56     MPI_Type_create_resized(tmp_type, 0, 200000, type);
57     MPI_Type_free(&tmp_type);
58 
59     MPI_Type_free(&ctg);
60     MPI_Type_free(&vect);
61     MPI_Type_free(&structype);
62     MPI_Type_free(&vec2);
63     MPI_Type_free(&structype2);
64     MPI_Type_free(&vec3);
65     MPI_Type_free(&structype3);
66     MPI_Type_free(&vec4);
67     MPI_Type_free(&structype4);
68     MPI_Type_free(&vec5);
69     MPI_Type_commit(type);
70 
71     return 0;
72 }
73 
74 int makeHDF5type1(MPI_Datatype * type);
makeHDF5type1(MPI_Datatype * type)75 int makeHDF5type1(MPI_Datatype * type)
76 {
77     MPI_Datatype ctg, vect, structype, vec2, structype2, vec3, structype3, vec4, structype4, vec5;
78 
79     int b;
80     MPI_Aint d;
81     MPI_Datatype tmp_type;
82 
83     MPI_Type_contiguous(4, MPI_BYTE, &ctg);
84 
85     MPI_Type_vector(1, 5, 1, ctg, &vect);
86 
87     b = 1;
88     d = 20;
89     MPI_Type_create_struct(1, &b, &d, &vect, &tmp_type);
90     MPI_Type_create_resized(tmp_type, 0, 40, &structype);
91     MPI_Type_free(&tmp_type);
92 
93     MPI_Type_vector(1, 5, 1, structype, &vec2);
94 
95     MPI_Type_create_resized(vec2, 0, 400, &structype2);
96 
97     MPI_Type_vector(1, 5, 1, structype2, &vec3);
98 
99     MPI_Type_create_resized(vec3, 0, 4000, &structype3);
100 
101     MPI_Type_vector(1, 5, 1, structype3, &vec4);
102 
103     MPI_Type_create_resized(vec4, 0, 40000, &structype4);
104 
105     MPI_Type_vector(1, 1, 1, structype4, &vec5);
106 
107     b = 1;
108     d = 160000;
109     MPI_Type_create_struct(1, &b, &d, &vec5, &tmp_type);
110     MPI_Type_create_resized(tmp_type, 0, 200000, type);
111     MPI_Type_free(&tmp_type);
112 
113     MPI_Type_free(&ctg);
114     MPI_Type_free(&vect);
115     MPI_Type_free(&structype);
116     MPI_Type_free(&vec2);
117     MPI_Type_free(&structype2);
118     MPI_Type_free(&vec3);
119     MPI_Type_free(&structype3);
120     MPI_Type_free(&vec4);
121     MPI_Type_free(&structype4);
122     MPI_Type_free(&vec5);
123     MPI_Type_commit(type);
124 
125     return 0;
126 }
127 
128 int makeHDF5type(MPI_Datatype * type);
makeHDF5type(MPI_Datatype * type)129 int makeHDF5type(MPI_Datatype * type)
130 {
131     int i;
132 
133 #define NTYPES 2
134 
135     int blocklens[NTYPES];
136     MPI_Aint disps[NTYPES];
137 
138     MPI_Datatype types[NTYPES];
139     makeHDF5type0(&(types[0]));
140     makeHDF5type1(&(types[1]));
141 
142     for (i = 0; i < NTYPES; i++) {
143         blocklens[i] = 1;
144         disps[i] = 0;
145     }
146 
147     MPI_Type_create_struct(NTYPES, blocklens, disps, types, type);
148     MPI_Type_commit(type);
149 
150     for (i = 0; i < NTYPES; i++) {
151         MPI_Type_free(&(types[i]));
152     }
153     return 0;
154 }
155 
main(int argc,char ** argv)156 int main(int argc, char **argv)
157 {
158     MPI_Datatype hdf5type;
159 
160     MTest_Init(&argc, &argv);
161     makeHDF5type(&hdf5type);
162 
163     /*MPIR_Datatype_debug(hdf5type, 32); */
164 
165     MPI_Type_free(&hdf5type);
166     MTest_Finalize(0);
167 
168     return 0;
169 }
170