xref: /petsc/src/sys/classes/viewer/impls/draw/drawv.c (revision 48a46eb9bd028bec07ec0f396b1a3abb43f14558)
15c6c1daeSBarry Smith 
25c6c1daeSBarry Smith #include <../src/sys/classes/viewer/impls/draw/vdraw.h> /*I "petscdraw.h" I*/
3665c2dedSJed Brown #include <petscviewer.h>                                /*I "petscviewer.h" I*/
45c6c1daeSBarry Smith 
59371c9d4SSatish Balay static PetscErrorCode PetscViewerDestroy_Draw(PetscViewer v) {
65c6c1daeSBarry Smith   PetscInt          i;
75c6c1daeSBarry Smith   PetscViewer_Draw *vdraw = (PetscViewer_Draw *)v->data;
85c6c1daeSBarry Smith 
95c6c1daeSBarry Smith   PetscFunctionBegin;
1028b400f6SJacob Faibussowitsch   PetscCheck(!vdraw->singleton_made, PETSC_COMM_SELF, PETSC_ERR_ORDER, "Destroying PetscViewer without first restoring singleton");
115c6c1daeSBarry Smith   for (i = 0; i < vdraw->draw_max; i++) {
129566063dSJacob Faibussowitsch     PetscCall(PetscDrawAxisDestroy(&vdraw->drawaxis[i]));
139566063dSJacob Faibussowitsch     PetscCall(PetscDrawLGDestroy(&vdraw->drawlg[i]));
149566063dSJacob Faibussowitsch     PetscCall(PetscDrawDestroy(&vdraw->draw[i]));
155c6c1daeSBarry Smith   }
169566063dSJacob Faibussowitsch   PetscCall(PetscFree(vdraw->display));
179566063dSJacob Faibussowitsch   PetscCall(PetscFree(vdraw->title));
189566063dSJacob Faibussowitsch   PetscCall(PetscFree3(vdraw->draw, vdraw->drawlg, vdraw->drawaxis));
199566063dSJacob Faibussowitsch   PetscCall(PetscFree(vdraw->bounds));
209566063dSJacob Faibussowitsch   PetscCall(PetscFree(vdraw->drawtype));
219566063dSJacob Faibussowitsch   PetscCall(PetscFree(v->data));
225c6c1daeSBarry Smith   PetscFunctionReturn(0);
235c6c1daeSBarry Smith }
245c6c1daeSBarry Smith 
259371c9d4SSatish Balay static PetscErrorCode PetscViewerFlush_Draw(PetscViewer v) {
265c6c1daeSBarry Smith   PetscInt          i;
275c6c1daeSBarry Smith   PetscViewer_Draw *vdraw = (PetscViewer_Draw *)v->data;
285c6c1daeSBarry Smith 
295c6c1daeSBarry Smith   PetscFunctionBegin;
305c6c1daeSBarry Smith   for (i = 0; i < vdraw->draw_max; i++) {
319566063dSJacob Faibussowitsch     if (vdraw->draw[i]) PetscCall(PetscDrawFlush(vdraw->draw[i]));
325c6c1daeSBarry Smith   }
335c6c1daeSBarry Smith   PetscFunctionReturn(0);
345c6c1daeSBarry Smith }
355c6c1daeSBarry Smith 
365c6c1daeSBarry Smith /*@C
375c6c1daeSBarry Smith     PetscViewerDrawGetDraw - Returns PetscDraw object from PetscViewer object.
385c6c1daeSBarry Smith     This PetscDraw object may then be used to perform graphics using
395c6c1daeSBarry Smith     PetscDrawXXX() commands.
405c6c1daeSBarry Smith 
41d94959e9SLisandro Dalcin     Collective on PetscViewer
425c6c1daeSBarry Smith 
435c6c1daeSBarry Smith     Input Parameters:
445c6c1daeSBarry Smith +   viewer - the PetscViewer (created with PetscViewerDrawOpen())
455c6c1daeSBarry Smith -   windownumber - indicates which subwindow (usually 0)
465c6c1daeSBarry Smith 
4701d2d390SJose E. Roman     Output Parameter:
485c6c1daeSBarry Smith .   draw - the draw object
495c6c1daeSBarry Smith 
505c6c1daeSBarry Smith     Level: intermediate
515c6c1daeSBarry Smith 
52db781477SPatrick Sanan .seealso: `PetscViewerDrawGetLG()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()`
535c6c1daeSBarry Smith @*/
549371c9d4SSatish Balay PetscErrorCode PetscViewerDrawGetDraw(PetscViewer viewer, PetscInt windownumber, PetscDraw *draw) {
55e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
565c6c1daeSBarry Smith   PetscBool         isdraw;
575c6c1daeSBarry Smith 
585c6c1daeSBarry Smith   PetscFunctionBegin;
595c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
60e5ab1681SLisandro Dalcin   PetscValidLogicalCollectiveInt(viewer, windownumber, 2);
615c6c1daeSBarry Smith   if (draw) PetscValidPointer(draw, 3);
629566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
6328b400f6SJacob Faibussowitsch   PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer");
6408401ef6SPierre Jolivet   PetscCheck(windownumber >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Window number cannot be negative");
65e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)viewer->data;
66e5ab1681SLisandro Dalcin 
675c6c1daeSBarry Smith   windownumber += vdraw->draw_base;
685c6c1daeSBarry Smith   if (windownumber >= vdraw->draw_max) {
695c6c1daeSBarry Smith     /* allocate twice as many slots as needed */
705c6c1daeSBarry Smith     PetscInt       draw_max = vdraw->draw_max;
715c6c1daeSBarry Smith     PetscDraw     *tdraw    = vdraw->draw;
725c6c1daeSBarry Smith     PetscDrawLG   *drawlg   = vdraw->drawlg;
735c6c1daeSBarry Smith     PetscDrawAxis *drawaxis = vdraw->drawaxis;
745c6c1daeSBarry Smith 
755c6c1daeSBarry Smith     vdraw->draw_max = 2 * windownumber;
76a297a907SKarl Rupp 
779566063dSJacob Faibussowitsch     PetscCall(PetscCalloc3(vdraw->draw_max, &vdraw->draw, vdraw->draw_max, &vdraw->drawlg, vdraw->draw_max, &vdraw->drawaxis));
789566063dSJacob Faibussowitsch     PetscCall(PetscArraycpy(vdraw->draw, tdraw, draw_max));
799566063dSJacob Faibussowitsch     PetscCall(PetscArraycpy(vdraw->drawlg, drawlg, draw_max));
809566063dSJacob Faibussowitsch     PetscCall(PetscArraycpy(vdraw->drawaxis, drawaxis, draw_max));
819566063dSJacob Faibussowitsch     PetscCall(PetscFree3(tdraw, drawlg, drawaxis));
825c6c1daeSBarry Smith   }
835c6c1daeSBarry Smith 
845c6c1daeSBarry Smith   if (!vdraw->draw[windownumber]) {
85e5ab1681SLisandro Dalcin     char *title = vdraw->title, tmp_str[128];
8610f3a0f4SLisandro Dalcin     if (windownumber) {
879566063dSJacob Faibussowitsch       PetscCall(PetscSNPrintf(tmp_str, sizeof(tmp_str), "%s:%" PetscInt_FMT, vdraw->title ? vdraw->title : "", windownumber));
885c6c1daeSBarry Smith       title = tmp_str;
895c6c1daeSBarry Smith     }
909566063dSJacob Faibussowitsch     PetscCall(PetscDrawCreate(PetscObjectComm((PetscObject)viewer), vdraw->display, title, PETSC_DECIDE, PETSC_DECIDE, vdraw->w, vdraw->h, &vdraw->draw[windownumber]));
919566063dSJacob Faibussowitsch     PetscCall(PetscLogObjectParent((PetscObject)viewer, (PetscObject)vdraw->draw[windownumber]));
92*48a46eb9SPierre Jolivet     if (vdraw->drawtype) PetscCall(PetscDrawSetType(vdraw->draw[windownumber], vdraw->drawtype));
939566063dSJacob Faibussowitsch     PetscCall(PetscDrawSetPause(vdraw->draw[windownumber], vdraw->pause));
949566063dSJacob Faibussowitsch     PetscCall(PetscDrawSetOptionsPrefix(vdraw->draw[windownumber], ((PetscObject)viewer)->prefix));
959566063dSJacob Faibussowitsch     PetscCall(PetscDrawSetFromOptions(vdraw->draw[windownumber]));
965c6c1daeSBarry Smith   }
975c6c1daeSBarry Smith   if (draw) *draw = vdraw->draw[windownumber];
98064a246eSJacob Faibussowitsch   if (draw) PetscValidHeaderSpecific(*draw, PETSC_DRAW_CLASSID, 3);
995c6c1daeSBarry Smith   PetscFunctionReturn(0);
1005c6c1daeSBarry Smith }
1015c6c1daeSBarry Smith 
1025c6c1daeSBarry Smith /*@C
1035c6c1daeSBarry Smith     PetscViewerDrawBaseAdd - add to the base integer that is added to the windownumber passed to PetscViewerDrawGetDraw()
1045c6c1daeSBarry Smith 
105d94959e9SLisandro Dalcin     Logically Collective on PetscViewer
1065c6c1daeSBarry Smith 
1075c6c1daeSBarry Smith     Input Parameters:
1085c6c1daeSBarry Smith +  viewer - the PetscViewer (created with PetscViewerDrawOpen())
1095c6c1daeSBarry Smith -   windownumber - how much to add to the base
1105c6c1daeSBarry Smith 
1115c6c1daeSBarry Smith     Level: developer
1125c6c1daeSBarry Smith 
113db781477SPatrick Sanan .seealso: `PetscViewerDrawGetLG()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`, `PetscViewerDrawBaseSet()`
1145c6c1daeSBarry Smith @*/
1159371c9d4SSatish Balay PetscErrorCode PetscViewerDrawBaseAdd(PetscViewer viewer, PetscInt windownumber) {
116e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
1175c6c1daeSBarry Smith   PetscBool         isdraw;
1185c6c1daeSBarry Smith 
1195c6c1daeSBarry Smith   PetscFunctionBegin;
1205c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
121e5ab1681SLisandro Dalcin   PetscValidLogicalCollectiveInt(viewer, windownumber, 2);
1229566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
12328b400f6SJacob Faibussowitsch   PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer");
124e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)viewer->data;
125e5ab1681SLisandro Dalcin 
126cc73adaaSBarry 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);
1275c6c1daeSBarry Smith   vdraw->draw_base += windownumber;
1285c6c1daeSBarry Smith   PetscFunctionReturn(0);
1295c6c1daeSBarry Smith }
1305c6c1daeSBarry Smith 
1315c6c1daeSBarry Smith /*@C
1325c6c1daeSBarry Smith     PetscViewerDrawBaseSet - sets the base integer that is added to the windownumber passed to PetscViewerDrawGetDraw()
1335c6c1daeSBarry Smith 
134d94959e9SLisandro Dalcin     Logically Collective on PetscViewer
1355c6c1daeSBarry Smith 
1365c6c1daeSBarry Smith     Input Parameters:
1375c6c1daeSBarry Smith +   viewer - the PetscViewer (created with PetscViewerDrawOpen())
1385c6c1daeSBarry Smith -   windownumber - value to set the base
1395c6c1daeSBarry Smith 
1405c6c1daeSBarry Smith     Level: developer
1415c6c1daeSBarry Smith 
142db781477SPatrick Sanan .seealso: `PetscViewerDrawGetLG()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`, `PetscViewerDrawBaseAdd()`
1435c6c1daeSBarry Smith @*/
1449371c9d4SSatish Balay PetscErrorCode PetscViewerDrawBaseSet(PetscViewer viewer, PetscInt windownumber) {
145e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
1465c6c1daeSBarry Smith   PetscBool         isdraw;
1475c6c1daeSBarry Smith 
1485c6c1daeSBarry Smith   PetscFunctionBegin;
1495c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
150e5ab1681SLisandro Dalcin   PetscValidLogicalCollectiveInt(viewer, windownumber, 2);
1519566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
15228b400f6SJacob Faibussowitsch   PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer");
153e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)viewer->data;
154e5ab1681SLisandro Dalcin 
15508401ef6SPierre Jolivet   PetscCheck(windownumber >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Resulting base %" PetscInt_FMT " cannot be negative", windownumber);
1565c6c1daeSBarry Smith   vdraw->draw_base = windownumber;
1575c6c1daeSBarry Smith   PetscFunctionReturn(0);
1585c6c1daeSBarry Smith }
1595c6c1daeSBarry Smith 
1605c6c1daeSBarry Smith /*@C
1615c6c1daeSBarry Smith     PetscViewerDrawGetDrawLG - Returns PetscDrawLG object from PetscViewer object.
1625c6c1daeSBarry Smith     This PetscDrawLG object may then be used to perform graphics using
1635c6c1daeSBarry Smith     PetscDrawLGXXX() commands.
1645c6c1daeSBarry Smith 
165d94959e9SLisandro Dalcin     Collective on PetscViewer
1665c6c1daeSBarry Smith 
167d8d19677SJose E. Roman     Input Parameters:
1685c6c1daeSBarry Smith +   PetscViewer - the PetscViewer (created with PetscViewerDrawOpen())
1695c6c1daeSBarry Smith -   windownumber - indicates which subwindow (usually 0)
1705c6c1daeSBarry Smith 
17101d2d390SJose E. Roman     Output Parameter:
1725c6c1daeSBarry Smith .   draw - the draw line graph object
1735c6c1daeSBarry Smith 
1745c6c1daeSBarry Smith     Level: intermediate
1755c6c1daeSBarry Smith 
176db781477SPatrick Sanan .seealso: `PetscViewerDrawGetDraw()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()`
1775c6c1daeSBarry Smith @*/
1789371c9d4SSatish Balay PetscErrorCode PetscViewerDrawGetDrawLG(PetscViewer viewer, PetscInt windownumber, PetscDrawLG *drawlg) {
1795c6c1daeSBarry Smith   PetscBool         isdraw;
180e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
1815c6c1daeSBarry Smith 
1825c6c1daeSBarry Smith   PetscFunctionBegin;
1835c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
184e5ab1681SLisandro Dalcin   PetscValidLogicalCollectiveInt(viewer, windownumber, 2);
1855c6c1daeSBarry Smith   PetscValidPointer(drawlg, 3);
1869566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
18728b400f6SJacob Faibussowitsch   PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer");
18808401ef6SPierre Jolivet   PetscCheck(windownumber >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Window number cannot be negative");
189e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)viewer->data;
1905c6c1daeSBarry Smith 
191*48a46eb9SPierre Jolivet   if (windownumber + vdraw->draw_base >= vdraw->draw_max || !vdraw->draw[windownumber + vdraw->draw_base]) PetscCall(PetscViewerDrawGetDraw(viewer, windownumber, NULL));
1925c6c1daeSBarry Smith   if (!vdraw->drawlg[windownumber + vdraw->draw_base]) {
1939566063dSJacob Faibussowitsch     PetscCall(PetscDrawLGCreate(vdraw->draw[windownumber + vdraw->draw_base], 1, &vdraw->drawlg[windownumber + vdraw->draw_base]));
1949566063dSJacob Faibussowitsch     PetscCall(PetscLogObjectParent((PetscObject)viewer, (PetscObject)vdraw->drawlg[windownumber + vdraw->draw_base]));
1959566063dSJacob Faibussowitsch     PetscCall(PetscDrawLGSetFromOptions(vdraw->drawlg[windownumber + vdraw->draw_base]));
1965c6c1daeSBarry Smith   }
1975c6c1daeSBarry Smith   *drawlg = vdraw->drawlg[windownumber + vdraw->draw_base];
1985c6c1daeSBarry Smith   PetscFunctionReturn(0);
1995c6c1daeSBarry Smith }
2005c6c1daeSBarry Smith 
2015c6c1daeSBarry Smith /*@C
2025c6c1daeSBarry Smith     PetscViewerDrawGetDrawAxis - Returns PetscDrawAxis object from PetscViewer object.
2035c6c1daeSBarry Smith     This PetscDrawAxis object may then be used to perform graphics using
2045c6c1daeSBarry Smith     PetscDrawAxisXXX() commands.
2055c6c1daeSBarry Smith 
206d94959e9SLisandro Dalcin     Collective on PetscViewer
2075c6c1daeSBarry Smith 
208d8d19677SJose E. Roman     Input Parameters:
2095c6c1daeSBarry Smith +   viewer - the PetscViewer (created with PetscViewerDrawOpen()
2105c6c1daeSBarry Smith -   windownumber - indicates which subwindow (usually 0)
2115c6c1daeSBarry Smith 
21201d2d390SJose E. Roman     Output Parameter:
2135c6c1daeSBarry Smith .   drawaxis - the draw axis object
2145c6c1daeSBarry Smith 
2155c6c1daeSBarry Smith     Level: advanced
2165c6c1daeSBarry Smith 
217db781477SPatrick Sanan .seealso: `PetscViewerDrawGetDraw()`, `PetscViewerDrawGetLG()`, `PetscViewerDrawOpen()`
2185c6c1daeSBarry Smith @*/
2199371c9d4SSatish Balay PetscErrorCode PetscViewerDrawGetDrawAxis(PetscViewer viewer, PetscInt windownumber, PetscDrawAxis *drawaxis) {
2205c6c1daeSBarry Smith   PetscBool         isdraw;
221e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
2225c6c1daeSBarry Smith 
2235c6c1daeSBarry Smith   PetscFunctionBegin;
2245c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
225e5ab1681SLisandro Dalcin   PetscValidLogicalCollectiveInt(viewer, windownumber, 2);
2265c6c1daeSBarry Smith   PetscValidPointer(drawaxis, 3);
2279566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
22828b400f6SJacob Faibussowitsch   PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer");
22908401ef6SPierre Jolivet   PetscCheck(windownumber >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Window number cannot be negative");
230e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)viewer->data;
2315c6c1daeSBarry Smith 
232*48a46eb9SPierre Jolivet   if (windownumber + vdraw->draw_base >= vdraw->draw_max || !vdraw->draw[windownumber + vdraw->draw_base]) PetscCall(PetscViewerDrawGetDraw(viewer, windownumber, NULL));
2335c6c1daeSBarry Smith   if (!vdraw->drawaxis[windownumber + vdraw->draw_base]) {
2349566063dSJacob Faibussowitsch     PetscCall(PetscDrawAxisCreate(vdraw->draw[windownumber + vdraw->draw_base], &vdraw->drawaxis[windownumber + vdraw->draw_base]));
2359566063dSJacob Faibussowitsch     PetscCall(PetscLogObjectParent((PetscObject)viewer, (PetscObject)vdraw->drawaxis[windownumber + vdraw->draw_base]));
2365c6c1daeSBarry Smith   }
2375c6c1daeSBarry Smith   *drawaxis = vdraw->drawaxis[windownumber + vdraw->draw_base];
2385c6c1daeSBarry Smith   PetscFunctionReturn(0);
2395c6c1daeSBarry Smith }
2405c6c1daeSBarry Smith 
2419371c9d4SSatish Balay PetscErrorCode PetscViewerDrawResize(PetscViewer v, int w, int h) {
242e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
243e5ab1681SLisandro Dalcin   PetscBool         isdraw;
2445c6c1daeSBarry Smith 
2455c6c1daeSBarry Smith   PetscFunctionBegin;
246e5ab1681SLisandro Dalcin   PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1);
2479566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw));
248e5ab1681SLisandro Dalcin   if (!isdraw) PetscFunctionReturn(0);
249e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)v->data;
250e5ab1681SLisandro Dalcin 
251e5ab1681SLisandro Dalcin   if (w >= 1) vdraw->w = w;
252e5ab1681SLisandro Dalcin   if (h >= 1) vdraw->h = h;
2535c6c1daeSBarry Smith   PetscFunctionReturn(0);
2545c6c1daeSBarry Smith }
2555c6c1daeSBarry Smith 
2569371c9d4SSatish Balay PetscErrorCode PetscViewerDrawSetInfo(PetscViewer v, const char display[], const char title[], int x, int y, int w, int h) {
257e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
258e5ab1681SLisandro Dalcin   PetscBool         isdraw;
2595c6c1daeSBarry Smith 
2605c6c1daeSBarry Smith   PetscFunctionBegin;
261e5ab1681SLisandro Dalcin   PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1);
2629566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw));
263e5ab1681SLisandro Dalcin   if (!isdraw) PetscFunctionReturn(0);
264e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)v->data;
265e5ab1681SLisandro Dalcin 
2669566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(display, &vdraw->display));
2679566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(title, &vdraw->title));
268e5ab1681SLisandro Dalcin   if (w >= 1) vdraw->w = w;
269e5ab1681SLisandro Dalcin   if (h >= 1) vdraw->h = h;
2705c6c1daeSBarry Smith   PetscFunctionReturn(0);
2715c6c1daeSBarry Smith }
2725c6c1daeSBarry Smith 
2739371c9d4SSatish Balay PetscErrorCode PetscViewerDrawSetDrawType(PetscViewer v, PetscDrawType drawtype) {
274e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
275e5ab1681SLisandro Dalcin   PetscBool         isdraw;
276d1da0b69SBarry Smith 
277d1da0b69SBarry Smith   PetscFunctionBegin;
278e5ab1681SLisandro Dalcin   PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1);
2799566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw));
280e5ab1681SLisandro Dalcin   if (!isdraw) PetscFunctionReturn(0);
281e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)v->data;
282e5ab1681SLisandro Dalcin 
2839566063dSJacob Faibussowitsch   PetscCall(PetscFree(vdraw->drawtype));
2849566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(drawtype, (char **)&vdraw->drawtype));
285d1da0b69SBarry Smith   PetscFunctionReturn(0);
286d1da0b69SBarry Smith }
287d1da0b69SBarry Smith 
2889371c9d4SSatish Balay PetscErrorCode PetscViewerDrawGetDrawType(PetscViewer v, PetscDrawType *drawtype) {
2891f49e1f7SLisandro Dalcin   PetscViewer_Draw *vdraw;
2901f49e1f7SLisandro Dalcin   PetscBool         isdraw;
2911f49e1f7SLisandro Dalcin 
2921f49e1f7SLisandro Dalcin   PetscFunctionBegin;
2931f49e1f7SLisandro Dalcin   PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1);
2949566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw));
29528b400f6SJacob Faibussowitsch   PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer");
2961f49e1f7SLisandro Dalcin   vdraw = (PetscViewer_Draw *)v->data;
2971f49e1f7SLisandro Dalcin 
2981f49e1f7SLisandro Dalcin   *drawtype = vdraw->drawtype;
2991f49e1f7SLisandro Dalcin   PetscFunctionReturn(0);
3001f49e1f7SLisandro Dalcin }
3011f49e1f7SLisandro Dalcin 
3029371c9d4SSatish Balay PetscErrorCode PetscViewerDrawSetTitle(PetscViewer v, const char title[]) {
303f55236e4SLisandro Dalcin   PetscViewer_Draw *vdraw;
304f55236e4SLisandro Dalcin   PetscBool         isdraw;
305f55236e4SLisandro Dalcin 
306f55236e4SLisandro Dalcin   PetscFunctionBegin;
307f55236e4SLisandro Dalcin   PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1);
3089566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw));
309f55236e4SLisandro Dalcin   if (!isdraw) PetscFunctionReturn(0);
310f55236e4SLisandro Dalcin   vdraw = (PetscViewer_Draw *)v->data;
311f55236e4SLisandro Dalcin 
3129566063dSJacob Faibussowitsch   PetscCall(PetscFree(vdraw->title));
3139566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(title, &vdraw->title));
314f55236e4SLisandro Dalcin   PetscFunctionReturn(0);
315f55236e4SLisandro Dalcin }
316f55236e4SLisandro Dalcin 
3179371c9d4SSatish Balay PetscErrorCode PetscViewerDrawGetTitle(PetscViewer v, const char *title[]) {
318f55236e4SLisandro Dalcin   PetscViewer_Draw *vdraw;
319f55236e4SLisandro Dalcin   PetscBool         isdraw;
320f55236e4SLisandro Dalcin 
321f55236e4SLisandro Dalcin   PetscFunctionBegin;
322f55236e4SLisandro Dalcin   PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1);
3239566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw));
32428b400f6SJacob Faibussowitsch   PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer");
325f55236e4SLisandro Dalcin   vdraw = (PetscViewer_Draw *)v->data;
326f55236e4SLisandro Dalcin 
327f55236e4SLisandro Dalcin   *title = vdraw->title;
328f55236e4SLisandro Dalcin   PetscFunctionReturn(0);
329f55236e4SLisandro Dalcin }
330f55236e4SLisandro Dalcin 
3315c6c1daeSBarry Smith /*@C
3325c6c1daeSBarry Smith    PetscViewerDrawOpen - Opens a window for use as a PetscViewer. If you want to
3335c6c1daeSBarry Smith    do graphics in this window, you must call PetscViewerDrawGetDraw() and
3345c6c1daeSBarry Smith    perform the graphics on the PetscDraw object.
3355c6c1daeSBarry Smith 
336d083f849SBarry Smith    Collective
3375c6c1daeSBarry Smith 
3385c6c1daeSBarry Smith    Input Parameters:
3395c6c1daeSBarry Smith +  comm - communicator that will share window
3405c6c1daeSBarry Smith .  display - the X display on which to open, or null for the local machine
3415c6c1daeSBarry Smith .  title - the title to put in the title bar, or null for no title
3425c6c1daeSBarry Smith .  x, y - the screen coordinates of the upper left corner of window, or use PETSC_DECIDE
3435c6c1daeSBarry Smith -  w, h - window width and height in pixels, or may use PETSC_DECIDE or PETSC_DRAW_FULL_SIZE, PETSC_DRAW_HALF_SIZE,
3445c6c1daeSBarry Smith           PETSC_DRAW_THIRD_SIZE, PETSC_DRAW_QUARTER_SIZE
3455c6c1daeSBarry Smith 
346f899ff85SJose E. Roman    Output Parameter:
3475c6c1daeSBarry Smith . viewer - the PetscViewer
3485c6c1daeSBarry Smith 
3495c6c1daeSBarry Smith    Format Options:
3505c6c1daeSBarry Smith +  PETSC_VIEWER_DRAW_BASIC - displays with basic format
3515c6c1daeSBarry Smith -  PETSC_VIEWER_DRAW_LG    - displays using a line graph
3525c6c1daeSBarry Smith 
3535c6c1daeSBarry Smith    Options Database Keys:
35410699b91SBarry Smith +  -draw_type - use x or null
3555c6c1daeSBarry Smith .  -nox - Disables all x-windows output
3565c6c1daeSBarry Smith .  -display <name> - Specifies name of machine for the X display
3575c6c1daeSBarry Smith .  -geometry <x,y,w,h> - allows setting the window location and size
3585c6c1daeSBarry Smith -  -draw_pause <pause> - Sets time (in seconds) that the
3595c6c1daeSBarry Smith      program pauses after PetscDrawPause() has been called
3605c6c1daeSBarry Smith      (0 is default, -1 implies until user input).
3615c6c1daeSBarry Smith 
3625c6c1daeSBarry Smith    Level: beginner
3635c6c1daeSBarry Smith 
36410699b91SBarry Smith    Notes:
36510699b91SBarry Smith      PetscViewerDrawOpen() calls PetscDrawCreate(), so see the manual pages for PetscDrawCreate()
36610699b91SBarry Smith 
3675c6c1daeSBarry Smith    Note for Fortran Programmers:
3685c6c1daeSBarry Smith    Whenever indicating null character data in a Fortran code,
369cf90aa19SBarry Smith    PETSC_NULL_CHARACTER must be employed; using NULL is not
370cf90aa19SBarry Smith    correct for character data!  Thus, PETSC_NULL_CHARACTER can be
3715c6c1daeSBarry Smith    used for the display and title input parameters.
3725c6c1daeSBarry Smith 
373db781477SPatrick Sanan .seealso: `PetscDrawCreate()`, `PetscViewerDestroy()`, `PetscViewerDrawGetDraw()`, `PetscViewerCreate()`, `PETSC_VIEWER_DRAW_`,
374db781477SPatrick Sanan           `PETSC_VIEWER_DRAW_WORLD`, `PETSC_VIEWER_DRAW_SELF`
3755c6c1daeSBarry Smith @*/
3769371c9d4SSatish Balay PetscErrorCode PetscViewerDrawOpen(MPI_Comm comm, const char display[], const char title[], int x, int y, int w, int h, PetscViewer *viewer) {
3775c6c1daeSBarry Smith   PetscFunctionBegin;
3789566063dSJacob Faibussowitsch   PetscCall(PetscViewerCreate(comm, viewer));
3799566063dSJacob Faibussowitsch   PetscCall(PetscViewerSetType(*viewer, PETSCVIEWERDRAW));
3809566063dSJacob Faibussowitsch   PetscCall(PetscViewerDrawSetInfo(*viewer, display, title, x, y, w, h));
3815c6c1daeSBarry Smith   PetscFunctionReturn(0);
3825c6c1daeSBarry Smith }
3835c6c1daeSBarry Smith 
384a9db196aSBarry Smith #include <petsc/private/drawimpl.h>
385a9db196aSBarry Smith 
3869371c9d4SSatish Balay PetscErrorCode PetscViewerGetSubViewer_Draw(PetscViewer viewer, MPI_Comm comm, PetscViewer *sviewer) {
3875c6c1daeSBarry Smith   PetscMPIInt       rank;
3885c6c1daeSBarry Smith   PetscInt          i;
389c6228bbaSLisandro Dalcin   PetscViewer_Draw *vdraw = (PetscViewer_Draw *)viewer->data, *svdraw;
3905c6c1daeSBarry Smith 
3915c6c1daeSBarry Smith   PetscFunctionBegin;
39228b400f6SJacob Faibussowitsch   PetscCheck(!vdraw->singleton_made, PETSC_COMM_SELF, PETSC_ERR_ORDER, "Trying to get SubViewer without first restoring previous");
3935c6c1daeSBarry Smith   /* only processor zero can use the PetscViewer draw singleton */
394fefe69c3SStefano Zampini   if (sviewer) *sviewer = NULL;
3959566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)viewer), &rank));
396dd400576SPatrick Sanan   if (rank == 0) {
397e5afcf28SBarry Smith     PetscMPIInt flg;
398a9db196aSBarry Smith     PetscDraw   draw, sdraw;
399e5afcf28SBarry Smith 
4009566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_compare(PETSC_COMM_SELF, comm, &flg));
401cc73adaaSBarry Smith     PetscCheck(flg == MPI_IDENT || flg == MPI_CONGRUENT, PETSC_COMM_SELF, PETSC_ERR_SUP, "PetscViewerGetSubViewer() for PETSCVIEWERDRAW requires a singleton MPI_Comm");
4029566063dSJacob Faibussowitsch     PetscCall(PetscViewerCreate(comm, sviewer));
4039566063dSJacob Faibussowitsch     PetscCall(PetscViewerSetType(*sviewer, PETSCVIEWERDRAW));
404c6228bbaSLisandro Dalcin     svdraw             = (PetscViewer_Draw *)(*sviewer)->data;
405c6228bbaSLisandro Dalcin     (*sviewer)->format = viewer->format;
406c6228bbaSLisandro Dalcin     for (i = 0; i < vdraw->draw_max; i++) { /* XXX this is wrong if svdraw->draw_max (initially 5) < vdraw->draw_max */
4079566063dSJacob Faibussowitsch       if (vdraw->draw[i]) PetscCall(PetscDrawGetSingleton(vdraw->draw[i], &svdraw->draw[i]));
4085c6c1daeSBarry Smith     }
4099566063dSJacob Faibussowitsch     PetscCall(PetscViewerDrawGetDraw(viewer, 0, &draw));
4109566063dSJacob Faibussowitsch     PetscCall(PetscViewerDrawGetDraw(*sviewer, 0, &sdraw));
411a9db196aSBarry Smith     if (draw->savefilename) {
4129566063dSJacob Faibussowitsch       PetscCall(PetscDrawSetSave(sdraw, draw->savefilename));
413a9db196aSBarry Smith       sdraw->savefilecount  = draw->savefilecount;
414a9db196aSBarry Smith       sdraw->savesinglefile = draw->savesinglefile;
415a9db196aSBarry Smith       sdraw->savemoviefps   = draw->savemoviefps;
416a9db196aSBarry Smith       sdraw->saveonclear    = draw->saveonclear;
417a9db196aSBarry Smith       sdraw->saveonflush    = draw->saveonflush;
418a9db196aSBarry Smith     }
4199566063dSJacob Faibussowitsch     if (draw->savefinalfilename) PetscCall(PetscDrawSetSaveFinalImage(sdraw, draw->savefinalfilename));
420a9db196aSBarry Smith   } else {
421a9db196aSBarry Smith     PetscDraw draw;
4229566063dSJacob Faibussowitsch     PetscCall(PetscViewerDrawGetDraw(viewer, 0, &draw));
4235c6c1daeSBarry Smith   }
4245c6c1daeSBarry Smith   vdraw->singleton_made = PETSC_TRUE;
4255c6c1daeSBarry Smith   PetscFunctionReturn(0);
4265c6c1daeSBarry Smith }
4275c6c1daeSBarry Smith 
4289371c9d4SSatish Balay PetscErrorCode PetscViewerRestoreSubViewer_Draw(PetscViewer viewer, MPI_Comm comm, PetscViewer *sviewer) {
4295c6c1daeSBarry Smith   PetscMPIInt       rank;
4305c6c1daeSBarry Smith   PetscInt          i;
431c6228bbaSLisandro Dalcin   PetscViewer_Draw *vdraw = (PetscViewer_Draw *)viewer->data, *svdraw;
4325c6c1daeSBarry Smith 
4335c6c1daeSBarry Smith   PetscFunctionBegin;
43428b400f6SJacob Faibussowitsch   PetscCheck(vdraw->singleton_made, PETSC_COMM_SELF, PETSC_ERR_ORDER, "Trying to restore a singleton that was not gotten");
4359566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)viewer), &rank));
436dd400576SPatrick Sanan   if (rank == 0) {
437a9db196aSBarry Smith     PetscDraw draw, sdraw;
438a9db196aSBarry Smith 
4399566063dSJacob Faibussowitsch     PetscCall(PetscViewerDrawGetDraw(viewer, 0, &draw));
4409566063dSJacob Faibussowitsch     PetscCall(PetscViewerDrawGetDraw(*sviewer, 0, &sdraw));
441a9db196aSBarry Smith     if (draw->savefilename) {
442a9db196aSBarry Smith       draw->savefilecount = sdraw->savefilecount;
4439566063dSJacob Faibussowitsch       PetscCallMPI(MPI_Bcast(&draw->savefilecount, 1, MPIU_INT, 0, PetscObjectComm((PetscObject)draw)));
444a9db196aSBarry Smith     }
445c6228bbaSLisandro Dalcin     svdraw = (PetscViewer_Draw *)(*sviewer)->data;
4465c6c1daeSBarry Smith     for (i = 0; i < vdraw->draw_max; i++) {
447*48a46eb9SPierre Jolivet       if (vdraw->draw[i] && svdraw->draw[i]) PetscCall(PetscDrawRestoreSingleton(vdraw->draw[i], &svdraw->draw[i]));
4485c6c1daeSBarry Smith     }
4499566063dSJacob Faibussowitsch     PetscCall(PetscFree3(svdraw->draw, svdraw->drawlg, svdraw->drawaxis));
4509566063dSJacob Faibussowitsch     PetscCall(PetscFree((*sviewer)->data));
4519566063dSJacob Faibussowitsch     PetscCall(PetscHeaderDestroy(sviewer));
452a9db196aSBarry Smith   } else {
453a9db196aSBarry Smith     PetscDraw draw;
454a9db196aSBarry Smith 
4559566063dSJacob Faibussowitsch     PetscCall(PetscViewerDrawGetDraw(viewer, 0, &draw));
456*48a46eb9SPierre Jolivet     if (draw->savefilename) PetscCallMPI(MPI_Bcast(&draw->savefilecount, 1, MPIU_INT, 0, PetscObjectComm((PetscObject)draw)));
457a9db196aSBarry Smith   }
458a9db196aSBarry Smith 
4595c6c1daeSBarry Smith   vdraw->singleton_made = PETSC_FALSE;
4605c6c1daeSBarry Smith   PetscFunctionReturn(0);
4615c6c1daeSBarry Smith }
4625c6c1daeSBarry Smith 
4639371c9d4SSatish Balay PetscErrorCode PetscViewerSetFromOptions_Draw(PetscViewer v, PetscOptionItems *PetscOptionsObject) {
464e9457bf7SBarry Smith   PetscReal bounds[16];
465e9457bf7SBarry Smith   PetscInt  nbounds = 16;
466e9457bf7SBarry Smith   PetscBool flg;
467e9457bf7SBarry Smith 
468e9457bf7SBarry Smith   PetscFunctionBegin;
469d0609cedSBarry Smith   PetscOptionsHeadBegin(PetscOptionsObject, "Draw PetscViewer Options");
4709566063dSJacob Faibussowitsch   PetscCall(PetscOptionsRealArray("-draw_bounds", "Bounds to put on plots axis", "PetscViewerDrawSetBounds", bounds, &nbounds, &flg));
471*48a46eb9SPierre Jolivet   if (flg) PetscCall(PetscViewerDrawSetBounds(v, nbounds / 2, bounds));
472d0609cedSBarry Smith   PetscOptionsHeadEnd();
473e9457bf7SBarry Smith   PetscFunctionReturn(0);
474e9457bf7SBarry Smith }
475e9457bf7SBarry Smith 
4769371c9d4SSatish Balay PetscErrorCode PetscViewerView_Draw(PetscViewer viewer, PetscViewer v) {
4770076e027SBarry Smith   PetscDraw         draw;
4780076e027SBarry Smith   PetscInt          i;
4790076e027SBarry Smith   PetscViewer_Draw *vdraw = (PetscViewer_Draw *)viewer->data;
4800076e027SBarry Smith 
4810076e027SBarry Smith   PetscFunctionBegin;
4820076e027SBarry Smith   /*  If the PetscViewer has just been created then no vdraw->draw yet
4830076e027SBarry Smith       exists so this will not actually call the viewer on any draws. */
4840076e027SBarry Smith   for (i = 0; i < vdraw->draw_base; i++) {
4850076e027SBarry Smith     if (vdraw->draw[i]) {
4869566063dSJacob Faibussowitsch       PetscCall(PetscViewerDrawGetDraw(viewer, i, &draw));
4879566063dSJacob Faibussowitsch       PetscCall(PetscDrawView(draw, v));
4880076e027SBarry Smith     }
4890076e027SBarry Smith   }
4900076e027SBarry Smith   PetscFunctionReturn(0);
4910076e027SBarry Smith }
4920076e027SBarry Smith 
4938556b5ebSBarry Smith /*MC
4948556b5ebSBarry Smith    PETSCVIEWERDRAW - A viewer that generates graphics, either to the screen or a file
4958556b5ebSBarry Smith 
496c2e3fba1SPatrick Sanan .seealso: `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`, `PETSC_VIEWER_DRAW_()`, `PETSC_VIEWER_DRAW_SELF`, `PETSC_VIEWER_DRAW_WORLD`,
497db781477SPatrick Sanan           `PetscViewerCreate()`, `PetscViewerASCIIOpen()`, `PetscViewerBinaryOpen()`, `PETSCVIEWERBINARY`,
498db781477SPatrick Sanan           `PetscViewerMatlabOpen()`, `VecView()`, `DMView()`, `PetscViewerMatlabPutArray()`, `PETSCVIEWERASCII`, `PETSCVIEWERMATLAB`,
499db781477SPatrick Sanan           `PetscViewerFileSetName()`, `PetscViewerFileSetMode()`, `PetscViewerFormat`, `PetscViewerType`, `PetscViewerSetType()`
5008556b5ebSBarry Smith 
5011b266c99SBarry Smith   Level: beginner
5021b266c99SBarry Smith 
5038556b5ebSBarry Smith M*/
5049371c9d4SSatish Balay PETSC_EXTERN PetscErrorCode PetscViewerCreate_Draw(PetscViewer viewer) {
5055c6c1daeSBarry Smith   PetscViewer_Draw *vdraw;
5065c6c1daeSBarry Smith 
5075c6c1daeSBarry Smith   PetscFunctionBegin;
5089566063dSJacob Faibussowitsch   PetscCall(PetscNewLog(viewer, &vdraw));
5095c6c1daeSBarry Smith   viewer->data = (void *)vdraw;
5105c6c1daeSBarry Smith 
5115c6c1daeSBarry Smith   viewer->ops->flush            = PetscViewerFlush_Draw;
5120076e027SBarry Smith   viewer->ops->view             = PetscViewerView_Draw;
5135c6c1daeSBarry Smith   viewer->ops->destroy          = PetscViewerDestroy_Draw;
514e9457bf7SBarry Smith   viewer->ops->setfromoptions   = PetscViewerSetFromOptions_Draw;
515559f443fSBarry Smith   viewer->ops->getsubviewer     = PetscViewerGetSubViewer_Draw;
516559f443fSBarry Smith   viewer->ops->restoresubviewer = PetscViewerRestoreSubViewer_Draw;
5175c6c1daeSBarry Smith 
5185c6c1daeSBarry Smith   /* these are created on the fly if requested */
5195c6c1daeSBarry Smith   vdraw->draw_max  = 5;
5205c6c1daeSBarry Smith   vdraw->draw_base = 0;
521ccad63c3SBarry Smith   vdraw->w         = PETSC_DECIDE;
522ccad63c3SBarry Smith   vdraw->h         = PETSC_DECIDE;
523a297a907SKarl Rupp 
5249566063dSJacob Faibussowitsch   PetscCall(PetscCalloc3(vdraw->draw_max, &vdraw->draw, vdraw->draw_max, &vdraw->drawlg, vdraw->draw_max, &vdraw->drawaxis));
5255c6c1daeSBarry Smith   vdraw->singleton_made = PETSC_FALSE;
5265c6c1daeSBarry Smith   PetscFunctionReturn(0);
5275c6c1daeSBarry Smith }
5285c6c1daeSBarry Smith 
5295c6c1daeSBarry Smith /*@
5305c6c1daeSBarry Smith     PetscViewerDrawClear - Clears a PetscDraw graphic associated with a PetscViewer.
5315c6c1daeSBarry Smith 
5325c6c1daeSBarry Smith     Not Collective
5335c6c1daeSBarry Smith 
5345c6c1daeSBarry Smith     Input Parameter:
5355c6c1daeSBarry Smith .  viewer - the PetscViewer
5365c6c1daeSBarry Smith 
5375c6c1daeSBarry Smith     Level: intermediate
5385c6c1daeSBarry Smith 
539db781477SPatrick Sanan .seealso: `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`,
5405c6c1daeSBarry Smith 
5415c6c1daeSBarry Smith @*/
5429371c9d4SSatish Balay PetscErrorCode PetscViewerDrawClear(PetscViewer viewer) {
5435c6c1daeSBarry Smith   PetscViewer_Draw *vdraw;
544e5ab1681SLisandro Dalcin   PetscBool         isdraw;
545e5ab1681SLisandro Dalcin   PetscInt          i;
5465c6c1daeSBarry Smith 
5475c6c1daeSBarry Smith   PetscFunctionBegin;
548e5ab1681SLisandro Dalcin   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
5499566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
550e5ab1681SLisandro Dalcin   if (!isdraw) PetscFunctionReturn(0);
5515c6c1daeSBarry Smith   vdraw = (PetscViewer_Draw *)viewer->data;
552e5ab1681SLisandro Dalcin 
5535c6c1daeSBarry Smith   for (i = 0; i < vdraw->draw_max; i++) {
5549566063dSJacob Faibussowitsch     if (vdraw->draw[i]) PetscCall(PetscDrawClear(vdraw->draw[i]));
5555c6c1daeSBarry Smith   }
5565c6c1daeSBarry Smith   PetscFunctionReturn(0);
5575c6c1daeSBarry Smith }
5585c6c1daeSBarry Smith 
5595c6c1daeSBarry Smith /*@
5605c6c1daeSBarry Smith     PetscViewerDrawGetPause - Gets a pause for the first present draw
5615c6c1daeSBarry Smith 
5625c6c1daeSBarry Smith     Not Collective
5635c6c1daeSBarry Smith 
5645c6c1daeSBarry Smith     Input Parameter:
5655c6c1daeSBarry Smith .  viewer - the PetscViewer
5665c6c1daeSBarry Smith 
5675c6c1daeSBarry Smith     Output Parameter:
5685c6c1daeSBarry Smith .  pause - the pause value
5695c6c1daeSBarry Smith 
5705c6c1daeSBarry Smith     Level: intermediate
5715c6c1daeSBarry Smith 
572db781477SPatrick Sanan .seealso: `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`,
5735c6c1daeSBarry Smith 
5745c6c1daeSBarry Smith @*/
5759371c9d4SSatish Balay PetscErrorCode PetscViewerDrawGetPause(PetscViewer viewer, PetscReal *pause) {
5765c6c1daeSBarry Smith   PetscViewer_Draw *vdraw;
577e5ab1681SLisandro Dalcin   PetscBool         isdraw;
578e5ab1681SLisandro Dalcin   PetscInt          i;
5795c6c1daeSBarry Smith   PetscDraw         draw;
5805c6c1daeSBarry Smith 
5815c6c1daeSBarry Smith   PetscFunctionBegin;
582e5ab1681SLisandro Dalcin   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
5839566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
5849371c9d4SSatish Balay   if (!isdraw) {
5859371c9d4SSatish Balay     *pause = 0.0;
5869371c9d4SSatish Balay     PetscFunctionReturn(0);
5879371c9d4SSatish Balay   }
5885c6c1daeSBarry Smith   vdraw = (PetscViewer_Draw *)viewer->data;
589e5ab1681SLisandro Dalcin 
5905c6c1daeSBarry Smith   for (i = 0; i < vdraw->draw_max; i++) {
5915c6c1daeSBarry Smith     if (vdraw->draw[i]) {
5929566063dSJacob Faibussowitsch       PetscCall(PetscDrawGetPause(vdraw->draw[i], pause));
5935c6c1daeSBarry Smith       PetscFunctionReturn(0);
5945c6c1daeSBarry Smith     }
5955c6c1daeSBarry Smith   }
5965c6c1daeSBarry Smith   /* none exist yet so create one and get its pause */
5979566063dSJacob Faibussowitsch   PetscCall(PetscViewerDrawGetDraw(viewer, 0, &draw));
5989566063dSJacob Faibussowitsch   PetscCall(PetscDrawGetPause(draw, pause));
5995c6c1daeSBarry Smith   PetscFunctionReturn(0);
6005c6c1daeSBarry Smith }
6015c6c1daeSBarry Smith 
6025c6c1daeSBarry Smith /*@
6035c6c1daeSBarry Smith     PetscViewerDrawSetPause - Sets a pause for each PetscDraw in the viewer
6045c6c1daeSBarry Smith 
6055c6c1daeSBarry Smith     Not Collective
6065c6c1daeSBarry Smith 
6075c6c1daeSBarry Smith     Input Parameters:
6085c6c1daeSBarry Smith +  viewer - the PetscViewer
6095c6c1daeSBarry Smith -  pause - the pause value
6105c6c1daeSBarry Smith 
6115c6c1daeSBarry Smith     Level: intermediate
6125c6c1daeSBarry Smith 
613db781477SPatrick Sanan .seealso: `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`,
6145c6c1daeSBarry Smith 
6155c6c1daeSBarry Smith @*/
6169371c9d4SSatish Balay PetscErrorCode PetscViewerDrawSetPause(PetscViewer viewer, PetscReal pause) {
617e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
6185c6c1daeSBarry Smith   PetscBool         isdraw;
619e5ab1681SLisandro Dalcin   PetscInt          i;
6205c6c1daeSBarry Smith 
6215c6c1daeSBarry Smith   PetscFunctionBegin;
622e5ab1681SLisandro Dalcin   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
6239566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
624e5ab1681SLisandro Dalcin   if (!isdraw) PetscFunctionReturn(0);
625e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)viewer->data;
626afe78b3cSBarry Smith 
627afe78b3cSBarry Smith   vdraw->pause = pause;
6285c6c1daeSBarry Smith   for (i = 0; i < vdraw->draw_max; i++) {
6299566063dSJacob Faibussowitsch     if (vdraw->draw[i]) PetscCall(PetscDrawSetPause(vdraw->draw[i], pause));
6305c6c1daeSBarry Smith   }
6315c6c1daeSBarry Smith   PetscFunctionReturn(0);
6325c6c1daeSBarry Smith }
6335c6c1daeSBarry Smith 
6345c6c1daeSBarry Smith /*@
6355c6c1daeSBarry Smith     PetscViewerDrawSetHold - Holds previous image when drawing new image
6365c6c1daeSBarry Smith 
6375c6c1daeSBarry Smith     Not Collective
6385c6c1daeSBarry Smith 
6395c6c1daeSBarry Smith     Input Parameters:
6405c6c1daeSBarry Smith +  viewer - the PetscViewer
6415c6c1daeSBarry Smith -  hold - indicates to hold or not
6425c6c1daeSBarry Smith 
6435c6c1daeSBarry Smith     Level: intermediate
6445c6c1daeSBarry Smith 
645db781477SPatrick Sanan .seealso: `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`,
6465c6c1daeSBarry Smith 
6475c6c1daeSBarry Smith @*/
6489371c9d4SSatish Balay PetscErrorCode PetscViewerDrawSetHold(PetscViewer viewer, PetscBool hold) {
6495c6c1daeSBarry Smith   PetscViewer_Draw *vdraw;
6505c6c1daeSBarry Smith   PetscBool         isdraw;
6515c6c1daeSBarry Smith 
6525c6c1daeSBarry Smith   PetscFunctionBegin;
653e5ab1681SLisandro Dalcin   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
6549566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
655e5ab1681SLisandro Dalcin   if (!isdraw) PetscFunctionReturn(0);
6565c6c1daeSBarry Smith   vdraw = (PetscViewer_Draw *)viewer->data;
657e5ab1681SLisandro Dalcin 
6585c6c1daeSBarry Smith   vdraw->hold = hold;
6595c6c1daeSBarry Smith   PetscFunctionReturn(0);
6605c6c1daeSBarry Smith }
6615c6c1daeSBarry Smith 
6625c6c1daeSBarry Smith /*@
663d97d059aSBarry Smith     PetscViewerDrawGetHold - Checks if holds previous image when drawing new image
6645c6c1daeSBarry Smith 
6655c6c1daeSBarry Smith     Not Collective
6665c6c1daeSBarry Smith 
6675c6c1daeSBarry Smith     Input Parameter:
6685c6c1daeSBarry Smith .  viewer - the PetscViewer
6695c6c1daeSBarry Smith 
6705c6c1daeSBarry Smith     Output Parameter:
6715c6c1daeSBarry Smith .  hold - indicates to hold or not
6725c6c1daeSBarry Smith 
6735c6c1daeSBarry Smith     Level: intermediate
6745c6c1daeSBarry Smith 
675db781477SPatrick Sanan .seealso: `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`,
6765c6c1daeSBarry Smith 
6775c6c1daeSBarry Smith @*/
6789371c9d4SSatish Balay PetscErrorCode PetscViewerDrawGetHold(PetscViewer viewer, PetscBool *hold) {
6795c6c1daeSBarry Smith   PetscViewer_Draw *vdraw;
6805c6c1daeSBarry Smith   PetscBool         isdraw;
6815c6c1daeSBarry Smith 
6825c6c1daeSBarry Smith   PetscFunctionBegin;
683e5ab1681SLisandro Dalcin   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
6849566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
6859371c9d4SSatish Balay   if (!isdraw) {
6869371c9d4SSatish Balay     *hold = PETSC_FALSE;
6879371c9d4SSatish Balay     PetscFunctionReturn(0);
6889371c9d4SSatish Balay   }
6895c6c1daeSBarry Smith   vdraw = (PetscViewer_Draw *)viewer->data;
690e5ab1681SLisandro Dalcin 
6915c6c1daeSBarry Smith   *hold = vdraw->hold;
6925c6c1daeSBarry Smith   PetscFunctionReturn(0);
6935c6c1daeSBarry Smith }
6945c6c1daeSBarry Smith 
6955c6c1daeSBarry Smith /* ---------------------------------------------------------------------*/
6965c6c1daeSBarry Smith /*
6975c6c1daeSBarry Smith     The variable Petsc_Viewer_Draw_keyval is used to indicate an MPI attribute that
6985c6c1daeSBarry Smith   is attached to a communicator, in this case the attribute is a PetscViewer.
6995c6c1daeSBarry Smith */
700d4c7638eSBarry Smith PetscMPIInt Petsc_Viewer_Draw_keyval = MPI_KEYVAL_INVALID;
7015c6c1daeSBarry Smith 
7025c6c1daeSBarry Smith /*@C
7035c6c1daeSBarry Smith     PETSC_VIEWER_DRAW_ - Creates a window PetscViewer shared by all processors
7045c6c1daeSBarry Smith                      in a communicator.
7055c6c1daeSBarry Smith 
706d083f849SBarry Smith      Collective
7075c6c1daeSBarry Smith 
7085c6c1daeSBarry Smith      Input Parameter:
7095c6c1daeSBarry Smith .    comm - the MPI communicator to share the window PetscViewer
7105c6c1daeSBarry Smith 
7115c6c1daeSBarry Smith      Level: intermediate
7125c6c1daeSBarry Smith 
7135c6c1daeSBarry Smith      Notes:
7145c6c1daeSBarry Smith      Unlike almost all other PETSc routines, PETSC_VIEWER_DRAW_ does not return
7155c6c1daeSBarry Smith      an error code.  The window is usually used in the form
7165c6c1daeSBarry Smith $       XXXView(XXX object,PETSC_VIEWER_DRAW_(comm));
7175c6c1daeSBarry Smith 
718db781477SPatrick Sanan .seealso: `PETSC_VIEWER_DRAW_WORLD`, `PETSC_VIEWER_DRAW_SELF`, `PetscViewerDrawOpen()`,
7195c6c1daeSBarry Smith @*/
7209371c9d4SSatish Balay PetscViewer PETSC_VIEWER_DRAW_(MPI_Comm comm) {
7215c6c1daeSBarry Smith   PetscErrorCode ierr;
7225c6c1daeSBarry Smith   PetscMPIInt    flag;
7235c6c1daeSBarry Smith   PetscViewer    viewer;
7245c6c1daeSBarry Smith   MPI_Comm       ncomm;
7255c6c1daeSBarry Smith 
7265c6c1daeSBarry Smith   PetscFunctionBegin;
7279371c9d4SSatish Balay   ierr = PetscCommDuplicate(comm, &ncomm, NULL);
7289371c9d4SSatish Balay   if (ierr) {
7299371c9d4SSatish Balay     PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_DRAW_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_INITIAL, " ");
7309371c9d4SSatish Balay     PetscFunctionReturn(NULL);
7319371c9d4SSatish Balay   }
7325c6c1daeSBarry Smith   if (Petsc_Viewer_Draw_keyval == MPI_KEYVAL_INVALID) {
73302c9f0b5SLisandro Dalcin     ierr = MPI_Comm_create_keyval(MPI_COMM_NULL_COPY_FN, MPI_COMM_NULL_DELETE_FN, &Petsc_Viewer_Draw_keyval, NULL);
7349371c9d4SSatish Balay     if (ierr) {
7359371c9d4SSatish Balay       PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_DRAW_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_INITIAL, " ");
7369371c9d4SSatish Balay       PetscFunctionReturn(NULL);
7379371c9d4SSatish Balay     }
7385c6c1daeSBarry Smith   }
73947435625SJed Brown   ierr = MPI_Comm_get_attr(ncomm, Petsc_Viewer_Draw_keyval, (void **)&viewer, &flag);
7409371c9d4SSatish Balay   if (ierr) {
7419371c9d4SSatish Balay     PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_DRAW_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_INITIAL, " ");
7429371c9d4SSatish Balay     PetscFunctionReturn(NULL);
7439371c9d4SSatish Balay   }
7445c6c1daeSBarry Smith   if (!flag) { /* PetscViewer not yet created */
74502c9f0b5SLisandro Dalcin     ierr = PetscViewerDrawOpen(ncomm, NULL, NULL, PETSC_DECIDE, PETSC_DECIDE, 300, 300, &viewer);
7469371c9d4SSatish Balay     if (ierr) {
7479371c9d4SSatish Balay       PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_DRAW_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_REPEAT, " ");
7489371c9d4SSatish Balay       PetscFunctionReturn(NULL);
7499371c9d4SSatish Balay     }
7505c6c1daeSBarry Smith     ierr = PetscObjectRegisterDestroy((PetscObject)viewer);
7519371c9d4SSatish Balay     if (ierr) {
7529371c9d4SSatish Balay       PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_DRAW_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_REPEAT, " ");
7539371c9d4SSatish Balay       PetscFunctionReturn(NULL);
7549371c9d4SSatish Balay     }
75547435625SJed Brown     ierr = MPI_Comm_set_attr(ncomm, Petsc_Viewer_Draw_keyval, (void *)viewer);
7569371c9d4SSatish Balay     if (ierr) {
7579371c9d4SSatish Balay       PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_DRAW_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_INITIAL, " ");
7589371c9d4SSatish Balay       PetscFunctionReturn(NULL);
7599371c9d4SSatish Balay     }
7605c6c1daeSBarry Smith   }
7615c6c1daeSBarry Smith   ierr = PetscCommDestroy(&ncomm);
7629371c9d4SSatish Balay   if (ierr) {
7639371c9d4SSatish Balay     PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_DRAW_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_REPEAT, " ");
7649371c9d4SSatish Balay     PetscFunctionReturn(NULL);
7659371c9d4SSatish Balay   }
7665c6c1daeSBarry Smith   PetscFunctionReturn(viewer);
7675c6c1daeSBarry Smith }
7685c6c1daeSBarry Smith 
7695c6c1daeSBarry Smith /*@
7705c6c1daeSBarry Smith     PetscViewerDrawSetBounds - sets the upper and lower bounds to be used in plotting
7715c6c1daeSBarry Smith 
7725c6c1daeSBarry Smith     Collective on PetscViewer
7735c6c1daeSBarry Smith 
7745c6c1daeSBarry Smith     Input Parameters:
7755c6c1daeSBarry Smith +   viewer - the PetscViewer (created with PetscViewerDrawOpen())
7765c6c1daeSBarry Smith .   nbounds - number of plots that can be made with this viewer, for example the dof passed to DMDACreate()
7775c6c1daeSBarry 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, .....
7785c6c1daeSBarry Smith 
779e9457bf7SBarry Smith     Options Database:
78010699b91SBarry Smith .   -draw_bounds  minF0,maxF0,minF1,maxF1 - the lower left and upper right bounds
781e9457bf7SBarry Smith 
7825c6c1daeSBarry Smith     Level: intermediate
7835c6c1daeSBarry Smith 
78495452b02SPatrick Sanan     Notes:
78595452b02SPatrick Sanan     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
786f3f0eb19SBarry 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
787f3f0eb19SBarry Smith       this viewer. Otherwise the color to physical value meaning changes with each new image if this is not set.
788f3f0eb19SBarry Smith 
789db781477SPatrick Sanan .seealso: `PetscViewerDrawGetLG()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()`
7905c6c1daeSBarry Smith @*/
7919371c9d4SSatish Balay PetscErrorCode PetscViewerDrawSetBounds(PetscViewer viewer, PetscInt nbounds, const PetscReal *bounds) {
792e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
793e5ab1681SLisandro Dalcin   PetscBool         isdraw;
7945c6c1daeSBarry Smith 
7955c6c1daeSBarry Smith   PetscFunctionBegin;
7965c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
7979566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
798e5ab1681SLisandro Dalcin   if (!isdraw) PetscFunctionReturn(0);
799e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)viewer->data;
800a297a907SKarl Rupp 
801e5ab1681SLisandro Dalcin   vdraw->nbounds = nbounds;
8029566063dSJacob Faibussowitsch   PetscCall(PetscFree(vdraw->bounds));
8039566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(2 * nbounds, &vdraw->bounds));
8049566063dSJacob Faibussowitsch   PetscCall(PetscArraycpy(vdraw->bounds, bounds, 2 * nbounds));
8055c6c1daeSBarry Smith   PetscFunctionReturn(0);
8065c6c1daeSBarry Smith }
8075c6c1daeSBarry Smith 
8085c6c1daeSBarry Smith /*@C
8095c6c1daeSBarry Smith     PetscViewerDrawGetBounds - gets the upper and lower bounds to be used in plotting set with PetscViewerDrawSetBounds()
8105c6c1daeSBarry Smith 
8115c6c1daeSBarry Smith     Collective on PetscViewer
8125c6c1daeSBarry Smith 
8135c6c1daeSBarry Smith     Input Parameter:
8145c6c1daeSBarry Smith .   viewer - the PetscViewer (created with PetscViewerDrawOpen())
8155c6c1daeSBarry Smith 
816fd292e60Sprj-     Output Parameters:
8175c6c1daeSBarry Smith +   nbounds - number of plots that can be made with this viewer, for example the dof passed to DMDACreate()
8185c6c1daeSBarry 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, .....
8195c6c1daeSBarry Smith 
8205c6c1daeSBarry Smith     Level: intermediate
8215c6c1daeSBarry Smith 
822db781477SPatrick Sanan .seealso: `PetscViewerDrawGetLG()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()`, `PetscViewerDrawSetBounds()`
8235c6c1daeSBarry Smith @*/
8249371c9d4SSatish Balay PetscErrorCode PetscViewerDrawGetBounds(PetscViewer viewer, PetscInt *nbounds, const PetscReal **bounds) {
825e5ab1681SLisandro Dalcin   PetscViewer_Draw *vdraw;
826e5ab1681SLisandro Dalcin   PetscBool         isdraw;
8275c6c1daeSBarry Smith 
8285c6c1daeSBarry Smith   PetscFunctionBegin;
8295c6c1daeSBarry Smith   PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1);
8309566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw));
8319371c9d4SSatish Balay   if (!isdraw) {
8329371c9d4SSatish Balay     if (nbounds) *nbounds = 0;
8339371c9d4SSatish Balay     if (bounds) *bounds = NULL;
8349371c9d4SSatish Balay     PetscFunctionReturn(0);
8359371c9d4SSatish Balay   }
836e5ab1681SLisandro Dalcin   vdraw = (PetscViewer_Draw *)viewer->data;
837e5ab1681SLisandro Dalcin 
838e5ab1681SLisandro Dalcin   if (nbounds) *nbounds = vdraw->nbounds;
839e5ab1681SLisandro Dalcin   if (bounds) *bounds = vdraw->bounds;
8405c6c1daeSBarry Smith   PetscFunctionReturn(0);
8415c6c1daeSBarry Smith }
842