1 /*
2  * Copyright (C) by Argonne National Laboratory
3  *     See COPYRIGHT in top-level directory
4  */
5 
6 #include "mpi.h"
7 #include <stdio.h>
8 #include "mpitest.h"
9 
main(int argc,char ** argv)10 int main(int argc, char **argv)
11 {
12     int errs = 0;
13     int rank, size, wrank, wsize, dest, a, b;
14     MPI_Comm newcomm;
15     MPI_Status status;
16 
17     MTest_Init(&argc, &argv);
18 
19     /* Can we run comm dup at all? */
20     MPI_Comm_dup(MPI_COMM_WORLD, &newcomm);
21 
22     /* Check basic properties */
23     MPI_Comm_size(MPI_COMM_WORLD, &wsize);
24     MPI_Comm_rank(MPI_COMM_WORLD, &wrank);
25     MPI_Comm_size(newcomm, &size);
26     MPI_Comm_rank(newcomm, &rank);
27 
28     if (size != wsize || rank != wrank) {
29         errs++;
30         fprintf(stderr, "Size (%d) or rank (%d) wrong\n", size, rank);
31         fflush(stderr);
32     }
33 
34     /* Can we communicate with this new communicator? */
35     dest = MPI_PROC_NULL;
36     if (rank == 0) {
37         dest = size - 1;
38         a = rank;
39         b = -1;
40         MPI_Sendrecv(&a, 1, MPI_INT, dest, 0, &b, 1, MPI_INT, dest, 0, newcomm, &status);
41         if (b != dest) {
42             errs++;
43             fprintf(stderr, "Received %d expected %d on %d\n", b, dest, rank);
44             fflush(stderr);
45         }
46         if (status.MPI_SOURCE != dest) {
47             errs++;
48             fprintf(stderr, "Source not set correctly in status on %d\n", rank);
49             fflush(stderr);
50         }
51     } else if (rank == size - 1) {
52         dest = 0;
53         a = rank;
54         b = -1;
55         MPI_Sendrecv(&a, 1, MPI_INT, dest, 0, &b, 1, MPI_INT, dest, 0, newcomm, &status);
56         if (b != dest) {
57             errs++;
58             fprintf(stderr, "Received %d expected %d on %d\n", b, dest, rank);
59             fflush(stderr);
60         }
61         if (status.MPI_SOURCE != dest) {
62             errs++;
63             fprintf(stderr, "Source not set correctly in status on %d\n", rank);
64             fflush(stderr);
65         }
66     }
67 
68     MPI_Comm_free(&newcomm);
69 
70     MTest_Finalize(errs);
71 
72 
73     return MTestReturnValue(errs);
74 }
75