1c4762a1bSJed Brown 2c4762a1bSJed Brown static char help[] = "Tests using PetscViewerGetSubViewer() recursively\n\n"; 3c4762a1bSJed Brown 4c4762a1bSJed Brown #include <petscsys.h> 5c4762a1bSJed Brown #include <petscviewer.h> 6c4762a1bSJed Brown 7c4762a1bSJed Brown int main(int argc,char **argv) 8c4762a1bSJed Brown { 9c4762a1bSJed Brown PetscViewer viewer,subviewer,subsubviewer; 10c4762a1bSJed Brown PetscViewerFormat format; 11c4762a1bSJed Brown PetscBool flg; 12c4762a1bSJed Brown PetscSubcomm psubcomm,psubsubcomm; 13c4762a1bSJed Brown MPI_Comm comm,subcomm,subsubcomm; 14c4762a1bSJed Brown PetscMPIInt size; 15c4762a1bSJed Brown 16c4762a1bSJed Brown /* 17c4762a1bSJed Brown Every PETSc routine should begin with the PetscInitialize() routine. 18c4762a1bSJed Brown argc, argv - These command line arguments are taken to extract the options 19c4762a1bSJed Brown supplied to PETSc and options supplied to MPI. 20c4762a1bSJed Brown help - When PETSc executable is invoked with the option -help, 21c4762a1bSJed Brown it prints the various options that can be applied at 22c4762a1bSJed Brown runtime. The user can use the "help" variable place 23c4762a1bSJed Brown additional help messages in this printout. 24c4762a1bSJed Brown */ 25*327415f7SBarry Smith PetscFunctionBeginUser; 269566063dSJacob Faibussowitsch PetscCall(PetscInitialize(&argc,&argv,(char*)0,help)); 27c4762a1bSJed Brown comm = PETSC_COMM_WORLD; 289566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(comm,&size)); 29be096a46SBarry Smith PetscCheck(size >= 4,PETSC_COMM_WORLD,PETSC_ERR_WRONG_MPI_SIZE,"Must run with at least 4 MPI processes"); 309566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetViewer(comm,NULL,NULL,"-viewer",&viewer,&format,&flg)); 3128b400f6SJacob Faibussowitsch PetscCheck(viewer,PETSC_COMM_WORLD,PETSC_ERR_SUP,"Must use -viewer option"); 32c4762a1bSJed Brown 339566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer,"Print called on original full viewer %d\n",PetscGlobalRank)); 34c4762a1bSJed Brown 359566063dSJacob Faibussowitsch PetscCall(PetscSubcommCreate(comm,&psubcomm)); 369566063dSJacob Faibussowitsch PetscCall(PetscSubcommSetNumber(psubcomm,2)); 379566063dSJacob Faibussowitsch PetscCall(PetscSubcommSetType(psubcomm,PETSC_SUBCOMM_CONTIGUOUS)); 38c4762a1bSJed Brown /* enable runtime switch of psubcomm type, e.g., '-psubcomm_type interlaced */ 399566063dSJacob Faibussowitsch PetscCall(PetscSubcommSetFromOptions(psubcomm)); 40c4762a1bSJed Brown subcomm = PetscSubcommChild(psubcomm); 41c4762a1bSJed Brown 429566063dSJacob Faibussowitsch PetscCall(PetscViewerGetSubViewer(viewer,subcomm,&subviewer)); 43c4762a1bSJed Brown 449566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(subviewer," Print called on sub viewers %d\n",PetscGlobalRank)); 45c4762a1bSJed Brown 469566063dSJacob Faibussowitsch PetscCall(PetscSubcommCreate(subcomm,&psubsubcomm)); 479566063dSJacob Faibussowitsch PetscCall(PetscSubcommSetNumber(psubsubcomm,2)); 489566063dSJacob Faibussowitsch PetscCall(PetscSubcommSetType(psubsubcomm,PETSC_SUBCOMM_CONTIGUOUS)); 49c4762a1bSJed Brown /* enable runtime switch of psubcomm type, e.g., '-psubcomm_type interlaced */ 509566063dSJacob Faibussowitsch PetscCall(PetscSubcommSetFromOptions(psubsubcomm)); 51c4762a1bSJed Brown subsubcomm = PetscSubcommChild(psubsubcomm); 52c4762a1bSJed Brown 539566063dSJacob Faibussowitsch PetscCall(PetscViewerGetSubViewer(subviewer,subsubcomm,&subsubviewer)); 54c4762a1bSJed Brown 559566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(subsubviewer," Print called on sub sub viewers %d\n",PetscGlobalRank)); 56c4762a1bSJed Brown 579566063dSJacob Faibussowitsch PetscCall(PetscViewerRestoreSubViewer(subviewer,subsubcomm,&subsubviewer)); 589566063dSJacob Faibussowitsch PetscCall(PetscViewerRestoreSubViewer(viewer,subcomm,&subviewer)); 59c4762a1bSJed Brown 609566063dSJacob Faibussowitsch PetscCall(PetscSubcommDestroy(&psubsubcomm)); 619566063dSJacob Faibussowitsch PetscCall(PetscSubcommDestroy(&psubcomm)); 629566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&viewer)); 639566063dSJacob Faibussowitsch PetscCall(PetscFinalize()); 64b122ec5aSJacob Faibussowitsch return 0; 65c4762a1bSJed Brown } 66c4762a1bSJed Brown 67c4762a1bSJed Brown /*TEST 68c4762a1bSJed Brown 69c4762a1bSJed Brown test: 70c4762a1bSJed Brown nsize: 4 71c4762a1bSJed Brown args: -viewer 72c4762a1bSJed Brown 73c4762a1bSJed Brown TEST*/ 74