Actual source code: dupl.c

  1: #include <petsc/private/viewerimpl.h>

  3: /*@C
  4:   PetscViewerGetSubViewer - Creates a new `PetscViewer` (same type as the old)
  5:   that lives on a subcommunicator of the original viewer's communicator

  7:   Collective

  9:   Input Parameters:
 10: + viewer - the `PetscViewer` to be reproduced
 11: - comm   - the sub communicator to use

 13:   Output Parameter:
 14: . outviewer - new `PetscViewer`

 16:   Level: advanced

 18:   Notes:
 19:   The output of the subviewers is synchronized against the original `viewer`. For example, if a
 20:   viewer on two MPI processes is decomposed into two subviewers, the output from the first viewer is
 21:   all printed before the output from the second viewer.

 23:   Call `PetscViewerRestoreSubViewer()` to destroy this `PetscViewer`, NOT `PetscViewerDestroy()`

 25:   This is most commonly used to view a sequential object that is part of a
 26:   parallel object. For example `PCView()` on a `PCBJACOBI` could use this to obtain a
 27:   `PetscViewer` that is used with the sequential `KSP` on one block of the preconditioner.

 29:   `PetscViewerFlush()` is run automatically at the begining of `PetscViewerGetSubViewer()` and with `PetscViewerRestoreSubViewer()`
 30:   for `PETSCVIEWERASCII`

 32:   `PETSCVIEWERDRAW` and `PETSCVIEWERBINARY` only support returning a singleton viewer on MPI rank 0,
 33:   all other ranks will return a `NULL` viewer

 35:   Must be called by all MPI processes that share `viewer`, for processes that are not of interest you can pass
 36:   `PETSC_COMM_SELF`.

 38:   For `PETSCVIEWERASCII` the viewers behavior is as follows\:
 39: .vb
 40:   Recursive calls are allowed
 41:   A call to `PetscViewerASCIIPrintf()` on a subviewer results in output for the first MPI process in the `outviewer` only
 42:   Calls to  `PetscViewerASCIIPrintf()` and `PetscViewerASCIISynchronizedPrintf()` are immediately passed up through all
 43:   the parent viewers to the higher most parent with `PetscViewerASCIISynchronizedPrintf()` where they are immediately
 44:   printed on the first MPI process or stashed on the other processes.
 45:   At the higher most `PetscViewerRestoreSubViewer()` the viewer is automatically flushed with `PetscViewerFlush()`
 46: .ve

 48:   Developer Notes:
 49:   There is currently incomplete error checking to ensure the user does not use the original viewer between the
 50:   the calls to `PetscViewerGetSubViewer()` and `PetscViewerRestoreSubViewer()`. If the user does there
 51:   could be errors in the viewing that go undetected or crash the code.

 53:   Complex use of this functionality with `PETSCVIEWERASCII` can result in output in unexpected order. This seems unavoidable.

 55: .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerSocketOpen()`, `PetscViewerASCIIOpen()`, `PetscViewerDrawOpen()`,
 56:           `PetscViewerFlush()`, `PetscViewerRestoreSubViewer()`
 57: @*/
 58: PetscErrorCode PetscViewerGetSubViewer(PetscViewer viewer, MPI_Comm comm, PetscViewer *outviewer)
 59: {
 60:   PetscFunctionBegin;
 62:   PetscAssertPointer(outviewer, 3);
 63:   PetscUseTypeMethod(viewer, getsubviewer, comm, outviewer);
 64:   PetscFunctionReturn(PETSC_SUCCESS);
 65: }

 67: /*@C
 68:   PetscViewerRestoreSubViewer - Restores a  `PetscViewer` obtained with `PetscViewerGetSubViewer()`.

 70:   Collective

 72:   Input Parameters:
 73: + viewer    - the `PetscViewer` that was reproduced
 74: . comm      - the sub communicator
 75: - outviewer - the subviewer to be returned

 77:   Level: advanced

 79:   Notes:
 80:   Automatically runs `PetscViewerFlush()` on `outviewer`

 82:   Must be called by all MPI processes that share `viewer`, for processes that are not of interest you can pass
 83:   `PETSC_COMM_SELF`.

 85: .seealso: [](sec_viewers), `PetscViewer`, `PetscViewerSocketOpen()`, `PetscViewerASCIIOpen()`, `PetscViewerDrawOpen()`, `PetscViewerGetSubViewer()`,
 86:           `PetscViewerFlush()`
 87: @*/
 88: PetscErrorCode PetscViewerRestoreSubViewer(PetscViewer viewer, MPI_Comm comm, PetscViewer *outviewer)
 89: {
 90:   PetscFunctionBegin;

 93:   PetscUseTypeMethod(viewer, restoresubviewer, comm, outviewer);
 94:   PetscFunctionReturn(PETSC_SUCCESS);
 95: }