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 24*b44f4de4SBarry Smith .vb 25*b44f4de4SBarry Smith XXXView(XXX object, PETSC_VIEWER_SAWS_(comm)); 26*b44f4de4SBarry Smith .ve 275c6c1daeSBarry Smith 28d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewer`, `PETSC_VIEWER_SAWS_WORLD`, `PETSC_VIEWER_SAWS_SELF` 295c6c1daeSBarry Smith @*/ 30d71ae5a4SJacob Faibussowitsch PetscViewer PETSC_VIEWER_SAWS_(MPI_Comm comm) 31d71ae5a4SJacob Faibussowitsch { 325c6c1daeSBarry Smith PetscErrorCode ierr; 335c6c1daeSBarry Smith PetscMPIInt flag; 345c6c1daeSBarry Smith PetscViewer viewer; 355c6c1daeSBarry Smith MPI_Comm ncomm; 365c6c1daeSBarry Smith 375c6c1daeSBarry Smith PetscFunctionBegin; 38648c30bcSBarry Smith PetscCallNull(PetscCommDuplicate(comm, &ncomm, NULL)); 39648c30bcSBarry 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)); } 403ba16761SJacob Faibussowitsch ierr = (PetscErrorCode)MPI_Comm_get_attr(ncomm, Petsc_Viewer_SAWs_keyval, (void **)&viewer, &flag); 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 } 455c6c1daeSBarry Smith if (!flag) { /* 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 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 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