1 2 #include <petsc/private/viewerimpl.h> /*I "petscviewer.h" I*/ 3 4 /*@ 5 PetscViewerGetSubViewer - Creates a new PetscViewer (same type as the old) 6 that lives on a subcommunicator 7 8 Collective on PetscViewer 9 10 Input Parameter: 11 . viewer - the PetscViewer to be reproduced 12 13 Output Parameter: 14 . outviewer - new PetscViewer 15 16 Level: advanced 17 18 Notes: Call PetscViewerRestoreSubViewer() to return this PetscViewer, NOT PetscViewerDestroy() 19 20 This is most commonly used to view a sequential object that is part of a 21 parallel object. For example block Jacobi PC view could use this to obtain a 22 PetscViewer that is used with the sequential KSP on one block of the preconditioner. 23 24 Concepts: PetscViewer^sequential version 25 26 .seealso: PetscViewerSocketOpen(), PetscViewerASCIIOpen(), PetscViewerDrawOpen(), PetscViewerRestoreSubViewer() 27 @*/ 28 PetscErrorCode PetscViewerGetSubViewer(PetscViewer viewer,MPI_Comm comm,PetscViewer *outviewer) 29 { 30 PetscErrorCode ierr; 31 PetscMPIInt size; 32 33 PetscFunctionBegin; 34 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 35 PetscValidPointer(outviewer,2); 36 ierr = MPI_Comm_size(PetscObjectComm((PetscObject)viewer),&size);CHKERRQ(ierr); 37 if (size == 1) { 38 ierr = PetscObjectReference((PetscObject)viewer);CHKERRQ(ierr); 39 *outviewer = viewer; 40 } else if (viewer->ops->getsubviewer) { 41 ierr = (*viewer->ops->getsubviewer)(viewer,comm,outviewer);CHKERRQ(ierr); 42 } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot get SubViewer PetscViewer for type %s",((PetscObject)viewer)->type_name); 43 ierr = PetscViewerASCIIPushSynchronized(viewer);CHKERRQ(ierr); 44 PetscFunctionReturn(0); 45 } 46 47 /*@ 48 PetscViewerRestoreSubViewer - Restores a new PetscViewer obtained with PetscViewerGetSubViewer(). 49 50 Collective on PetscViewer 51 52 Input Parameters: 53 + viewer - the PetscViewer that was reproduced 54 - outviewer - new PetscViewer 55 56 Level: advanced 57 58 Notes: Call PetscViewerGetSubViewer() to get this PetscViewer, NOT PetscViewerCreate() 59 60 .seealso: PetscViewerSocketOpen(), PetscViewerASCIIOpen(), PetscViewerDrawOpen(), PetscViewerGetSubViewer() 61 @*/ 62 PetscErrorCode PetscViewerRestoreSubViewer(PetscViewer viewer,MPI_Comm comm,PetscViewer *outviewer) 63 { 64 PetscErrorCode ierr; 65 PetscMPIInt size; 66 67 PetscFunctionBegin; 68 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 69 70 ierr = MPI_Comm_size(PetscObjectComm((PetscObject)viewer),&size);CHKERRQ(ierr); 71 if (size == 1) { 72 ierr = PetscObjectDereference((PetscObject)viewer);CHKERRQ(ierr); 73 if (outviewer) *outviewer = NULL; 74 } else if (viewer->ops->restoresubviewer) { 75 ierr = (*viewer->ops->restoresubviewer)(viewer,comm,outviewer);CHKERRQ(ierr); 76 } 77 ierr = PetscViewerASCIIPopSynchronized(viewer);CHKERRQ(ierr); 78 PetscFunctionReturn(0); 79 } 80 81