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
main(int argc,char ** argv)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