Actual source code: dmglvis.c
1: /* Routines to visualize DMs through GLVis */
3: #include <petsc/private/dmimpl.h>
4: #include <petsc/private/glvisviewerimpl.h>
6: PetscErrorCode DMView_GLVis(DM dm, PetscViewer viewer, PetscErrorCode (*DMView_GLVis_ASCII)(DM, PetscViewer))
7: {
8: PetscBool isglvis, isascii;
10: PetscFunctionBegin;
13: PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERGLVIS, &isglvis));
14: PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &isascii));
15: PetscCheck(isglvis || isascii, PetscObjectComm((PetscObject)viewer), PETSC_ERR_SUP, "Viewer must be of type VIEWERGLVIS or VIEWERASCII");
16: if (isglvis) {
17: PetscViewerGLVisType type;
18: PetscViewer view;
20: PetscCall(PetscViewerGLVisGetType_Internal(viewer, &type));
21: PetscCall(PetscViewerGLVisGetDMWindow_Internal(viewer, &view));
22: if (!view) PetscFunctionReturn(PETSC_SUCCESS); /* socket window has been closed */
23: if (type == PETSC_VIEWER_GLVIS_SOCKET) {
24: PetscMPIInt size, rank;
25: PetscInt sdim;
26: const char *name;
28: PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)dm), &size));
29: PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)dm), &rank));
30: PetscCall(DMGetCoordinateDim(dm, &sdim));
31: PetscCall(PetscObjectGetName((PetscObject)dm, &name));
33: PetscCall(PetscGLVisCollectiveBegin(PetscObjectComm((PetscObject)dm), &view));
34: PetscCall(PetscViewerASCIIPrintf(view, "parallel %d %d\nmesh\n", size, rank));
35: PetscCall(DMView_GLVis_ASCII(dm, view));
36: PetscCall(PetscViewerGLVisInitWindow_Internal(view, PETSC_TRUE, sdim, name));
37: PetscCall(PetscGLVisCollectiveEnd(PetscObjectComm((PetscObject)dm), &view));
38: } else {
39: PetscCall(DMView_GLVis_ASCII(dm, view));
40: }
41: PetscCall(PetscViewerGLVisRestoreDMWindow_Internal(viewer, &view));
42: } else {
43: PetscCall(DMView_GLVis_ASCII(dm, viewer));
44: }
45: PetscFunctionReturn(PETSC_SUCCESS);
46: }