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