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