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