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