xref: /petsc/src/sys/classes/viewer/impls/draw/drawv.c (revision 648c30bcb65f74c3cbd15d7a91a7ed7c1890e25b)
15c6c1daeSBarry Smith #include <../src/sys/classes/viewer/impls/draw/vdraw.h> /*I "petscdraw.h" I*/
2665c2dedSJed Brown #include <petscviewer.h>                                /*I "petscviewer.h" I*/
35c6c1daeSBarry Smith 
4d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerDestroy_Draw(PetscViewer v)
5d71ae5a4SJacob Faibussowitsch {
65c6c1daeSBarry Smith   PetscInt          i;
75c6c1daeSBarry Smith   PetscViewer_Draw *vdraw = (PetscViewer_Draw *)v->data;
85c6c1daeSBarry Smith 
95c6c1daeSBarry Smith   PetscFunctionBegin;
1028b400f6SJacob Faibussowitsch   PetscCheck(!vdraw->singleton_made, PETSC_COMM_SELF, PETSC_ERR_ORDER, "Destroying PetscViewer without first restoring singleton");
115c6c1daeSBarry Smith   for (i = 0; i < vdraw->draw_max; i++) {
129566063dSJacob Faibussowitsch     PetscCall(PetscDrawAxisDestroy(&vdraw->drawaxis[i]));
139566063dSJacob Faibussowitsch     PetscCall(PetscDrawLGDestroy(&vdraw->drawlg[i]));
149566063dSJacob Faibussowitsch     PetscCall(PetscDrawDestroy(&vdraw->draw[i]));
155c6c1daeSBarry Smith   }
169566063dSJacob Faibussowitsch   PetscCall(PetscFree(vdraw->display));
179566063dSJacob Faibussowitsch   PetscCall(PetscFree(vdraw->title));
189566063dSJacob Faibussowitsch   PetscCall(PetscFree3(vdraw->draw, vdraw->drawlg, vdraw->drawaxis));
199566063dSJacob Faibussowitsch   PetscCall(PetscFree(vdraw->bounds));
209566063dSJacob Faibussowitsch   PetscCall(PetscFree(vdraw->drawtype));
219566063dSJacob Faibussowitsch   PetscCall(PetscFree(v->data));
223ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
235c6c1daeSBarry Smith }
245c6c1daeSBarry Smith 
25d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerFlush_Draw(PetscViewer v)
26d71ae5a4SJacob Faibussowitsch {
275c6c1daeSBarry Smith   PetscInt          i;
285c6c1daeSBarry Smith   PetscViewer_Draw *vdraw = (PetscViewer_Draw *)v->data;
295c6c1daeSBarry Smith 
305c6c1daeSBarry Smith   PetscFunctionBegin;
315c6c1daeSBarry Smith   for (i = 0; i < vdraw->draw_max; i++) {
329566063dSJacob Faibussowitsch     if (vdraw->draw[i]) PetscCall(PetscDrawFlush(vdraw->draw[i]));
335c6c1daeSBarry Smith   }
343ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
355c6c1daeSBarry Smith }
365c6c1daeSBarry Smith 
375d83a8b1SBarry Smith /*@
38c410d8ccSBarry Smith   PetscViewerDrawGetDraw - Returns `PetscDraw` object from `PETSCVIEWERDRAW` `PetscViewer` object.
39c410d8ccSBarry Smith   This `PetscDraw` object may then be used to perform graphics using `PetscDraw` commands.
405c6c1daeSBarry Smith 
41c3339decSBarry Smith   Collective
425c6c1daeSBarry Smith 
435c6c1daeSBarry Smith   Input Parameters:
44811af0c4SBarry Smith + viewer       - the `PetscViewer` (created with `PetscViewerDrawOpen()` of type `PETSCVIEWERDRAW`)
45c410d8ccSBarry Smith - windownumber - indicates which subwindow (usually 0) to obtain
465c6c1daeSBarry Smith 
4701d2d390SJose E. Roman   Output Parameter:
485c6c1daeSBarry Smith . draw - the draw object
495c6c1daeSBarry Smith 
505c6c1daeSBarry Smith   Level: intermediate
515c6c1daeSBarry Smith 
52d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscViewerDrawGetLG()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()`
535c6c1daeSBarry Smith @*/
54d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawGetDraw(PetscViewer viewer, PetscInt windownumber, PetscDraw *draw)
55d71ae5a4SJacob Faibussowitsch {
56e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
575c6c1daeSBarry Smith   PetscBool         isdraw;
585c6c1daeSBarry Smith 
595c6c1daeSBarry Smith   PetscFunctionBegin;
605c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
61e5ab1681SLisandro Dalcin   PetscValidLogicalCollectiveInt(viewer, windownumber, 2);
624f572ea9SToby Isaac   if (draw) PetscAssertPointer(draw, 3);
639566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
6428b400f6SJacob Faibussowitsch   PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer");
6508401ef6SPierre Jolivet   PetscCheck(windownumber >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Window number cannot be negative");
66e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)viewer->data;
67e5ab1681SLisandro Dalcin 
685c6c1daeSBarry Smith   windownumber += vdraw->draw_base;
695c6c1daeSBarry Smith   if (windownumber >= vdraw->draw_max) {
705c6c1daeSBarry Smith     /* allocate twice as many slots as needed */
715c6c1daeSBarry Smith     PetscInt       draw_max = vdraw->draw_max;
725c6c1daeSBarry Smith     PetscDraw     *tdraw    = vdraw->draw;
735c6c1daeSBarry Smith     PetscDrawLG   *drawlg   = vdraw->drawlg;
745c6c1daeSBarry Smith     PetscDrawAxis *drawaxis = vdraw->drawaxis;
755c6c1daeSBarry Smith 
765c6c1daeSBarry Smith     vdraw->draw_max = 2 * windownumber;
77a297a907SKarl Rupp 
789566063dSJacob Faibussowitsch     PetscCall(PetscCalloc3(vdraw->draw_max, &vdraw->draw, vdraw->draw_max, &vdraw->drawlg, vdraw->draw_max, &vdraw->drawaxis));
799566063dSJacob Faibussowitsch     PetscCall(PetscArraycpy(vdraw->draw, tdraw, draw_max));
809566063dSJacob Faibussowitsch     PetscCall(PetscArraycpy(vdraw->drawlg, drawlg, draw_max));
819566063dSJacob Faibussowitsch     PetscCall(PetscArraycpy(vdraw->drawaxis, drawaxis, draw_max));
829566063dSJacob Faibussowitsch     PetscCall(PetscFree3(tdraw, drawlg, drawaxis));
835c6c1daeSBarry Smith   }
845c6c1daeSBarry Smith 
855c6c1daeSBarry Smith   if (!vdraw->draw[windownumber]) {
86e5ab1681SLisandro Dalcin     char *title = vdraw->title, tmp_str[128];
8710f3a0f4SLisandro Dalcin     if (windownumber) {
889566063dSJacob Faibussowitsch       PetscCall(PetscSNPrintf(tmp_str, sizeof(tmp_str), "%s:%" PetscInt_FMT, vdraw->title ? vdraw->title : "", windownumber));
895c6c1daeSBarry Smith       title = tmp_str;
905c6c1daeSBarry Smith     }
919566063dSJacob Faibussowitsch     PetscCall(PetscDrawCreate(PetscObjectComm((PetscObject)viewer), vdraw->display, title, PETSC_DECIDE, PETSC_DECIDE, vdraw->w, vdraw->h, &vdraw->draw[windownumber]));
9248a46eb9SPierre Jolivet     if (vdraw->drawtype) PetscCall(PetscDrawSetType(vdraw->draw[windownumber], vdraw->drawtype));
939566063dSJacob Faibussowitsch     PetscCall(PetscDrawSetPause(vdraw->draw[windownumber], vdraw->pause));
949566063dSJacob Faibussowitsch     PetscCall(PetscDrawSetOptionsPrefix(vdraw->draw[windownumber], ((PetscObject)viewer)->prefix));
959566063dSJacob Faibussowitsch     PetscCall(PetscDrawSetFromOptions(vdraw->draw[windownumber]));
965c6c1daeSBarry Smith   }
975c6c1daeSBarry Smith   if (draw) *draw = vdraw->draw[windownumber];
98064a246eSJacob Faibussowitsch   if (draw) PetscValidHeaderSpecific(*draw, PETSC_DRAW_CLASSID, 3);
993ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1005c6c1daeSBarry Smith }
1015c6c1daeSBarry Smith 
1025d83a8b1SBarry Smith /*@
103c410d8ccSBarry Smith   PetscViewerDrawBaseAdd - add to the base integer that is added to the `windownumber` passed to `PetscViewerDrawGetDraw()`
1045c6c1daeSBarry Smith 
105c3339decSBarry Smith   Logically Collective
1065c6c1daeSBarry Smith 
1075c6c1daeSBarry Smith   Input Parameters:
108811af0c4SBarry Smith + viewer       - the `PetscViewer` (created with `PetscViewerDrawOpen()`)
1095c6c1daeSBarry Smith - windownumber - how much to add to the base
1105c6c1daeSBarry Smith 
1115c6c1daeSBarry Smith   Level: developer
1125c6c1daeSBarry Smith 
113811af0c4SBarry Smith   Note:
114811af0c4SBarry Smith   A `PETSCVIEWERDRAW` may have multiple `PetscDraw` subwindows, this increases the number of the subwindow that is returned with `PetscViewerDrawGetDraw()`
115811af0c4SBarry Smith 
116d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewerDrawGetLG()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`, `PetscViewerDrawBaseSet()`
1175c6c1daeSBarry Smith @*/
118d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawBaseAdd(PetscViewer viewer, PetscInt windownumber)
119d71ae5a4SJacob Faibussowitsch {
120e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
1215c6c1daeSBarry Smith   PetscBool         isdraw;
1225c6c1daeSBarry Smith 
1235c6c1daeSBarry Smith   PetscFunctionBegin;
1245c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
125e5ab1681SLisandro Dalcin   PetscValidLogicalCollectiveInt(viewer, windownumber, 2);
1269566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
12728b400f6SJacob Faibussowitsch   PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer");
128e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)viewer->data;
129e5ab1681SLisandro Dalcin 
130cc73adaaSBarry Smith   PetscCheck(windownumber + vdraw->draw_base >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Resulting base %" PetscInt_FMT " cannot be negative", windownumber + vdraw->draw_base);
1315c6c1daeSBarry Smith   vdraw->draw_base += windownumber;
1323ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1335c6c1daeSBarry Smith }
1345c6c1daeSBarry Smith 
1355d83a8b1SBarry Smith /*@
136c410d8ccSBarry Smith   PetscViewerDrawBaseSet - sets the base integer that is added to the `windownumber` passed to `PetscViewerDrawGetDraw()`
1375c6c1daeSBarry Smith 
138c3339decSBarry Smith   Logically Collective
1395c6c1daeSBarry Smith 
1405c6c1daeSBarry Smith   Input Parameters:
141811af0c4SBarry Smith + viewer       - the `PetscViewer` (created with `PetscViewerDrawOpen()`)
1425c6c1daeSBarry Smith - windownumber - value to set the base
1435c6c1daeSBarry Smith 
1445c6c1daeSBarry Smith   Level: developer
1455c6c1daeSBarry Smith 
146811af0c4SBarry Smith   Note:
147811af0c4SBarry Smith   A `PETSCVIEWERDRAW` may have multiple `PetscDraw` subwindows, this increases the number of the subwindow that is returned with `PetscViewerDrawGetDraw()`
148811af0c4SBarry Smith 
149d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewerDrawGetLG()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`, `PetscViewerDrawBaseAdd()`
1505c6c1daeSBarry Smith @*/
151d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawBaseSet(PetscViewer viewer, PetscInt windownumber)
152d71ae5a4SJacob Faibussowitsch {
153e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
1545c6c1daeSBarry Smith   PetscBool         isdraw;
1555c6c1daeSBarry Smith 
1565c6c1daeSBarry Smith   PetscFunctionBegin;
1575c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
158e5ab1681SLisandro Dalcin   PetscValidLogicalCollectiveInt(viewer, windownumber, 2);
1599566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
16028b400f6SJacob Faibussowitsch   PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer");
161e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)viewer->data;
162e5ab1681SLisandro Dalcin 
16308401ef6SPierre Jolivet   PetscCheck(windownumber >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Resulting base %" PetscInt_FMT " cannot be negative", windownumber);
1645c6c1daeSBarry Smith   vdraw->draw_base = windownumber;
1653ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1665c6c1daeSBarry Smith }
1675c6c1daeSBarry Smith 
1685d83a8b1SBarry Smith /*@
169811af0c4SBarry Smith   PetscViewerDrawGetDrawLG - Returns a `PetscDrawLG` object from `PetscViewer` object of type `PETSCVIEWERDRAW`.
170811af0c4SBarry Smith   This `PetscDrawLG` object may then be used to perform graphics using `PetscDrawLG` commands.
1715c6c1daeSBarry Smith 
172c3339decSBarry Smith   Collective
1735c6c1daeSBarry Smith 
174d8d19677SJose E. Roman   Input Parameters:
1752fe279fdSBarry Smith + viewer       - the `PetscViewer` (created with `PetscViewerDrawOpen()`)
1765c6c1daeSBarry Smith - windownumber - indicates which subwindow (usually 0)
1775c6c1daeSBarry Smith 
17801d2d390SJose E. Roman   Output Parameter:
179aec76313SJacob Faibussowitsch . drawlg - the draw line graph object
1805c6c1daeSBarry Smith 
1815c6c1daeSBarry Smith   Level: intermediate
1825c6c1daeSBarry Smith 
183811af0c4SBarry Smith   Note:
184811af0c4SBarry Smith   A `PETSCVIEWERDRAW` may have multiple `PetscDraw` subwindows
185811af0c4SBarry Smith 
186d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscDrawLG`, `PetscViewerDrawGetDraw()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()`
1875c6c1daeSBarry Smith @*/
188d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawGetDrawLG(PetscViewer viewer, PetscInt windownumber, PetscDrawLG *drawlg)
189d71ae5a4SJacob Faibussowitsch {
1905c6c1daeSBarry Smith   PetscBool         isdraw;
191e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
1925c6c1daeSBarry Smith 
1935c6c1daeSBarry Smith   PetscFunctionBegin;
1945c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
195e5ab1681SLisandro Dalcin   PetscValidLogicalCollectiveInt(viewer, windownumber, 2);
1964f572ea9SToby Isaac   PetscAssertPointer(drawlg, 3);
1979566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
19828b400f6SJacob Faibussowitsch   PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer");
19908401ef6SPierre Jolivet   PetscCheck(windownumber >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Window number cannot be negative");
200e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)viewer->data;
2015c6c1daeSBarry Smith 
20248a46eb9SPierre Jolivet   if (windownumber + vdraw->draw_base >= vdraw->draw_max || !vdraw->draw[windownumber + vdraw->draw_base]) PetscCall(PetscViewerDrawGetDraw(viewer, windownumber, NULL));
2035c6c1daeSBarry Smith   if (!vdraw->drawlg[windownumber + vdraw->draw_base]) {
2049566063dSJacob Faibussowitsch     PetscCall(PetscDrawLGCreate(vdraw->draw[windownumber + vdraw->draw_base], 1, &vdraw->drawlg[windownumber + vdraw->draw_base]));
2059566063dSJacob Faibussowitsch     PetscCall(PetscDrawLGSetFromOptions(vdraw->drawlg[windownumber + vdraw->draw_base]));
2065c6c1daeSBarry Smith   }
2075c6c1daeSBarry Smith   *drawlg = vdraw->drawlg[windownumber + vdraw->draw_base];
2083ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2095c6c1daeSBarry Smith }
2105c6c1daeSBarry Smith 
2115d83a8b1SBarry Smith /*@
212811af0c4SBarry Smith   PetscViewerDrawGetDrawAxis - Returns a `PetscDrawAxis` object from a `PetscViewer` object of type `PETSCVIEWERDRAW`.
213811af0c4SBarry Smith   This `PetscDrawAxis` object may then be used to perform graphics using `PetscDrawAxis` commands.
2145c6c1daeSBarry Smith 
215c3339decSBarry Smith   Collective
2165c6c1daeSBarry Smith 
217d8d19677SJose E. Roman   Input Parameters:
218811af0c4SBarry Smith + viewer       - the `PetscViewer` (created with `PetscViewerDrawOpen()`)
2195c6c1daeSBarry Smith - windownumber - indicates which subwindow (usually 0)
2205c6c1daeSBarry Smith 
22101d2d390SJose E. Roman   Output Parameter:
2225c6c1daeSBarry Smith . drawaxis - the draw axis object
2235c6c1daeSBarry Smith 
2245c6c1daeSBarry Smith   Level: advanced
2255c6c1daeSBarry Smith 
226811af0c4SBarry Smith   Note:
227811af0c4SBarry Smith   A `PETSCVIEWERDRAW` may have multiple `PetscDraw` subwindows
228811af0c4SBarry Smith 
229d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewerDrawGetDraw()`, `PetscViewerDrawGetLG()`, `PetscViewerDrawOpen()`
2305c6c1daeSBarry Smith @*/
231d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawGetDrawAxis(PetscViewer viewer, PetscInt windownumber, PetscDrawAxis *drawaxis)
232d71ae5a4SJacob Faibussowitsch {
2335c6c1daeSBarry Smith   PetscBool         isdraw;
234e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
2355c6c1daeSBarry Smith 
2365c6c1daeSBarry Smith   PetscFunctionBegin;
2375c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
238e5ab1681SLisandro Dalcin   PetscValidLogicalCollectiveInt(viewer, windownumber, 2);
2394f572ea9SToby Isaac   PetscAssertPointer(drawaxis, 3);
2409566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
24128b400f6SJacob Faibussowitsch   PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer");
24208401ef6SPierre Jolivet   PetscCheck(windownumber >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Window number cannot be negative");
243e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)viewer->data;
2445c6c1daeSBarry Smith 
24548a46eb9SPierre Jolivet   if (windownumber + vdraw->draw_base >= vdraw->draw_max || !vdraw->draw[windownumber + vdraw->draw_base]) PetscCall(PetscViewerDrawGetDraw(viewer, windownumber, NULL));
2464dfa11a4SJacob Faibussowitsch   if (!vdraw->drawaxis[windownumber + vdraw->draw_base]) PetscCall(PetscDrawAxisCreate(vdraw->draw[windownumber + vdraw->draw_base], &vdraw->drawaxis[windownumber + vdraw->draw_base]));
2475c6c1daeSBarry Smith   *drawaxis = vdraw->drawaxis[windownumber + vdraw->draw_base];
2483ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2495c6c1daeSBarry Smith }
2505c6c1daeSBarry Smith 
251d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawResize(PetscViewer v, int w, int h)
252d71ae5a4SJacob Faibussowitsch {
253e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
254e5ab1681SLisandro Dalcin   PetscBool         isdraw;
2555c6c1daeSBarry Smith 
2565c6c1daeSBarry Smith   PetscFunctionBegin;
257e5ab1681SLisandro Dalcin   PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1);
2589566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw));
2593ba16761SJacob Faibussowitsch   if (!isdraw) PetscFunctionReturn(PETSC_SUCCESS);
260e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)v->data;
261e5ab1681SLisandro Dalcin 
262e5ab1681SLisandro Dalcin   if (w >= 1) vdraw->w = w;
263e5ab1681SLisandro Dalcin   if (h >= 1) vdraw->h = h;
2643ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2655c6c1daeSBarry Smith }
2665c6c1daeSBarry Smith 
267d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawSetInfo(PetscViewer v, const char display[], const char title[], int x, int y, int w, int h)
268d71ae5a4SJacob Faibussowitsch {
269e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
270e5ab1681SLisandro Dalcin   PetscBool         isdraw;
2715c6c1daeSBarry Smith 
2725c6c1daeSBarry Smith   PetscFunctionBegin;
273e5ab1681SLisandro Dalcin   PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1);
2749566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw));
2753ba16761SJacob Faibussowitsch   if (!isdraw) PetscFunctionReturn(PETSC_SUCCESS);
276e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)v->data;
277e5ab1681SLisandro Dalcin 
2789566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(display, &vdraw->display));
2799566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(title, &vdraw->title));
280e5ab1681SLisandro Dalcin   if (w >= 1) vdraw->w = w;
281e5ab1681SLisandro Dalcin   if (h >= 1) vdraw->h = h;
2823ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2835c6c1daeSBarry Smith }
2845c6c1daeSBarry Smith 
285d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawSetDrawType(PetscViewer v, PetscDrawType drawtype)
286d71ae5a4SJacob Faibussowitsch {
287e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
288e5ab1681SLisandro Dalcin   PetscBool         isdraw;
289d1da0b69SBarry Smith 
290d1da0b69SBarry Smith   PetscFunctionBegin;
291e5ab1681SLisandro Dalcin   PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1);
2929566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw));
2933ba16761SJacob Faibussowitsch   if (!isdraw) PetscFunctionReturn(PETSC_SUCCESS);
294e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)v->data;
295e5ab1681SLisandro Dalcin 
2969566063dSJacob Faibussowitsch   PetscCall(PetscFree(vdraw->drawtype));
2979566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(drawtype, (char **)&vdraw->drawtype));
2983ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
299d1da0b69SBarry Smith }
300d1da0b69SBarry Smith 
301d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawGetDrawType(PetscViewer v, PetscDrawType *drawtype)
302d71ae5a4SJacob Faibussowitsch {
3031f49e1f7SLisandro Dalcin   PetscViewer_Draw *vdraw;
3041f49e1f7SLisandro Dalcin   PetscBool         isdraw;
3051f49e1f7SLisandro Dalcin 
3061f49e1f7SLisandro Dalcin   PetscFunctionBegin;
3071f49e1f7SLisandro Dalcin   PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1);
3089566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw));
30928b400f6SJacob Faibussowitsch   PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer");
3101f49e1f7SLisandro Dalcin   vdraw = (PetscViewer_Draw *)v->data;
3111f49e1f7SLisandro Dalcin 
3121f49e1f7SLisandro Dalcin   *drawtype = vdraw->drawtype;
3133ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3141f49e1f7SLisandro Dalcin }
3151f49e1f7SLisandro Dalcin 
316d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawSetTitle(PetscViewer v, const char title[])
317d71ae5a4SJacob Faibussowitsch {
318f55236e4SLisandro Dalcin   PetscViewer_Draw *vdraw;
319f55236e4SLisandro Dalcin   PetscBool         isdraw;
320f55236e4SLisandro Dalcin 
321f55236e4SLisandro Dalcin   PetscFunctionBegin;
322f55236e4SLisandro Dalcin   PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1);
3239566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw));
3243ba16761SJacob Faibussowitsch   if (!isdraw) PetscFunctionReturn(PETSC_SUCCESS);
325f55236e4SLisandro Dalcin   vdraw = (PetscViewer_Draw *)v->data;
326f55236e4SLisandro Dalcin 
3279566063dSJacob Faibussowitsch   PetscCall(PetscFree(vdraw->title));
3289566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(title, &vdraw->title));
3293ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
330f55236e4SLisandro Dalcin }
331f55236e4SLisandro Dalcin 
332d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawGetTitle(PetscViewer v, const char *title[])
333d71ae5a4SJacob Faibussowitsch {
334f55236e4SLisandro Dalcin   PetscViewer_Draw *vdraw;
335f55236e4SLisandro Dalcin   PetscBool         isdraw;
336f55236e4SLisandro Dalcin 
337f55236e4SLisandro Dalcin   PetscFunctionBegin;
338f55236e4SLisandro Dalcin   PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1);
3399566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw));
34028b400f6SJacob Faibussowitsch   PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer");
341f55236e4SLisandro Dalcin   vdraw = (PetscViewer_Draw *)v->data;
342f55236e4SLisandro Dalcin 
343f55236e4SLisandro Dalcin   *title = vdraw->title;
3443ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
345f55236e4SLisandro Dalcin }
346f55236e4SLisandro Dalcin 
347cc4c1da9SBarry Smith /*@
34810450e9eSJacob Faibussowitsch   PetscViewerDrawOpen - Opens a `PetscDraw` window for use as a `PetscViewer` with type
34910450e9eSJacob Faibussowitsch   `PETSCVIEWERDRAW`.
3505c6c1daeSBarry Smith 
351d083f849SBarry Smith   Collective
3525c6c1daeSBarry Smith 
3535c6c1daeSBarry Smith   Input Parameters:
3545c6c1daeSBarry Smith + comm    - communicator that will share window
3553f423023SBarry Smith . display - the X display on which to open, or `NULL` for the local machine
3563f423023SBarry Smith . title   - the title to put in the title bar, or `NULL` for no title
357aaa8cc7dSPierre Jolivet . x       - horizontal screen coordinate of the upper left corner of window, or use `PETSC_DECIDE`
3582fe279fdSBarry Smith . y       - vertical screen coordinate of the upper left corner of window, or use `PETSC_DECIDE`
3592fe279fdSBarry Smith . w       - window width in pixels, or may use `PETSC_DECIDE` or `PETSC_DRAW_FULL_SIZE`, `PETSC_DRAW_HALF_SIZE`,`PETSC_DRAW_THIRD_SIZE`, `PETSC_DRAW_QUARTER_SIZE`
3602fe279fdSBarry Smith - h       - window height in pixels, or may use `PETSC_DECIDE` or `PETSC_DRAW_FULL_SIZE`, `PETSC_DRAW_HALF_SIZE`,`PETSC_DRAW_THIRD_SIZE`, `PETSC_DRAW_QUARTER_SIZE`
3615c6c1daeSBarry Smith 
362f899ff85SJose E. Roman   Output Parameter:
363811af0c4SBarry Smith . viewer - the `PetscViewer`
3645c6c1daeSBarry Smith 
3655c6c1daeSBarry Smith   Options Database Keys:
36610699b91SBarry Smith + -draw_type          - use x or null
3675c6c1daeSBarry Smith . -nox                - Disables all x-windows output
3685c6c1daeSBarry Smith . -display <name>     - Specifies name of machine for the X display
3695c6c1daeSBarry Smith . -geometry <x,y,w,h> - allows setting the window location and size
3705c6c1daeSBarry Smith - -draw_pause <pause> - Sets time (in seconds) that the
3715c6c1daeSBarry Smith      program pauses after PetscDrawPause() has been called
3725c6c1daeSBarry Smith      (0 is default, -1 implies until user input).
3735c6c1daeSBarry Smith 
3745c6c1daeSBarry Smith   Level: beginner
3755c6c1daeSBarry Smith 
37610450e9eSJacob Faibussowitsch   Notes:
37710450e9eSJacob Faibussowitsch   If you want to do graphics in this window, you must call `PetscViewerDrawGetDraw()` and
37810450e9eSJacob Faibussowitsch   perform the graphics on the `PetscDraw` object.
37910450e9eSJacob Faibussowitsch 
38010450e9eSJacob Faibussowitsch   Format options include\:
38110450e9eSJacob Faibussowitsch + `PETSC_VIEWER_DRAW_BASIC` - displays with basic format
38210450e9eSJacob Faibussowitsch - `PETSC_VIEWER_DRAW_LG`    - displays using a line graph
38310450e9eSJacob Faibussowitsch 
384aec76313SJacob Faibussowitsch   Fortran Notes:
3855c6c1daeSBarry Smith   Whenever indicating null character data in a Fortran code,
386811af0c4SBarry Smith   `PETSC_NULL_CHARACTER` must be employed; using NULL is not
387811af0c4SBarry Smith   correct for character data!  Thus, `PETSC_NULL_CHARACTER` can be
3885c6c1daeSBarry Smith   used for the display and title input parameters.
3895c6c1daeSBarry Smith 
390d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscDrawCreate()`, `PetscViewerDestroy()`, `PetscViewerDrawGetDraw()`, `PetscViewerCreate()`, `PETSC_VIEWER_DRAW_`,
391db781477SPatrick Sanan           `PETSC_VIEWER_DRAW_WORLD`, `PETSC_VIEWER_DRAW_SELF`
3925c6c1daeSBarry Smith @*/
393d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawOpen(MPI_Comm comm, const char display[], const char title[], int x, int y, int w, int h, PetscViewer *viewer)
394d71ae5a4SJacob Faibussowitsch {
3955c6c1daeSBarry Smith   PetscFunctionBegin;
3969566063dSJacob Faibussowitsch   PetscCall(PetscViewerCreate(comm, viewer));
3979566063dSJacob Faibussowitsch   PetscCall(PetscViewerSetType(*viewer, PETSCVIEWERDRAW));
3989566063dSJacob Faibussowitsch   PetscCall(PetscViewerDrawSetInfo(*viewer, display, title, x, y, w, h));
3993ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4005c6c1daeSBarry Smith }
4015c6c1daeSBarry Smith 
402a9db196aSBarry Smith #include <petsc/private/drawimpl.h>
403a9db196aSBarry Smith 
40434e79e72SJacob Faibussowitsch static PetscErrorCode PetscViewerGetSubViewer_Draw(PetscViewer viewer, MPI_Comm comm, PetscViewer *sviewer)
405d71ae5a4SJacob Faibussowitsch {
4065c6c1daeSBarry Smith   PetscMPIInt       rank;
4075c6c1daeSBarry Smith   PetscInt          i;
408c6228bbaSLisandro Dalcin   PetscViewer_Draw *vdraw = (PetscViewer_Draw *)viewer->data, *svdraw;
4095c6c1daeSBarry Smith 
4105c6c1daeSBarry Smith   PetscFunctionBegin;
41128b400f6SJacob Faibussowitsch   PetscCheck(!vdraw->singleton_made, PETSC_COMM_SELF, PETSC_ERR_ORDER, "Trying to get SubViewer without first restoring previous");
4125c6c1daeSBarry Smith   /* only processor zero can use the PetscViewer draw singleton */
413fefe69c3SStefano Zampini   if (sviewer) *sviewer = NULL;
4149566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)viewer), &rank));
415dd400576SPatrick Sanan   if (rank == 0) {
416e5afcf28SBarry Smith     PetscMPIInt flg;
417a9db196aSBarry Smith     PetscDraw   draw, sdraw;
418e5afcf28SBarry Smith 
4199566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_compare(PETSC_COMM_SELF, comm, &flg));
420cc73adaaSBarry Smith     PetscCheck(flg == MPI_IDENT || flg == MPI_CONGRUENT, PETSC_COMM_SELF, PETSC_ERR_SUP, "PetscViewerGetSubViewer() for PETSCVIEWERDRAW requires a singleton MPI_Comm");
4219566063dSJacob Faibussowitsch     PetscCall(PetscViewerCreate(comm, sviewer));
4229566063dSJacob Faibussowitsch     PetscCall(PetscViewerSetType(*sviewer, PETSCVIEWERDRAW));
423c6228bbaSLisandro Dalcin     svdraw             = (PetscViewer_Draw *)(*sviewer)->data;
424c6228bbaSLisandro Dalcin     (*sviewer)->format = viewer->format;
425c6228bbaSLisandro Dalcin     for (i = 0; i < vdraw->draw_max; i++) { /* XXX this is wrong if svdraw->draw_max (initially 5) < vdraw->draw_max */
4269566063dSJacob Faibussowitsch       if (vdraw->draw[i]) PetscCall(PetscDrawGetSingleton(vdraw->draw[i], &svdraw->draw[i]));
4275c6c1daeSBarry Smith     }
4289566063dSJacob Faibussowitsch     PetscCall(PetscViewerDrawGetDraw(viewer, 0, &draw));
4299566063dSJacob Faibussowitsch     PetscCall(PetscViewerDrawGetDraw(*sviewer, 0, &sdraw));
430a9db196aSBarry Smith     if (draw->savefilename) {
4319566063dSJacob Faibussowitsch       PetscCall(PetscDrawSetSave(sdraw, draw->savefilename));
432a9db196aSBarry Smith       sdraw->savefilecount  = draw->savefilecount;
433a9db196aSBarry Smith       sdraw->savesinglefile = draw->savesinglefile;
434a9db196aSBarry Smith       sdraw->savemoviefps   = draw->savemoviefps;
435a9db196aSBarry Smith       sdraw->saveonclear    = draw->saveonclear;
436a9db196aSBarry Smith       sdraw->saveonflush    = draw->saveonflush;
437a9db196aSBarry Smith     }
4389566063dSJacob Faibussowitsch     if (draw->savefinalfilename) PetscCall(PetscDrawSetSaveFinalImage(sdraw, draw->savefinalfilename));
439a9db196aSBarry Smith   } else {
440a9db196aSBarry Smith     PetscDraw draw;
4419566063dSJacob Faibussowitsch     PetscCall(PetscViewerDrawGetDraw(viewer, 0, &draw));
4425c6c1daeSBarry Smith   }
4435c6c1daeSBarry Smith   vdraw->singleton_made = PETSC_TRUE;
4443ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4455c6c1daeSBarry Smith }
4465c6c1daeSBarry Smith 
44734e79e72SJacob Faibussowitsch static PetscErrorCode PetscViewerRestoreSubViewer_Draw(PetscViewer viewer, MPI_Comm comm, PetscViewer *sviewer)
448d71ae5a4SJacob Faibussowitsch {
4495c6c1daeSBarry Smith   PetscMPIInt       rank;
4505c6c1daeSBarry Smith   PetscInt          i;
451c6228bbaSLisandro Dalcin   PetscViewer_Draw *vdraw = (PetscViewer_Draw *)viewer->data, *svdraw;
4525c6c1daeSBarry Smith 
4535c6c1daeSBarry Smith   PetscFunctionBegin;
45428b400f6SJacob Faibussowitsch   PetscCheck(vdraw->singleton_made, PETSC_COMM_SELF, PETSC_ERR_ORDER, "Trying to restore a singleton that was not gotten");
4559566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)viewer), &rank));
456dd400576SPatrick Sanan   if (rank == 0) {
457a9db196aSBarry Smith     PetscDraw draw, sdraw;
458a9db196aSBarry Smith 
4599566063dSJacob Faibussowitsch     PetscCall(PetscViewerDrawGetDraw(viewer, 0, &draw));
4609566063dSJacob Faibussowitsch     PetscCall(PetscViewerDrawGetDraw(*sviewer, 0, &sdraw));
461a9db196aSBarry Smith     if (draw->savefilename) {
462a9db196aSBarry Smith       draw->savefilecount = sdraw->savefilecount;
4639566063dSJacob Faibussowitsch       PetscCallMPI(MPI_Bcast(&draw->savefilecount, 1, MPIU_INT, 0, PetscObjectComm((PetscObject)draw)));
464a9db196aSBarry Smith     }
465c6228bbaSLisandro Dalcin     svdraw = (PetscViewer_Draw *)(*sviewer)->data;
4665c6c1daeSBarry Smith     for (i = 0; i < vdraw->draw_max; i++) {
46748a46eb9SPierre Jolivet       if (vdraw->draw[i] && svdraw->draw[i]) PetscCall(PetscDrawRestoreSingleton(vdraw->draw[i], &svdraw->draw[i]));
4685c6c1daeSBarry Smith     }
4699566063dSJacob Faibussowitsch     PetscCall(PetscFree3(svdraw->draw, svdraw->drawlg, svdraw->drawaxis));
4709566063dSJacob Faibussowitsch     PetscCall(PetscFree((*sviewer)->data));
4719566063dSJacob Faibussowitsch     PetscCall(PetscHeaderDestroy(sviewer));
472a9db196aSBarry Smith   } else {
473a9db196aSBarry Smith     PetscDraw draw;
474a9db196aSBarry Smith 
4759566063dSJacob Faibussowitsch     PetscCall(PetscViewerDrawGetDraw(viewer, 0, &draw));
47648a46eb9SPierre Jolivet     if (draw->savefilename) PetscCallMPI(MPI_Bcast(&draw->savefilecount, 1, MPIU_INT, 0, PetscObjectComm((PetscObject)draw)));
477a9db196aSBarry Smith   }
478a9db196aSBarry Smith 
4795c6c1daeSBarry Smith   vdraw->singleton_made = PETSC_FALSE;
4803ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4815c6c1daeSBarry Smith }
4825c6c1daeSBarry Smith 
48334e79e72SJacob Faibussowitsch static PetscErrorCode PetscViewerSetFromOptions_Draw(PetscViewer v, PetscOptionItems *PetscOptionsObject)
484d71ae5a4SJacob Faibussowitsch {
485e9457bf7SBarry Smith   PetscReal bounds[16];
486e9457bf7SBarry Smith   PetscInt  nbounds = 16;
487e9457bf7SBarry Smith   PetscBool flg;
488e9457bf7SBarry Smith 
489e9457bf7SBarry Smith   PetscFunctionBegin;
490d0609cedSBarry Smith   PetscOptionsHeadBegin(PetscOptionsObject, "Draw PetscViewer Options");
4919566063dSJacob Faibussowitsch   PetscCall(PetscOptionsRealArray("-draw_bounds", "Bounds to put on plots axis", "PetscViewerDrawSetBounds", bounds, &nbounds, &flg));
49248a46eb9SPierre Jolivet   if (flg) PetscCall(PetscViewerDrawSetBounds(v, nbounds / 2, bounds));
493d0609cedSBarry Smith   PetscOptionsHeadEnd();
4943ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
495e9457bf7SBarry Smith }
496e9457bf7SBarry Smith 
49734e79e72SJacob Faibussowitsch static PetscErrorCode PetscViewerView_Draw(PetscViewer viewer, PetscViewer v)
498d71ae5a4SJacob Faibussowitsch {
4990076e027SBarry Smith   PetscDraw         draw;
5000076e027SBarry Smith   PetscInt          i;
5010076e027SBarry Smith   PetscViewer_Draw *vdraw = (PetscViewer_Draw *)viewer->data;
502ccb5f961SBarry Smith   PetscBool         iascii;
5030076e027SBarry Smith 
5040076e027SBarry Smith   PetscFunctionBegin;
505ccb5f961SBarry Smith   PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERASCII, &iascii));
506ccb5f961SBarry Smith   if (iascii) PetscCall(PetscViewerASCIIPrintf(v, "Draw viewer is of type %s\n", vdraw->drawtype));
5070076e027SBarry Smith   /*  If the PetscViewer has just been created then no vdraw->draw yet
5080076e027SBarry Smith       exists so this will not actually call the viewer on any draws. */
5090076e027SBarry Smith   for (i = 0; i < vdraw->draw_base; i++) {
5100076e027SBarry Smith     if (vdraw->draw[i]) {
5119566063dSJacob Faibussowitsch       PetscCall(PetscViewerDrawGetDraw(viewer, i, &draw));
5129566063dSJacob Faibussowitsch       PetscCall(PetscDrawView(draw, v));
5130076e027SBarry Smith     }
5140076e027SBarry Smith   }
5153ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
5160076e027SBarry Smith }
5170076e027SBarry Smith 
5188556b5ebSBarry Smith /*MC
5198556b5ebSBarry Smith    PETSCVIEWERDRAW - A viewer that generates graphics, either to the screen or a file
5208556b5ebSBarry Smith 
521811af0c4SBarry Smith   Level: beginner
522811af0c4SBarry Smith 
523d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`, `PETSC_VIEWER_DRAW_()`, `PETSC_VIEWER_DRAW_SELF`, `PETSC_VIEWER_DRAW_WORLD`,
524db781477SPatrick Sanan           `PetscViewerCreate()`, `PetscViewerASCIIOpen()`, `PetscViewerBinaryOpen()`, `PETSCVIEWERBINARY`,
525db781477SPatrick Sanan           `PetscViewerMatlabOpen()`, `VecView()`, `DMView()`, `PetscViewerMatlabPutArray()`, `PETSCVIEWERASCII`, `PETSCVIEWERMATLAB`,
526db781477SPatrick Sanan           `PetscViewerFileSetName()`, `PetscViewerFileSetMode()`, `PetscViewerFormat`, `PetscViewerType`, `PetscViewerSetType()`
5278556b5ebSBarry Smith M*/
528d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscViewerCreate_Draw(PetscViewer viewer)
529d71ae5a4SJacob Faibussowitsch {
5305c6c1daeSBarry Smith   PetscViewer_Draw *vdraw;
5315c6c1daeSBarry Smith 
5325c6c1daeSBarry Smith   PetscFunctionBegin;
5334dfa11a4SJacob Faibussowitsch   PetscCall(PetscNew(&vdraw));
5345c6c1daeSBarry Smith   viewer->data = (void *)vdraw;
5355c6c1daeSBarry Smith 
5365c6c1daeSBarry Smith   viewer->ops->flush            = PetscViewerFlush_Draw;
5370076e027SBarry Smith   viewer->ops->view             = PetscViewerView_Draw;
5385c6c1daeSBarry Smith   viewer->ops->destroy          = PetscViewerDestroy_Draw;
539e9457bf7SBarry Smith   viewer->ops->setfromoptions   = PetscViewerSetFromOptions_Draw;
540559f443fSBarry Smith   viewer->ops->getsubviewer     = PetscViewerGetSubViewer_Draw;
541559f443fSBarry Smith   viewer->ops->restoresubviewer = PetscViewerRestoreSubViewer_Draw;
5425c6c1daeSBarry Smith 
5435c6c1daeSBarry Smith   /* these are created on the fly if requested */
5445c6c1daeSBarry Smith   vdraw->draw_max  = 5;
5455c6c1daeSBarry Smith   vdraw->draw_base = 0;
546ccad63c3SBarry Smith   vdraw->w         = PETSC_DECIDE;
547ccad63c3SBarry Smith   vdraw->h         = PETSC_DECIDE;
548a297a907SKarl Rupp 
5499566063dSJacob Faibussowitsch   PetscCall(PetscCalloc3(vdraw->draw_max, &vdraw->draw, vdraw->draw_max, &vdraw->drawlg, vdraw->draw_max, &vdraw->drawaxis));
5505c6c1daeSBarry Smith   vdraw->singleton_made = PETSC_FALSE;
5513ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
5525c6c1daeSBarry Smith }
5535c6c1daeSBarry Smith 
5545c6c1daeSBarry Smith /*@
555811af0c4SBarry Smith   PetscViewerDrawClear - Clears a `PetscDraw` graphic associated with a `PetscViewer`.
5565c6c1daeSBarry Smith 
5575c6c1daeSBarry Smith   Not Collective
5585c6c1daeSBarry Smith 
5595c6c1daeSBarry Smith   Input Parameter:
560811af0c4SBarry Smith . viewer - the `PetscViewer`
5615c6c1daeSBarry Smith 
5625c6c1daeSBarry Smith   Level: intermediate
5635c6c1daeSBarry Smith 
564d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`,
5655c6c1daeSBarry Smith @*/
566d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawClear(PetscViewer viewer)
567d71ae5a4SJacob Faibussowitsch {
5685c6c1daeSBarry Smith   PetscViewer_Draw *vdraw;
569e5ab1681SLisandro Dalcin   PetscBool         isdraw;
570e5ab1681SLisandro Dalcin   PetscInt          i;
5715c6c1daeSBarry Smith 
5725c6c1daeSBarry Smith   PetscFunctionBegin;
573e5ab1681SLisandro Dalcin   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
5749566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
5753ba16761SJacob Faibussowitsch   if (!isdraw) PetscFunctionReturn(PETSC_SUCCESS);
5765c6c1daeSBarry Smith   vdraw = (PetscViewer_Draw *)viewer->data;
577e5ab1681SLisandro Dalcin 
5785c6c1daeSBarry Smith   for (i = 0; i < vdraw->draw_max; i++) {
5799566063dSJacob Faibussowitsch     if (vdraw->draw[i]) PetscCall(PetscDrawClear(vdraw->draw[i]));
5805c6c1daeSBarry Smith   }
5813ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
5825c6c1daeSBarry Smith }
5835c6c1daeSBarry Smith 
5845c6c1daeSBarry Smith /*@
585811af0c4SBarry Smith   PetscViewerDrawGetPause - Gets the pause value (how long to pause before an image is changed)  in the `PETSCVIEWERDRAW` `PetscViewer`
5865c6c1daeSBarry Smith 
5875c6c1daeSBarry Smith   Not Collective
5885c6c1daeSBarry Smith 
5895c6c1daeSBarry Smith   Input Parameter:
590811af0c4SBarry Smith . viewer - the `PetscViewer`
5915c6c1daeSBarry Smith 
5925c6c1daeSBarry Smith   Output Parameter:
5935c6c1daeSBarry Smith . pause - the pause value
5945c6c1daeSBarry Smith 
5955c6c1daeSBarry Smith   Level: intermediate
5965c6c1daeSBarry Smith 
597d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`,
5985c6c1daeSBarry Smith @*/
599d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawGetPause(PetscViewer viewer, PetscReal *pause)
600d71ae5a4SJacob Faibussowitsch {
6015c6c1daeSBarry Smith   PetscViewer_Draw *vdraw;
602e5ab1681SLisandro Dalcin   PetscBool         isdraw;
603e5ab1681SLisandro Dalcin   PetscInt          i;
6045c6c1daeSBarry Smith   PetscDraw         draw;
6055c6c1daeSBarry Smith 
6065c6c1daeSBarry Smith   PetscFunctionBegin;
607e5ab1681SLisandro Dalcin   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
6089566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
6099371c9d4SSatish Balay   if (!isdraw) {
6109371c9d4SSatish Balay     *pause = 0.0;
6113ba16761SJacob Faibussowitsch     PetscFunctionReturn(PETSC_SUCCESS);
6129371c9d4SSatish Balay   }
6135c6c1daeSBarry Smith   vdraw = (PetscViewer_Draw *)viewer->data;
614e5ab1681SLisandro Dalcin 
6155c6c1daeSBarry Smith   for (i = 0; i < vdraw->draw_max; i++) {
6165c6c1daeSBarry Smith     if (vdraw->draw[i]) {
6179566063dSJacob Faibussowitsch       PetscCall(PetscDrawGetPause(vdraw->draw[i], pause));
6183ba16761SJacob Faibussowitsch       PetscFunctionReturn(PETSC_SUCCESS);
6195c6c1daeSBarry Smith     }
6205c6c1daeSBarry Smith   }
6215c6c1daeSBarry Smith   /* none exist yet so create one and get its pause */
6229566063dSJacob Faibussowitsch   PetscCall(PetscViewerDrawGetDraw(viewer, 0, &draw));
6239566063dSJacob Faibussowitsch   PetscCall(PetscDrawGetPause(draw, pause));
6243ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
6255c6c1daeSBarry Smith }
6265c6c1daeSBarry Smith 
6275c6c1daeSBarry Smith /*@
628811af0c4SBarry Smith   PetscViewerDrawSetPause - Sets a pause for each `PetscDraw` in the `PETSCVIEWERDRAW` `PetscViewer`
6295c6c1daeSBarry Smith 
6305c6c1daeSBarry Smith   Not Collective
6315c6c1daeSBarry Smith 
6325c6c1daeSBarry Smith   Input Parameters:
633811af0c4SBarry Smith + viewer - the `PetscViewer`
6345c6c1daeSBarry Smith - pause  - the pause value
6355c6c1daeSBarry Smith 
6365c6c1daeSBarry Smith   Level: intermediate
6375c6c1daeSBarry Smith 
638d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`,
6395c6c1daeSBarry Smith @*/
640d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawSetPause(PetscViewer viewer, PetscReal pause)
641d71ae5a4SJacob Faibussowitsch {
642e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
6435c6c1daeSBarry Smith   PetscBool         isdraw;
644e5ab1681SLisandro Dalcin   PetscInt          i;
6455c6c1daeSBarry Smith 
6465c6c1daeSBarry Smith   PetscFunctionBegin;
647e5ab1681SLisandro Dalcin   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
6489566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
6493ba16761SJacob Faibussowitsch   if (!isdraw) PetscFunctionReturn(PETSC_SUCCESS);
650e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)viewer->data;
651afe78b3cSBarry Smith 
652afe78b3cSBarry Smith   vdraw->pause = pause;
6535c6c1daeSBarry Smith   for (i = 0; i < vdraw->draw_max; i++) {
6549566063dSJacob Faibussowitsch     if (vdraw->draw[i]) PetscCall(PetscDrawSetPause(vdraw->draw[i], pause));
6555c6c1daeSBarry Smith   }
6563ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
6575c6c1daeSBarry Smith }
6585c6c1daeSBarry Smith 
6595c6c1daeSBarry Smith /*@
660c410d8ccSBarry Smith   PetscViewerDrawSetHold - Holds previous image when drawing new image in a `PETSCVIEWERDRAW`
6615c6c1daeSBarry Smith 
6625c6c1daeSBarry Smith   Not Collective
6635c6c1daeSBarry Smith 
6645c6c1daeSBarry Smith   Input Parameters:
665811af0c4SBarry Smith + viewer - the `PetscViewer`
666811af0c4SBarry Smith - hold   - `PETSC_TRUE` indicates to hold the previous image
6675c6c1daeSBarry Smith 
6685c6c1daeSBarry Smith   Level: intermediate
6695c6c1daeSBarry Smith 
670d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`,
6715c6c1daeSBarry Smith @*/
672d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawSetHold(PetscViewer viewer, PetscBool hold)
673d71ae5a4SJacob Faibussowitsch {
6745c6c1daeSBarry Smith   PetscViewer_Draw *vdraw;
6755c6c1daeSBarry Smith   PetscBool         isdraw;
6765c6c1daeSBarry Smith 
6775c6c1daeSBarry Smith   PetscFunctionBegin;
678e5ab1681SLisandro Dalcin   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
6799566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
6803ba16761SJacob Faibussowitsch   if (!isdraw) PetscFunctionReturn(PETSC_SUCCESS);
6815c6c1daeSBarry Smith   vdraw = (PetscViewer_Draw *)viewer->data;
682e5ab1681SLisandro Dalcin 
6835c6c1daeSBarry Smith   vdraw->hold = hold;
6843ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
6855c6c1daeSBarry Smith }
6865c6c1daeSBarry Smith 
6875c6c1daeSBarry Smith /*@
688811af0c4SBarry Smith   PetscViewerDrawGetHold - Checks if the `PETSCVIEWERDRAW` `PetscViewer` holds previous image when drawing new image
6895c6c1daeSBarry Smith 
6905c6c1daeSBarry Smith   Not Collective
6915c6c1daeSBarry Smith 
6925c6c1daeSBarry Smith   Input Parameter:
693811af0c4SBarry Smith . viewer - the `PetscViewer`
6945c6c1daeSBarry Smith 
6955c6c1daeSBarry Smith   Output Parameter:
6965c6c1daeSBarry Smith . hold - indicates to hold or not
6975c6c1daeSBarry Smith 
6985c6c1daeSBarry Smith   Level: intermediate
6995c6c1daeSBarry Smith 
700d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`,
7015c6c1daeSBarry Smith @*/
702d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawGetHold(PetscViewer viewer, PetscBool *hold)
703d71ae5a4SJacob Faibussowitsch {
7045c6c1daeSBarry Smith   PetscViewer_Draw *vdraw;
7055c6c1daeSBarry Smith   PetscBool         isdraw;
7065c6c1daeSBarry Smith 
7075c6c1daeSBarry Smith   PetscFunctionBegin;
708e5ab1681SLisandro Dalcin   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
7099566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
7109371c9d4SSatish Balay   if (!isdraw) {
7119371c9d4SSatish Balay     *hold = PETSC_FALSE;
7123ba16761SJacob Faibussowitsch     PetscFunctionReturn(PETSC_SUCCESS);
7139371c9d4SSatish Balay   }
7145c6c1daeSBarry Smith   vdraw = (PetscViewer_Draw *)viewer->data;
715e5ab1681SLisandro Dalcin 
7165c6c1daeSBarry Smith   *hold = vdraw->hold;
7173ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
7185c6c1daeSBarry Smith }
7195c6c1daeSBarry Smith 
7205c6c1daeSBarry Smith /*
7215c6c1daeSBarry Smith     The variable Petsc_Viewer_Draw_keyval is used to indicate an MPI attribute that
7225c6c1daeSBarry Smith   is attached to a communicator, in this case the attribute is a PetscViewer.
7235c6c1daeSBarry Smith */
724d4c7638eSBarry Smith PetscMPIInt Petsc_Viewer_Draw_keyval = MPI_KEYVAL_INVALID;
7255c6c1daeSBarry Smith 
7265c6c1daeSBarry Smith /*@C
727811af0c4SBarry Smith     PETSC_VIEWER_DRAW_ - Creates a window `PETSCVIEWERDRAW` `PetscViewer` shared by all processors
728c410d8ccSBarry Smith                      in an MPI communicator.
7295c6c1daeSBarry Smith 
730d083f849SBarry Smith      Collective
7315c6c1daeSBarry Smith 
7325c6c1daeSBarry Smith      Input Parameter:
733811af0c4SBarry Smith .    comm - the MPI communicator to share the window `PetscViewer`
7345c6c1daeSBarry Smith 
7355c6c1daeSBarry Smith      Level: intermediate
7365c6c1daeSBarry Smith 
73734fa283eSBarry Smith      Notes:
73834fa283eSBarry Smith      This object is destroyed in `PetscFinalize()`, `PetscViewerDestroy()` should never be called on it
73934fa283eSBarry Smith 
740811af0c4SBarry Smith      Unlike almost all other PETSc routines, `PETSC_VIEWER_DRAW_()` does not return
7415c6c1daeSBarry Smith      an error code.  The window is usually used in the form
7425c6c1daeSBarry Smith $       XXXView(XXX object, PETSC_VIEWER_DRAW_(comm));
7435c6c1daeSBarry Smith 
744d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscViewer`, `PETSC_VIEWER_DRAW_WORLD`, `PETSC_VIEWER_DRAW_SELF`, `PetscViewerDrawOpen()`,
7455c6c1daeSBarry Smith @*/
746d71ae5a4SJacob Faibussowitsch PetscViewer PETSC_VIEWER_DRAW_(MPI_Comm comm)
747d71ae5a4SJacob Faibussowitsch {
748*648c30bcSBarry Smith   PetscMPIInt flag;
7495c6c1daeSBarry Smith   PetscViewer viewer;
7505c6c1daeSBarry Smith   MPI_Comm    ncomm;
7515c6c1daeSBarry Smith 
7525c6c1daeSBarry Smith   PetscFunctionBegin;
753*648c30bcSBarry Smith   PetscCallNull(PetscCommDuplicate(comm, &ncomm, NULL));
754*648c30bcSBarry Smith   if (Petsc_Viewer_Draw_keyval == MPI_KEYVAL_INVALID) { PetscCallMPINull(MPI_Comm_create_keyval(MPI_COMM_NULL_COPY_FN, MPI_COMM_NULL_DELETE_FN, &Petsc_Viewer_Draw_keyval, NULL)); }
755*648c30bcSBarry Smith   PetscCallMPINull(MPI_Comm_get_attr(ncomm, Petsc_Viewer_Draw_keyval, (void **)&viewer, &flag));
7565c6c1daeSBarry Smith   if (!flag) { /* PetscViewer not yet created */
757*648c30bcSBarry Smith     PetscCallNull(PetscViewerDrawOpen(ncomm, NULL, NULL, PETSC_DECIDE, PETSC_DECIDE, 300, 300, &viewer));
758*648c30bcSBarry Smith     PetscCallNull(PetscObjectRegisterDestroy((PetscObject)viewer));
759*648c30bcSBarry Smith     PetscCallMPINull(MPI_Comm_set_attr(ncomm, Petsc_Viewer_Draw_keyval, (void *)viewer));
7609371c9d4SSatish Balay   }
761*648c30bcSBarry Smith   PetscCallNull(PetscCommDestroy(&ncomm));
7625c6c1daeSBarry Smith   PetscFunctionReturn(viewer);
7635c6c1daeSBarry Smith }
7645c6c1daeSBarry Smith 
7655c6c1daeSBarry Smith /*@
766c410d8ccSBarry Smith   PetscViewerDrawSetBounds - sets the upper and lower bounds to be used in plotting in a `PETSCVIEWERDRAW` `PetscViewer`
7675c6c1daeSBarry Smith 
768c3339decSBarry Smith   Collective
7695c6c1daeSBarry Smith 
7705c6c1daeSBarry Smith   Input Parameters:
771811af0c4SBarry Smith + viewer  - the Petsc`Viewer` (created with `PetscViewerDrawOpen()`)
772811af0c4SBarry Smith . nbounds - number of plots that can be made with this viewer, for example the dof passed to `DMDACreate()`
773c410d8ccSBarry Smith - bounds  - the actual bounds, the size of this is 2*`nbounds`, the values are stored in the order min F_0, max F_0, min F_1, max F_1, .....
7745c6c1daeSBarry Smith 
775811af0c4SBarry Smith   Options Database Key:
77610699b91SBarry Smith . -draw_bounds  minF0,maxF0,minF1,maxF1 - the lower left and upper right bounds
777e9457bf7SBarry Smith 
7785c6c1daeSBarry Smith   Level: intermediate
7795c6c1daeSBarry Smith 
780811af0c4SBarry Smith   Note:
781811af0c4SBarry Smith   this determines the colors used in 2d contour plots generated with VecView() for `DMDA` in 2d. Any values in the vector below or above the
782f3f0eb19SBarry Smith   bounds are moved to the bound value before plotting. In this way the color index from color to physical value remains the same for all plots generated with
783f3f0eb19SBarry Smith   this viewer. Otherwise the color to physical value meaning changes with each new image if this is not set.
784f3f0eb19SBarry Smith 
785d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscViewerDrawGetLG()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()`
7865c6c1daeSBarry Smith @*/
787d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawSetBounds(PetscViewer viewer, PetscInt nbounds, const PetscReal *bounds)
788d71ae5a4SJacob Faibussowitsch {
789e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
790e5ab1681SLisandro Dalcin   PetscBool         isdraw;
7915c6c1daeSBarry Smith 
7925c6c1daeSBarry Smith   PetscFunctionBegin;
7935c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
7949566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
7953ba16761SJacob Faibussowitsch   if (!isdraw) PetscFunctionReturn(PETSC_SUCCESS);
796e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)viewer->data;
797a297a907SKarl Rupp 
798e5ab1681SLisandro Dalcin   vdraw->nbounds = nbounds;
7999566063dSJacob Faibussowitsch   PetscCall(PetscFree(vdraw->bounds));
8009566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(2 * nbounds, &vdraw->bounds));
8019566063dSJacob Faibussowitsch   PetscCall(PetscArraycpy(vdraw->bounds, bounds, 2 * nbounds));
8023ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
8035c6c1daeSBarry Smith }
8045c6c1daeSBarry Smith 
8055c6c1daeSBarry Smith /*@C
806811af0c4SBarry Smith   PetscViewerDrawGetBounds - gets the upper and lower bounds to be used in plotting set with `PetscViewerDrawSetBounds()`
8075c6c1daeSBarry Smith 
808c3339decSBarry Smith   Collective
8095c6c1daeSBarry Smith 
8105c6c1daeSBarry Smith   Input Parameter:
811811af0c4SBarry Smith . viewer - the `PetscViewer` (created with `PetscViewerDrawOpen()`)
8125c6c1daeSBarry Smith 
813fd292e60Sprj-   Output Parameters:
814811af0c4SBarry Smith + nbounds - number of plots that can be made with this viewer, for example the dof passed to `DMDACreate()`
815c410d8ccSBarry Smith - bounds  - the actual bounds, the size of this is 2*`nbounds`, the values are stored in the order min F_0, max F_0, min F_1, max F_1, .....
8165c6c1daeSBarry Smith 
8175c6c1daeSBarry Smith   Level: intermediate
8185c6c1daeSBarry Smith 
819d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscViewerDrawGetLG()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()`, `PetscViewerDrawSetBounds()`
8205c6c1daeSBarry Smith @*/
821cc4c1da9SBarry Smith PetscErrorCode PetscViewerDrawGetBounds(PetscViewer viewer, PetscInt *nbounds, const PetscReal *bounds[])
822d71ae5a4SJacob Faibussowitsch {
823e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
824e5ab1681SLisandro Dalcin   PetscBool         isdraw;
8255c6c1daeSBarry Smith 
8265c6c1daeSBarry Smith   PetscFunctionBegin;
8275c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
8289566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
8299371c9d4SSatish Balay   if (!isdraw) {
8309371c9d4SSatish Balay     if (nbounds) *nbounds = 0;
8319371c9d4SSatish Balay     if (bounds) *bounds = NULL;
8323ba16761SJacob Faibussowitsch     PetscFunctionReturn(PETSC_SUCCESS);
8339371c9d4SSatish Balay   }
834e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)viewer->data;
835e5ab1681SLisandro Dalcin 
836e5ab1681SLisandro Dalcin   if (nbounds) *nbounds = vdraw->nbounds;
837e5ab1681SLisandro Dalcin   if (bounds) *bounds = vdraw->bounds;
8383ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
8395c6c1daeSBarry Smith }
840