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