1c4762a1bSJed Brown 2c4762a1bSJed Brown static char help[] = "Tests using PetscViewerGetSubViewer() recursively\n\n"; 3c4762a1bSJed Brown 4c4762a1bSJed Brown /*T 5c4762a1bSJed Brown Concepts: viewers 6c4762a1bSJed Brown Processors: n 7c4762a1bSJed Brown T*/ 8c4762a1bSJed Brown #include <petscsys.h> 9c4762a1bSJed Brown #include <petscviewer.h> 10c4762a1bSJed Brown 11c4762a1bSJed Brown int main(int argc,char **argv) 12c4762a1bSJed Brown { 13c4762a1bSJed Brown PetscErrorCode ierr; 14c4762a1bSJed Brown PetscViewer viewer,subviewer,subsubviewer; 15c4762a1bSJed Brown PetscViewerFormat format; 16c4762a1bSJed Brown PetscBool flg; 17c4762a1bSJed Brown PetscSubcomm psubcomm,psubsubcomm; 18c4762a1bSJed Brown MPI_Comm comm,subcomm,subsubcomm; 19c4762a1bSJed Brown PetscMPIInt size; 20c4762a1bSJed Brown 21c4762a1bSJed Brown /* 22c4762a1bSJed Brown Every PETSc routine should begin with the PetscInitialize() routine. 23c4762a1bSJed Brown argc, argv - These command line arguments are taken to extract the options 24c4762a1bSJed Brown supplied to PETSc and options supplied to MPI. 25c4762a1bSJed Brown help - When PETSc executable is invoked with the option -help, 26c4762a1bSJed Brown it prints the various options that can be applied at 27c4762a1bSJed Brown runtime. The user can use the "help" variable place 28c4762a1bSJed Brown additional help messages in this printout. 29c4762a1bSJed Brown */ 30c4762a1bSJed Brown ierr = PetscInitialize(&argc,&argv,(char*)0,help);if (ierr) return ierr; 31c4762a1bSJed Brown comm = PETSC_COMM_WORLD; 32ffc4695bSBarry Smith ierr = MPI_Comm_size(comm,&size);CHKERRMPI(ierr); 33*2c71b3e2SJacob Faibussowitsch PetscCheckFalse(size < 4,PETSC_COMM_WORLD,PETSC_ERR_SUP,"Must run with at least 4 MPI processes"); 34c4762a1bSJed Brown ierr = PetscOptionsGetViewer(comm,NULL,NULL,"-viewer",&viewer,&format,&flg);CHKERRQ(ierr); 35*2c71b3e2SJacob Faibussowitsch PetscCheckFalse(!viewer,PETSC_COMM_WORLD,PETSC_ERR_SUP,"Must use -viewer option"); 36c4762a1bSJed Brown 37c4762a1bSJed Brown ierr = PetscViewerASCIIPrintf(viewer,"Print called on original full viewer %d\n",PetscGlobalRank);CHKERRQ(ierr); 38c4762a1bSJed Brown 39c4762a1bSJed Brown ierr = PetscSubcommCreate(comm,&psubcomm);CHKERRQ(ierr); 40c4762a1bSJed Brown ierr = PetscSubcommSetNumber(psubcomm,2);CHKERRQ(ierr); 41c4762a1bSJed Brown ierr = PetscSubcommSetType(psubcomm,PETSC_SUBCOMM_CONTIGUOUS);CHKERRQ(ierr); 42c4762a1bSJed Brown /* enable runtime switch of psubcomm type, e.g., '-psubcomm_type interlaced */ 43c4762a1bSJed Brown ierr = PetscSubcommSetFromOptions(psubcomm);CHKERRQ(ierr); 44c4762a1bSJed Brown subcomm = PetscSubcommChild(psubcomm); 45c4762a1bSJed Brown 46c4762a1bSJed Brown ierr = PetscViewerGetSubViewer(viewer,subcomm,&subviewer);CHKERRQ(ierr); 47c4762a1bSJed Brown 48c4762a1bSJed Brown ierr = PetscViewerASCIIPrintf(subviewer," Print called on sub viewers %d\n",PetscGlobalRank);CHKERRQ(ierr); 49c4762a1bSJed Brown 50c4762a1bSJed Brown ierr = PetscSubcommCreate(subcomm,&psubsubcomm);CHKERRQ(ierr); 51c4762a1bSJed Brown ierr = PetscSubcommSetNumber(psubsubcomm,2);CHKERRQ(ierr); 52c4762a1bSJed Brown ierr = PetscSubcommSetType(psubsubcomm,PETSC_SUBCOMM_CONTIGUOUS);CHKERRQ(ierr); 53c4762a1bSJed Brown /* enable runtime switch of psubcomm type, e.g., '-psubcomm_type interlaced */ 54c4762a1bSJed Brown ierr = PetscSubcommSetFromOptions(psubsubcomm);CHKERRQ(ierr); 55c4762a1bSJed Brown subsubcomm = PetscSubcommChild(psubsubcomm); 56c4762a1bSJed Brown 57c4762a1bSJed Brown ierr = PetscViewerGetSubViewer(subviewer,subsubcomm,&subsubviewer);CHKERRQ(ierr); 58c4762a1bSJed Brown 59c4762a1bSJed Brown ierr = PetscViewerASCIIPrintf(subsubviewer," Print called on sub sub viewers %d\n",PetscGlobalRank);CHKERRQ(ierr); 60c4762a1bSJed Brown 61c4762a1bSJed Brown ierr = PetscViewerRestoreSubViewer(subviewer,subsubcomm,&subsubviewer);CHKERRQ(ierr); 62c4762a1bSJed Brown ierr = PetscViewerRestoreSubViewer(viewer,subcomm,&subviewer);CHKERRQ(ierr); 63c4762a1bSJed Brown 64c4762a1bSJed Brown ierr = PetscSubcommDestroy(&psubsubcomm);CHKERRQ(ierr); 65c4762a1bSJed Brown ierr = PetscSubcommDestroy(&psubcomm);CHKERRQ(ierr); 66c4762a1bSJed Brown ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); 67c4762a1bSJed Brown ierr = PetscFinalize(); 68c4762a1bSJed Brown return ierr; 69c4762a1bSJed Brown } 70c4762a1bSJed Brown 71c4762a1bSJed Brown /*TEST 72c4762a1bSJed Brown 73c4762a1bSJed Brown test: 74c4762a1bSJed Brown nsize: 4 75c4762a1bSJed Brown args: -viewer 76c4762a1bSJed Brown 77c4762a1bSJed Brown TEST*/ 78