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 13aef26384SBarry Smith PETSC_VIEWER_SAWS_ - Creates an SAWs PetscViewer shared by all processors in a communicator. 145c6c1daeSBarry Smith 15d083f849SBarry Smith Collective 165c6c1daeSBarry Smith 175c6c1daeSBarry Smith Input Parameters: 185c6c1daeSBarry Smith . comm - the MPI communicator to share the PetscViewer 195c6c1daeSBarry Smith 205c6c1daeSBarry Smith Level: developer 215c6c1daeSBarry Smith 225c6c1daeSBarry Smith Notes: 23e04113cfSBarry Smith Unlike almost all other PETSc routines, PETSC_VIEWER_SAWS_() does not return 24aef26384SBarry Smith an error code. The resulting PetscViewer is usually used in the form 25e04113cfSBarry Smith $ XXXView(XXX object,PETSC_VIEWER_SAWS_(comm)); 265c6c1daeSBarry Smith 27db781477SPatrick Sanan .seealso: `PETSC_VIEWER_SAWS_WORLD`, `PETSC_VIEWER_SAWS_SELF` 285c6c1daeSBarry Smith @*/ 29*9371c9d4SSatish Balay PetscViewer PETSC_VIEWER_SAWS_(MPI_Comm comm) { 305c6c1daeSBarry Smith PetscErrorCode ierr; 315c6c1daeSBarry Smith PetscMPIInt flag; 325c6c1daeSBarry Smith PetscViewer viewer; 335c6c1daeSBarry Smith MPI_Comm ncomm; 345c6c1daeSBarry Smith 355c6c1daeSBarry Smith PetscFunctionBegin; 36*9371c9d4SSatish Balay ierr = PetscCommDuplicate(comm, &ncomm, NULL); 37*9371c9d4SSatish Balay if (ierr) { 38*9371c9d4SSatish Balay PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_SAWS_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_INITIAL, " "); 39*9371c9d4SSatish Balay PetscFunctionReturn(0); 40*9371c9d4SSatish Balay } 41e04113cfSBarry Smith if (Petsc_Viewer_SAWs_keyval == MPI_KEYVAL_INVALID) { 4212801b39SBarry Smith ierr = MPI_Comm_create_keyval(MPI_COMM_NULL_COPY_FN, MPI_COMM_NULL_DELETE_FN, &Petsc_Viewer_SAWs_keyval, 0); 43*9371c9d4SSatish Balay if (ierr) { 44*9371c9d4SSatish Balay PetscError(ncomm, __LINE__, "PETSC_VIEWER_SAWS_", __FILE__, 1, PETSC_ERROR_INITIAL, " "); 45*9371c9d4SSatish Balay PetscFunctionReturn(NULL); 46*9371c9d4SSatish Balay } 475c6c1daeSBarry Smith } 4847435625SJed Brown ierr = MPI_Comm_get_attr(ncomm, Petsc_Viewer_SAWs_keyval, (void **)&viewer, &flag); 49*9371c9d4SSatish Balay if (ierr) { 50*9371c9d4SSatish Balay PetscError(ncomm, __LINE__, "PETSC_VIEWER_SAWS_", __FILE__, 1, PETSC_ERROR_INITIAL, " "); 51*9371c9d4SSatish Balay PetscFunctionReturn(NULL); 52*9371c9d4SSatish Balay } 535c6c1daeSBarry Smith if (!flag) { /* PetscViewer not yet created */ 5492081c13SBarry Smith ierr = PetscViewerSAWsOpen(comm, &viewer); 55*9371c9d4SSatish Balay if (ierr) { 56*9371c9d4SSatish Balay PetscError(ncomm, __LINE__, "PETSC_VIEWER_SAWS_", __FILE__, 1, PETSC_ERROR_REPEAT, " "); 57*9371c9d4SSatish Balay PetscFunctionReturn(NULL); 58*9371c9d4SSatish Balay } 595c6c1daeSBarry Smith ierr = PetscObjectRegisterDestroy((PetscObject)viewer); 60*9371c9d4SSatish Balay if (ierr) { 61*9371c9d4SSatish Balay PetscError(ncomm, __LINE__, "PETSC_VIEWER_SAWS_", __FILE__, 1, PETSC_ERROR_REPEAT, " "); 62*9371c9d4SSatish Balay PetscFunctionReturn(NULL); 63*9371c9d4SSatish Balay } 6447435625SJed Brown ierr = MPI_Comm_set_attr(ncomm, Petsc_Viewer_SAWs_keyval, (void *)viewer); 65*9371c9d4SSatish Balay if (ierr) { 66*9371c9d4SSatish Balay PetscError(ncomm, __LINE__, "PETSC_VIEWER_SAWS_", __FILE__, 1, PETSC_ERROR_INITIAL, " "); 67*9371c9d4SSatish Balay PetscFunctionReturn(NULL); 68*9371c9d4SSatish Balay } 695c6c1daeSBarry Smith } 708b9c1301SBarry Smith ierr = PetscCommDestroy(&ncomm); 71*9371c9d4SSatish Balay if (ierr) { 72*9371c9d4SSatish Balay PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_SAWS_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_REPEAT, " "); 73*9371c9d4SSatish Balay PetscFunctionReturn(NULL); 74*9371c9d4SSatish Balay } 755c6c1daeSBarry Smith PetscFunctionReturn(viewer); 765c6c1daeSBarry Smith } 775c6c1daeSBarry Smith 785c6c1daeSBarry Smith /* 795c6c1daeSBarry Smith If there is a PetscViewer associated with this communicator, it is destroyed. 805c6c1daeSBarry Smith */ 81*9371c9d4SSatish Balay PetscErrorCode PetscViewer_SAWS_Destroy(MPI_Comm comm) { 825c6c1daeSBarry Smith PetscMPIInt flag; 835c6c1daeSBarry Smith PetscViewer viewer; 845c6c1daeSBarry Smith 855c6c1daeSBarry Smith PetscFunctionBegin; 86e04113cfSBarry Smith if (Petsc_Viewer_SAWs_keyval == MPI_KEYVAL_INVALID) PetscFunctionReturn(0); 87a297a907SKarl Rupp 889566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_get_attr(comm, Petsc_Viewer_SAWs_keyval, (void **)&viewer, &flag)); 895c6c1daeSBarry Smith if (flag) { 909566063dSJacob Faibussowitsch PetscCall(PetscViewerDestroy(&viewer)); 919566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_delete_attr(comm, Petsc_Viewer_SAWs_keyval)); 925c6c1daeSBarry Smith } 935c6c1daeSBarry Smith PetscFunctionReturn(0); 945c6c1daeSBarry Smith } 955c6c1daeSBarry Smith 96*9371c9d4SSatish Balay static PetscErrorCode PetscViewerDestroy_SAWs(PetscViewer viewer) { 975c6c1daeSBarry Smith PetscFunctionBegin; 985c6c1daeSBarry Smith /* 995c6c1daeSBarry Smith Make sure that we mark that the stack is no longer published 1005c6c1daeSBarry Smith */ 1019566063dSJacob Faibussowitsch if (PetscObjectComm((PetscObject)viewer) == PETSC_COMM_WORLD) PetscCall(PetscStackSAWsViewOff()); 1025c6c1daeSBarry Smith PetscFunctionReturn(0); 1035c6c1daeSBarry Smith } 1045c6c1daeSBarry Smith 105*9371c9d4SSatish Balay PETSC_EXTERN PetscErrorCode PetscViewerCreate_SAWs(PetscViewer v) { 1065c6c1daeSBarry Smith PetscFunctionBegin; 107e04113cfSBarry Smith v->ops->destroy = PetscViewerDestroy_SAWs; 1085c6c1daeSBarry Smith PetscFunctionReturn(0); 1095c6c1daeSBarry Smith } 110