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