Actual source code: dupl.c
 
   petsc-3.7.7 2017-09-25
   
  2: #include <petsc/private/viewerimpl.h>  /*I "petscviewer.h" I*/
  6: /*@
  7:    PetscViewerGetSubViewer - Creates a new PetscViewer (same type as the old)
  8:     that lives on a subcommunicator
 10:     Collective on PetscViewer
 12:    Input Parameter:
 13: .  viewer - the PetscViewer to be reproduced
 15:    Output Parameter:
 16: .  outviewer - new PetscViewer
 18:    Level: advanced
 20:    Notes: Call PetscViewerRestoreSubViewer() to return this PetscViewer, NOT PetscViewerDestroy()
 22:      This is most commonly used to view a sequential object that is part of a
 23:     parallel object. For example block Jacobi PC view could use this to obtain a
 24:     PetscViewer that is used with the sequential KSP on one block of the preconditioner.
 26:    Concepts: PetscViewer^sequential version
 28: .seealso: PetscViewerSocketOpen(), PetscViewerASCIIOpen(), PetscViewerDrawOpen(), PetscViewerRestoreSubViewer()
 29: @*/
 30: PetscErrorCode  PetscViewerGetSubViewer(PetscViewer viewer,MPI_Comm comm,PetscViewer *outviewer)
 31: {
 33:   PetscMPIInt    size;
 38:   MPI_Comm_size(PetscObjectComm((PetscObject)viewer),&size);
 39:   if (size == 1) {
 40:     PetscObjectReference((PetscObject)viewer);
 41:     *outviewer = viewer;
 42:   } else if (viewer->ops->getsubviewer) {
 43:     (*viewer->ops->getsubviewer)(viewer,comm,outviewer);
 44:   } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot get SubViewer PetscViewer for type %s",((PetscObject)viewer)->type_name);
 45:   PetscViewerASCIIPushSynchronized(viewer);
 46:   return(0);
 47: }
 51: /*@
 52:    PetscViewerRestoreSubViewer - Restores a new PetscViewer obtained with PetscViewerGetSubViewer().
 54:     Collective on PetscViewer
 56:    Input Parameters:
 57: +  viewer - the PetscViewer that was reproduced
 58: -  outviewer - new PetscViewer
 60:    Level: advanced
 62:    Notes: Call PetscViewerGetSubViewer() to get this PetscViewer, NOT PetscViewerCreate()
 64: .seealso: PetscViewerSocketOpen(), PetscViewerASCIIOpen(), PetscViewerDrawOpen(), PetscViewerGetSubViewer()
 65: @*/
 66: PetscErrorCode  PetscViewerRestoreSubViewer(PetscViewer viewer,MPI_Comm comm,PetscViewer *outviewer)
 67: {
 69:   PetscMPIInt    size;
 74:   MPI_Comm_size(PetscObjectComm((PetscObject)viewer),&size);
 75:   if (size == 1) {
 76:     PetscObjectDereference((PetscObject)viewer);
 77:     if (outviewer) *outviewer = NULL;
 78:   } else if (viewer->ops->restoresubviewer) {
 79:     (*viewer->ops->restoresubviewer)(viewer,comm,outviewer);
 80:   }
 81:   PetscViewerASCIIPopSynchronized(viewer);
 82:   return(0);
 83: }