:orphan:
# PetscViewerGetSubViewer
Creates a new `PetscViewer` (same type as the old) that lives on a subcommunicator of the original viewer's communicator
## Synopsis
```
#include "petscviewer.h"
PetscErrorCode PetscViewerGetSubViewer(PetscViewer viewer, MPI_Comm comm, PetscViewer *outviewer)
```
Collective
## Input Parameter
- ***viewer -*** the `PetscViewer` to be reproduced
## Output Parameter
- ***outviewer -*** new `PetscViewer`
## Notes
The output of the subviewers is synchronized against the original viewer. For example, if a
viewer on two MPI processes is decomposed into two subviewers, the output from the first viewer is
all printed before the output from the second viewer. You must call `PetscViewerFlush()` after
the call to `PetscViewerRestoreSubViewer()`.
Call `PetscViewerRestoreSubViewer()` to destroy this `PetscViewer`, NOT `PetscViewerDestroy()`
This is most commonly used to view a sequential object that is part of a
parallel object. For example `PCView()` on a `PCBJACOBI` could use this to obtain a
`PetscViewer` that is used with the sequential `KSP` on one block of the preconditioner.
Between the calls to `PetscViewerGetSubViewer()` and `PetscViewerRestoreSubViewer()` the original
viewer should not be used
`PETSCVIEWERDRAW` and `PETSCVIEWERBINARY` only support returning a singleton viewer on MPI rank 0,
all other ranks will return a `NULL` viewer
## Developer Notes
There is currently incomplete error checking to ensure the user does not use the original viewer between the
the calls to `PetscViewerGetSubViewer()` and `PetscViewerRestoreSubViewer()`. If the user does there
could be errors in the viewing that go undetected or crash the code.
It would be nice if the call to `PetscViewerFlush()` was not required and was handled by
`PetscViewerRestoreSubViewer()`
## See Also
[](sec_viewers), `PetscViewer`, `PetscViewerSocketOpen()`, `PetscViewerASCIIOpen()`, `PetscViewerDrawOpen()`, `PetscViewerRestoreSubViewer()`
## Level
advanced
## Location
src/sys/classes/viewer/interface/dupl.c
## Examples
src/dm/tutorials/ex6.c
src/vec/vec/tutorials/ex14f.F90
src/vec/vec/tutorials/ex9f.F90
## Implementations
PetscViewerGetSubViewer_ASCII in src/sys/classes/viewer/impls/ascii/filev.c
PetscViewerGetSubViewer_Binary in src/sys/classes/viewer/impls/binary/binv.c
PetscViewerGetSubViewer_Draw in src/sys/classes/viewer/impls/draw/drawv.c
PetscViewerGetSubViewer_String in src/sys/classes/viewer/impls/string/stringv.c
---
[Edit on GitLab](https://gitlab.com/petsc/petsc/-/edit/release/src/sys/classes/viewer/interface/dupl.c)
[Index of all Viewer routines](index.md)
[Table of Contents for all manual pages](/manualpages/index.md)
[Index of all manual pages](/manualpages/singleindex.md)