1 /* Routines to visualize DMs through GLVis */
2
3 #include <petsc/private/dmimpl.h>
4 #include <petsc/private/glvisviewerimpl.h>
5
DMView_GLVis(DM dm,PetscViewer viewer,PetscErrorCode (* DMView_GLVis_ASCII)(DM,PetscViewer))6 PetscErrorCode DMView_GLVis(DM dm, PetscViewer viewer, PetscErrorCode (*DMView_GLVis_ASCII)(DM, PetscViewer))
7 {
8 PetscBool isglvis, isascii;
9
10 PetscFunctionBegin;
11 PetscValidHeaderSpecific(dm, DM_CLASSID, 1);
12 PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 2);
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;
19
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;
27
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));
32
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 }
47