1c4762a1bSJed Brown static char help[] = "Tests using PetscViewerGetSubViewer() recursively\n\n"; 2c4762a1bSJed Brown 3c4762a1bSJed Brown #include <petscsys.h> 4c4762a1bSJed Brown #include <petscviewer.h> 5c4762a1bSJed Brown 6d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv) 7d71ae5a4SJacob Faibussowitsch { 8c4762a1bSJed Brown PetscViewer viewer, subviewer, subsubviewer; 9c4762a1bSJed Brown PetscViewerFormat format; 10c4762a1bSJed Brown PetscBool flg; 11c4762a1bSJed Brown PetscSubcomm psubcomm, psubsubcomm; 12c4762a1bSJed Brown MPI_Comm comm, subcomm, subsubcomm; 13c4762a1bSJed Brown PetscMPIInt size; 14c4762a1bSJed Brown 15c4762a1bSJed Brown /* 16c4762a1bSJed Brown Every PETSc routine should begin with the PetscInitialize() routine. 17c4762a1bSJed Brown argc, argv - These command line arguments are taken to extract the options 18c4762a1bSJed Brown supplied to PETSc and options supplied to MPI. 19c4762a1bSJed Brown help - When PETSc executable is invoked with the option -help, 20c4762a1bSJed Brown it prints the various options that can be applied at 21c4762a1bSJed Brown runtime. The user can use the "help" variable place 22c4762a1bSJed Brown additional help messages in this printout. 23c4762a1bSJed Brown */ 24327415f7SBarry Smith PetscFunctionBeginUser; 25*c8025a54SPierre Jolivet PetscCall(PetscInitialize(&argc, &argv, NULL, help)); 26c4762a1bSJed Brown comm = PETSC_COMM_WORLD; 279566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(comm, &size)); 28811af0c4SBarry Smith PetscCheck(size >= 4, PETSC_COMM_WORLD, PETSC_ERR_WRONG_MPI_SIZE, "Must run with at least 4 MPI ranks"); 29648c30bcSBarry Smith PetscCall(PetscOptionsCreateViewer(comm, NULL, NULL, "-viewer", &viewer, &format, &flg)); 3028b400f6SJacob Faibussowitsch PetscCheck(viewer, PETSC_COMM_WORLD, PETSC_ERR_SUP, "Must use -viewer option"); 31c4762a1bSJed Brown 329566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(viewer, "Print called on original full viewer %d\n", PetscGlobalRank)); 33c4762a1bSJed Brown 349566063dSJacob Faibussowitsch PetscCall(PetscSubcommCreate(comm, &psubcomm)); 359566063dSJacob Faibussowitsch PetscCall(PetscSubcommSetNumber(psubcomm, 2)); 369566063dSJacob Faibussowitsch PetscCall(PetscSubcommSetType(psubcomm, PETSC_SUBCOMM_CONTIGUOUS)); 37c4762a1bSJed Brown /* enable runtime switch of psubcomm type, e.g., '-psubcomm_type interlaced */ 389566063dSJacob Faibussowitsch PetscCall(PetscSubcommSetFromOptions(psubcomm)); 39c4762a1bSJed Brown subcomm = PetscSubcommChild(psubcomm); 40c4762a1bSJed Brown 419566063dSJacob Faibussowitsch PetscCall(PetscViewerGetSubViewer(viewer, subcomm, &subviewer)); 42c4762a1bSJed Brown 439566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(subviewer, " Print called on sub viewers %d\n", PetscGlobalRank)); 44c4762a1bSJed Brown 459566063dSJacob Faibussowitsch PetscCall(PetscSubcommCreate(subcomm, &psubsubcomm)); 469566063dSJacob Faibussowitsch PetscCall(PetscSubcommSetNumber(psubsubcomm, 2)); 479566063dSJacob Faibussowitsch PetscCall(PetscSubcommSetType(psubsubcomm, PETSC_SUBCOMM_CONTIGUOUS)); 48c4762a1bSJed Brown /* enable runtime switch of psubcomm type, e.g., '-psubcomm_type interlaced */ 499566063dSJacob Faibussowitsch PetscCall(PetscSubcommSetFromOptions(psubsubcomm)); 50c4762a1bSJed Brown subsubcomm = PetscSubcommChild(psubsubcomm); 51c4762a1bSJed Brown 529566063dSJacob Faibussowitsch PetscCall(PetscViewerGetSubViewer(subviewer, subsubcomm, &subsubviewer)); 53c4762a1bSJed Brown 549566063dSJacob Faibussowitsch PetscCall(PetscViewerASCIIPrintf(subsubviewer, " Print called on sub sub viewers %d\n", PetscGlobalRank)); 55c4762a1bSJed Brown 569566063dSJacob Faibussowitsch PetscCall(PetscViewerRestoreSubViewer(subviewer, subsubcomm, &subsubviewer)); 579566063dSJacob Faibussowitsch PetscCall(PetscViewerRestoreSubViewer(viewer, subcomm, &subviewer)); 58c4762a1bSJed Brown 599566063dSJacob Faibussowitsch PetscCall(PetscSubcommDestroy(&psubsubcomm)); 609566063dSJacob Faibussowitsch PetscCall(PetscSubcommDestroy(&psubcomm)); 61648c30bcSBarry Smith PetscCall(PetscViewerDestroy(&viewer)); 629566063dSJacob Faibussowitsch PetscCall(PetscFinalize()); 63b122ec5aSJacob Faibussowitsch return 0; 64c4762a1bSJed Brown } 65c4762a1bSJed Brown 66c4762a1bSJed Brown /*TEST 67c4762a1bSJed Brown 68c4762a1bSJed Brown test: 69c4762a1bSJed Brown nsize: 4 70c4762a1bSJed Brown args: -viewer 71c4762a1bSJed Brown 72b4025f61SBarry Smith test: 73b4025f61SBarry Smith suffix: 2 74b4025f61SBarry Smith nsize: 4 75b4025f61SBarry Smith args: -viewer -psubcomm_type interlaced 76b4025f61SBarry Smith 77c4762a1bSJed Brown TEST*/ 78