Actual source code: dupl.c

petsc-3.4.4 2014-03-13
  2: #include <petsc-private/viewerimpl.h>  /*I "petscviewer.h" I*/

  6: /*@
  7:    PetscViewerGetSingleton - Creates a new PetscViewer (same type as the old)
  8:     that lives on a single processor (with MPI_comm PETSC_COMM_SELF)

 10:     Collective on PetscViewer

 12:    Input Parameter:
 13: .  viewer - the PetscViewer to be duplicated

 15:    Output Parameter:
 16: .  outviewer - new PetscViewer

 18:    Level: advanced

 20:    Notes: Call PetscViewerRestoreSingleton() 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(), PetscViewerRestoreSingleton()
 29: @*/
 30: PetscErrorCode  PetscViewerGetSingleton(PetscViewer viewer,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->getsingleton) {
 43:     (*viewer->ops->getsingleton)(viewer,outviewer);
 44:   } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot get singleton PetscViewer for type %s",((PetscObject)viewer)->type_name);
 45:   PetscViewerASCIISynchronizedAllow(viewer,PETSC_TRUE);
 46:   return(0);
 47: }

 51: /*@
 52:    PetscViewerRestoreSingleton - Restores a new PetscViewer obtained with PetscViewerGetSingleton().

 54:     Collective on PetscViewer

 56:    Input Parameters:
 57: +  viewer - the PetscViewer to be duplicated
 58: -  outviewer - new PetscViewer

 60:    Level: advanced

 62:    Notes: Call PetscViewerGetSingleton() to get this PetscViewer, NOT PetscViewerCreate()

 64: .seealso: PetscViewerSocketOpen(), PetscViewerASCIIOpen(), PetscViewerDrawOpen(), PetscViewerGetSingleton()
 65: @*/
 66: PetscErrorCode  PetscViewerRestoreSingleton(PetscViewer viewer,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 = 0;
 78:   } else if (viewer->ops->restoresingleton) {
 79:     (*viewer->ops->restoresingleton)(viewer,outviewer);
 80:   }
 81:   PetscViewerASCIISynchronizedAllow(viewer,PETSC_FALSE);
 82:   return(0);
 83: }

 87: /*@
 88:    PetscViewerGetSubcomm - Creates a new PetscViewer (same type as the old)
 89:     that lives on a subgroup of processors

 91:     Collective on PetscViewer

 93:    Input Parameter:
 94: +  viewer - the PetscViewer to be duplicated
 95: -  subcomm - MPI communicator

 97:    Output Parameter:
 98: .  outviewer - new PetscViewer

100:    Level: advanced

102:    Notes: Call PetscViewerRestoreSubcomm() to return this PetscViewer, NOT PetscViewerDestroy()

104:      This is used to view a sequential or a parallel object that is part of a larger
105:     parallel object. For example redundant PC view could use this to obtain a
106:     PetscViewer that is used within a subcommunicator on one duplicated preconditioner.

108:    Concepts: PetscViewer^sequential version

110: .seealso: PetscViewerSocketOpen(), PetscViewerASCIIOpen(), PetscViewerDrawOpen(), PetscViewerRestoreSubcomm()
111: @*/
112: PetscErrorCode  PetscViewerGetSubcomm(PetscViewer viewer,MPI_Comm subcomm,PetscViewer *outviewer)
113: {
115:   PetscMPIInt    size;

120:   MPI_Comm_size(PetscObjectComm((PetscObject)viewer),&size);
121:   if (size == 1) {
122:     PetscObjectReference((PetscObject)viewer);
123:     *outviewer = viewer;
124:   } else if (viewer->ops->getsubcomm) {
125:     (*viewer->ops->getsubcomm)(viewer,subcomm,outviewer);
126:   } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot get subcommunicator PetscViewer for type %s",((PetscObject)viewer)->type_name);
127:   return(0);
128: }

132: /*@
133:    PetscViewerRestoreSubcomm - Restores a new PetscViewer obtained with PetscViewerGetSubcomm().

135:     Collective on PetscViewer

137:    Input Parameters:
138: +  viewer - the PetscViewer to be duplicated
139: .  subcomm - MPI communicator
140: -  outviewer - new PetscViewer

142:    Level: advanced

144:    Notes: Call PetscViewerGetSubcomm() to get this PetscViewer, NOT PetscViewerCreate()

146: .seealso: PetscViewerSocketOpen(), PetscViewerASCIIOpen(), PetscViewerDrawOpen(), PetscViewerGetSubcomm()
147: @*/
148: PetscErrorCode  PetscViewerRestoreSubcomm(PetscViewer viewer,MPI_Comm subcomm,PetscViewer *outviewer)
149: {
151:   PetscMPIInt    size;


156:   MPI_Comm_size(PetscObjectComm((PetscObject)viewer),&size);
157:   if (size == 1 || (outviewer && viewer == *outviewer)) {
158:     PetscObjectDereference((PetscObject)viewer);
159:     if (outviewer) *outviewer = 0;
160:   } else if (viewer->ops->restoresubcomm) {
161:     (*viewer->ops->restoresubcomm)(viewer,subcomm,outviewer);
162:   }
163:   return(0);
164: }