xref: /petsc/src/sys/classes/viewer/impls/ams/ams.c (revision 2fe279fdf3e687a416e4eadb7d3c7a82d60442c6)
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
133f423023SBarry Smith      PETSC_VIEWER_SAWS_ - Creates a SAWs `PetscViewer` shared by all processors in a communicator.
145c6c1daeSBarry Smith 
15d083f849SBarry Smith      Collective
165c6c1daeSBarry Smith 
17*2fe279fdSBarry Smith      Input Parameter:
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 
27d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PETSC_VIEWER_SAWS_WORLD`, `PETSC_VIEWER_SAWS_SELF`
285c6c1daeSBarry Smith @*/
29d71ae5a4SJacob Faibussowitsch PetscViewer PETSC_VIEWER_SAWS_(MPI_Comm comm)
30d71ae5a4SJacob 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) {
393ba16761SJacob Faibussowitsch     ierr = PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_SAWS_", __FILE__, ierr, PETSC_ERROR_INITIAL, " ");
403ba16761SJacob Faibussowitsch     PetscFunctionReturn(NULL);
419371c9d4SSatish Balay   }
42e04113cfSBarry Smith   if (Petsc_Viewer_SAWs_keyval == MPI_KEYVAL_INVALID) {
433ba16761SJacob Faibussowitsch     ierr = (PetscErrorCode)MPI_Comm_create_keyval(MPI_COMM_NULL_COPY_FN, MPI_COMM_NULL_DELETE_FN, &Petsc_Viewer_SAWs_keyval, 0);
449371c9d4SSatish Balay     if (ierr) {
453ba16761SJacob Faibussowitsch       ierr = PetscError(ncomm, __LINE__, "PETSC_VIEWER_SAWS_", __FILE__, PETSC_ERR_MPI, PETSC_ERROR_INITIAL, " ");
469371c9d4SSatish Balay       PetscFunctionReturn(NULL);
479371c9d4SSatish Balay     }
485c6c1daeSBarry Smith   }
493ba16761SJacob Faibussowitsch   ierr = (PetscErrorCode)MPI_Comm_get_attr(ncomm, Petsc_Viewer_SAWs_keyval, (void **)&viewer, &flag);
509371c9d4SSatish Balay   if (ierr) {
513ba16761SJacob Faibussowitsch     ierr = PetscError(ncomm, __LINE__, "PETSC_VIEWER_SAWS_", __FILE__, PETSC_ERR_MPI, 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) {
573ba16761SJacob Faibussowitsch       ierr = PetscError(ncomm, __LINE__, "PETSC_VIEWER_SAWS_", __FILE__, ierr, PETSC_ERROR_REPEAT, " ");
589371c9d4SSatish Balay       PetscFunctionReturn(NULL);
599371c9d4SSatish Balay     }
605c6c1daeSBarry Smith     ierr = PetscObjectRegisterDestroy((PetscObject)viewer);
619371c9d4SSatish Balay     if (ierr) {
623ba16761SJacob Faibussowitsch       ierr = PetscError(ncomm, __LINE__, "PETSC_VIEWER_SAWS_", __FILE__, ierr, PETSC_ERROR_REPEAT, " ");
639371c9d4SSatish Balay       PetscFunctionReturn(NULL);
649371c9d4SSatish Balay     }
653ba16761SJacob Faibussowitsch     ierr = (PetscErrorCode)MPI_Comm_set_attr(ncomm, Petsc_Viewer_SAWs_keyval, (void *)viewer);
669371c9d4SSatish Balay     if (ierr) {
673ba16761SJacob Faibussowitsch       ierr = PetscError(ncomm, __LINE__, "PETSC_VIEWER_SAWS_", __FILE__, PETSC_ERR_MPI, PETSC_ERROR_INITIAL, " ");
689371c9d4SSatish Balay       PetscFunctionReturn(NULL);
699371c9d4SSatish Balay     }
705c6c1daeSBarry Smith   }
718b9c1301SBarry Smith   ierr = PetscCommDestroy(&ncomm);
729371c9d4SSatish Balay   if (ierr) {
733ba16761SJacob Faibussowitsch     ierr = PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_SAWS_", __FILE__, ierr, 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 */
82d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewer_SAWS_Destroy(MPI_Comm comm)
83d71ae5a4SJacob Faibussowitsch {
845c6c1daeSBarry Smith   PetscMPIInt flag;
855c6c1daeSBarry Smith   PetscViewer viewer;
865c6c1daeSBarry Smith 
875c6c1daeSBarry Smith   PetscFunctionBegin;
883ba16761SJacob Faibussowitsch   if (Petsc_Viewer_SAWs_keyval == MPI_KEYVAL_INVALID) PetscFunctionReturn(PETSC_SUCCESS);
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   }
953ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
965c6c1daeSBarry Smith }
975c6c1daeSBarry Smith 
98d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerDestroy_SAWs(PetscViewer viewer)
99d71ae5a4SJacob 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());
1053ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1065c6c1daeSBarry Smith }
1075c6c1daeSBarry Smith 
108d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscViewerCreate_SAWs(PetscViewer v)
109d71ae5a4SJacob Faibussowitsch {
1105c6c1daeSBarry Smith   PetscFunctionBegin;
111e04113cfSBarry Smith   v->ops->destroy = PetscViewerDestroy_SAWs;
1123ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1135c6c1daeSBarry Smith }
114