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 175c6c1daeSBarry Smith .seealso: PetscFinalize() 185c6c1daeSBarry Smith @*/ 195c6c1daeSBarry Smith PetscErrorCode PetscDrawFinalizePackage(void) 205c6c1daeSBarry Smith { 215c6c1daeSBarry Smith PetscFunctionBegin; 22*9566063dSJacob 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 355c6c1daeSBarry Smith .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 */ 46*9566063dSJacob Faibussowitsch PetscCall(PetscClassIdRegister("Draw",&PETSC_DRAW_CLASSID)); 47*9566063dSJacob Faibussowitsch PetscCall(PetscClassIdRegister("Draw Axis",&PETSC_DRAWAXIS_CLASSID)); 48*9566063dSJacob Faibussowitsch PetscCall(PetscClassIdRegister("Line Graph",&PETSC_DRAWLG_CLASSID)); 49*9566063dSJacob Faibussowitsch PetscCall(PetscClassIdRegister("Histogram",&PETSC_DRAWHG_CLASSID)); 50*9566063dSJacob Faibussowitsch PetscCall(PetscClassIdRegister("Bar Graph",&PETSC_DRAWBAR_CLASSID)); 51*9566063dSJacob Faibussowitsch PetscCall(PetscClassIdRegister("Scatter Plot",&PETSC_DRAWSP_CLASSID)); 525c6c1daeSBarry Smith /* Register Constructors */ 53*9566063dSJacob 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; 64*9566063dSJacob Faibussowitsch PetscCall(PetscInfoProcessClass("draw", 6, classids)); 655c6c1daeSBarry Smith } 665c6c1daeSBarry Smith /* Process summary exclusions */ 67*9566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetString(NULL,NULL,"-log_exclude",logList,sizeof(logList),&opt)); 685c6c1daeSBarry Smith if (opt) { 69*9566063dSJacob Faibussowitsch PetscCall(PetscStrInList("draw",logList,',',&pkg)); 708e81d068SLisandro Dalcin if (pkg) { 71*9566063dSJacob Faibussowitsch PetscCall(PetscLogEventExcludeClass(PETSC_DRAW_CLASSID)); 72*9566063dSJacob Faibussowitsch PetscCall(PetscLogEventExcludeClass(PETSC_DRAWAXIS_CLASSID)); 73*9566063dSJacob Faibussowitsch PetscCall(PetscLogEventExcludeClass(PETSC_DRAWLG_CLASSID)); 74*9566063dSJacob Faibussowitsch PetscCall(PetscLogEventExcludeClass(PETSC_DRAWHG_CLASSID)); 75*9566063dSJacob Faibussowitsch PetscCall(PetscLogEventExcludeClass(PETSC_DRAWBAR_CLASSID)); 76*9566063dSJacob Faibussowitsch PetscCall(PetscLogEventExcludeClass(PETSC_DRAWSP_CLASSID)); 775c6c1daeSBarry Smith } 785c6c1daeSBarry Smith } 798e81d068SLisandro Dalcin /* Register package finalizer */ 80*9566063dSJacob 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 955c6c1daeSBarry Smith .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); 1035c6c1daeSBarry Smith if (draw->ops->resizewindow) { 104*9566063dSJacob Faibussowitsch PetscCall((*draw->ops->resizewindow)(draw,w,h)); 1055c6c1daeSBarry Smith } 1065c6c1daeSBarry Smith PetscFunctionReturn(0); 1075c6c1daeSBarry Smith } 1085c6c1daeSBarry Smith 10973ecf448SLisandro Dalcin /*@ 11073ecf448SLisandro Dalcin PetscDrawGetWindowSize - Gets the size of the window. 11173ecf448SLisandro Dalcin 11273ecf448SLisandro Dalcin Not collective 11373ecf448SLisandro Dalcin 11473ecf448SLisandro Dalcin Input Parameter: 11573ecf448SLisandro Dalcin . draw - the window 11673ecf448SLisandro Dalcin 11773ecf448SLisandro Dalcin Output Parameters: 11873ecf448SLisandro Dalcin . w,h - the window width and height 11973ecf448SLisandro Dalcin 12073ecf448SLisandro Dalcin Level: intermediate 12173ecf448SLisandro Dalcin 12273ecf448SLisandro Dalcin .seealso: PetscDrawResizeWindow(), PetscDrawCheckResizedWindow() 12373ecf448SLisandro Dalcin @*/ 12473ecf448SLisandro Dalcin PetscErrorCode PetscDrawGetWindowSize(PetscDraw draw,int *w,int *h) 12573ecf448SLisandro Dalcin { 12673ecf448SLisandro Dalcin PetscFunctionBegin; 12773ecf448SLisandro Dalcin PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 12873ecf448SLisandro Dalcin if (w) PetscValidPointer(w,2); 12973ecf448SLisandro Dalcin if (h) PetscValidPointer(h,3); 13073ecf448SLisandro Dalcin if (w) *w = draw->w; 13173ecf448SLisandro Dalcin if (h) *h = draw->h; 13273ecf448SLisandro Dalcin PetscFunctionReturn(0); 13373ecf448SLisandro Dalcin } 13473ecf448SLisandro Dalcin 1355c6c1daeSBarry Smith /*@ 1365c6c1daeSBarry Smith PetscDrawCheckResizedWindow - Checks if the user has resized the window. 1375c6c1daeSBarry Smith 1385c6c1daeSBarry Smith Collective on PetscDraw 1395c6c1daeSBarry Smith 1405c6c1daeSBarry Smith Input Parameter: 1415c6c1daeSBarry Smith . draw - the window 1425c6c1daeSBarry Smith 1435c6c1daeSBarry Smith Level: advanced 1445c6c1daeSBarry Smith 1455c6c1daeSBarry Smith .seealso: PetscDrawResizeWindow() 1465c6c1daeSBarry Smith 1475c6c1daeSBarry Smith @*/ 1485c6c1daeSBarry Smith PetscErrorCode PetscDrawCheckResizedWindow(PetscDraw draw) 1495c6c1daeSBarry Smith { 1505c6c1daeSBarry Smith PetscFunctionBegin; 15173ecf448SLisandro Dalcin PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 1525c6c1daeSBarry Smith if (draw->ops->checkresizedwindow) { 153*9566063dSJacob Faibussowitsch PetscCall((*draw->ops->checkresizedwindow)(draw)); 1545c6c1daeSBarry Smith } 1555c6c1daeSBarry Smith PetscFunctionReturn(0); 1565c6c1daeSBarry Smith } 1575c6c1daeSBarry Smith 1585c6c1daeSBarry Smith /*@C 1595c6c1daeSBarry Smith PetscDrawGetTitle - Gets pointer to title of a PetscDraw context. 1605c6c1daeSBarry Smith 1615c6c1daeSBarry Smith Not collective 1625c6c1daeSBarry Smith 1635c6c1daeSBarry Smith Input Parameter: 1645c6c1daeSBarry Smith . draw - the graphics context 1655c6c1daeSBarry Smith 1665c6c1daeSBarry Smith Output Parameter: 1675c6c1daeSBarry Smith . title - the title 1685c6c1daeSBarry Smith 1695c6c1daeSBarry Smith Level: intermediate 1705c6c1daeSBarry Smith 1715c6c1daeSBarry Smith .seealso: PetscDrawSetTitle() 1725c6c1daeSBarry Smith @*/ 173f60c72e3SLisandro Dalcin PetscErrorCode PetscDrawGetTitle(PetscDraw draw,const char *title[]) 1745c6c1daeSBarry Smith { 1755c6c1daeSBarry Smith PetscFunctionBegin; 1765c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 1775c6c1daeSBarry Smith PetscValidPointer(title,2); 1785c6c1daeSBarry Smith *title = draw->title; 1795c6c1daeSBarry Smith PetscFunctionReturn(0); 1805c6c1daeSBarry Smith } 1815c6c1daeSBarry Smith 1825c6c1daeSBarry Smith /*@C 1835c6c1daeSBarry Smith PetscDrawSetTitle - Sets the title of a PetscDraw context. 1845c6c1daeSBarry Smith 1855b399a63SLisandro Dalcin Collective on PetscDraw 1865c6c1daeSBarry Smith 1875c6c1daeSBarry Smith Input Parameters: 1885c6c1daeSBarry Smith + draw - the graphics context 1895c6c1daeSBarry Smith - title - the title 1905c6c1daeSBarry Smith 1915c6c1daeSBarry Smith Level: intermediate 1925c6c1daeSBarry Smith 193231a95f8SBarry Smith Note: The title is positioned in the windowing system title bar for the window. Hence it will not be saved with -draw_save 194231a95f8SBarry Smith in the image. 195231a95f8SBarry Smith 1965c6c1daeSBarry Smith A copy of the string is made, so you may destroy the 1975c6c1daeSBarry Smith title string after calling this routine. 1985c6c1daeSBarry Smith 199231a95f8SBarry Smith You can use PetscDrawAxisSetLabels() to indicate a title within the window 200231a95f8SBarry Smith 2015c6c1daeSBarry Smith .seealso: PetscDrawGetTitle(), PetscDrawAppendTitle() 2025c6c1daeSBarry Smith @*/ 2035c6c1daeSBarry Smith PetscErrorCode PetscDrawSetTitle(PetscDraw draw,const char title[]) 2045c6c1daeSBarry Smith { 2055c6c1daeSBarry Smith PetscFunctionBegin; 2065c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 2075c6c1daeSBarry Smith PetscValidCharPointer(title,2); 208*9566063dSJacob Faibussowitsch PetscCall(PetscFree(draw->title)); 209*9566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(title,&draw->title)); 2105c6c1daeSBarry Smith if (draw->ops->settitle) { 211*9566063dSJacob Faibussowitsch PetscCall((*draw->ops->settitle)(draw,draw->title)); 2125c6c1daeSBarry Smith } 2135c6c1daeSBarry Smith PetscFunctionReturn(0); 2145c6c1daeSBarry Smith } 2155c6c1daeSBarry Smith 2165c6c1daeSBarry Smith /*@C 2175c6c1daeSBarry Smith PetscDrawAppendTitle - Appends to the title of a PetscDraw context. 2185c6c1daeSBarry Smith 2195b399a63SLisandro Dalcin Collective on PetscDraw 2205c6c1daeSBarry Smith 2215c6c1daeSBarry Smith Input Parameters: 2225c6c1daeSBarry Smith + draw - the graphics context 2235c6c1daeSBarry Smith - title - the title 2245c6c1daeSBarry Smith 2255c6c1daeSBarry Smith Note: 2265c6c1daeSBarry Smith A copy of the string is made, so you may destroy the 2275c6c1daeSBarry Smith title string after calling this routine. 2285c6c1daeSBarry Smith 2295c6c1daeSBarry Smith Level: advanced 2305c6c1daeSBarry Smith 2315c6c1daeSBarry Smith .seealso: PetscDrawSetTitle(), PetscDrawGetTitle() 2325c6c1daeSBarry Smith @*/ 2335c6c1daeSBarry Smith PetscErrorCode PetscDrawAppendTitle(PetscDraw draw,const char title[]) 2345c6c1daeSBarry Smith { 2355c6c1daeSBarry Smith PetscFunctionBegin; 2365c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 2375b399a63SLisandro Dalcin if (title) PetscValidCharPointer(title,2); 2385b399a63SLisandro Dalcin if (!title || !title[0]) PetscFunctionReturn(0); 2395c6c1daeSBarry Smith 2405c6c1daeSBarry Smith if (draw->title) { 2415b399a63SLisandro Dalcin size_t len1,len2; 2425b399a63SLisandro Dalcin char *newtitle; 243*9566063dSJacob Faibussowitsch PetscCall(PetscStrlen(title,&len1)); 244*9566063dSJacob Faibussowitsch PetscCall(PetscStrlen(draw->title,&len2)); 245*9566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(len1 + len2 + 1,&newtitle)); 246*9566063dSJacob Faibussowitsch PetscCall(PetscStrcpy(newtitle,draw->title)); 247*9566063dSJacob Faibussowitsch PetscCall(PetscStrcat(newtitle,title)); 248*9566063dSJacob Faibussowitsch PetscCall(PetscFree(draw->title)); 2495c6c1daeSBarry Smith draw->title = newtitle; 2505c6c1daeSBarry Smith } else { 251*9566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(title,&draw->title)); 2525c6c1daeSBarry Smith } 2535c6c1daeSBarry Smith if (draw->ops->settitle) { 254*9566063dSJacob Faibussowitsch PetscCall((*draw->ops->settitle)(draw,draw->title)); 2555c6c1daeSBarry Smith } 2565c6c1daeSBarry Smith PetscFunctionReturn(0); 2575c6c1daeSBarry Smith } 2585c6c1daeSBarry Smith 259e118a51fSLisandro Dalcin static PetscErrorCode PetscDrawDestroy_Private(PetscDraw draw) 260e118a51fSLisandro Dalcin { 261e118a51fSLisandro Dalcin PetscFunctionBegin; 2628067a7d5SLisandro Dalcin if (!draw->ops->save && !draw->ops->getimage) PetscFunctionReturn(0); 263*9566063dSJacob Faibussowitsch PetscCall(PetscDrawSaveMovie(draw)); 264e118a51fSLisandro Dalcin if (draw->savefinalfilename) { 265df8d4941SLisandro Dalcin draw->savesinglefile = PETSC_TRUE; 266*9566063dSJacob Faibussowitsch PetscCall(PetscDrawSetSave(draw,draw->savefinalfilename)); 267*9566063dSJacob Faibussowitsch PetscCall(PetscDrawSave(draw)); 268e118a51fSLisandro Dalcin } 269*9566063dSJacob Faibussowitsch PetscCall(PetscBarrier((PetscObject)draw)); 270e118a51fSLisandro Dalcin PetscFunctionReturn(0); 271e118a51fSLisandro Dalcin } 272e118a51fSLisandro Dalcin 2735c6c1daeSBarry Smith /*@ 2745c6c1daeSBarry Smith PetscDrawDestroy - Deletes a draw context. 2755c6c1daeSBarry Smith 2765c6c1daeSBarry Smith Collective on PetscDraw 2775c6c1daeSBarry Smith 2785c6c1daeSBarry Smith Input Parameters: 2795c6c1daeSBarry Smith . draw - the drawing context 2805c6c1daeSBarry Smith 2815c6c1daeSBarry Smith Level: beginner 2825c6c1daeSBarry Smith 2835c6c1daeSBarry Smith .seealso: PetscDrawCreate() 2845c6c1daeSBarry Smith 2855c6c1daeSBarry Smith @*/ 2865c6c1daeSBarry Smith PetscErrorCode PetscDrawDestroy(PetscDraw *draw) 2875c6c1daeSBarry Smith { 2885c6c1daeSBarry Smith PetscFunctionBegin; 2895c6c1daeSBarry Smith if (!*draw) PetscFunctionReturn(0); 2905c6c1daeSBarry Smith PetscValidHeaderSpecific(*draw,PETSC_DRAW_CLASSID,1); 2915c6c1daeSBarry Smith if (--((PetscObject)(*draw))->refct > 0) PetscFunctionReturn(0); 2925c6c1daeSBarry Smith 2935c6c1daeSBarry Smith if ((*draw)->pause == -2) { 2945c6c1daeSBarry Smith (*draw)->pause = -1; 295*9566063dSJacob Faibussowitsch PetscCall(PetscDrawPause(*draw)); 2965c6c1daeSBarry Smith } 2975c6c1daeSBarry Smith 2985c6c1daeSBarry Smith /* if memory was published then destroy it */ 299*9566063dSJacob Faibussowitsch PetscCall(PetscObjectSAWsViewOff((PetscObject)*draw)); 3005c6c1daeSBarry Smith 301*9566063dSJacob Faibussowitsch PetscCall(PetscDrawDestroy_Private(*draw)); 302e118a51fSLisandro Dalcin 3035c6c1daeSBarry Smith if ((*draw)->ops->destroy) { 304*9566063dSJacob Faibussowitsch PetscCall((*(*draw)->ops->destroy)(*draw)); 3055c6c1daeSBarry Smith } 306*9566063dSJacob Faibussowitsch PetscCall(PetscDrawDestroy(&(*draw)->popup)); 307*9566063dSJacob Faibussowitsch PetscCall(PetscFree((*draw)->title)); 308*9566063dSJacob Faibussowitsch PetscCall(PetscFree((*draw)->display)); 309*9566063dSJacob Faibussowitsch PetscCall(PetscFree((*draw)->savefilename)); 310*9566063dSJacob Faibussowitsch PetscCall(PetscFree((*draw)->saveimageext)); 311*9566063dSJacob Faibussowitsch PetscCall(PetscFree((*draw)->savemovieext)); 312*9566063dSJacob Faibussowitsch PetscCall(PetscFree((*draw)->savefinalfilename)); 313*9566063dSJacob Faibussowitsch PetscCall(PetscHeaderDestroy(draw)); 3145c6c1daeSBarry Smith PetscFunctionReturn(0); 3155c6c1daeSBarry Smith } 3165c6c1daeSBarry Smith 3175c6c1daeSBarry Smith /*@ 3185c6c1daeSBarry Smith PetscDrawGetPopup - Creates a popup window associated with a PetscDraw window. 3195c6c1daeSBarry Smith 3205c6c1daeSBarry Smith Collective on PetscDraw 3215c6c1daeSBarry Smith 3225c6c1daeSBarry Smith Input Parameter: 3235c6c1daeSBarry Smith . draw - the original window 3245c6c1daeSBarry Smith 3255c6c1daeSBarry Smith Output Parameter: 3265c6c1daeSBarry Smith . popup - the new popup window 3275c6c1daeSBarry Smith 3285c6c1daeSBarry Smith Level: advanced 3295c6c1daeSBarry Smith 330ba1e01c4SBarry Smith .seealso: PetscDrawScalePopup(), PetscDrawCreate() 331ba1e01c4SBarry Smith 3325c6c1daeSBarry Smith @*/ 3335c6c1daeSBarry Smith PetscErrorCode PetscDrawGetPopup(PetscDraw draw,PetscDraw *popup) 3345c6c1daeSBarry Smith { 3355c6c1daeSBarry Smith PetscFunctionBegin; 3365c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 3375c6c1daeSBarry Smith PetscValidPointer(popup,2); 3385c6c1daeSBarry Smith 339a297a907SKarl Rupp if (draw->popup) *popup = draw->popup; 340a297a907SKarl Rupp else if (draw->ops->getpopup) { 341*9566063dSJacob Faibussowitsch PetscCall((*draw->ops->getpopup)(draw,popup)); 3420b874712SBarry Smith if (*popup) { 343*9566063dSJacob Faibussowitsch PetscCall(PetscObjectSetOptionsPrefix((PetscObject)*popup,"popup_")); 344e118a51fSLisandro Dalcin (*popup)->pause = 0.0; 345*9566063dSJacob Faibussowitsch PetscCall(PetscDrawSetFromOptions(*popup)); 34661f59835SBarry Smith } 3470298fd71SBarry Smith } else *popup = NULL; 3485c6c1daeSBarry Smith PetscFunctionReturn(0); 3495c6c1daeSBarry Smith } 3505c6c1daeSBarry Smith 35194ef8ddeSSatish Balay /*@C 3525c6c1daeSBarry Smith PetscDrawSetDisplay - Sets the display where a PetscDraw object will be displayed 3535c6c1daeSBarry Smith 354d8d19677SJose E. Roman Input Parameters: 3555c6c1daeSBarry Smith + draw - the drawing context 3565c6c1daeSBarry Smith - display - the X windows display 3575c6c1daeSBarry Smith 3585c6c1daeSBarry Smith Level: advanced 3595c6c1daeSBarry Smith 360ba1e01c4SBarry Smith .seealso: PetscDrawCreate() 361ba1e01c4SBarry Smith 3625c6c1daeSBarry Smith @*/ 3635c6c1daeSBarry Smith PetscErrorCode PetscDrawSetDisplay(PetscDraw draw,const char display[]) 3645c6c1daeSBarry Smith { 3655c6c1daeSBarry Smith PetscFunctionBegin; 366*9566063dSJacob Faibussowitsch PetscCall(PetscFree(draw->display)); 367*9566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy(display,&draw->display)); 3685c6c1daeSBarry Smith PetscFunctionReturn(0); 3695c6c1daeSBarry Smith } 3705c6c1daeSBarry Smith 37145f3bb6eSLisandro Dalcin /*@ 37245f3bb6eSLisandro Dalcin PetscDrawSetDoubleBuffer - Sets a window to be double buffered. 37345f3bb6eSLisandro Dalcin 37445f3bb6eSLisandro Dalcin Logically Collective on PetscDraw 3755c6c1daeSBarry Smith 3765c6c1daeSBarry Smith Input Parameter: 37745f3bb6eSLisandro Dalcin . draw - the drawing context 37845f3bb6eSLisandro Dalcin 37945f3bb6eSLisandro Dalcin Level: intermediate 38045f3bb6eSLisandro Dalcin 38145f3bb6eSLisandro Dalcin @*/ 38245f3bb6eSLisandro Dalcin PetscErrorCode PetscDrawSetDoubleBuffer(PetscDraw draw) 3835c6c1daeSBarry Smith { 3845c6c1daeSBarry Smith PetscFunctionBegin; 38545f3bb6eSLisandro Dalcin PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 38645f3bb6eSLisandro Dalcin if (draw->ops->setdoublebuffer) { 387*9566063dSJacob Faibussowitsch PetscCall((*draw->ops->setdoublebuffer)(draw)); 38845f3bb6eSLisandro Dalcin } 3895c6c1daeSBarry Smith PetscFunctionReturn(0); 3905c6c1daeSBarry Smith } 3915c6c1daeSBarry Smith 3925c6c1daeSBarry Smith /*@C 3935c6c1daeSBarry Smith PetscDrawGetSingleton - Gain access to a PetscDraw object as if it were owned 3945c6c1daeSBarry Smith by the one process. 3955c6c1daeSBarry Smith 3965c6c1daeSBarry Smith Collective on PetscDraw 3975c6c1daeSBarry Smith 3985c6c1daeSBarry Smith Input Parameter: 3995c6c1daeSBarry Smith . draw - the original window 4005c6c1daeSBarry Smith 4015c6c1daeSBarry Smith Output Parameter: 4025c6c1daeSBarry Smith . sdraw - the singleton window 4035c6c1daeSBarry Smith 4045c6c1daeSBarry Smith Level: advanced 4055c6c1daeSBarry Smith 4065c6c1daeSBarry Smith .seealso: PetscDrawRestoreSingleton(), PetscViewerGetSingleton(), PetscViewerRestoreSingleton() 4075c6c1daeSBarry Smith 4085c6c1daeSBarry Smith @*/ 4095c6c1daeSBarry Smith PetscErrorCode PetscDrawGetSingleton(PetscDraw draw,PetscDraw *sdraw) 4105c6c1daeSBarry Smith { 4115c6c1daeSBarry Smith PetscMPIInt size; 4125c6c1daeSBarry Smith 4135c6c1daeSBarry Smith PetscFunctionBegin; 4145c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 4155c6c1daeSBarry Smith PetscValidPointer(sdraw,2); 4165c6c1daeSBarry Smith 417*9566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)draw),&size)); 418387ef4f7SLisandro Dalcin if (size == 1) { 419*9566063dSJacob Faibussowitsch PetscCall(PetscObjectReference((PetscObject)draw)); 420387ef4f7SLisandro Dalcin *sdraw = draw; 421387ef4f7SLisandro Dalcin } else { 4225c6c1daeSBarry Smith if (draw->ops->getsingleton) { 423*9566063dSJacob Faibussowitsch PetscCall((*draw->ops->getsingleton)(draw,sdraw)); 42498921bdaSJacob Faibussowitsch } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot get singleton for this type %s of draw object",((PetscObject)draw)->type_name); 4255c6c1daeSBarry Smith } 4265c6c1daeSBarry Smith PetscFunctionReturn(0); 4275c6c1daeSBarry Smith } 4285c6c1daeSBarry Smith 4295c6c1daeSBarry Smith /*@C 4305c6c1daeSBarry Smith PetscDrawRestoreSingleton - Remove access to a PetscDraw object as if it were owned 4315c6c1daeSBarry Smith by the one process. 4325c6c1daeSBarry Smith 4335c6c1daeSBarry Smith Collective on PetscDraw 4345c6c1daeSBarry Smith 4355c6c1daeSBarry Smith Input Parameters: 4365c6c1daeSBarry Smith + draw - the original window 4375c6c1daeSBarry Smith - sdraw - the singleton window 4385c6c1daeSBarry Smith 4395c6c1daeSBarry Smith Level: advanced 4405c6c1daeSBarry Smith 4415c6c1daeSBarry Smith .seealso: PetscDrawGetSingleton(), PetscViewerGetSingleton(), PetscViewerRestoreSingleton() 4425c6c1daeSBarry Smith 4435c6c1daeSBarry Smith @*/ 4445c6c1daeSBarry Smith PetscErrorCode PetscDrawRestoreSingleton(PetscDraw draw,PetscDraw *sdraw) 4455c6c1daeSBarry Smith { 4465c6c1daeSBarry Smith PetscMPIInt size; 4475c6c1daeSBarry Smith 4485c6c1daeSBarry Smith PetscFunctionBegin; 4495c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 4505c6c1daeSBarry Smith PetscValidPointer(sdraw,2); 4515c6c1daeSBarry Smith PetscValidHeaderSpecific(*sdraw,PETSC_DRAW_CLASSID,2); 4525c6c1daeSBarry Smith 453*9566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)draw),&size)); 454387ef4f7SLisandro Dalcin if (size == 1) { 455387ef4f7SLisandro Dalcin if (draw == *sdraw) { 456*9566063dSJacob Faibussowitsch PetscCall(PetscObjectDereference((PetscObject)draw)); 457387ef4f7SLisandro Dalcin *sdraw = NULL; 458387ef4f7SLisandro Dalcin } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Cannot restore singleton, it is not the parent draw"); 459387ef4f7SLisandro Dalcin } else { 4605c6c1daeSBarry Smith if (draw->ops->restoresingleton) { 461*9566063dSJacob Faibussowitsch PetscCall((*draw->ops->restoresingleton)(draw,sdraw)); 46298921bdaSJacob Faibussowitsch } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot restore singleton for this type %s of draw object",((PetscObject)draw)->type_name); 4635c6c1daeSBarry Smith } 4645c6c1daeSBarry Smith PetscFunctionReturn(0); 4655c6c1daeSBarry Smith } 466