xref: /petsc/src/sys/classes/viewer/impls/ams/ams.c (revision 811af0c4b09a35de4306c442f88bd09fdc09897d)
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
13*811af0c4SBarry 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:
18*811af0c4SBarry Smith .    comm - the MPI communicator to share the `PetscViewer`
195c6c1daeSBarry Smith 
205c6c1daeSBarry Smith      Level: developer
215c6c1daeSBarry Smith 
22*811af0c4SBarry Smith      Note:
23*811af0c4SBarry Smith      Unlike almost all other PETSc routines, `PETSC_VIEWER_SAWS_()` does not return
24*811af0c4SBarry Smith      an error code.  The resulting `PetscViewer` is usually used in the form
25e04113cfSBarry Smith $       XXXView(XXX object,PETSC_VIEWER_SAWS_(comm));
265c6c1daeSBarry Smith 
27*811af0c4SBarry Smith .seealso: `PetscViewer`, `PETSC_VIEWER_SAWS_WORLD`, `PETSC_VIEWER_SAWS_SELF`
285c6c1daeSBarry Smith @*/
299371c9d4SSatish 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;
369371c9d4SSatish Balay   ierr = PetscCommDuplicate(comm, &ncomm, NULL);
379371c9d4SSatish Balay   if (ierr) {
389371c9d4SSatish Balay     PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_SAWS_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_INITIAL, " ");
399371c9d4SSatish Balay     PetscFunctionReturn(0);
409371c9d4SSatish 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);
439371c9d4SSatish Balay     if (ierr) {
449371c9d4SSatish Balay       PetscError(ncomm, __LINE__, "PETSC_VIEWER_SAWS_", __FILE__, 1, PETSC_ERROR_INITIAL, " ");
459371c9d4SSatish Balay       PetscFunctionReturn(NULL);
469371c9d4SSatish Balay     }
475c6c1daeSBarry Smith   }
4847435625SJed Brown   ierr = MPI_Comm_get_attr(ncomm, Petsc_Viewer_SAWs_keyval, (void **)&viewer, &flag);
499371c9d4SSatish Balay   if (ierr) {
509371c9d4SSatish Balay     PetscError(ncomm, __LINE__, "PETSC_VIEWER_SAWS_", __FILE__, 1, PETSC_ERROR_INITIAL, " ");
519371c9d4SSatish Balay     PetscFunctionReturn(NULL);
529371c9d4SSatish Balay   }
535c6c1daeSBarry Smith   if (!flag) { /* PetscViewer not yet created */
5492081c13SBarry Smith     ierr = PetscViewerSAWsOpen(comm, &viewer);
559371c9d4SSatish Balay     if (ierr) {
569371c9d4SSatish Balay       PetscError(ncomm, __LINE__, "PETSC_VIEWER_SAWS_", __FILE__, 1, PETSC_ERROR_REPEAT, " ");
579371c9d4SSatish Balay       PetscFunctionReturn(NULL);
589371c9d4SSatish Balay     }
595c6c1daeSBarry Smith     ierr = PetscObjectRegisterDestroy((PetscObject)viewer);
609371c9d4SSatish Balay     if (ierr) {
619371c9d4SSatish Balay       PetscError(ncomm, __LINE__, "PETSC_VIEWER_SAWS_", __FILE__, 1, PETSC_ERROR_REPEAT, " ");
629371c9d4SSatish Balay       PetscFunctionReturn(NULL);
639371c9d4SSatish Balay     }
6447435625SJed Brown     ierr = MPI_Comm_set_attr(ncomm, Petsc_Viewer_SAWs_keyval, (void *)viewer);
659371c9d4SSatish Balay     if (ierr) {
669371c9d4SSatish Balay       PetscError(ncomm, __LINE__, "PETSC_VIEWER_SAWS_", __FILE__, 1, PETSC_ERROR_INITIAL, " ");
679371c9d4SSatish Balay       PetscFunctionReturn(NULL);
689371c9d4SSatish Balay     }
695c6c1daeSBarry Smith   }
708b9c1301SBarry Smith   ierr = PetscCommDestroy(&ncomm);
719371c9d4SSatish Balay   if (ierr) {
729371c9d4SSatish Balay     PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_SAWS_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_REPEAT, " ");
739371c9d4SSatish Balay     PetscFunctionReturn(NULL);
749371c9d4SSatish 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 */
819371c9d4SSatish 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 
969371c9d4SSatish 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 
1059371c9d4SSatish 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