15c6c1daeSBarry Smith 25c6c1daeSBarry Smith #include <petsc-private/viewerimpl.h> /*I "petscviewer.h" I*/ 35c6c1daeSBarry Smith 45c6c1daeSBarry Smith #undef __FUNCT__ 55c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerGetSingleton" 65c6c1daeSBarry Smith /*@ 75c6c1daeSBarry Smith PetscViewerGetSingleton - Creates a new PetscViewer (same type as the old) 85c6c1daeSBarry Smith that lives on a single processor (with MPI_comm PETSC_COMM_SELF) 95c6c1daeSBarry Smith 105c6c1daeSBarry Smith Collective on PetscViewer 115c6c1daeSBarry Smith 125c6c1daeSBarry Smith Input Parameter: 135c6c1daeSBarry Smith . viewer - the PetscViewer to be duplicated 145c6c1daeSBarry Smith 155c6c1daeSBarry Smith Output Parameter: 165c6c1daeSBarry Smith . outviewer - new PetscViewer 175c6c1daeSBarry Smith 185c6c1daeSBarry Smith Level: advanced 195c6c1daeSBarry Smith 205c6c1daeSBarry Smith Notes: Call PetscViewerRestoreSingleton() to return this PetscViewer, NOT PetscViewerDestroy() 215c6c1daeSBarry Smith 225c6c1daeSBarry Smith This is most commonly used to view a sequential object that is part of a 235c6c1daeSBarry Smith parallel object. For example block Jacobi PC view could use this to obtain a 245c6c1daeSBarry Smith PetscViewer that is used with the sequential KSP on one block of the preconditioner. 255c6c1daeSBarry Smith 265c6c1daeSBarry Smith Concepts: PetscViewer^sequential version 275c6c1daeSBarry Smith 285c6c1daeSBarry Smith .seealso: PetscViewerSocketOpen(), PetscViewerASCIIOpen(), PetscViewerDrawOpen(), PetscViewerRestoreSingleton() 295c6c1daeSBarry Smith @*/ 305c6c1daeSBarry Smith PetscErrorCode PetscViewerGetSingleton(PetscViewer viewer,PetscViewer *outviewer) 315c6c1daeSBarry Smith { 325c6c1daeSBarry Smith PetscErrorCode ierr; 335c6c1daeSBarry Smith PetscMPIInt size; 345c6c1daeSBarry Smith 355c6c1daeSBarry Smith PetscFunctionBegin; 365c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 375c6c1daeSBarry Smith PetscValidPointer(outviewer,2); 38*ce94432eSBarry Smith ierr = MPI_Comm_size(PetscObjectComm((PetscObject)viewer),&size);CHKERRQ(ierr); 395c6c1daeSBarry Smith if (size == 1) { 405c6c1daeSBarry Smith ierr = PetscObjectReference((PetscObject)viewer);CHKERRQ(ierr); 415c6c1daeSBarry Smith *outviewer = viewer; 425c6c1daeSBarry Smith } else if (viewer->ops->getsingleton) { 435c6c1daeSBarry Smith ierr = (*viewer->ops->getsingleton)(viewer,outviewer);CHKERRQ(ierr); 445c6c1daeSBarry Smith } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot get singleton PetscViewer for type %s",((PetscObject)viewer)->type_name); 455c6c1daeSBarry Smith ierr = PetscViewerASCIISynchronizedAllow(viewer,PETSC_TRUE);CHKERRQ(ierr); 465c6c1daeSBarry Smith PetscFunctionReturn(0); 475c6c1daeSBarry Smith } 485c6c1daeSBarry Smith 495c6c1daeSBarry Smith #undef __FUNCT__ 505c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerRestoreSingleton" 515c6c1daeSBarry Smith /*@ 525c6c1daeSBarry Smith PetscViewerRestoreSingleton - Restores a new PetscViewer obtained with PetscViewerGetSingleton(). 535c6c1daeSBarry Smith 545c6c1daeSBarry Smith Collective on PetscViewer 555c6c1daeSBarry Smith 565c6c1daeSBarry Smith Input Parameters: 575c6c1daeSBarry Smith + viewer - the PetscViewer to be duplicated 585c6c1daeSBarry Smith - outviewer - new PetscViewer 595c6c1daeSBarry Smith 605c6c1daeSBarry Smith Level: advanced 615c6c1daeSBarry Smith 625c6c1daeSBarry Smith Notes: Call PetscViewerGetSingleton() to get this PetscViewer, NOT PetscViewerCreate() 635c6c1daeSBarry Smith 645c6c1daeSBarry Smith .seealso: PetscViewerSocketOpen(), PetscViewerASCIIOpen(), PetscViewerDrawOpen(), PetscViewerGetSingleton() 655c6c1daeSBarry Smith @*/ 665c6c1daeSBarry Smith PetscErrorCode PetscViewerRestoreSingleton(PetscViewer viewer,PetscViewer *outviewer) 675c6c1daeSBarry Smith { 685c6c1daeSBarry Smith PetscErrorCode ierr; 695c6c1daeSBarry Smith PetscMPIInt size; 705c6c1daeSBarry Smith 715c6c1daeSBarry Smith PetscFunctionBegin; 725c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 735c6c1daeSBarry Smith 74*ce94432eSBarry Smith ierr = MPI_Comm_size(PetscObjectComm((PetscObject)viewer),&size);CHKERRQ(ierr); 755c6c1daeSBarry Smith if (size == 1) { 765c6c1daeSBarry Smith ierr = PetscObjectDereference((PetscObject)viewer);CHKERRQ(ierr); 775c6c1daeSBarry Smith if (outviewer) *outviewer = 0; 785c6c1daeSBarry Smith } else if (viewer->ops->restoresingleton) { 795c6c1daeSBarry Smith ierr = (*viewer->ops->restoresingleton)(viewer,outviewer);CHKERRQ(ierr); 805c6c1daeSBarry Smith } 815c6c1daeSBarry Smith ierr = PetscViewerASCIISynchronizedAllow(viewer,PETSC_FALSE);CHKERRQ(ierr); 825c6c1daeSBarry Smith PetscFunctionReturn(0); 835c6c1daeSBarry Smith } 845c6c1daeSBarry Smith 855c6c1daeSBarry Smith #undef __FUNCT__ 865c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerGetSubcomm" 875c6c1daeSBarry Smith /*@ 885c6c1daeSBarry Smith PetscViewerGetSubcomm - Creates a new PetscViewer (same type as the old) 895c6c1daeSBarry Smith that lives on a subgroup of processors 905c6c1daeSBarry Smith 915c6c1daeSBarry Smith Collective on PetscViewer 925c6c1daeSBarry Smith 935c6c1daeSBarry Smith Input Parameter: 945c6c1daeSBarry Smith + viewer - the PetscViewer to be duplicated 955c6c1daeSBarry Smith - subcomm - MPI communicator 965c6c1daeSBarry Smith 975c6c1daeSBarry Smith Output Parameter: 985c6c1daeSBarry Smith . outviewer - new PetscViewer 995c6c1daeSBarry Smith 1005c6c1daeSBarry Smith Level: advanced 1015c6c1daeSBarry Smith 1025c6c1daeSBarry Smith Notes: Call PetscViewerRestoreSubcomm() to return this PetscViewer, NOT PetscViewerDestroy() 1035c6c1daeSBarry Smith 1045c6c1daeSBarry Smith This is used to view a sequential or a parallel object that is part of a larger 1055c6c1daeSBarry Smith parallel object. For example redundant PC view could use this to obtain a 1065c6c1daeSBarry Smith PetscViewer that is used within a subcommunicator on one duplicated preconditioner. 1075c6c1daeSBarry Smith 1085c6c1daeSBarry Smith Concepts: PetscViewer^sequential version 1095c6c1daeSBarry Smith 1105c6c1daeSBarry Smith .seealso: PetscViewerSocketOpen(), PetscViewerASCIIOpen(), PetscViewerDrawOpen(), PetscViewerRestoreSubcomm() 1115c6c1daeSBarry Smith @*/ 1125c6c1daeSBarry Smith PetscErrorCode PetscViewerGetSubcomm(PetscViewer viewer,MPI_Comm subcomm,PetscViewer *outviewer) 1135c6c1daeSBarry Smith { 1145c6c1daeSBarry Smith PetscErrorCode ierr; 1155c6c1daeSBarry Smith PetscMPIInt size; 1165c6c1daeSBarry Smith 1175c6c1daeSBarry Smith PetscFunctionBegin; 1185c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 1195c6c1daeSBarry Smith PetscValidPointer(outviewer,3); 120*ce94432eSBarry Smith ierr = MPI_Comm_size(PetscObjectComm((PetscObject)viewer),&size);CHKERRQ(ierr); 1215c6c1daeSBarry Smith if (size == 1) { 1225c6c1daeSBarry Smith ierr = PetscObjectReference((PetscObject)viewer);CHKERRQ(ierr); 1235c6c1daeSBarry Smith *outviewer = viewer; 1245c6c1daeSBarry Smith } else if (viewer->ops->getsubcomm) { 1255c6c1daeSBarry Smith ierr = (*viewer->ops->getsubcomm)(viewer,subcomm,outviewer);CHKERRQ(ierr); 1265c6c1daeSBarry Smith } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot get subcommunicator PetscViewer for type %s",((PetscObject)viewer)->type_name); 1275c6c1daeSBarry Smith PetscFunctionReturn(0); 1285c6c1daeSBarry Smith } 1295c6c1daeSBarry Smith 1305c6c1daeSBarry Smith #undef __FUNCT__ 1315c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerRestoreSubcomm" 1325c6c1daeSBarry Smith /*@ 1335c6c1daeSBarry Smith PetscViewerRestoreSubcomm - Restores a new PetscViewer obtained with PetscViewerGetSubcomm(). 1345c6c1daeSBarry Smith 1355c6c1daeSBarry Smith Collective on PetscViewer 1365c6c1daeSBarry Smith 1375c6c1daeSBarry Smith Input Parameters: 1385c6c1daeSBarry Smith + viewer - the PetscViewer to be duplicated 1395c6c1daeSBarry Smith . subcomm - MPI communicator 1405c6c1daeSBarry Smith - outviewer - new PetscViewer 1415c6c1daeSBarry Smith 1425c6c1daeSBarry Smith Level: advanced 1435c6c1daeSBarry Smith 1445c6c1daeSBarry Smith Notes: Call PetscViewerGetSubcomm() to get this PetscViewer, NOT PetscViewerCreate() 1455c6c1daeSBarry Smith 1465c6c1daeSBarry Smith .seealso: PetscViewerSocketOpen(), PetscViewerASCIIOpen(), PetscViewerDrawOpen(), PetscViewerGetSubcomm() 1475c6c1daeSBarry Smith @*/ 1485c6c1daeSBarry Smith PetscErrorCode PetscViewerRestoreSubcomm(PetscViewer viewer,MPI_Comm subcomm,PetscViewer *outviewer) 1495c6c1daeSBarry Smith { 1505c6c1daeSBarry Smith PetscErrorCode ierr; 1515c6c1daeSBarry Smith PetscMPIInt size; 1525c6c1daeSBarry Smith 1535c6c1daeSBarry Smith PetscFunctionBegin; 1545c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); 1555c6c1daeSBarry Smith 156*ce94432eSBarry Smith ierr = MPI_Comm_size(PetscObjectComm((PetscObject)viewer),&size);CHKERRQ(ierr); 1575c6c1daeSBarry Smith if (size == 1 || (outviewer && viewer == *outviewer)) { 1585c6c1daeSBarry Smith ierr = PetscObjectDereference((PetscObject)viewer);CHKERRQ(ierr); 1595c6c1daeSBarry Smith if (outviewer) *outviewer = 0; 1605c6c1daeSBarry Smith } else if (viewer->ops->restoresubcomm) { 1615c6c1daeSBarry Smith ierr = (*viewer->ops->restoresubcomm)(viewer,subcomm,outviewer);CHKERRQ(ierr); 1625c6c1daeSBarry Smith } 1635c6c1daeSBarry Smith PetscFunctionReturn(0); 1645c6c1daeSBarry Smith } 1655c6c1daeSBarry Smith 166