xref: /petsc/src/sys/classes/viewer/interface/dupl.c (revision c6228bba3efb3955e5e29a4ef79e8b65616d20d2)
15c6c1daeSBarry Smith 
2af0996ceSBarry Smith #include <petsc/private/viewerimpl.h>  /*I "petscviewer.h" I*/
35c6c1daeSBarry Smith 
45c6c1daeSBarry Smith #undef __FUNCT__
53f08860eSBarry Smith #define __FUNCT__ "PetscViewerGetSubViewer"
65c6c1daeSBarry Smith /*@
73f08860eSBarry Smith    PetscViewerGetSubViewer - Creates a new PetscViewer (same type as the old)
83f08860eSBarry Smith     that lives on a subcommunicator
95c6c1daeSBarry Smith 
105c6c1daeSBarry Smith     Collective on PetscViewer
115c6c1daeSBarry Smith 
125c6c1daeSBarry Smith    Input Parameter:
133f08860eSBarry Smith .  viewer - the PetscViewer to be reproduced
145c6c1daeSBarry Smith 
155c6c1daeSBarry Smith    Output Parameter:
165c6c1daeSBarry Smith .  outviewer - new PetscViewer
175c6c1daeSBarry Smith 
185c6c1daeSBarry Smith    Level: advanced
195c6c1daeSBarry Smith 
203f08860eSBarry Smith    Notes: Call PetscViewerRestoreSubViewer() 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 
283f08860eSBarry Smith .seealso: PetscViewerSocketOpen(), PetscViewerASCIIOpen(), PetscViewerDrawOpen(), PetscViewerRestoreSubViewer()
295c6c1daeSBarry Smith @*/
303f08860eSBarry Smith PetscErrorCode  PetscViewerGetSubViewer(PetscViewer viewer,MPI_Comm comm,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);
38ce94432eSBarry 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;
42559f443fSBarry Smith   } else if (viewer->ops->getsubviewer) {
43559f443fSBarry Smith     ierr = (*viewer->ops->getsubviewer)(viewer,comm,outviewer);CHKERRQ(ierr);
443f08860eSBarry Smith   } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot get SubViewer PetscViewer for type %s",((PetscObject)viewer)->type_name);
451575c14dSBarry Smith   ierr = PetscViewerASCIIPushSynchronized(viewer);CHKERRQ(ierr);
465c6c1daeSBarry Smith   PetscFunctionReturn(0);
475c6c1daeSBarry Smith }
485c6c1daeSBarry Smith 
495c6c1daeSBarry Smith #undef __FUNCT__
503f08860eSBarry Smith #define __FUNCT__ "PetscViewerRestoreSubViewer"
515c6c1daeSBarry Smith /*@
523f08860eSBarry Smith    PetscViewerRestoreSubViewer - Restores a new PetscViewer obtained with PetscViewerGetSubViewer().
535c6c1daeSBarry Smith 
545c6c1daeSBarry Smith     Collective on PetscViewer
555c6c1daeSBarry Smith 
565c6c1daeSBarry Smith    Input Parameters:
573f08860eSBarry Smith +  viewer - the PetscViewer that was reproduced
585c6c1daeSBarry Smith -  outviewer - new PetscViewer
595c6c1daeSBarry Smith 
605c6c1daeSBarry Smith    Level: advanced
615c6c1daeSBarry Smith 
623f08860eSBarry Smith    Notes: Call PetscViewerGetSubViewer() to get this PetscViewer, NOT PetscViewerCreate()
635c6c1daeSBarry Smith 
643f08860eSBarry Smith .seealso: PetscViewerSocketOpen(), PetscViewerASCIIOpen(), PetscViewerDrawOpen(), PetscViewerGetSubViewer()
655c6c1daeSBarry Smith @*/
663f08860eSBarry Smith PetscErrorCode  PetscViewerRestoreSubViewer(PetscViewer viewer,MPI_Comm comm,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 
74ce94432eSBarry Smith   ierr = MPI_Comm_size(PetscObjectComm((PetscObject)viewer),&size);CHKERRQ(ierr);
755c6c1daeSBarry Smith   if (size == 1) {
765c6c1daeSBarry Smith     ierr = PetscObjectDereference((PetscObject)viewer);CHKERRQ(ierr);
77*c6228bbaSLisandro Dalcin     if (outviewer) *outviewer = NULL;
78559f443fSBarry Smith   } else if (viewer->ops->restoresubviewer) {
79559f443fSBarry Smith     ierr = (*viewer->ops->restoresubviewer)(viewer,comm,outviewer);CHKERRQ(ierr);
805c6c1daeSBarry Smith   }
811575c14dSBarry Smith   ierr = PetscViewerASCIIPopSynchronized(viewer);CHKERRQ(ierr);
825c6c1daeSBarry Smith   PetscFunctionReturn(0);
835c6c1daeSBarry Smith }
845c6c1daeSBarry Smith 
85