Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Update copyright lines.
[simgrid.git] / teshsuite / smpi / type-struct / type-struct.c
1 /* Copyright (c) 2012-2021. The SimGrid Team.
2  * All rights reserved.                                                     */
3
4 /* This program is free software; you can redistribute it and/or modify it
5  * under the terms of the license (GNU LGPL) which comes with this package. */
6
7 #include <stdio.h>
8 #include "mpi.h"
9
10 int main(int argc, char **argv)
11 {
12     int          rank;
13     struct {
14       int a;
15       int c;
16       double b;
17       int tab[2][3];
18     } value = {0};
19     MPI_Datatype mystruct;
20     int          blocklens[3];
21     MPI_Aint     indices[3];
22     MPI_Datatype old_types[3];
23     MPI_Datatype type2;
24
25     MPI_Init( &argc, &argv );
26
27     MPI_Comm_rank( MPI_COMM_WORLD, &rank );
28
29     int tab[2][3]={{1*rank,2*rank,3*rank},{7*rank,8*rank,9*rank}};
30     MPI_Type_contiguous(3, MPI_INT, &type2);
31     MPI_Type_commit(&type2);
32
33     /* One value of each type, and two for the contiguous one */
34     blocklens[0] = 1;
35     blocklens[1] = 1;
36     blocklens[2] = 2;
37     /* The base types */
38     old_types[0] = MPI_INT;
39     old_types[1] = MPI_DOUBLE;
40     old_types[2] = type2;
41     /* The locations of each element */
42     MPI_Address( &value.a, &indices[0] );
43     MPI_Address( &value.b, &indices[1] );
44     MPI_Address( &tab, &indices[2] );
45     /* Make relative */
46     indices[2] = indices[2] - indices[0];
47     indices[1] = indices[1] - indices[0];
48     indices[0] = 0;
49
50     MPI_Type_struct( 3, blocklens, indices, old_types, &mystruct );
51     MPI_Type_commit( &mystruct );
52
53     if (rank == 0){
54       value.a=-2;
55       value.b=8.0;
56     }else{
57       value.a=10000;
58       value.b=5.0;
59     }
60
61     MPI_Bcast( &value, 1, mystruct, 0, MPI_COMM_WORLD );
62
63     printf( "Process %d got %d (-2?) and %f (8.0?), tab (should be all 0): ", rank, value.a, value.b );
64
65     for (int j = 0; j < 2; j++)
66       for (int i = 0; i < 3; i++)
67         printf("%d ", tab[j][i]);
68     printf("\n");
69
70     /* Clean up the type */
71     MPI_Type_free(&mystruct);
72     MPI_Type_free(&type2);
73     MPI_Finalize();
74     return 0;
75 }