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