Actual source code: dupl.c

petsc-3.11.4 2019-09-28
Report Typos and Errors

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

  4: /*@C
  5:    PetscViewerGetSubViewer - Creates a new PetscViewer (same type as the old)
  6:     that lives on a subcommunicator

  8:     Collective on PetscViewer

 10:    Input Parameter:
 11: .  viewer - the PetscViewer to be reproduced

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

 16:    Level: advanced

 18:    Notes:
 19:     Call PetscViewerRestoreSubViewer() to return this PetscViewer, NOT PetscViewerDestroy()

 21:      This is most commonly used to view a sequential object that is part of a
 22:     parallel object. For example block Jacobi PC view could use this to obtain a
 23:     PetscViewer that is used with the sequential KSP on one block of the preconditioner.

 25:    Concepts: PetscViewer^sequential version

 27: .seealso: PetscViewerSocketOpen(), PetscViewerASCIIOpen(), PetscViewerDrawOpen(), PetscViewerRestoreSubViewer()
 28: @*/
 29: PetscErrorCode  PetscViewerGetSubViewer(PetscViewer viewer,MPI_Comm comm,PetscViewer *outviewer)
 30: {
 32:   PetscMPIInt    size;

 37:   MPI_Comm_size(PetscObjectComm((PetscObject)viewer),&size);
 38:   if (size == 1) {
 39:     PetscObjectReference((PetscObject)viewer);
 40:     *outviewer = viewer;
 41:   } else if (viewer->ops->getsubviewer) {
 42:     (*viewer->ops->getsubviewer)(viewer,comm,outviewer);
 43:   } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot get SubViewer PetscViewer for type %s",((PetscObject)viewer)->type_name);
 44:   PetscViewerASCIIPushSynchronized(viewer);
 45:   return(0);
 46: }

 48: /*@C
 49:    PetscViewerRestoreSubViewer - Restores a new PetscViewer obtained with PetscViewerGetSubViewer().

 51:     Collective on PetscViewer

 53:    Input Parameters:
 54: +  viewer - the PetscViewer that was reproduced
 55: -  outviewer - new PetscViewer

 57:    Level: advanced

 59:    Notes:
 60:     Call PetscViewerGetSubViewer() to get this PetscViewer, NOT PetscViewerCreate()

 62: .seealso: PetscViewerSocketOpen(), PetscViewerASCIIOpen(), PetscViewerDrawOpen(), PetscViewerGetSubViewer()
 63: @*/
 64: PetscErrorCode  PetscViewerRestoreSubViewer(PetscViewer viewer,MPI_Comm comm,PetscViewer *outviewer)
 65: {
 67:   PetscMPIInt    size;


 72:   MPI_Comm_size(PetscObjectComm((PetscObject)viewer),&size);
 73:   if (size == 1) {
 74:     PetscObjectDereference((PetscObject)viewer);
 75:     if (outviewer) *outviewer = NULL;
 76:   } else if (viewer->ops->restoresubviewer) {
 77:     (*viewer->ops->restoresubviewer)(viewer,comm,outviewer);
 78:   }
 79:   PetscViewerASCIIPopSynchronized(viewer);
 80:   return(0);
 81: }