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 125c6c1daeSBarry Smith PetscDrawFinalizePackage - This function destroys everything in the Petsc interface to the Draw package. It is 135c6c1daeSBarry Smith called from PetscFinalize(). 145c6c1daeSBarry Smith 155c6c1daeSBarry Smith Level: developer 165c6c1daeSBarry Smith 17db781477SPatrick Sanan .seealso: `PetscFinalize()` 185c6c1daeSBarry Smith @*/ 195c6c1daeSBarry Smith PetscErrorCode PetscDrawFinalizePackage(void) 205c6c1daeSBarry Smith { 215c6c1daeSBarry Smith PetscFunctionBegin; 229566063dSJacob Faibussowitsch PetscCall(PetscFunctionListDestroy(&PetscDrawList)); 235c6c1daeSBarry Smith PetscDrawPackageInitialized = PETSC_FALSE; 240f51fdf8SToby Isaac PetscDrawRegisterAllCalled = PETSC_FALSE; 255c6c1daeSBarry Smith PetscFunctionReturn(0); 265c6c1daeSBarry Smith } 275c6c1daeSBarry Smith 285c6c1daeSBarry Smith /*@C 295c6c1daeSBarry Smith PetscInitializeDrawPackage - This function initializes everything in the PetscDraw package. It is called 308a690491SBarry Smith from PetscDLLibraryRegister_petsc() when using dynamic libraries, and on the call to PetscInitialize() 318a690491SBarry Smith when using shared or static libraries. 325c6c1daeSBarry Smith 335c6c1daeSBarry Smith Level: developer 345c6c1daeSBarry Smith 35db781477SPatrick Sanan .seealso: `PetscInitialize()` 365c6c1daeSBarry Smith @*/ 37607a6623SBarry Smith PetscErrorCode PetscDrawInitializePackage(void) 385c6c1daeSBarry Smith { 395c6c1daeSBarry Smith char logList[256]; 408e81d068SLisandro Dalcin PetscBool opt,pkg; 415c6c1daeSBarry Smith 425c6c1daeSBarry Smith PetscFunctionBegin; 435c6c1daeSBarry Smith if (PetscDrawPackageInitialized) PetscFunctionReturn(0); 445c6c1daeSBarry Smith PetscDrawPackageInitialized = PETSC_TRUE; 455c6c1daeSBarry Smith /* Register Classes */ 469566063dSJacob Faibussowitsch PetscCall(PetscClassIdRegister("Draw",&PETSC_DRAW_CLASSID)); 479566063dSJacob Faibussowitsch PetscCall(PetscClassIdRegister("Draw Axis",&PETSC_DRAWAXIS_CLASSID)); 489566063dSJacob Faibussowitsch PetscCall(PetscClassIdRegister("Line Graph",&PETSC_DRAWLG_CLASSID)); 499566063dSJacob Faibussowitsch PetscCall(PetscClassIdRegister("Histogram",&PETSC_DRAWHG_CLASSID)); 509566063dSJacob Faibussowitsch PetscCall(PetscClassIdRegister("Bar Graph",&PETSC_DRAWBAR_CLASSID)); 519566063dSJacob Faibussowitsch PetscCall(PetscClassIdRegister("Scatter Plot",&PETSC_DRAWSP_CLASSID)); 525c6c1daeSBarry Smith /* Register Constructors */ 539566063dSJacob Faibussowitsch PetscCall(PetscDrawRegisterAll()); 54e94e781bSJacob Faibussowitsch /* Process Info */ 55e94e781bSJacob Faibussowitsch { 56e94e781bSJacob Faibussowitsch PetscClassId classids[6]; 57e94e781bSJacob Faibussowitsch 58e94e781bSJacob Faibussowitsch classids[0] = PETSC_DRAW_CLASSID; 59e94e781bSJacob Faibussowitsch classids[1] = PETSC_DRAWAXIS_CLASSID; 60e94e781bSJacob Faibussowitsch classids[2] = PETSC_DRAWLG_CLASSID; 61e94e781bSJacob Faibussowitsch classids[3] = PETSC_DRAWHG_CLASSID; 62e94e781bSJacob Faibussowitsch classids[4] = PETSC_DRAWBAR_CLASSID; 63e94e781bSJacob Faibussowitsch classids[5] = PETSC_DRAWSP_CLASSID; 649566063dSJacob Faibussowitsch PetscCall(PetscInfoProcessClass("draw", 6, classids)); 655c6c1daeSBarry Smith } 665c6c1daeSBarry Smith /* Process summary exclusions */ 679566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt)); 685c6c1daeSBarry Smith if (opt) { 699566063dSJacob Faibussowitsch PetscCall(PetscStrInList("draw",logList,',',&pkg)); 708e81d068SLisandro Dalcin if (pkg) { 719566063dSJacob Faibussowitsch PetscCall(PetscLogEventExcludeClass(PETSC_DRAW_CLASSID)); 729566063dSJacob Faibussowitsch PetscCall(PetscLogEventExcludeClass(PETSC_DRAWAXIS_CLASSID)); 739566063dSJacob Faibussowitsch PetscCall(PetscLogEventExcludeClass(PETSC_DRAWLG_CLASSID)); 749566063dSJacob Faibussowitsch PetscCall(PetscLogEventExcludeClass(PETSC_DRAWHG_CLASSID)); 759566063dSJacob Faibussowitsch PetscCall(PetscLogEventExcludeClass(PETSC_DRAWBAR_CLASSID)); 769566063dSJacob Faibussowitsch PetscCall(PetscLogEventExcludeClass(PETSC_DRAWSP_CLASSID)); 775c6c1daeSBarry Smith } 785c6c1daeSBarry Smith } 798e81d068SLisandro Dalcin /* Register package finalizer */ 809566063dSJacob Faibussowitsch PetscCall(PetscRegisterFinalize(PetscDrawFinalizePackage)); 815c6c1daeSBarry Smith PetscFunctionReturn(0); 825c6c1daeSBarry Smith } 835c6c1daeSBarry Smith 845c6c1daeSBarry Smith /*@ 855c6c1daeSBarry Smith PetscDrawResizeWindow - Allows one to resize a window from a program. 865c6c1daeSBarry Smith 875c6c1daeSBarry Smith Collective on PetscDraw 885c6c1daeSBarry Smith 89d8d19677SJose E. Roman Input Parameters: 905c6c1daeSBarry Smith + draw - the window 915c6c1daeSBarry Smith - w,h - the new width and height of the window 925c6c1daeSBarry Smith 935c6c1daeSBarry Smith Level: intermediate 945c6c1daeSBarry Smith 95db781477SPatrick Sanan .seealso: `PetscDrawCheckResizedWindow()` 965c6c1daeSBarry Smith @*/ 975c6c1daeSBarry Smith PetscErrorCode PetscDrawResizeWindow(PetscDraw draw,int w,int h) 985c6c1daeSBarry Smith { 995c6c1daeSBarry Smith PetscFunctionBegin; 10073ecf448SLisandro Dalcin PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 10173ecf448SLisandro Dalcin PetscValidLogicalCollectiveInt(draw,w,2); 10273ecf448SLisandro Dalcin PetscValidLogicalCollectiveInt(draw,h,3); 103*dbbe0bcdSBarry Smith PetscTryTypeMethod(draw,resizewindow,w,h); 1045c6c1daeSBarry Smith PetscFunctionReturn(0); 1055c6c1daeSBarry Smith } 1065c6c1daeSBarry Smith 10773ecf448SLisandro Dalcin /*@ 10873ecf448SLisandro Dalcin PetscDrawGetWindowSize - Gets the size of the window. 10973ecf448SLisandro Dalcin 11073ecf448SLisandro Dalcin Not collective 11173ecf448SLisandro Dalcin 11273ecf448SLisandro Dalcin Input Parameter: 11373ecf448SLisandro Dalcin . draw - the window 11473ecf448SLisandro Dalcin 11573ecf448SLisandro Dalcin Output Parameters: 11673ecf448SLisandro Dalcin . w,h - the window width and height 11773ecf448SLisandro Dalcin 11873ecf448SLisandro Dalcin Level: intermediate 11973ecf448SLisandro Dalcin 120db781477SPatrick Sanan .seealso: `PetscDrawResizeWindow()`, `PetscDrawCheckResizedWindow()` 12173ecf448SLisandro Dalcin @*/ 12273ecf448SLisandro Dalcin PetscErrorCode PetscDrawGetWindowSize(PetscDraw draw,int *w,int *h) 12373ecf448SLisandro Dalcin { 12473ecf448SLisandro Dalcin PetscFunctionBegin; 12573ecf448SLisandro Dalcin PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 12673ecf448SLisandro Dalcin if (w) PetscValidPointer(w,2); 12773ecf448SLisandro Dalcin if (h) PetscValidPointer(h,3); 12873ecf448SLisandro Dalcin if (w) *w = draw->w; 12973ecf448SLisandro Dalcin if (h) *h = draw->h; 13073ecf448SLisandro Dalcin PetscFunctionReturn(0); 13173ecf448SLisandro Dalcin } 13273ecf448SLisandro Dalcin 1335c6c1daeSBarry Smith /*@ 1345c6c1daeSBarry Smith PetscDrawCheckResizedWindow - Checks if the user has resized the window. 1355c6c1daeSBarry Smith 1365c6c1daeSBarry Smith Collective on PetscDraw 1375c6c1daeSBarry Smith 1385c6c1daeSBarry Smith Input Parameter: 1395c6c1daeSBarry Smith . draw - the window 1405c6c1daeSBarry Smith 1415c6c1daeSBarry Smith Level: advanced 1425c6c1daeSBarry Smith 143db781477SPatrick Sanan .seealso: `PetscDrawResizeWindow()` 1445c6c1daeSBarry Smith 1455c6c1daeSBarry Smith @*/ 1465c6c1daeSBarry Smith PetscErrorCode PetscDrawCheckResizedWindow(PetscDraw draw) 1475c6c1daeSBarry Smith { 1485c6c1daeSBarry Smith PetscFunctionBegin; 14973ecf448SLisandro Dalcin PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 150*dbbe0bcdSBarry Smith PetscTryTypeMethod(draw,checkresizedwindow); 1515c6c1daeSBarry Smith PetscFunctionReturn(0); 1525c6c1daeSBarry Smith } 1535c6c1daeSBarry Smith 1545c6c1daeSBarry Smith /*@C 1555c6c1daeSBarry Smith PetscDrawGetTitle - Gets pointer to title of a PetscDraw context. 1565c6c1daeSBarry Smith 1575c6c1daeSBarry Smith Not collective 1585c6c1daeSBarry Smith 1595c6c1daeSBarry Smith Input Parameter: 1605c6c1daeSBarry Smith . draw - the graphics context 1615c6c1daeSBarry Smith 1625c6c1daeSBarry Smith Output Parameter: 1635c6c1daeSBarry Smith . title - the title 1645c6c1daeSBarry Smith 1655c6c1daeSBarry Smith Level: intermediate 1665c6c1daeSBarry Smith 167db781477SPatrick Sanan .seealso: `PetscDrawSetTitle()` 1685c6c1daeSBarry Smith @*/ 169f60c72e3SLisandro Dalcin PetscErrorCode PetscDrawGetTitle(PetscDraw draw,const char *title[]) 1705c6c1daeSBarry Smith { 1715c6c1daeSBarry Smith PetscFunctionBegin; 1725c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 1735c6c1daeSBarry Smith PetscValidPointer(title,2); 1745c6c1daeSBarry Smith *title = draw->title; 1755c6c1daeSBarry Smith PetscFunctionReturn(0); 1765c6c1daeSBarry Smith } 1775c6c1daeSBarry Smith 1785c6c1daeSBarry Smith /*@C 1795c6c1daeSBarry Smith PetscDrawSetTitle - Sets the title of a PetscDraw context. 1805c6c1daeSBarry Smith 1815b399a63SLisandro Dalcin Collective on PetscDraw 1825c6c1daeSBarry Smith 1835c6c1daeSBarry Smith Input Parameters: 1845c6c1daeSBarry Smith + draw - the graphics context 1855c6c1daeSBarry Smith - title - the title 1865c6c1daeSBarry Smith 1875c6c1daeSBarry Smith Level: intermediate 1885c6c1daeSBarry Smith 189231a95f8SBarry Smith Note: The title is positioned in the windowing system title bar for the window. Hence it will not be saved with -draw_save 190231a95f8SBarry Smith in the image. 191231a95f8SBarry Smith 1925c6c1daeSBarry Smith A copy of the string is made, so you may destroy the 1935c6c1daeSBarry Smith title string after calling this routine. 1945c6c1daeSBarry Smith 195231a95f8SBarry Smith You can use PetscDrawAxisSetLabels() to indicate a title within the window 196231a95f8SBarry Smith 197db781477SPatrick Sanan .seealso: `PetscDrawGetTitle()`, `PetscDrawAppendTitle()` 1985c6c1daeSBarry Smith @*/ 1995c6c1daeSBarry Smith PetscErrorCode PetscDrawSetTitle(PetscDraw draw,const char title[]) 2005c6c1daeSBarry Smith { 2015c6c1daeSBarry Smith PetscFunctionBegin; 2025c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 2035c6c1daeSBarry Smith PetscValidCharPointer(title,2); 2049566063dSJacob Faibussowitsch PetscCall(PetscFree(draw->title)); 2059566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(title,&draw->title)); 206*dbbe0bcdSBarry Smith PetscTryTypeMethod(draw,settitle,draw->title); 2075c6c1daeSBarry Smith PetscFunctionReturn(0); 2085c6c1daeSBarry Smith } 2095c6c1daeSBarry Smith 2105c6c1daeSBarry Smith /*@C 2115c6c1daeSBarry Smith PetscDrawAppendTitle - Appends to the title of a PetscDraw context. 2125c6c1daeSBarry Smith 2135b399a63SLisandro Dalcin Collective on PetscDraw 2145c6c1daeSBarry Smith 2155c6c1daeSBarry Smith Input Parameters: 2165c6c1daeSBarry Smith + draw - the graphics context 2175c6c1daeSBarry Smith - title - the title 2185c6c1daeSBarry Smith 2195c6c1daeSBarry Smith Note: 2205c6c1daeSBarry Smith A copy of the string is made, so you may destroy the 2215c6c1daeSBarry Smith title string after calling this routine. 2225c6c1daeSBarry Smith 2235c6c1daeSBarry Smith Level: advanced 2245c6c1daeSBarry Smith 225db781477SPatrick Sanan .seealso: `PetscDrawSetTitle()`, `PetscDrawGetTitle()` 2265c6c1daeSBarry Smith @*/ 2275c6c1daeSBarry Smith PetscErrorCode PetscDrawAppendTitle(PetscDraw draw,const char title[]) 2285c6c1daeSBarry Smith { 2295c6c1daeSBarry Smith PetscFunctionBegin; 2305c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 2315b399a63SLisandro Dalcin if (title) PetscValidCharPointer(title,2); 2325b399a63SLisandro Dalcin if (!title || !title[0]) PetscFunctionReturn(0); 2335c6c1daeSBarry Smith 2345c6c1daeSBarry Smith if (draw->title) { 2355b399a63SLisandro Dalcin size_t len1,len2; 2365b399a63SLisandro Dalcin char *newtitle; 2379566063dSJacob Faibussowitsch PetscCall(PetscStrlen(title,&len1)); 2389566063dSJacob Faibussowitsch PetscCall(PetscStrlen(draw->title,&len2)); 2399566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(len1 + len2 + 1,&newtitle)); 2409566063dSJacob Faibussowitsch PetscCall(PetscStrcpy(newtitle,draw->title)); 2419566063dSJacob Faibussowitsch PetscCall(PetscStrcat(newtitle,title)); 2429566063dSJacob Faibussowitsch PetscCall(PetscFree(draw->title)); 2435c6c1daeSBarry Smith draw->title = newtitle; 2445c6c1daeSBarry Smith } else { 2459566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(title,&draw->title)); 2465c6c1daeSBarry Smith } 247*dbbe0bcdSBarry Smith PetscTryTypeMethod(draw,settitle,draw->title); 2485c6c1daeSBarry Smith PetscFunctionReturn(0); 2495c6c1daeSBarry Smith } 2505c6c1daeSBarry Smith 251e118a51fSLisandro Dalcin static PetscErrorCode PetscDrawDestroy_Private(PetscDraw draw) 252e118a51fSLisandro Dalcin { 253e118a51fSLisandro Dalcin PetscFunctionBegin; 2548067a7d5SLisandro Dalcin if (!draw->ops->save && !draw->ops->getimage) PetscFunctionReturn(0); 2559566063dSJacob Faibussowitsch PetscCall(PetscDrawSaveMovie(draw)); 256e118a51fSLisandro Dalcin if (draw->savefinalfilename) { 257df8d4941SLisandro Dalcin draw->savesinglefile = PETSC_TRUE; 2589566063dSJacob Faibussowitsch PetscCall(PetscDrawSetSave(draw,draw->savefinalfilename)); 2599566063dSJacob Faibussowitsch PetscCall(PetscDrawSave(draw)); 260e118a51fSLisandro Dalcin } 2619566063dSJacob Faibussowitsch PetscCall(PetscBarrier((PetscObject)draw)); 262e118a51fSLisandro Dalcin PetscFunctionReturn(0); 263e118a51fSLisandro Dalcin } 264e118a51fSLisandro Dalcin 2655c6c1daeSBarry Smith /*@ 2665c6c1daeSBarry Smith PetscDrawDestroy - Deletes a draw context. 2675c6c1daeSBarry Smith 2685c6c1daeSBarry Smith Collective on PetscDraw 2695c6c1daeSBarry Smith 2705c6c1daeSBarry Smith Input Parameters: 2715c6c1daeSBarry Smith . draw - the drawing context 2725c6c1daeSBarry Smith 2735c6c1daeSBarry Smith Level: beginner 2745c6c1daeSBarry Smith 275db781477SPatrick Sanan .seealso: `PetscDrawCreate()` 2765c6c1daeSBarry Smith 2775c6c1daeSBarry Smith @*/ 2785c6c1daeSBarry Smith PetscErrorCode PetscDrawDestroy(PetscDraw *draw) 2795c6c1daeSBarry Smith { 2805c6c1daeSBarry Smith PetscFunctionBegin; 2815c6c1daeSBarry Smith if (!*draw) PetscFunctionReturn(0); 2825c6c1daeSBarry Smith PetscValidHeaderSpecific(*draw,PETSC_DRAW_CLASSID,1); 2835c6c1daeSBarry Smith if (--((PetscObject)(*draw))->refct > 0) PetscFunctionReturn(0); 2845c6c1daeSBarry Smith 2855c6c1daeSBarry Smith if ((*draw)->pause == -2) { 2865c6c1daeSBarry Smith (*draw)->pause = -1; 2879566063dSJacob Faibussowitsch PetscCall(PetscDrawPause(*draw)); 2885c6c1daeSBarry Smith } 2895c6c1daeSBarry Smith 2905c6c1daeSBarry Smith /* if memory was published then destroy it */ 2919566063dSJacob Faibussowitsch PetscCall(PetscObjectSAWsViewOff((PetscObject)*draw)); 2925c6c1daeSBarry Smith 2939566063dSJacob Faibussowitsch PetscCall(PetscDrawDestroy_Private(*draw)); 294e118a51fSLisandro Dalcin 2955c6c1daeSBarry Smith if ((*draw)->ops->destroy) { 2969566063dSJacob Faibussowitsch PetscCall((*(*draw)->ops->destroy)(*draw)); 2975c6c1daeSBarry Smith } 2989566063dSJacob Faibussowitsch PetscCall(PetscDrawDestroy(&(*draw)->popup)); 2999566063dSJacob Faibussowitsch PetscCall(PetscFree((*draw)->title)); 3009566063dSJacob Faibussowitsch PetscCall(PetscFree((*draw)->display)); 3019566063dSJacob Faibussowitsch PetscCall(PetscFree((*draw)->savefilename)); 3029566063dSJacob Faibussowitsch PetscCall(PetscFree((*draw)->saveimageext)); 3039566063dSJacob Faibussowitsch PetscCall(PetscFree((*draw)->savemovieext)); 3049566063dSJacob Faibussowitsch PetscCall(PetscFree((*draw)->savefinalfilename)); 3059566063dSJacob Faibussowitsch PetscCall(PetscHeaderDestroy(draw)); 3065c6c1daeSBarry Smith PetscFunctionReturn(0); 3075c6c1daeSBarry Smith } 3085c6c1daeSBarry Smith 3095c6c1daeSBarry Smith /*@ 3105c6c1daeSBarry Smith PetscDrawGetPopup - Creates a popup window associated with a PetscDraw window. 3115c6c1daeSBarry Smith 3125c6c1daeSBarry Smith Collective on PetscDraw 3135c6c1daeSBarry Smith 3145c6c1daeSBarry Smith Input Parameter: 3155c6c1daeSBarry Smith . draw - the original window 3165c6c1daeSBarry Smith 3175c6c1daeSBarry Smith Output Parameter: 3185c6c1daeSBarry Smith . popup - the new popup window 3195c6c1daeSBarry Smith 3205c6c1daeSBarry Smith Level: advanced 3215c6c1daeSBarry Smith 322db781477SPatrick Sanan .seealso: `PetscDrawScalePopup()`, `PetscDrawCreate()` 323ba1e01c4SBarry Smith 3245c6c1daeSBarry Smith @*/ 3255c6c1daeSBarry Smith PetscErrorCode PetscDrawGetPopup(PetscDraw draw,PetscDraw *popup) 3265c6c1daeSBarry Smith { 3275c6c1daeSBarry Smith PetscFunctionBegin; 3285c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 3295c6c1daeSBarry Smith PetscValidPointer(popup,2); 3305c6c1daeSBarry Smith 331a297a907SKarl Rupp if (draw->popup) *popup = draw->popup; 332a297a907SKarl Rupp else if (draw->ops->getpopup) { 333*dbbe0bcdSBarry Smith PetscUseTypeMethod(draw,getpopup ,popup); 3340b874712SBarry Smith if (*popup) { 3359566063dSJacob Faibussowitsch PetscCall(PetscObjectSetOptionsPrefix((PetscObject)*popup,"popup_")); 336e118a51fSLisandro Dalcin (*popup)->pause = 0.0; 3379566063dSJacob Faibussowitsch PetscCall(PetscDrawSetFromOptions(*popup)); 33861f59835SBarry Smith } 3390298fd71SBarry Smith } else *popup = NULL; 3405c6c1daeSBarry Smith PetscFunctionReturn(0); 3415c6c1daeSBarry Smith } 3425c6c1daeSBarry Smith 34394ef8ddeSSatish Balay /*@C 3445c6c1daeSBarry Smith PetscDrawSetDisplay - Sets the display where a PetscDraw object will be displayed 3455c6c1daeSBarry Smith 346d8d19677SJose E. Roman Input Parameters: 3475c6c1daeSBarry Smith + draw - the drawing context 3485c6c1daeSBarry Smith - display - the X windows display 3495c6c1daeSBarry Smith 3505c6c1daeSBarry Smith Level: advanced 3515c6c1daeSBarry Smith 352db781477SPatrick Sanan .seealso: `PetscDrawCreate()` 353ba1e01c4SBarry Smith 3545c6c1daeSBarry Smith @*/ 3555c6c1daeSBarry Smith PetscErrorCode PetscDrawSetDisplay(PetscDraw draw,const char display[]) 3565c6c1daeSBarry Smith { 3575c6c1daeSBarry Smith PetscFunctionBegin; 3589566063dSJacob Faibussowitsch PetscCall(PetscFree(draw->display)); 3599566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(display,&draw->display)); 3605c6c1daeSBarry Smith PetscFunctionReturn(0); 3615c6c1daeSBarry Smith } 3625c6c1daeSBarry Smith 36345f3bb6eSLisandro Dalcin /*@ 36445f3bb6eSLisandro Dalcin PetscDrawSetDoubleBuffer - Sets a window to be double buffered. 36545f3bb6eSLisandro Dalcin 36645f3bb6eSLisandro Dalcin Logically Collective on PetscDraw 3675c6c1daeSBarry Smith 3685c6c1daeSBarry Smith Input Parameter: 36945f3bb6eSLisandro Dalcin . draw - the drawing context 37045f3bb6eSLisandro Dalcin 37145f3bb6eSLisandro Dalcin Level: intermediate 37245f3bb6eSLisandro Dalcin 37345f3bb6eSLisandro Dalcin @*/ 37445f3bb6eSLisandro Dalcin PetscErrorCode PetscDrawSetDoubleBuffer(PetscDraw draw) 3755c6c1daeSBarry Smith { 3765c6c1daeSBarry Smith PetscFunctionBegin; 37745f3bb6eSLisandro Dalcin PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 378*dbbe0bcdSBarry Smith PetscTryTypeMethod(draw,setdoublebuffer); 3795c6c1daeSBarry Smith PetscFunctionReturn(0); 3805c6c1daeSBarry Smith } 3815c6c1daeSBarry Smith 3825c6c1daeSBarry Smith /*@C 3835c6c1daeSBarry Smith PetscDrawGetSingleton - Gain access to a PetscDraw object as if it were owned 3845c6c1daeSBarry Smith by the one process. 3855c6c1daeSBarry Smith 3865c6c1daeSBarry Smith Collective on PetscDraw 3875c6c1daeSBarry Smith 3885c6c1daeSBarry Smith Input Parameter: 3895c6c1daeSBarry Smith . draw - the original window 3905c6c1daeSBarry Smith 3915c6c1daeSBarry Smith Output Parameter: 3925c6c1daeSBarry Smith . sdraw - the singleton window 3935c6c1daeSBarry Smith 3945c6c1daeSBarry Smith Level: advanced 3955c6c1daeSBarry Smith 396db781477SPatrick Sanan .seealso: `PetscDrawRestoreSingleton()`, `PetscViewerGetSingleton()`, `PetscViewerRestoreSingleton()` 3975c6c1daeSBarry Smith 3985c6c1daeSBarry Smith @*/ 3995c6c1daeSBarry Smith PetscErrorCode PetscDrawGetSingleton(PetscDraw draw,PetscDraw *sdraw) 4005c6c1daeSBarry Smith { 4015c6c1daeSBarry Smith PetscMPIInt size; 4025c6c1daeSBarry Smith 4035c6c1daeSBarry Smith PetscFunctionBegin; 4045c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 4055c6c1daeSBarry Smith PetscValidPointer(sdraw,2); 4065c6c1daeSBarry Smith 4079566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)draw),&size)); 408387ef4f7SLisandro Dalcin if (size == 1) { 4099566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)draw)); 410387ef4f7SLisandro Dalcin *sdraw = draw; 411387ef4f7SLisandro Dalcin } else { 4125c6c1daeSBarry Smith if (draw->ops->getsingleton) { 413*dbbe0bcdSBarry Smith PetscUseTypeMethod(draw,getsingleton ,sdraw); 41498921bdaSJacob Faibussowitsch } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot get singleton for this type %s of draw object",((PetscObject)draw)->type_name); 4155c6c1daeSBarry Smith } 4165c6c1daeSBarry Smith PetscFunctionReturn(0); 4175c6c1daeSBarry Smith } 4185c6c1daeSBarry Smith 4195c6c1daeSBarry Smith /*@C 4205c6c1daeSBarry Smith PetscDrawRestoreSingleton - Remove access to a PetscDraw object as if it were owned 4215c6c1daeSBarry Smith by the one process. 4225c6c1daeSBarry Smith 4235c6c1daeSBarry Smith Collective on PetscDraw 4245c6c1daeSBarry Smith 4255c6c1daeSBarry Smith Input Parameters: 4265c6c1daeSBarry Smith + draw - the original window 4275c6c1daeSBarry Smith - sdraw - the singleton window 4285c6c1daeSBarry Smith 4295c6c1daeSBarry Smith Level: advanced 4305c6c1daeSBarry Smith 431db781477SPatrick Sanan .seealso: `PetscDrawGetSingleton()`, `PetscViewerGetSingleton()`, `PetscViewerRestoreSingleton()` 4325c6c1daeSBarry Smith 4335c6c1daeSBarry Smith @*/ 4345c6c1daeSBarry Smith PetscErrorCode PetscDrawRestoreSingleton(PetscDraw draw,PetscDraw *sdraw) 4355c6c1daeSBarry Smith { 4365c6c1daeSBarry Smith PetscMPIInt size; 4375c6c1daeSBarry Smith 4385c6c1daeSBarry Smith PetscFunctionBegin; 4395c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 4405c6c1daeSBarry Smith PetscValidPointer(sdraw,2); 4415c6c1daeSBarry Smith PetscValidHeaderSpecific(*sdraw,PETSC_DRAW_CLASSID,2); 4425c6c1daeSBarry Smith 4439566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)draw),&size)); 444387ef4f7SLisandro Dalcin if (size == 1) { 445387ef4f7SLisandro Dalcin if (draw == *sdraw) { 4469566063dSJacob Faibussowitsch PetscCall(PetscObjectDereference((PetscObject)draw)); 447387ef4f7SLisandro Dalcin *sdraw = NULL; 448387ef4f7SLisandro Dalcin } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Cannot restore singleton, it is not the parent draw"); 449*dbbe0bcdSBarry Smith } else PetscUseTypeMethod(draw,restoresingleton ,sdraw); 4505c6c1daeSBarry Smith PetscFunctionReturn(0); 4515c6c1daeSBarry Smith } 452