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