xref: /petsc/src/sys/tests/ex53.c (revision 9371c9d470a9602b6d10a8bf50c9b2280a79e45a)
1f0463fa0SJunchao Zhang static char help[] = "Test resource recycling and MPI_Comm and keyval creation in mpi or mpiuni\n";
2f0463fa0SJunchao Zhang 
3f0463fa0SJunchao Zhang #include <petscsys.h>
4f0463fa0SJunchao Zhang 
5*9371c9d4SSatish Balay #define CHKMPIERR(ierr) \
6*9371c9d4SSatish Balay   do { \
7*9371c9d4SSatish Balay     if (ierr) MPI_Abort(MPI_COMM_WORLD, ierr); \
8*9371c9d4SSatish Balay   } while (0)
9f0463fa0SJunchao Zhang 
10*9371c9d4SSatish Balay int main(int argc, char **argv) {
11d0609cedSBarry Smith   int         err;
12f0463fa0SJunchao Zhang   PetscInt    i;
13f0463fa0SJunchao Zhang   PetscMPIInt key1, key2, attr1 = 100, attr2 = 200, *attr, flag;
14f0463fa0SJunchao Zhang   MPI_Comm    newcomm;
15f0463fa0SJunchao Zhang 
16*9371c9d4SSatish Balay   err = MPI_Init(&argc, &argv);
17*9371c9d4SSatish Balay   CHKMPIERR(err);
18f0463fa0SJunchao Zhang 
19f0463fa0SJunchao Zhang   /* Repeated keyval or comm create/free should not blow up MPI */
20f0463fa0SJunchao Zhang   for (i = 0; i < 500; i++) {
21*9371c9d4SSatish Balay     err = MPI_Comm_create_keyval(MPI_COMM_NULL_COPY_FN, MPI_COMM_NULL_DELETE_FN, &key1, NULL);
22*9371c9d4SSatish Balay     CHKMPIERR(err);
23*9371c9d4SSatish Balay     err = MPI_Comm_free_keyval(&key1);
24*9371c9d4SSatish Balay     CHKMPIERR(err);
25*9371c9d4SSatish Balay     err = MPI_Comm_dup(MPI_COMM_WORLD, &newcomm);
26*9371c9d4SSatish Balay     CHKMPIERR(err);
27*9371c9d4SSatish Balay     err = MPI_Comm_free(&newcomm);
28*9371c9d4SSatish Balay     CHKMPIERR(err);
29f0463fa0SJunchao Zhang   }
30f0463fa0SJunchao Zhang 
31f0463fa0SJunchao Zhang   /* The following keyval/attr code exposes a bug in old mpiuni code, where it had wrong newcomm returned in MPI_Comm_dup. */
32*9371c9d4SSatish Balay   err = MPI_Comm_create_keyval(MPI_COMM_NULL_COPY_FN, MPI_COMM_NULL_DELETE_FN, &key1, NULL);
33*9371c9d4SSatish Balay   CHKMPIERR(err);
34*9371c9d4SSatish Balay   err = MPI_Comm_create_keyval(MPI_COMM_NULL_COPY_FN, MPI_COMM_NULL_DELETE_FN, &key2, NULL);
35*9371c9d4SSatish Balay   CHKMPIERR(err);
36*9371c9d4SSatish Balay   err = MPI_Comm_dup(MPI_COMM_WORLD, &newcomm);
37*9371c9d4SSatish Balay   CHKMPIERR(err);
38f0463fa0SJunchao Zhang   if (MPI_COMM_WORLD == newcomm) printf("Error: wrong newcomm returned by MPI_Comm_dup()\n");
39f0463fa0SJunchao Zhang 
40*9371c9d4SSatish Balay   err = MPI_Comm_set_attr(MPI_COMM_WORLD, key1, &attr1);
41*9371c9d4SSatish Balay   CHKMPIERR(err);
42*9371c9d4SSatish Balay   err = MPI_Comm_set_attr(newcomm, key2, &attr2);
43*9371c9d4SSatish Balay   CHKMPIERR(err);
44*9371c9d4SSatish Balay   err = MPI_Comm_get_attr(newcomm, key1, &attr, &flag);
45*9371c9d4SSatish Balay   CHKMPIERR(err);
46f0463fa0SJunchao Zhang   if (flag) printf("Error: newcomm should not have attribute for keyval %d\n", (int)key1);
47*9371c9d4SSatish Balay   err = MPI_Comm_get_attr(MPI_COMM_WORLD, key1, &attr, &flag);
48*9371c9d4SSatish Balay   CHKMPIERR(err);
49f0463fa0SJunchao Zhang   if (*attr != attr1) printf("Error: expected attribute %d, but got %d\n", (int)attr1, (int)*attr);
50*9371c9d4SSatish Balay   err = MPI_Comm_get_attr(newcomm, key2, &attr, &flag);
51*9371c9d4SSatish Balay   CHKMPIERR(err);
52f0463fa0SJunchao Zhang   if (*attr != attr2) printf("Error: expected attribute %d, but got %d\n", (int)attr2, (int)*attr);
53f0463fa0SJunchao Zhang 
54*9371c9d4SSatish Balay   err = MPI_Comm_delete_attr(MPI_COMM_WORLD, key1);
55*9371c9d4SSatish Balay   CHKMPIERR(err);
56*9371c9d4SSatish Balay   err = MPI_Comm_delete_attr(newcomm, key2);
57*9371c9d4SSatish Balay   CHKMPIERR(err);
58*9371c9d4SSatish Balay   err = MPI_Comm_free_keyval(&key1);
59*9371c9d4SSatish Balay   CHKMPIERR(err);
60*9371c9d4SSatish Balay   err = MPI_Comm_free_keyval(&key2);
61*9371c9d4SSatish Balay   CHKMPIERR(err);
62*9371c9d4SSatish Balay   err = MPI_Comm_free(&newcomm);
63*9371c9d4SSatish Balay   CHKMPIERR(err);
64f0463fa0SJunchao Zhang 
65f0463fa0SJunchao Zhang   /* Init/Finalize PETSc multiple times when MPI is initialized */
66f0463fa0SJunchao Zhang   for (i = 0; i < 500; i++) {
67327415f7SBarry Smith     PetscFunctionBeginUser;
68b8abcfdeSJacob Faibussowitsch     PetscCall(PetscInitialize(&argc, &argv, (char *)0, help));
69d0609cedSBarry Smith     PetscCall(PetscFinalize(); if (err) return err);
70f0463fa0SJunchao Zhang   }
71f0463fa0SJunchao Zhang 
72d0609cedSBarry Smith   err = MPI_Finalize();
73d0609cedSBarry Smith   return err;
74f0463fa0SJunchao Zhang }
75f0463fa0SJunchao Zhang 
76f0463fa0SJunchao Zhang /*TEST
77f0463fa0SJunchao Zhang    # Elemental in debug mode has bugs that it can not be repeatedly init/finalize'd for more than 300 times
78f0463fa0SJunchao Zhang    testset:
79f0463fa0SJunchao Zhang     output_file: output/ex53_1.out
80f0463fa0SJunchao Zhang     test:
81f0463fa0SJunchao Zhang       suffix: 1
82f0463fa0SJunchao Zhang       requires: !elemental
83f0463fa0SJunchao Zhang 
84f0463fa0SJunchao Zhang     test:
85f0463fa0SJunchao Zhang       suffix: 2
86dfd57a17SPierre Jolivet       requires: elemental !defined(PETSC_USE_DEBUG)
87f0463fa0SJunchao Zhang TEST*/
88