xref: /petsc/src/sys/classes/viewer/interface/dupl.c (revision ce94432eddcd14845bc7e8083b7f8ea723b9bf7d)
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