15c6c1daeSBarry Smith 25c6c1daeSBarry Smith #include <../src/sys/classes/viewer/impls/draw/vdraw.h> /*I "petscdraw.h" I*/ 3665c2dedSJed Brown #include <petscviewer.h> /*I "petscviewer.h" I*/ 45c6c1daeSBarry Smith 5d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerDestroy_Draw(PetscViewer v) 6d71ae5a4SJacob Faibussowitsch { 75c6c1daeSBarry Smith PetscInt i; 85c6c1daeSBarry Smith PetscViewer_Draw *vdraw = (PetscViewer_Draw *)v->data; 95c6c1daeSBarry Smith 105c6c1daeSBarry Smith PetscFunctionBegin; 1128b400f6SJacob Faibussowitsch PetscCheck(!vdraw->singleton_made, PETSC_COMM_SELF, PETSC_ERR_ORDER, "Destroying PetscViewer without first restoring singleton"); 125c6c1daeSBarry Smith for (i = 0; i < vdraw->draw_max; i++) { 139566063dSJacob Faibussowitsch PetscCall(PetscDrawAxisDestroy(&vdraw->drawaxis[i])); 149566063dSJacob Faibussowitsch PetscCall(PetscDrawLGDestroy(&vdraw->drawlg[i])); 159566063dSJacob Faibussowitsch PetscCall(PetscDrawDestroy(&vdraw->draw[i])); 165c6c1daeSBarry Smith } 179566063dSJacob Faibussowitsch PetscCall(PetscFree(vdraw->display)); 189566063dSJacob Faibussowitsch PetscCall(PetscFree(vdraw->title)); 199566063dSJacob Faibussowitsch PetscCall(PetscFree3(vdraw->draw, vdraw->drawlg, vdraw->drawaxis)); 209566063dSJacob Faibussowitsch PetscCall(PetscFree(vdraw->bounds)); 219566063dSJacob Faibussowitsch PetscCall(PetscFree(vdraw->drawtype)); 229566063dSJacob Faibussowitsch PetscCall(PetscFree(v->data)); 235c6c1daeSBarry Smith PetscFunctionReturn(0); 245c6c1daeSBarry Smith } 255c6c1daeSBarry Smith 26d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerFlush_Draw(PetscViewer v) 27d71ae5a4SJacob Faibussowitsch { 285c6c1daeSBarry Smith PetscInt i; 295c6c1daeSBarry Smith PetscViewer_Draw *vdraw = (PetscViewer_Draw *)v->data; 305c6c1daeSBarry Smith 315c6c1daeSBarry Smith PetscFunctionBegin; 325c6c1daeSBarry Smith for (i = 0; i < vdraw->draw_max; i++) { 339566063dSJacob Faibussowitsch if (vdraw->draw[i]) PetscCall(PetscDrawFlush(vdraw->draw[i])); 345c6c1daeSBarry Smith } 355c6c1daeSBarry Smith PetscFunctionReturn(0); 365c6c1daeSBarry Smith } 375c6c1daeSBarry Smith 385c6c1daeSBarry Smith /*@C 39811af0c4SBarry Smith PetscViewerDrawGetDraw - Returns `PetscDraw` object from `PetscViewer` object. 40811af0c4SBarry Smith This `PetscDraw` object may then be used to perform graphics using 41811af0c4SBarry Smith `PetscDraw` commands. 425c6c1daeSBarry Smith 43*c3339decSBarry Smith Collective 445c6c1daeSBarry Smith 455c6c1daeSBarry Smith Input Parameters: 46811af0c4SBarry Smith + viewer - the `PetscViewer` (created with `PetscViewerDrawOpen()` of type `PETSCVIEWERDRAW`) 475c6c1daeSBarry Smith - windownumber - indicates which subwindow (usually 0) 485c6c1daeSBarry Smith 4901d2d390SJose E. Roman Output Parameter: 505c6c1daeSBarry Smith . draw - the draw object 515c6c1daeSBarry Smith 525c6c1daeSBarry Smith Level: intermediate 535c6c1daeSBarry Smith 54811af0c4SBarry Smith .seealso: `PETSCVIEWERDRAW`, `PetscViewerDrawGetLG()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()` 555c6c1daeSBarry Smith @*/ 56d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawGetDraw(PetscViewer viewer, PetscInt windownumber, PetscDraw *draw) 57d71ae5a4SJacob Faibussowitsch { 58e5ab1681SLisandro Dalcin PetscViewer_Draw *vdraw; 595c6c1daeSBarry Smith PetscBool isdraw; 605c6c1daeSBarry Smith 615c6c1daeSBarry Smith PetscFunctionBegin; 625c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 63e5ab1681SLisandro Dalcin PetscValidLogicalCollectiveInt(viewer, windownumber, 2); 645c6c1daeSBarry Smith if (draw) PetscValidPointer(draw, 3); 659566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw)); 6628b400f6SJacob Faibussowitsch PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer"); 6708401ef6SPierre Jolivet PetscCheck(windownumber >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Window number cannot be negative"); 68e5ab1681SLisandro Dalcin vdraw = (PetscViewer_Draw *)viewer->data; 69e5ab1681SLisandro Dalcin 705c6c1daeSBarry Smith windownumber += vdraw->draw_base; 715c6c1daeSBarry Smith if (windownumber >= vdraw->draw_max) { 725c6c1daeSBarry Smith /* allocate twice as many slots as needed */ 735c6c1daeSBarry Smith PetscInt draw_max = vdraw->draw_max; 745c6c1daeSBarry Smith PetscDraw *tdraw = vdraw->draw; 755c6c1daeSBarry Smith PetscDrawLG *drawlg = vdraw->drawlg; 765c6c1daeSBarry Smith PetscDrawAxis *drawaxis = vdraw->drawaxis; 775c6c1daeSBarry Smith 785c6c1daeSBarry Smith vdraw->draw_max = 2 * windownumber; 79a297a907SKarl Rupp 809566063dSJacob Faibussowitsch PetscCall(PetscCalloc3(vdraw->draw_max, &vdraw->draw, vdraw->draw_max, &vdraw->drawlg, vdraw->draw_max, &vdraw->drawaxis)); 819566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(vdraw->draw, tdraw, draw_max)); 829566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(vdraw->drawlg, drawlg, draw_max)); 839566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(vdraw->drawaxis, drawaxis, draw_max)); 849566063dSJacob Faibussowitsch PetscCall(PetscFree3(tdraw, drawlg, drawaxis)); 855c6c1daeSBarry Smith } 865c6c1daeSBarry Smith 875c6c1daeSBarry Smith if (!vdraw->draw[windownumber]) { 88e5ab1681SLisandro Dalcin char *title = vdraw->title, tmp_str[128]; 8910f3a0f4SLisandro Dalcin if (windownumber) { 909566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(tmp_str, sizeof(tmp_str), "%s:%" PetscInt_FMT, vdraw->title ? vdraw->title : "", windownumber)); 915c6c1daeSBarry Smith title = tmp_str; 925c6c1daeSBarry Smith } 939566063dSJacob Faibussowitsch PetscCall(PetscDrawCreate(PetscObjectComm((PetscObject)viewer), vdraw->display, title, PETSC_DECIDE, PETSC_DECIDE, vdraw->w, vdraw->h, &vdraw->draw[windownumber])); 9448a46eb9SPierre Jolivet if (vdraw->drawtype) PetscCall(PetscDrawSetType(vdraw->draw[windownumber], vdraw->drawtype)); 959566063dSJacob Faibussowitsch PetscCall(PetscDrawSetPause(vdraw->draw[windownumber], vdraw->pause)); 969566063dSJacob Faibussowitsch PetscCall(PetscDrawSetOptionsPrefix(vdraw->draw[windownumber], ((PetscObject)viewer)->prefix)); 979566063dSJacob Faibussowitsch PetscCall(PetscDrawSetFromOptions(vdraw->draw[windownumber])); 985c6c1daeSBarry Smith } 995c6c1daeSBarry Smith if (draw) *draw = vdraw->draw[windownumber]; 100064a246eSJacob Faibussowitsch if (draw) PetscValidHeaderSpecific(*draw, PETSC_DRAW_CLASSID, 3); 1015c6c1daeSBarry Smith PetscFunctionReturn(0); 1025c6c1daeSBarry Smith } 1035c6c1daeSBarry Smith 1045c6c1daeSBarry Smith /*@C 105811af0c4SBarry Smith PetscViewerDrawBaseAdd - add to the base integer that is added to the windownumber passed to `PetscViewerDrawGetDraw()` 1065c6c1daeSBarry Smith 107*c3339decSBarry Smith Logically Collective 1085c6c1daeSBarry Smith 1095c6c1daeSBarry Smith Input Parameters: 110811af0c4SBarry Smith + viewer - the `PetscViewer` (created with `PetscViewerDrawOpen()`) 1115c6c1daeSBarry Smith - windownumber - how much to add to the base 1125c6c1daeSBarry Smith 1135c6c1daeSBarry Smith Level: developer 1145c6c1daeSBarry Smith 115811af0c4SBarry Smith Note: 116811af0c4SBarry Smith A `PETSCVIEWERDRAW` may have multiple `PetscDraw` subwindows, this increases the number of the subwindow that is returned with `PetscViewerDrawGetDraw()` 117811af0c4SBarry Smith 118db781477SPatrick Sanan .seealso: `PetscViewerDrawGetLG()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`, `PetscViewerDrawBaseSet()` 1195c6c1daeSBarry Smith @*/ 120d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawBaseAdd(PetscViewer viewer, PetscInt windownumber) 121d71ae5a4SJacob Faibussowitsch { 122e5ab1681SLisandro Dalcin PetscViewer_Draw *vdraw; 1235c6c1daeSBarry Smith PetscBool isdraw; 1245c6c1daeSBarry Smith 1255c6c1daeSBarry Smith PetscFunctionBegin; 1265c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 127e5ab1681SLisandro Dalcin PetscValidLogicalCollectiveInt(viewer, windownumber, 2); 1289566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw)); 12928b400f6SJacob Faibussowitsch PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer"); 130e5ab1681SLisandro Dalcin vdraw = (PetscViewer_Draw *)viewer->data; 131e5ab1681SLisandro Dalcin 132cc73adaaSBarry Smith PetscCheck(windownumber + vdraw->draw_base >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Resulting base %" PetscInt_FMT " cannot be negative", windownumber + vdraw->draw_base); 1335c6c1daeSBarry Smith vdraw->draw_base += windownumber; 1345c6c1daeSBarry Smith PetscFunctionReturn(0); 1355c6c1daeSBarry Smith } 1365c6c1daeSBarry Smith 1375c6c1daeSBarry Smith /*@C 138811af0c4SBarry Smith PetscViewerDrawBaseSet - sets the base integer that is added to the windownumber passed to `PetscViewerDrawGetDraw()` 1395c6c1daeSBarry Smith 140*c3339decSBarry Smith Logically Collective 1415c6c1daeSBarry Smith 1425c6c1daeSBarry Smith Input Parameters: 143811af0c4SBarry Smith + viewer - the `PetscViewer` (created with `PetscViewerDrawOpen()`) 1445c6c1daeSBarry Smith - windownumber - value to set the base 1455c6c1daeSBarry Smith 1465c6c1daeSBarry Smith Level: developer 1475c6c1daeSBarry Smith 148811af0c4SBarry Smith Note: 149811af0c4SBarry Smith A `PETSCVIEWERDRAW` may have multiple `PetscDraw` subwindows, this increases the number of the subwindow that is returned with `PetscViewerDrawGetDraw()` 150811af0c4SBarry Smith 151db781477SPatrick Sanan .seealso: `PetscViewerDrawGetLG()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`, `PetscViewerDrawBaseAdd()` 1525c6c1daeSBarry Smith @*/ 153d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawBaseSet(PetscViewer viewer, PetscInt windownumber) 154d71ae5a4SJacob Faibussowitsch { 155e5ab1681SLisandro Dalcin PetscViewer_Draw *vdraw; 1565c6c1daeSBarry Smith PetscBool isdraw; 1575c6c1daeSBarry Smith 1585c6c1daeSBarry Smith PetscFunctionBegin; 1595c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 160e5ab1681SLisandro Dalcin PetscValidLogicalCollectiveInt(viewer, windownumber, 2); 1619566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw)); 16228b400f6SJacob Faibussowitsch PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer"); 163e5ab1681SLisandro Dalcin vdraw = (PetscViewer_Draw *)viewer->data; 164e5ab1681SLisandro Dalcin 16508401ef6SPierre Jolivet PetscCheck(windownumber >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Resulting base %" PetscInt_FMT " cannot be negative", windownumber); 1665c6c1daeSBarry Smith vdraw->draw_base = windownumber; 1675c6c1daeSBarry Smith PetscFunctionReturn(0); 1685c6c1daeSBarry Smith } 1695c6c1daeSBarry Smith 1705c6c1daeSBarry Smith /*@C 171811af0c4SBarry Smith PetscViewerDrawGetDrawLG - Returns a `PetscDrawLG` object from `PetscViewer` object of type `PETSCVIEWERDRAW`. 172811af0c4SBarry Smith This `PetscDrawLG` object may then be used to perform graphics using `PetscDrawLG` commands. 1735c6c1daeSBarry Smith 174*c3339decSBarry Smith Collective 1755c6c1daeSBarry Smith 176d8d19677SJose E. Roman Input Parameters: 177811af0c4SBarry Smith + PetscViewer - the `PetscViewer` (created with `PetscViewerDrawOpen()`) 1785c6c1daeSBarry Smith - windownumber - indicates which subwindow (usually 0) 1795c6c1daeSBarry Smith 18001d2d390SJose E. Roman Output Parameter: 1815c6c1daeSBarry Smith . draw - the draw line graph object 1825c6c1daeSBarry Smith 1835c6c1daeSBarry Smith Level: intermediate 1845c6c1daeSBarry Smith 185811af0c4SBarry Smith Note: 186811af0c4SBarry Smith A `PETSCVIEWERDRAW` may have multiple `PetscDraw` subwindows 187811af0c4SBarry Smith 188811af0c4SBarry Smith .seealso: `PetscDrawLG`, `PetscViewerDrawGetDraw()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()` 1895c6c1daeSBarry Smith @*/ 190d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawGetDrawLG(PetscViewer viewer, PetscInt windownumber, PetscDrawLG *drawlg) 191d71ae5a4SJacob Faibussowitsch { 1925c6c1daeSBarry Smith PetscBool isdraw; 193e5ab1681SLisandro Dalcin PetscViewer_Draw *vdraw; 1945c6c1daeSBarry Smith 1955c6c1daeSBarry Smith PetscFunctionBegin; 1965c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 197e5ab1681SLisandro Dalcin PetscValidLogicalCollectiveInt(viewer, windownumber, 2); 1985c6c1daeSBarry Smith PetscValidPointer(drawlg, 3); 1999566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw)); 20028b400f6SJacob Faibussowitsch PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer"); 20108401ef6SPierre Jolivet PetscCheck(windownumber >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Window number cannot be negative"); 202e5ab1681SLisandro Dalcin vdraw = (PetscViewer_Draw *)viewer->data; 2035c6c1daeSBarry Smith 20448a46eb9SPierre Jolivet if (windownumber + vdraw->draw_base >= vdraw->draw_max || !vdraw->draw[windownumber + vdraw->draw_base]) PetscCall(PetscViewerDrawGetDraw(viewer, windownumber, NULL)); 2055c6c1daeSBarry Smith if (!vdraw->drawlg[windownumber + vdraw->draw_base]) { 2069566063dSJacob Faibussowitsch PetscCall(PetscDrawLGCreate(vdraw->draw[windownumber + vdraw->draw_base], 1, &vdraw->drawlg[windownumber + vdraw->draw_base])); 2079566063dSJacob Faibussowitsch PetscCall(PetscDrawLGSetFromOptions(vdraw->drawlg[windownumber + vdraw->draw_base])); 2085c6c1daeSBarry Smith } 2095c6c1daeSBarry Smith *drawlg = vdraw->drawlg[windownumber + vdraw->draw_base]; 2105c6c1daeSBarry Smith PetscFunctionReturn(0); 2115c6c1daeSBarry Smith } 2125c6c1daeSBarry Smith 2135c6c1daeSBarry Smith /*@C 214811af0c4SBarry Smith PetscViewerDrawGetDrawAxis - Returns a `PetscDrawAxis` object from a `PetscViewer` object of type `PETSCVIEWERDRAW`. 215811af0c4SBarry Smith This `PetscDrawAxis` object may then be used to perform graphics using `PetscDrawAxis` commands. 2165c6c1daeSBarry Smith 217*c3339decSBarry Smith Collective 2185c6c1daeSBarry Smith 219d8d19677SJose E. Roman Input Parameters: 220811af0c4SBarry Smith + viewer - the `PetscViewer` (created with `PetscViewerDrawOpen()`) 2215c6c1daeSBarry Smith - windownumber - indicates which subwindow (usually 0) 2225c6c1daeSBarry Smith 22301d2d390SJose E. Roman Output Parameter: 2245c6c1daeSBarry Smith . drawaxis - the draw axis object 2255c6c1daeSBarry Smith 2265c6c1daeSBarry Smith Level: advanced 2275c6c1daeSBarry Smith 228811af0c4SBarry Smith Note: 229811af0c4SBarry Smith A `PETSCVIEWERDRAW` may have multiple `PetscDraw` subwindows 230811af0c4SBarry Smith 231db781477SPatrick Sanan .seealso: `PetscViewerDrawGetDraw()`, `PetscViewerDrawGetLG()`, `PetscViewerDrawOpen()` 2325c6c1daeSBarry Smith @*/ 233d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawGetDrawAxis(PetscViewer viewer, PetscInt windownumber, PetscDrawAxis *drawaxis) 234d71ae5a4SJacob Faibussowitsch { 2355c6c1daeSBarry Smith PetscBool isdraw; 236e5ab1681SLisandro Dalcin PetscViewer_Draw *vdraw; 2375c6c1daeSBarry Smith 2385c6c1daeSBarry Smith PetscFunctionBegin; 2395c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 240e5ab1681SLisandro Dalcin PetscValidLogicalCollectiveInt(viewer, windownumber, 2); 2415c6c1daeSBarry Smith PetscValidPointer(drawaxis, 3); 2429566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw)); 24328b400f6SJacob Faibussowitsch PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer"); 24408401ef6SPierre Jolivet PetscCheck(windownumber >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Window number cannot be negative"); 245e5ab1681SLisandro Dalcin vdraw = (PetscViewer_Draw *)viewer->data; 2465c6c1daeSBarry Smith 24748a46eb9SPierre Jolivet if (windownumber + vdraw->draw_base >= vdraw->draw_max || !vdraw->draw[windownumber + vdraw->draw_base]) PetscCall(PetscViewerDrawGetDraw(viewer, windownumber, NULL)); 2484dfa11a4SJacob Faibussowitsch if (!vdraw->drawaxis[windownumber + vdraw->draw_base]) PetscCall(PetscDrawAxisCreate(vdraw->draw[windownumber + vdraw->draw_base], &vdraw->drawaxis[windownumber + vdraw->draw_base])); 2495c6c1daeSBarry Smith *drawaxis = vdraw->drawaxis[windownumber + vdraw->draw_base]; 2505c6c1daeSBarry Smith PetscFunctionReturn(0); 2515c6c1daeSBarry Smith } 2525c6c1daeSBarry Smith 253d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawResize(PetscViewer v, int w, int h) 254d71ae5a4SJacob Faibussowitsch { 255e5ab1681SLisandro Dalcin PetscViewer_Draw *vdraw; 256e5ab1681SLisandro Dalcin PetscBool isdraw; 2575c6c1daeSBarry Smith 2585c6c1daeSBarry Smith PetscFunctionBegin; 259e5ab1681SLisandro Dalcin PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1); 2609566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw)); 261e5ab1681SLisandro Dalcin if (!isdraw) PetscFunctionReturn(0); 262e5ab1681SLisandro Dalcin vdraw = (PetscViewer_Draw *)v->data; 263e5ab1681SLisandro Dalcin 264e5ab1681SLisandro Dalcin if (w >= 1) vdraw->w = w; 265e5ab1681SLisandro Dalcin if (h >= 1) vdraw->h = h; 2665c6c1daeSBarry Smith PetscFunctionReturn(0); 2675c6c1daeSBarry Smith } 2685c6c1daeSBarry Smith 269d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawSetInfo(PetscViewer v, const char display[], const char title[], int x, int y, int w, int h) 270d71ae5a4SJacob Faibussowitsch { 271e5ab1681SLisandro Dalcin PetscViewer_Draw *vdraw; 272e5ab1681SLisandro Dalcin PetscBool isdraw; 2735c6c1daeSBarry Smith 2745c6c1daeSBarry Smith PetscFunctionBegin; 275e5ab1681SLisandro Dalcin PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1); 2769566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw)); 277e5ab1681SLisandro Dalcin if (!isdraw) PetscFunctionReturn(0); 278e5ab1681SLisandro Dalcin vdraw = (PetscViewer_Draw *)v->data; 279e5ab1681SLisandro Dalcin 2809566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(display, &vdraw->display)); 2819566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(title, &vdraw->title)); 282e5ab1681SLisandro Dalcin if (w >= 1) vdraw->w = w; 283e5ab1681SLisandro Dalcin if (h >= 1) vdraw->h = h; 2845c6c1daeSBarry Smith PetscFunctionReturn(0); 2855c6c1daeSBarry Smith } 2865c6c1daeSBarry Smith 287d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawSetDrawType(PetscViewer v, PetscDrawType drawtype) 288d71ae5a4SJacob Faibussowitsch { 289e5ab1681SLisandro Dalcin PetscViewer_Draw *vdraw; 290e5ab1681SLisandro Dalcin PetscBool isdraw; 291d1da0b69SBarry Smith 292d1da0b69SBarry Smith PetscFunctionBegin; 293e5ab1681SLisandro Dalcin PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1); 2949566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw)); 295e5ab1681SLisandro Dalcin if (!isdraw) PetscFunctionReturn(0); 296e5ab1681SLisandro Dalcin vdraw = (PetscViewer_Draw *)v->data; 297e5ab1681SLisandro Dalcin 2989566063dSJacob Faibussowitsch PetscCall(PetscFree(vdraw->drawtype)); 2999566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(drawtype, (char **)&vdraw->drawtype)); 300d1da0b69SBarry Smith PetscFunctionReturn(0); 301d1da0b69SBarry Smith } 302d1da0b69SBarry Smith 303d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawGetDrawType(PetscViewer v, PetscDrawType *drawtype) 304d71ae5a4SJacob Faibussowitsch { 3051f49e1f7SLisandro Dalcin PetscViewer_Draw *vdraw; 3061f49e1f7SLisandro Dalcin PetscBool isdraw; 3071f49e1f7SLisandro Dalcin 3081f49e1f7SLisandro Dalcin PetscFunctionBegin; 3091f49e1f7SLisandro Dalcin PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1); 3109566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw)); 31128b400f6SJacob Faibussowitsch PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer"); 3121f49e1f7SLisandro Dalcin vdraw = (PetscViewer_Draw *)v->data; 3131f49e1f7SLisandro Dalcin 3141f49e1f7SLisandro Dalcin *drawtype = vdraw->drawtype; 3151f49e1f7SLisandro Dalcin PetscFunctionReturn(0); 3161f49e1f7SLisandro Dalcin } 3171f49e1f7SLisandro Dalcin 318d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawSetTitle(PetscViewer v, const char title[]) 319d71ae5a4SJacob Faibussowitsch { 320f55236e4SLisandro Dalcin PetscViewer_Draw *vdraw; 321f55236e4SLisandro Dalcin PetscBool isdraw; 322f55236e4SLisandro Dalcin 323f55236e4SLisandro Dalcin PetscFunctionBegin; 324f55236e4SLisandro Dalcin PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1); 3259566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw)); 326f55236e4SLisandro Dalcin if (!isdraw) PetscFunctionReturn(0); 327f55236e4SLisandro Dalcin vdraw = (PetscViewer_Draw *)v->data; 328f55236e4SLisandro Dalcin 3299566063dSJacob Faibussowitsch PetscCall(PetscFree(vdraw->title)); 3309566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(title, &vdraw->title)); 331f55236e4SLisandro Dalcin PetscFunctionReturn(0); 332f55236e4SLisandro Dalcin } 333f55236e4SLisandro Dalcin 334d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawGetTitle(PetscViewer v, const char *title[]) 335d71ae5a4SJacob Faibussowitsch { 336f55236e4SLisandro Dalcin PetscViewer_Draw *vdraw; 337f55236e4SLisandro Dalcin PetscBool isdraw; 338f55236e4SLisandro Dalcin 339f55236e4SLisandro Dalcin PetscFunctionBegin; 340f55236e4SLisandro Dalcin PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1); 3419566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw)); 34228b400f6SJacob Faibussowitsch PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer"); 343f55236e4SLisandro Dalcin vdraw = (PetscViewer_Draw *)v->data; 344f55236e4SLisandro Dalcin 345f55236e4SLisandro Dalcin *title = vdraw->title; 346f55236e4SLisandro Dalcin PetscFunctionReturn(0); 347f55236e4SLisandro Dalcin } 348f55236e4SLisandro Dalcin 3495c6c1daeSBarry Smith /*@C 350811af0c4SBarry Smith PetscViewerDrawOpen - Opens a `PetscDraw` window for use as a `PetscViewer` with type `PETSCVIEWERDRAW`. If you want to 351811af0c4SBarry Smith do graphics in this window, you must call `PetscViewerDrawGetDraw()` and 352811af0c4SBarry Smith perform the graphics on the `PetscDraw` object. 3535c6c1daeSBarry Smith 354d083f849SBarry Smith Collective 3555c6c1daeSBarry Smith 3565c6c1daeSBarry Smith Input Parameters: 3575c6c1daeSBarry Smith + comm - communicator that will share window 3585c6c1daeSBarry Smith . display - the X display on which to open, or null for the local machine 3595c6c1daeSBarry Smith . title - the title to put in the title bar, or null for no title 360811af0c4SBarry Smith . x, y - the screen coordinates of the upper left corner of window, or use `PETSC_DECIDE` 361811af0c4SBarry Smith - w, h - window width and height in pixels, or may use `PETSC_DECIDE` or `PETSC_DRAW_FULL_SIZE`, `PETSC_DRAW_HALF_SIZE`, 362811af0c4SBarry Smith `PETSC_DRAW_THIRD_SIZE`, `PETSC_DRAW_QUARTER_SIZE` 3635c6c1daeSBarry Smith 364f899ff85SJose E. Roman Output Parameter: 365811af0c4SBarry Smith . viewer - the `PetscViewer` 3665c6c1daeSBarry Smith 3675c6c1daeSBarry Smith Format Options: 368811af0c4SBarry Smith + `PETSC_VIEWER_DRAW_BASIC` - displays with basic format 369811af0c4SBarry Smith - `PETSC_VIEWER_DRAW_LG` - displays using a line graph 3705c6c1daeSBarry Smith 3715c6c1daeSBarry Smith Options Database Keys: 37210699b91SBarry Smith + -draw_type - use x or null 3735c6c1daeSBarry Smith . -nox - Disables all x-windows output 3745c6c1daeSBarry Smith . -display <name> - Specifies name of machine for the X display 3755c6c1daeSBarry Smith . -geometry <x,y,w,h> - allows setting the window location and size 3765c6c1daeSBarry Smith - -draw_pause <pause> - Sets time (in seconds) that the 3775c6c1daeSBarry Smith program pauses after PetscDrawPause() has been called 3785c6c1daeSBarry Smith (0 is default, -1 implies until user input). 3795c6c1daeSBarry Smith 3805c6c1daeSBarry Smith Level: beginner 3815c6c1daeSBarry Smith 3825c6c1daeSBarry Smith Note for Fortran Programmers: 3835c6c1daeSBarry Smith Whenever indicating null character data in a Fortran code, 384811af0c4SBarry Smith `PETSC_NULL_CHARACTER` must be employed; using NULL is not 385811af0c4SBarry Smith correct for character data! Thus, `PETSC_NULL_CHARACTER` can be 3865c6c1daeSBarry Smith used for the display and title input parameters. 3875c6c1daeSBarry Smith 388811af0c4SBarry Smith .seealso: `PETSCVIEWERDRAW`, `PetscDrawCreate()`, `PetscViewerDestroy()`, `PetscViewerDrawGetDraw()`, `PetscViewerCreate()`, `PETSC_VIEWER_DRAW_`, 389db781477SPatrick Sanan `PETSC_VIEWER_DRAW_WORLD`, `PETSC_VIEWER_DRAW_SELF` 3905c6c1daeSBarry Smith @*/ 391d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawOpen(MPI_Comm comm, const char display[], const char title[], int x, int y, int w, int h, PetscViewer *viewer) 392d71ae5a4SJacob Faibussowitsch { 3935c6c1daeSBarry Smith PetscFunctionBegin; 3949566063dSJacob Faibussowitsch PetscCall(PetscViewerCreate(comm, viewer)); 3959566063dSJacob Faibussowitsch PetscCall(PetscViewerSetType(*viewer, PETSCVIEWERDRAW)); 3969566063dSJacob Faibussowitsch PetscCall(PetscViewerDrawSetInfo(*viewer, display, title, x, y, w, h)); 3975c6c1daeSBarry Smith PetscFunctionReturn(0); 3985c6c1daeSBarry Smith } 3995c6c1daeSBarry Smith 400a9db196aSBarry Smith #include <petsc/private/drawimpl.h> 401a9db196aSBarry Smith 402d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerGetSubViewer_Draw(PetscViewer viewer, MPI_Comm comm, PetscViewer *sviewer) 403d71ae5a4SJacob Faibussowitsch { 4045c6c1daeSBarry Smith PetscMPIInt rank; 4055c6c1daeSBarry Smith PetscInt i; 406c6228bbaSLisandro Dalcin PetscViewer_Draw *vdraw = (PetscViewer_Draw *)viewer->data, *svdraw; 4075c6c1daeSBarry Smith 4085c6c1daeSBarry Smith PetscFunctionBegin; 40928b400f6SJacob Faibussowitsch PetscCheck(!vdraw->singleton_made, PETSC_COMM_SELF, PETSC_ERR_ORDER, "Trying to get SubViewer without first restoring previous"); 4105c6c1daeSBarry Smith /* only processor zero can use the PetscViewer draw singleton */ 411fefe69c3SStefano Zampini if (sviewer) *sviewer = NULL; 4129566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)viewer), &rank)); 413dd400576SPatrick Sanan if (rank == 0) { 414e5afcf28SBarry Smith PetscMPIInt flg; 415a9db196aSBarry Smith PetscDraw draw, sdraw; 416e5afcf28SBarry Smith 4179566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_compare(PETSC_COMM_SELF, comm, &flg)); 418cc73adaaSBarry Smith PetscCheck(flg == MPI_IDENT || flg == MPI_CONGRUENT, PETSC_COMM_SELF, PETSC_ERR_SUP, "PetscViewerGetSubViewer() for PETSCVIEWERDRAW requires a singleton MPI_Comm"); 4199566063dSJacob Faibussowitsch PetscCall(PetscViewerCreate(comm, sviewer)); 4209566063dSJacob Faibussowitsch PetscCall(PetscViewerSetType(*sviewer, PETSCVIEWERDRAW)); 421c6228bbaSLisandro Dalcin svdraw = (PetscViewer_Draw *)(*sviewer)->data; 422c6228bbaSLisandro Dalcin (*sviewer)->format = viewer->format; 423c6228bbaSLisandro Dalcin for (i = 0; i < vdraw->draw_max; i++) { /* XXX this is wrong if svdraw->draw_max (initially 5) < vdraw->draw_max */ 4249566063dSJacob Faibussowitsch if (vdraw->draw[i]) PetscCall(PetscDrawGetSingleton(vdraw->draw[i], &svdraw->draw[i])); 4255c6c1daeSBarry Smith } 4269566063dSJacob Faibussowitsch PetscCall(PetscViewerDrawGetDraw(viewer, 0, &draw)); 4279566063dSJacob Faibussowitsch PetscCall(PetscViewerDrawGetDraw(*sviewer, 0, &sdraw)); 428a9db196aSBarry Smith if (draw->savefilename) { 4299566063dSJacob Faibussowitsch PetscCall(PetscDrawSetSave(sdraw, draw->savefilename)); 430a9db196aSBarry Smith sdraw->savefilecount = draw->savefilecount; 431a9db196aSBarry Smith sdraw->savesinglefile = draw->savesinglefile; 432a9db196aSBarry Smith sdraw->savemoviefps = draw->savemoviefps; 433a9db196aSBarry Smith sdraw->saveonclear = draw->saveonclear; 434a9db196aSBarry Smith sdraw->saveonflush = draw->saveonflush; 435a9db196aSBarry Smith } 4369566063dSJacob Faibussowitsch if (draw->savefinalfilename) PetscCall(PetscDrawSetSaveFinalImage(sdraw, draw->savefinalfilename)); 437a9db196aSBarry Smith } else { 438a9db196aSBarry Smith PetscDraw draw; 4399566063dSJacob Faibussowitsch PetscCall(PetscViewerDrawGetDraw(viewer, 0, &draw)); 4405c6c1daeSBarry Smith } 4415c6c1daeSBarry Smith vdraw->singleton_made = PETSC_TRUE; 4425c6c1daeSBarry Smith PetscFunctionReturn(0); 4435c6c1daeSBarry Smith } 4445c6c1daeSBarry Smith 445d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerRestoreSubViewer_Draw(PetscViewer viewer, MPI_Comm comm, PetscViewer *sviewer) 446d71ae5a4SJacob Faibussowitsch { 4475c6c1daeSBarry Smith PetscMPIInt rank; 4485c6c1daeSBarry Smith PetscInt i; 449c6228bbaSLisandro Dalcin PetscViewer_Draw *vdraw = (PetscViewer_Draw *)viewer->data, *svdraw; 4505c6c1daeSBarry Smith 4515c6c1daeSBarry Smith PetscFunctionBegin; 45228b400f6SJacob Faibussowitsch PetscCheck(vdraw->singleton_made, PETSC_COMM_SELF, PETSC_ERR_ORDER, "Trying to restore a singleton that was not gotten"); 4539566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)viewer), &rank)); 454dd400576SPatrick Sanan if (rank == 0) { 455a9db196aSBarry Smith PetscDraw draw, sdraw; 456a9db196aSBarry Smith 4579566063dSJacob Faibussowitsch PetscCall(PetscViewerDrawGetDraw(viewer, 0, &draw)); 4589566063dSJacob Faibussowitsch PetscCall(PetscViewerDrawGetDraw(*sviewer, 0, &sdraw)); 459a9db196aSBarry Smith if (draw->savefilename) { 460a9db196aSBarry Smith draw->savefilecount = sdraw->savefilecount; 4619566063dSJacob Faibussowitsch PetscCallMPI(MPI_Bcast(&draw->savefilecount, 1, MPIU_INT, 0, PetscObjectComm((PetscObject)draw))); 462a9db196aSBarry Smith } 463c6228bbaSLisandro Dalcin svdraw = (PetscViewer_Draw *)(*sviewer)->data; 4645c6c1daeSBarry Smith for (i = 0; i < vdraw->draw_max; i++) { 46548a46eb9SPierre Jolivet if (vdraw->draw[i] && svdraw->draw[i]) PetscCall(PetscDrawRestoreSingleton(vdraw->draw[i], &svdraw->draw[i])); 4665c6c1daeSBarry Smith } 4679566063dSJacob Faibussowitsch PetscCall(PetscFree3(svdraw->draw, svdraw->drawlg, svdraw->drawaxis)); 4689566063dSJacob Faibussowitsch PetscCall(PetscFree((*sviewer)->data)); 4699566063dSJacob Faibussowitsch PetscCall(PetscHeaderDestroy(sviewer)); 470a9db196aSBarry Smith } else { 471a9db196aSBarry Smith PetscDraw draw; 472a9db196aSBarry Smith 4739566063dSJacob Faibussowitsch PetscCall(PetscViewerDrawGetDraw(viewer, 0, &draw)); 47448a46eb9SPierre Jolivet if (draw->savefilename) PetscCallMPI(MPI_Bcast(&draw->savefilecount, 1, MPIU_INT, 0, PetscObjectComm((PetscObject)draw))); 475a9db196aSBarry Smith } 476a9db196aSBarry Smith 4775c6c1daeSBarry Smith vdraw->singleton_made = PETSC_FALSE; 4785c6c1daeSBarry Smith PetscFunctionReturn(0); 4795c6c1daeSBarry Smith } 4805c6c1daeSBarry Smith 481d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerSetFromOptions_Draw(PetscViewer v, PetscOptionItems *PetscOptionsObject) 482d71ae5a4SJacob Faibussowitsch { 483e9457bf7SBarry Smith PetscReal bounds[16]; 484e9457bf7SBarry Smith PetscInt nbounds = 16; 485e9457bf7SBarry Smith PetscBool flg; 486e9457bf7SBarry Smith 487e9457bf7SBarry Smith PetscFunctionBegin; 488d0609cedSBarry Smith PetscOptionsHeadBegin(PetscOptionsObject, "Draw PetscViewer Options"); 4899566063dSJacob Faibussowitsch PetscCall(PetscOptionsRealArray("-draw_bounds", "Bounds to put on plots axis", "PetscViewerDrawSetBounds", bounds, &nbounds, &flg)); 49048a46eb9SPierre Jolivet if (flg) PetscCall(PetscViewerDrawSetBounds(v, nbounds / 2, bounds)); 491d0609cedSBarry Smith PetscOptionsHeadEnd(); 492e9457bf7SBarry Smith PetscFunctionReturn(0); 493e9457bf7SBarry Smith } 494e9457bf7SBarry Smith 495d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerView_Draw(PetscViewer viewer, PetscViewer v) 496d71ae5a4SJacob Faibussowitsch { 4970076e027SBarry Smith PetscDraw draw; 4980076e027SBarry Smith PetscInt i; 4990076e027SBarry Smith PetscViewer_Draw *vdraw = (PetscViewer_Draw *)viewer->data; 5000076e027SBarry Smith 5010076e027SBarry Smith PetscFunctionBegin; 5020076e027SBarry Smith /* If the PetscViewer has just been created then no vdraw->draw yet 5030076e027SBarry Smith exists so this will not actually call the viewer on any draws. */ 5040076e027SBarry Smith for (i = 0; i < vdraw->draw_base; i++) { 5050076e027SBarry Smith if (vdraw->draw[i]) { 5069566063dSJacob Faibussowitsch PetscCall(PetscViewerDrawGetDraw(viewer, i, &draw)); 5079566063dSJacob Faibussowitsch PetscCall(PetscDrawView(draw, v)); 5080076e027SBarry Smith } 5090076e027SBarry Smith } 5100076e027SBarry Smith PetscFunctionReturn(0); 5110076e027SBarry Smith } 5120076e027SBarry Smith 5138556b5ebSBarry Smith /*MC 5148556b5ebSBarry Smith PETSCVIEWERDRAW - A viewer that generates graphics, either to the screen or a file 5158556b5ebSBarry Smith 516811af0c4SBarry Smith Level: beginner 517811af0c4SBarry Smith 518c2e3fba1SPatrick Sanan .seealso: `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`, `PETSC_VIEWER_DRAW_()`, `PETSC_VIEWER_DRAW_SELF`, `PETSC_VIEWER_DRAW_WORLD`, 519db781477SPatrick Sanan `PetscViewerCreate()`, `PetscViewerASCIIOpen()`, `PetscViewerBinaryOpen()`, `PETSCVIEWERBINARY`, 520db781477SPatrick Sanan `PetscViewerMatlabOpen()`, `VecView()`, `DMView()`, `PetscViewerMatlabPutArray()`, `PETSCVIEWERASCII`, `PETSCVIEWERMATLAB`, 521db781477SPatrick Sanan `PetscViewerFileSetName()`, `PetscViewerFileSetMode()`, `PetscViewerFormat`, `PetscViewerType`, `PetscViewerSetType()` 5228556b5ebSBarry Smith M*/ 523d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscViewerCreate_Draw(PetscViewer viewer) 524d71ae5a4SJacob Faibussowitsch { 5255c6c1daeSBarry Smith PetscViewer_Draw *vdraw; 5265c6c1daeSBarry Smith 5275c6c1daeSBarry Smith PetscFunctionBegin; 5284dfa11a4SJacob Faibussowitsch PetscCall(PetscNew(&vdraw)); 5295c6c1daeSBarry Smith viewer->data = (void *)vdraw; 5305c6c1daeSBarry Smith 5315c6c1daeSBarry Smith viewer->ops->flush = PetscViewerFlush_Draw; 5320076e027SBarry Smith viewer->ops->view = PetscViewerView_Draw; 5335c6c1daeSBarry Smith viewer->ops->destroy = PetscViewerDestroy_Draw; 534e9457bf7SBarry Smith viewer->ops->setfromoptions = PetscViewerSetFromOptions_Draw; 535559f443fSBarry Smith viewer->ops->getsubviewer = PetscViewerGetSubViewer_Draw; 536559f443fSBarry Smith viewer->ops->restoresubviewer = PetscViewerRestoreSubViewer_Draw; 5375c6c1daeSBarry Smith 5385c6c1daeSBarry Smith /* these are created on the fly if requested */ 5395c6c1daeSBarry Smith vdraw->draw_max = 5; 5405c6c1daeSBarry Smith vdraw->draw_base = 0; 541ccad63c3SBarry Smith vdraw->w = PETSC_DECIDE; 542ccad63c3SBarry Smith vdraw->h = PETSC_DECIDE; 543a297a907SKarl Rupp 5449566063dSJacob Faibussowitsch PetscCall(PetscCalloc3(vdraw->draw_max, &vdraw->draw, vdraw->draw_max, &vdraw->drawlg, vdraw->draw_max, &vdraw->drawaxis)); 5455c6c1daeSBarry Smith vdraw->singleton_made = PETSC_FALSE; 5465c6c1daeSBarry Smith PetscFunctionReturn(0); 5475c6c1daeSBarry Smith } 5485c6c1daeSBarry Smith 5495c6c1daeSBarry Smith /*@ 550811af0c4SBarry Smith PetscViewerDrawClear - Clears a `PetscDraw` graphic associated with a `PetscViewer`. 5515c6c1daeSBarry Smith 5525c6c1daeSBarry Smith Not Collective 5535c6c1daeSBarry Smith 5545c6c1daeSBarry Smith Input Parameter: 555811af0c4SBarry Smith . viewer - the `PetscViewer` 5565c6c1daeSBarry Smith 5575c6c1daeSBarry Smith Level: intermediate 5585c6c1daeSBarry Smith 559811af0c4SBarry Smith .seealso: `PETSCVIEWERDRAW`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`, 5605c6c1daeSBarry Smith @*/ 561d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawClear(PetscViewer viewer) 562d71ae5a4SJacob Faibussowitsch { 5635c6c1daeSBarry Smith PetscViewer_Draw *vdraw; 564e5ab1681SLisandro Dalcin PetscBool isdraw; 565e5ab1681SLisandro Dalcin PetscInt i; 5665c6c1daeSBarry Smith 5675c6c1daeSBarry Smith PetscFunctionBegin; 568e5ab1681SLisandro Dalcin PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 5699566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw)); 570e5ab1681SLisandro Dalcin if (!isdraw) PetscFunctionReturn(0); 5715c6c1daeSBarry Smith vdraw = (PetscViewer_Draw *)viewer->data; 572e5ab1681SLisandro Dalcin 5735c6c1daeSBarry Smith for (i = 0; i < vdraw->draw_max; i++) { 5749566063dSJacob Faibussowitsch if (vdraw->draw[i]) PetscCall(PetscDrawClear(vdraw->draw[i])); 5755c6c1daeSBarry Smith } 5765c6c1daeSBarry Smith PetscFunctionReturn(0); 5775c6c1daeSBarry Smith } 5785c6c1daeSBarry Smith 5795c6c1daeSBarry Smith /*@ 580811af0c4SBarry Smith PetscViewerDrawGetPause - Gets the pause value (how long to pause before an image is changed) in the `PETSCVIEWERDRAW` `PetscViewer` 5815c6c1daeSBarry Smith 5825c6c1daeSBarry Smith Not Collective 5835c6c1daeSBarry Smith 5845c6c1daeSBarry Smith Input Parameter: 585811af0c4SBarry Smith . viewer - the `PetscViewer` 5865c6c1daeSBarry Smith 5875c6c1daeSBarry Smith Output Parameter: 5885c6c1daeSBarry Smith . pause - the pause value 5895c6c1daeSBarry Smith 5905c6c1daeSBarry Smith Level: intermediate 5915c6c1daeSBarry Smith 592811af0c4SBarry Smith .seealso: `PETSCVIEWERDRAW`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`, 5935c6c1daeSBarry Smith @*/ 594d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawGetPause(PetscViewer viewer, PetscReal *pause) 595d71ae5a4SJacob Faibussowitsch { 5965c6c1daeSBarry Smith PetscViewer_Draw *vdraw; 597e5ab1681SLisandro Dalcin PetscBool isdraw; 598e5ab1681SLisandro Dalcin PetscInt i; 5995c6c1daeSBarry Smith PetscDraw draw; 6005c6c1daeSBarry Smith 6015c6c1daeSBarry Smith PetscFunctionBegin; 602e5ab1681SLisandro Dalcin PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 6039566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw)); 6049371c9d4SSatish Balay if (!isdraw) { 6059371c9d4SSatish Balay *pause = 0.0; 6069371c9d4SSatish Balay PetscFunctionReturn(0); 6079371c9d4SSatish Balay } 6085c6c1daeSBarry Smith vdraw = (PetscViewer_Draw *)viewer->data; 609e5ab1681SLisandro Dalcin 6105c6c1daeSBarry Smith for (i = 0; i < vdraw->draw_max; i++) { 6115c6c1daeSBarry Smith if (vdraw->draw[i]) { 6129566063dSJacob Faibussowitsch PetscCall(PetscDrawGetPause(vdraw->draw[i], pause)); 6135c6c1daeSBarry Smith PetscFunctionReturn(0); 6145c6c1daeSBarry Smith } 6155c6c1daeSBarry Smith } 6165c6c1daeSBarry Smith /* none exist yet so create one and get its pause */ 6179566063dSJacob Faibussowitsch PetscCall(PetscViewerDrawGetDraw(viewer, 0, &draw)); 6189566063dSJacob Faibussowitsch PetscCall(PetscDrawGetPause(draw, pause)); 6195c6c1daeSBarry Smith PetscFunctionReturn(0); 6205c6c1daeSBarry Smith } 6215c6c1daeSBarry Smith 6225c6c1daeSBarry Smith /*@ 623811af0c4SBarry Smith PetscViewerDrawSetPause - Sets a pause for each `PetscDraw` in the `PETSCVIEWERDRAW` `PetscViewer` 6245c6c1daeSBarry Smith 6255c6c1daeSBarry Smith Not Collective 6265c6c1daeSBarry Smith 6275c6c1daeSBarry Smith Input Parameters: 628811af0c4SBarry Smith + viewer - the `PetscViewer` 6295c6c1daeSBarry Smith - pause - the pause value 6305c6c1daeSBarry Smith 6315c6c1daeSBarry Smith Level: intermediate 6325c6c1daeSBarry Smith 633811af0c4SBarry Smith .seealso: `PETSCVIEWERDRAW`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`, 6345c6c1daeSBarry Smith @*/ 635d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawSetPause(PetscViewer viewer, PetscReal pause) 636d71ae5a4SJacob Faibussowitsch { 637e5ab1681SLisandro Dalcin PetscViewer_Draw *vdraw; 6385c6c1daeSBarry Smith PetscBool isdraw; 639e5ab1681SLisandro Dalcin PetscInt i; 6405c6c1daeSBarry Smith 6415c6c1daeSBarry Smith PetscFunctionBegin; 642e5ab1681SLisandro Dalcin PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 6439566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw)); 644e5ab1681SLisandro Dalcin if (!isdraw) PetscFunctionReturn(0); 645e5ab1681SLisandro Dalcin vdraw = (PetscViewer_Draw *)viewer->data; 646afe78b3cSBarry Smith 647afe78b3cSBarry Smith vdraw->pause = pause; 6485c6c1daeSBarry Smith for (i = 0; i < vdraw->draw_max; i++) { 6499566063dSJacob Faibussowitsch if (vdraw->draw[i]) PetscCall(PetscDrawSetPause(vdraw->draw[i], pause)); 6505c6c1daeSBarry Smith } 6515c6c1daeSBarry Smith PetscFunctionReturn(0); 6525c6c1daeSBarry Smith } 6535c6c1daeSBarry Smith 6545c6c1daeSBarry Smith /*@ 6555c6c1daeSBarry Smith PetscViewerDrawSetHold - Holds previous image when drawing new image 6565c6c1daeSBarry Smith 6575c6c1daeSBarry Smith Not Collective 6585c6c1daeSBarry Smith 6595c6c1daeSBarry Smith Input Parameters: 660811af0c4SBarry Smith + viewer - the `PetscViewer` 661811af0c4SBarry Smith - hold - `PETSC_TRUE` indicates to hold the previous image 6625c6c1daeSBarry Smith 6635c6c1daeSBarry Smith Level: intermediate 6645c6c1daeSBarry Smith 665811af0c4SBarry Smith .seealso: `PETSCVIEWERDRAW`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`, 6665c6c1daeSBarry Smith @*/ 667d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawSetHold(PetscViewer viewer, PetscBool hold) 668d71ae5a4SJacob Faibussowitsch { 6695c6c1daeSBarry Smith PetscViewer_Draw *vdraw; 6705c6c1daeSBarry Smith PetscBool isdraw; 6715c6c1daeSBarry Smith 6725c6c1daeSBarry Smith PetscFunctionBegin; 673e5ab1681SLisandro Dalcin PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 6749566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw)); 675e5ab1681SLisandro Dalcin if (!isdraw) PetscFunctionReturn(0); 6765c6c1daeSBarry Smith vdraw = (PetscViewer_Draw *)viewer->data; 677e5ab1681SLisandro Dalcin 6785c6c1daeSBarry Smith vdraw->hold = hold; 6795c6c1daeSBarry Smith PetscFunctionReturn(0); 6805c6c1daeSBarry Smith } 6815c6c1daeSBarry Smith 6825c6c1daeSBarry Smith /*@ 683811af0c4SBarry Smith PetscViewerDrawGetHold - Checks if the `PETSCVIEWERDRAW` `PetscViewer` holds previous image when drawing new image 6845c6c1daeSBarry Smith 6855c6c1daeSBarry Smith Not Collective 6865c6c1daeSBarry Smith 6875c6c1daeSBarry Smith Input Parameter: 688811af0c4SBarry Smith . viewer - the `PetscViewer` 6895c6c1daeSBarry Smith 6905c6c1daeSBarry Smith Output Parameter: 6915c6c1daeSBarry Smith . hold - indicates to hold or not 6925c6c1daeSBarry Smith 6935c6c1daeSBarry Smith Level: intermediate 6945c6c1daeSBarry Smith 695811af0c4SBarry Smith .seealso: `PETSCVIEWERDRAW`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`, 6965c6c1daeSBarry Smith @*/ 697d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawGetHold(PetscViewer viewer, PetscBool *hold) 698d71ae5a4SJacob Faibussowitsch { 6995c6c1daeSBarry Smith PetscViewer_Draw *vdraw; 7005c6c1daeSBarry Smith PetscBool isdraw; 7015c6c1daeSBarry Smith 7025c6c1daeSBarry Smith PetscFunctionBegin; 703e5ab1681SLisandro Dalcin PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 7049566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw)); 7059371c9d4SSatish Balay if (!isdraw) { 7069371c9d4SSatish Balay *hold = PETSC_FALSE; 7079371c9d4SSatish Balay PetscFunctionReturn(0); 7089371c9d4SSatish Balay } 7095c6c1daeSBarry Smith vdraw = (PetscViewer_Draw *)viewer->data; 710e5ab1681SLisandro Dalcin 7115c6c1daeSBarry Smith *hold = vdraw->hold; 7125c6c1daeSBarry Smith PetscFunctionReturn(0); 7135c6c1daeSBarry Smith } 7145c6c1daeSBarry Smith 7155c6c1daeSBarry Smith /* ---------------------------------------------------------------------*/ 7165c6c1daeSBarry Smith /* 7175c6c1daeSBarry Smith The variable Petsc_Viewer_Draw_keyval is used to indicate an MPI attribute that 7185c6c1daeSBarry Smith is attached to a communicator, in this case the attribute is a PetscViewer. 7195c6c1daeSBarry Smith */ 720d4c7638eSBarry Smith PetscMPIInt Petsc_Viewer_Draw_keyval = MPI_KEYVAL_INVALID; 7215c6c1daeSBarry Smith 7225c6c1daeSBarry Smith /*@C 723811af0c4SBarry Smith PETSC_VIEWER_DRAW_ - Creates a window `PETSCVIEWERDRAW` `PetscViewer` shared by all processors 7245c6c1daeSBarry Smith in a communicator. 7255c6c1daeSBarry Smith 726d083f849SBarry Smith Collective 7275c6c1daeSBarry Smith 7285c6c1daeSBarry Smith Input Parameter: 729811af0c4SBarry Smith . comm - the MPI communicator to share the window `PetscViewer` 7305c6c1daeSBarry Smith 7315c6c1daeSBarry Smith Level: intermediate 7325c6c1daeSBarry Smith 733811af0c4SBarry Smith Note: 734811af0c4SBarry Smith Unlike almost all other PETSc routines, `PETSC_VIEWER_DRAW_()` does not return 7355c6c1daeSBarry Smith an error code. The window is usually used in the form 7365c6c1daeSBarry Smith $ XXXView(XXX object,PETSC_VIEWER_DRAW_(comm)); 7375c6c1daeSBarry Smith 738811af0c4SBarry Smith .seealso: `PETSCVIEWERDRAW`, `PetscViewer`, `PETSC_VIEWER_DRAW_WORLD`, `PETSC_VIEWER_DRAW_SELF`, `PetscViewerDrawOpen()`, 7395c6c1daeSBarry Smith @*/ 740d71ae5a4SJacob Faibussowitsch PetscViewer PETSC_VIEWER_DRAW_(MPI_Comm comm) 741d71ae5a4SJacob Faibussowitsch { 7425c6c1daeSBarry Smith PetscErrorCode ierr; 7435c6c1daeSBarry Smith PetscMPIInt flag; 7445c6c1daeSBarry Smith PetscViewer viewer; 7455c6c1daeSBarry Smith MPI_Comm ncomm; 7465c6c1daeSBarry Smith 7475c6c1daeSBarry Smith PetscFunctionBegin; 7489371c9d4SSatish Balay ierr = PetscCommDuplicate(comm, &ncomm, NULL); 7499371c9d4SSatish Balay if (ierr) { 7509371c9d4SSatish Balay PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_DRAW_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_INITIAL, " "); 7519371c9d4SSatish Balay PetscFunctionReturn(NULL); 7529371c9d4SSatish Balay } 7535c6c1daeSBarry Smith if (Petsc_Viewer_Draw_keyval == MPI_KEYVAL_INVALID) { 75402c9f0b5SLisandro Dalcin ierr = MPI_Comm_create_keyval(MPI_COMM_NULL_COPY_FN, MPI_COMM_NULL_DELETE_FN, &Petsc_Viewer_Draw_keyval, NULL); 7559371c9d4SSatish Balay if (ierr) { 7569371c9d4SSatish Balay PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_DRAW_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_INITIAL, " "); 7579371c9d4SSatish Balay PetscFunctionReturn(NULL); 7589371c9d4SSatish Balay } 7595c6c1daeSBarry Smith } 76047435625SJed Brown ierr = MPI_Comm_get_attr(ncomm, Petsc_Viewer_Draw_keyval, (void **)&viewer, &flag); 7619371c9d4SSatish Balay if (ierr) { 7629371c9d4SSatish Balay PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_DRAW_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_INITIAL, " "); 7639371c9d4SSatish Balay PetscFunctionReturn(NULL); 7649371c9d4SSatish Balay } 7655c6c1daeSBarry Smith if (!flag) { /* PetscViewer not yet created */ 76602c9f0b5SLisandro Dalcin ierr = PetscViewerDrawOpen(ncomm, NULL, NULL, PETSC_DECIDE, PETSC_DECIDE, 300, 300, &viewer); 7679371c9d4SSatish Balay if (ierr) { 7689371c9d4SSatish Balay PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_DRAW_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_REPEAT, " "); 7699371c9d4SSatish Balay PetscFunctionReturn(NULL); 7709371c9d4SSatish Balay } 7715c6c1daeSBarry Smith ierr = PetscObjectRegisterDestroy((PetscObject)viewer); 7729371c9d4SSatish Balay if (ierr) { 7739371c9d4SSatish Balay PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_DRAW_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_REPEAT, " "); 7749371c9d4SSatish Balay PetscFunctionReturn(NULL); 7759371c9d4SSatish Balay } 77647435625SJed Brown ierr = MPI_Comm_set_attr(ncomm, Petsc_Viewer_Draw_keyval, (void *)viewer); 7779371c9d4SSatish Balay if (ierr) { 7789371c9d4SSatish Balay PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_DRAW_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_INITIAL, " "); 7799371c9d4SSatish Balay PetscFunctionReturn(NULL); 7809371c9d4SSatish Balay } 7815c6c1daeSBarry Smith } 7825c6c1daeSBarry Smith ierr = PetscCommDestroy(&ncomm); 7839371c9d4SSatish Balay if (ierr) { 7849371c9d4SSatish Balay PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_DRAW_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_REPEAT, " "); 7859371c9d4SSatish Balay PetscFunctionReturn(NULL); 7869371c9d4SSatish Balay } 7875c6c1daeSBarry Smith PetscFunctionReturn(viewer); 7885c6c1daeSBarry Smith } 7895c6c1daeSBarry Smith 7905c6c1daeSBarry Smith /*@ 7915c6c1daeSBarry Smith PetscViewerDrawSetBounds - sets the upper and lower bounds to be used in plotting 7925c6c1daeSBarry Smith 793*c3339decSBarry Smith Collective 7945c6c1daeSBarry Smith 7955c6c1daeSBarry Smith Input Parameters: 796811af0c4SBarry Smith + viewer - the Petsc`Viewer` (created with `PetscViewerDrawOpen()`) 797811af0c4SBarry Smith . nbounds - number of plots that can be made with this viewer, for example the dof passed to `DMDACreate()` 7985c6c1daeSBarry 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, ..... 7995c6c1daeSBarry Smith 800811af0c4SBarry Smith Options Database Key: 80110699b91SBarry Smith . -draw_bounds minF0,maxF0,minF1,maxF1 - the lower left and upper right bounds 802e9457bf7SBarry Smith 8035c6c1daeSBarry Smith Level: intermediate 8045c6c1daeSBarry Smith 805811af0c4SBarry Smith Note: 806811af0c4SBarry 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 807f3f0eb19SBarry 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 808f3f0eb19SBarry Smith this viewer. Otherwise the color to physical value meaning changes with each new image if this is not set. 809f3f0eb19SBarry Smith 810811af0c4SBarry Smith .seealso: `PETSCVIEWERDRAW`, `PetscViewerDrawGetLG()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()` 8115c6c1daeSBarry Smith @*/ 812d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawSetBounds(PetscViewer viewer, PetscInt nbounds, const PetscReal *bounds) 813d71ae5a4SJacob Faibussowitsch { 814e5ab1681SLisandro Dalcin PetscViewer_Draw *vdraw; 815e5ab1681SLisandro Dalcin PetscBool isdraw; 8165c6c1daeSBarry Smith 8175c6c1daeSBarry Smith PetscFunctionBegin; 8185c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 8199566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw)); 820e5ab1681SLisandro Dalcin if (!isdraw) PetscFunctionReturn(0); 821e5ab1681SLisandro Dalcin vdraw = (PetscViewer_Draw *)viewer->data; 822a297a907SKarl Rupp 823e5ab1681SLisandro Dalcin vdraw->nbounds = nbounds; 8249566063dSJacob Faibussowitsch PetscCall(PetscFree(vdraw->bounds)); 8259566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(2 * nbounds, &vdraw->bounds)); 8269566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(vdraw->bounds, bounds, 2 * nbounds)); 8275c6c1daeSBarry Smith PetscFunctionReturn(0); 8285c6c1daeSBarry Smith } 8295c6c1daeSBarry Smith 8305c6c1daeSBarry Smith /*@C 831811af0c4SBarry Smith PetscViewerDrawGetBounds - gets the upper and lower bounds to be used in plotting set with `PetscViewerDrawSetBounds()` 8325c6c1daeSBarry Smith 833*c3339decSBarry Smith Collective 8345c6c1daeSBarry Smith 8355c6c1daeSBarry Smith Input Parameter: 836811af0c4SBarry Smith . viewer - the `PetscViewer` (created with `PetscViewerDrawOpen()`) 8375c6c1daeSBarry Smith 838fd292e60Sprj- Output Parameters: 839811af0c4SBarry Smith + nbounds - number of plots that can be made with this viewer, for example the dof passed to `DMDACreate()` 8405c6c1daeSBarry 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, ..... 8415c6c1daeSBarry Smith 8425c6c1daeSBarry Smith Level: intermediate 8435c6c1daeSBarry Smith 844811af0c4SBarry Smith .seealso: `PETSCVIEWERDRAW`, `PetscViewerDrawGetLG()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()`, `PetscViewerDrawSetBounds()` 8455c6c1daeSBarry Smith @*/ 846d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawGetBounds(PetscViewer viewer, PetscInt *nbounds, const PetscReal **bounds) 847d71ae5a4SJacob Faibussowitsch { 848e5ab1681SLisandro Dalcin PetscViewer_Draw *vdraw; 849e5ab1681SLisandro Dalcin PetscBool isdraw; 8505c6c1daeSBarry Smith 8515c6c1daeSBarry Smith PetscFunctionBegin; 8525c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 8539566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw)); 8549371c9d4SSatish Balay if (!isdraw) { 8559371c9d4SSatish Balay if (nbounds) *nbounds = 0; 8569371c9d4SSatish Balay if (bounds) *bounds = NULL; 8579371c9d4SSatish Balay PetscFunctionReturn(0); 8589371c9d4SSatish Balay } 859e5ab1681SLisandro Dalcin vdraw = (PetscViewer_Draw *)viewer->data; 860e5ab1681SLisandro Dalcin 861e5ab1681SLisandro Dalcin if (nbounds) *nbounds = vdraw->nbounds; 862e5ab1681SLisandro Dalcin if (bounds) *bounds = vdraw->bounds; 8635c6c1daeSBarry Smith PetscFunctionReturn(0); 8645c6c1daeSBarry Smith } 865