xref: /petsc/src/sys/classes/viewer/impls/draw/drawv.c (revision 34e79e724ed5272e30e829101ec0b1afacc04871)
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
39c410d8ccSBarry Smith   PetscViewerDrawGetDraw - Returns `PetscDraw` object from `PETSCVIEWERDRAW` `PetscViewer` object.
40c410d8ccSBarry Smith   This `PetscDraw` object may then be used to perform graphics using `PetscDraw` commands.
415c6c1daeSBarry Smith 
42c3339decSBarry Smith   Collective
435c6c1daeSBarry Smith 
445c6c1daeSBarry Smith   Input Parameters:
45811af0c4SBarry Smith + viewer       - the `PetscViewer` (created with `PetscViewerDrawOpen()` of type `PETSCVIEWERDRAW`)
46c410d8ccSBarry Smith - windownumber - indicates which subwindow (usually 0) to obtain
475c6c1daeSBarry Smith 
4801d2d390SJose E. Roman   Output Parameter:
495c6c1daeSBarry Smith . draw - the draw object
505c6c1daeSBarry Smith 
515c6c1daeSBarry Smith   Level: intermediate
525c6c1daeSBarry Smith 
53d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscViewerDrawGetLG()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()`
545c6c1daeSBarry Smith @*/
55d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawGetDraw(PetscViewer viewer, PetscInt windownumber, PetscDraw *draw)
56d71ae5a4SJacob Faibussowitsch {
57e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
585c6c1daeSBarry Smith   PetscBool         isdraw;
595c6c1daeSBarry Smith 
605c6c1daeSBarry Smith   PetscFunctionBegin;
615c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
62e5ab1681SLisandro Dalcin   PetscValidLogicalCollectiveInt(viewer, windownumber, 2);
634f572ea9SToby Isaac   if (draw) PetscAssertPointer(draw, 3);
649566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
6528b400f6SJacob Faibussowitsch   PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer");
6608401ef6SPierre Jolivet   PetscCheck(windownumber >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Window number cannot be negative");
67e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)viewer->data;
68e5ab1681SLisandro Dalcin 
695c6c1daeSBarry Smith   windownumber += vdraw->draw_base;
705c6c1daeSBarry Smith   if (windownumber >= vdraw->draw_max) {
715c6c1daeSBarry Smith     /* allocate twice as many slots as needed */
725c6c1daeSBarry Smith     PetscInt       draw_max = vdraw->draw_max;
735c6c1daeSBarry Smith     PetscDraw     *tdraw    = vdraw->draw;
745c6c1daeSBarry Smith     PetscDrawLG   *drawlg   = vdraw->drawlg;
755c6c1daeSBarry Smith     PetscDrawAxis *drawaxis = vdraw->drawaxis;
765c6c1daeSBarry Smith 
775c6c1daeSBarry Smith     vdraw->draw_max = 2 * windownumber;
78a297a907SKarl Rupp 
799566063dSJacob Faibussowitsch     PetscCall(PetscCalloc3(vdraw->draw_max, &vdraw->draw, vdraw->draw_max, &vdraw->drawlg, vdraw->draw_max, &vdraw->drawaxis));
809566063dSJacob Faibussowitsch     PetscCall(PetscArraycpy(vdraw->draw, tdraw, draw_max));
819566063dSJacob Faibussowitsch     PetscCall(PetscArraycpy(vdraw->drawlg, drawlg, draw_max));
829566063dSJacob Faibussowitsch     PetscCall(PetscArraycpy(vdraw->drawaxis, drawaxis, draw_max));
839566063dSJacob Faibussowitsch     PetscCall(PetscFree3(tdraw, drawlg, drawaxis));
845c6c1daeSBarry Smith   }
855c6c1daeSBarry Smith 
865c6c1daeSBarry Smith   if (!vdraw->draw[windownumber]) {
87e5ab1681SLisandro Dalcin     char *title = vdraw->title, tmp_str[128];
8810f3a0f4SLisandro Dalcin     if (windownumber) {
899566063dSJacob Faibussowitsch       PetscCall(PetscSNPrintf(tmp_str, sizeof(tmp_str), "%s:%" PetscInt_FMT, vdraw->title ? vdraw->title : "", windownumber));
905c6c1daeSBarry Smith       title = tmp_str;
915c6c1daeSBarry Smith     }
929566063dSJacob Faibussowitsch     PetscCall(PetscDrawCreate(PetscObjectComm((PetscObject)viewer), vdraw->display, title, PETSC_DECIDE, PETSC_DECIDE, vdraw->w, vdraw->h, &vdraw->draw[windownumber]));
9348a46eb9SPierre Jolivet     if (vdraw->drawtype) PetscCall(PetscDrawSetType(vdraw->draw[windownumber], vdraw->drawtype));
949566063dSJacob Faibussowitsch     PetscCall(PetscDrawSetPause(vdraw->draw[windownumber], vdraw->pause));
959566063dSJacob Faibussowitsch     PetscCall(PetscDrawSetOptionsPrefix(vdraw->draw[windownumber], ((PetscObject)viewer)->prefix));
969566063dSJacob Faibussowitsch     PetscCall(PetscDrawSetFromOptions(vdraw->draw[windownumber]));
975c6c1daeSBarry Smith   }
985c6c1daeSBarry Smith   if (draw) *draw = vdraw->draw[windownumber];
99064a246eSJacob Faibussowitsch   if (draw) PetscValidHeaderSpecific(*draw, PETSC_DRAW_CLASSID, 3);
1003ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1015c6c1daeSBarry Smith }
1025c6c1daeSBarry Smith 
1035c6c1daeSBarry Smith /*@C
104c410d8ccSBarry Smith   PetscViewerDrawBaseAdd - add to the base integer that is added to the `windownumber` passed to `PetscViewerDrawGetDraw()`
1055c6c1daeSBarry Smith 
106c3339decSBarry Smith   Logically Collective
1075c6c1daeSBarry Smith 
1085c6c1daeSBarry Smith   Input Parameters:
109811af0c4SBarry Smith + viewer       - the `PetscViewer` (created with `PetscViewerDrawOpen()`)
1105c6c1daeSBarry Smith - windownumber - how much to add to the base
1115c6c1daeSBarry Smith 
1125c6c1daeSBarry Smith   Level: developer
1135c6c1daeSBarry Smith 
114811af0c4SBarry Smith   Note:
115811af0c4SBarry Smith   A `PETSCVIEWERDRAW` may have multiple `PetscDraw` subwindows, this increases the number of the subwindow that is returned with `PetscViewerDrawGetDraw()`
116811af0c4SBarry Smith 
117d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewerDrawGetLG()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`, `PetscViewerDrawBaseSet()`
1185c6c1daeSBarry Smith @*/
119d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawBaseAdd(PetscViewer viewer, PetscInt windownumber)
120d71ae5a4SJacob Faibussowitsch {
121e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
1225c6c1daeSBarry Smith   PetscBool         isdraw;
1235c6c1daeSBarry Smith 
1245c6c1daeSBarry Smith   PetscFunctionBegin;
1255c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
126e5ab1681SLisandro Dalcin   PetscValidLogicalCollectiveInt(viewer, windownumber, 2);
1279566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
12828b400f6SJacob Faibussowitsch   PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer");
129e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)viewer->data;
130e5ab1681SLisandro Dalcin 
131cc73adaaSBarry 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);
1325c6c1daeSBarry Smith   vdraw->draw_base += windownumber;
1333ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1345c6c1daeSBarry Smith }
1355c6c1daeSBarry Smith 
1365c6c1daeSBarry Smith /*@C
137c410d8ccSBarry Smith   PetscViewerDrawBaseSet - sets the base integer that is added to the `windownumber` passed to `PetscViewerDrawGetDraw()`
1385c6c1daeSBarry Smith 
139c3339decSBarry Smith   Logically Collective
1405c6c1daeSBarry Smith 
1415c6c1daeSBarry Smith   Input Parameters:
142811af0c4SBarry Smith + viewer       - the `PetscViewer` (created with `PetscViewerDrawOpen()`)
1435c6c1daeSBarry Smith - windownumber - value to set the base
1445c6c1daeSBarry Smith 
1455c6c1daeSBarry Smith   Level: developer
1465c6c1daeSBarry Smith 
147811af0c4SBarry Smith   Note:
148811af0c4SBarry Smith   A `PETSCVIEWERDRAW` may have multiple `PetscDraw` subwindows, this increases the number of the subwindow that is returned with `PetscViewerDrawGetDraw()`
149811af0c4SBarry Smith 
150d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewerDrawGetLG()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`, `PetscViewerDrawBaseAdd()`
1515c6c1daeSBarry Smith @*/
152d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawBaseSet(PetscViewer viewer, PetscInt windownumber)
153d71ae5a4SJacob Faibussowitsch {
154e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
1555c6c1daeSBarry Smith   PetscBool         isdraw;
1565c6c1daeSBarry Smith 
1575c6c1daeSBarry Smith   PetscFunctionBegin;
1585c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
159e5ab1681SLisandro Dalcin   PetscValidLogicalCollectiveInt(viewer, windownumber, 2);
1609566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
16128b400f6SJacob Faibussowitsch   PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer");
162e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)viewer->data;
163e5ab1681SLisandro Dalcin 
16408401ef6SPierre Jolivet   PetscCheck(windownumber >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Resulting base %" PetscInt_FMT " cannot be negative", windownumber);
1655c6c1daeSBarry Smith   vdraw->draw_base = windownumber;
1663ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
1675c6c1daeSBarry Smith }
1685c6c1daeSBarry Smith 
1695c6c1daeSBarry Smith /*@C
170811af0c4SBarry Smith   PetscViewerDrawGetDrawLG - Returns a `PetscDrawLG` object from `PetscViewer` object of type `PETSCVIEWERDRAW`.
171811af0c4SBarry Smith   This `PetscDrawLG` object may then be used to perform graphics using `PetscDrawLG` commands.
1725c6c1daeSBarry Smith 
173c3339decSBarry Smith   Collective
1745c6c1daeSBarry Smith 
175d8d19677SJose E. Roman   Input Parameters:
1762fe279fdSBarry Smith + viewer       - the `PetscViewer` (created with `PetscViewerDrawOpen()`)
1775c6c1daeSBarry Smith - windownumber - indicates which subwindow (usually 0)
1785c6c1daeSBarry Smith 
17901d2d390SJose E. Roman   Output Parameter:
180aec76313SJacob Faibussowitsch . drawlg - the draw line graph object
1815c6c1daeSBarry Smith 
1825c6c1daeSBarry Smith   Level: intermediate
1835c6c1daeSBarry Smith 
184811af0c4SBarry Smith   Note:
185811af0c4SBarry Smith   A `PETSCVIEWERDRAW` may have multiple `PetscDraw` subwindows
186811af0c4SBarry Smith 
187d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscDrawLG`, `PetscViewerDrawGetDraw()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()`
1885c6c1daeSBarry Smith @*/
189d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawGetDrawLG(PetscViewer viewer, PetscInt windownumber, PetscDrawLG *drawlg)
190d71ae5a4SJacob Faibussowitsch {
1915c6c1daeSBarry Smith   PetscBool         isdraw;
192e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
1935c6c1daeSBarry Smith 
1945c6c1daeSBarry Smith   PetscFunctionBegin;
1955c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
196e5ab1681SLisandro Dalcin   PetscValidLogicalCollectiveInt(viewer, windownumber, 2);
1974f572ea9SToby Isaac   PetscAssertPointer(drawlg, 3);
1989566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
19928b400f6SJacob Faibussowitsch   PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer");
20008401ef6SPierre Jolivet   PetscCheck(windownumber >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Window number cannot be negative");
201e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)viewer->data;
2025c6c1daeSBarry Smith 
20348a46eb9SPierre Jolivet   if (windownumber + vdraw->draw_base >= vdraw->draw_max || !vdraw->draw[windownumber + vdraw->draw_base]) PetscCall(PetscViewerDrawGetDraw(viewer, windownumber, NULL));
2045c6c1daeSBarry Smith   if (!vdraw->drawlg[windownumber + vdraw->draw_base]) {
2059566063dSJacob Faibussowitsch     PetscCall(PetscDrawLGCreate(vdraw->draw[windownumber + vdraw->draw_base], 1, &vdraw->drawlg[windownumber + vdraw->draw_base]));
2069566063dSJacob Faibussowitsch     PetscCall(PetscDrawLGSetFromOptions(vdraw->drawlg[windownumber + vdraw->draw_base]));
2075c6c1daeSBarry Smith   }
2085c6c1daeSBarry Smith   *drawlg = vdraw->drawlg[windownumber + vdraw->draw_base];
2093ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2105c6c1daeSBarry Smith }
2115c6c1daeSBarry Smith 
2125c6c1daeSBarry Smith /*@C
213811af0c4SBarry Smith   PetscViewerDrawGetDrawAxis - Returns a `PetscDrawAxis` object from a `PetscViewer` object of type `PETSCVIEWERDRAW`.
214811af0c4SBarry Smith   This `PetscDrawAxis` object may then be used to perform graphics using `PetscDrawAxis` commands.
2155c6c1daeSBarry Smith 
216c3339decSBarry Smith   Collective
2175c6c1daeSBarry Smith 
218d8d19677SJose E. Roman   Input Parameters:
219811af0c4SBarry Smith + viewer       - the `PetscViewer` (created with `PetscViewerDrawOpen()`)
2205c6c1daeSBarry Smith - windownumber - indicates which subwindow (usually 0)
2215c6c1daeSBarry Smith 
22201d2d390SJose E. Roman   Output Parameter:
2235c6c1daeSBarry Smith . drawaxis - the draw axis object
2245c6c1daeSBarry Smith 
2255c6c1daeSBarry Smith   Level: advanced
2265c6c1daeSBarry Smith 
227811af0c4SBarry Smith   Note:
228811af0c4SBarry Smith   A `PETSCVIEWERDRAW` may have multiple `PetscDraw` subwindows
229811af0c4SBarry Smith 
230d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewerDrawGetDraw()`, `PetscViewerDrawGetLG()`, `PetscViewerDrawOpen()`
2315c6c1daeSBarry Smith @*/
232d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawGetDrawAxis(PetscViewer viewer, PetscInt windownumber, PetscDrawAxis *drawaxis)
233d71ae5a4SJacob Faibussowitsch {
2345c6c1daeSBarry Smith   PetscBool         isdraw;
235e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
2365c6c1daeSBarry Smith 
2375c6c1daeSBarry Smith   PetscFunctionBegin;
2385c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
239e5ab1681SLisandro Dalcin   PetscValidLogicalCollectiveInt(viewer, windownumber, 2);
2404f572ea9SToby Isaac   PetscAssertPointer(drawaxis, 3);
2419566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
24228b400f6SJacob Faibussowitsch   PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer");
24308401ef6SPierre Jolivet   PetscCheck(windownumber >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Window number cannot be negative");
244e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)viewer->data;
2455c6c1daeSBarry Smith 
24648a46eb9SPierre Jolivet   if (windownumber + vdraw->draw_base >= vdraw->draw_max || !vdraw->draw[windownumber + vdraw->draw_base]) PetscCall(PetscViewerDrawGetDraw(viewer, windownumber, NULL));
2474dfa11a4SJacob Faibussowitsch   if (!vdraw->drawaxis[windownumber + vdraw->draw_base]) PetscCall(PetscDrawAxisCreate(vdraw->draw[windownumber + vdraw->draw_base], &vdraw->drawaxis[windownumber + vdraw->draw_base]));
2485c6c1daeSBarry Smith   *drawaxis = vdraw->drawaxis[windownumber + vdraw->draw_base];
2493ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2505c6c1daeSBarry Smith }
2515c6c1daeSBarry Smith 
252d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawResize(PetscViewer v, int w, int h)
253d71ae5a4SJacob Faibussowitsch {
254e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
255e5ab1681SLisandro Dalcin   PetscBool         isdraw;
2565c6c1daeSBarry Smith 
2575c6c1daeSBarry Smith   PetscFunctionBegin;
258e5ab1681SLisandro Dalcin   PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1);
2599566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw));
2603ba16761SJacob Faibussowitsch   if (!isdraw) PetscFunctionReturn(PETSC_SUCCESS);
261e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)v->data;
262e5ab1681SLisandro Dalcin 
263e5ab1681SLisandro Dalcin   if (w >= 1) vdraw->w = w;
264e5ab1681SLisandro Dalcin   if (h >= 1) vdraw->h = h;
2653ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2665c6c1daeSBarry Smith }
2675c6c1daeSBarry Smith 
268d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawSetInfo(PetscViewer v, const char display[], const char title[], int x, int y, int w, int h)
269d71ae5a4SJacob Faibussowitsch {
270e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
271e5ab1681SLisandro Dalcin   PetscBool         isdraw;
2725c6c1daeSBarry Smith 
2735c6c1daeSBarry Smith   PetscFunctionBegin;
274e5ab1681SLisandro Dalcin   PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1);
2759566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw));
2763ba16761SJacob Faibussowitsch   if (!isdraw) PetscFunctionReturn(PETSC_SUCCESS);
277e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)v->data;
278e5ab1681SLisandro Dalcin 
2799566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(display, &vdraw->display));
2809566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(title, &vdraw->title));
281e5ab1681SLisandro Dalcin   if (w >= 1) vdraw->w = w;
282e5ab1681SLisandro Dalcin   if (h >= 1) vdraw->h = h;
2833ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
2845c6c1daeSBarry Smith }
2855c6c1daeSBarry Smith 
286d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawSetDrawType(PetscViewer v, PetscDrawType drawtype)
287d71ae5a4SJacob Faibussowitsch {
288e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
289e5ab1681SLisandro Dalcin   PetscBool         isdraw;
290d1da0b69SBarry Smith 
291d1da0b69SBarry Smith   PetscFunctionBegin;
292e5ab1681SLisandro Dalcin   PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1);
2939566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw));
2943ba16761SJacob Faibussowitsch   if (!isdraw) PetscFunctionReturn(PETSC_SUCCESS);
295e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)v->data;
296e5ab1681SLisandro Dalcin 
2979566063dSJacob Faibussowitsch   PetscCall(PetscFree(vdraw->drawtype));
2989566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(drawtype, (char **)&vdraw->drawtype));
2993ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
300d1da0b69SBarry Smith }
301d1da0b69SBarry Smith 
302d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawGetDrawType(PetscViewer v, PetscDrawType *drawtype)
303d71ae5a4SJacob Faibussowitsch {
3041f49e1f7SLisandro Dalcin   PetscViewer_Draw *vdraw;
3051f49e1f7SLisandro Dalcin   PetscBool         isdraw;
3061f49e1f7SLisandro Dalcin 
3071f49e1f7SLisandro Dalcin   PetscFunctionBegin;
3081f49e1f7SLisandro Dalcin   PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1);
3099566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw));
31028b400f6SJacob Faibussowitsch   PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer");
3111f49e1f7SLisandro Dalcin   vdraw = (PetscViewer_Draw *)v->data;
3121f49e1f7SLisandro Dalcin 
3131f49e1f7SLisandro Dalcin   *drawtype = vdraw->drawtype;
3143ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
3151f49e1f7SLisandro Dalcin }
3161f49e1f7SLisandro Dalcin 
317d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawSetTitle(PetscViewer v, const char title[])
318d71ae5a4SJacob Faibussowitsch {
319f55236e4SLisandro Dalcin   PetscViewer_Draw *vdraw;
320f55236e4SLisandro Dalcin   PetscBool         isdraw;
321f55236e4SLisandro Dalcin 
322f55236e4SLisandro Dalcin   PetscFunctionBegin;
323f55236e4SLisandro Dalcin   PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1);
3249566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw));
3253ba16761SJacob Faibussowitsch   if (!isdraw) PetscFunctionReturn(PETSC_SUCCESS);
326f55236e4SLisandro Dalcin   vdraw = (PetscViewer_Draw *)v->data;
327f55236e4SLisandro Dalcin 
3289566063dSJacob Faibussowitsch   PetscCall(PetscFree(vdraw->title));
3299566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(title, &vdraw->title));
3303ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
331f55236e4SLisandro Dalcin }
332f55236e4SLisandro Dalcin 
333d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawGetTitle(PetscViewer v, const char *title[])
334d71ae5a4SJacob Faibussowitsch {
335f55236e4SLisandro Dalcin   PetscViewer_Draw *vdraw;
336f55236e4SLisandro Dalcin   PetscBool         isdraw;
337f55236e4SLisandro Dalcin 
338f55236e4SLisandro Dalcin   PetscFunctionBegin;
339f55236e4SLisandro Dalcin   PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1);
3409566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw));
34128b400f6SJacob Faibussowitsch   PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer");
342f55236e4SLisandro Dalcin   vdraw = (PetscViewer_Draw *)v->data;
343f55236e4SLisandro Dalcin 
344f55236e4SLisandro Dalcin   *title = vdraw->title;
3453ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
346f55236e4SLisandro Dalcin }
347f55236e4SLisandro Dalcin 
3485c6c1daeSBarry Smith /*@C
34910450e9eSJacob Faibussowitsch   PetscViewerDrawOpen - Opens a `PetscDraw` window for use as a `PetscViewer` with type
35010450e9eSJacob Faibussowitsch   `PETSCVIEWERDRAW`.
3515c6c1daeSBarry Smith 
352d083f849SBarry Smith   Collective
3535c6c1daeSBarry Smith 
3545c6c1daeSBarry Smith   Input Parameters:
3555c6c1daeSBarry Smith + comm    - communicator that will share window
3563f423023SBarry Smith . display - the X display on which to open, or `NULL` for the local machine
3573f423023SBarry Smith . title   - the title to put in the title bar, or `NULL` for no title
358aaa8cc7dSPierre Jolivet . x       - horizontal screen coordinate of the upper left corner of window, or use `PETSC_DECIDE`
3592fe279fdSBarry Smith . y       - vertical screen coordinate of the upper left corner of window, or use `PETSC_DECIDE`
3602fe279fdSBarry 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`
3612fe279fdSBarry 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`
3625c6c1daeSBarry Smith 
363f899ff85SJose E. Roman   Output Parameter:
364811af0c4SBarry Smith . viewer - the `PetscViewer`
3655c6c1daeSBarry Smith 
3665c6c1daeSBarry Smith   Options Database Keys:
36710699b91SBarry Smith + -draw_type          - use x or null
3685c6c1daeSBarry Smith . -nox                - Disables all x-windows output
3695c6c1daeSBarry Smith . -display <name>     - Specifies name of machine for the X display
3705c6c1daeSBarry Smith . -geometry <x,y,w,h> - allows setting the window location and size
3715c6c1daeSBarry Smith - -draw_pause <pause> - Sets time (in seconds) that the
3725c6c1daeSBarry Smith      program pauses after PetscDrawPause() has been called
3735c6c1daeSBarry Smith      (0 is default, -1 implies until user input).
3745c6c1daeSBarry Smith 
3755c6c1daeSBarry Smith   Level: beginner
3765c6c1daeSBarry Smith 
37710450e9eSJacob Faibussowitsch   Notes:
37810450e9eSJacob Faibussowitsch   If you want to do graphics in this window, you must call `PetscViewerDrawGetDraw()` and
37910450e9eSJacob Faibussowitsch   perform the graphics on the `PetscDraw` object.
38010450e9eSJacob Faibussowitsch 
38110450e9eSJacob Faibussowitsch   Format options include\:
38210450e9eSJacob Faibussowitsch + `PETSC_VIEWER_DRAW_BASIC` - displays with basic format
38310450e9eSJacob Faibussowitsch - `PETSC_VIEWER_DRAW_LG`    - displays using a line graph
38410450e9eSJacob Faibussowitsch 
385aec76313SJacob Faibussowitsch   Fortran Notes:
3865c6c1daeSBarry Smith   Whenever indicating null character data in a Fortran code,
387811af0c4SBarry Smith   `PETSC_NULL_CHARACTER` must be employed; using NULL is not
388811af0c4SBarry Smith   correct for character data!  Thus, `PETSC_NULL_CHARACTER` can be
3895c6c1daeSBarry Smith   used for the display and title input parameters.
3905c6c1daeSBarry Smith 
391d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscDrawCreate()`, `PetscViewerDestroy()`, `PetscViewerDrawGetDraw()`, `PetscViewerCreate()`, `PETSC_VIEWER_DRAW_`,
392db781477SPatrick Sanan           `PETSC_VIEWER_DRAW_WORLD`, `PETSC_VIEWER_DRAW_SELF`
3935c6c1daeSBarry Smith @*/
394d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawOpen(MPI_Comm comm, const char display[], const char title[], int x, int y, int w, int h, PetscViewer *viewer)
395d71ae5a4SJacob Faibussowitsch {
3965c6c1daeSBarry Smith   PetscFunctionBegin;
3979566063dSJacob Faibussowitsch   PetscCall(PetscViewerCreate(comm, viewer));
3989566063dSJacob Faibussowitsch   PetscCall(PetscViewerSetType(*viewer, PETSCVIEWERDRAW));
3999566063dSJacob Faibussowitsch   PetscCall(PetscViewerDrawSetInfo(*viewer, display, title, x, y, w, h));
4003ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4015c6c1daeSBarry Smith }
4025c6c1daeSBarry Smith 
403a9db196aSBarry Smith #include <petsc/private/drawimpl.h>
404a9db196aSBarry Smith 
405*34e79e72SJacob Faibussowitsch static PetscErrorCode PetscViewerGetSubViewer_Draw(PetscViewer viewer, MPI_Comm comm, PetscViewer *sviewer)
406d71ae5a4SJacob Faibussowitsch {
4075c6c1daeSBarry Smith   PetscMPIInt       rank;
4085c6c1daeSBarry Smith   PetscInt          i;
409c6228bbaSLisandro Dalcin   PetscViewer_Draw *vdraw = (PetscViewer_Draw *)viewer->data, *svdraw;
4105c6c1daeSBarry Smith 
4115c6c1daeSBarry Smith   PetscFunctionBegin;
41228b400f6SJacob Faibussowitsch   PetscCheck(!vdraw->singleton_made, PETSC_COMM_SELF, PETSC_ERR_ORDER, "Trying to get SubViewer without first restoring previous");
4135c6c1daeSBarry Smith   /* only processor zero can use the PetscViewer draw singleton */
414fefe69c3SStefano Zampini   if (sviewer) *sviewer = NULL;
4159566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)viewer), &rank));
416dd400576SPatrick Sanan   if (rank == 0) {
417e5afcf28SBarry Smith     PetscMPIInt flg;
418a9db196aSBarry Smith     PetscDraw   draw, sdraw;
419e5afcf28SBarry Smith 
4209566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_compare(PETSC_COMM_SELF, comm, &flg));
421cc73adaaSBarry Smith     PetscCheck(flg == MPI_IDENT || flg == MPI_CONGRUENT, PETSC_COMM_SELF, PETSC_ERR_SUP, "PetscViewerGetSubViewer() for PETSCVIEWERDRAW requires a singleton MPI_Comm");
4229566063dSJacob Faibussowitsch     PetscCall(PetscViewerCreate(comm, sviewer));
4239566063dSJacob Faibussowitsch     PetscCall(PetscViewerSetType(*sviewer, PETSCVIEWERDRAW));
424c6228bbaSLisandro Dalcin     svdraw             = (PetscViewer_Draw *)(*sviewer)->data;
425c6228bbaSLisandro Dalcin     (*sviewer)->format = viewer->format;
426c6228bbaSLisandro Dalcin     for (i = 0; i < vdraw->draw_max; i++) { /* XXX this is wrong if svdraw->draw_max (initially 5) < vdraw->draw_max */
4279566063dSJacob Faibussowitsch       if (vdraw->draw[i]) PetscCall(PetscDrawGetSingleton(vdraw->draw[i], &svdraw->draw[i]));
4285c6c1daeSBarry Smith     }
4299566063dSJacob Faibussowitsch     PetscCall(PetscViewerDrawGetDraw(viewer, 0, &draw));
4309566063dSJacob Faibussowitsch     PetscCall(PetscViewerDrawGetDraw(*sviewer, 0, &sdraw));
431a9db196aSBarry Smith     if (draw->savefilename) {
4329566063dSJacob Faibussowitsch       PetscCall(PetscDrawSetSave(sdraw, draw->savefilename));
433a9db196aSBarry Smith       sdraw->savefilecount  = draw->savefilecount;
434a9db196aSBarry Smith       sdraw->savesinglefile = draw->savesinglefile;
435a9db196aSBarry Smith       sdraw->savemoviefps   = draw->savemoviefps;
436a9db196aSBarry Smith       sdraw->saveonclear    = draw->saveonclear;
437a9db196aSBarry Smith       sdraw->saveonflush    = draw->saveonflush;
438a9db196aSBarry Smith     }
4399566063dSJacob Faibussowitsch     if (draw->savefinalfilename) PetscCall(PetscDrawSetSaveFinalImage(sdraw, draw->savefinalfilename));
440a9db196aSBarry Smith   } else {
441a9db196aSBarry Smith     PetscDraw draw;
4429566063dSJacob Faibussowitsch     PetscCall(PetscViewerDrawGetDraw(viewer, 0, &draw));
4435c6c1daeSBarry Smith   }
4445c6c1daeSBarry Smith   vdraw->singleton_made = PETSC_TRUE;
4453ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4465c6c1daeSBarry Smith }
4475c6c1daeSBarry Smith 
448*34e79e72SJacob Faibussowitsch static PetscErrorCode PetscViewerRestoreSubViewer_Draw(PetscViewer viewer, MPI_Comm comm, PetscViewer *sviewer)
449d71ae5a4SJacob Faibussowitsch {
4505c6c1daeSBarry Smith   PetscMPIInt       rank;
4515c6c1daeSBarry Smith   PetscInt          i;
452c6228bbaSLisandro Dalcin   PetscViewer_Draw *vdraw = (PetscViewer_Draw *)viewer->data, *svdraw;
4535c6c1daeSBarry Smith 
4545c6c1daeSBarry Smith   PetscFunctionBegin;
45528b400f6SJacob Faibussowitsch   PetscCheck(vdraw->singleton_made, PETSC_COMM_SELF, PETSC_ERR_ORDER, "Trying to restore a singleton that was not gotten");
4569566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)viewer), &rank));
457dd400576SPatrick Sanan   if (rank == 0) {
458a9db196aSBarry Smith     PetscDraw draw, sdraw;
459a9db196aSBarry Smith 
4609566063dSJacob Faibussowitsch     PetscCall(PetscViewerDrawGetDraw(viewer, 0, &draw));
4619566063dSJacob Faibussowitsch     PetscCall(PetscViewerDrawGetDraw(*sviewer, 0, &sdraw));
462a9db196aSBarry Smith     if (draw->savefilename) {
463a9db196aSBarry Smith       draw->savefilecount = sdraw->savefilecount;
4649566063dSJacob Faibussowitsch       PetscCallMPI(MPI_Bcast(&draw->savefilecount, 1, MPIU_INT, 0, PetscObjectComm((PetscObject)draw)));
465a9db196aSBarry Smith     }
466c6228bbaSLisandro Dalcin     svdraw = (PetscViewer_Draw *)(*sviewer)->data;
4675c6c1daeSBarry Smith     for (i = 0; i < vdraw->draw_max; i++) {
46848a46eb9SPierre Jolivet       if (vdraw->draw[i] && svdraw->draw[i]) PetscCall(PetscDrawRestoreSingleton(vdraw->draw[i], &svdraw->draw[i]));
4695c6c1daeSBarry Smith     }
4709566063dSJacob Faibussowitsch     PetscCall(PetscFree3(svdraw->draw, svdraw->drawlg, svdraw->drawaxis));
4719566063dSJacob Faibussowitsch     PetscCall(PetscFree((*sviewer)->data));
4729566063dSJacob Faibussowitsch     PetscCall(PetscHeaderDestroy(sviewer));
473a9db196aSBarry Smith   } else {
474a9db196aSBarry Smith     PetscDraw draw;
475a9db196aSBarry Smith 
4769566063dSJacob Faibussowitsch     PetscCall(PetscViewerDrawGetDraw(viewer, 0, &draw));
47748a46eb9SPierre Jolivet     if (draw->savefilename) PetscCallMPI(MPI_Bcast(&draw->savefilecount, 1, MPIU_INT, 0, PetscObjectComm((PetscObject)draw)));
478a9db196aSBarry Smith   }
479a9db196aSBarry Smith 
4805c6c1daeSBarry Smith   vdraw->singleton_made = PETSC_FALSE;
4813ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
4825c6c1daeSBarry Smith }
4835c6c1daeSBarry Smith 
484*34e79e72SJacob Faibussowitsch static PetscErrorCode PetscViewerSetFromOptions_Draw(PetscViewer v, PetscOptionItems *PetscOptionsObject)
485d71ae5a4SJacob Faibussowitsch {
486e9457bf7SBarry Smith   PetscReal bounds[16];
487e9457bf7SBarry Smith   PetscInt  nbounds = 16;
488e9457bf7SBarry Smith   PetscBool flg;
489e9457bf7SBarry Smith 
490e9457bf7SBarry Smith   PetscFunctionBegin;
491d0609cedSBarry Smith   PetscOptionsHeadBegin(PetscOptionsObject, "Draw PetscViewer Options");
4929566063dSJacob Faibussowitsch   PetscCall(PetscOptionsRealArray("-draw_bounds", "Bounds to put on plots axis", "PetscViewerDrawSetBounds", bounds, &nbounds, &flg));
49348a46eb9SPierre Jolivet   if (flg) PetscCall(PetscViewerDrawSetBounds(v, nbounds / 2, bounds));
494d0609cedSBarry Smith   PetscOptionsHeadEnd();
4953ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
496e9457bf7SBarry Smith }
497e9457bf7SBarry Smith 
498*34e79e72SJacob Faibussowitsch static PetscErrorCode PetscViewerView_Draw(PetscViewer viewer, PetscViewer v)
499d71ae5a4SJacob Faibussowitsch {
5000076e027SBarry Smith   PetscDraw         draw;
5010076e027SBarry Smith   PetscInt          i;
5020076e027SBarry Smith   PetscViewer_Draw *vdraw = (PetscViewer_Draw *)viewer->data;
503ccb5f961SBarry Smith   PetscBool         iascii;
5040076e027SBarry Smith 
5050076e027SBarry Smith   PetscFunctionBegin;
506ccb5f961SBarry Smith   PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERASCII, &iascii));
507ccb5f961SBarry Smith   if (iascii) PetscCall(PetscViewerASCIIPrintf(v, "Draw viewer is of type %s\n", vdraw->drawtype));
5080076e027SBarry Smith   /*  If the PetscViewer has just been created then no vdraw->draw yet
5090076e027SBarry Smith       exists so this will not actually call the viewer on any draws. */
5100076e027SBarry Smith   for (i = 0; i < vdraw->draw_base; i++) {
5110076e027SBarry Smith     if (vdraw->draw[i]) {
5129566063dSJacob Faibussowitsch       PetscCall(PetscViewerDrawGetDraw(viewer, i, &draw));
5139566063dSJacob Faibussowitsch       PetscCall(PetscDrawView(draw, v));
5140076e027SBarry Smith     }
5150076e027SBarry Smith   }
5163ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
5170076e027SBarry Smith }
5180076e027SBarry Smith 
5198556b5ebSBarry Smith /*MC
5208556b5ebSBarry Smith    PETSCVIEWERDRAW - A viewer that generates graphics, either to the screen or a file
5218556b5ebSBarry Smith 
522811af0c4SBarry Smith   Level: beginner
523811af0c4SBarry Smith 
524d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`, `PETSC_VIEWER_DRAW_()`, `PETSC_VIEWER_DRAW_SELF`, `PETSC_VIEWER_DRAW_WORLD`,
525db781477SPatrick Sanan           `PetscViewerCreate()`, `PetscViewerASCIIOpen()`, `PetscViewerBinaryOpen()`, `PETSCVIEWERBINARY`,
526db781477SPatrick Sanan           `PetscViewerMatlabOpen()`, `VecView()`, `DMView()`, `PetscViewerMatlabPutArray()`, `PETSCVIEWERASCII`, `PETSCVIEWERMATLAB`,
527db781477SPatrick Sanan           `PetscViewerFileSetName()`, `PetscViewerFileSetMode()`, `PetscViewerFormat`, `PetscViewerType`, `PetscViewerSetType()`
5288556b5ebSBarry Smith M*/
529d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscViewerCreate_Draw(PetscViewer viewer)
530d71ae5a4SJacob Faibussowitsch {
5315c6c1daeSBarry Smith   PetscViewer_Draw *vdraw;
5325c6c1daeSBarry Smith 
5335c6c1daeSBarry Smith   PetscFunctionBegin;
5344dfa11a4SJacob Faibussowitsch   PetscCall(PetscNew(&vdraw));
5355c6c1daeSBarry Smith   viewer->data = (void *)vdraw;
5365c6c1daeSBarry Smith 
5375c6c1daeSBarry Smith   viewer->ops->flush            = PetscViewerFlush_Draw;
5380076e027SBarry Smith   viewer->ops->view             = PetscViewerView_Draw;
5395c6c1daeSBarry Smith   viewer->ops->destroy          = PetscViewerDestroy_Draw;
540e9457bf7SBarry Smith   viewer->ops->setfromoptions   = PetscViewerSetFromOptions_Draw;
541559f443fSBarry Smith   viewer->ops->getsubviewer     = PetscViewerGetSubViewer_Draw;
542559f443fSBarry Smith   viewer->ops->restoresubviewer = PetscViewerRestoreSubViewer_Draw;
5435c6c1daeSBarry Smith 
5445c6c1daeSBarry Smith   /* these are created on the fly if requested */
5455c6c1daeSBarry Smith   vdraw->draw_max  = 5;
5465c6c1daeSBarry Smith   vdraw->draw_base = 0;
547ccad63c3SBarry Smith   vdraw->w         = PETSC_DECIDE;
548ccad63c3SBarry Smith   vdraw->h         = PETSC_DECIDE;
549a297a907SKarl Rupp 
5509566063dSJacob Faibussowitsch   PetscCall(PetscCalloc3(vdraw->draw_max, &vdraw->draw, vdraw->draw_max, &vdraw->drawlg, vdraw->draw_max, &vdraw->drawaxis));
5515c6c1daeSBarry Smith   vdraw->singleton_made = PETSC_FALSE;
5523ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
5535c6c1daeSBarry Smith }
5545c6c1daeSBarry Smith 
5555c6c1daeSBarry Smith /*@
556811af0c4SBarry Smith   PetscViewerDrawClear - Clears a `PetscDraw` graphic associated with a `PetscViewer`.
5575c6c1daeSBarry Smith 
5585c6c1daeSBarry Smith   Not Collective
5595c6c1daeSBarry Smith 
5605c6c1daeSBarry Smith   Input Parameter:
561811af0c4SBarry Smith . viewer - the `PetscViewer`
5625c6c1daeSBarry Smith 
5635c6c1daeSBarry Smith   Level: intermediate
5645c6c1daeSBarry Smith 
565d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`,
5665c6c1daeSBarry Smith @*/
567d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawClear(PetscViewer viewer)
568d71ae5a4SJacob Faibussowitsch {
5695c6c1daeSBarry Smith   PetscViewer_Draw *vdraw;
570e5ab1681SLisandro Dalcin   PetscBool         isdraw;
571e5ab1681SLisandro Dalcin   PetscInt          i;
5725c6c1daeSBarry Smith 
5735c6c1daeSBarry Smith   PetscFunctionBegin;
574e5ab1681SLisandro Dalcin   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
5759566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
5763ba16761SJacob Faibussowitsch   if (!isdraw) PetscFunctionReturn(PETSC_SUCCESS);
5775c6c1daeSBarry Smith   vdraw = (PetscViewer_Draw *)viewer->data;
578e5ab1681SLisandro Dalcin 
5795c6c1daeSBarry Smith   for (i = 0; i < vdraw->draw_max; i++) {
5809566063dSJacob Faibussowitsch     if (vdraw->draw[i]) PetscCall(PetscDrawClear(vdraw->draw[i]));
5815c6c1daeSBarry Smith   }
5823ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
5835c6c1daeSBarry Smith }
5845c6c1daeSBarry Smith 
5855c6c1daeSBarry Smith /*@
586811af0c4SBarry Smith   PetscViewerDrawGetPause - Gets the pause value (how long to pause before an image is changed)  in the `PETSCVIEWERDRAW` `PetscViewer`
5875c6c1daeSBarry Smith 
5885c6c1daeSBarry Smith   Not Collective
5895c6c1daeSBarry Smith 
5905c6c1daeSBarry Smith   Input Parameter:
591811af0c4SBarry Smith . viewer - the `PetscViewer`
5925c6c1daeSBarry Smith 
5935c6c1daeSBarry Smith   Output Parameter:
5945c6c1daeSBarry Smith . pause - the pause value
5955c6c1daeSBarry Smith 
5965c6c1daeSBarry Smith   Level: intermediate
5975c6c1daeSBarry Smith 
598d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`,
5995c6c1daeSBarry Smith @*/
600d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawGetPause(PetscViewer viewer, PetscReal *pause)
601d71ae5a4SJacob Faibussowitsch {
6025c6c1daeSBarry Smith   PetscViewer_Draw *vdraw;
603e5ab1681SLisandro Dalcin   PetscBool         isdraw;
604e5ab1681SLisandro Dalcin   PetscInt          i;
6055c6c1daeSBarry Smith   PetscDraw         draw;
6065c6c1daeSBarry Smith 
6075c6c1daeSBarry Smith   PetscFunctionBegin;
608e5ab1681SLisandro Dalcin   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
6099566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
6109371c9d4SSatish Balay   if (!isdraw) {
6119371c9d4SSatish Balay     *pause = 0.0;
6123ba16761SJacob Faibussowitsch     PetscFunctionReturn(PETSC_SUCCESS);
6139371c9d4SSatish Balay   }
6145c6c1daeSBarry Smith   vdraw = (PetscViewer_Draw *)viewer->data;
615e5ab1681SLisandro Dalcin 
6165c6c1daeSBarry Smith   for (i = 0; i < vdraw->draw_max; i++) {
6175c6c1daeSBarry Smith     if (vdraw->draw[i]) {
6189566063dSJacob Faibussowitsch       PetscCall(PetscDrawGetPause(vdraw->draw[i], pause));
6193ba16761SJacob Faibussowitsch       PetscFunctionReturn(PETSC_SUCCESS);
6205c6c1daeSBarry Smith     }
6215c6c1daeSBarry Smith   }
6225c6c1daeSBarry Smith   /* none exist yet so create one and get its pause */
6239566063dSJacob Faibussowitsch   PetscCall(PetscViewerDrawGetDraw(viewer, 0, &draw));
6249566063dSJacob Faibussowitsch   PetscCall(PetscDrawGetPause(draw, pause));
6253ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
6265c6c1daeSBarry Smith }
6275c6c1daeSBarry Smith 
6285c6c1daeSBarry Smith /*@
629811af0c4SBarry Smith   PetscViewerDrawSetPause - Sets a pause for each `PetscDraw` in the `PETSCVIEWERDRAW` `PetscViewer`
6305c6c1daeSBarry Smith 
6315c6c1daeSBarry Smith   Not Collective
6325c6c1daeSBarry Smith 
6335c6c1daeSBarry Smith   Input Parameters:
634811af0c4SBarry Smith + viewer - the `PetscViewer`
6355c6c1daeSBarry Smith - pause  - the pause value
6365c6c1daeSBarry Smith 
6375c6c1daeSBarry Smith   Level: intermediate
6385c6c1daeSBarry Smith 
639d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`,
6405c6c1daeSBarry Smith @*/
641d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawSetPause(PetscViewer viewer, PetscReal pause)
642d71ae5a4SJacob Faibussowitsch {
643e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
6445c6c1daeSBarry Smith   PetscBool         isdraw;
645e5ab1681SLisandro Dalcin   PetscInt          i;
6465c6c1daeSBarry Smith 
6475c6c1daeSBarry Smith   PetscFunctionBegin;
648e5ab1681SLisandro Dalcin   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
6499566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
6503ba16761SJacob Faibussowitsch   if (!isdraw) PetscFunctionReturn(PETSC_SUCCESS);
651e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)viewer->data;
652afe78b3cSBarry Smith 
653afe78b3cSBarry Smith   vdraw->pause = pause;
6545c6c1daeSBarry Smith   for (i = 0; i < vdraw->draw_max; i++) {
6559566063dSJacob Faibussowitsch     if (vdraw->draw[i]) PetscCall(PetscDrawSetPause(vdraw->draw[i], pause));
6565c6c1daeSBarry Smith   }
6573ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
6585c6c1daeSBarry Smith }
6595c6c1daeSBarry Smith 
6605c6c1daeSBarry Smith /*@
661c410d8ccSBarry Smith   PetscViewerDrawSetHold - Holds previous image when drawing new image in a `PETSCVIEWERDRAW`
6625c6c1daeSBarry Smith 
6635c6c1daeSBarry Smith   Not Collective
6645c6c1daeSBarry Smith 
6655c6c1daeSBarry Smith   Input Parameters:
666811af0c4SBarry Smith + viewer - the `PetscViewer`
667811af0c4SBarry Smith - hold   - `PETSC_TRUE` indicates to hold the previous image
6685c6c1daeSBarry Smith 
6695c6c1daeSBarry Smith   Level: intermediate
6705c6c1daeSBarry Smith 
671d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`,
6725c6c1daeSBarry Smith @*/
673d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawSetHold(PetscViewer viewer, PetscBool hold)
674d71ae5a4SJacob Faibussowitsch {
6755c6c1daeSBarry Smith   PetscViewer_Draw *vdraw;
6765c6c1daeSBarry Smith   PetscBool         isdraw;
6775c6c1daeSBarry Smith 
6785c6c1daeSBarry Smith   PetscFunctionBegin;
679e5ab1681SLisandro Dalcin   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
6809566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
6813ba16761SJacob Faibussowitsch   if (!isdraw) PetscFunctionReturn(PETSC_SUCCESS);
6825c6c1daeSBarry Smith   vdraw = (PetscViewer_Draw *)viewer->data;
683e5ab1681SLisandro Dalcin 
6845c6c1daeSBarry Smith   vdraw->hold = hold;
6853ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
6865c6c1daeSBarry Smith }
6875c6c1daeSBarry Smith 
6885c6c1daeSBarry Smith /*@
689811af0c4SBarry Smith   PetscViewerDrawGetHold - Checks if the `PETSCVIEWERDRAW` `PetscViewer` holds previous image when drawing new image
6905c6c1daeSBarry Smith 
6915c6c1daeSBarry Smith   Not Collective
6925c6c1daeSBarry Smith 
6935c6c1daeSBarry Smith   Input Parameter:
694811af0c4SBarry Smith . viewer - the `PetscViewer`
6955c6c1daeSBarry Smith 
6965c6c1daeSBarry Smith   Output Parameter:
6975c6c1daeSBarry Smith . hold - indicates to hold or not
6985c6c1daeSBarry Smith 
6995c6c1daeSBarry Smith   Level: intermediate
7005c6c1daeSBarry Smith 
701d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`,
7025c6c1daeSBarry Smith @*/
703d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawGetHold(PetscViewer viewer, PetscBool *hold)
704d71ae5a4SJacob Faibussowitsch {
7055c6c1daeSBarry Smith   PetscViewer_Draw *vdraw;
7065c6c1daeSBarry Smith   PetscBool         isdraw;
7075c6c1daeSBarry Smith 
7085c6c1daeSBarry Smith   PetscFunctionBegin;
709e5ab1681SLisandro Dalcin   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
7109566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
7119371c9d4SSatish Balay   if (!isdraw) {
7129371c9d4SSatish Balay     *hold = PETSC_FALSE;
7133ba16761SJacob Faibussowitsch     PetscFunctionReturn(PETSC_SUCCESS);
7149371c9d4SSatish Balay   }
7155c6c1daeSBarry Smith   vdraw = (PetscViewer_Draw *)viewer->data;
716e5ab1681SLisandro Dalcin 
7175c6c1daeSBarry Smith   *hold = vdraw->hold;
7183ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
7195c6c1daeSBarry Smith }
7205c6c1daeSBarry Smith 
7215c6c1daeSBarry Smith /*
7225c6c1daeSBarry Smith     The variable Petsc_Viewer_Draw_keyval is used to indicate an MPI attribute that
7235c6c1daeSBarry Smith   is attached to a communicator, in this case the attribute is a PetscViewer.
7245c6c1daeSBarry Smith */
725d4c7638eSBarry Smith PetscMPIInt Petsc_Viewer_Draw_keyval = MPI_KEYVAL_INVALID;
7265c6c1daeSBarry Smith 
7275c6c1daeSBarry Smith /*@C
728811af0c4SBarry Smith     PETSC_VIEWER_DRAW_ - Creates a window `PETSCVIEWERDRAW` `PetscViewer` shared by all processors
729c410d8ccSBarry Smith                      in an MPI communicator.
7305c6c1daeSBarry Smith 
731d083f849SBarry Smith      Collective
7325c6c1daeSBarry Smith 
7335c6c1daeSBarry Smith      Input Parameter:
734811af0c4SBarry Smith .    comm - the MPI communicator to share the window `PetscViewer`
7355c6c1daeSBarry Smith 
7365c6c1daeSBarry Smith      Level: intermediate
7375c6c1daeSBarry Smith 
738811af0c4SBarry Smith      Note:
739811af0c4SBarry Smith      Unlike almost all other PETSc routines, `PETSC_VIEWER_DRAW_()` does not return
7405c6c1daeSBarry Smith      an error code.  The window is usually used in the form
7415c6c1daeSBarry Smith $       XXXView(XXX object, PETSC_VIEWER_DRAW_(comm));
7425c6c1daeSBarry Smith 
743d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscViewer`, `PETSC_VIEWER_DRAW_WORLD`, `PETSC_VIEWER_DRAW_SELF`, `PetscViewerDrawOpen()`,
7445c6c1daeSBarry Smith @*/
745d71ae5a4SJacob Faibussowitsch PetscViewer PETSC_VIEWER_DRAW_(MPI_Comm comm)
746d71ae5a4SJacob Faibussowitsch {
7475c6c1daeSBarry Smith   PetscErrorCode ierr;
7483ba16761SJacob Faibussowitsch   PetscMPIInt    flag, mpi_ierr;
7495c6c1daeSBarry Smith   PetscViewer    viewer;
7505c6c1daeSBarry Smith   MPI_Comm       ncomm;
7515c6c1daeSBarry Smith 
7525c6c1daeSBarry Smith   PetscFunctionBegin;
7539371c9d4SSatish Balay   ierr = PetscCommDuplicate(comm, &ncomm, NULL);
7549371c9d4SSatish Balay   if (ierr) {
7553ba16761SJacob Faibussowitsch     ierr = PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_DRAW_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_INITIAL, " ");
7569371c9d4SSatish Balay     PetscFunctionReturn(NULL);
7579371c9d4SSatish Balay   }
7585c6c1daeSBarry Smith   if (Petsc_Viewer_Draw_keyval == MPI_KEYVAL_INVALID) {
7593ba16761SJacob Faibussowitsch     mpi_ierr = MPI_Comm_create_keyval(MPI_COMM_NULL_COPY_FN, MPI_COMM_NULL_DELETE_FN, &Petsc_Viewer_Draw_keyval, NULL);
7603ba16761SJacob Faibussowitsch     if (mpi_ierr) {
7613ba16761SJacob Faibussowitsch       ierr = PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_DRAW_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_INITIAL, " ");
7629371c9d4SSatish Balay       PetscFunctionReturn(NULL);
7639371c9d4SSatish Balay     }
7645c6c1daeSBarry Smith   }
7653ba16761SJacob Faibussowitsch   mpi_ierr = MPI_Comm_get_attr(ncomm, Petsc_Viewer_Draw_keyval, (void **)&viewer, &flag);
7663ba16761SJacob Faibussowitsch   if (mpi_ierr) {
7673ba16761SJacob Faibussowitsch     ierr = PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_DRAW_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_INITIAL, " ");
7689371c9d4SSatish Balay     PetscFunctionReturn(NULL);
7699371c9d4SSatish Balay   }
7705c6c1daeSBarry Smith   if (!flag) { /* PetscViewer not yet created */
77102c9f0b5SLisandro Dalcin     ierr = PetscViewerDrawOpen(ncomm, NULL, NULL, PETSC_DECIDE, PETSC_DECIDE, 300, 300, &viewer);
7729371c9d4SSatish Balay     if (ierr) {
7733ba16761SJacob Faibussowitsch       ierr = PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_DRAW_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_REPEAT, " ");
7749371c9d4SSatish Balay       PetscFunctionReturn(NULL);
7759371c9d4SSatish Balay     }
7765c6c1daeSBarry Smith     ierr = PetscObjectRegisterDestroy((PetscObject)viewer);
7779371c9d4SSatish Balay     if (ierr) {
7783ba16761SJacob Faibussowitsch       ierr = PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_DRAW_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_REPEAT, " ");
7799371c9d4SSatish Balay       PetscFunctionReturn(NULL);
7809371c9d4SSatish Balay     }
7813ba16761SJacob Faibussowitsch     mpi_ierr = MPI_Comm_set_attr(ncomm, Petsc_Viewer_Draw_keyval, (void *)viewer);
7823ba16761SJacob Faibussowitsch     if (mpi_ierr) {
7833ba16761SJacob Faibussowitsch       ierr = PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_DRAW_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_INITIAL, " ");
7849371c9d4SSatish Balay       PetscFunctionReturn(NULL);
7859371c9d4SSatish Balay     }
7865c6c1daeSBarry Smith   }
7875c6c1daeSBarry Smith   ierr = PetscCommDestroy(&ncomm);
7889371c9d4SSatish Balay   if (ierr) {
7893ba16761SJacob Faibussowitsch     ierr = PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_DRAW_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_REPEAT, " ");
7909371c9d4SSatish Balay     PetscFunctionReturn(NULL);
7919371c9d4SSatish Balay   }
7925c6c1daeSBarry Smith   PetscFunctionReturn(viewer);
7935c6c1daeSBarry Smith }
7945c6c1daeSBarry Smith 
7955c6c1daeSBarry Smith /*@
796c410d8ccSBarry Smith   PetscViewerDrawSetBounds - sets the upper and lower bounds to be used in plotting in a `PETSCVIEWERDRAW` `PetscViewer`
7975c6c1daeSBarry Smith 
798c3339decSBarry Smith   Collective
7995c6c1daeSBarry Smith 
8005c6c1daeSBarry Smith   Input Parameters:
801811af0c4SBarry Smith + viewer  - the Petsc`Viewer` (created with `PetscViewerDrawOpen()`)
802811af0c4SBarry Smith . nbounds - number of plots that can be made with this viewer, for example the dof passed to `DMDACreate()`
803c410d8ccSBarry 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, .....
8045c6c1daeSBarry Smith 
805811af0c4SBarry Smith   Options Database Key:
80610699b91SBarry Smith . -draw_bounds  minF0,maxF0,minF1,maxF1 - the lower left and upper right bounds
807e9457bf7SBarry Smith 
8085c6c1daeSBarry Smith   Level: intermediate
8095c6c1daeSBarry Smith 
810811af0c4SBarry Smith   Note:
811811af0c4SBarry 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
812f3f0eb19SBarry 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
813f3f0eb19SBarry Smith   this viewer. Otherwise the color to physical value meaning changes with each new image if this is not set.
814f3f0eb19SBarry Smith 
815d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscViewerDrawGetLG()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()`
8165c6c1daeSBarry Smith @*/
817d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawSetBounds(PetscViewer viewer, PetscInt nbounds, const PetscReal *bounds)
818d71ae5a4SJacob Faibussowitsch {
819e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
820e5ab1681SLisandro Dalcin   PetscBool         isdraw;
8215c6c1daeSBarry Smith 
8225c6c1daeSBarry Smith   PetscFunctionBegin;
8235c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
8249566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
8253ba16761SJacob Faibussowitsch   if (!isdraw) PetscFunctionReturn(PETSC_SUCCESS);
826e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)viewer->data;
827a297a907SKarl Rupp 
828e5ab1681SLisandro Dalcin   vdraw->nbounds = nbounds;
8299566063dSJacob Faibussowitsch   PetscCall(PetscFree(vdraw->bounds));
8309566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(2 * nbounds, &vdraw->bounds));
8319566063dSJacob Faibussowitsch   PetscCall(PetscArraycpy(vdraw->bounds, bounds, 2 * nbounds));
8323ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
8335c6c1daeSBarry Smith }
8345c6c1daeSBarry Smith 
8355c6c1daeSBarry Smith /*@C
836811af0c4SBarry Smith   PetscViewerDrawGetBounds - gets the upper and lower bounds to be used in plotting set with `PetscViewerDrawSetBounds()`
8375c6c1daeSBarry Smith 
838c3339decSBarry Smith   Collective
8395c6c1daeSBarry Smith 
8405c6c1daeSBarry Smith   Input Parameter:
841811af0c4SBarry Smith . viewer - the `PetscViewer` (created with `PetscViewerDrawOpen()`)
8425c6c1daeSBarry Smith 
843fd292e60Sprj-   Output Parameters:
844811af0c4SBarry Smith + nbounds - number of plots that can be made with this viewer, for example the dof passed to `DMDACreate()`
845c410d8ccSBarry 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, .....
8465c6c1daeSBarry Smith 
8475c6c1daeSBarry Smith   Level: intermediate
8485c6c1daeSBarry Smith 
849d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscViewerDrawGetLG()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()`, `PetscViewerDrawSetBounds()`
8505c6c1daeSBarry Smith @*/
851d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawGetBounds(PetscViewer viewer, PetscInt *nbounds, const PetscReal **bounds)
852d71ae5a4SJacob Faibussowitsch {
853e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
854e5ab1681SLisandro Dalcin   PetscBool         isdraw;
8555c6c1daeSBarry Smith 
8565c6c1daeSBarry Smith   PetscFunctionBegin;
8575c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
8589566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
8599371c9d4SSatish Balay   if (!isdraw) {
8609371c9d4SSatish Balay     if (nbounds) *nbounds = 0;
8619371c9d4SSatish Balay     if (bounds) *bounds = NULL;
8623ba16761SJacob Faibussowitsch     PetscFunctionReturn(PETSC_SUCCESS);
8639371c9d4SSatish Balay   }
864e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)viewer->data;
865e5ab1681SLisandro Dalcin 
866e5ab1681SLisandro Dalcin   if (nbounds) *nbounds = vdraw->nbounds;
867e5ab1681SLisandro Dalcin   if (bounds) *bounds = vdraw->bounds;
8683ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
8695c6c1daeSBarry Smith }
870