xref: /petsc/src/sys/tests/ex53.c (revision d71ae5a4db6382e7f06317b8d368875286fe9008)
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 
59371c9d4SSatish Balay #define CHKMPIERR(ierr) \
69371c9d4SSatish Balay   do { \
79371c9d4SSatish Balay     if (ierr) MPI_Abort(MPI_COMM_WORLD, ierr); \
89371c9d4SSatish Balay   } while (0)
9f0463fa0SJunchao Zhang 
10*d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv)
11*d71ae5a4SJacob Faibussowitsch {
12d0609cedSBarry Smith   int         err;
13f0463fa0SJunchao Zhang   PetscInt    i;
14f0463fa0SJunchao Zhang   PetscMPIInt key1, key2, attr1 = 100, attr2 = 200, *attr, flag;
15f0463fa0SJunchao Zhang   MPI_Comm    newcomm;
16f0463fa0SJunchao Zhang 
179371c9d4SSatish Balay   err = MPI_Init(&argc, &argv);
189371c9d4SSatish Balay   CHKMPIERR(err);
19f0463fa0SJunchao Zhang 
20f0463fa0SJunchao Zhang   /* Repeated keyval or comm create/free should not blow up MPI */
21f0463fa0SJunchao Zhang   for (i = 0; i < 500; i++) {
229371c9d4SSatish Balay     err = MPI_Comm_create_keyval(MPI_COMM_NULL_COPY_FN, MPI_COMM_NULL_DELETE_FN, &key1, NULL);
239371c9d4SSatish Balay     CHKMPIERR(err);
249371c9d4SSatish Balay     err = MPI_Comm_free_keyval(&key1);
259371c9d4SSatish Balay     CHKMPIERR(err);
269371c9d4SSatish Balay     err = MPI_Comm_dup(MPI_COMM_WORLD, &newcomm);
279371c9d4SSatish Balay     CHKMPIERR(err);
289371c9d4SSatish Balay     err = MPI_Comm_free(&newcomm);
299371c9d4SSatish Balay     CHKMPIERR(err);
30f0463fa0SJunchao Zhang   }
31f0463fa0SJunchao Zhang 
32f0463fa0SJunchao Zhang   /* The following keyval/attr code exposes a bug in old mpiuni code, where it had wrong newcomm returned in MPI_Comm_dup. */
339371c9d4SSatish Balay   err = MPI_Comm_create_keyval(MPI_COMM_NULL_COPY_FN, MPI_COMM_NULL_DELETE_FN, &key1, NULL);
349371c9d4SSatish Balay   CHKMPIERR(err);
359371c9d4SSatish Balay   err = MPI_Comm_create_keyval(MPI_COMM_NULL_COPY_FN, MPI_COMM_NULL_DELETE_FN, &key2, NULL);
369371c9d4SSatish Balay   CHKMPIERR(err);
379371c9d4SSatish Balay   err = MPI_Comm_dup(MPI_COMM_WORLD, &newcomm);
389371c9d4SSatish Balay   CHKMPIERR(err);
39f0463fa0SJunchao Zhang   if (MPI_COMM_WORLD == newcomm) printf("Error: wrong newcomm returned by MPI_Comm_dup()\n");
40f0463fa0SJunchao Zhang 
419371c9d4SSatish Balay   err = MPI_Comm_set_attr(MPI_COMM_WORLD, key1, &attr1);
429371c9d4SSatish Balay   CHKMPIERR(err);
439371c9d4SSatish Balay   err = MPI_Comm_set_attr(newcomm, key2, &attr2);
449371c9d4SSatish Balay   CHKMPIERR(err);
459371c9d4SSatish Balay   err = MPI_Comm_get_attr(newcomm, key1, &attr, &flag);
469371c9d4SSatish Balay   CHKMPIERR(err);
47f0463fa0SJunchao Zhang   if (flag) printf("Error: newcomm should not have attribute for keyval %d\n", (int)key1);
489371c9d4SSatish Balay   err = MPI_Comm_get_attr(MPI_COMM_WORLD, key1, &attr, &flag);
499371c9d4SSatish Balay   CHKMPIERR(err);
50f0463fa0SJunchao Zhang   if (*attr != attr1) printf("Error: expected attribute %d, but got %d\n", (int)attr1, (int)*attr);
519371c9d4SSatish Balay   err = MPI_Comm_get_attr(newcomm, key2, &attr, &flag);
529371c9d4SSatish Balay   CHKMPIERR(err);
53f0463fa0SJunchao Zhang   if (*attr != attr2) printf("Error: expected attribute %d, but got %d\n", (int)attr2, (int)*attr);
54f0463fa0SJunchao Zhang 
559371c9d4SSatish Balay   err = MPI_Comm_delete_attr(MPI_COMM_WORLD, key1);
569371c9d4SSatish Balay   CHKMPIERR(err);
579371c9d4SSatish Balay   err = MPI_Comm_delete_attr(newcomm, key2);
589371c9d4SSatish Balay   CHKMPIERR(err);
599371c9d4SSatish Balay   err = MPI_Comm_free_keyval(&key1);
609371c9d4SSatish Balay   CHKMPIERR(err);
619371c9d4SSatish Balay   err = MPI_Comm_free_keyval(&key2);
629371c9d4SSatish Balay   CHKMPIERR(err);
639371c9d4SSatish Balay   err = MPI_Comm_free(&newcomm);
649371c9d4SSatish Balay   CHKMPIERR(err);
65f0463fa0SJunchao Zhang 
66f0463fa0SJunchao Zhang   /* Init/Finalize PETSc multiple times when MPI is initialized */
67f0463fa0SJunchao Zhang   for (i = 0; i < 500; i++) {
68327415f7SBarry Smith     PetscFunctionBeginUser;
69b8abcfdeSJacob Faibussowitsch     PetscCall(PetscInitialize(&argc, &argv, (char *)0, help));
70d0609cedSBarry Smith     PetscCall(PetscFinalize(); if (err) return err);
71f0463fa0SJunchao Zhang   }
72f0463fa0SJunchao Zhang 
73d0609cedSBarry Smith   err = MPI_Finalize();
74d0609cedSBarry Smith   return err;
75f0463fa0SJunchao Zhang }
76f0463fa0SJunchao Zhang 
77f0463fa0SJunchao Zhang /*TEST
78f0463fa0SJunchao Zhang    # Elemental in debug mode has bugs that it can not be repeatedly init/finalize'd for more than 300 times
79f0463fa0SJunchao Zhang    testset:
80f0463fa0SJunchao Zhang     output_file: output/ex53_1.out
81f0463fa0SJunchao Zhang     test:
82f0463fa0SJunchao Zhang       suffix: 1
83f0463fa0SJunchao Zhang       requires: !elemental
84f0463fa0SJunchao Zhang 
85f0463fa0SJunchao Zhang     test:
86f0463fa0SJunchao Zhang       suffix: 2
87dfd57a17SPierre Jolivet       requires: elemental !defined(PETSC_USE_DEBUG)
88f0463fa0SJunchao Zhang TEST*/
89