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