xref: /petsc/src/sys/classes/viewer/impls/draw/drawv.c (revision 811af0c4b09a35de4306c442f88bd09fdc09897d)
15c6c1daeSBarry Smith 
25c6c1daeSBarry Smith #include <../src/sys/classes/viewer/impls/draw/vdraw.h> /*I "petscdraw.h" I*/
3665c2dedSJed Brown #include <petscviewer.h>                                /*I "petscviewer.h" I*/
45c6c1daeSBarry Smith 
59371c9d4SSatish Balay static PetscErrorCode PetscViewerDestroy_Draw(PetscViewer v) {
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));
225c6c1daeSBarry Smith   PetscFunctionReturn(0);
235c6c1daeSBarry Smith }
245c6c1daeSBarry Smith 
259371c9d4SSatish Balay static PetscErrorCode PetscViewerFlush_Draw(PetscViewer v) {
265c6c1daeSBarry Smith   PetscInt          i;
275c6c1daeSBarry Smith   PetscViewer_Draw *vdraw = (PetscViewer_Draw *)v->data;
285c6c1daeSBarry Smith 
295c6c1daeSBarry Smith   PetscFunctionBegin;
305c6c1daeSBarry Smith   for (i = 0; i < vdraw->draw_max; i++) {
319566063dSJacob Faibussowitsch     if (vdraw->draw[i]) PetscCall(PetscDrawFlush(vdraw->draw[i]));
325c6c1daeSBarry Smith   }
335c6c1daeSBarry Smith   PetscFunctionReturn(0);
345c6c1daeSBarry Smith }
355c6c1daeSBarry Smith 
365c6c1daeSBarry Smith /*@C
37*811af0c4SBarry Smith     PetscViewerDrawGetDraw - Returns `PetscDraw` object from `PetscViewer` object.
38*811af0c4SBarry Smith     This `PetscDraw` object may then be used to perform graphics using
39*811af0c4SBarry Smith     `PetscDraw` commands.
405c6c1daeSBarry Smith 
41*811af0c4SBarry Smith     Collective on viewer
425c6c1daeSBarry Smith 
435c6c1daeSBarry Smith     Input Parameters:
44*811af0c4SBarry Smith +   viewer - the `PetscViewer` (created with `PetscViewerDrawOpen()` of type `PETSCVIEWERDRAW`)
455c6c1daeSBarry Smith -   windownumber - indicates which subwindow (usually 0)
465c6c1daeSBarry Smith 
4701d2d390SJose E. Roman     Output Parameter:
485c6c1daeSBarry Smith .   draw - the draw object
495c6c1daeSBarry Smith 
505c6c1daeSBarry Smith     Level: intermediate
515c6c1daeSBarry Smith 
52*811af0c4SBarry Smith .seealso: `PETSCVIEWERDRAW`, `PetscViewerDrawGetLG()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()`
535c6c1daeSBarry Smith @*/
549371c9d4SSatish Balay PetscErrorCode PetscViewerDrawGetDraw(PetscViewer viewer, PetscInt windownumber, PetscDraw *draw) {
55e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
565c6c1daeSBarry Smith   PetscBool         isdraw;
575c6c1daeSBarry Smith 
585c6c1daeSBarry Smith   PetscFunctionBegin;
595c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
60e5ab1681SLisandro Dalcin   PetscValidLogicalCollectiveInt(viewer, windownumber, 2);
615c6c1daeSBarry Smith   if (draw) PetscValidPointer(draw, 3);
629566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
6328b400f6SJacob Faibussowitsch   PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer");
6408401ef6SPierre Jolivet   PetscCheck(windownumber >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Window number cannot be negative");
65e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)viewer->data;
66e5ab1681SLisandro Dalcin 
675c6c1daeSBarry Smith   windownumber += vdraw->draw_base;
685c6c1daeSBarry Smith   if (windownumber >= vdraw->draw_max) {
695c6c1daeSBarry Smith     /* allocate twice as many slots as needed */
705c6c1daeSBarry Smith     PetscInt       draw_max = vdraw->draw_max;
715c6c1daeSBarry Smith     PetscDraw     *tdraw    = vdraw->draw;
725c6c1daeSBarry Smith     PetscDrawLG   *drawlg   = vdraw->drawlg;
735c6c1daeSBarry Smith     PetscDrawAxis *drawaxis = vdraw->drawaxis;
745c6c1daeSBarry Smith 
755c6c1daeSBarry Smith     vdraw->draw_max = 2 * windownumber;
76a297a907SKarl Rupp 
779566063dSJacob Faibussowitsch     PetscCall(PetscCalloc3(vdraw->draw_max, &vdraw->draw, vdraw->draw_max, &vdraw->drawlg, vdraw->draw_max, &vdraw->drawaxis));
789566063dSJacob Faibussowitsch     PetscCall(PetscArraycpy(vdraw->draw, tdraw, draw_max));
799566063dSJacob Faibussowitsch     PetscCall(PetscArraycpy(vdraw->drawlg, drawlg, draw_max));
809566063dSJacob Faibussowitsch     PetscCall(PetscArraycpy(vdraw->drawaxis, drawaxis, draw_max));
819566063dSJacob Faibussowitsch     PetscCall(PetscFree3(tdraw, drawlg, drawaxis));
825c6c1daeSBarry Smith   }
835c6c1daeSBarry Smith 
845c6c1daeSBarry Smith   if (!vdraw->draw[windownumber]) {
85e5ab1681SLisandro Dalcin     char *title = vdraw->title, tmp_str[128];
8610f3a0f4SLisandro Dalcin     if (windownumber) {
879566063dSJacob Faibussowitsch       PetscCall(PetscSNPrintf(tmp_str, sizeof(tmp_str), "%s:%" PetscInt_FMT, vdraw->title ? vdraw->title : "", windownumber));
885c6c1daeSBarry Smith       title = tmp_str;
895c6c1daeSBarry Smith     }
909566063dSJacob Faibussowitsch     PetscCall(PetscDrawCreate(PetscObjectComm((PetscObject)viewer), vdraw->display, title, PETSC_DECIDE, PETSC_DECIDE, vdraw->w, vdraw->h, &vdraw->draw[windownumber]));
919566063dSJacob Faibussowitsch     PetscCall(PetscLogObjectParent((PetscObject)viewer, (PetscObject)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);
995c6c1daeSBarry Smith   PetscFunctionReturn(0);
1005c6c1daeSBarry Smith }
1015c6c1daeSBarry Smith 
1025c6c1daeSBarry Smith /*@C
103*811af0c4SBarry Smith     PetscViewerDrawBaseAdd - add to the base integer that is added to the windownumber passed to `PetscViewerDrawGetDraw()`
1045c6c1daeSBarry Smith 
105*811af0c4SBarry Smith     Logically Collective on viewer
1065c6c1daeSBarry Smith 
1075c6c1daeSBarry Smith     Input Parameters:
108*811af0c4SBarry 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 
113*811af0c4SBarry Smith     Note:
114*811af0c4SBarry Smith     A `PETSCVIEWERDRAW` may have multiple `PetscDraw` subwindows, this increases the number of the subwindow that is returned with `PetscViewerDrawGetDraw()`
115*811af0c4SBarry Smith 
116db781477SPatrick Sanan .seealso: `PetscViewerDrawGetLG()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`, `PetscViewerDrawBaseSet()`
1175c6c1daeSBarry Smith @*/
1189371c9d4SSatish Balay PetscErrorCode PetscViewerDrawBaseAdd(PetscViewer viewer, PetscInt windownumber) {
119e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
1205c6c1daeSBarry Smith   PetscBool         isdraw;
1215c6c1daeSBarry Smith 
1225c6c1daeSBarry Smith   PetscFunctionBegin;
1235c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
124e5ab1681SLisandro Dalcin   PetscValidLogicalCollectiveInt(viewer, windownumber, 2);
1259566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
12628b400f6SJacob Faibussowitsch   PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer");
127e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)viewer->data;
128e5ab1681SLisandro Dalcin 
129cc73adaaSBarry 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);
1305c6c1daeSBarry Smith   vdraw->draw_base += windownumber;
1315c6c1daeSBarry Smith   PetscFunctionReturn(0);
1325c6c1daeSBarry Smith }
1335c6c1daeSBarry Smith 
1345c6c1daeSBarry Smith /*@C
135*811af0c4SBarry Smith     PetscViewerDrawBaseSet - sets the base integer that is added to the windownumber passed to `PetscViewerDrawGetDraw()`
1365c6c1daeSBarry Smith 
137*811af0c4SBarry Smith     Logically Collective on viewer
1385c6c1daeSBarry Smith 
1395c6c1daeSBarry Smith     Input Parameters:
140*811af0c4SBarry Smith +   viewer - the `PetscViewer` (created with `PetscViewerDrawOpen()`)
1415c6c1daeSBarry Smith -   windownumber - value to set the base
1425c6c1daeSBarry Smith 
1435c6c1daeSBarry Smith     Level: developer
1445c6c1daeSBarry Smith 
145*811af0c4SBarry Smith     Note:
146*811af0c4SBarry Smith     A `PETSCVIEWERDRAW` may have multiple `PetscDraw` subwindows, this increases the number of the subwindow that is returned with `PetscViewerDrawGetDraw()`
147*811af0c4SBarry Smith 
148db781477SPatrick Sanan .seealso: `PetscViewerDrawGetLG()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`, `PetscViewerDrawBaseAdd()`
1495c6c1daeSBarry Smith @*/
1509371c9d4SSatish Balay PetscErrorCode PetscViewerDrawBaseSet(PetscViewer viewer, PetscInt windownumber) {
151e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
1525c6c1daeSBarry Smith   PetscBool         isdraw;
1535c6c1daeSBarry Smith 
1545c6c1daeSBarry Smith   PetscFunctionBegin;
1555c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
156e5ab1681SLisandro Dalcin   PetscValidLogicalCollectiveInt(viewer, windownumber, 2);
1579566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
15828b400f6SJacob Faibussowitsch   PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer");
159e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)viewer->data;
160e5ab1681SLisandro Dalcin 
16108401ef6SPierre Jolivet   PetscCheck(windownumber >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Resulting base %" PetscInt_FMT " cannot be negative", windownumber);
1625c6c1daeSBarry Smith   vdraw->draw_base = windownumber;
1635c6c1daeSBarry Smith   PetscFunctionReturn(0);
1645c6c1daeSBarry Smith }
1655c6c1daeSBarry Smith 
1665c6c1daeSBarry Smith /*@C
167*811af0c4SBarry Smith     PetscViewerDrawGetDrawLG - Returns a `PetscDrawLG` object from `PetscViewer` object of type `PETSCVIEWERDRAW`.
168*811af0c4SBarry Smith     This `PetscDrawLG` object may then be used to perform graphics using `PetscDrawLG` commands.
1695c6c1daeSBarry Smith 
170*811af0c4SBarry Smith     Collective on viewer
1715c6c1daeSBarry Smith 
172d8d19677SJose E. Roman     Input Parameters:
173*811af0c4SBarry Smith +   PetscViewer - the `PetscViewer` (created with `PetscViewerDrawOpen()`)
1745c6c1daeSBarry Smith -   windownumber - indicates which subwindow (usually 0)
1755c6c1daeSBarry Smith 
17601d2d390SJose E. Roman     Output Parameter:
1775c6c1daeSBarry Smith .   draw - the draw line graph object
1785c6c1daeSBarry Smith 
1795c6c1daeSBarry Smith     Level: intermediate
1805c6c1daeSBarry Smith 
181*811af0c4SBarry Smith     Note:
182*811af0c4SBarry Smith     A `PETSCVIEWERDRAW` may have multiple `PetscDraw` subwindows
183*811af0c4SBarry Smith 
184*811af0c4SBarry Smith .seealso: `PetscDrawLG`, `PetscViewerDrawGetDraw()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()`
1855c6c1daeSBarry Smith @*/
1869371c9d4SSatish Balay PetscErrorCode PetscViewerDrawGetDrawLG(PetscViewer viewer, PetscInt windownumber, PetscDrawLG *drawlg) {
1875c6c1daeSBarry Smith   PetscBool         isdraw;
188e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
1895c6c1daeSBarry Smith 
1905c6c1daeSBarry Smith   PetscFunctionBegin;
1915c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
192e5ab1681SLisandro Dalcin   PetscValidLogicalCollectiveInt(viewer, windownumber, 2);
1935c6c1daeSBarry Smith   PetscValidPointer(drawlg, 3);
1949566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
19528b400f6SJacob Faibussowitsch   PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer");
19608401ef6SPierre Jolivet   PetscCheck(windownumber >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Window number cannot be negative");
197e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)viewer->data;
1985c6c1daeSBarry Smith 
19948a46eb9SPierre Jolivet   if (windownumber + vdraw->draw_base >= vdraw->draw_max || !vdraw->draw[windownumber + vdraw->draw_base]) PetscCall(PetscViewerDrawGetDraw(viewer, windownumber, NULL));
2005c6c1daeSBarry Smith   if (!vdraw->drawlg[windownumber + vdraw->draw_base]) {
2019566063dSJacob Faibussowitsch     PetscCall(PetscDrawLGCreate(vdraw->draw[windownumber + vdraw->draw_base], 1, &vdraw->drawlg[windownumber + vdraw->draw_base]));
2029566063dSJacob Faibussowitsch     PetscCall(PetscLogObjectParent((PetscObject)viewer, (PetscObject)vdraw->drawlg[windownumber + vdraw->draw_base]));
2039566063dSJacob Faibussowitsch     PetscCall(PetscDrawLGSetFromOptions(vdraw->drawlg[windownumber + vdraw->draw_base]));
2045c6c1daeSBarry Smith   }
2055c6c1daeSBarry Smith   *drawlg = vdraw->drawlg[windownumber + vdraw->draw_base];
2065c6c1daeSBarry Smith   PetscFunctionReturn(0);
2075c6c1daeSBarry Smith }
2085c6c1daeSBarry Smith 
2095c6c1daeSBarry Smith /*@C
210*811af0c4SBarry Smith     PetscViewerDrawGetDrawAxis - Returns a `PetscDrawAxis` object from a `PetscViewer` object of type `PETSCVIEWERDRAW`.
211*811af0c4SBarry Smith     This `PetscDrawAxis` object may then be used to perform graphics using `PetscDrawAxis` commands.
2125c6c1daeSBarry Smith 
213*811af0c4SBarry Smith     Collective on viewer
2145c6c1daeSBarry Smith 
215d8d19677SJose E. Roman     Input Parameters:
216*811af0c4SBarry Smith +   viewer - the `PetscViewer` (created with `PetscViewerDrawOpen()`)
2175c6c1daeSBarry Smith -   windownumber - indicates which subwindow (usually 0)
2185c6c1daeSBarry Smith 
21901d2d390SJose E. Roman     Output Parameter:
2205c6c1daeSBarry Smith .   drawaxis - the draw axis object
2215c6c1daeSBarry Smith 
2225c6c1daeSBarry Smith     Level: advanced
2235c6c1daeSBarry Smith 
224*811af0c4SBarry Smith     Note:
225*811af0c4SBarry Smith     A `PETSCVIEWERDRAW` may have multiple `PetscDraw` subwindows
226*811af0c4SBarry Smith 
227db781477SPatrick Sanan .seealso: `PetscViewerDrawGetDraw()`, `PetscViewerDrawGetLG()`, `PetscViewerDrawOpen()`
2285c6c1daeSBarry Smith @*/
2299371c9d4SSatish Balay PetscErrorCode PetscViewerDrawGetDrawAxis(PetscViewer viewer, PetscInt windownumber, PetscDrawAxis *drawaxis) {
2305c6c1daeSBarry Smith   PetscBool         isdraw;
231e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
2325c6c1daeSBarry Smith 
2335c6c1daeSBarry Smith   PetscFunctionBegin;
2345c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
235e5ab1681SLisandro Dalcin   PetscValidLogicalCollectiveInt(viewer, windownumber, 2);
2365c6c1daeSBarry Smith   PetscValidPointer(drawaxis, 3);
2379566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
23828b400f6SJacob Faibussowitsch   PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer");
23908401ef6SPierre Jolivet   PetscCheck(windownumber >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Window number cannot be negative");
240e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)viewer->data;
2415c6c1daeSBarry Smith 
24248a46eb9SPierre Jolivet   if (windownumber + vdraw->draw_base >= vdraw->draw_max || !vdraw->draw[windownumber + vdraw->draw_base]) PetscCall(PetscViewerDrawGetDraw(viewer, windownumber, NULL));
2435c6c1daeSBarry Smith   if (!vdraw->drawaxis[windownumber + vdraw->draw_base]) {
2449566063dSJacob Faibussowitsch     PetscCall(PetscDrawAxisCreate(vdraw->draw[windownumber + vdraw->draw_base], &vdraw->drawaxis[windownumber + vdraw->draw_base]));
2459566063dSJacob Faibussowitsch     PetscCall(PetscLogObjectParent((PetscObject)viewer, (PetscObject)vdraw->drawaxis[windownumber + vdraw->draw_base]));
2465c6c1daeSBarry Smith   }
2475c6c1daeSBarry Smith   *drawaxis = vdraw->drawaxis[windownumber + vdraw->draw_base];
2485c6c1daeSBarry Smith   PetscFunctionReturn(0);
2495c6c1daeSBarry Smith }
2505c6c1daeSBarry Smith 
2519371c9d4SSatish Balay PetscErrorCode PetscViewerDrawResize(PetscViewer v, int w, int h) {
252e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
253e5ab1681SLisandro Dalcin   PetscBool         isdraw;
2545c6c1daeSBarry Smith 
2555c6c1daeSBarry Smith   PetscFunctionBegin;
256e5ab1681SLisandro Dalcin   PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1);
2579566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw));
258e5ab1681SLisandro Dalcin   if (!isdraw) PetscFunctionReturn(0);
259e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)v->data;
260e5ab1681SLisandro Dalcin 
261e5ab1681SLisandro Dalcin   if (w >= 1) vdraw->w = w;
262e5ab1681SLisandro Dalcin   if (h >= 1) vdraw->h = h;
2635c6c1daeSBarry Smith   PetscFunctionReturn(0);
2645c6c1daeSBarry Smith }
2655c6c1daeSBarry Smith 
2669371c9d4SSatish Balay PetscErrorCode PetscViewerDrawSetInfo(PetscViewer v, const char display[], const char title[], int x, int y, int w, int h) {
267e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
268e5ab1681SLisandro Dalcin   PetscBool         isdraw;
2695c6c1daeSBarry Smith 
2705c6c1daeSBarry Smith   PetscFunctionBegin;
271e5ab1681SLisandro Dalcin   PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1);
2729566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw));
273e5ab1681SLisandro Dalcin   if (!isdraw) PetscFunctionReturn(0);
274e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)v->data;
275e5ab1681SLisandro Dalcin 
2769566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(display, &vdraw->display));
2779566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(title, &vdraw->title));
278e5ab1681SLisandro Dalcin   if (w >= 1) vdraw->w = w;
279e5ab1681SLisandro Dalcin   if (h >= 1) vdraw->h = h;
2805c6c1daeSBarry Smith   PetscFunctionReturn(0);
2815c6c1daeSBarry Smith }
2825c6c1daeSBarry Smith 
2839371c9d4SSatish Balay PetscErrorCode PetscViewerDrawSetDrawType(PetscViewer v, PetscDrawType drawtype) {
284e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
285e5ab1681SLisandro Dalcin   PetscBool         isdraw;
286d1da0b69SBarry Smith 
287d1da0b69SBarry Smith   PetscFunctionBegin;
288e5ab1681SLisandro Dalcin   PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1);
2899566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw));
290e5ab1681SLisandro Dalcin   if (!isdraw) PetscFunctionReturn(0);
291e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)v->data;
292e5ab1681SLisandro Dalcin 
2939566063dSJacob Faibussowitsch   PetscCall(PetscFree(vdraw->drawtype));
2949566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(drawtype, (char **)&vdraw->drawtype));
295d1da0b69SBarry Smith   PetscFunctionReturn(0);
296d1da0b69SBarry Smith }
297d1da0b69SBarry Smith 
2989371c9d4SSatish Balay PetscErrorCode PetscViewerDrawGetDrawType(PetscViewer v, PetscDrawType *drawtype) {
2991f49e1f7SLisandro Dalcin   PetscViewer_Draw *vdraw;
3001f49e1f7SLisandro Dalcin   PetscBool         isdraw;
3011f49e1f7SLisandro Dalcin 
3021f49e1f7SLisandro Dalcin   PetscFunctionBegin;
3031f49e1f7SLisandro Dalcin   PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1);
3049566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw));
30528b400f6SJacob Faibussowitsch   PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer");
3061f49e1f7SLisandro Dalcin   vdraw = (PetscViewer_Draw *)v->data;
3071f49e1f7SLisandro Dalcin 
3081f49e1f7SLisandro Dalcin   *drawtype = vdraw->drawtype;
3091f49e1f7SLisandro Dalcin   PetscFunctionReturn(0);
3101f49e1f7SLisandro Dalcin }
3111f49e1f7SLisandro Dalcin 
3129371c9d4SSatish Balay PetscErrorCode PetscViewerDrawSetTitle(PetscViewer v, const char title[]) {
313f55236e4SLisandro Dalcin   PetscViewer_Draw *vdraw;
314f55236e4SLisandro Dalcin   PetscBool         isdraw;
315f55236e4SLisandro Dalcin 
316f55236e4SLisandro Dalcin   PetscFunctionBegin;
317f55236e4SLisandro Dalcin   PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1);
3189566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw));
319f55236e4SLisandro Dalcin   if (!isdraw) PetscFunctionReturn(0);
320f55236e4SLisandro Dalcin   vdraw = (PetscViewer_Draw *)v->data;
321f55236e4SLisandro Dalcin 
3229566063dSJacob Faibussowitsch   PetscCall(PetscFree(vdraw->title));
3239566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(title, &vdraw->title));
324f55236e4SLisandro Dalcin   PetscFunctionReturn(0);
325f55236e4SLisandro Dalcin }
326f55236e4SLisandro Dalcin 
3279371c9d4SSatish Balay PetscErrorCode PetscViewerDrawGetTitle(PetscViewer v, const char *title[]) {
328f55236e4SLisandro Dalcin   PetscViewer_Draw *vdraw;
329f55236e4SLisandro Dalcin   PetscBool         isdraw;
330f55236e4SLisandro Dalcin 
331f55236e4SLisandro Dalcin   PetscFunctionBegin;
332f55236e4SLisandro Dalcin   PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1);
3339566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw));
33428b400f6SJacob Faibussowitsch   PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer");
335f55236e4SLisandro Dalcin   vdraw = (PetscViewer_Draw *)v->data;
336f55236e4SLisandro Dalcin 
337f55236e4SLisandro Dalcin   *title = vdraw->title;
338f55236e4SLisandro Dalcin   PetscFunctionReturn(0);
339f55236e4SLisandro Dalcin }
340f55236e4SLisandro Dalcin 
3415c6c1daeSBarry Smith /*@C
342*811af0c4SBarry Smith    PetscViewerDrawOpen - Opens a `PetscDraw` window for use as a `PetscViewer` with type `PETSCVIEWERDRAW`. If you want to
343*811af0c4SBarry Smith    do graphics in this window, you must call `PetscViewerDrawGetDraw()` and
344*811af0c4SBarry Smith    perform the graphics on the `PetscDraw` object.
3455c6c1daeSBarry Smith 
346d083f849SBarry Smith    Collective
3475c6c1daeSBarry Smith 
3485c6c1daeSBarry Smith    Input Parameters:
3495c6c1daeSBarry Smith +  comm - communicator that will share window
3505c6c1daeSBarry Smith .  display - the X display on which to open, or null for the local machine
3515c6c1daeSBarry Smith .  title - the title to put in the title bar, or null for no title
352*811af0c4SBarry Smith .  x, y - the screen coordinates of the upper left corner of window, or use `PETSC_DECIDE`
353*811af0c4SBarry Smith -  w, h - window width and height in pixels, or may use `PETSC_DECIDE` or `PETSC_DRAW_FULL_SIZE`, `PETSC_DRAW_HALF_SIZE`,
354*811af0c4SBarry Smith           `PETSC_DRAW_THIRD_SIZE`, `PETSC_DRAW_QUARTER_SIZE`
3555c6c1daeSBarry Smith 
356f899ff85SJose E. Roman    Output Parameter:
357*811af0c4SBarry Smith . viewer - the `PetscViewer`
3585c6c1daeSBarry Smith 
3595c6c1daeSBarry Smith    Format Options:
360*811af0c4SBarry Smith +  `PETSC_VIEWER_DRAW_BASIC` - displays with basic format
361*811af0c4SBarry Smith -  `PETSC_VIEWER_DRAW_LG`    - displays using a line graph
3625c6c1daeSBarry Smith 
3635c6c1daeSBarry Smith    Options Database Keys:
36410699b91SBarry Smith +  -draw_type - use x or null
3655c6c1daeSBarry Smith .  -nox - Disables all x-windows output
3665c6c1daeSBarry Smith .  -display <name> - Specifies name of machine for the X display
3675c6c1daeSBarry Smith .  -geometry <x,y,w,h> - allows setting the window location and size
3685c6c1daeSBarry Smith -  -draw_pause <pause> - Sets time (in seconds) that the
3695c6c1daeSBarry Smith      program pauses after PetscDrawPause() has been called
3705c6c1daeSBarry Smith      (0 is default, -1 implies until user input).
3715c6c1daeSBarry Smith 
3725c6c1daeSBarry Smith    Level: beginner
3735c6c1daeSBarry Smith 
3745c6c1daeSBarry Smith    Note for Fortran Programmers:
3755c6c1daeSBarry Smith    Whenever indicating null character data in a Fortran code,
376*811af0c4SBarry Smith    `PETSC_NULL_CHARACTER` must be employed; using NULL is not
377*811af0c4SBarry Smith    correct for character data!  Thus, `PETSC_NULL_CHARACTER` can be
3785c6c1daeSBarry Smith    used for the display and title input parameters.
3795c6c1daeSBarry Smith 
380*811af0c4SBarry Smith .seealso: `PETSCVIEWERDRAW`, `PetscDrawCreate()`, `PetscViewerDestroy()`, `PetscViewerDrawGetDraw()`, `PetscViewerCreate()`, `PETSC_VIEWER_DRAW_`,
381db781477SPatrick Sanan           `PETSC_VIEWER_DRAW_WORLD`, `PETSC_VIEWER_DRAW_SELF`
3825c6c1daeSBarry Smith @*/
3839371c9d4SSatish Balay PetscErrorCode PetscViewerDrawOpen(MPI_Comm comm, const char display[], const char title[], int x, int y, int w, int h, PetscViewer *viewer) {
3845c6c1daeSBarry Smith   PetscFunctionBegin;
3859566063dSJacob Faibussowitsch   PetscCall(PetscViewerCreate(comm, viewer));
3869566063dSJacob Faibussowitsch   PetscCall(PetscViewerSetType(*viewer, PETSCVIEWERDRAW));
3879566063dSJacob Faibussowitsch   PetscCall(PetscViewerDrawSetInfo(*viewer, display, title, x, y, w, h));
3885c6c1daeSBarry Smith   PetscFunctionReturn(0);
3895c6c1daeSBarry Smith }
3905c6c1daeSBarry Smith 
391a9db196aSBarry Smith #include <petsc/private/drawimpl.h>
392a9db196aSBarry Smith 
3939371c9d4SSatish Balay PetscErrorCode PetscViewerGetSubViewer_Draw(PetscViewer viewer, MPI_Comm comm, PetscViewer *sviewer) {
3945c6c1daeSBarry Smith   PetscMPIInt       rank;
3955c6c1daeSBarry Smith   PetscInt          i;
396c6228bbaSLisandro Dalcin   PetscViewer_Draw *vdraw = (PetscViewer_Draw *)viewer->data, *svdraw;
3975c6c1daeSBarry Smith 
3985c6c1daeSBarry Smith   PetscFunctionBegin;
39928b400f6SJacob Faibussowitsch   PetscCheck(!vdraw->singleton_made, PETSC_COMM_SELF, PETSC_ERR_ORDER, "Trying to get SubViewer without first restoring previous");
4005c6c1daeSBarry Smith   /* only processor zero can use the PetscViewer draw singleton */
401fefe69c3SStefano Zampini   if (sviewer) *sviewer = NULL;
4029566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)viewer), &rank));
403dd400576SPatrick Sanan   if (rank == 0) {
404e5afcf28SBarry Smith     PetscMPIInt flg;
405a9db196aSBarry Smith     PetscDraw   draw, sdraw;
406e5afcf28SBarry Smith 
4079566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_compare(PETSC_COMM_SELF, comm, &flg));
408cc73adaaSBarry Smith     PetscCheck(flg == MPI_IDENT || flg == MPI_CONGRUENT, PETSC_COMM_SELF, PETSC_ERR_SUP, "PetscViewerGetSubViewer() for PETSCVIEWERDRAW requires a singleton MPI_Comm");
4099566063dSJacob Faibussowitsch     PetscCall(PetscViewerCreate(comm, sviewer));
4109566063dSJacob Faibussowitsch     PetscCall(PetscViewerSetType(*sviewer, PETSCVIEWERDRAW));
411c6228bbaSLisandro Dalcin     svdraw             = (PetscViewer_Draw *)(*sviewer)->data;
412c6228bbaSLisandro Dalcin     (*sviewer)->format = viewer->format;
413c6228bbaSLisandro Dalcin     for (i = 0; i < vdraw->draw_max; i++) { /* XXX this is wrong if svdraw->draw_max (initially 5) < vdraw->draw_max */
4149566063dSJacob Faibussowitsch       if (vdraw->draw[i]) PetscCall(PetscDrawGetSingleton(vdraw->draw[i], &svdraw->draw[i]));
4155c6c1daeSBarry Smith     }
4169566063dSJacob Faibussowitsch     PetscCall(PetscViewerDrawGetDraw(viewer, 0, &draw));
4179566063dSJacob Faibussowitsch     PetscCall(PetscViewerDrawGetDraw(*sviewer, 0, &sdraw));
418a9db196aSBarry Smith     if (draw->savefilename) {
4199566063dSJacob Faibussowitsch       PetscCall(PetscDrawSetSave(sdraw, draw->savefilename));
420a9db196aSBarry Smith       sdraw->savefilecount  = draw->savefilecount;
421a9db196aSBarry Smith       sdraw->savesinglefile = draw->savesinglefile;
422a9db196aSBarry Smith       sdraw->savemoviefps   = draw->savemoviefps;
423a9db196aSBarry Smith       sdraw->saveonclear    = draw->saveonclear;
424a9db196aSBarry Smith       sdraw->saveonflush    = draw->saveonflush;
425a9db196aSBarry Smith     }
4269566063dSJacob Faibussowitsch     if (draw->savefinalfilename) PetscCall(PetscDrawSetSaveFinalImage(sdraw, draw->savefinalfilename));
427a9db196aSBarry Smith   } else {
428a9db196aSBarry Smith     PetscDraw draw;
4299566063dSJacob Faibussowitsch     PetscCall(PetscViewerDrawGetDraw(viewer, 0, &draw));
4305c6c1daeSBarry Smith   }
4315c6c1daeSBarry Smith   vdraw->singleton_made = PETSC_TRUE;
4325c6c1daeSBarry Smith   PetscFunctionReturn(0);
4335c6c1daeSBarry Smith }
4345c6c1daeSBarry Smith 
4359371c9d4SSatish Balay PetscErrorCode PetscViewerRestoreSubViewer_Draw(PetscViewer viewer, MPI_Comm comm, PetscViewer *sviewer) {
4365c6c1daeSBarry Smith   PetscMPIInt       rank;
4375c6c1daeSBarry Smith   PetscInt          i;
438c6228bbaSLisandro Dalcin   PetscViewer_Draw *vdraw = (PetscViewer_Draw *)viewer->data, *svdraw;
4395c6c1daeSBarry Smith 
4405c6c1daeSBarry Smith   PetscFunctionBegin;
44128b400f6SJacob Faibussowitsch   PetscCheck(vdraw->singleton_made, PETSC_COMM_SELF, PETSC_ERR_ORDER, "Trying to restore a singleton that was not gotten");
4429566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)viewer), &rank));
443dd400576SPatrick Sanan   if (rank == 0) {
444a9db196aSBarry Smith     PetscDraw draw, sdraw;
445a9db196aSBarry Smith 
4469566063dSJacob Faibussowitsch     PetscCall(PetscViewerDrawGetDraw(viewer, 0, &draw));
4479566063dSJacob Faibussowitsch     PetscCall(PetscViewerDrawGetDraw(*sviewer, 0, &sdraw));
448a9db196aSBarry Smith     if (draw->savefilename) {
449a9db196aSBarry Smith       draw->savefilecount = sdraw->savefilecount;
4509566063dSJacob Faibussowitsch       PetscCallMPI(MPI_Bcast(&draw->savefilecount, 1, MPIU_INT, 0, PetscObjectComm((PetscObject)draw)));
451a9db196aSBarry Smith     }
452c6228bbaSLisandro Dalcin     svdraw = (PetscViewer_Draw *)(*sviewer)->data;
4535c6c1daeSBarry Smith     for (i = 0; i < vdraw->draw_max; i++) {
45448a46eb9SPierre Jolivet       if (vdraw->draw[i] && svdraw->draw[i]) PetscCall(PetscDrawRestoreSingleton(vdraw->draw[i], &svdraw->draw[i]));
4555c6c1daeSBarry Smith     }
4569566063dSJacob Faibussowitsch     PetscCall(PetscFree3(svdraw->draw, svdraw->drawlg, svdraw->drawaxis));
4579566063dSJacob Faibussowitsch     PetscCall(PetscFree((*sviewer)->data));
4589566063dSJacob Faibussowitsch     PetscCall(PetscHeaderDestroy(sviewer));
459a9db196aSBarry Smith   } else {
460a9db196aSBarry Smith     PetscDraw draw;
461a9db196aSBarry Smith 
4629566063dSJacob Faibussowitsch     PetscCall(PetscViewerDrawGetDraw(viewer, 0, &draw));
46348a46eb9SPierre Jolivet     if (draw->savefilename) PetscCallMPI(MPI_Bcast(&draw->savefilecount, 1, MPIU_INT, 0, PetscObjectComm((PetscObject)draw)));
464a9db196aSBarry Smith   }
465a9db196aSBarry Smith 
4665c6c1daeSBarry Smith   vdraw->singleton_made = PETSC_FALSE;
4675c6c1daeSBarry Smith   PetscFunctionReturn(0);
4685c6c1daeSBarry Smith }
4695c6c1daeSBarry Smith 
4709371c9d4SSatish Balay PetscErrorCode PetscViewerSetFromOptions_Draw(PetscViewer v, PetscOptionItems *PetscOptionsObject) {
471e9457bf7SBarry Smith   PetscReal bounds[16];
472e9457bf7SBarry Smith   PetscInt  nbounds = 16;
473e9457bf7SBarry Smith   PetscBool flg;
474e9457bf7SBarry Smith 
475e9457bf7SBarry Smith   PetscFunctionBegin;
476d0609cedSBarry Smith   PetscOptionsHeadBegin(PetscOptionsObject, "Draw PetscViewer Options");
4779566063dSJacob Faibussowitsch   PetscCall(PetscOptionsRealArray("-draw_bounds", "Bounds to put on plots axis", "PetscViewerDrawSetBounds", bounds, &nbounds, &flg));
47848a46eb9SPierre Jolivet   if (flg) PetscCall(PetscViewerDrawSetBounds(v, nbounds / 2, bounds));
479d0609cedSBarry Smith   PetscOptionsHeadEnd();
480e9457bf7SBarry Smith   PetscFunctionReturn(0);
481e9457bf7SBarry Smith }
482e9457bf7SBarry Smith 
4839371c9d4SSatish Balay PetscErrorCode PetscViewerView_Draw(PetscViewer viewer, PetscViewer v) {
4840076e027SBarry Smith   PetscDraw         draw;
4850076e027SBarry Smith   PetscInt          i;
4860076e027SBarry Smith   PetscViewer_Draw *vdraw = (PetscViewer_Draw *)viewer->data;
4870076e027SBarry Smith 
4880076e027SBarry Smith   PetscFunctionBegin;
4890076e027SBarry Smith   /*  If the PetscViewer has just been created then no vdraw->draw yet
4900076e027SBarry Smith       exists so this will not actually call the viewer on any draws. */
4910076e027SBarry Smith   for (i = 0; i < vdraw->draw_base; i++) {
4920076e027SBarry Smith     if (vdraw->draw[i]) {
4939566063dSJacob Faibussowitsch       PetscCall(PetscViewerDrawGetDraw(viewer, i, &draw));
4949566063dSJacob Faibussowitsch       PetscCall(PetscDrawView(draw, v));
4950076e027SBarry Smith     }
4960076e027SBarry Smith   }
4970076e027SBarry Smith   PetscFunctionReturn(0);
4980076e027SBarry Smith }
4990076e027SBarry Smith 
5008556b5ebSBarry Smith /*MC
5018556b5ebSBarry Smith    PETSCVIEWERDRAW - A viewer that generates graphics, either to the screen or a file
5028556b5ebSBarry Smith 
503*811af0c4SBarry Smith   Level: beginner
504*811af0c4SBarry Smith 
505c2e3fba1SPatrick Sanan .seealso: `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`, `PETSC_VIEWER_DRAW_()`, `PETSC_VIEWER_DRAW_SELF`, `PETSC_VIEWER_DRAW_WORLD`,
506db781477SPatrick Sanan           `PetscViewerCreate()`, `PetscViewerASCIIOpen()`, `PetscViewerBinaryOpen()`, `PETSCVIEWERBINARY`,
507db781477SPatrick Sanan           `PetscViewerMatlabOpen()`, `VecView()`, `DMView()`, `PetscViewerMatlabPutArray()`, `PETSCVIEWERASCII`, `PETSCVIEWERMATLAB`,
508db781477SPatrick Sanan           `PetscViewerFileSetName()`, `PetscViewerFileSetMode()`, `PetscViewerFormat`, `PetscViewerType`, `PetscViewerSetType()`
5098556b5ebSBarry Smith M*/
5109371c9d4SSatish Balay PETSC_EXTERN PetscErrorCode PetscViewerCreate_Draw(PetscViewer viewer) {
5115c6c1daeSBarry Smith   PetscViewer_Draw *vdraw;
5125c6c1daeSBarry Smith 
5135c6c1daeSBarry Smith   PetscFunctionBegin;
5149566063dSJacob Faibussowitsch   PetscCall(PetscNewLog(viewer, &vdraw));
5155c6c1daeSBarry Smith   viewer->data = (void *)vdraw;
5165c6c1daeSBarry Smith 
5175c6c1daeSBarry Smith   viewer->ops->flush            = PetscViewerFlush_Draw;
5180076e027SBarry Smith   viewer->ops->view             = PetscViewerView_Draw;
5195c6c1daeSBarry Smith   viewer->ops->destroy          = PetscViewerDestroy_Draw;
520e9457bf7SBarry Smith   viewer->ops->setfromoptions   = PetscViewerSetFromOptions_Draw;
521559f443fSBarry Smith   viewer->ops->getsubviewer     = PetscViewerGetSubViewer_Draw;
522559f443fSBarry Smith   viewer->ops->restoresubviewer = PetscViewerRestoreSubViewer_Draw;
5235c6c1daeSBarry Smith 
5245c6c1daeSBarry Smith   /* these are created on the fly if requested */
5255c6c1daeSBarry Smith   vdraw->draw_max  = 5;
5265c6c1daeSBarry Smith   vdraw->draw_base = 0;
527ccad63c3SBarry Smith   vdraw->w         = PETSC_DECIDE;
528ccad63c3SBarry Smith   vdraw->h         = PETSC_DECIDE;
529a297a907SKarl Rupp 
5309566063dSJacob Faibussowitsch   PetscCall(PetscCalloc3(vdraw->draw_max, &vdraw->draw, vdraw->draw_max, &vdraw->drawlg, vdraw->draw_max, &vdraw->drawaxis));
5315c6c1daeSBarry Smith   vdraw->singleton_made = PETSC_FALSE;
5325c6c1daeSBarry Smith   PetscFunctionReturn(0);
5335c6c1daeSBarry Smith }
5345c6c1daeSBarry Smith 
5355c6c1daeSBarry Smith /*@
536*811af0c4SBarry Smith     PetscViewerDrawClear - Clears a `PetscDraw` graphic associated with a `PetscViewer`.
5375c6c1daeSBarry Smith 
5385c6c1daeSBarry Smith     Not Collective
5395c6c1daeSBarry Smith 
5405c6c1daeSBarry Smith     Input Parameter:
541*811af0c4SBarry Smith .  viewer - the `PetscViewer`
5425c6c1daeSBarry Smith 
5435c6c1daeSBarry Smith     Level: intermediate
5445c6c1daeSBarry Smith 
545*811af0c4SBarry Smith .seealso: `PETSCVIEWERDRAW`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`,
5465c6c1daeSBarry Smith @*/
5479371c9d4SSatish Balay PetscErrorCode PetscViewerDrawClear(PetscViewer viewer) {
5485c6c1daeSBarry Smith   PetscViewer_Draw *vdraw;
549e5ab1681SLisandro Dalcin   PetscBool         isdraw;
550e5ab1681SLisandro Dalcin   PetscInt          i;
5515c6c1daeSBarry Smith 
5525c6c1daeSBarry Smith   PetscFunctionBegin;
553e5ab1681SLisandro Dalcin   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
5549566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
555e5ab1681SLisandro Dalcin   if (!isdraw) PetscFunctionReturn(0);
5565c6c1daeSBarry Smith   vdraw = (PetscViewer_Draw *)viewer->data;
557e5ab1681SLisandro Dalcin 
5585c6c1daeSBarry Smith   for (i = 0; i < vdraw->draw_max; i++) {
5599566063dSJacob Faibussowitsch     if (vdraw->draw[i]) PetscCall(PetscDrawClear(vdraw->draw[i]));
5605c6c1daeSBarry Smith   }
5615c6c1daeSBarry Smith   PetscFunctionReturn(0);
5625c6c1daeSBarry Smith }
5635c6c1daeSBarry Smith 
5645c6c1daeSBarry Smith /*@
565*811af0c4SBarry Smith     PetscViewerDrawGetPause - Gets the pause value (how long to pause before an image is changed)  in the `PETSCVIEWERDRAW` `PetscViewer`
5665c6c1daeSBarry Smith 
5675c6c1daeSBarry Smith     Not Collective
5685c6c1daeSBarry Smith 
5695c6c1daeSBarry Smith     Input Parameter:
570*811af0c4SBarry Smith .  viewer - the `PetscViewer`
5715c6c1daeSBarry Smith 
5725c6c1daeSBarry Smith     Output Parameter:
5735c6c1daeSBarry Smith .  pause - the pause value
5745c6c1daeSBarry Smith 
5755c6c1daeSBarry Smith     Level: intermediate
5765c6c1daeSBarry Smith 
577*811af0c4SBarry Smith .seealso: `PETSCVIEWERDRAW`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`,
5785c6c1daeSBarry Smith @*/
5799371c9d4SSatish Balay PetscErrorCode PetscViewerDrawGetPause(PetscViewer viewer, PetscReal *pause) {
5805c6c1daeSBarry Smith   PetscViewer_Draw *vdraw;
581e5ab1681SLisandro Dalcin   PetscBool         isdraw;
582e5ab1681SLisandro Dalcin   PetscInt          i;
5835c6c1daeSBarry Smith   PetscDraw         draw;
5845c6c1daeSBarry Smith 
5855c6c1daeSBarry Smith   PetscFunctionBegin;
586e5ab1681SLisandro Dalcin   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
5879566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
5889371c9d4SSatish Balay   if (!isdraw) {
5899371c9d4SSatish Balay     *pause = 0.0;
5909371c9d4SSatish Balay     PetscFunctionReturn(0);
5919371c9d4SSatish Balay   }
5925c6c1daeSBarry Smith   vdraw = (PetscViewer_Draw *)viewer->data;
593e5ab1681SLisandro Dalcin 
5945c6c1daeSBarry Smith   for (i = 0; i < vdraw->draw_max; i++) {
5955c6c1daeSBarry Smith     if (vdraw->draw[i]) {
5969566063dSJacob Faibussowitsch       PetscCall(PetscDrawGetPause(vdraw->draw[i], pause));
5975c6c1daeSBarry Smith       PetscFunctionReturn(0);
5985c6c1daeSBarry Smith     }
5995c6c1daeSBarry Smith   }
6005c6c1daeSBarry Smith   /* none exist yet so create one and get its pause */
6019566063dSJacob Faibussowitsch   PetscCall(PetscViewerDrawGetDraw(viewer, 0, &draw));
6029566063dSJacob Faibussowitsch   PetscCall(PetscDrawGetPause(draw, pause));
6035c6c1daeSBarry Smith   PetscFunctionReturn(0);
6045c6c1daeSBarry Smith }
6055c6c1daeSBarry Smith 
6065c6c1daeSBarry Smith /*@
607*811af0c4SBarry Smith     PetscViewerDrawSetPause - Sets a pause for each `PetscDraw` in the `PETSCVIEWERDRAW` `PetscViewer`
6085c6c1daeSBarry Smith 
6095c6c1daeSBarry Smith     Not Collective
6105c6c1daeSBarry Smith 
6115c6c1daeSBarry Smith     Input Parameters:
612*811af0c4SBarry Smith +  viewer - the `PetscViewer`
6135c6c1daeSBarry Smith -  pause - the pause value
6145c6c1daeSBarry Smith 
6155c6c1daeSBarry Smith     Level: intermediate
6165c6c1daeSBarry Smith 
617*811af0c4SBarry Smith .seealso: `PETSCVIEWERDRAW`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`,
6185c6c1daeSBarry Smith @*/
6199371c9d4SSatish Balay PetscErrorCode PetscViewerDrawSetPause(PetscViewer viewer, PetscReal pause) {
620e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
6215c6c1daeSBarry Smith   PetscBool         isdraw;
622e5ab1681SLisandro Dalcin   PetscInt          i;
6235c6c1daeSBarry Smith 
6245c6c1daeSBarry Smith   PetscFunctionBegin;
625e5ab1681SLisandro Dalcin   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
6269566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
627e5ab1681SLisandro Dalcin   if (!isdraw) PetscFunctionReturn(0);
628e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)viewer->data;
629afe78b3cSBarry Smith 
630afe78b3cSBarry Smith   vdraw->pause = pause;
6315c6c1daeSBarry Smith   for (i = 0; i < vdraw->draw_max; i++) {
6329566063dSJacob Faibussowitsch     if (vdraw->draw[i]) PetscCall(PetscDrawSetPause(vdraw->draw[i], pause));
6335c6c1daeSBarry Smith   }
6345c6c1daeSBarry Smith   PetscFunctionReturn(0);
6355c6c1daeSBarry Smith }
6365c6c1daeSBarry Smith 
6375c6c1daeSBarry Smith /*@
6385c6c1daeSBarry Smith     PetscViewerDrawSetHold - Holds previous image when drawing new image
6395c6c1daeSBarry Smith 
6405c6c1daeSBarry Smith     Not Collective
6415c6c1daeSBarry Smith 
6425c6c1daeSBarry Smith     Input Parameters:
643*811af0c4SBarry Smith +  viewer - the `PetscViewer`
644*811af0c4SBarry Smith -  hold - `PETSC_TRUE` indicates to hold the previous image
6455c6c1daeSBarry Smith 
6465c6c1daeSBarry Smith     Level: intermediate
6475c6c1daeSBarry Smith 
648*811af0c4SBarry Smith .seealso: `PETSCVIEWERDRAW`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`,
6495c6c1daeSBarry Smith @*/
6509371c9d4SSatish Balay PetscErrorCode PetscViewerDrawSetHold(PetscViewer viewer, PetscBool hold) {
6515c6c1daeSBarry Smith   PetscViewer_Draw *vdraw;
6525c6c1daeSBarry Smith   PetscBool         isdraw;
6535c6c1daeSBarry Smith 
6545c6c1daeSBarry Smith   PetscFunctionBegin;
655e5ab1681SLisandro Dalcin   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
6569566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
657e5ab1681SLisandro Dalcin   if (!isdraw) PetscFunctionReturn(0);
6585c6c1daeSBarry Smith   vdraw = (PetscViewer_Draw *)viewer->data;
659e5ab1681SLisandro Dalcin 
6605c6c1daeSBarry Smith   vdraw->hold = hold;
6615c6c1daeSBarry Smith   PetscFunctionReturn(0);
6625c6c1daeSBarry Smith }
6635c6c1daeSBarry Smith 
6645c6c1daeSBarry Smith /*@
665*811af0c4SBarry Smith     PetscViewerDrawGetHold - Checks if the `PETSCVIEWERDRAW` `PetscViewer` holds previous image when drawing new image
6665c6c1daeSBarry Smith 
6675c6c1daeSBarry Smith     Not Collective
6685c6c1daeSBarry Smith 
6695c6c1daeSBarry Smith     Input Parameter:
670*811af0c4SBarry Smith .  viewer - the `PetscViewer`
6715c6c1daeSBarry Smith 
6725c6c1daeSBarry Smith     Output Parameter:
6735c6c1daeSBarry Smith .  hold - indicates to hold or not
6745c6c1daeSBarry Smith 
6755c6c1daeSBarry Smith     Level: intermediate
6765c6c1daeSBarry Smith 
677*811af0c4SBarry Smith .seealso: `PETSCVIEWERDRAW`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`,
6785c6c1daeSBarry Smith @*/
6799371c9d4SSatish Balay PetscErrorCode PetscViewerDrawGetHold(PetscViewer viewer, PetscBool *hold) {
6805c6c1daeSBarry Smith   PetscViewer_Draw *vdraw;
6815c6c1daeSBarry Smith   PetscBool         isdraw;
6825c6c1daeSBarry Smith 
6835c6c1daeSBarry Smith   PetscFunctionBegin;
684e5ab1681SLisandro Dalcin   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
6859566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
6869371c9d4SSatish Balay   if (!isdraw) {
6879371c9d4SSatish Balay     *hold = PETSC_FALSE;
6889371c9d4SSatish Balay     PetscFunctionReturn(0);
6899371c9d4SSatish Balay   }
6905c6c1daeSBarry Smith   vdraw = (PetscViewer_Draw *)viewer->data;
691e5ab1681SLisandro Dalcin 
6925c6c1daeSBarry Smith   *hold = vdraw->hold;
6935c6c1daeSBarry Smith   PetscFunctionReturn(0);
6945c6c1daeSBarry Smith }
6955c6c1daeSBarry Smith 
6965c6c1daeSBarry Smith /* ---------------------------------------------------------------------*/
6975c6c1daeSBarry Smith /*
6985c6c1daeSBarry Smith     The variable Petsc_Viewer_Draw_keyval is used to indicate an MPI attribute that
6995c6c1daeSBarry Smith   is attached to a communicator, in this case the attribute is a PetscViewer.
7005c6c1daeSBarry Smith */
701d4c7638eSBarry Smith PetscMPIInt Petsc_Viewer_Draw_keyval = MPI_KEYVAL_INVALID;
7025c6c1daeSBarry Smith 
7035c6c1daeSBarry Smith /*@C
704*811af0c4SBarry Smith     PETSC_VIEWER_DRAW_ - Creates a window `PETSCVIEWERDRAW` `PetscViewer` shared by all processors
7055c6c1daeSBarry Smith                      in a communicator.
7065c6c1daeSBarry Smith 
707d083f849SBarry Smith      Collective
7085c6c1daeSBarry Smith 
7095c6c1daeSBarry Smith      Input Parameter:
710*811af0c4SBarry Smith .    comm - the MPI communicator to share the window `PetscViewer`
7115c6c1daeSBarry Smith 
7125c6c1daeSBarry Smith      Level: intermediate
7135c6c1daeSBarry Smith 
714*811af0c4SBarry Smith      Note:
715*811af0c4SBarry Smith      Unlike almost all other PETSc routines, `PETSC_VIEWER_DRAW_()` does not return
7165c6c1daeSBarry Smith      an error code.  The window is usually used in the form
7175c6c1daeSBarry Smith $       XXXView(XXX object,PETSC_VIEWER_DRAW_(comm));
7185c6c1daeSBarry Smith 
719*811af0c4SBarry Smith .seealso: `PETSCVIEWERDRAW`, `PetscViewer`, `PETSC_VIEWER_DRAW_WORLD`, `PETSC_VIEWER_DRAW_SELF`, `PetscViewerDrawOpen()`,
7205c6c1daeSBarry Smith @*/
7219371c9d4SSatish Balay PetscViewer PETSC_VIEWER_DRAW_(MPI_Comm comm) {
7225c6c1daeSBarry Smith   PetscErrorCode ierr;
7235c6c1daeSBarry Smith   PetscMPIInt    flag;
7245c6c1daeSBarry Smith   PetscViewer    viewer;
7255c6c1daeSBarry Smith   MPI_Comm       ncomm;
7265c6c1daeSBarry Smith 
7275c6c1daeSBarry Smith   PetscFunctionBegin;
7289371c9d4SSatish Balay   ierr = PetscCommDuplicate(comm, &ncomm, NULL);
7299371c9d4SSatish Balay   if (ierr) {
7309371c9d4SSatish Balay     PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_DRAW_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_INITIAL, " ");
7319371c9d4SSatish Balay     PetscFunctionReturn(NULL);
7329371c9d4SSatish Balay   }
7335c6c1daeSBarry Smith   if (Petsc_Viewer_Draw_keyval == MPI_KEYVAL_INVALID) {
73402c9f0b5SLisandro Dalcin     ierr = MPI_Comm_create_keyval(MPI_COMM_NULL_COPY_FN, MPI_COMM_NULL_DELETE_FN, &Petsc_Viewer_Draw_keyval, NULL);
7359371c9d4SSatish Balay     if (ierr) {
7369371c9d4SSatish Balay       PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_DRAW_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_INITIAL, " ");
7379371c9d4SSatish Balay       PetscFunctionReturn(NULL);
7389371c9d4SSatish Balay     }
7395c6c1daeSBarry Smith   }
74047435625SJed Brown   ierr = MPI_Comm_get_attr(ncomm, Petsc_Viewer_Draw_keyval, (void **)&viewer, &flag);
7419371c9d4SSatish Balay   if (ierr) {
7429371c9d4SSatish Balay     PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_DRAW_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_INITIAL, " ");
7439371c9d4SSatish Balay     PetscFunctionReturn(NULL);
7449371c9d4SSatish Balay   }
7455c6c1daeSBarry Smith   if (!flag) { /* PetscViewer not yet created */
74602c9f0b5SLisandro Dalcin     ierr = PetscViewerDrawOpen(ncomm, NULL, NULL, PETSC_DECIDE, PETSC_DECIDE, 300, 300, &viewer);
7479371c9d4SSatish Balay     if (ierr) {
7489371c9d4SSatish Balay       PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_DRAW_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_REPEAT, " ");
7499371c9d4SSatish Balay       PetscFunctionReturn(NULL);
7509371c9d4SSatish Balay     }
7515c6c1daeSBarry Smith     ierr = PetscObjectRegisterDestroy((PetscObject)viewer);
7529371c9d4SSatish Balay     if (ierr) {
7539371c9d4SSatish Balay       PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_DRAW_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_REPEAT, " ");
7549371c9d4SSatish Balay       PetscFunctionReturn(NULL);
7559371c9d4SSatish Balay     }
75647435625SJed Brown     ierr = MPI_Comm_set_attr(ncomm, Petsc_Viewer_Draw_keyval, (void *)viewer);
7579371c9d4SSatish Balay     if (ierr) {
7589371c9d4SSatish Balay       PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_DRAW_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_INITIAL, " ");
7599371c9d4SSatish Balay       PetscFunctionReturn(NULL);
7609371c9d4SSatish Balay     }
7615c6c1daeSBarry Smith   }
7625c6c1daeSBarry Smith   ierr = PetscCommDestroy(&ncomm);
7639371c9d4SSatish Balay   if (ierr) {
7649371c9d4SSatish Balay     PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_DRAW_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_REPEAT, " ");
7659371c9d4SSatish Balay     PetscFunctionReturn(NULL);
7669371c9d4SSatish Balay   }
7675c6c1daeSBarry Smith   PetscFunctionReturn(viewer);
7685c6c1daeSBarry Smith }
7695c6c1daeSBarry Smith 
7705c6c1daeSBarry Smith /*@
7715c6c1daeSBarry Smith     PetscViewerDrawSetBounds - sets the upper and lower bounds to be used in plotting
7725c6c1daeSBarry Smith 
773*811af0c4SBarry Smith     Collective on viewer
7745c6c1daeSBarry Smith 
7755c6c1daeSBarry Smith     Input Parameters:
776*811af0c4SBarry Smith +   viewer - the Petsc`Viewer` (created with `PetscViewerDrawOpen()`)
777*811af0c4SBarry Smith .   nbounds - number of plots that can be made with this viewer, for example the dof passed to `DMDACreate()`
7785c6c1daeSBarry 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, .....
7795c6c1daeSBarry Smith 
780*811af0c4SBarry Smith     Options Database Key:
78110699b91SBarry Smith .   -draw_bounds  minF0,maxF0,minF1,maxF1 - the lower left and upper right bounds
782e9457bf7SBarry Smith 
7835c6c1daeSBarry Smith     Level: intermediate
7845c6c1daeSBarry Smith 
785*811af0c4SBarry Smith     Note:
786*811af0c4SBarry 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
787f3f0eb19SBarry 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
788f3f0eb19SBarry Smith       this viewer. Otherwise the color to physical value meaning changes with each new image if this is not set.
789f3f0eb19SBarry Smith 
790*811af0c4SBarry Smith .seealso: `PETSCVIEWERDRAW`, `PetscViewerDrawGetLG()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()`
7915c6c1daeSBarry Smith @*/
7929371c9d4SSatish Balay PetscErrorCode PetscViewerDrawSetBounds(PetscViewer viewer, PetscInt nbounds, const PetscReal *bounds) {
793e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
794e5ab1681SLisandro Dalcin   PetscBool         isdraw;
7955c6c1daeSBarry Smith 
7965c6c1daeSBarry Smith   PetscFunctionBegin;
7975c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
7989566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
799e5ab1681SLisandro Dalcin   if (!isdraw) PetscFunctionReturn(0);
800e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)viewer->data;
801a297a907SKarl Rupp 
802e5ab1681SLisandro Dalcin   vdraw->nbounds = nbounds;
8039566063dSJacob Faibussowitsch   PetscCall(PetscFree(vdraw->bounds));
8049566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(2 * nbounds, &vdraw->bounds));
8059566063dSJacob Faibussowitsch   PetscCall(PetscArraycpy(vdraw->bounds, bounds, 2 * nbounds));
8065c6c1daeSBarry Smith   PetscFunctionReturn(0);
8075c6c1daeSBarry Smith }
8085c6c1daeSBarry Smith 
8095c6c1daeSBarry Smith /*@C
810*811af0c4SBarry Smith     PetscViewerDrawGetBounds - gets the upper and lower bounds to be used in plotting set with `PetscViewerDrawSetBounds()`
8115c6c1daeSBarry Smith 
812*811af0c4SBarry Smith     Collective on viewer
8135c6c1daeSBarry Smith 
8145c6c1daeSBarry Smith     Input Parameter:
815*811af0c4SBarry Smith .   viewer - the `PetscViewer` (created with `PetscViewerDrawOpen()`)
8165c6c1daeSBarry Smith 
817fd292e60Sprj-     Output Parameters:
818*811af0c4SBarry Smith +   nbounds - number of plots that can be made with this viewer, for example the dof passed to `DMDACreate()`
8195c6c1daeSBarry 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, .....
8205c6c1daeSBarry Smith 
8215c6c1daeSBarry Smith     Level: intermediate
8225c6c1daeSBarry Smith 
823*811af0c4SBarry Smith .seealso: `PETSCVIEWERDRAW`, `PetscViewerDrawGetLG()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()`, `PetscViewerDrawSetBounds()`
8245c6c1daeSBarry Smith @*/
8259371c9d4SSatish Balay PetscErrorCode PetscViewerDrawGetBounds(PetscViewer viewer, PetscInt *nbounds, const PetscReal **bounds) {
826e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
827e5ab1681SLisandro Dalcin   PetscBool         isdraw;
8285c6c1daeSBarry Smith 
8295c6c1daeSBarry Smith   PetscFunctionBegin;
8305c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
8319566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
8329371c9d4SSatish Balay   if (!isdraw) {
8339371c9d4SSatish Balay     if (nbounds) *nbounds = 0;
8349371c9d4SSatish Balay     if (bounds) *bounds = NULL;
8359371c9d4SSatish Balay     PetscFunctionReturn(0);
8369371c9d4SSatish Balay   }
837e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)viewer->data;
838e5ab1681SLisandro Dalcin 
839e5ab1681SLisandro Dalcin   if (nbounds) *nbounds = vdraw->nbounds;
840e5ab1681SLisandro Dalcin   if (bounds) *bounds = vdraw->bounds;
8415c6c1daeSBarry Smith   PetscFunctionReturn(0);
8425c6c1daeSBarry Smith }
843