15c6c1daeSBarry Smith 25c6c1daeSBarry Smith /* 35c6c1daeSBarry Smith Provides the calling sequences for all the basic PetscDraw routines. 45c6c1daeSBarry Smith */ 5af0996ceSBarry Smith #include <petsc/private/drawimpl.h> /*I "petscdraw.h" I*/ 6665c2dedSJed Brown #include <petscviewer.h> 75c6c1daeSBarry Smith 85c6c1daeSBarry Smith PetscClassId PETSC_DRAW_CLASSID; 95c6c1daeSBarry Smith 105c6c1daeSBarry Smith static PetscBool PetscDrawPackageInitialized = PETSC_FALSE; 115c6c1daeSBarry Smith /*@C 12*811af0c4SBarry Smith PetscDrawFinalizePackage - This function destroys everything in the Petsc interface to the `PetscDraw` package. It is 13*811af0c4SBarry Smith called from `PetscFinalize()`. 145c6c1daeSBarry Smith 155c6c1daeSBarry Smith Level: developer 165c6c1daeSBarry Smith 17*811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscFinalize()` 185c6c1daeSBarry Smith @*/ 199371c9d4SSatish Balay PetscErrorCode PetscDrawFinalizePackage(void) { 205c6c1daeSBarry Smith PetscFunctionBegin; 219566063dSJacob Faibussowitsch PetscCall(PetscFunctionListDestroy(&PetscDrawList)); 225c6c1daeSBarry Smith PetscDrawPackageInitialized = PETSC_FALSE; 230f51fdf8SToby Isaac PetscDrawRegisterAllCalled = PETSC_FALSE; 245c6c1daeSBarry Smith PetscFunctionReturn(0); 255c6c1daeSBarry Smith } 265c6c1daeSBarry Smith 275c6c1daeSBarry Smith /*@C 28*811af0c4SBarry Smith PetscInitializeDrawPackage - This function initializes everything in the `PetscDraw` package. It is called 29*811af0c4SBarry Smith from PetscDLLibraryRegister_petsc() when using dynamic libraries, and on the call to `PetscInitialize()` 308a690491SBarry Smith when using shared or static libraries. 315c6c1daeSBarry Smith 325c6c1daeSBarry Smith Level: developer 335c6c1daeSBarry Smith 34*811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscInitialize()` 355c6c1daeSBarry Smith @*/ 369371c9d4SSatish Balay PetscErrorCode PetscDrawInitializePackage(void) { 375c6c1daeSBarry Smith char logList[256]; 388e81d068SLisandro Dalcin PetscBool opt, pkg; 395c6c1daeSBarry Smith 405c6c1daeSBarry Smith PetscFunctionBegin; 415c6c1daeSBarry Smith if (PetscDrawPackageInitialized) PetscFunctionReturn(0); 425c6c1daeSBarry Smith PetscDrawPackageInitialized = PETSC_TRUE; 435c6c1daeSBarry Smith /* Register Classes */ 449566063dSJacob Faibussowitsch PetscCall(PetscClassIdRegister("Draw", &PETSC_DRAW_CLASSID)); 459566063dSJacob Faibussowitsch PetscCall(PetscClassIdRegister("Draw Axis", &PETSC_DRAWAXIS_CLASSID)); 469566063dSJacob Faibussowitsch PetscCall(PetscClassIdRegister("Line Graph", &PETSC_DRAWLG_CLASSID)); 479566063dSJacob Faibussowitsch PetscCall(PetscClassIdRegister("Histogram", &PETSC_DRAWHG_CLASSID)); 489566063dSJacob Faibussowitsch PetscCall(PetscClassIdRegister("Bar Graph", &PETSC_DRAWBAR_CLASSID)); 499566063dSJacob Faibussowitsch PetscCall(PetscClassIdRegister("Scatter Plot", &PETSC_DRAWSP_CLASSID)); 505c6c1daeSBarry Smith /* Register Constructors */ 519566063dSJacob Faibussowitsch PetscCall(PetscDrawRegisterAll()); 52e94e781bSJacob Faibussowitsch /* Process Info */ 53e94e781bSJacob Faibussowitsch { 54e94e781bSJacob Faibussowitsch PetscClassId classids[6]; 55e94e781bSJacob Faibussowitsch 56e94e781bSJacob Faibussowitsch classids[0] = PETSC_DRAW_CLASSID; 57e94e781bSJacob Faibussowitsch classids[1] = PETSC_DRAWAXIS_CLASSID; 58e94e781bSJacob Faibussowitsch classids[2] = PETSC_DRAWLG_CLASSID; 59e94e781bSJacob Faibussowitsch classids[3] = PETSC_DRAWHG_CLASSID; 60e94e781bSJacob Faibussowitsch classids[4] = PETSC_DRAWBAR_CLASSID; 61e94e781bSJacob Faibussowitsch classids[5] = PETSC_DRAWSP_CLASSID; 629566063dSJacob Faibussowitsch PetscCall(PetscInfoProcessClass("draw", 6, classids)); 635c6c1daeSBarry Smith } 645c6c1daeSBarry Smith /* Process summary exclusions */ 659566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetString(NULL, NULL, "-log_exclude", logList, sizeof(logList), &opt)); 665c6c1daeSBarry Smith if (opt) { 679566063dSJacob Faibussowitsch PetscCall(PetscStrInList("draw", logList, ',', &pkg)); 688e81d068SLisandro Dalcin if (pkg) { 699566063dSJacob Faibussowitsch PetscCall(PetscLogEventExcludeClass(PETSC_DRAW_CLASSID)); 709566063dSJacob Faibussowitsch PetscCall(PetscLogEventExcludeClass(PETSC_DRAWAXIS_CLASSID)); 719566063dSJacob Faibussowitsch PetscCall(PetscLogEventExcludeClass(PETSC_DRAWLG_CLASSID)); 729566063dSJacob Faibussowitsch PetscCall(PetscLogEventExcludeClass(PETSC_DRAWHG_CLASSID)); 739566063dSJacob Faibussowitsch PetscCall(PetscLogEventExcludeClass(PETSC_DRAWBAR_CLASSID)); 749566063dSJacob Faibussowitsch PetscCall(PetscLogEventExcludeClass(PETSC_DRAWSP_CLASSID)); 755c6c1daeSBarry Smith } 765c6c1daeSBarry Smith } 778e81d068SLisandro Dalcin /* Register package finalizer */ 789566063dSJacob Faibussowitsch PetscCall(PetscRegisterFinalize(PetscDrawFinalizePackage)); 795c6c1daeSBarry Smith PetscFunctionReturn(0); 805c6c1daeSBarry Smith } 815c6c1daeSBarry Smith 825c6c1daeSBarry Smith /*@ 835c6c1daeSBarry Smith PetscDrawResizeWindow - Allows one to resize a window from a program. 845c6c1daeSBarry Smith 85*811af0c4SBarry Smith Collective on draw 865c6c1daeSBarry Smith 87d8d19677SJose E. Roman Input Parameters: 885c6c1daeSBarry Smith + draw - the window 895c6c1daeSBarry Smith - w,h - the new width and height of the window 905c6c1daeSBarry Smith 915c6c1daeSBarry Smith Level: intermediate 925c6c1daeSBarry Smith 93*811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawCheckResizedWindow()` 945c6c1daeSBarry Smith @*/ 959371c9d4SSatish Balay PetscErrorCode PetscDrawResizeWindow(PetscDraw draw, int w, int h) { 965c6c1daeSBarry Smith PetscFunctionBegin; 9773ecf448SLisandro Dalcin PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 9873ecf448SLisandro Dalcin PetscValidLogicalCollectiveInt(draw, w, 2); 9973ecf448SLisandro Dalcin PetscValidLogicalCollectiveInt(draw, h, 3); 100dbbe0bcdSBarry Smith PetscTryTypeMethod(draw, resizewindow, w, h); 1015c6c1daeSBarry Smith PetscFunctionReturn(0); 1025c6c1daeSBarry Smith } 1035c6c1daeSBarry Smith 10473ecf448SLisandro Dalcin /*@ 10573ecf448SLisandro Dalcin PetscDrawGetWindowSize - Gets the size of the window. 10673ecf448SLisandro Dalcin 10773ecf448SLisandro Dalcin Not collective 10873ecf448SLisandro Dalcin 10973ecf448SLisandro Dalcin Input Parameter: 11073ecf448SLisandro Dalcin . draw - the window 11173ecf448SLisandro Dalcin 11273ecf448SLisandro Dalcin Output Parameters: 11373ecf448SLisandro Dalcin . w,h - the window width and height 11473ecf448SLisandro Dalcin 11573ecf448SLisandro Dalcin Level: intermediate 11673ecf448SLisandro Dalcin 117*811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawResizeWindow()`, `PetscDrawCheckResizedWindow()` 11873ecf448SLisandro Dalcin @*/ 1199371c9d4SSatish Balay PetscErrorCode PetscDrawGetWindowSize(PetscDraw draw, int *w, int *h) { 12073ecf448SLisandro Dalcin PetscFunctionBegin; 12173ecf448SLisandro Dalcin PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 12273ecf448SLisandro Dalcin if (w) PetscValidPointer(w, 2); 12373ecf448SLisandro Dalcin if (h) PetscValidPointer(h, 3); 12473ecf448SLisandro Dalcin if (w) *w = draw->w; 12573ecf448SLisandro Dalcin if (h) *h = draw->h; 12673ecf448SLisandro Dalcin PetscFunctionReturn(0); 12773ecf448SLisandro Dalcin } 12873ecf448SLisandro Dalcin 1295c6c1daeSBarry Smith /*@ 1305c6c1daeSBarry Smith PetscDrawCheckResizedWindow - Checks if the user has resized the window. 1315c6c1daeSBarry Smith 132*811af0c4SBarry Smith Collective on draw 1335c6c1daeSBarry Smith 1345c6c1daeSBarry Smith Input Parameter: 1355c6c1daeSBarry Smith . draw - the window 1365c6c1daeSBarry Smith 1375c6c1daeSBarry Smith Level: advanced 1385c6c1daeSBarry Smith 139*811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawResizeWindow()` 1405c6c1daeSBarry Smith @*/ 1419371c9d4SSatish Balay PetscErrorCode PetscDrawCheckResizedWindow(PetscDraw draw) { 1425c6c1daeSBarry Smith PetscFunctionBegin; 14373ecf448SLisandro Dalcin PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 144dbbe0bcdSBarry Smith PetscTryTypeMethod(draw, checkresizedwindow); 1455c6c1daeSBarry Smith PetscFunctionReturn(0); 1465c6c1daeSBarry Smith } 1475c6c1daeSBarry Smith 1485c6c1daeSBarry Smith /*@C 149*811af0c4SBarry Smith PetscDrawGetTitle - Gets pointer to title of a `PetscDraw` context. 1505c6c1daeSBarry Smith 1515c6c1daeSBarry Smith Not collective 1525c6c1daeSBarry Smith 1535c6c1daeSBarry Smith Input Parameter: 1545c6c1daeSBarry Smith . draw - the graphics context 1555c6c1daeSBarry Smith 1565c6c1daeSBarry Smith Output Parameter: 1575c6c1daeSBarry Smith . title - the title 1585c6c1daeSBarry Smith 1595c6c1daeSBarry Smith Level: intermediate 1605c6c1daeSBarry Smith 161*811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawSetTitle()` 1625c6c1daeSBarry Smith @*/ 1639371c9d4SSatish Balay PetscErrorCode PetscDrawGetTitle(PetscDraw draw, const char *title[]) { 1645c6c1daeSBarry Smith PetscFunctionBegin; 1655c6c1daeSBarry Smith PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 1665c6c1daeSBarry Smith PetscValidPointer(title, 2); 1675c6c1daeSBarry Smith *title = draw->title; 1685c6c1daeSBarry Smith PetscFunctionReturn(0); 1695c6c1daeSBarry Smith } 1705c6c1daeSBarry Smith 1715c6c1daeSBarry Smith /*@C 172*811af0c4SBarry Smith PetscDrawSetTitle - Sets the title of a `PetscDraw` context. 1735c6c1daeSBarry Smith 174*811af0c4SBarry Smith Collective on draw 1755c6c1daeSBarry Smith 1765c6c1daeSBarry Smith Input Parameters: 1775c6c1daeSBarry Smith + draw - the graphics context 1785c6c1daeSBarry Smith - title - the title 1795c6c1daeSBarry Smith 1805c6c1daeSBarry Smith Level: intermediate 1815c6c1daeSBarry Smith 182*811af0c4SBarry Smith Notes: 183*811af0c4SBarry Smith The title is positioned in the windowing system title bar for the window. Hence it will not be saved with -draw_save 184231a95f8SBarry Smith in the image. 185231a95f8SBarry Smith 1865c6c1daeSBarry Smith A copy of the string is made, so you may destroy the 1875c6c1daeSBarry Smith title string after calling this routine. 1885c6c1daeSBarry Smith 189*811af0c4SBarry Smith You can use `PetscDrawAxisSetLabels()` to indicate a title within the window 190231a95f8SBarry Smith 191*811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawGetTitle()`, `PetscDrawAppendTitle()` 1925c6c1daeSBarry Smith @*/ 1939371c9d4SSatish Balay PetscErrorCode PetscDrawSetTitle(PetscDraw draw, const char title[]) { 1945c6c1daeSBarry Smith PetscFunctionBegin; 1955c6c1daeSBarry Smith PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 1965c6c1daeSBarry Smith PetscValidCharPointer(title, 2); 1979566063dSJacob Faibussowitsch PetscCall(PetscFree(draw->title)); 1989566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(title, &draw->title)); 199dbbe0bcdSBarry Smith PetscTryTypeMethod(draw, settitle, draw->title); 2005c6c1daeSBarry Smith PetscFunctionReturn(0); 2015c6c1daeSBarry Smith } 2025c6c1daeSBarry Smith 2035c6c1daeSBarry Smith /*@C 204*811af0c4SBarry Smith PetscDrawAppendTitle - Appends to the title of a `PetscDraw` context. 2055c6c1daeSBarry Smith 206*811af0c4SBarry Smith Collective on draw 2075c6c1daeSBarry Smith 2085c6c1daeSBarry Smith Input Parameters: 2095c6c1daeSBarry Smith + draw - the graphics context 2105c6c1daeSBarry Smith - title - the title 2115c6c1daeSBarry Smith 2125c6c1daeSBarry Smith Note: 2135c6c1daeSBarry Smith A copy of the string is made, so you may destroy the 2145c6c1daeSBarry Smith title string after calling this routine. 2155c6c1daeSBarry Smith 2165c6c1daeSBarry Smith Level: advanced 2175c6c1daeSBarry Smith 218*811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawSetTitle()`, `PetscDrawGetTitle()` 2195c6c1daeSBarry Smith @*/ 2209371c9d4SSatish Balay PetscErrorCode PetscDrawAppendTitle(PetscDraw draw, const char title[]) { 2215c6c1daeSBarry Smith PetscFunctionBegin; 2225c6c1daeSBarry Smith PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 2235b399a63SLisandro Dalcin if (title) PetscValidCharPointer(title, 2); 2245b399a63SLisandro Dalcin if (!title || !title[0]) PetscFunctionReturn(0); 2255c6c1daeSBarry Smith 2265c6c1daeSBarry Smith if (draw->title) { 2275b399a63SLisandro Dalcin size_t len1, len2; 2285b399a63SLisandro Dalcin char *newtitle; 2299566063dSJacob Faibussowitsch PetscCall(PetscStrlen(title, &len1)); 2309566063dSJacob Faibussowitsch PetscCall(PetscStrlen(draw->title, &len2)); 2319566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(len1 + len2 + 1, &newtitle)); 2329566063dSJacob Faibussowitsch PetscCall(PetscStrcpy(newtitle, draw->title)); 2339566063dSJacob Faibussowitsch PetscCall(PetscStrcat(newtitle, title)); 2349566063dSJacob Faibussowitsch PetscCall(PetscFree(draw->title)); 2355c6c1daeSBarry Smith draw->title = newtitle; 2365c6c1daeSBarry Smith } else { 2379566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(title, &draw->title)); 2385c6c1daeSBarry Smith } 239dbbe0bcdSBarry Smith PetscTryTypeMethod(draw, settitle, draw->title); 2405c6c1daeSBarry Smith PetscFunctionReturn(0); 2415c6c1daeSBarry Smith } 2425c6c1daeSBarry Smith 2439371c9d4SSatish Balay static PetscErrorCode PetscDrawDestroy_Private(PetscDraw draw) { 244e118a51fSLisandro Dalcin PetscFunctionBegin; 2458067a7d5SLisandro Dalcin if (!draw->ops->save && !draw->ops->getimage) PetscFunctionReturn(0); 2469566063dSJacob Faibussowitsch PetscCall(PetscDrawSaveMovie(draw)); 247e118a51fSLisandro Dalcin if (draw->savefinalfilename) { 248df8d4941SLisandro Dalcin draw->savesinglefile = PETSC_TRUE; 2499566063dSJacob Faibussowitsch PetscCall(PetscDrawSetSave(draw, draw->savefinalfilename)); 2509566063dSJacob Faibussowitsch PetscCall(PetscDrawSave(draw)); 251e118a51fSLisandro Dalcin } 2529566063dSJacob Faibussowitsch PetscCall(PetscBarrier((PetscObject)draw)); 253e118a51fSLisandro Dalcin PetscFunctionReturn(0); 254e118a51fSLisandro Dalcin } 255e118a51fSLisandro Dalcin 2565c6c1daeSBarry Smith /*@ 2575c6c1daeSBarry Smith PetscDrawDestroy - Deletes a draw context. 2585c6c1daeSBarry Smith 259*811af0c4SBarry Smith Collective on draw 2605c6c1daeSBarry Smith 2615c6c1daeSBarry Smith Input Parameters: 2625c6c1daeSBarry Smith . draw - the drawing context 2635c6c1daeSBarry Smith 2645c6c1daeSBarry Smith Level: beginner 2655c6c1daeSBarry Smith 266*811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawCreate()` 2675c6c1daeSBarry Smith @*/ 2689371c9d4SSatish Balay PetscErrorCode PetscDrawDestroy(PetscDraw *draw) { 2695c6c1daeSBarry Smith PetscFunctionBegin; 2705c6c1daeSBarry Smith if (!*draw) PetscFunctionReturn(0); 2715c6c1daeSBarry Smith PetscValidHeaderSpecific(*draw, PETSC_DRAW_CLASSID, 1); 2725c6c1daeSBarry Smith if (--((PetscObject)(*draw))->refct > 0) PetscFunctionReturn(0); 2735c6c1daeSBarry Smith 2745c6c1daeSBarry Smith if ((*draw)->pause == -2) { 2755c6c1daeSBarry Smith (*draw)->pause = -1; 2769566063dSJacob Faibussowitsch PetscCall(PetscDrawPause(*draw)); 2775c6c1daeSBarry Smith } 2785c6c1daeSBarry Smith 2795c6c1daeSBarry Smith /* if memory was published then destroy it */ 2809566063dSJacob Faibussowitsch PetscCall(PetscObjectSAWsViewOff((PetscObject)*draw)); 2815c6c1daeSBarry Smith 2829566063dSJacob Faibussowitsch PetscCall(PetscDrawDestroy_Private(*draw)); 283e118a51fSLisandro Dalcin 28448a46eb9SPierre Jolivet if ((*draw)->ops->destroy) PetscCall((*(*draw)->ops->destroy)(*draw)); 2859566063dSJacob Faibussowitsch PetscCall(PetscDrawDestroy(&(*draw)->popup)); 2869566063dSJacob Faibussowitsch PetscCall(PetscFree((*draw)->title)); 2879566063dSJacob Faibussowitsch PetscCall(PetscFree((*draw)->display)); 2889566063dSJacob Faibussowitsch PetscCall(PetscFree((*draw)->savefilename)); 2899566063dSJacob Faibussowitsch PetscCall(PetscFree((*draw)->saveimageext)); 2909566063dSJacob Faibussowitsch PetscCall(PetscFree((*draw)->savemovieext)); 2919566063dSJacob Faibussowitsch PetscCall(PetscFree((*draw)->savefinalfilename)); 2929566063dSJacob Faibussowitsch PetscCall(PetscHeaderDestroy(draw)); 2935c6c1daeSBarry Smith PetscFunctionReturn(0); 2945c6c1daeSBarry Smith } 2955c6c1daeSBarry Smith 2965c6c1daeSBarry Smith /*@ 297*811af0c4SBarry Smith PetscDrawGetPopup - Creates a popup window associated with a `PetscDraw` window. 2985c6c1daeSBarry Smith 299*811af0c4SBarry Smith Collective on draw 3005c6c1daeSBarry Smith 3015c6c1daeSBarry Smith Input Parameter: 3025c6c1daeSBarry Smith . draw - the original window 3035c6c1daeSBarry Smith 3045c6c1daeSBarry Smith Output Parameter: 3055c6c1daeSBarry Smith . popup - the new popup window 3065c6c1daeSBarry Smith 3075c6c1daeSBarry Smith Level: advanced 3085c6c1daeSBarry Smith 309*811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawScalePopup()`, `PetscDrawCreate()` 3105c6c1daeSBarry Smith @*/ 3119371c9d4SSatish Balay PetscErrorCode PetscDrawGetPopup(PetscDraw draw, PetscDraw *popup) { 3125c6c1daeSBarry Smith PetscFunctionBegin; 3135c6c1daeSBarry Smith PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 3145c6c1daeSBarry Smith PetscValidPointer(popup, 2); 3155c6c1daeSBarry Smith 316a297a907SKarl Rupp if (draw->popup) *popup = draw->popup; 317a297a907SKarl Rupp else if (draw->ops->getpopup) { 318dbbe0bcdSBarry Smith PetscUseTypeMethod(draw, getpopup, popup); 3190b874712SBarry Smith if (*popup) { 3209566063dSJacob Faibussowitsch PetscCall(PetscObjectSetOptionsPrefix((PetscObject)*popup, "popup_")); 321e118a51fSLisandro Dalcin (*popup)->pause = 0.0; 3229566063dSJacob Faibussowitsch PetscCall(PetscDrawSetFromOptions(*popup)); 32361f59835SBarry Smith } 3240298fd71SBarry Smith } else *popup = NULL; 3255c6c1daeSBarry Smith PetscFunctionReturn(0); 3265c6c1daeSBarry Smith } 3275c6c1daeSBarry Smith 32894ef8ddeSSatish Balay /*@C 329*811af0c4SBarry Smith PetscDrawSetDisplay - Sets the display where a `PetscDraw` object will be displayed 3305c6c1daeSBarry Smith 331d8d19677SJose E. Roman Input Parameters: 3325c6c1daeSBarry Smith + draw - the drawing context 3335c6c1daeSBarry Smith - display - the X windows display 3345c6c1daeSBarry Smith 3355c6c1daeSBarry Smith Level: advanced 3365c6c1daeSBarry Smith 337*811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawOpenX()`, `PetscDrawCreate()` 3385c6c1daeSBarry Smith @*/ 3399371c9d4SSatish Balay PetscErrorCode PetscDrawSetDisplay(PetscDraw draw, const char display[]) { 3405c6c1daeSBarry Smith PetscFunctionBegin; 3419566063dSJacob Faibussowitsch PetscCall(PetscFree(draw->display)); 3429566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(display, &draw->display)); 3435c6c1daeSBarry Smith PetscFunctionReturn(0); 3445c6c1daeSBarry Smith } 3455c6c1daeSBarry Smith 34645f3bb6eSLisandro Dalcin /*@ 34745f3bb6eSLisandro Dalcin PetscDrawSetDoubleBuffer - Sets a window to be double buffered. 34845f3bb6eSLisandro Dalcin 349*811af0c4SBarry Smith Logically Collective on draw 3505c6c1daeSBarry Smith 3515c6c1daeSBarry Smith Input Parameter: 35245f3bb6eSLisandro Dalcin . draw - the drawing context 35345f3bb6eSLisandro Dalcin 35445f3bb6eSLisandro Dalcin Level: intermediate 35545f3bb6eSLisandro Dalcin 356*811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawOpenX()`, `PetscDrawCreate()` 35745f3bb6eSLisandro Dalcin @*/ 3589371c9d4SSatish Balay PetscErrorCode PetscDrawSetDoubleBuffer(PetscDraw draw) { 3595c6c1daeSBarry Smith PetscFunctionBegin; 36045f3bb6eSLisandro Dalcin PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 361dbbe0bcdSBarry Smith PetscTryTypeMethod(draw, setdoublebuffer); 3625c6c1daeSBarry Smith PetscFunctionReturn(0); 3635c6c1daeSBarry Smith } 3645c6c1daeSBarry Smith 3655c6c1daeSBarry Smith /*@C 366*811af0c4SBarry Smith PetscDrawGetSingleton - Gain access to a `PetscDraw` object as if it were owned 3675c6c1daeSBarry Smith by the one process. 3685c6c1daeSBarry Smith 369*811af0c4SBarry Smith Collective on draw 3705c6c1daeSBarry Smith 3715c6c1daeSBarry Smith Input Parameter: 3725c6c1daeSBarry Smith . draw - the original window 3735c6c1daeSBarry Smith 3745c6c1daeSBarry Smith Output Parameter: 3755c6c1daeSBarry Smith . sdraw - the singleton window 3765c6c1daeSBarry Smith 3775c6c1daeSBarry Smith Level: advanced 3785c6c1daeSBarry Smith 379*811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawRestoreSingleton()`, `PetscViewerGetSingleton()`, `PetscViewerRestoreSingleton()` 3805c6c1daeSBarry Smith @*/ 3819371c9d4SSatish Balay PetscErrorCode PetscDrawGetSingleton(PetscDraw draw, PetscDraw *sdraw) { 3825c6c1daeSBarry Smith PetscMPIInt size; 3835c6c1daeSBarry Smith 3845c6c1daeSBarry Smith PetscFunctionBegin; 3855c6c1daeSBarry Smith PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 3865c6c1daeSBarry Smith PetscValidPointer(sdraw, 2); 3875c6c1daeSBarry Smith 3889566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)draw), &size)); 389387ef4f7SLisandro Dalcin if (size == 1) { 3909566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)draw)); 391387ef4f7SLisandro Dalcin *sdraw = draw; 392387ef4f7SLisandro Dalcin } else { 3935c6c1daeSBarry Smith if (draw->ops->getsingleton) { 394dbbe0bcdSBarry Smith PetscUseTypeMethod(draw, getsingleton, sdraw); 39598921bdaSJacob Faibussowitsch } else SETERRQ(PETSC_COMM_SELF, PETSC_ERR_SUP, "Cannot get singleton for this type %s of draw object", ((PetscObject)draw)->type_name); 3965c6c1daeSBarry Smith } 3975c6c1daeSBarry Smith PetscFunctionReturn(0); 3985c6c1daeSBarry Smith } 3995c6c1daeSBarry Smith 4005c6c1daeSBarry Smith /*@C 401*811af0c4SBarry Smith PetscDrawRestoreSingleton - Remove access to a `PetscDraw` object obtained with `PetscDrawGetSingleton()` 4025c6c1daeSBarry Smith by the one process. 4035c6c1daeSBarry Smith 404*811af0c4SBarry Smith Collective on draw 4055c6c1daeSBarry Smith 4065c6c1daeSBarry Smith Input Parameters: 4075c6c1daeSBarry Smith + draw - the original window 4085c6c1daeSBarry Smith - sdraw - the singleton window 4095c6c1daeSBarry Smith 4105c6c1daeSBarry Smith Level: advanced 4115c6c1daeSBarry Smith 412*811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawGetSingleton()`, `PetscViewerGetSingleton()`, `PetscViewerRestoreSingleton()` 4135c6c1daeSBarry Smith @*/ 4149371c9d4SSatish Balay PetscErrorCode PetscDrawRestoreSingleton(PetscDraw draw, PetscDraw *sdraw) { 4155c6c1daeSBarry Smith PetscMPIInt size; 4165c6c1daeSBarry Smith 4175c6c1daeSBarry Smith PetscFunctionBegin; 4185c6c1daeSBarry Smith PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 4195c6c1daeSBarry Smith PetscValidPointer(sdraw, 2); 4205c6c1daeSBarry Smith PetscValidHeaderSpecific(*sdraw, PETSC_DRAW_CLASSID, 2); 4215c6c1daeSBarry Smith 4229566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)draw), &size)); 423387ef4f7SLisandro Dalcin if (size == 1) { 424387ef4f7SLisandro Dalcin if (draw == *sdraw) { 4259566063dSJacob Faibussowitsch PetscCall(PetscObjectDereference((PetscObject)draw)); 426387ef4f7SLisandro Dalcin *sdraw = NULL; 427387ef4f7SLisandro Dalcin } else SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Cannot restore singleton, it is not the parent draw"); 428dbbe0bcdSBarry Smith } else PetscUseTypeMethod(draw, restoresingleton, sdraw); 4295c6c1daeSBarry Smith PetscFunctionReturn(0); 4305c6c1daeSBarry Smith } 431