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