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