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