xref: /petsc/src/sys/classes/viewer/interface/dupl.c (revision 5c6c1daec53e1d9ab0bec9db5309fd8fc7645b8d)
1*5c6c1daeSBarry Smith 
2*5c6c1daeSBarry Smith #include <petsc-private/viewerimpl.h>  /*I "petscviewer.h" I*/
3*5c6c1daeSBarry Smith 
4*5c6c1daeSBarry Smith #undef __FUNCT__
5*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerGetSingleton"
6*5c6c1daeSBarry Smith /*@
7*5c6c1daeSBarry Smith    PetscViewerGetSingleton - Creates a new PetscViewer (same type as the old)
8*5c6c1daeSBarry Smith     that lives on a single processor (with MPI_comm PETSC_COMM_SELF)
9*5c6c1daeSBarry Smith 
10*5c6c1daeSBarry Smith     Collective on PetscViewer
11*5c6c1daeSBarry Smith 
12*5c6c1daeSBarry Smith    Input Parameter:
13*5c6c1daeSBarry Smith .  viewer - the PetscViewer to be duplicated
14*5c6c1daeSBarry Smith 
15*5c6c1daeSBarry Smith    Output Parameter:
16*5c6c1daeSBarry Smith .  outviewer - new PetscViewer
17*5c6c1daeSBarry Smith 
18*5c6c1daeSBarry Smith    Level: advanced
19*5c6c1daeSBarry Smith 
20*5c6c1daeSBarry Smith    Notes: Call PetscViewerRestoreSingleton() to return this PetscViewer, NOT PetscViewerDestroy()
21*5c6c1daeSBarry Smith 
22*5c6c1daeSBarry Smith      This is most commonly used to view a sequential object that is part of a
23*5c6c1daeSBarry Smith     parallel object. For example block Jacobi PC view could use this to obtain a
24*5c6c1daeSBarry Smith     PetscViewer that is used with the sequential KSP on one block of the preconditioner.
25*5c6c1daeSBarry Smith 
26*5c6c1daeSBarry Smith    Concepts: PetscViewer^sequential version
27*5c6c1daeSBarry Smith 
28*5c6c1daeSBarry Smith .seealso: PetscViewerSocketOpen(), PetscViewerASCIIOpen(), PetscViewerDrawOpen(), PetscViewerRestoreSingleton()
29*5c6c1daeSBarry Smith @*/
30*5c6c1daeSBarry Smith PetscErrorCode  PetscViewerGetSingleton(PetscViewer viewer,PetscViewer *outviewer)
31*5c6c1daeSBarry Smith {
32*5c6c1daeSBarry Smith   PetscErrorCode ierr;
33*5c6c1daeSBarry Smith   PetscMPIInt    size;
34*5c6c1daeSBarry Smith 
35*5c6c1daeSBarry Smith   PetscFunctionBegin;
36*5c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
37*5c6c1daeSBarry Smith   PetscValidPointer(outviewer,2);
38*5c6c1daeSBarry Smith   ierr = MPI_Comm_size(((PetscObject)viewer)->comm,&size);CHKERRQ(ierr);
39*5c6c1daeSBarry Smith   if (size == 1) {
40*5c6c1daeSBarry Smith     ierr = PetscObjectReference((PetscObject)viewer);CHKERRQ(ierr);
41*5c6c1daeSBarry Smith     *outviewer = viewer;
42*5c6c1daeSBarry Smith   } else if (viewer->ops->getsingleton) {
43*5c6c1daeSBarry Smith     ierr = (*viewer->ops->getsingleton)(viewer,outviewer);CHKERRQ(ierr);
44*5c6c1daeSBarry Smith   } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot get singleton PetscViewer for type %s",((PetscObject)viewer)->type_name);
45*5c6c1daeSBarry Smith   ierr = PetscViewerASCIISynchronizedAllow(viewer,PETSC_TRUE);CHKERRQ(ierr);
46*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
47*5c6c1daeSBarry Smith }
48*5c6c1daeSBarry Smith 
49*5c6c1daeSBarry Smith #undef __FUNCT__
50*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerRestoreSingleton"
51*5c6c1daeSBarry Smith /*@
52*5c6c1daeSBarry Smith    PetscViewerRestoreSingleton - Restores a new PetscViewer obtained with PetscViewerGetSingleton().
53*5c6c1daeSBarry Smith 
54*5c6c1daeSBarry Smith     Collective on PetscViewer
55*5c6c1daeSBarry Smith 
56*5c6c1daeSBarry Smith    Input Parameters:
57*5c6c1daeSBarry Smith +  viewer - the PetscViewer to be duplicated
58*5c6c1daeSBarry Smith -  outviewer - new PetscViewer
59*5c6c1daeSBarry Smith 
60*5c6c1daeSBarry Smith    Level: advanced
61*5c6c1daeSBarry Smith 
62*5c6c1daeSBarry Smith    Notes: Call PetscViewerGetSingleton() to get this PetscViewer, NOT PetscViewerCreate()
63*5c6c1daeSBarry Smith 
64*5c6c1daeSBarry Smith .seealso: PetscViewerSocketOpen(), PetscViewerASCIIOpen(), PetscViewerDrawOpen(), PetscViewerGetSingleton()
65*5c6c1daeSBarry Smith @*/
66*5c6c1daeSBarry Smith PetscErrorCode  PetscViewerRestoreSingleton(PetscViewer viewer,PetscViewer *outviewer)
67*5c6c1daeSBarry Smith {
68*5c6c1daeSBarry Smith   PetscErrorCode ierr;
69*5c6c1daeSBarry Smith   PetscMPIInt    size;
70*5c6c1daeSBarry Smith 
71*5c6c1daeSBarry Smith   PetscFunctionBegin;
72*5c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
73*5c6c1daeSBarry Smith 
74*5c6c1daeSBarry Smith   ierr = MPI_Comm_size(((PetscObject)viewer)->comm,&size);CHKERRQ(ierr);
75*5c6c1daeSBarry Smith   if (size == 1) {
76*5c6c1daeSBarry Smith     ierr = PetscObjectDereference((PetscObject)viewer);CHKERRQ(ierr);
77*5c6c1daeSBarry Smith     if (outviewer) *outviewer = 0;
78*5c6c1daeSBarry Smith   } else if (viewer->ops->restoresingleton) {
79*5c6c1daeSBarry Smith     ierr = (*viewer->ops->restoresingleton)(viewer,outviewer);CHKERRQ(ierr);
80*5c6c1daeSBarry Smith   }
81*5c6c1daeSBarry Smith   ierr = PetscViewerASCIISynchronizedAllow(viewer,PETSC_FALSE);CHKERRQ(ierr);
82*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
83*5c6c1daeSBarry Smith }
84*5c6c1daeSBarry Smith 
85*5c6c1daeSBarry Smith #undef __FUNCT__
86*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerGetSubcomm"
87*5c6c1daeSBarry Smith /*@
88*5c6c1daeSBarry Smith    PetscViewerGetSubcomm - Creates a new PetscViewer (same type as the old)
89*5c6c1daeSBarry Smith     that lives on a subgroup of processors
90*5c6c1daeSBarry Smith 
91*5c6c1daeSBarry Smith     Collective on PetscViewer
92*5c6c1daeSBarry Smith 
93*5c6c1daeSBarry Smith    Input Parameter:
94*5c6c1daeSBarry Smith +  viewer - the PetscViewer to be duplicated
95*5c6c1daeSBarry Smith -  subcomm - MPI communicator
96*5c6c1daeSBarry Smith 
97*5c6c1daeSBarry Smith    Output Parameter:
98*5c6c1daeSBarry Smith .  outviewer - new PetscViewer
99*5c6c1daeSBarry Smith 
100*5c6c1daeSBarry Smith    Level: advanced
101*5c6c1daeSBarry Smith 
102*5c6c1daeSBarry Smith    Notes: Call PetscViewerRestoreSubcomm() to return this PetscViewer, NOT PetscViewerDestroy()
103*5c6c1daeSBarry Smith 
104*5c6c1daeSBarry Smith      This is used to view a sequential or a parallel object that is part of a larger
105*5c6c1daeSBarry Smith     parallel object. For example redundant PC view could use this to obtain a
106*5c6c1daeSBarry Smith     PetscViewer that is used within a subcommunicator on one duplicated preconditioner.
107*5c6c1daeSBarry Smith 
108*5c6c1daeSBarry Smith    Concepts: PetscViewer^sequential version
109*5c6c1daeSBarry Smith 
110*5c6c1daeSBarry Smith .seealso: PetscViewerSocketOpen(), PetscViewerASCIIOpen(), PetscViewerDrawOpen(), PetscViewerRestoreSubcomm()
111*5c6c1daeSBarry Smith @*/
112*5c6c1daeSBarry Smith PetscErrorCode  PetscViewerGetSubcomm(PetscViewer viewer,MPI_Comm subcomm,PetscViewer *outviewer)
113*5c6c1daeSBarry Smith {
114*5c6c1daeSBarry Smith   PetscErrorCode ierr;
115*5c6c1daeSBarry Smith   PetscMPIInt    size;
116*5c6c1daeSBarry Smith 
117*5c6c1daeSBarry Smith   PetscFunctionBegin;
118*5c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
119*5c6c1daeSBarry Smith   PetscValidPointer(outviewer,3);
120*5c6c1daeSBarry Smith   ierr = MPI_Comm_size(((PetscObject)viewer)->comm,&size);CHKERRQ(ierr);
121*5c6c1daeSBarry Smith   if (size == 1) {
122*5c6c1daeSBarry Smith     ierr = PetscObjectReference((PetscObject)viewer);CHKERRQ(ierr);
123*5c6c1daeSBarry Smith     *outviewer = viewer;
124*5c6c1daeSBarry Smith   } else if (viewer->ops->getsubcomm) {
125*5c6c1daeSBarry Smith     ierr = (*viewer->ops->getsubcomm)(viewer,subcomm,outviewer);CHKERRQ(ierr);
126*5c6c1daeSBarry Smith   } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot get subcommunicator PetscViewer for type %s",((PetscObject)viewer)->type_name);
127*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
128*5c6c1daeSBarry Smith }
129*5c6c1daeSBarry Smith 
130*5c6c1daeSBarry Smith #undef __FUNCT__
131*5c6c1daeSBarry Smith #define __FUNCT__ "PetscViewerRestoreSubcomm"
132*5c6c1daeSBarry Smith /*@
133*5c6c1daeSBarry Smith    PetscViewerRestoreSubcomm - Restores a new PetscViewer obtained with PetscViewerGetSubcomm().
134*5c6c1daeSBarry Smith 
135*5c6c1daeSBarry Smith     Collective on PetscViewer
136*5c6c1daeSBarry Smith 
137*5c6c1daeSBarry Smith    Input Parameters:
138*5c6c1daeSBarry Smith +  viewer - the PetscViewer to be duplicated
139*5c6c1daeSBarry Smith .  subcomm - MPI communicator
140*5c6c1daeSBarry Smith -  outviewer - new PetscViewer
141*5c6c1daeSBarry Smith 
142*5c6c1daeSBarry Smith    Level: advanced
143*5c6c1daeSBarry Smith 
144*5c6c1daeSBarry Smith    Notes: Call PetscViewerGetSubcomm() to get this PetscViewer, NOT PetscViewerCreate()
145*5c6c1daeSBarry Smith 
146*5c6c1daeSBarry Smith .seealso: PetscViewerSocketOpen(), PetscViewerASCIIOpen(), PetscViewerDrawOpen(), PetscViewerGetSubcomm()
147*5c6c1daeSBarry Smith @*/
148*5c6c1daeSBarry Smith PetscErrorCode  PetscViewerRestoreSubcomm(PetscViewer viewer,MPI_Comm subcomm,PetscViewer *outviewer)
149*5c6c1daeSBarry Smith {
150*5c6c1daeSBarry Smith   PetscErrorCode ierr;
151*5c6c1daeSBarry Smith   PetscMPIInt    size;
152*5c6c1daeSBarry Smith 
153*5c6c1daeSBarry Smith   PetscFunctionBegin;
154*5c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1);
155*5c6c1daeSBarry Smith 
156*5c6c1daeSBarry Smith   ierr = MPI_Comm_size(((PetscObject)viewer)->comm,&size);CHKERRQ(ierr);
157*5c6c1daeSBarry Smith   if (size == 1 || (outviewer && viewer == *outviewer)) {
158*5c6c1daeSBarry Smith     ierr = PetscObjectDereference((PetscObject)viewer);CHKERRQ(ierr);
159*5c6c1daeSBarry Smith     if (outviewer) *outviewer = 0;
160*5c6c1daeSBarry Smith   } else if (viewer->ops->restoresubcomm) {
161*5c6c1daeSBarry Smith     ierr = (*viewer->ops->restoresubcomm)(viewer,subcomm,outviewer);CHKERRQ(ierr);
162*5c6c1daeSBarry Smith   }
163*5c6c1daeSBarry Smith   PetscFunctionReturn(0);
164*5c6c1daeSBarry Smith }
165*5c6c1daeSBarry Smith 
166