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
24b44f4de4SBarry Smith .vb
25b44f4de4SBarry Smith XXXView(XXX object, PETSC_VIEWER_SAWS_(comm));
26b44f4de4SBarry Smith .ve
275c6c1daeSBarry Smith
28d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PETSC_VIEWER_SAWS_WORLD`, `PETSC_VIEWER_SAWS_SELF`
295c6c1daeSBarry Smith @*/
PETSC_VIEWER_SAWS_(MPI_Comm comm)30d71ae5a4SJacob Faibussowitsch PetscViewer PETSC_VIEWER_SAWS_(MPI_Comm comm)
31d71ae5a4SJacob Faibussowitsch {
325c6c1daeSBarry Smith PetscErrorCode ierr;
33*b8b5be36SMartin Diehl PetscMPIInt iflg;
345c6c1daeSBarry Smith PetscViewer viewer;
355c6c1daeSBarry Smith MPI_Comm ncomm;
365c6c1daeSBarry Smith
375c6c1daeSBarry Smith PetscFunctionBegin;
38648c30bcSBarry Smith PetscCallNull(PetscCommDuplicate(comm, &ncomm, NULL));
393a7d0413SPierre Jolivet 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));
40*b8b5be36SMartin Diehl ierr = (PetscErrorCode)MPI_Comm_get_attr(ncomm, Petsc_Viewer_SAWs_keyval, (void **)&viewer, &iflg);
419371c9d4SSatish Balay if (ierr) {
423ba16761SJacob Faibussowitsch ierr = PetscError(ncomm, __LINE__, "PETSC_VIEWER_SAWS_", __FILE__, PETSC_ERR_MPI, PETSC_ERROR_INITIAL, " ");
439371c9d4SSatish Balay PetscFunctionReturn(NULL);
449371c9d4SSatish Balay }
45*b8b5be36SMartin Diehl if (!iflg) { /* PetscViewer not yet created */
46648c30bcSBarry Smith PetscCallNull(PetscViewerSAWsOpen(comm, &viewer));
47648c30bcSBarry Smith PetscCallNull(PetscObjectRegisterDestroy((PetscObject)viewer));
483ba16761SJacob Faibussowitsch ierr = (PetscErrorCode)MPI_Comm_set_attr(ncomm, Petsc_Viewer_SAWs_keyval, (void *)viewer);
499371c9d4SSatish Balay if (ierr) {
503ba16761SJacob Faibussowitsch ierr = PetscError(ncomm, __LINE__, "PETSC_VIEWER_SAWS_", __FILE__, PETSC_ERR_MPI, PETSC_ERROR_INITIAL, " ");
519371c9d4SSatish Balay PetscFunctionReturn(NULL);
529371c9d4SSatish Balay }
535c6c1daeSBarry Smith }
54648c30bcSBarry Smith PetscCallNull(PetscCommDestroy(&ncomm));
555c6c1daeSBarry Smith PetscFunctionReturn(viewer);
565c6c1daeSBarry Smith }
575c6c1daeSBarry Smith
PetscViewerDestroy_SAWs(PetscViewer viewer)58d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerDestroy_SAWs(PetscViewer viewer)
59d71ae5a4SJacob Faibussowitsch {
605c6c1daeSBarry Smith PetscFunctionBegin;
615c6c1daeSBarry Smith /*
625c6c1daeSBarry Smith Make sure that we mark that the stack is no longer published
635c6c1daeSBarry Smith */
649566063dSJacob Faibussowitsch if (PetscObjectComm((PetscObject)viewer) == PETSC_COMM_WORLD) PetscCall(PetscStackSAWsViewOff());
653ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
665c6c1daeSBarry Smith }
675c6c1daeSBarry Smith
PetscViewerCreate_SAWs(PetscViewer v)68d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscViewerCreate_SAWs(PetscViewer v)
69d71ae5a4SJacob Faibussowitsch {
705c6c1daeSBarry Smith PetscFunctionBegin;
71e04113cfSBarry Smith v->ops->destroy = PetscViewerDestroy_SAWs;
723ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
735c6c1daeSBarry Smith }
74