xref: /petsc/src/sys/classes/viewer/impls/ams/ams.c (revision d71ae5a4db6382e7f06317b8d368875286fe9008)
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
13811af0c4SBarry 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:
18811af0c4SBarry Smith .    comm - the MPI communicator to share the `PetscViewer`
195c6c1daeSBarry Smith 
205c6c1daeSBarry Smith      Level: developer
215c6c1daeSBarry Smith 
22811af0c4SBarry Smith      Note:
23811af0c4SBarry Smith      Unlike almost all other PETSc routines, `PETSC_VIEWER_SAWS_()` does not return
24811af0c4SBarry Smith      an error code.  The resulting `PetscViewer` is usually used in the form
25e04113cfSBarry Smith $       XXXView(XXX object,PETSC_VIEWER_SAWS_(comm));
265c6c1daeSBarry Smith 
27811af0c4SBarry Smith .seealso: `PetscViewer`, `PETSC_VIEWER_SAWS_WORLD`, `PETSC_VIEWER_SAWS_SELF`
285c6c1daeSBarry Smith @*/
29*d71ae5a4SJacob Faibussowitsch PetscViewer PETSC_VIEWER_SAWS_(MPI_Comm comm)
30*d71ae5a4SJacob Faibussowitsch {
315c6c1daeSBarry Smith   PetscErrorCode ierr;
325c6c1daeSBarry Smith   PetscMPIInt    flag;
335c6c1daeSBarry Smith   PetscViewer    viewer;
345c6c1daeSBarry Smith   MPI_Comm       ncomm;
355c6c1daeSBarry Smith 
365c6c1daeSBarry Smith   PetscFunctionBegin;
379371c9d4SSatish Balay   ierr = PetscCommDuplicate(comm, &ncomm, NULL);
389371c9d4SSatish Balay   if (ierr) {
399371c9d4SSatish Balay     PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_SAWS_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_INITIAL, " ");
409371c9d4SSatish Balay     PetscFunctionReturn(0);
419371c9d4SSatish Balay   }
42e04113cfSBarry Smith   if (Petsc_Viewer_SAWs_keyval == MPI_KEYVAL_INVALID) {
4312801b39SBarry Smith     ierr = MPI_Comm_create_keyval(MPI_COMM_NULL_COPY_FN, MPI_COMM_NULL_DELETE_FN, &Petsc_Viewer_SAWs_keyval, 0);
449371c9d4SSatish Balay     if (ierr) {
459371c9d4SSatish Balay       PetscError(ncomm, __LINE__, "PETSC_VIEWER_SAWS_", __FILE__, 1, PETSC_ERROR_INITIAL, " ");
469371c9d4SSatish Balay       PetscFunctionReturn(NULL);
479371c9d4SSatish Balay     }
485c6c1daeSBarry Smith   }
4947435625SJed Brown   ierr = MPI_Comm_get_attr(ncomm, Petsc_Viewer_SAWs_keyval, (void **)&viewer, &flag);
509371c9d4SSatish Balay   if (ierr) {
519371c9d4SSatish Balay     PetscError(ncomm, __LINE__, "PETSC_VIEWER_SAWS_", __FILE__, 1, PETSC_ERROR_INITIAL, " ");
529371c9d4SSatish Balay     PetscFunctionReturn(NULL);
539371c9d4SSatish Balay   }
545c6c1daeSBarry Smith   if (!flag) { /* PetscViewer not yet created */
5592081c13SBarry Smith     ierr = PetscViewerSAWsOpen(comm, &viewer);
569371c9d4SSatish Balay     if (ierr) {
579371c9d4SSatish Balay       PetscError(ncomm, __LINE__, "PETSC_VIEWER_SAWS_", __FILE__, 1, PETSC_ERROR_REPEAT, " ");
589371c9d4SSatish Balay       PetscFunctionReturn(NULL);
599371c9d4SSatish Balay     }
605c6c1daeSBarry Smith     ierr = PetscObjectRegisterDestroy((PetscObject)viewer);
619371c9d4SSatish Balay     if (ierr) {
629371c9d4SSatish Balay       PetscError(ncomm, __LINE__, "PETSC_VIEWER_SAWS_", __FILE__, 1, PETSC_ERROR_REPEAT, " ");
639371c9d4SSatish Balay       PetscFunctionReturn(NULL);
649371c9d4SSatish Balay     }
6547435625SJed Brown     ierr = MPI_Comm_set_attr(ncomm, Petsc_Viewer_SAWs_keyval, (void *)viewer);
669371c9d4SSatish Balay     if (ierr) {
679371c9d4SSatish Balay       PetscError(ncomm, __LINE__, "PETSC_VIEWER_SAWS_", __FILE__, 1, PETSC_ERROR_INITIAL, " ");
689371c9d4SSatish Balay       PetscFunctionReturn(NULL);
699371c9d4SSatish Balay     }
705c6c1daeSBarry Smith   }
718b9c1301SBarry Smith   ierr = PetscCommDestroy(&ncomm);
729371c9d4SSatish Balay   if (ierr) {
739371c9d4SSatish Balay     PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_SAWS_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_REPEAT, " ");
749371c9d4SSatish Balay     PetscFunctionReturn(NULL);
759371c9d4SSatish Balay   }
765c6c1daeSBarry Smith   PetscFunctionReturn(viewer);
775c6c1daeSBarry Smith }
785c6c1daeSBarry Smith 
795c6c1daeSBarry Smith /*
805c6c1daeSBarry Smith        If there is a PetscViewer associated with this communicator, it is destroyed.
815c6c1daeSBarry Smith */
82*d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewer_SAWS_Destroy(MPI_Comm comm)
83*d71ae5a4SJacob Faibussowitsch {
845c6c1daeSBarry Smith   PetscMPIInt flag;
855c6c1daeSBarry Smith   PetscViewer viewer;
865c6c1daeSBarry Smith 
875c6c1daeSBarry Smith   PetscFunctionBegin;
88e04113cfSBarry Smith   if (Petsc_Viewer_SAWs_keyval == MPI_KEYVAL_INVALID) PetscFunctionReturn(0);
89a297a907SKarl Rupp 
909566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_get_attr(comm, Petsc_Viewer_SAWs_keyval, (void **)&viewer, &flag));
915c6c1daeSBarry Smith   if (flag) {
929566063dSJacob Faibussowitsch     PetscCall(PetscViewerDestroy(&viewer));
939566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_delete_attr(comm, Petsc_Viewer_SAWs_keyval));
945c6c1daeSBarry Smith   }
955c6c1daeSBarry Smith   PetscFunctionReturn(0);
965c6c1daeSBarry Smith }
975c6c1daeSBarry Smith 
98*d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerDestroy_SAWs(PetscViewer viewer)
99*d71ae5a4SJacob Faibussowitsch {
1005c6c1daeSBarry Smith   PetscFunctionBegin;
1015c6c1daeSBarry Smith   /*
1025c6c1daeSBarry Smith      Make sure that we mark that the stack is no longer published
1035c6c1daeSBarry Smith   */
1049566063dSJacob Faibussowitsch   if (PetscObjectComm((PetscObject)viewer) == PETSC_COMM_WORLD) PetscCall(PetscStackSAWsViewOff());
1055c6c1daeSBarry Smith   PetscFunctionReturn(0);
1065c6c1daeSBarry Smith }
1075c6c1daeSBarry Smith 
108*d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscViewerCreate_SAWs(PetscViewer v)
109*d71ae5a4SJacob Faibussowitsch {
1105c6c1daeSBarry Smith   PetscFunctionBegin;
111e04113cfSBarry Smith   v->ops->destroy = PetscViewerDestroy_SAWs;
1125c6c1daeSBarry Smith   PetscFunctionReturn(0);
1135c6c1daeSBarry Smith }
114