15c6c1daeSBarry Smith 25c6c1daeSBarry Smith #include <../src/sys/classes/viewer/impls/draw/vdraw.h> /*I "petscdraw.h" I*/ 3665c2dedSJed Brown #include <petscviewer.h> /*I "petscviewer.h" I*/ 45c6c1daeSBarry Smith 5d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerDestroy_Draw(PetscViewer v) 6d71ae5a4SJacob Faibussowitsch { 75c6c1daeSBarry Smith PetscInt i; 85c6c1daeSBarry Smith PetscViewer_Draw *vdraw = (PetscViewer_Draw *)v->data; 95c6c1daeSBarry Smith 105c6c1daeSBarry Smith PetscFunctionBegin; 1128b400f6SJacob Faibussowitsch PetscCheck(!vdraw->singleton_made, PETSC_COMM_SELF, PETSC_ERR_ORDER, "Destroying PetscViewer without first restoring singleton"); 125c6c1daeSBarry Smith for (i = 0; i < vdraw->draw_max; i++) { 139566063dSJacob Faibussowitsch PetscCall(PetscDrawAxisDestroy(&vdraw->drawaxis[i])); 149566063dSJacob Faibussowitsch PetscCall(PetscDrawLGDestroy(&vdraw->drawlg[i])); 159566063dSJacob Faibussowitsch PetscCall(PetscDrawDestroy(&vdraw->draw[i])); 165c6c1daeSBarry Smith } 179566063dSJacob Faibussowitsch PetscCall(PetscFree(vdraw->display)); 189566063dSJacob Faibussowitsch PetscCall(PetscFree(vdraw->title)); 199566063dSJacob Faibussowitsch PetscCall(PetscFree3(vdraw->draw, vdraw->drawlg, vdraw->drawaxis)); 209566063dSJacob Faibussowitsch PetscCall(PetscFree(vdraw->bounds)); 219566063dSJacob Faibussowitsch PetscCall(PetscFree(vdraw->drawtype)); 229566063dSJacob Faibussowitsch PetscCall(PetscFree(v->data)); 233ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 245c6c1daeSBarry Smith } 255c6c1daeSBarry Smith 26d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscViewerFlush_Draw(PetscViewer v) 27d71ae5a4SJacob Faibussowitsch { 285c6c1daeSBarry Smith PetscInt i; 295c6c1daeSBarry Smith PetscViewer_Draw *vdraw = (PetscViewer_Draw *)v->data; 305c6c1daeSBarry Smith 315c6c1daeSBarry Smith PetscFunctionBegin; 325c6c1daeSBarry Smith for (i = 0; i < vdraw->draw_max; i++) { 339566063dSJacob Faibussowitsch if (vdraw->draw[i]) PetscCall(PetscDrawFlush(vdraw->draw[i])); 345c6c1daeSBarry Smith } 353ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 365c6c1daeSBarry Smith } 375c6c1daeSBarry Smith 385c6c1daeSBarry Smith /*@C 39c410d8ccSBarry Smith PetscViewerDrawGetDraw - Returns `PetscDraw` object from `PETSCVIEWERDRAW` `PetscViewer` object. 40c410d8ccSBarry Smith This `PetscDraw` object may then be used to perform graphics using `PetscDraw` commands. 415c6c1daeSBarry Smith 42c3339decSBarry Smith Collective 435c6c1daeSBarry Smith 445c6c1daeSBarry Smith Input Parameters: 45811af0c4SBarry Smith + viewer - the `PetscViewer` (created with `PetscViewerDrawOpen()` of type `PETSCVIEWERDRAW`) 46c410d8ccSBarry Smith - windownumber - indicates which subwindow (usually 0) to obtain 475c6c1daeSBarry Smith 4801d2d390SJose E. Roman Output Parameter: 495c6c1daeSBarry Smith . draw - the draw object 505c6c1daeSBarry Smith 515c6c1daeSBarry Smith Level: intermediate 525c6c1daeSBarry Smith 53d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscViewerDrawGetLG()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()` 545c6c1daeSBarry Smith @*/ 55d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawGetDraw(PetscViewer viewer, PetscInt windownumber, PetscDraw *draw) 56d71ae5a4SJacob Faibussowitsch { 57e5ab1681SLisandro Dalcin PetscViewer_Draw *vdraw; 585c6c1daeSBarry Smith PetscBool isdraw; 595c6c1daeSBarry Smith 605c6c1daeSBarry Smith PetscFunctionBegin; 615c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 62e5ab1681SLisandro Dalcin PetscValidLogicalCollectiveInt(viewer, windownumber, 2); 635c6c1daeSBarry Smith if (draw) PetscValidPointer(draw, 3); 649566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw)); 6528b400f6SJacob Faibussowitsch PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer"); 6608401ef6SPierre Jolivet PetscCheck(windownumber >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Window number cannot be negative"); 67e5ab1681SLisandro Dalcin vdraw = (PetscViewer_Draw *)viewer->data; 68e5ab1681SLisandro Dalcin 695c6c1daeSBarry Smith windownumber += vdraw->draw_base; 705c6c1daeSBarry Smith if (windownumber >= vdraw->draw_max) { 715c6c1daeSBarry Smith /* allocate twice as many slots as needed */ 725c6c1daeSBarry Smith PetscInt draw_max = vdraw->draw_max; 735c6c1daeSBarry Smith PetscDraw *tdraw = vdraw->draw; 745c6c1daeSBarry Smith PetscDrawLG *drawlg = vdraw->drawlg; 755c6c1daeSBarry Smith PetscDrawAxis *drawaxis = vdraw->drawaxis; 765c6c1daeSBarry Smith 775c6c1daeSBarry Smith vdraw->draw_max = 2 * windownumber; 78a297a907SKarl Rupp 799566063dSJacob Faibussowitsch PetscCall(PetscCalloc3(vdraw->draw_max, &vdraw->draw, vdraw->draw_max, &vdraw->drawlg, vdraw->draw_max, &vdraw->drawaxis)); 809566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(vdraw->draw, tdraw, draw_max)); 819566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(vdraw->drawlg, drawlg, draw_max)); 829566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(vdraw->drawaxis, drawaxis, draw_max)); 839566063dSJacob Faibussowitsch PetscCall(PetscFree3(tdraw, drawlg, drawaxis)); 845c6c1daeSBarry Smith } 855c6c1daeSBarry Smith 865c6c1daeSBarry Smith if (!vdraw->draw[windownumber]) { 87e5ab1681SLisandro Dalcin char *title = vdraw->title, tmp_str[128]; 8810f3a0f4SLisandro Dalcin if (windownumber) { 899566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(tmp_str, sizeof(tmp_str), "%s:%" PetscInt_FMT, vdraw->title ? vdraw->title : "", windownumber)); 905c6c1daeSBarry Smith title = tmp_str; 915c6c1daeSBarry Smith } 929566063dSJacob Faibussowitsch PetscCall(PetscDrawCreate(PetscObjectComm((PetscObject)viewer), vdraw->display, title, PETSC_DECIDE, PETSC_DECIDE, vdraw->w, vdraw->h, &vdraw->draw[windownumber])); 9348a46eb9SPierre Jolivet if (vdraw->drawtype) PetscCall(PetscDrawSetType(vdraw->draw[windownumber], vdraw->drawtype)); 949566063dSJacob Faibussowitsch PetscCall(PetscDrawSetPause(vdraw->draw[windownumber], vdraw->pause)); 959566063dSJacob Faibussowitsch PetscCall(PetscDrawSetOptionsPrefix(vdraw->draw[windownumber], ((PetscObject)viewer)->prefix)); 969566063dSJacob Faibussowitsch PetscCall(PetscDrawSetFromOptions(vdraw->draw[windownumber])); 975c6c1daeSBarry Smith } 985c6c1daeSBarry Smith if (draw) *draw = vdraw->draw[windownumber]; 99064a246eSJacob Faibussowitsch if (draw) PetscValidHeaderSpecific(*draw, PETSC_DRAW_CLASSID, 3); 1003ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1015c6c1daeSBarry Smith } 1025c6c1daeSBarry Smith 1035c6c1daeSBarry Smith /*@C 104c410d8ccSBarry Smith PetscViewerDrawBaseAdd - add to the base integer that is added to the `windownumber` passed to `PetscViewerDrawGetDraw()` 1055c6c1daeSBarry Smith 106c3339decSBarry Smith Logically Collective 1075c6c1daeSBarry Smith 1085c6c1daeSBarry Smith Input Parameters: 109811af0c4SBarry Smith + viewer - the `PetscViewer` (created with `PetscViewerDrawOpen()`) 1105c6c1daeSBarry Smith - windownumber - how much to add to the base 1115c6c1daeSBarry Smith 1125c6c1daeSBarry Smith Level: developer 1135c6c1daeSBarry Smith 114811af0c4SBarry Smith Note: 115811af0c4SBarry Smith A `PETSCVIEWERDRAW` may have multiple `PetscDraw` subwindows, this increases the number of the subwindow that is returned with `PetscViewerDrawGetDraw()` 116811af0c4SBarry Smith 117d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewerDrawGetLG()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`, `PetscViewerDrawBaseSet()` 1185c6c1daeSBarry Smith @*/ 119d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawBaseAdd(PetscViewer viewer, PetscInt windownumber) 120d71ae5a4SJacob Faibussowitsch { 121e5ab1681SLisandro Dalcin PetscViewer_Draw *vdraw; 1225c6c1daeSBarry Smith PetscBool isdraw; 1235c6c1daeSBarry Smith 1245c6c1daeSBarry Smith PetscFunctionBegin; 1255c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 126e5ab1681SLisandro Dalcin PetscValidLogicalCollectiveInt(viewer, windownumber, 2); 1279566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw)); 12828b400f6SJacob Faibussowitsch PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer"); 129e5ab1681SLisandro Dalcin vdraw = (PetscViewer_Draw *)viewer->data; 130e5ab1681SLisandro Dalcin 131cc73adaaSBarry Smith PetscCheck(windownumber + vdraw->draw_base >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Resulting base %" PetscInt_FMT " cannot be negative", windownumber + vdraw->draw_base); 1325c6c1daeSBarry Smith vdraw->draw_base += windownumber; 1333ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1345c6c1daeSBarry Smith } 1355c6c1daeSBarry Smith 1365c6c1daeSBarry Smith /*@C 137c410d8ccSBarry Smith PetscViewerDrawBaseSet - sets the base integer that is added to the `windownumber` passed to `PetscViewerDrawGetDraw()` 1385c6c1daeSBarry Smith 139c3339decSBarry Smith Logically Collective 1405c6c1daeSBarry Smith 1415c6c1daeSBarry Smith Input Parameters: 142811af0c4SBarry Smith + viewer - the `PetscViewer` (created with `PetscViewerDrawOpen()`) 1435c6c1daeSBarry Smith - windownumber - value to set the base 1445c6c1daeSBarry Smith 1455c6c1daeSBarry Smith Level: developer 1465c6c1daeSBarry Smith 147811af0c4SBarry Smith Note: 148811af0c4SBarry Smith A `PETSCVIEWERDRAW` may have multiple `PetscDraw` subwindows, this increases the number of the subwindow that is returned with `PetscViewerDrawGetDraw()` 149811af0c4SBarry Smith 150d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewerDrawGetLG()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`, `PetscViewerDrawBaseAdd()` 1515c6c1daeSBarry Smith @*/ 152d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawBaseSet(PetscViewer viewer, PetscInt windownumber) 153d71ae5a4SJacob Faibussowitsch { 154e5ab1681SLisandro Dalcin PetscViewer_Draw *vdraw; 1555c6c1daeSBarry Smith PetscBool isdraw; 1565c6c1daeSBarry Smith 1575c6c1daeSBarry Smith PetscFunctionBegin; 1585c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 159e5ab1681SLisandro Dalcin PetscValidLogicalCollectiveInt(viewer, windownumber, 2); 1609566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw)); 16128b400f6SJacob Faibussowitsch PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer"); 162e5ab1681SLisandro Dalcin vdraw = (PetscViewer_Draw *)viewer->data; 163e5ab1681SLisandro Dalcin 16408401ef6SPierre Jolivet PetscCheck(windownumber >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Resulting base %" PetscInt_FMT " cannot be negative", windownumber); 1655c6c1daeSBarry Smith vdraw->draw_base = windownumber; 1663ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1675c6c1daeSBarry Smith } 1685c6c1daeSBarry Smith 1695c6c1daeSBarry Smith /*@C 170811af0c4SBarry Smith PetscViewerDrawGetDrawLG - Returns a `PetscDrawLG` object from `PetscViewer` object of type `PETSCVIEWERDRAW`. 171811af0c4SBarry Smith This `PetscDrawLG` object may then be used to perform graphics using `PetscDrawLG` commands. 1725c6c1daeSBarry Smith 173c3339decSBarry Smith Collective 1745c6c1daeSBarry Smith 175d8d19677SJose E. Roman Input Parameters: 1762fe279fdSBarry Smith + viewer - the `PetscViewer` (created with `PetscViewerDrawOpen()`) 1775c6c1daeSBarry Smith - windownumber - indicates which subwindow (usually 0) 1785c6c1daeSBarry Smith 17901d2d390SJose E. Roman Output Parameter: 180*aec76313SJacob Faibussowitsch . drawlg - the draw line graph object 1815c6c1daeSBarry Smith 1825c6c1daeSBarry Smith Level: intermediate 1835c6c1daeSBarry Smith 184811af0c4SBarry Smith Note: 185811af0c4SBarry Smith A `PETSCVIEWERDRAW` may have multiple `PetscDraw` subwindows 186811af0c4SBarry Smith 187d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscDrawLG`, `PetscViewerDrawGetDraw()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()` 1885c6c1daeSBarry Smith @*/ 189d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawGetDrawLG(PetscViewer viewer, PetscInt windownumber, PetscDrawLG *drawlg) 190d71ae5a4SJacob Faibussowitsch { 1915c6c1daeSBarry Smith PetscBool isdraw; 192e5ab1681SLisandro Dalcin PetscViewer_Draw *vdraw; 1935c6c1daeSBarry Smith 1945c6c1daeSBarry Smith PetscFunctionBegin; 1955c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 196e5ab1681SLisandro Dalcin PetscValidLogicalCollectiveInt(viewer, windownumber, 2); 1975c6c1daeSBarry Smith PetscValidPointer(drawlg, 3); 1989566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw)); 19928b400f6SJacob Faibussowitsch PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer"); 20008401ef6SPierre Jolivet PetscCheck(windownumber >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Window number cannot be negative"); 201e5ab1681SLisandro Dalcin vdraw = (PetscViewer_Draw *)viewer->data; 2025c6c1daeSBarry Smith 20348a46eb9SPierre Jolivet if (windownumber + vdraw->draw_base >= vdraw->draw_max || !vdraw->draw[windownumber + vdraw->draw_base]) PetscCall(PetscViewerDrawGetDraw(viewer, windownumber, NULL)); 2045c6c1daeSBarry Smith if (!vdraw->drawlg[windownumber + vdraw->draw_base]) { 2059566063dSJacob Faibussowitsch PetscCall(PetscDrawLGCreate(vdraw->draw[windownumber + vdraw->draw_base], 1, &vdraw->drawlg[windownumber + vdraw->draw_base])); 2069566063dSJacob Faibussowitsch PetscCall(PetscDrawLGSetFromOptions(vdraw->drawlg[windownumber + vdraw->draw_base])); 2075c6c1daeSBarry Smith } 2085c6c1daeSBarry Smith *drawlg = vdraw->drawlg[windownumber + vdraw->draw_base]; 2093ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2105c6c1daeSBarry Smith } 2115c6c1daeSBarry Smith 2125c6c1daeSBarry Smith /*@C 213811af0c4SBarry Smith PetscViewerDrawGetDrawAxis - Returns a `PetscDrawAxis` object from a `PetscViewer` object of type `PETSCVIEWERDRAW`. 214811af0c4SBarry Smith This `PetscDrawAxis` object may then be used to perform graphics using `PetscDrawAxis` commands. 2155c6c1daeSBarry Smith 216c3339decSBarry Smith Collective 2175c6c1daeSBarry Smith 218d8d19677SJose E. Roman Input Parameters: 219811af0c4SBarry Smith + viewer - the `PetscViewer` (created with `PetscViewerDrawOpen()`) 2205c6c1daeSBarry Smith - windownumber - indicates which subwindow (usually 0) 2215c6c1daeSBarry Smith 22201d2d390SJose E. Roman Output Parameter: 2235c6c1daeSBarry Smith . drawaxis - the draw axis object 2245c6c1daeSBarry Smith 2255c6c1daeSBarry Smith Level: advanced 2265c6c1daeSBarry Smith 227811af0c4SBarry Smith Note: 228811af0c4SBarry Smith A `PETSCVIEWERDRAW` may have multiple `PetscDraw` subwindows 229811af0c4SBarry Smith 230d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewerDrawGetDraw()`, `PetscViewerDrawGetLG()`, `PetscViewerDrawOpen()` 2315c6c1daeSBarry Smith @*/ 232d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawGetDrawAxis(PetscViewer viewer, PetscInt windownumber, PetscDrawAxis *drawaxis) 233d71ae5a4SJacob Faibussowitsch { 2345c6c1daeSBarry Smith PetscBool isdraw; 235e5ab1681SLisandro Dalcin PetscViewer_Draw *vdraw; 2365c6c1daeSBarry Smith 2375c6c1daeSBarry Smith PetscFunctionBegin; 2385c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 239e5ab1681SLisandro Dalcin PetscValidLogicalCollectiveInt(viewer, windownumber, 2); 2405c6c1daeSBarry Smith PetscValidPointer(drawaxis, 3); 2419566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw)); 24228b400f6SJacob Faibussowitsch PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer"); 24308401ef6SPierre Jolivet PetscCheck(windownumber >= 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "Window number cannot be negative"); 244e5ab1681SLisandro Dalcin vdraw = (PetscViewer_Draw *)viewer->data; 2455c6c1daeSBarry Smith 24648a46eb9SPierre Jolivet if (windownumber + vdraw->draw_base >= vdraw->draw_max || !vdraw->draw[windownumber + vdraw->draw_base]) PetscCall(PetscViewerDrawGetDraw(viewer, windownumber, NULL)); 2474dfa11a4SJacob Faibussowitsch if (!vdraw->drawaxis[windownumber + vdraw->draw_base]) PetscCall(PetscDrawAxisCreate(vdraw->draw[windownumber + vdraw->draw_base], &vdraw->drawaxis[windownumber + vdraw->draw_base])); 2485c6c1daeSBarry Smith *drawaxis = vdraw->drawaxis[windownumber + vdraw->draw_base]; 2493ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2505c6c1daeSBarry Smith } 2515c6c1daeSBarry Smith 252d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawResize(PetscViewer v, int w, int h) 253d71ae5a4SJacob Faibussowitsch { 254e5ab1681SLisandro Dalcin PetscViewer_Draw *vdraw; 255e5ab1681SLisandro Dalcin PetscBool isdraw; 2565c6c1daeSBarry Smith 2575c6c1daeSBarry Smith PetscFunctionBegin; 258e5ab1681SLisandro Dalcin PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1); 2599566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw)); 2603ba16761SJacob Faibussowitsch if (!isdraw) PetscFunctionReturn(PETSC_SUCCESS); 261e5ab1681SLisandro Dalcin vdraw = (PetscViewer_Draw *)v->data; 262e5ab1681SLisandro Dalcin 263e5ab1681SLisandro Dalcin if (w >= 1) vdraw->w = w; 264e5ab1681SLisandro Dalcin if (h >= 1) vdraw->h = h; 2653ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2665c6c1daeSBarry Smith } 2675c6c1daeSBarry Smith 268d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawSetInfo(PetscViewer v, const char display[], const char title[], int x, int y, int w, int h) 269d71ae5a4SJacob Faibussowitsch { 270e5ab1681SLisandro Dalcin PetscViewer_Draw *vdraw; 271e5ab1681SLisandro Dalcin PetscBool isdraw; 2725c6c1daeSBarry Smith 2735c6c1daeSBarry Smith PetscFunctionBegin; 274e5ab1681SLisandro Dalcin PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1); 2759566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw)); 2763ba16761SJacob Faibussowitsch if (!isdraw) PetscFunctionReturn(PETSC_SUCCESS); 277e5ab1681SLisandro Dalcin vdraw = (PetscViewer_Draw *)v->data; 278e5ab1681SLisandro Dalcin 2799566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(display, &vdraw->display)); 2809566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(title, &vdraw->title)); 281e5ab1681SLisandro Dalcin if (w >= 1) vdraw->w = w; 282e5ab1681SLisandro Dalcin if (h >= 1) vdraw->h = h; 2833ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2845c6c1daeSBarry Smith } 2855c6c1daeSBarry Smith 286d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawSetDrawType(PetscViewer v, PetscDrawType drawtype) 287d71ae5a4SJacob Faibussowitsch { 288e5ab1681SLisandro Dalcin PetscViewer_Draw *vdraw; 289e5ab1681SLisandro Dalcin PetscBool isdraw; 290d1da0b69SBarry Smith 291d1da0b69SBarry Smith PetscFunctionBegin; 292e5ab1681SLisandro Dalcin PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1); 2939566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw)); 2943ba16761SJacob Faibussowitsch if (!isdraw) PetscFunctionReturn(PETSC_SUCCESS); 295e5ab1681SLisandro Dalcin vdraw = (PetscViewer_Draw *)v->data; 296e5ab1681SLisandro Dalcin 2979566063dSJacob Faibussowitsch PetscCall(PetscFree(vdraw->drawtype)); 2989566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(drawtype, (char **)&vdraw->drawtype)); 2993ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 300d1da0b69SBarry Smith } 301d1da0b69SBarry Smith 302d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawGetDrawType(PetscViewer v, PetscDrawType *drawtype) 303d71ae5a4SJacob Faibussowitsch { 3041f49e1f7SLisandro Dalcin PetscViewer_Draw *vdraw; 3051f49e1f7SLisandro Dalcin PetscBool isdraw; 3061f49e1f7SLisandro Dalcin 3071f49e1f7SLisandro Dalcin PetscFunctionBegin; 3081f49e1f7SLisandro Dalcin PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1); 3099566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw)); 31028b400f6SJacob Faibussowitsch PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer"); 3111f49e1f7SLisandro Dalcin vdraw = (PetscViewer_Draw *)v->data; 3121f49e1f7SLisandro Dalcin 3131f49e1f7SLisandro Dalcin *drawtype = vdraw->drawtype; 3143ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 3151f49e1f7SLisandro Dalcin } 3161f49e1f7SLisandro Dalcin 317d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawSetTitle(PetscViewer v, const char title[]) 318d71ae5a4SJacob Faibussowitsch { 319f55236e4SLisandro Dalcin PetscViewer_Draw *vdraw; 320f55236e4SLisandro Dalcin PetscBool isdraw; 321f55236e4SLisandro Dalcin 322f55236e4SLisandro Dalcin PetscFunctionBegin; 323f55236e4SLisandro Dalcin PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1); 3249566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw)); 3253ba16761SJacob Faibussowitsch if (!isdraw) PetscFunctionReturn(PETSC_SUCCESS); 326f55236e4SLisandro Dalcin vdraw = (PetscViewer_Draw *)v->data; 327f55236e4SLisandro Dalcin 3289566063dSJacob Faibussowitsch PetscCall(PetscFree(vdraw->title)); 3299566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(title, &vdraw->title)); 3303ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 331f55236e4SLisandro Dalcin } 332f55236e4SLisandro Dalcin 333d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawGetTitle(PetscViewer v, const char *title[]) 334d71ae5a4SJacob Faibussowitsch { 335f55236e4SLisandro Dalcin PetscViewer_Draw *vdraw; 336f55236e4SLisandro Dalcin PetscBool isdraw; 337f55236e4SLisandro Dalcin 338f55236e4SLisandro Dalcin PetscFunctionBegin; 339f55236e4SLisandro Dalcin PetscValidHeaderSpecific(v, PETSC_VIEWER_CLASSID, 1); 3409566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERDRAW, &isdraw)); 34128b400f6SJacob Faibussowitsch PetscCheck(isdraw, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Must be draw type PetscViewer"); 342f55236e4SLisandro Dalcin vdraw = (PetscViewer_Draw *)v->data; 343f55236e4SLisandro Dalcin 344f55236e4SLisandro Dalcin *title = vdraw->title; 3453ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 346f55236e4SLisandro Dalcin } 347f55236e4SLisandro Dalcin 3485c6c1daeSBarry Smith /*@C 349811af0c4SBarry Smith PetscViewerDrawOpen - Opens a `PetscDraw` window for use as a `PetscViewer` with type `PETSCVIEWERDRAW`. If you want to 350811af0c4SBarry Smith do graphics in this window, you must call `PetscViewerDrawGetDraw()` and 351811af0c4SBarry Smith perform the graphics on the `PetscDraw` object. 3525c6c1daeSBarry Smith 353d083f849SBarry Smith Collective 3545c6c1daeSBarry Smith 3555c6c1daeSBarry Smith Input Parameters: 3565c6c1daeSBarry Smith + comm - communicator that will share window 3573f423023SBarry Smith . display - the X display on which to open, or `NULL` for the local machine 3583f423023SBarry Smith . title - the title to put in the title bar, or `NULL` for no title 359aaa8cc7dSPierre Jolivet . x - horizontal screen coordinate of the upper left corner of window, or use `PETSC_DECIDE` 3602fe279fdSBarry Smith . y - vertical screen coordinate of the upper left corner of window, or use `PETSC_DECIDE` 3612fe279fdSBarry Smith . w - window width in pixels, or may use `PETSC_DECIDE` or `PETSC_DRAW_FULL_SIZE`, `PETSC_DRAW_HALF_SIZE`,`PETSC_DRAW_THIRD_SIZE`, `PETSC_DRAW_QUARTER_SIZE` 3622fe279fdSBarry Smith - h - window height in pixels, or may use `PETSC_DECIDE` or `PETSC_DRAW_FULL_SIZE`, `PETSC_DRAW_HALF_SIZE`,`PETSC_DRAW_THIRD_SIZE`, `PETSC_DRAW_QUARTER_SIZE` 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 382*aec76313SJacob Faibussowitsch Fortran Notes: 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 388d1f92df0SBarry Smith .seealso: [](sec_viewers), `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)); 3973ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 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; 4423ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 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; 4783ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 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(); 4923ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 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; 500ccb5f961SBarry Smith PetscBool iascii; 5010076e027SBarry Smith 5020076e027SBarry Smith PetscFunctionBegin; 503ccb5f961SBarry Smith PetscCall(PetscObjectTypeCompare((PetscObject)v, PETSCVIEWERASCII, &iascii)); 504ccb5f961SBarry Smith if (iascii) PetscCall(PetscViewerASCIIPrintf(v, "Draw viewer is of type %s\n", vdraw->drawtype)); 5050076e027SBarry Smith /* If the PetscViewer has just been created then no vdraw->draw yet 5060076e027SBarry Smith exists so this will not actually call the viewer on any draws. */ 5070076e027SBarry Smith for (i = 0; i < vdraw->draw_base; i++) { 5080076e027SBarry Smith if (vdraw->draw[i]) { 5099566063dSJacob Faibussowitsch PetscCall(PetscViewerDrawGetDraw(viewer, i, &draw)); 5109566063dSJacob Faibussowitsch PetscCall(PetscDrawView(draw, v)); 5110076e027SBarry Smith } 5120076e027SBarry Smith } 5133ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 5140076e027SBarry Smith } 5150076e027SBarry Smith 5168556b5ebSBarry Smith /*MC 5178556b5ebSBarry Smith PETSCVIEWERDRAW - A viewer that generates graphics, either to the screen or a file 5188556b5ebSBarry Smith 519811af0c4SBarry Smith Level: beginner 520811af0c4SBarry Smith 521d1f92df0SBarry Smith .seealso: [](sec_viewers), `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`, `PETSC_VIEWER_DRAW_()`, `PETSC_VIEWER_DRAW_SELF`, `PETSC_VIEWER_DRAW_WORLD`, 522db781477SPatrick Sanan `PetscViewerCreate()`, `PetscViewerASCIIOpen()`, `PetscViewerBinaryOpen()`, `PETSCVIEWERBINARY`, 523db781477SPatrick Sanan `PetscViewerMatlabOpen()`, `VecView()`, `DMView()`, `PetscViewerMatlabPutArray()`, `PETSCVIEWERASCII`, `PETSCVIEWERMATLAB`, 524db781477SPatrick Sanan `PetscViewerFileSetName()`, `PetscViewerFileSetMode()`, `PetscViewerFormat`, `PetscViewerType`, `PetscViewerSetType()` 5258556b5ebSBarry Smith M*/ 526d71ae5a4SJacob Faibussowitsch PETSC_EXTERN PetscErrorCode PetscViewerCreate_Draw(PetscViewer viewer) 527d71ae5a4SJacob Faibussowitsch { 5285c6c1daeSBarry Smith PetscViewer_Draw *vdraw; 5295c6c1daeSBarry Smith 5305c6c1daeSBarry Smith PetscFunctionBegin; 5314dfa11a4SJacob Faibussowitsch PetscCall(PetscNew(&vdraw)); 5325c6c1daeSBarry Smith viewer->data = (void *)vdraw; 5335c6c1daeSBarry Smith 5345c6c1daeSBarry Smith viewer->ops->flush = PetscViewerFlush_Draw; 5350076e027SBarry Smith viewer->ops->view = PetscViewerView_Draw; 5365c6c1daeSBarry Smith viewer->ops->destroy = PetscViewerDestroy_Draw; 537e9457bf7SBarry Smith viewer->ops->setfromoptions = PetscViewerSetFromOptions_Draw; 538559f443fSBarry Smith viewer->ops->getsubviewer = PetscViewerGetSubViewer_Draw; 539559f443fSBarry Smith viewer->ops->restoresubviewer = PetscViewerRestoreSubViewer_Draw; 5405c6c1daeSBarry Smith 5415c6c1daeSBarry Smith /* these are created on the fly if requested */ 5425c6c1daeSBarry Smith vdraw->draw_max = 5; 5435c6c1daeSBarry Smith vdraw->draw_base = 0; 544ccad63c3SBarry Smith vdraw->w = PETSC_DECIDE; 545ccad63c3SBarry Smith vdraw->h = PETSC_DECIDE; 546a297a907SKarl Rupp 5479566063dSJacob Faibussowitsch PetscCall(PetscCalloc3(vdraw->draw_max, &vdraw->draw, vdraw->draw_max, &vdraw->drawlg, vdraw->draw_max, &vdraw->drawaxis)); 5485c6c1daeSBarry Smith vdraw->singleton_made = PETSC_FALSE; 5493ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 5505c6c1daeSBarry Smith } 5515c6c1daeSBarry Smith 5525c6c1daeSBarry Smith /*@ 553811af0c4SBarry Smith PetscViewerDrawClear - Clears a `PetscDraw` graphic associated with a `PetscViewer`. 5545c6c1daeSBarry Smith 5555c6c1daeSBarry Smith Not Collective 5565c6c1daeSBarry Smith 5575c6c1daeSBarry Smith Input Parameter: 558811af0c4SBarry Smith . viewer - the `PetscViewer` 5595c6c1daeSBarry Smith 5605c6c1daeSBarry Smith Level: intermediate 5615c6c1daeSBarry Smith 562d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`, 5635c6c1daeSBarry Smith @*/ 564d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawClear(PetscViewer viewer) 565d71ae5a4SJacob Faibussowitsch { 5665c6c1daeSBarry Smith PetscViewer_Draw *vdraw; 567e5ab1681SLisandro Dalcin PetscBool isdraw; 568e5ab1681SLisandro Dalcin PetscInt i; 5695c6c1daeSBarry Smith 5705c6c1daeSBarry Smith PetscFunctionBegin; 571e5ab1681SLisandro Dalcin PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 5729566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw)); 5733ba16761SJacob Faibussowitsch if (!isdraw) PetscFunctionReturn(PETSC_SUCCESS); 5745c6c1daeSBarry Smith vdraw = (PetscViewer_Draw *)viewer->data; 575e5ab1681SLisandro Dalcin 5765c6c1daeSBarry Smith for (i = 0; i < vdraw->draw_max; i++) { 5779566063dSJacob Faibussowitsch if (vdraw->draw[i]) PetscCall(PetscDrawClear(vdraw->draw[i])); 5785c6c1daeSBarry Smith } 5793ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 5805c6c1daeSBarry Smith } 5815c6c1daeSBarry Smith 5825c6c1daeSBarry Smith /*@ 583811af0c4SBarry Smith PetscViewerDrawGetPause - Gets the pause value (how long to pause before an image is changed) in the `PETSCVIEWERDRAW` `PetscViewer` 5845c6c1daeSBarry Smith 5855c6c1daeSBarry Smith Not Collective 5865c6c1daeSBarry Smith 5875c6c1daeSBarry Smith Input Parameter: 588811af0c4SBarry Smith . viewer - the `PetscViewer` 5895c6c1daeSBarry Smith 5905c6c1daeSBarry Smith Output Parameter: 5915c6c1daeSBarry Smith . pause - the pause value 5925c6c1daeSBarry Smith 5935c6c1daeSBarry Smith Level: intermediate 5945c6c1daeSBarry Smith 595d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`, 5965c6c1daeSBarry Smith @*/ 597d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawGetPause(PetscViewer viewer, PetscReal *pause) 598d71ae5a4SJacob Faibussowitsch { 5995c6c1daeSBarry Smith PetscViewer_Draw *vdraw; 600e5ab1681SLisandro Dalcin PetscBool isdraw; 601e5ab1681SLisandro Dalcin PetscInt i; 6025c6c1daeSBarry Smith PetscDraw draw; 6035c6c1daeSBarry Smith 6045c6c1daeSBarry Smith PetscFunctionBegin; 605e5ab1681SLisandro Dalcin PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 6069566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw)); 6079371c9d4SSatish Balay if (!isdraw) { 6089371c9d4SSatish Balay *pause = 0.0; 6093ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 6109371c9d4SSatish Balay } 6115c6c1daeSBarry Smith vdraw = (PetscViewer_Draw *)viewer->data; 612e5ab1681SLisandro Dalcin 6135c6c1daeSBarry Smith for (i = 0; i < vdraw->draw_max; i++) { 6145c6c1daeSBarry Smith if (vdraw->draw[i]) { 6159566063dSJacob Faibussowitsch PetscCall(PetscDrawGetPause(vdraw->draw[i], pause)); 6163ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 6175c6c1daeSBarry Smith } 6185c6c1daeSBarry Smith } 6195c6c1daeSBarry Smith /* none exist yet so create one and get its pause */ 6209566063dSJacob Faibussowitsch PetscCall(PetscViewerDrawGetDraw(viewer, 0, &draw)); 6219566063dSJacob Faibussowitsch PetscCall(PetscDrawGetPause(draw, pause)); 6223ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 6235c6c1daeSBarry Smith } 6245c6c1daeSBarry Smith 6255c6c1daeSBarry Smith /*@ 626811af0c4SBarry Smith PetscViewerDrawSetPause - Sets a pause for each `PetscDraw` in the `PETSCVIEWERDRAW` `PetscViewer` 6275c6c1daeSBarry Smith 6285c6c1daeSBarry Smith Not Collective 6295c6c1daeSBarry Smith 6305c6c1daeSBarry Smith Input Parameters: 631811af0c4SBarry Smith + viewer - the `PetscViewer` 6325c6c1daeSBarry Smith - pause - the pause value 6335c6c1daeSBarry Smith 6345c6c1daeSBarry Smith Level: intermediate 6355c6c1daeSBarry Smith 636d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`, 6375c6c1daeSBarry Smith @*/ 638d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawSetPause(PetscViewer viewer, PetscReal pause) 639d71ae5a4SJacob Faibussowitsch { 640e5ab1681SLisandro Dalcin PetscViewer_Draw *vdraw; 6415c6c1daeSBarry Smith PetscBool isdraw; 642e5ab1681SLisandro Dalcin PetscInt i; 6435c6c1daeSBarry Smith 6445c6c1daeSBarry Smith PetscFunctionBegin; 645e5ab1681SLisandro Dalcin PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 6469566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw)); 6473ba16761SJacob Faibussowitsch if (!isdraw) PetscFunctionReturn(PETSC_SUCCESS); 648e5ab1681SLisandro Dalcin vdraw = (PetscViewer_Draw *)viewer->data; 649afe78b3cSBarry Smith 650afe78b3cSBarry Smith vdraw->pause = pause; 6515c6c1daeSBarry Smith for (i = 0; i < vdraw->draw_max; i++) { 6529566063dSJacob Faibussowitsch if (vdraw->draw[i]) PetscCall(PetscDrawSetPause(vdraw->draw[i], pause)); 6535c6c1daeSBarry Smith } 6543ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 6555c6c1daeSBarry Smith } 6565c6c1daeSBarry Smith 6575c6c1daeSBarry Smith /*@ 658c410d8ccSBarry Smith PetscViewerDrawSetHold - Holds previous image when drawing new image in a `PETSCVIEWERDRAW` 6595c6c1daeSBarry Smith 6605c6c1daeSBarry Smith Not Collective 6615c6c1daeSBarry Smith 6625c6c1daeSBarry Smith Input Parameters: 663811af0c4SBarry Smith + viewer - the `PetscViewer` 664811af0c4SBarry Smith - hold - `PETSC_TRUE` indicates to hold the previous image 6655c6c1daeSBarry Smith 6665c6c1daeSBarry Smith Level: intermediate 6675c6c1daeSBarry Smith 668d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`, 6695c6c1daeSBarry Smith @*/ 670d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawSetHold(PetscViewer viewer, PetscBool hold) 671d71ae5a4SJacob Faibussowitsch { 6725c6c1daeSBarry Smith PetscViewer_Draw *vdraw; 6735c6c1daeSBarry Smith PetscBool isdraw; 6745c6c1daeSBarry Smith 6755c6c1daeSBarry Smith PetscFunctionBegin; 676e5ab1681SLisandro Dalcin PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 6779566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw)); 6783ba16761SJacob Faibussowitsch if (!isdraw) PetscFunctionReturn(PETSC_SUCCESS); 6795c6c1daeSBarry Smith vdraw = (PetscViewer_Draw *)viewer->data; 680e5ab1681SLisandro Dalcin 6815c6c1daeSBarry Smith vdraw->hold = hold; 6823ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 6835c6c1daeSBarry Smith } 6845c6c1daeSBarry Smith 6855c6c1daeSBarry Smith /*@ 686811af0c4SBarry Smith PetscViewerDrawGetHold - Checks if the `PETSCVIEWERDRAW` `PetscViewer` holds previous image when drawing new image 6875c6c1daeSBarry Smith 6885c6c1daeSBarry Smith Not Collective 6895c6c1daeSBarry Smith 6905c6c1daeSBarry Smith Input Parameter: 691811af0c4SBarry Smith . viewer - the `PetscViewer` 6925c6c1daeSBarry Smith 6935c6c1daeSBarry Smith Output Parameter: 6945c6c1daeSBarry Smith . hold - indicates to hold or not 6955c6c1daeSBarry Smith 6965c6c1daeSBarry Smith Level: intermediate 6975c6c1daeSBarry Smith 698d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscViewerDrawOpen()`, `PetscViewerDrawGetDraw()`, 6995c6c1daeSBarry Smith @*/ 700d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawGetHold(PetscViewer viewer, PetscBool *hold) 701d71ae5a4SJacob Faibussowitsch { 7025c6c1daeSBarry Smith PetscViewer_Draw *vdraw; 7035c6c1daeSBarry Smith PetscBool isdraw; 7045c6c1daeSBarry Smith 7055c6c1daeSBarry Smith PetscFunctionBegin; 706e5ab1681SLisandro Dalcin PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 7079566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw)); 7089371c9d4SSatish Balay if (!isdraw) { 7099371c9d4SSatish Balay *hold = PETSC_FALSE; 7103ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 7119371c9d4SSatish Balay } 7125c6c1daeSBarry Smith vdraw = (PetscViewer_Draw *)viewer->data; 713e5ab1681SLisandro Dalcin 7145c6c1daeSBarry Smith *hold = vdraw->hold; 7153ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 7165c6c1daeSBarry Smith } 7175c6c1daeSBarry Smith 7185c6c1daeSBarry Smith /* 7195c6c1daeSBarry Smith The variable Petsc_Viewer_Draw_keyval is used to indicate an MPI attribute that 7205c6c1daeSBarry Smith is attached to a communicator, in this case the attribute is a PetscViewer. 7215c6c1daeSBarry Smith */ 722d4c7638eSBarry Smith PetscMPIInt Petsc_Viewer_Draw_keyval = MPI_KEYVAL_INVALID; 7235c6c1daeSBarry Smith 7245c6c1daeSBarry Smith /*@C 725811af0c4SBarry Smith PETSC_VIEWER_DRAW_ - Creates a window `PETSCVIEWERDRAW` `PetscViewer` shared by all processors 726c410d8ccSBarry Smith in an MPI communicator. 7275c6c1daeSBarry Smith 728d083f849SBarry Smith Collective 7295c6c1daeSBarry Smith 7305c6c1daeSBarry Smith Input Parameter: 731811af0c4SBarry Smith . comm - the MPI communicator to share the window `PetscViewer` 7325c6c1daeSBarry Smith 7335c6c1daeSBarry Smith Level: intermediate 7345c6c1daeSBarry Smith 735811af0c4SBarry Smith Note: 736811af0c4SBarry Smith Unlike almost all other PETSc routines, `PETSC_VIEWER_DRAW_()` does not return 7375c6c1daeSBarry Smith an error code. The window is usually used in the form 7385c6c1daeSBarry Smith $ XXXView(XXX object, PETSC_VIEWER_DRAW_(comm)); 7395c6c1daeSBarry Smith 740d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscViewer`, `PETSC_VIEWER_DRAW_WORLD`, `PETSC_VIEWER_DRAW_SELF`, `PetscViewerDrawOpen()`, 7415c6c1daeSBarry Smith @*/ 742d71ae5a4SJacob Faibussowitsch PetscViewer PETSC_VIEWER_DRAW_(MPI_Comm comm) 743d71ae5a4SJacob Faibussowitsch { 7445c6c1daeSBarry Smith PetscErrorCode ierr; 7453ba16761SJacob Faibussowitsch PetscMPIInt flag, mpi_ierr; 7465c6c1daeSBarry Smith PetscViewer viewer; 7475c6c1daeSBarry Smith MPI_Comm ncomm; 7485c6c1daeSBarry Smith 7495c6c1daeSBarry Smith PetscFunctionBegin; 7509371c9d4SSatish Balay ierr = PetscCommDuplicate(comm, &ncomm, NULL); 7519371c9d4SSatish Balay if (ierr) { 7523ba16761SJacob Faibussowitsch ierr = PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_DRAW_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_INITIAL, " "); 7539371c9d4SSatish Balay PetscFunctionReturn(NULL); 7549371c9d4SSatish Balay } 7555c6c1daeSBarry Smith if (Petsc_Viewer_Draw_keyval == MPI_KEYVAL_INVALID) { 7563ba16761SJacob Faibussowitsch mpi_ierr = MPI_Comm_create_keyval(MPI_COMM_NULL_COPY_FN, MPI_COMM_NULL_DELETE_FN, &Petsc_Viewer_Draw_keyval, NULL); 7573ba16761SJacob Faibussowitsch if (mpi_ierr) { 7583ba16761SJacob Faibussowitsch ierr = PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_DRAW_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_INITIAL, " "); 7599371c9d4SSatish Balay PetscFunctionReturn(NULL); 7609371c9d4SSatish Balay } 7615c6c1daeSBarry Smith } 7623ba16761SJacob Faibussowitsch mpi_ierr = MPI_Comm_get_attr(ncomm, Petsc_Viewer_Draw_keyval, (void **)&viewer, &flag); 7633ba16761SJacob Faibussowitsch if (mpi_ierr) { 7643ba16761SJacob Faibussowitsch ierr = PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_DRAW_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_INITIAL, " "); 7659371c9d4SSatish Balay PetscFunctionReturn(NULL); 7669371c9d4SSatish Balay } 7675c6c1daeSBarry Smith if (!flag) { /* PetscViewer not yet created */ 76802c9f0b5SLisandro Dalcin ierr = PetscViewerDrawOpen(ncomm, NULL, NULL, PETSC_DECIDE, PETSC_DECIDE, 300, 300, &viewer); 7699371c9d4SSatish Balay if (ierr) { 7703ba16761SJacob Faibussowitsch ierr = PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_DRAW_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_REPEAT, " "); 7719371c9d4SSatish Balay PetscFunctionReturn(NULL); 7729371c9d4SSatish Balay } 7735c6c1daeSBarry Smith ierr = PetscObjectRegisterDestroy((PetscObject)viewer); 7749371c9d4SSatish Balay if (ierr) { 7753ba16761SJacob Faibussowitsch ierr = PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_DRAW_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_REPEAT, " "); 7769371c9d4SSatish Balay PetscFunctionReturn(NULL); 7779371c9d4SSatish Balay } 7783ba16761SJacob Faibussowitsch mpi_ierr = MPI_Comm_set_attr(ncomm, Petsc_Viewer_Draw_keyval, (void *)viewer); 7793ba16761SJacob Faibussowitsch if (mpi_ierr) { 7803ba16761SJacob Faibussowitsch ierr = PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_DRAW_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_INITIAL, " "); 7819371c9d4SSatish Balay PetscFunctionReturn(NULL); 7829371c9d4SSatish Balay } 7835c6c1daeSBarry Smith } 7845c6c1daeSBarry Smith ierr = PetscCommDestroy(&ncomm); 7859371c9d4SSatish Balay if (ierr) { 7863ba16761SJacob Faibussowitsch ierr = PetscError(PETSC_COMM_SELF, __LINE__, "PETSC_VIEWER_DRAW_", __FILE__, PETSC_ERR_PLIB, PETSC_ERROR_REPEAT, " "); 7879371c9d4SSatish Balay PetscFunctionReturn(NULL); 7889371c9d4SSatish Balay } 7895c6c1daeSBarry Smith PetscFunctionReturn(viewer); 7905c6c1daeSBarry Smith } 7915c6c1daeSBarry Smith 7925c6c1daeSBarry Smith /*@ 793c410d8ccSBarry Smith PetscViewerDrawSetBounds - sets the upper and lower bounds to be used in plotting in a `PETSCVIEWERDRAW` `PetscViewer` 7945c6c1daeSBarry Smith 795c3339decSBarry Smith Collective 7965c6c1daeSBarry Smith 7975c6c1daeSBarry Smith Input Parameters: 798811af0c4SBarry Smith + viewer - the Petsc`Viewer` (created with `PetscViewerDrawOpen()`) 799811af0c4SBarry Smith . nbounds - number of plots that can be made with this viewer, for example the dof passed to `DMDACreate()` 800c410d8ccSBarry 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, ..... 8015c6c1daeSBarry Smith 802811af0c4SBarry Smith Options Database Key: 80310699b91SBarry Smith . -draw_bounds minF0,maxF0,minF1,maxF1 - the lower left and upper right bounds 804e9457bf7SBarry Smith 8055c6c1daeSBarry Smith Level: intermediate 8065c6c1daeSBarry Smith 807811af0c4SBarry Smith Note: 808811af0c4SBarry 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 809f3f0eb19SBarry 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 810f3f0eb19SBarry Smith this viewer. Otherwise the color to physical value meaning changes with each new image if this is not set. 811f3f0eb19SBarry Smith 812d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscViewerDrawGetLG()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()` 8135c6c1daeSBarry Smith @*/ 814d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawSetBounds(PetscViewer viewer, PetscInt nbounds, const PetscReal *bounds) 815d71ae5a4SJacob Faibussowitsch { 816e5ab1681SLisandro Dalcin PetscViewer_Draw *vdraw; 817e5ab1681SLisandro Dalcin PetscBool isdraw; 8185c6c1daeSBarry Smith 8195c6c1daeSBarry Smith PetscFunctionBegin; 8205c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 8219566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw)); 8223ba16761SJacob Faibussowitsch if (!isdraw) PetscFunctionReturn(PETSC_SUCCESS); 823e5ab1681SLisandro Dalcin vdraw = (PetscViewer_Draw *)viewer->data; 824a297a907SKarl Rupp 825e5ab1681SLisandro Dalcin vdraw->nbounds = nbounds; 8269566063dSJacob Faibussowitsch PetscCall(PetscFree(vdraw->bounds)); 8279566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(2 * nbounds, &vdraw->bounds)); 8289566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(vdraw->bounds, bounds, 2 * nbounds)); 8293ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 8305c6c1daeSBarry Smith } 8315c6c1daeSBarry Smith 8325c6c1daeSBarry Smith /*@C 833811af0c4SBarry Smith PetscViewerDrawGetBounds - gets the upper and lower bounds to be used in plotting set with `PetscViewerDrawSetBounds()` 8345c6c1daeSBarry Smith 835c3339decSBarry Smith Collective 8365c6c1daeSBarry Smith 8375c6c1daeSBarry Smith Input Parameter: 838811af0c4SBarry Smith . viewer - the `PetscViewer` (created with `PetscViewerDrawOpen()`) 8395c6c1daeSBarry Smith 840fd292e60Sprj- Output Parameters: 841811af0c4SBarry Smith + nbounds - number of plots that can be made with this viewer, for example the dof passed to `DMDACreate()` 842c410d8ccSBarry 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, ..... 8435c6c1daeSBarry Smith 8445c6c1daeSBarry Smith Level: intermediate 8455c6c1daeSBarry Smith 846d1f92df0SBarry Smith .seealso: [](sec_viewers), `PETSCVIEWERDRAW`, `PetscViewerDrawGetLG()`, `PetscViewerDrawGetAxis()`, `PetscViewerDrawOpen()`, `PetscViewerDrawSetBounds()` 8475c6c1daeSBarry Smith @*/ 848d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscViewerDrawGetBounds(PetscViewer viewer, PetscInt *nbounds, const PetscReal **bounds) 849d71ae5a4SJacob Faibussowitsch { 850e5ab1681SLisandro Dalcin PetscViewer_Draw *vdraw; 851e5ab1681SLisandro Dalcin PetscBool isdraw; 8525c6c1daeSBarry Smith 8535c6c1daeSBarry Smith PetscFunctionBegin; 8545c6c1daeSBarry Smith PetscValidHeaderSpecific(viewer, PETSC_VIEWER_CLASSID, 1); 8559566063dSJacob Faibussowitsch PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERDRAW, &isdraw)); 8569371c9d4SSatish Balay if (!isdraw) { 8579371c9d4SSatish Balay if (nbounds) *nbounds = 0; 8589371c9d4SSatish Balay if (bounds) *bounds = NULL; 8593ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 8609371c9d4SSatish Balay } 861e5ab1681SLisandro Dalcin vdraw = (PetscViewer_Draw *)viewer->data; 862e5ab1681SLisandro Dalcin 863e5ab1681SLisandro Dalcin if (nbounds) *nbounds = vdraw->nbounds; 864e5ab1681SLisandro Dalcin if (bounds) *bounds = vdraw->bounds; 8653ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 8665c6c1daeSBarry Smith } 867