xref: /petsc/src/sys/classes/viewer/impls/ams/ams.c (revision 648c30bcb65f74c3cbd15d7a91a7ed7c1890e25b)
1af0996ceSBarry Smith #include <petsc/private/viewerimpl.h>
2e04113cfSBarry Smith #include <petscviewersaws.h>
35c6c1daeSBarry Smith #include <petscsys.h>
45c6c1daeSBarry Smith 
55c6c1daeSBarry Smith /*
6e04113cfSBarry Smith     The variable Petsc_Viewer_SAWs_keyval is used to indicate an MPI attribute that
75c6c1daeSBarry Smith   is attached to a communicator, in this case the attribute is a PetscViewer.
85c6c1daeSBarry Smith */
9e04113cfSBarry Smith static PetscMPIInt Petsc_Viewer_SAWs_keyval = MPI_KEYVAL_INVALID;
105c6c1daeSBarry Smith 
115c6c1daeSBarry Smith /*@C
12c410d8ccSBarry Smith      PETSC_VIEWER_SAWS_ - Creates a SAWs `PetscViewer` shared by all MPI processes in a communicator.
135c6c1daeSBarry Smith 
14d083f849SBarry Smith      Collective
155c6c1daeSBarry Smith 
162fe279fdSBarry Smith      Input Parameter:
17811af0c4SBarry Smith .    comm - the MPI communicator to share the `PetscViewer`
185c6c1daeSBarry Smith 
195c6c1daeSBarry Smith      Level: developer
205c6c1daeSBarry Smith 
21811af0c4SBarry Smith      Note:
22811af0c4SBarry Smith      Unlike almost all other PETSc routines, `PETSC_VIEWER_SAWS_()` does not return
23811af0c4SBarry Smith      an error code.  The resulting `PetscViewer` is usually used in the form
24e04113cfSBarry Smith $       XXXView(XXX object, PETSC_VIEWER_SAWS_(comm));
255c6c1daeSBarry Smith 
26d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PETSC_VIEWER_SAWS_WORLD`, `PETSC_VIEWER_SAWS_SELF`
275c6c1daeSBarry Smith @*/
28d71ae5a4SJacob Faibussowitsch PetscViewer PETSC_VIEWER_SAWS_(MPI_Comm comm)
29d71ae5a4SJacob Faibussowitsch {
305c6c1daeSBarry Smith   PetscErrorCode ierr;
315c6c1daeSBarry Smith   PetscMPIInt    flag;
325c6c1daeSBarry Smith   PetscViewer    viewer;
335c6c1daeSBarry Smith   MPI_Comm       ncomm;
345c6c1daeSBarry Smith 
355c6c1daeSBarry Smith   PetscFunctionBegin;
36*648c30bcSBarry Smith   PetscCallNull(PetscCommDuplicate(comm, &ncomm, NULL));
37*648c30bcSBarry Smith   if (Petsc_Viewer_SAWs_keyval == MPI_KEYVAL_INVALID) { PetscCallMPINull(MPI_Comm_create_keyval(MPI_COMM_NULL_COPY_FN, MPI_COMM_NULL_DELETE_FN, &Petsc_Viewer_SAWs_keyval, 0)); }
383ba16761SJacob Faibussowitsch   ierr = (PetscErrorCode)MPI_Comm_get_attr(ncomm, Petsc_Viewer_SAWs_keyval, (void **)&viewer, &flag);
399371c9d4SSatish Balay   if (ierr) {
403ba16761SJacob Faibussowitsch     ierr = PetscError(ncomm, __LINE__, "PETSC_VIEWER_SAWS_", __FILE__, PETSC_ERR_MPI, PETSC_ERROR_INITIAL, " ");
419371c9d4SSatish Balay     PetscFunctionReturn(NULL);
429371c9d4SSatish Balay   }
435c6c1daeSBarry Smith   if (!flag) { /* PetscViewer not yet created */
44*648c30bcSBarry Smith     PetscCallNull(PetscViewerSAWsOpen(comm, &viewer));
45*648c30bcSBarry Smith     PetscCallNull(PetscObjectRegisterDestroy((PetscObject)viewer));
463ba16761SJacob Faibussowitsch     ierr = (PetscErrorCode)MPI_Comm_set_attr(ncomm, Petsc_Viewer_SAWs_keyval, (void *)viewer);
479371c9d4SSatish Balay     if (ierr) {
483ba16761SJacob Faibussowitsch       ierr = PetscError(ncomm, __LINE__, "PETSC_VIEWER_SAWS_", __FILE__, PETSC_ERR_MPI, PETSC_ERROR_INITIAL, " ");
499371c9d4SSatish Balay       PetscFunctionReturn(NULL);
509371c9d4SSatish Balay     }
515c6c1daeSBarry Smith   }
52*648c30bcSBarry Smith   PetscCallNull(PetscCommDestroy(&ncomm));
535c6c1daeSBarry Smith   PetscFunctionReturn(viewer);
545c6c1daeSBarry Smith }
555c6c1daeSBarry Smith 
56d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerDestroy_SAWs(PetscViewer viewer)
57d71ae5a4SJacob Faibussowitsch {
585c6c1daeSBarry Smith   PetscFunctionBegin;
595c6c1daeSBarry Smith   /*
605c6c1daeSBarry Smith      Make sure that we mark that the stack is no longer published
615c6c1daeSBarry Smith   */
629566063dSJacob Faibussowitsch   if (PetscObjectComm((PetscObject)viewer) == PETSC_COMM_WORLD) PetscCall(PetscStackSAWsViewOff());
633ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
645c6c1daeSBarry Smith }
655c6c1daeSBarry Smith 
66d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscViewerCreate_SAWs(PetscViewer v)
67d71ae5a4SJacob Faibussowitsch {
685c6c1daeSBarry Smith   PetscFunctionBegin;
69e04113cfSBarry Smith   v->ops->destroy = PetscViewerDestroy_SAWs;
703ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
715c6c1daeSBarry Smith }
72