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