1*5c6c1daeSBarry Smith 2*5c6c1daeSBarry Smith #include <petsc-private/viewerimpl.h> /*I "petscviewer.h" I*/ 3*5c6c1daeSBarry Smith 4*5c6c1daeSBarry Smith #undef __FUNCT__ 5*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerGetSingleton" 6*5c6c1daeSBarry Smith /*@ 7*5c6c1daeSBarry Smith PetscViewerGetSingleton - Creates a new PetscViewer (same type as the old) 8*5c6c1daeSBarry Smith that lives on a single processor (with MPI_comm PETSC_COMM_SELF) 9*5c6c1daeSBarry Smith 10*5c6c1daeSBarry Smith Collective on PetscViewer 11*5c6c1daeSBarry Smith 12*5c6c1daeSBarry Smith Input Parameter: 13*5c6c1daeSBarry Smith . viewer - the PetscViewer to be duplicated 14*5c6c1daeSBarry Smith 15*5c6c1daeSBarry Smith Output Parameter: 16*5c6c1daeSBarry Smith . outviewer - new PetscViewer 17*5c6c1daeSBarry Smith 18*5c6c1daeSBarry Smith Level: advanced 19*5c6c1daeSBarry Smith 20*5c6c1daeSBarry Smith Notes: Call PetscViewerRestoreSingleton() to return this PetscViewer, NOT PetscViewerDestroy() 21*5c6c1daeSBarry Smith 22*5c6c1daeSBarry Smith This is most commonly used to view a sequential object that is part of a 23*5c6c1daeSBarry Smith parallel object. For example block Jacobi PC view could use this to obtain a 24*5c6c1daeSBarry Smith PetscViewer that is used with the sequential KSP on one block of the preconditioner. 25*5c6c1daeSBarry Smith 26*5c6c1daeSBarry Smith Concepts: PetscViewer^sequential version 27*5c6c1daeSBarry Smith 28*5c6c1daeSBarry Smith .seealso: PetscViewerSocketOpen(), PetscViewerASCIIOpen(), PetscViewerDrawOpen(), PetscViewerRestoreSingleton() 29*5c6c1daeSBarry Smith @*/ 30*5c6c1daeSBarry Smith PetscErrorCode PetscViewerGetSingleton(PetscViewer viewer,PetscViewer *outviewer) 31*5c6c1daeSBarry Smith { 32*5c6c1daeSBarry Smith PetscErrorCode ierr; 33*5c6c1daeSBarry Smith PetscMPIInt size; 34*5c6c1daeSBarry Smith 35*5c6c1daeSBarry Smith PetscFunctionBegin; 36*5c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 37*5c6c1daeSBarry Smith PetscValidPointer(outviewer,2); 38*5c6c1daeSBarry Smith ierr = MPI_Comm_size(((PetscObject)viewer)->comm,&size);CHKERRQ(ierr); 39*5c6c1daeSBarry Smith if (size == 1) { 40*5c6c1daeSBarry Smith ierr = PetscObjectReference((PetscObject)viewer);CHKERRQ(ierr); 41*5c6c1daeSBarry Smith *outviewer = viewer; 42*5c6c1daeSBarry Smith } else if (viewer->ops->getsingleton) { 43*5c6c1daeSBarry Smith ierr = (*viewer->ops->getsingleton)(viewer,outviewer);CHKERRQ(ierr); 44*5c6c1daeSBarry Smith } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot get singleton PetscViewer for type %s",((PetscObject)viewer)->type_name); 45*5c6c1daeSBarry Smith ierr = PetscViewerASCIISynchronizedAllow(viewer,PETSC_TRUE);CHKERRQ(ierr); 46*5c6c1daeSBarry Smith PetscFunctionReturn(0); 47*5c6c1daeSBarry Smith } 48*5c6c1daeSBarry Smith 49*5c6c1daeSBarry Smith #undef __FUNCT__ 50*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerRestoreSingleton" 51*5c6c1daeSBarry Smith /*@ 52*5c6c1daeSBarry Smith PetscViewerRestoreSingleton - Restores a new PetscViewer obtained with PetscViewerGetSingleton(). 53*5c6c1daeSBarry Smith 54*5c6c1daeSBarry Smith Collective on PetscViewer 55*5c6c1daeSBarry Smith 56*5c6c1daeSBarry Smith Input Parameters: 57*5c6c1daeSBarry Smith + viewer - the PetscViewer to be duplicated 58*5c6c1daeSBarry Smith - outviewer - new PetscViewer 59*5c6c1daeSBarry Smith 60*5c6c1daeSBarry Smith Level: advanced 61*5c6c1daeSBarry Smith 62*5c6c1daeSBarry Smith Notes: Call PetscViewerGetSingleton() to get this PetscViewer, NOT PetscViewerCreate() 63*5c6c1daeSBarry Smith 64*5c6c1daeSBarry Smith .seealso: PetscViewerSocketOpen(), PetscViewerASCIIOpen(), PetscViewerDrawOpen(), PetscViewerGetSingleton() 65*5c6c1daeSBarry Smith @*/ 66*5c6c1daeSBarry Smith PetscErrorCode PetscViewerRestoreSingleton(PetscViewer viewer,PetscViewer *outviewer) 67*5c6c1daeSBarry Smith { 68*5c6c1daeSBarry Smith PetscErrorCode ierr; 69*5c6c1daeSBarry Smith PetscMPIInt size; 70*5c6c1daeSBarry Smith 71*5c6c1daeSBarry Smith PetscFunctionBegin; 72*5c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 73*5c6c1daeSBarry Smith 74*5c6c1daeSBarry Smith ierr = MPI_Comm_size(((PetscObject)viewer)->comm,&size);CHKERRQ(ierr); 75*5c6c1daeSBarry Smith if (size == 1) { 76*5c6c1daeSBarry Smith ierr = PetscObjectDereference((PetscObject)viewer);CHKERRQ(ierr); 77*5c6c1daeSBarry Smith if (outviewer) *outviewer = 0; 78*5c6c1daeSBarry Smith } else if (viewer->ops->restoresingleton) { 79*5c6c1daeSBarry Smith ierr = (*viewer->ops->restoresingleton)(viewer,outviewer);CHKERRQ(ierr); 80*5c6c1daeSBarry Smith } 81*5c6c1daeSBarry Smith ierr = PetscViewerASCIISynchronizedAllow(viewer,PETSC_FALSE);CHKERRQ(ierr); 82*5c6c1daeSBarry Smith PetscFunctionReturn(0); 83*5c6c1daeSBarry Smith } 84*5c6c1daeSBarry Smith 85*5c6c1daeSBarry Smith #undef __FUNCT__ 86*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerGetSubcomm" 87*5c6c1daeSBarry Smith /*@ 88*5c6c1daeSBarry Smith PetscViewerGetSubcomm - Creates a new PetscViewer (same type as the old) 89*5c6c1daeSBarry Smith that lives on a subgroup of processors 90*5c6c1daeSBarry Smith 91*5c6c1daeSBarry Smith Collective on PetscViewer 92*5c6c1daeSBarry Smith 93*5c6c1daeSBarry Smith Input Parameter: 94*5c6c1daeSBarry Smith + viewer - the PetscViewer to be duplicated 95*5c6c1daeSBarry Smith - subcomm - MPI communicator 96*5c6c1daeSBarry Smith 97*5c6c1daeSBarry Smith Output Parameter: 98*5c6c1daeSBarry Smith . outviewer - new PetscViewer 99*5c6c1daeSBarry Smith 100*5c6c1daeSBarry Smith Level: advanced 101*5c6c1daeSBarry Smith 102*5c6c1daeSBarry Smith Notes: Call PetscViewerRestoreSubcomm() to return this PetscViewer, NOT PetscViewerDestroy() 103*5c6c1daeSBarry Smith 104*5c6c1daeSBarry Smith This is used to view a sequential or a parallel object that is part of a larger 105*5c6c1daeSBarry Smith parallel object. For example redundant PC view could use this to obtain a 106*5c6c1daeSBarry Smith PetscViewer that is used within a subcommunicator on one duplicated preconditioner. 107*5c6c1daeSBarry Smith 108*5c6c1daeSBarry Smith Concepts: PetscViewer^sequential version 109*5c6c1daeSBarry Smith 110*5c6c1daeSBarry Smith .seealso: PetscViewerSocketOpen(), PetscViewerASCIIOpen(), PetscViewerDrawOpen(), PetscViewerRestoreSubcomm() 111*5c6c1daeSBarry Smith @*/ 112*5c6c1daeSBarry Smith PetscErrorCode PetscViewerGetSubcomm(PetscViewer viewer,MPI_Comm subcomm,PetscViewer *outviewer) 113*5c6c1daeSBarry Smith { 114*5c6c1daeSBarry Smith PetscErrorCode ierr; 115*5c6c1daeSBarry Smith PetscMPIInt size; 116*5c6c1daeSBarry Smith 117*5c6c1daeSBarry Smith PetscFunctionBegin; 118*5c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 119*5c6c1daeSBarry Smith PetscValidPointer(outviewer,3); 120*5c6c1daeSBarry Smith ierr = MPI_Comm_size(((PetscObject)viewer)->comm,&size);CHKERRQ(ierr); 121*5c6c1daeSBarry Smith if (size == 1) { 122*5c6c1daeSBarry Smith ierr = PetscObjectReference((PetscObject)viewer);CHKERRQ(ierr); 123*5c6c1daeSBarry Smith *outviewer = viewer; 124*5c6c1daeSBarry Smith } else if (viewer->ops->getsubcomm) { 125*5c6c1daeSBarry Smith ierr = (*viewer->ops->getsubcomm)(viewer,subcomm,outviewer);CHKERRQ(ierr); 126*5c6c1daeSBarry Smith } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot get subcommunicator PetscViewer for type %s",((PetscObject)viewer)->type_name); 127*5c6c1daeSBarry Smith PetscFunctionReturn(0); 128*5c6c1daeSBarry Smith } 129*5c6c1daeSBarry Smith 130*5c6c1daeSBarry Smith #undef __FUNCT__ 131*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerRestoreSubcomm" 132*5c6c1daeSBarry Smith /*@ 133*5c6c1daeSBarry Smith PetscViewerRestoreSubcomm - Restores a new PetscViewer obtained with PetscViewerGetSubcomm(). 134*5c6c1daeSBarry Smith 135*5c6c1daeSBarry Smith Collective on PetscViewer 136*5c6c1daeSBarry Smith 137*5c6c1daeSBarry Smith Input Parameters: 138*5c6c1daeSBarry Smith + viewer - the PetscViewer to be duplicated 139*5c6c1daeSBarry Smith . subcomm - MPI communicator 140*5c6c1daeSBarry Smith - outviewer - new PetscViewer 141*5c6c1daeSBarry Smith 142*5c6c1daeSBarry Smith Level: advanced 143*5c6c1daeSBarry Smith 144*5c6c1daeSBarry Smith Notes: Call PetscViewerGetSubcomm() to get this PetscViewer, NOT PetscViewerCreate() 145*5c6c1daeSBarry Smith 146*5c6c1daeSBarry Smith .seealso: PetscViewerSocketOpen(), PetscViewerASCIIOpen(), PetscViewerDrawOpen(), PetscViewerGetSubcomm() 147*5c6c1daeSBarry Smith @*/ 148*5c6c1daeSBarry Smith PetscErrorCode PetscViewerRestoreSubcomm(PetscViewer viewer,MPI_Comm subcomm,PetscViewer *outviewer) 149*5c6c1daeSBarry Smith { 150*5c6c1daeSBarry Smith PetscErrorCode ierr; 151*5c6c1daeSBarry Smith PetscMPIInt size; 152*5c6c1daeSBarry Smith 153*5c6c1daeSBarry Smith PetscFunctionBegin; 154*5c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 155*5c6c1daeSBarry Smith 156*5c6c1daeSBarry Smith ierr = MPI_Comm_size(((PetscObject)viewer)->comm,&size);CHKERRQ(ierr); 157*5c6c1daeSBarry Smith if (size == 1 || (outviewer && viewer == *outviewer)) { 158*5c6c1daeSBarry Smith ierr = PetscObjectDereference((PetscObject)viewer);CHKERRQ(ierr); 159*5c6c1daeSBarry Smith if (outviewer) *outviewer = 0; 160*5c6c1daeSBarry Smith } else if (viewer->ops->restoresubcomm) { 161*5c6c1daeSBarry Smith ierr = (*viewer->ops->restoresubcomm)(viewer,subcomm,outviewer);CHKERRQ(ierr); 162*5c6c1daeSBarry Smith } 163*5c6c1daeSBarry Smith PetscFunctionReturn(0); 164*5c6c1daeSBarry Smith } 165*5c6c1daeSBarry Smith 166