xref: /petsc/src/sys/classes/viewer/impls/draw/drawv.c (revision aaa8cc7d2a5c3913edcbb923e20f154fe9c4aa65)
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 
5d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerDestroy_Draw(PetscViewer v)
6d71ae5a4SJacob Faibussowitsch {
75c6c1daeSBarry Smith   PetscInt          i;
85c6c1daeSBarry Smith   PetscViewer_Draw *vdraw = (PetscViewer_Draw *)v->data;
95c6c1daeSBarry Smith 
105c6c1daeSBarry Smith   PetscFunctionBegin;
1128b400f6SJacob Faibussowitsch   PetscCheck(!vdraw->singleton_made, PETSC_COMM_SELF, PETSC_ERR_ORDER, "Destroying PetscViewer without first restoring singleton");
125c6c1daeSBarry Smith   for (i = 0; i < vdraw->draw_max; i++) {
139566063dSJacob Faibussowitsch     PetscCall(PetscDrawAxisDestroy(&vdraw->drawaxis[i]));
149566063dSJacob Faibussowitsch     PetscCall(PetscDrawLGDestroy(&vdraw->drawlg[i]));
159566063dSJacob Faibussowitsch     PetscCall(PetscDrawDestroy(&vdraw->draw[i]));
165c6c1daeSBarry Smith   }
179566063dSJacob Faibussowitsch   PetscCall(PetscFree(vdraw->display));
189566063dSJacob Faibussowitsch   PetscCall(PetscFree(vdraw->title));
199566063dSJacob Faibussowitsch   PetscCall(PetscFree3(vdraw->draw, vdraw->drawlg, vdraw->drawaxis));
209566063dSJacob Faibussowitsch   PetscCall(PetscFree(vdraw->bounds));
219566063dSJacob Faibussowitsch   PetscCall(PetscFree(vdraw->drawtype));
229566063dSJacob Faibussowitsch   PetscCall(PetscFree(v->data));
233ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
245c6c1daeSBarry Smith }
255c6c1daeSBarry Smith 
26d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerFlush_Draw(PetscViewer v)
27d71ae5a4SJacob Faibussowitsch {
285c6c1daeSBarry Smith   PetscInt          i;
295c6c1daeSBarry Smith   PetscViewer_Draw *vdraw = (PetscViewer_Draw *)v->data;
305c6c1daeSBarry Smith 
315c6c1daeSBarry Smith   PetscFunctionBegin;
325c6c1daeSBarry Smith   for (i = 0; i < vdraw->draw_max; i++) {
339566063dSJacob Faibussowitsch     if (vdraw->draw[i]) PetscCall(PetscDrawFlush(vdraw->draw[i]));
345c6c1daeSBarry Smith   }
353ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
365c6c1daeSBarry Smith }
375c6c1daeSBarry Smith 
385c6c1daeSBarry Smith /*@C
39811af0c4SBarry Smith     PetscViewerDrawGetDraw - Returns `PetscDraw` object from `PetscViewer` object.
40811af0c4SBarry Smith     This `PetscDraw` object may then be used to perform graphics using
41811af0c4SBarry Smith     `PetscDraw` commands.
425c6c1daeSBarry Smith 
43c3339decSBarry Smith     Collective
445c6c1daeSBarry Smith 
455c6c1daeSBarry Smith     Input Parameters:
46811af0c4SBarry Smith +   viewer - the `PetscViewer` (created with `PetscViewerDrawOpen()` of type `PETSCVIEWERDRAW`)
475c6c1daeSBarry Smith -   windownumber - indicates which subwindow (usually 0)
485c6c1daeSBarry Smith 
4901d2d390SJose E. Roman     Output Parameter:
505c6c1daeSBarry Smith .   draw - the draw object
515c6c1daeSBarry Smith 
525c6c1daeSBarry Smith     Level: intermediate
535c6c1daeSBarry Smith 
54d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscViewerDrawGetLG()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()`
555c6c1daeSBarry Smith @*/
56d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawGetDraw(PetscViewer viewer, PetscInt windownumber, PetscDraw *draw)
57d71ae5a4SJacob Faibussowitsch {
58e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
595c6c1daeSBarry Smith   PetscBool         isdraw;
605c6c1daeSBarry Smith 
615c6c1daeSBarry Smith   PetscFunctionBegin;
625c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
63e5ab1681SLisandro Dalcin   PetscValidLogicalCollectiveInt(viewer, windownumber, 2);
645c6c1daeSBarry Smith   if (draw) PetscValidPointer(draw, 3);
659566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
6628b400f6SJacob Faibussowitsch   PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer");
6708401ef6SPierre Jolivet   PetscCheck(windownumber >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Window number cannot be negative");
68e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)viewer->data;
69e5ab1681SLisandro Dalcin 
705c6c1daeSBarry Smith   windownumber += vdraw->draw_base;
715c6c1daeSBarry Smith   if (windownumber >= vdraw->draw_max) {
725c6c1daeSBarry Smith     /* allocate twice as many slots as needed */
735c6c1daeSBarry Smith     PetscInt       draw_max = vdraw->draw_max;
745c6c1daeSBarry Smith     PetscDraw     *tdraw    = vdraw->draw;
755c6c1daeSBarry Smith     PetscDrawLG   *drawlg   = vdraw->drawlg;
765c6c1daeSBarry Smith     PetscDrawAxis *drawaxis = vdraw->drawaxis;
775c6c1daeSBarry Smith 
785c6c1daeSBarry Smith     vdraw->draw_max = 2 * windownumber;
79a297a907SKarl Rupp 
809566063dSJacob Faibussowitsch     PetscCall(PetscCalloc3(vdraw->draw_max, &vdraw->draw, vdraw->draw_max, &vdraw->drawlg, vdraw->draw_max, &vdraw->drawaxis));
819566063dSJacob Faibussowitsch     PetscCall(PetscArraycpy(vdraw->draw, tdraw, draw_max));
829566063dSJacob Faibussowitsch     PetscCall(PetscArraycpy(vdraw->drawlg, drawlg, draw_max));
839566063dSJacob Faibussowitsch     PetscCall(PetscArraycpy(vdraw->drawaxis, drawaxis, draw_max));
849566063dSJacob Faibussowitsch     PetscCall(PetscFree3(tdraw, drawlg, drawaxis));
855c6c1daeSBarry Smith   }
865c6c1daeSBarry Smith 
875c6c1daeSBarry Smith   if (!vdraw->draw[windownumber]) {
88e5ab1681SLisandro Dalcin     char *title = vdraw->title, tmp_str[128];
8910f3a0f4SLisandro Dalcin     if (windownumber) {
909566063dSJacob Faibussowitsch       PetscCall(PetscSNPrintf(tmp_str, sizeof(tmp_str), "%s:%" PetscInt_FMT, vdraw->title ? vdraw->title : "", windownumber));
915c6c1daeSBarry Smith       title = tmp_str;
925c6c1daeSBarry Smith     }
939566063dSJacob Faibussowitsch     PetscCall(PetscDrawCreate(PetscObjectComm((PetscObject)viewer), vdraw->display, title, PETSC_DECIDE, PETSC_DECIDE, vdraw->w, vdraw->h, &vdraw->draw[windownumber]));
9448a46eb9SPierre Jolivet     if (vdraw->drawtype) PetscCall(PetscDrawSetType(vdraw->draw[windownumber], vdraw->drawtype));
959566063dSJacob Faibussowitsch     PetscCall(PetscDrawSetPause(vdraw->draw[windownumber], vdraw->pause));
969566063dSJacob Faibussowitsch     PetscCall(PetscDrawSetOptionsPrefix(vdraw->draw[windownumber], ((PetscObject)viewer)->prefix));
979566063dSJacob Faibussowitsch     PetscCall(PetscDrawSetFromOptions(vdraw->draw[windownumber]));
985c6c1daeSBarry Smith   }
995c6c1daeSBarry Smith   if (draw) *draw = vdraw->draw[windownumber];
100064a246eSJacob Faibussowitsch   if (draw) PetscValidHeaderSpecific(*draw, PETSC_DRAW_CLASSID, 3);
1013ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1025c6c1daeSBarry Smith }
1035c6c1daeSBarry Smith 
1045c6c1daeSBarry Smith /*@C
105811af0c4SBarry Smith     PetscViewerDrawBaseAdd - add to the base integer that is added to the windownumber passed to `PetscViewerDrawGetDraw()`
1065c6c1daeSBarry Smith 
107c3339decSBarry Smith     Logically Collective
1085c6c1daeSBarry Smith 
1095c6c1daeSBarry Smith     Input Parameters:
110811af0c4SBarry Smith +  viewer - the `PetscViewer` (created with `PetscViewerDrawOpen()`)
1115c6c1daeSBarry Smith -   windownumber - how much to add to the base
1125c6c1daeSBarry Smith 
1135c6c1daeSBarry Smith     Level: developer
1145c6c1daeSBarry Smith 
115811af0c4SBarry Smith     Note:
116811af0c4SBarry Smith     A `PETSCVIEWERDRAW` may have multiple `PetscDraw` subwindows, this increases the number of the subwindow that is returned with `PetscViewerDrawGetDraw()`
117811af0c4SBarry Smith 
118d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewerDrawGetLG()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`, `PetscViewerDrawBaseSet()`
1195c6c1daeSBarry Smith @*/
120d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawBaseAdd(PetscViewer viewer, PetscInt windownumber)
121d71ae5a4SJacob Faibussowitsch {
122e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
1235c6c1daeSBarry Smith   PetscBool         isdraw;
1245c6c1daeSBarry Smith 
1255c6c1daeSBarry Smith   PetscFunctionBegin;
1265c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
127e5ab1681SLisandro Dalcin   PetscValidLogicalCollectiveInt(viewer, windownumber, 2);
1289566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
12928b400f6SJacob Faibussowitsch   PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer");
130e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)viewer->data;
131e5ab1681SLisandro Dalcin 
132cc73adaaSBarry 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);
1335c6c1daeSBarry Smith   vdraw->draw_base += windownumber;
1343ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1355c6c1daeSBarry Smith }
1365c6c1daeSBarry Smith 
1375c6c1daeSBarry Smith /*@C
138811af0c4SBarry Smith     PetscViewerDrawBaseSet - sets the base integer that is added to the windownumber passed to `PetscViewerDrawGetDraw()`
1395c6c1daeSBarry Smith 
140c3339decSBarry Smith     Logically Collective
1415c6c1daeSBarry Smith 
1425c6c1daeSBarry Smith     Input Parameters:
143811af0c4SBarry Smith +   viewer - the `PetscViewer` (created with `PetscViewerDrawOpen()`)
1445c6c1daeSBarry Smith -   windownumber - value to set the base
1455c6c1daeSBarry Smith 
1465c6c1daeSBarry Smith     Level: developer
1475c6c1daeSBarry Smith 
148811af0c4SBarry Smith     Note:
149811af0c4SBarry Smith     A `PETSCVIEWERDRAW` may have multiple `PetscDraw` subwindows, this increases the number of the subwindow that is returned with `PetscViewerDrawGetDraw()`
150811af0c4SBarry Smith 
151d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewerDrawGetLG()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`, `PetscViewerDrawBaseAdd()`
1525c6c1daeSBarry Smith @*/
153d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawBaseSet(PetscViewer viewer, PetscInt windownumber)
154d71ae5a4SJacob Faibussowitsch {
155e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
1565c6c1daeSBarry Smith   PetscBool         isdraw;
1575c6c1daeSBarry Smith 
1585c6c1daeSBarry Smith   PetscFunctionBegin;
1595c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
160e5ab1681SLisandro Dalcin   PetscValidLogicalCollectiveInt(viewer, windownumber, 2);
1619566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
16228b400f6SJacob Faibussowitsch   PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer");
163e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)viewer->data;
164e5ab1681SLisandro Dalcin 
16508401ef6SPierre Jolivet   PetscCheck(windownumber >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Resulting base %" PetscInt_FMT " cannot be negative", windownumber);
1665c6c1daeSBarry Smith   vdraw->draw_base = windownumber;
1673ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1685c6c1daeSBarry Smith }
1695c6c1daeSBarry Smith 
1705c6c1daeSBarry Smith /*@C
171811af0c4SBarry Smith     PetscViewerDrawGetDrawLG - Returns a `PetscDrawLG` object from `PetscViewer` object of type `PETSCVIEWERDRAW`.
172811af0c4SBarry Smith     This `PetscDrawLG` object may then be used to perform graphics using `PetscDrawLG` commands.
1735c6c1daeSBarry Smith 
174c3339decSBarry Smith     Collective
1755c6c1daeSBarry Smith 
176d8d19677SJose E. Roman     Input Parameters:
1772fe279fdSBarry Smith +   viewer - the `PetscViewer` (created with `PetscViewerDrawOpen()`)
1785c6c1daeSBarry Smith -   windownumber - indicates which subwindow (usually 0)
1795c6c1daeSBarry Smith 
18001d2d390SJose E. Roman     Output Parameter:
1815c6c1daeSBarry Smith .   draw - the draw line graph object
1825c6c1daeSBarry Smith 
1835c6c1daeSBarry Smith     Level: intermediate
1845c6c1daeSBarry Smith 
185811af0c4SBarry Smith     Note:
186811af0c4SBarry Smith     A `PETSCVIEWERDRAW` may have multiple `PetscDraw` subwindows
187811af0c4SBarry Smith 
188d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscDrawLG`, `PetscViewerDrawGetDraw()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()`
1895c6c1daeSBarry Smith @*/
190d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawGetDrawLG(PetscViewer viewer, PetscInt windownumber, PetscDrawLG *drawlg)
191d71ae5a4SJacob Faibussowitsch {
1925c6c1daeSBarry Smith   PetscBool         isdraw;
193e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
1945c6c1daeSBarry Smith 
1955c6c1daeSBarry Smith   PetscFunctionBegin;
1965c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
197e5ab1681SLisandro Dalcin   PetscValidLogicalCollectiveInt(viewer, windownumber, 2);
1985c6c1daeSBarry Smith   PetscValidPointer(drawlg, 3);
1999566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
20028b400f6SJacob Faibussowitsch   PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer");
20108401ef6SPierre Jolivet   PetscCheck(windownumber >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Window number cannot be negative");
202e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)viewer->data;
2035c6c1daeSBarry Smith 
20448a46eb9SPierre Jolivet   if (windownumber + vdraw->draw_base >= vdraw->draw_max || !vdraw->draw[windownumber + vdraw->draw_base]) PetscCall(PetscViewerDrawGetDraw(viewer, windownumber, NULL));
2055c6c1daeSBarry Smith   if (!vdraw->drawlg[windownumber + vdraw->draw_base]) {
2069566063dSJacob Faibussowitsch     PetscCall(PetscDrawLGCreate(vdraw->draw[windownumber + vdraw->draw_base], 1, &vdraw->drawlg[windownumber + vdraw->draw_base]));
2079566063dSJacob Faibussowitsch     PetscCall(PetscDrawLGSetFromOptions(vdraw->drawlg[windownumber + vdraw->draw_base]));
2085c6c1daeSBarry Smith   }
2095c6c1daeSBarry Smith   *drawlg = vdraw->drawlg[windownumber + vdraw->draw_base];
2103ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2115c6c1daeSBarry Smith }
2125c6c1daeSBarry Smith 
2135c6c1daeSBarry Smith /*@C
214811af0c4SBarry Smith     PetscViewerDrawGetDrawAxis - Returns a `PetscDrawAxis` object from a `PetscViewer` object of type `PETSCVIEWERDRAW`.
215811af0c4SBarry Smith     This `PetscDrawAxis` object may then be used to perform graphics using `PetscDrawAxis` commands.
2165c6c1daeSBarry Smith 
217c3339decSBarry Smith     Collective
2185c6c1daeSBarry Smith 
219d8d19677SJose E. Roman     Input Parameters:
220811af0c4SBarry Smith +   viewer - the `PetscViewer` (created with `PetscViewerDrawOpen()`)
2215c6c1daeSBarry Smith -   windownumber - indicates which subwindow (usually 0)
2225c6c1daeSBarry Smith 
22301d2d390SJose E. Roman     Output Parameter:
2245c6c1daeSBarry Smith .   drawaxis - the draw axis object
2255c6c1daeSBarry Smith 
2265c6c1daeSBarry Smith     Level: advanced
2275c6c1daeSBarry Smith 
228811af0c4SBarry Smith     Note:
229811af0c4SBarry Smith     A `PETSCVIEWERDRAW` may have multiple `PetscDraw` subwindows
230811af0c4SBarry Smith 
231d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewerDrawGetDraw()`, `PetscViewerDrawGetLG()`, `PetscViewerDrawOpen()`
2325c6c1daeSBarry Smith @*/
233d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawGetDrawAxis(PetscViewer viewer, PetscInt windownumber, PetscDrawAxis *drawaxis)
234d71ae5a4SJacob Faibussowitsch {
2355c6c1daeSBarry Smith   PetscBool         isdraw;
236e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
2375c6c1daeSBarry Smith 
2385c6c1daeSBarry Smith   PetscFunctionBegin;
2395c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
240e5ab1681SLisandro Dalcin   PetscValidLogicalCollectiveInt(viewer, windownumber, 2);
2415c6c1daeSBarry Smith   PetscValidPointer(drawaxis, 3);
2429566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
24328b400f6SJacob Faibussowitsch   PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer");
24408401ef6SPierre Jolivet   PetscCheck(windownumber >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Window number cannot be negative");
245e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)viewer->data;
2465c6c1daeSBarry Smith 
24748a46eb9SPierre Jolivet   if (windownumber + vdraw->draw_base >= vdraw->draw_max || !vdraw->draw[windownumber + vdraw->draw_base]) PetscCall(PetscViewerDrawGetDraw(viewer, windownumber, NULL));
2484dfa11a4SJacob Faibussowitsch   if (!vdraw->drawaxis[windownumber + vdraw->draw_base]) PetscCall(PetscDrawAxisCreate(vdraw->draw[windownumber + vdraw->draw_base], &vdraw->drawaxis[windownumber + vdraw->draw_base]));
2495c6c1daeSBarry Smith   *drawaxis = vdraw->drawaxis[windownumber + vdraw->draw_base];
2503ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2515c6c1daeSBarry Smith }
2525c6c1daeSBarry Smith 
253d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawResize(PetscViewer v, int w, int h)
254d71ae5a4SJacob Faibussowitsch {
255e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
256e5ab1681SLisandro Dalcin   PetscBool         isdraw;
2575c6c1daeSBarry Smith 
2585c6c1daeSBarry Smith   PetscFunctionBegin;
259e5ab1681SLisandro Dalcin   PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1);
2609566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw));
2613ba16761SJacob Faibussowitsch   if (!isdraw) PetscFunctionReturn(PETSC_SUCCESS);
262e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)v->data;
263e5ab1681SLisandro Dalcin 
264e5ab1681SLisandro Dalcin   if (w >= 1) vdraw->w = w;
265e5ab1681SLisandro Dalcin   if (h >= 1) vdraw->h = h;
2663ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2675c6c1daeSBarry Smith }
2685c6c1daeSBarry Smith 
269d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawSetInfo(PetscViewer v, const char display[], const char title[], int x, int y, int w, int h)
270d71ae5a4SJacob Faibussowitsch {
271e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
272e5ab1681SLisandro Dalcin   PetscBool         isdraw;
2735c6c1daeSBarry Smith 
2745c6c1daeSBarry Smith   PetscFunctionBegin;
275e5ab1681SLisandro Dalcin   PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1);
2769566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw));
2773ba16761SJacob Faibussowitsch   if (!isdraw) PetscFunctionReturn(PETSC_SUCCESS);
278e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)v->data;
279e5ab1681SLisandro Dalcin 
2809566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(display, &vdraw->display));
2819566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(title, &vdraw->title));
282e5ab1681SLisandro Dalcin   if (w >= 1) vdraw->w = w;
283e5ab1681SLisandro Dalcin   if (h >= 1) vdraw->h = h;
2843ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2855c6c1daeSBarry Smith }
2865c6c1daeSBarry Smith 
287d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawSetDrawType(PetscViewer v, PetscDrawType drawtype)
288d71ae5a4SJacob Faibussowitsch {
289e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
290e5ab1681SLisandro Dalcin   PetscBool         isdraw;
291d1da0b69SBarry Smith 
292d1da0b69SBarry Smith   PetscFunctionBegin;
293e5ab1681SLisandro Dalcin   PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1);
2949566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw));
2953ba16761SJacob Faibussowitsch   if (!isdraw) PetscFunctionReturn(PETSC_SUCCESS);
296e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)v->data;
297e5ab1681SLisandro Dalcin 
2989566063dSJacob Faibussowitsch   PetscCall(PetscFree(vdraw->drawtype));
2999566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(drawtype, (char **)&vdraw->drawtype));
3003ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
301d1da0b69SBarry Smith }
302d1da0b69SBarry Smith 
303d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawGetDrawType(PetscViewer v, PetscDrawType *drawtype)
304d71ae5a4SJacob Faibussowitsch {
3051f49e1f7SLisandro Dalcin   PetscViewer_Draw *vdraw;
3061f49e1f7SLisandro Dalcin   PetscBool         isdraw;
3071f49e1f7SLisandro Dalcin 
3081f49e1f7SLisandro Dalcin   PetscFunctionBegin;
3091f49e1f7SLisandro Dalcin   PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1);
3109566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw));
31128b400f6SJacob Faibussowitsch   PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer");
3121f49e1f7SLisandro Dalcin   vdraw = (PetscViewer_Draw *)v->data;
3131f49e1f7SLisandro Dalcin 
3141f49e1f7SLisandro Dalcin   *drawtype = vdraw->drawtype;
3153ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3161f49e1f7SLisandro Dalcin }
3171f49e1f7SLisandro Dalcin 
318d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawSetTitle(PetscViewer v, const char title[])
319d71ae5a4SJacob Faibussowitsch {
320f55236e4SLisandro Dalcin   PetscViewer_Draw *vdraw;
321f55236e4SLisandro Dalcin   PetscBool         isdraw;
322f55236e4SLisandro Dalcin 
323f55236e4SLisandro Dalcin   PetscFunctionBegin;
324f55236e4SLisandro Dalcin   PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1);
3259566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw));
3263ba16761SJacob Faibussowitsch   if (!isdraw) PetscFunctionReturn(PETSC_SUCCESS);
327f55236e4SLisandro Dalcin   vdraw = (PetscViewer_Draw *)v->data;
328f55236e4SLisandro Dalcin 
3299566063dSJacob Faibussowitsch   PetscCall(PetscFree(vdraw->title));
3309566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(title, &vdraw->title));
3313ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
332f55236e4SLisandro Dalcin }
333f55236e4SLisandro Dalcin 
334d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawGetTitle(PetscViewer v, const char *title[])
335d71ae5a4SJacob Faibussowitsch {
336f55236e4SLisandro Dalcin   PetscViewer_Draw *vdraw;
337f55236e4SLisandro Dalcin   PetscBool         isdraw;
338f55236e4SLisandro Dalcin 
339f55236e4SLisandro Dalcin   PetscFunctionBegin;
340f55236e4SLisandro Dalcin   PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1);
3419566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw));
34228b400f6SJacob Faibussowitsch   PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer");
343f55236e4SLisandro Dalcin   vdraw = (PetscViewer_Draw *)v->data;
344f55236e4SLisandro Dalcin 
345f55236e4SLisandro Dalcin   *title = vdraw->title;
3463ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
347f55236e4SLisandro Dalcin }
348f55236e4SLisandro Dalcin 
3495c6c1daeSBarry Smith /*@C
350811af0c4SBarry Smith    PetscViewerDrawOpen - Opens a `PetscDraw` window for use as a `PetscViewer` with type `PETSCVIEWERDRAW`. If you want to
351811af0c4SBarry Smith    do graphics in this window, you must call `PetscViewerDrawGetDraw()` and
352811af0c4SBarry Smith    perform the graphics on the `PetscDraw` object.
3535c6c1daeSBarry Smith 
354d083f849SBarry Smith    Collective
3555c6c1daeSBarry Smith 
3565c6c1daeSBarry Smith    Input Parameters:
3575c6c1daeSBarry Smith +  comm - communicator that will share window
3583f423023SBarry Smith .  display - the X display on which to open, or `NULL` for the local machine
3593f423023SBarry Smith .  title - the title to put in the title bar, or `NULL` for no title
360*aaa8cc7dSPierre Jolivet .  x - horizontal screen coordinate of the upper left corner of window, or use `PETSC_DECIDE`
3612fe279fdSBarry Smith .  y - vertical screen coordinate of the upper left corner of window, or use `PETSC_DECIDE`
3622fe279fdSBarry 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`
3632fe279fdSBarry 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`
3645c6c1daeSBarry Smith 
365f899ff85SJose E. Roman    Output Parameter:
366811af0c4SBarry Smith . viewer - the `PetscViewer`
3675c6c1daeSBarry Smith 
3685c6c1daeSBarry Smith    Format Options:
369811af0c4SBarry Smith +  `PETSC_VIEWER_DRAW_BASIC` - displays with basic format
370811af0c4SBarry Smith -  `PETSC_VIEWER_DRAW_LG`    - displays using a line graph
3715c6c1daeSBarry Smith 
3725c6c1daeSBarry Smith    Options Database Keys:
37310699b91SBarry Smith +  -draw_type - use x or null
3745c6c1daeSBarry Smith .  -nox - Disables all x-windows output
3755c6c1daeSBarry Smith .  -display <name> - Specifies name of machine for the X display
3765c6c1daeSBarry Smith .  -geometry <x,y,w,h> - allows setting the window location and size
3775c6c1daeSBarry Smith -  -draw_pause <pause> - Sets time (in seconds) that the
3785c6c1daeSBarry Smith      program pauses after PetscDrawPause() has been called
3795c6c1daeSBarry Smith      (0 is default, -1 implies until user input).
3805c6c1daeSBarry Smith 
3815c6c1daeSBarry Smith    Level: beginner
3825c6c1daeSBarry Smith 
3833f423023SBarry Smith    Fortran Note:
3845c6c1daeSBarry Smith    Whenever indicating null character data in a Fortran code,
385811af0c4SBarry Smith    `PETSC_NULL_CHARACTER` must be employed; using NULL is not
386811af0c4SBarry Smith    correct for character data!  Thus, `PETSC_NULL_CHARACTER` can be
3875c6c1daeSBarry Smith    used for the display and title input parameters.
3885c6c1daeSBarry Smith 
389d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscDrawCreate()`, `PetscViewerDestroy()`, `PetscViewerDrawGetDraw()`, `PetscViewerCreate()`, `PETSC_VIEWER_DRAW_`,
390db781477SPatrick Sanan           `PETSC_VIEWER_DRAW_WORLD`, `PETSC_VIEWER_DRAW_SELF`
3915c6c1daeSBarry Smith @*/
392d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawOpen(MPI_Comm comm, const char display[], const char title[], int x, int y, int w, int h, PetscViewer *viewer)
393d71ae5a4SJacob Faibussowitsch {
3945c6c1daeSBarry Smith   PetscFunctionBegin;
3959566063dSJacob Faibussowitsch   PetscCall(PetscViewerCreate(comm, viewer));
3969566063dSJacob Faibussowitsch   PetscCall(PetscViewerSetType(*viewer, PETSCVIEWERDRAW));
3979566063dSJacob Faibussowitsch   PetscCall(PetscViewerDrawSetInfo(*viewer, display, title, x, y, w, h));
3983ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3995c6c1daeSBarry Smith }
4005c6c1daeSBarry Smith 
401a9db196aSBarry Smith #include <petsc/private/drawimpl.h>
402a9db196aSBarry Smith 
403d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerGetSubViewer_Draw(PetscViewer viewer, MPI_Comm comm, PetscViewer *sviewer)
404d71ae5a4SJacob Faibussowitsch {
4055c6c1daeSBarry Smith   PetscMPIInt       rank;
4065c6c1daeSBarry Smith   PetscInt          i;
407c6228bbaSLisandro Dalcin   PetscViewer_Draw *vdraw = (PetscViewer_Draw *)viewer->data, *svdraw;
4085c6c1daeSBarry Smith 
4095c6c1daeSBarry Smith   PetscFunctionBegin;
41028b400f6SJacob Faibussowitsch   PetscCheck(!vdraw->singleton_made, PETSC_COMM_SELF, PETSC_ERR_ORDER, "Trying to get SubViewer without first restoring previous");
4115c6c1daeSBarry Smith   /* only processor zero can use the PetscViewer draw singleton */
412fefe69c3SStefano Zampini   if (sviewer) *sviewer = NULL;
4139566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)viewer), &rank));
414dd400576SPatrick Sanan   if (rank == 0) {
415e5afcf28SBarry Smith     PetscMPIInt flg;
416a9db196aSBarry Smith     PetscDraw   draw, sdraw;
417e5afcf28SBarry Smith 
4189566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_compare(PETSC_COMM_SELF, comm, &flg));
419cc73adaaSBarry Smith     PetscCheck(flg == MPI_IDENT || flg == MPI_CONGRUENT, PETSC_COMM_SELF, PETSC_ERR_SUP, "PetscViewerGetSubViewer() for PETSCVIEWERDRAW requires a singleton MPI_Comm");
4209566063dSJacob Faibussowitsch     PetscCall(PetscViewerCreate(comm, sviewer));
4219566063dSJacob Faibussowitsch     PetscCall(PetscViewerSetType(*sviewer, PETSCVIEWERDRAW));
422c6228bbaSLisandro Dalcin     svdraw             = (PetscViewer_Draw *)(*sviewer)->data;
423c6228bbaSLisandro Dalcin     (*sviewer)->format = viewer->format;
424c6228bbaSLisandro Dalcin     for (i = 0; i < vdraw->draw_max; i++) { /* XXX this is wrong if svdraw->draw_max (initially 5) < vdraw->draw_max */
4259566063dSJacob Faibussowitsch       if (vdraw->draw[i]) PetscCall(PetscDrawGetSingleton(vdraw->draw[i], &svdraw->draw[i]));
4265c6c1daeSBarry Smith     }
4279566063dSJacob Faibussowitsch     PetscCall(PetscViewerDrawGetDraw(viewer, 0, &draw));
4289566063dSJacob Faibussowitsch     PetscCall(PetscViewerDrawGetDraw(*sviewer, 0, &sdraw));
429a9db196aSBarry Smith     if (draw->savefilename) {
4309566063dSJacob Faibussowitsch       PetscCall(PetscDrawSetSave(sdraw, draw->savefilename));
431a9db196aSBarry Smith       sdraw->savefilecount  = draw->savefilecount;
432a9db196aSBarry Smith       sdraw->savesinglefile = draw->savesinglefile;
433a9db196aSBarry Smith       sdraw->savemoviefps   = draw->savemoviefps;
434a9db196aSBarry Smith       sdraw->saveonclear    = draw->saveonclear;
435a9db196aSBarry Smith       sdraw->saveonflush    = draw->saveonflush;
436a9db196aSBarry Smith     }
4379566063dSJacob Faibussowitsch     if (draw->savefinalfilename) PetscCall(PetscDrawSetSaveFinalImage(sdraw, draw->savefinalfilename));
438a9db196aSBarry Smith   } else {
439a9db196aSBarry Smith     PetscDraw draw;
4409566063dSJacob Faibussowitsch     PetscCall(PetscViewerDrawGetDraw(viewer, 0, &draw));
4415c6c1daeSBarry Smith   }
4425c6c1daeSBarry Smith   vdraw->singleton_made = PETSC_TRUE;
4433ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4445c6c1daeSBarry Smith }
4455c6c1daeSBarry Smith 
446d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerRestoreSubViewer_Draw(PetscViewer viewer, MPI_Comm comm, PetscViewer *sviewer)
447d71ae5a4SJacob Faibussowitsch {
4485c6c1daeSBarry Smith   PetscMPIInt       rank;
4495c6c1daeSBarry Smith   PetscInt          i;
450c6228bbaSLisandro Dalcin   PetscViewer_Draw *vdraw = (PetscViewer_Draw *)viewer->data, *svdraw;
4515c6c1daeSBarry Smith 
4525c6c1daeSBarry Smith   PetscFunctionBegin;
45328b400f6SJacob Faibussowitsch   PetscCheck(vdraw->singleton_made, PETSC_COMM_SELF, PETSC_ERR_ORDER, "Trying to restore a singleton that was not gotten");
4549566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)viewer), &rank));
455dd400576SPatrick Sanan   if (rank == 0) {
456a9db196aSBarry Smith     PetscDraw draw, sdraw;
457a9db196aSBarry Smith 
4589566063dSJacob Faibussowitsch     PetscCall(PetscViewerDrawGetDraw(viewer, 0, &draw));
4599566063dSJacob Faibussowitsch     PetscCall(PetscViewerDrawGetDraw(*sviewer, 0, &sdraw));
460a9db196aSBarry Smith     if (draw->savefilename) {
461a9db196aSBarry Smith       draw->savefilecount = sdraw->savefilecount;
4629566063dSJacob Faibussowitsch       PetscCallMPI(MPI_Bcast(&draw->savefilecount, 1, MPIU_INT, 0, PetscObjectComm((PetscObject)draw)));
463a9db196aSBarry Smith     }
464c6228bbaSLisandro Dalcin     svdraw = (PetscViewer_Draw *)(*sviewer)->data;
4655c6c1daeSBarry Smith     for (i = 0; i < vdraw->draw_max; i++) {
46648a46eb9SPierre Jolivet       if (vdraw->draw[i] && svdraw->draw[i]) PetscCall(PetscDrawRestoreSingleton(vdraw->draw[i], &svdraw->draw[i]));
4675c6c1daeSBarry Smith     }
4689566063dSJacob Faibussowitsch     PetscCall(PetscFree3(svdraw->draw, svdraw->drawlg, svdraw->drawaxis));
4699566063dSJacob Faibussowitsch     PetscCall(PetscFree((*sviewer)->data));
4709566063dSJacob Faibussowitsch     PetscCall(PetscHeaderDestroy(sviewer));
471a9db196aSBarry Smith   } else {
472a9db196aSBarry Smith     PetscDraw draw;
473a9db196aSBarry Smith 
4749566063dSJacob Faibussowitsch     PetscCall(PetscViewerDrawGetDraw(viewer, 0, &draw));
47548a46eb9SPierre Jolivet     if (draw->savefilename) PetscCallMPI(MPI_Bcast(&draw->savefilecount, 1, MPIU_INT, 0, PetscObjectComm((PetscObject)draw)));
476a9db196aSBarry Smith   }
477a9db196aSBarry Smith 
4785c6c1daeSBarry Smith   vdraw->singleton_made = PETSC_FALSE;
4793ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4805c6c1daeSBarry Smith }
4815c6c1daeSBarry Smith 
482d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerSetFromOptions_Draw(PetscViewer v, PetscOptionItems *PetscOptionsObject)
483d71ae5a4SJacob Faibussowitsch {
484e9457bf7SBarry Smith   PetscReal bounds[16];
485e9457bf7SBarry Smith   PetscInt  nbounds = 16;
486e9457bf7SBarry Smith   PetscBool flg;
487e9457bf7SBarry Smith 
488e9457bf7SBarry Smith   PetscFunctionBegin;
489d0609cedSBarry Smith   PetscOptionsHeadBegin(PetscOptionsObject, "Draw PetscViewer Options");
4909566063dSJacob Faibussowitsch   PetscCall(PetscOptionsRealArray("-draw_bounds", "Bounds to put on plots axis", "PetscViewerDrawSetBounds", bounds, &nbounds, &flg));
49148a46eb9SPierre Jolivet   if (flg) PetscCall(PetscViewerDrawSetBounds(v, nbounds / 2, bounds));
492d0609cedSBarry Smith   PetscOptionsHeadEnd();
4933ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
494e9457bf7SBarry Smith }
495e9457bf7SBarry Smith 
496d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerView_Draw(PetscViewer viewer, PetscViewer v)
497d71ae5a4SJacob Faibussowitsch {
4980076e027SBarry Smith   PetscDraw         draw;
4990076e027SBarry Smith   PetscInt          i;
5000076e027SBarry Smith   PetscViewer_Draw *vdraw = (PetscViewer_Draw *)viewer->data;
501ccb5f961SBarry Smith   PetscBool         iascii;
5020076e027SBarry Smith 
5030076e027SBarry Smith   PetscFunctionBegin;
504ccb5f961SBarry Smith   PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERASCII, &iascii));
505ccb5f961SBarry Smith   if (iascii) PetscCall(PetscViewerASCIIPrintf(v, "Draw viewer is of type %s\n", vdraw->drawtype));
5060076e027SBarry Smith   /*  If the PetscViewer has just been created then no vdraw->draw yet
5070076e027SBarry Smith       exists so this will not actually call the viewer on any draws. */
5080076e027SBarry Smith   for (i = 0; i < vdraw->draw_base; i++) {
5090076e027SBarry Smith     if (vdraw->draw[i]) {
5109566063dSJacob Faibussowitsch       PetscCall(PetscViewerDrawGetDraw(viewer, i, &draw));
5119566063dSJacob Faibussowitsch       PetscCall(PetscDrawView(draw, v));
5120076e027SBarry Smith     }
5130076e027SBarry Smith   }
5143ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
5150076e027SBarry Smith }
5160076e027SBarry Smith 
5178556b5ebSBarry Smith /*MC
5188556b5ebSBarry Smith    PETSCVIEWERDRAW - A viewer that generates graphics, either to the screen or a file
5198556b5ebSBarry Smith 
520811af0c4SBarry Smith   Level: beginner
521811af0c4SBarry Smith 
522d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`, `PETSC_VIEWER_DRAW_()`, `PETSC_VIEWER_DRAW_SELF`, `PETSC_VIEWER_DRAW_WORLD`,
523db781477SPatrick Sanan           `PetscViewerCreate()`, `PetscViewerASCIIOpen()`, `PetscViewerBinaryOpen()`, `PETSCVIEWERBINARY`,
524db781477SPatrick Sanan           `PetscViewerMatlabOpen()`, `VecView()`, `DMView()`, `PetscViewerMatlabPutArray()`, `PETSCVIEWERASCII`, `PETSCVIEWERMATLAB`,
525db781477SPatrick Sanan           `PetscViewerFileSetName()`, `PetscViewerFileSetMode()`, `PetscViewerFormat`, `PetscViewerType`, `PetscViewerSetType()`
5268556b5ebSBarry Smith M*/
527d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscViewerCreate_Draw(PetscViewer viewer)
528d71ae5a4SJacob Faibussowitsch {
5295c6c1daeSBarry Smith   PetscViewer_Draw *vdraw;
5305c6c1daeSBarry Smith 
5315c6c1daeSBarry Smith   PetscFunctionBegin;
5324dfa11a4SJacob Faibussowitsch   PetscCall(PetscNew(&vdraw));
5335c6c1daeSBarry Smith   viewer->data = (void *)vdraw;
5345c6c1daeSBarry Smith 
5355c6c1daeSBarry Smith   viewer->ops->flush            = PetscViewerFlush_Draw;
5360076e027SBarry Smith   viewer->ops->view             = PetscViewerView_Draw;
5375c6c1daeSBarry Smith   viewer->ops->destroy          = PetscViewerDestroy_Draw;
538e9457bf7SBarry Smith   viewer->ops->setfromoptions   = PetscViewerSetFromOptions_Draw;
539559f443fSBarry Smith   viewer->ops->getsubviewer     = PetscViewerGetSubViewer_Draw;
540559f443fSBarry Smith   viewer->ops->restoresubviewer = PetscViewerRestoreSubViewer_Draw;
5415c6c1daeSBarry Smith 
5425c6c1daeSBarry Smith   /* these are created on the fly if requested */
5435c6c1daeSBarry Smith   vdraw->draw_max  = 5;
5445c6c1daeSBarry Smith   vdraw->draw_base = 0;
545ccad63c3SBarry Smith   vdraw->w         = PETSC_DECIDE;
546ccad63c3SBarry Smith   vdraw->h         = PETSC_DECIDE;
547a297a907SKarl Rupp 
5489566063dSJacob Faibussowitsch   PetscCall(PetscCalloc3(vdraw->draw_max, &vdraw->draw, vdraw->draw_max, &vdraw->drawlg, vdraw->draw_max, &vdraw->drawaxis));
5495c6c1daeSBarry Smith   vdraw->singleton_made = PETSC_FALSE;
5503ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
5515c6c1daeSBarry Smith }
5525c6c1daeSBarry Smith 
5535c6c1daeSBarry Smith /*@
554811af0c4SBarry Smith     PetscViewerDrawClear - Clears a `PetscDraw` graphic associated with a `PetscViewer`.
5555c6c1daeSBarry Smith 
5565c6c1daeSBarry Smith     Not Collective
5575c6c1daeSBarry Smith 
5585c6c1daeSBarry Smith     Input Parameter:
559811af0c4SBarry Smith .  viewer - the `PetscViewer`
5605c6c1daeSBarry Smith 
5615c6c1daeSBarry Smith     Level: intermediate
5625c6c1daeSBarry Smith 
563d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`,
5645c6c1daeSBarry Smith @*/
565d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawClear(PetscViewer viewer)
566d71ae5a4SJacob Faibussowitsch {
5675c6c1daeSBarry Smith   PetscViewer_Draw *vdraw;
568e5ab1681SLisandro Dalcin   PetscBool         isdraw;
569e5ab1681SLisandro Dalcin   PetscInt          i;
5705c6c1daeSBarry Smith 
5715c6c1daeSBarry Smith   PetscFunctionBegin;
572e5ab1681SLisandro Dalcin   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
5739566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
5743ba16761SJacob Faibussowitsch   if (!isdraw) PetscFunctionReturn(PETSC_SUCCESS);
5755c6c1daeSBarry Smith   vdraw = (PetscViewer_Draw *)viewer->data;
576e5ab1681SLisandro Dalcin 
5775c6c1daeSBarry Smith   for (i = 0; i < vdraw->draw_max; i++) {
5789566063dSJacob Faibussowitsch     if (vdraw->draw[i]) PetscCall(PetscDrawClear(vdraw->draw[i]));
5795c6c1daeSBarry Smith   }
5803ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
5815c6c1daeSBarry Smith }
5825c6c1daeSBarry Smith 
5835c6c1daeSBarry Smith /*@
584811af0c4SBarry Smith     PetscViewerDrawGetPause - Gets the pause value (how long to pause before an image is changed)  in the `PETSCVIEWERDRAW` `PetscViewer`
5855c6c1daeSBarry Smith 
5865c6c1daeSBarry Smith     Not Collective
5875c6c1daeSBarry Smith 
5885c6c1daeSBarry Smith     Input Parameter:
589811af0c4SBarry Smith .  viewer - the `PetscViewer`
5905c6c1daeSBarry Smith 
5915c6c1daeSBarry Smith     Output Parameter:
5925c6c1daeSBarry Smith .  pause - the pause value
5935c6c1daeSBarry Smith 
5945c6c1daeSBarry Smith     Level: intermediate
5955c6c1daeSBarry Smith 
596d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`,
5975c6c1daeSBarry Smith @*/
598d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawGetPause(PetscViewer viewer, PetscReal *pause)
599d71ae5a4SJacob Faibussowitsch {
6005c6c1daeSBarry Smith   PetscViewer_Draw *vdraw;
601e5ab1681SLisandro Dalcin   PetscBool         isdraw;
602e5ab1681SLisandro Dalcin   PetscInt          i;
6035c6c1daeSBarry Smith   PetscDraw         draw;
6045c6c1daeSBarry Smith 
6055c6c1daeSBarry Smith   PetscFunctionBegin;
606e5ab1681SLisandro Dalcin   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
6079566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
6089371c9d4SSatish Balay   if (!isdraw) {
6099371c9d4SSatish Balay     *pause = 0.0;
6103ba16761SJacob Faibussowitsch     PetscFunctionReturn(PETSC_SUCCESS);
6119371c9d4SSatish Balay   }
6125c6c1daeSBarry Smith   vdraw = (PetscViewer_Draw *)viewer->data;
613e5ab1681SLisandro Dalcin 
6145c6c1daeSBarry Smith   for (i = 0; i < vdraw->draw_max; i++) {
6155c6c1daeSBarry Smith     if (vdraw->draw[i]) {
6169566063dSJacob Faibussowitsch       PetscCall(PetscDrawGetPause(vdraw->draw[i], pause));
6173ba16761SJacob Faibussowitsch       PetscFunctionReturn(PETSC_SUCCESS);
6185c6c1daeSBarry Smith     }
6195c6c1daeSBarry Smith   }
6205c6c1daeSBarry Smith   /* none exist yet so create one and get its pause */
6219566063dSJacob Faibussowitsch   PetscCall(PetscViewerDrawGetDraw(viewer, 0, &draw));
6229566063dSJacob Faibussowitsch   PetscCall(PetscDrawGetPause(draw, pause));
6233ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
6245c6c1daeSBarry Smith }
6255c6c1daeSBarry Smith 
6265c6c1daeSBarry Smith /*@
627811af0c4SBarry Smith     PetscViewerDrawSetPause - Sets a pause for each `PetscDraw` in the `PETSCVIEWERDRAW` `PetscViewer`
6285c6c1daeSBarry Smith 
6295c6c1daeSBarry Smith     Not Collective
6305c6c1daeSBarry Smith 
6315c6c1daeSBarry Smith     Input Parameters:
632811af0c4SBarry Smith +  viewer - the `PetscViewer`
6335c6c1daeSBarry Smith -  pause - the pause value
6345c6c1daeSBarry Smith 
6355c6c1daeSBarry Smith     Level: intermediate
6365c6c1daeSBarry Smith 
637d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`,
6385c6c1daeSBarry Smith @*/
639d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawSetPause(PetscViewer viewer, PetscReal pause)
640d71ae5a4SJacob Faibussowitsch {
641e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
6425c6c1daeSBarry Smith   PetscBool         isdraw;
643e5ab1681SLisandro Dalcin   PetscInt          i;
6445c6c1daeSBarry Smith 
6455c6c1daeSBarry Smith   PetscFunctionBegin;
646e5ab1681SLisandro Dalcin   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
6479566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
6483ba16761SJacob Faibussowitsch   if (!isdraw) PetscFunctionReturn(PETSC_SUCCESS);
649e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)viewer->data;
650afe78b3cSBarry Smith 
651afe78b3cSBarry Smith   vdraw->pause = pause;
6525c6c1daeSBarry Smith   for (i = 0; i < vdraw->draw_max; i++) {
6539566063dSJacob Faibussowitsch     if (vdraw->draw[i]) PetscCall(PetscDrawSetPause(vdraw->draw[i], pause));
6545c6c1daeSBarry Smith   }
6553ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
6565c6c1daeSBarry Smith }
6575c6c1daeSBarry Smith 
6585c6c1daeSBarry Smith /*@
6595c6c1daeSBarry Smith     PetscViewerDrawSetHold - Holds previous image when drawing new image
6605c6c1daeSBarry Smith 
6615c6c1daeSBarry Smith     Not Collective
6625c6c1daeSBarry Smith 
6635c6c1daeSBarry Smith     Input Parameters:
664811af0c4SBarry Smith +  viewer - the `PetscViewer`
665811af0c4SBarry Smith -  hold - `PETSC_TRUE` indicates to hold the previous image
6665c6c1daeSBarry Smith 
6675c6c1daeSBarry Smith     Level: intermediate
6685c6c1daeSBarry Smith 
669d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`,
6705c6c1daeSBarry Smith @*/
671d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawSetHold(PetscViewer viewer, PetscBool hold)
672d71ae5a4SJacob Faibussowitsch {
6735c6c1daeSBarry Smith   PetscViewer_Draw *vdraw;
6745c6c1daeSBarry Smith   PetscBool         isdraw;
6755c6c1daeSBarry Smith 
6765c6c1daeSBarry Smith   PetscFunctionBegin;
677e5ab1681SLisandro Dalcin   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
6789566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
6793ba16761SJacob Faibussowitsch   if (!isdraw) PetscFunctionReturn(PETSC_SUCCESS);
6805c6c1daeSBarry Smith   vdraw = (PetscViewer_Draw *)viewer->data;
681e5ab1681SLisandro Dalcin 
6825c6c1daeSBarry Smith   vdraw->hold = hold;
6833ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
6845c6c1daeSBarry Smith }
6855c6c1daeSBarry Smith 
6865c6c1daeSBarry Smith /*@
687811af0c4SBarry Smith     PetscViewerDrawGetHold - Checks if the `PETSCVIEWERDRAW` `PetscViewer` holds previous image when drawing new image
6885c6c1daeSBarry Smith 
6895c6c1daeSBarry Smith     Not Collective
6905c6c1daeSBarry Smith 
6915c6c1daeSBarry Smith     Input Parameter:
692811af0c4SBarry Smith .  viewer - the `PetscViewer`
6935c6c1daeSBarry Smith 
6945c6c1daeSBarry Smith     Output Parameter:
6955c6c1daeSBarry Smith .  hold - indicates to hold or not
6965c6c1daeSBarry Smith 
6975c6c1daeSBarry Smith     Level: intermediate
6985c6c1daeSBarry Smith 
699d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`,
7005c6c1daeSBarry Smith @*/
701d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawGetHold(PetscViewer viewer, PetscBool *hold)
702d71ae5a4SJacob Faibussowitsch {
7035c6c1daeSBarry Smith   PetscViewer_Draw *vdraw;
7045c6c1daeSBarry Smith   PetscBool         isdraw;
7055c6c1daeSBarry Smith 
7065c6c1daeSBarry Smith   PetscFunctionBegin;
707e5ab1681SLisandro Dalcin   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
7089566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
7099371c9d4SSatish Balay   if (!isdraw) {
7109371c9d4SSatish Balay     *hold = PETSC_FALSE;
7113ba16761SJacob Faibussowitsch     PetscFunctionReturn(PETSC_SUCCESS);
7129371c9d4SSatish Balay   }
7135c6c1daeSBarry Smith   vdraw = (PetscViewer_Draw *)viewer->data;
714e5ab1681SLisandro Dalcin 
7155c6c1daeSBarry Smith   *hold = vdraw->hold;
7163ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
7175c6c1daeSBarry Smith }
7185c6c1daeSBarry Smith 
7195c6c1daeSBarry Smith /*
7205c6c1daeSBarry Smith     The variable Petsc_Viewer_Draw_keyval is used to indicate an MPI attribute that
7215c6c1daeSBarry Smith   is attached to a communicator, in this case the attribute is a PetscViewer.
7225c6c1daeSBarry Smith */
723d4c7638eSBarry Smith PetscMPIInt Petsc_Viewer_Draw_keyval = MPI_KEYVAL_INVALID;
7245c6c1daeSBarry Smith 
7255c6c1daeSBarry Smith /*@C
726811af0c4SBarry Smith     PETSC_VIEWER_DRAW_ - Creates a window `PETSCVIEWERDRAW` `PetscViewer` shared by all processors
7275c6c1daeSBarry Smith                      in a communicator.
7285c6c1daeSBarry Smith 
729d083f849SBarry Smith      Collective
7305c6c1daeSBarry Smith 
7315c6c1daeSBarry Smith      Input Parameter:
732811af0c4SBarry Smith .    comm - the MPI communicator to share the window `PetscViewer`
7335c6c1daeSBarry Smith 
7345c6c1daeSBarry Smith      Level: intermediate
7355c6c1daeSBarry Smith 
736811af0c4SBarry Smith      Note:
737811af0c4SBarry Smith      Unlike almost all other PETSc routines, `PETSC_VIEWER_DRAW_()` does not return
7385c6c1daeSBarry Smith      an error code.  The window is usually used in the form
7395c6c1daeSBarry Smith $       XXXView(XXX object,PETSC_VIEWER_DRAW_(comm));
7405c6c1daeSBarry Smith 
741d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscViewer`, `PETSC_VIEWER_DRAW_WORLD`, `PETSC_VIEWER_DRAW_SELF`, `PetscViewerDrawOpen()`,
7425c6c1daeSBarry Smith @*/
743d71ae5a4SJacob Faibussowitsch PetscViewer PETSC_VIEWER_DRAW_(MPI_Comm comm)
744d71ae5a4SJacob Faibussowitsch {
7455c6c1daeSBarry Smith   PetscErrorCode ierr;
7463ba16761SJacob Faibussowitsch   PetscMPIInt    flag, mpi_ierr;
7475c6c1daeSBarry Smith   PetscViewer    viewer;
7485c6c1daeSBarry Smith   MPI_Comm       ncomm;
7495c6c1daeSBarry Smith 
7505c6c1daeSBarry Smith   PetscFunctionBegin;
7519371c9d4SSatish Balay   ierr = PetscCommDuplicate(comm, &ncomm, NULL);
7529371c9d4SSatish Balay   if (ierr) {
7533ba16761SJacob Faibussowitsch     ierr = PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_DRAW_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_INITIAL, " ");
7549371c9d4SSatish Balay     PetscFunctionReturn(NULL);
7559371c9d4SSatish Balay   }
7565c6c1daeSBarry Smith   if (Petsc_Viewer_Draw_keyval == MPI_KEYVAL_INVALID) {
7573ba16761SJacob Faibussowitsch     mpi_ierr = MPI_Comm_create_keyval(MPI_COMM_NULL_COPY_FN, MPI_COMM_NULL_DELETE_FN, &Petsc_Viewer_Draw_keyval, NULL);
7583ba16761SJacob Faibussowitsch     if (mpi_ierr) {
7593ba16761SJacob Faibussowitsch       ierr = PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_DRAW_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_INITIAL, " ");
7609371c9d4SSatish Balay       PetscFunctionReturn(NULL);
7619371c9d4SSatish Balay     }
7625c6c1daeSBarry Smith   }
7633ba16761SJacob Faibussowitsch   mpi_ierr = MPI_Comm_get_attr(ncomm, Petsc_Viewer_Draw_keyval, (void **)&viewer, &flag);
7643ba16761SJacob Faibussowitsch   if (mpi_ierr) {
7653ba16761SJacob Faibussowitsch     ierr = PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_DRAW_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_INITIAL, " ");
7669371c9d4SSatish Balay     PetscFunctionReturn(NULL);
7679371c9d4SSatish Balay   }
7685c6c1daeSBarry Smith   if (!flag) { /* PetscViewer not yet created */
76902c9f0b5SLisandro Dalcin     ierr = PetscViewerDrawOpen(ncomm, NULL, NULL, PETSC_DECIDE, PETSC_DECIDE, 300, 300, &viewer);
7709371c9d4SSatish Balay     if (ierr) {
7713ba16761SJacob Faibussowitsch       ierr = PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_DRAW_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_REPEAT, " ");
7729371c9d4SSatish Balay       PetscFunctionReturn(NULL);
7739371c9d4SSatish Balay     }
7745c6c1daeSBarry Smith     ierr = PetscObjectRegisterDestroy((PetscObject)viewer);
7759371c9d4SSatish Balay     if (ierr) {
7763ba16761SJacob Faibussowitsch       ierr = PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_DRAW_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_REPEAT, " ");
7779371c9d4SSatish Balay       PetscFunctionReturn(NULL);
7789371c9d4SSatish Balay     }
7793ba16761SJacob Faibussowitsch     mpi_ierr = MPI_Comm_set_attr(ncomm, Petsc_Viewer_Draw_keyval, (void *)viewer);
7803ba16761SJacob Faibussowitsch     if (mpi_ierr) {
7813ba16761SJacob Faibussowitsch       ierr = PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_DRAW_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_INITIAL, " ");
7829371c9d4SSatish Balay       PetscFunctionReturn(NULL);
7839371c9d4SSatish Balay     }
7845c6c1daeSBarry Smith   }
7855c6c1daeSBarry Smith   ierr = PetscCommDestroy(&ncomm);
7869371c9d4SSatish Balay   if (ierr) {
7873ba16761SJacob Faibussowitsch     ierr = PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_DRAW_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_REPEAT, " ");
7889371c9d4SSatish Balay     PetscFunctionReturn(NULL);
7899371c9d4SSatish Balay   }
7905c6c1daeSBarry Smith   PetscFunctionReturn(viewer);
7915c6c1daeSBarry Smith }
7925c6c1daeSBarry Smith 
7935c6c1daeSBarry Smith /*@
7945c6c1daeSBarry Smith     PetscViewerDrawSetBounds - sets the upper and lower bounds to be used in plotting
7955c6c1daeSBarry Smith 
796c3339decSBarry Smith     Collective
7975c6c1daeSBarry Smith 
7985c6c1daeSBarry Smith     Input Parameters:
799811af0c4SBarry Smith +   viewer - the Petsc`Viewer` (created with `PetscViewerDrawOpen()`)
800811af0c4SBarry Smith .   nbounds - number of plots that can be made with this viewer, for example the dof passed to `DMDACreate()`
8015c6c1daeSBarry 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, .....
8025c6c1daeSBarry Smith 
803811af0c4SBarry Smith     Options Database Key:
80410699b91SBarry Smith .   -draw_bounds  minF0,maxF0,minF1,maxF1 - the lower left and upper right bounds
805e9457bf7SBarry Smith 
8065c6c1daeSBarry Smith     Level: intermediate
8075c6c1daeSBarry Smith 
808811af0c4SBarry Smith     Note:
809811af0c4SBarry 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
810f3f0eb19SBarry 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
811f3f0eb19SBarry Smith       this viewer. Otherwise the color to physical value meaning changes with each new image if this is not set.
812f3f0eb19SBarry Smith 
813d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscViewerDrawGetLG()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()`
8145c6c1daeSBarry Smith @*/
815d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawSetBounds(PetscViewer viewer, PetscInt nbounds, const PetscReal *bounds)
816d71ae5a4SJacob Faibussowitsch {
817e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
818e5ab1681SLisandro Dalcin   PetscBool         isdraw;
8195c6c1daeSBarry Smith 
8205c6c1daeSBarry Smith   PetscFunctionBegin;
8215c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
8229566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
8233ba16761SJacob Faibussowitsch   if (!isdraw) PetscFunctionReturn(PETSC_SUCCESS);
824e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)viewer->data;
825a297a907SKarl Rupp 
826e5ab1681SLisandro Dalcin   vdraw->nbounds = nbounds;
8279566063dSJacob Faibussowitsch   PetscCall(PetscFree(vdraw->bounds));
8289566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(2 * nbounds, &vdraw->bounds));
8299566063dSJacob Faibussowitsch   PetscCall(PetscArraycpy(vdraw->bounds, bounds, 2 * nbounds));
8303ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
8315c6c1daeSBarry Smith }
8325c6c1daeSBarry Smith 
8335c6c1daeSBarry Smith /*@C
834811af0c4SBarry Smith     PetscViewerDrawGetBounds - gets the upper and lower bounds to be used in plotting set with `PetscViewerDrawSetBounds()`
8355c6c1daeSBarry Smith 
836c3339decSBarry Smith     Collective
8375c6c1daeSBarry Smith 
8385c6c1daeSBarry Smith     Input Parameter:
839811af0c4SBarry Smith .   viewer - the `PetscViewer` (created with `PetscViewerDrawOpen()`)
8405c6c1daeSBarry Smith 
841fd292e60Sprj-     Output Parameters:
842811af0c4SBarry Smith +   nbounds - number of plots that can be made with this viewer, for example the dof passed to `DMDACreate()`
8435c6c1daeSBarry 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, .....
8445c6c1daeSBarry Smith 
8455c6c1daeSBarry Smith     Level: intermediate
8465c6c1daeSBarry Smith 
847d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscViewerDrawGetLG()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()`, `PetscViewerDrawSetBounds()`
8485c6c1daeSBarry Smith @*/
849d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawGetBounds(PetscViewer viewer, PetscInt *nbounds, const PetscReal **bounds)
850d71ae5a4SJacob Faibussowitsch {
851e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
852e5ab1681SLisandro Dalcin   PetscBool         isdraw;
8535c6c1daeSBarry Smith 
8545c6c1daeSBarry Smith   PetscFunctionBegin;
8555c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
8569566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
8579371c9d4SSatish Balay   if (!isdraw) {
8589371c9d4SSatish Balay     if (nbounds) *nbounds = 0;
8599371c9d4SSatish Balay     if (bounds) *bounds = NULL;
8603ba16761SJacob Faibussowitsch     PetscFunctionReturn(PETSC_SUCCESS);
8619371c9d4SSatish Balay   }
862e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)viewer->data;
863e5ab1681SLisandro Dalcin 
864e5ab1681SLisandro Dalcin   if (nbounds) *nbounds = vdraw->nbounds;
865e5ab1681SLisandro Dalcin   if (bounds) *bounds = vdraw->bounds;
8663ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
8675c6c1daeSBarry Smith }
868