1 2 #include <petsc/private/viewerimpl.h> /*I "petscviewer.h" I*/ 3 4 /*@C 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: 19 Call PetscViewerRestoreSubViewer() to return this PetscViewer, NOT PetscViewerDestroy() 20 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. 24 25 Concepts: PetscViewer^sequential version 26 27 .seealso: PetscViewerSocketOpen(), PetscViewerASCIIOpen(), PetscViewerDrawOpen(), PetscViewerRestoreSubViewer() 28 @*/ 29 PetscErrorCode PetscViewerGetSubViewer(PetscViewer viewer,MPI_Comm comm,PetscViewer *outviewer) 30 { 31 PetscErrorCode ierr; 32 PetscMPIInt size; 33 34 PetscFunctionBegin; 35 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 36 PetscValidPointer(outviewer,2); 37 ierr = MPI_Comm_size(PetscObjectComm((PetscObject)viewer),&size);CHKERRQ(ierr); 38 if (size == 1) { 39 ierr = PetscObjectReference((PetscObject)viewer);CHKERRQ(ierr); 40 *outviewer = viewer; 41 } else if (viewer->ops->getsubviewer) { 42 ierr = (*viewer->ops->getsubviewer)(viewer,comm,outviewer);CHKERRQ(ierr); 43 } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot get SubViewer PetscViewer for type %s",((PetscObject)viewer)->type_name); 44 ierr = PetscViewerASCIIPushSynchronized(viewer);CHKERRQ(ierr); 45 PetscFunctionReturn(0); 46 } 47 48 /*@C 49 PetscViewerRestoreSubViewer - Restores a new PetscViewer obtained with PetscViewerGetSubViewer(). 50 51 Collective on PetscViewer 52 53 Input Parameters: 54 + viewer - the PetscViewer that was reproduced 55 - outviewer - new PetscViewer 56 57 Level: advanced 58 59 Notes: 60 Call PetscViewerGetSubViewer() to get this PetscViewer, NOT PetscViewerCreate() 61 62 .seealso: PetscViewerSocketOpen(), PetscViewerASCIIOpen(), PetscViewerDrawOpen(), PetscViewerGetSubViewer() 63 @*/ 64 PetscErrorCode PetscViewerRestoreSubViewer(PetscViewer viewer,MPI_Comm comm,PetscViewer *outviewer) 65 { 66 PetscErrorCode ierr; 67 PetscMPIInt size; 68 69 PetscFunctionBegin; 70 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 71 72 ierr = MPI_Comm_size(PetscObjectComm((PetscObject)viewer),&size);CHKERRQ(ierr); 73 if (size == 1) { 74 ierr = PetscObjectDereference((PetscObject)viewer);CHKERRQ(ierr); 75 if (outviewer) *outviewer = NULL; 76 } else if (viewer->ops->restoresubviewer) { 77 ierr = (*viewer->ops->restoresubviewer)(viewer,comm,outviewer);CHKERRQ(ierr); 78 } 79 ierr = PetscViewerASCIIPopSynchronized(viewer);CHKERRQ(ierr); 80 PetscFunctionReturn(0); 81 } 82 83