xref: /petsc/src/sys/classes/viewer/impls/ams/ams.c (revision 9371c9d470a9602b6d10a8bf50c9b2280a79e45a)
15c6c1daeSBarry Smith 
2af0996ceSBarry Smith #include <petsc/private/viewerimpl.h>
3e04113cfSBarry Smith #include <petscviewersaws.h>
45c6c1daeSBarry Smith #include <petscsys.h>
55c6c1daeSBarry Smith 
65c6c1daeSBarry Smith /*
7e04113cfSBarry Smith     The variable Petsc_Viewer_SAWs_keyval is used to indicate an MPI attribute that
85c6c1daeSBarry Smith   is attached to a communicator, in this case the attribute is a PetscViewer.
95c6c1daeSBarry Smith */
10e04113cfSBarry Smith static PetscMPIInt Petsc_Viewer_SAWs_keyval = MPI_KEYVAL_INVALID;
115c6c1daeSBarry Smith 
125c6c1daeSBarry Smith /*@C
13aef26384SBarry Smith      PETSC_VIEWER_SAWS_ - Creates an SAWs PetscViewer shared by all processors in a communicator.
145c6c1daeSBarry Smith 
15d083f849SBarry Smith      Collective
165c6c1daeSBarry Smith 
175c6c1daeSBarry Smith      Input Parameters:
185c6c1daeSBarry Smith .    comm - the MPI communicator to share the PetscViewer
195c6c1daeSBarry Smith 
205c6c1daeSBarry Smith      Level: developer
215c6c1daeSBarry Smith 
225c6c1daeSBarry Smith      Notes:
23e04113cfSBarry Smith      Unlike almost all other PETSc routines, PETSC_VIEWER_SAWS_() does not return
24aef26384SBarry Smith      an error code.  The resulting PetscViewer is usually used in the form
25e04113cfSBarry Smith $       XXXView(XXX object,PETSC_VIEWER_SAWS_(comm));
265c6c1daeSBarry Smith 
27db781477SPatrick Sanan .seealso: `PETSC_VIEWER_SAWS_WORLD`, `PETSC_VIEWER_SAWS_SELF`
285c6c1daeSBarry Smith @*/
29*9371c9d4SSatish Balay PetscViewer PETSC_VIEWER_SAWS_(MPI_Comm comm) {
305c6c1daeSBarry Smith   PetscErrorCode ierr;
315c6c1daeSBarry Smith   PetscMPIInt    flag;
325c6c1daeSBarry Smith   PetscViewer    viewer;
335c6c1daeSBarry Smith   MPI_Comm       ncomm;
345c6c1daeSBarry Smith 
355c6c1daeSBarry Smith   PetscFunctionBegin;
36*9371c9d4SSatish Balay   ierr = PetscCommDuplicate(comm, &ncomm, NULL);
37*9371c9d4SSatish Balay   if (ierr) {
38*9371c9d4SSatish Balay     PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_SAWS_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_INITIAL, " ");
39*9371c9d4SSatish Balay     PetscFunctionReturn(0);
40*9371c9d4SSatish Balay   }
41e04113cfSBarry Smith   if (Petsc_Viewer_SAWs_keyval == MPI_KEYVAL_INVALID) {
4212801b39SBarry Smith     ierr = MPI_Comm_create_keyval(MPI_COMM_NULL_COPY_FN, MPI_COMM_NULL_DELETE_FN, &Petsc_Viewer_SAWs_keyval, 0);
43*9371c9d4SSatish Balay     if (ierr) {
44*9371c9d4SSatish Balay       PetscError(ncomm, __LINE__, "PETSC_VIEWER_SAWS_", __FILE__, 1, PETSC_ERROR_INITIAL, " ");
45*9371c9d4SSatish Balay       PetscFunctionReturn(NULL);
46*9371c9d4SSatish Balay     }
475c6c1daeSBarry Smith   }
4847435625SJed Brown   ierr = MPI_Comm_get_attr(ncomm, Petsc_Viewer_SAWs_keyval, (void **)&viewer, &flag);
49*9371c9d4SSatish Balay   if (ierr) {
50*9371c9d4SSatish Balay     PetscError(ncomm, __LINE__, "PETSC_VIEWER_SAWS_", __FILE__, 1, PETSC_ERROR_INITIAL, " ");
51*9371c9d4SSatish Balay     PetscFunctionReturn(NULL);
52*9371c9d4SSatish Balay   }
535c6c1daeSBarry Smith   if (!flag) { /* PetscViewer not yet created */
5492081c13SBarry Smith     ierr = PetscViewerSAWsOpen(comm, &viewer);
55*9371c9d4SSatish Balay     if (ierr) {
56*9371c9d4SSatish Balay       PetscError(ncomm, __LINE__, "PETSC_VIEWER_SAWS_", __FILE__, 1, PETSC_ERROR_REPEAT, " ");
57*9371c9d4SSatish Balay       PetscFunctionReturn(NULL);
58*9371c9d4SSatish Balay     }
595c6c1daeSBarry Smith     ierr = PetscObjectRegisterDestroy((PetscObject)viewer);
60*9371c9d4SSatish Balay     if (ierr) {
61*9371c9d4SSatish Balay       PetscError(ncomm, __LINE__, "PETSC_VIEWER_SAWS_", __FILE__, 1, PETSC_ERROR_REPEAT, " ");
62*9371c9d4SSatish Balay       PetscFunctionReturn(NULL);
63*9371c9d4SSatish Balay     }
6447435625SJed Brown     ierr = MPI_Comm_set_attr(ncomm, Petsc_Viewer_SAWs_keyval, (void *)viewer);
65*9371c9d4SSatish Balay     if (ierr) {
66*9371c9d4SSatish Balay       PetscError(ncomm, __LINE__, "PETSC_VIEWER_SAWS_", __FILE__, 1, PETSC_ERROR_INITIAL, " ");
67*9371c9d4SSatish Balay       PetscFunctionReturn(NULL);
68*9371c9d4SSatish Balay     }
695c6c1daeSBarry Smith   }
708b9c1301SBarry Smith   ierr = PetscCommDestroy(&ncomm);
71*9371c9d4SSatish Balay   if (ierr) {
72*9371c9d4SSatish Balay     PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_SAWS_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_REPEAT, " ");
73*9371c9d4SSatish Balay     PetscFunctionReturn(NULL);
74*9371c9d4SSatish Balay   }
755c6c1daeSBarry Smith   PetscFunctionReturn(viewer);
765c6c1daeSBarry Smith }
775c6c1daeSBarry Smith 
785c6c1daeSBarry Smith /*
795c6c1daeSBarry Smith        If there is a PetscViewer associated with this communicator, it is destroyed.
805c6c1daeSBarry Smith */
81*9371c9d4SSatish Balay PetscErrorCode PetscViewer_SAWS_Destroy(MPI_Comm comm) {
825c6c1daeSBarry Smith   PetscMPIInt flag;
835c6c1daeSBarry Smith   PetscViewer viewer;
845c6c1daeSBarry Smith 
855c6c1daeSBarry Smith   PetscFunctionBegin;
86e04113cfSBarry Smith   if (Petsc_Viewer_SAWs_keyval == MPI_KEYVAL_INVALID) PetscFunctionReturn(0);
87a297a907SKarl Rupp 
889566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_get_attr(comm, Petsc_Viewer_SAWs_keyval, (void **)&viewer, &flag));
895c6c1daeSBarry Smith   if (flag) {
909566063dSJacob Faibussowitsch     PetscCall(PetscViewerDestroy(&viewer));
919566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_delete_attr(comm, Petsc_Viewer_SAWs_keyval));
925c6c1daeSBarry Smith   }
935c6c1daeSBarry Smith   PetscFunctionReturn(0);
945c6c1daeSBarry Smith }
955c6c1daeSBarry Smith 
96*9371c9d4SSatish Balay static PetscErrorCode PetscViewerDestroy_SAWs(PetscViewer viewer) {
975c6c1daeSBarry Smith   PetscFunctionBegin;
985c6c1daeSBarry Smith   /*
995c6c1daeSBarry Smith      Make sure that we mark that the stack is no longer published
1005c6c1daeSBarry Smith   */
1019566063dSJacob Faibussowitsch   if (PetscObjectComm((PetscObject)viewer) == PETSC_COMM_WORLD) PetscCall(PetscStackSAWsViewOff());
1025c6c1daeSBarry Smith   PetscFunctionReturn(0);
1035c6c1daeSBarry Smith }
1045c6c1daeSBarry Smith 
105*9371c9d4SSatish Balay PETSC_EXTERN PetscErrorCode PetscViewerCreate_SAWs(PetscViewer v) {
1065c6c1daeSBarry Smith   PetscFunctionBegin;
107e04113cfSBarry Smith   v->ops->destroy = PetscViewerDestroy_SAWs;
1085c6c1daeSBarry Smith   PetscFunctionReturn(0);
1095c6c1daeSBarry Smith }
110