1 2 /* 3 Provides the calling sequences for all the basic PetscDraw routines. 4 */ 5 #include <petsc/private/drawimpl.h> /*I "petscdraw.h" I*/ 6 #include <petscviewer.h> 7 8 PetscClassId PETSC_DRAW_CLASSID; 9 10 static PetscBool PetscDrawPackageInitialized = PETSC_FALSE; 11 #undef __FUNCT__ 12 #define __FUNCT__ "PetscDrawFinalizePackage" 13 /*@C 14 PetscDrawFinalizePackage - This function destroys everything in the Petsc interface to the Draw package. It is 15 called from PetscFinalize(). 16 17 Level: developer 18 19 .keywords: Petsc, destroy, package, mathematica 20 .seealso: PetscFinalize() 21 @*/ 22 PetscErrorCode PetscDrawFinalizePackage(void) 23 { 24 PetscErrorCode ierr; 25 26 PetscFunctionBegin; 27 ierr = PetscFunctionListDestroy(&PetscDrawList);CHKERRQ(ierr); 28 PetscDrawPackageInitialized = PETSC_FALSE; 29 PetscDrawRegisterAllCalled = PETSC_FALSE; 30 PetscFunctionReturn(0); 31 } 32 33 #undef __FUNCT__ 34 #define __FUNCT__ "PetscDrawInitializePackage" 35 /*@C 36 PetscInitializeDrawPackage - This function initializes everything in the PetscDraw package. It is called 37 from PetscDLLibraryRegister() when using dynamic libraries, and on the call to PetscInitialize() 38 when using static libraries. 39 40 Level: developer 41 42 .keywords: Petsc, initialize, package 43 .seealso: PetscInitialize() 44 @*/ 45 PetscErrorCode PetscDrawInitializePackage(void) 46 { 47 char logList[256]; 48 char *className; 49 PetscBool opt; 50 PetscErrorCode ierr; 51 52 PetscFunctionBegin; 53 if (PetscDrawPackageInitialized) PetscFunctionReturn(0); 54 PetscDrawPackageInitialized = PETSC_TRUE; 55 /* Register Classes */ 56 ierr = PetscClassIdRegister("Draw",&PETSC_DRAW_CLASSID);CHKERRQ(ierr); 57 ierr = PetscClassIdRegister("Axis",&PETSC_DRAWAXIS_CLASSID);CHKERRQ(ierr); 58 ierr = PetscClassIdRegister("Line Graph",&PETSC_DRAWLG_CLASSID);CHKERRQ(ierr); 59 ierr = PetscClassIdRegister("Histogram",&PETSC_DRAWHG_CLASSID);CHKERRQ(ierr); 60 ierr = PetscClassIdRegister("Bar Grap",&PETSC_DRAWBAR_CLASSID);CHKERRQ(ierr); 61 ierr = PetscClassIdRegister("Scatter Plot",&PETSC_DRAWSP_CLASSID);CHKERRQ(ierr); 62 /* Register Constructors */ 63 ierr = PetscDrawRegisterAll();CHKERRQ(ierr); 64 /* Process info exclusions */ 65 ierr = PetscOptionsGetString(NULL,NULL, "-info_exclude", logList, 256, &opt);CHKERRQ(ierr); 66 if (opt) { 67 ierr = PetscStrstr(logList, "draw", &className);CHKERRQ(ierr); 68 if (className) { 69 ierr = PetscInfoDeactivateClass(0);CHKERRQ(ierr); 70 } 71 } 72 /* Process summary exclusions */ 73 ierr = PetscOptionsGetString(NULL,NULL, "-log_summary_exclude", logList, 256, &opt);CHKERRQ(ierr); 74 if (opt) { 75 ierr = PetscStrstr(logList, "draw", &className);CHKERRQ(ierr); 76 if (className) { 77 ierr = PetscLogEventDeactivateClass(0);CHKERRQ(ierr); 78 } 79 } 80 ierr = PetscRegisterFinalize(PetscDrawFinalizePackage);CHKERRQ(ierr); 81 PetscFunctionReturn(0); 82 } 83 84 #undef __FUNCT__ 85 #define __FUNCT__ "PetscDrawResizeWindow" 86 /*@ 87 PetscDrawResizeWindow - Allows one to resize a window from a program. 88 89 Collective on PetscDraw 90 91 Input Parameter: 92 + draw - the window 93 - w,h - the new width and height of the window 94 95 Level: intermediate 96 97 .seealso: PetscDrawCheckResizedWindow() 98 @*/ 99 PetscErrorCode PetscDrawResizeWindow(PetscDraw draw,int w,int h) 100 { 101 PetscErrorCode ierr; 102 103 PetscFunctionBegin; 104 if (draw->ops->resizewindow) { 105 ierr = (*draw->ops->resizewindow)(draw,w,h);CHKERRQ(ierr); 106 } 107 PetscFunctionReturn(0); 108 } 109 110 #undef __FUNCT__ 111 #define __FUNCT__ "PetscDrawCheckResizedWindow" 112 /*@ 113 PetscDrawCheckResizedWindow - Checks if the user has resized the window. 114 115 Collective on PetscDraw 116 117 Input Parameter: 118 . draw - the window 119 120 Level: advanced 121 122 .seealso: PetscDrawResizeWindow() 123 124 @*/ 125 PetscErrorCode PetscDrawCheckResizedWindow(PetscDraw draw) 126 { 127 PetscErrorCode ierr; 128 129 PetscFunctionBegin; 130 if (draw->ops->checkresizedwindow) { 131 ierr = (*draw->ops->checkresizedwindow)(draw);CHKERRQ(ierr); 132 } 133 PetscFunctionReturn(0); 134 } 135 136 #undef __FUNCT__ 137 #define __FUNCT__ "PetscDrawGetTitle" 138 /*@C 139 PetscDrawGetTitle - Gets pointer to title of a PetscDraw context. 140 141 Not collective 142 143 Input Parameter: 144 . draw - the graphics context 145 146 Output Parameter: 147 . title - the title 148 149 Level: intermediate 150 151 .seealso: PetscDrawSetTitle() 152 @*/ 153 PetscErrorCode PetscDrawGetTitle(PetscDraw draw,char **title) 154 { 155 PetscFunctionBegin; 156 PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 157 PetscValidPointer(title,2); 158 *title = draw->title; 159 PetscFunctionReturn(0); 160 } 161 162 #undef __FUNCT__ 163 #define __FUNCT__ "PetscDrawSetTitle" 164 /*@C 165 PetscDrawSetTitle - Sets the title of a PetscDraw context. 166 167 Not collective (any processor or all may call this) 168 169 Input Parameters: 170 + draw - the graphics context 171 - title - the title 172 173 Level: intermediate 174 175 Note: The title is positioned in the windowing system title bar for the window. Hence it will not be saved with -draw_save 176 in the image. 177 178 A copy of the string is made, so you may destroy the 179 title string after calling this routine. 180 181 You can use PetscDrawAxisSetLabels() to indicate a title within the window 182 183 .seealso: PetscDrawGetTitle(), PetscDrawAppendTitle() 184 @*/ 185 PetscErrorCode PetscDrawSetTitle(PetscDraw draw,const char title[]) 186 { 187 PetscErrorCode ierr; 188 189 PetscFunctionBegin; 190 PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 191 PetscValidCharPointer(title,2); 192 ierr = PetscFree(draw->title);CHKERRQ(ierr); 193 ierr = PetscStrallocpy(title,&draw->title);CHKERRQ(ierr); 194 if (draw->ops->settitle) { 195 ierr = (*draw->ops->settitle)(draw,title);CHKERRQ(ierr); 196 } 197 PetscFunctionReturn(0); 198 } 199 200 #undef __FUNCT__ 201 #define __FUNCT__ "PetscDrawAppendTitle" 202 /*@C 203 PetscDrawAppendTitle - Appends to the title of a PetscDraw context. 204 205 Not collective (any processor or all can call this) 206 207 Input Parameters: 208 + draw - the graphics context 209 - title - the title 210 211 Note: 212 A copy of the string is made, so you may destroy the 213 title string after calling this routine. 214 215 Level: advanced 216 217 .seealso: PetscDrawSetTitle(), PetscDrawGetTitle() 218 @*/ 219 PetscErrorCode PetscDrawAppendTitle(PetscDraw draw,const char title[]) 220 { 221 PetscErrorCode ierr; 222 size_t len1,len2,len; 223 char *newtitle; 224 225 PetscFunctionBegin; 226 PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 227 if (!title) PetscFunctionReturn(0); 228 229 if (draw->title) { 230 ierr = PetscStrlen(title,&len1);CHKERRQ(ierr); 231 ierr = PetscStrlen(draw->title,&len2);CHKERRQ(ierr); 232 len = len1 + len2; 233 ierr = PetscMalloc1(len + 1,&newtitle);CHKERRQ(ierr); 234 ierr = PetscStrcpy(newtitle,draw->title);CHKERRQ(ierr); 235 ierr = PetscStrcat(newtitle,title);CHKERRQ(ierr); 236 ierr = PetscFree(draw->title);CHKERRQ(ierr); 237 draw->title = newtitle; 238 } else { 239 ierr = PetscStrallocpy(title,&draw->title);CHKERRQ(ierr); 240 } 241 if (draw->ops->settitle) { 242 ierr = (*draw->ops->settitle)(draw,draw->title);CHKERRQ(ierr); 243 } 244 PetscFunctionReturn(0); 245 } 246 247 #undef __FUNCT__ 248 #define __FUNCT__ "PetscDrawDestroy_Private" 249 static PetscErrorCode PetscDrawDestroy_Private(PetscDraw draw) 250 { 251 PetscBool match; 252 PetscErrorCode ierr; 253 254 PetscFunctionBegin; 255 ierr = PetscObjectTypeCompare((PetscObject)draw,PETSC_DRAW_X,&match);CHKERRQ(ierr); 256 if (match) { 257 #if defined(PETSC_HAVE_POPEN) 258 PetscMPIInt rank; 259 ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)draw),&rank);CHKERRQ(ierr); 260 if (!rank && draw->savefilename && draw->savefilemovie) { 261 char command[PETSC_MAX_PATH_LEN]; 262 const char *fname = draw->savefilename; 263 const char *ext = draw->savefilenameext; 264 FILE *fd; 265 ierr = PetscSNPrintf(command,PETSC_MAX_PATH_LEN,"ffmpeg -i %s/%s_%%d%s %s.m4v",fname,fname,ext,fname);CHKERRQ(ierr); 266 ierr = PetscPOpen(PETSC_COMM_SELF,NULL,command,"r",&fd);CHKERRQ(ierr); 267 ierr = PetscPClose(PETSC_COMM_SELF,fd,NULL);CHKERRQ(ierr); 268 } 269 ierr = PetscBarrier((PetscObject)draw);CHKERRQ(ierr); 270 #endif 271 if (draw->savefinalfilename) { 272 ierr = PetscDrawSetSave(draw,draw->savefinalfilename,PETSC_FALSE);CHKERRQ(ierr); 273 draw->savefilecount = 0; 274 ierr = PetscDrawSave(draw);CHKERRQ(ierr); 275 } 276 ierr = PetscBarrier((PetscObject)draw);CHKERRQ(ierr); 277 } 278 PetscFunctionReturn(0); 279 280 } 281 282 #undef __FUNCT__ 283 #define __FUNCT__ "PetscDrawDestroy" 284 /*@ 285 PetscDrawDestroy - Deletes a draw context. 286 287 Collective on PetscDraw 288 289 Input Parameters: 290 . draw - the drawing context 291 292 Level: beginner 293 294 .seealso: PetscDrawCreate() 295 296 @*/ 297 PetscErrorCode PetscDrawDestroy(PetscDraw *draw) 298 { 299 PetscErrorCode ierr; 300 301 PetscFunctionBegin; 302 if (!*draw) PetscFunctionReturn(0); 303 PetscValidHeaderSpecific(*draw,PETSC_DRAW_CLASSID,1); 304 if (--((PetscObject)(*draw))->refct > 0) PetscFunctionReturn(0); 305 306 if ((*draw)->pause == -2) { 307 (*draw)->pause = -1; 308 ierr = PetscDrawPause(*draw);CHKERRQ(ierr); 309 } 310 311 /* if memory was published then destroy it */ 312 ierr = PetscObjectSAWsViewOff((PetscObject)*draw);CHKERRQ(ierr); 313 314 ierr = PetscDrawDestroy_Private(*draw);CHKERRQ(ierr); 315 316 if ((*draw)->ops->destroy) { 317 ierr = (*(*draw)->ops->destroy)(*draw);CHKERRQ(ierr); 318 } 319 ierr = PetscDrawDestroy(&(*draw)->popup);CHKERRQ(ierr); 320 ierr = PetscFree((*draw)->title);CHKERRQ(ierr); 321 ierr = PetscFree((*draw)->display);CHKERRQ(ierr); 322 ierr = PetscFree((*draw)->savefilename);CHKERRQ(ierr); 323 ierr = PetscFree((*draw)->savefilenameext);CHKERRQ(ierr); 324 ierr = PetscFree((*draw)->savefinalfilename);CHKERRQ(ierr); 325 ierr = PetscHeaderDestroy(draw);CHKERRQ(ierr); 326 PetscFunctionReturn(0); 327 } 328 329 #undef __FUNCT__ 330 #define __FUNCT__ "PetscDrawGetPopup" 331 /*@ 332 PetscDrawGetPopup - Creates a popup window associated with a PetscDraw window. 333 334 Collective on PetscDraw 335 336 Input Parameter: 337 . draw - the original window 338 339 Output Parameter: 340 . popup - the new popup window 341 342 Level: advanced 343 344 @*/ 345 PetscErrorCode PetscDrawGetPopup(PetscDraw draw,PetscDraw *popup) 346 { 347 PetscErrorCode ierr; 348 349 PetscFunctionBegin; 350 PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 351 PetscValidPointer(popup,2); 352 353 if (draw->popup) *popup = draw->popup; 354 else if (draw->ops->getpopup) { 355 ierr = (*draw->ops->getpopup)(draw,popup);CHKERRQ(ierr); 356 if (*popup) { 357 ierr = PetscObjectSetOptionsPrefix((PetscObject)*popup,"popup_");CHKERRQ(ierr); 358 (*popup)->pause = 0.0; 359 ierr = PetscDrawSetFromOptions(*popup);CHKERRQ(ierr); 360 } 361 } else *popup = NULL; 362 PetscFunctionReturn(0); 363 } 364 365 #undef __FUNCT__ 366 #define __FUNCT__ "PetscDrawDestroy_Null" 367 PetscErrorCode PetscDrawDestroy_Null(PetscDraw draw) 368 { 369 PetscFunctionBegin; 370 PetscFunctionReturn(0); 371 } 372 373 #undef __FUNCT__ 374 #define __FUNCT__ "PetscDrawOpenNull" 375 /* 376 PetscDrawOpenNull - Opens a null drawing context. All draw commands to 377 it are ignored. 378 379 Output Parameter: 380 . win - the drawing context 381 382 Level: advanced 383 384 */ 385 PetscErrorCode PetscDrawOpenNull(MPI_Comm comm,PetscDraw *win) 386 { 387 PetscErrorCode ierr; 388 389 PetscFunctionBegin; 390 ierr = PetscDrawCreate(comm,NULL,NULL,0,0,1,1,win);CHKERRQ(ierr); 391 ierr = PetscDrawSetType(*win,PETSC_DRAW_NULL);CHKERRQ(ierr); 392 PetscFunctionReturn(0); 393 } 394 395 #undef __FUNCT__ 396 #define __FUNCT__ "PetscDrawSetDisplay" 397 /*@ 398 PetscDrawSetDisplay - Sets the display where a PetscDraw object will be displayed 399 400 Input Parameter: 401 + draw - the drawing context 402 - display - the X windows display 403 404 Level: advanced 405 406 @*/ 407 PetscErrorCode PetscDrawSetDisplay(PetscDraw draw,const char display[]) 408 { 409 PetscErrorCode ierr; 410 411 PetscFunctionBegin; 412 ierr = PetscFree(draw->display);CHKERRQ(ierr); 413 ierr = PetscStrallocpy(display,&draw->display);CHKERRQ(ierr); 414 PetscFunctionReturn(0); 415 } 416 417 #undef __FUNCT__ 418 #define __FUNCT__ "PetscDrawCreate_Null" 419 /* 420 PetscDrawCreate_Null - Opens a null drawing context. All draw commands to 421 it are ignored. 422 423 Input Parameter: 424 . win - the drawing context 425 */ 426 PETSC_EXTERN PetscErrorCode PetscDrawCreate_Null(PetscDraw draw) 427 { 428 PetscErrorCode ierr; 429 430 PetscFunctionBegin; 431 ierr = PetscMemzero(draw->ops,sizeof(struct _PetscDrawOps));CHKERRQ(ierr); 432 draw->data = NULL; 433 draw->ops->destroy = PetscDrawDestroy_Null; 434 draw->ops->view = NULL; 435 436 draw->pause = 0.0; 437 draw->coor_xl = 0.0; draw->coor_xr = 1.0; 438 draw->coor_yl = 0.0; draw->coor_yr = 1.0; 439 draw->port_xl = 0.0; draw->port_xr = 1.0; 440 draw->port_yl = 0.0; draw->port_yr = 1.0; 441 draw->popup = NULL; 442 PetscFunctionReturn(0); 443 } 444 445 #undef __FUNCT__ 446 #define __FUNCT__ "PetscDrawGetSingleton" 447 /*@C 448 PetscDrawGetSingleton - Gain access to a PetscDraw object as if it were owned 449 by the one process. 450 451 Collective on PetscDraw 452 453 Input Parameter: 454 . draw - the original window 455 456 Output Parameter: 457 . sdraw - the singleton window 458 459 Level: advanced 460 461 .seealso: PetscDrawRestoreSingleton(), PetscViewerGetSingleton(), PetscViewerRestoreSingleton() 462 463 @*/ 464 PetscErrorCode PetscDrawGetSingleton(PetscDraw draw,PetscDraw *sdraw) 465 { 466 PetscErrorCode ierr; 467 PetscMPIInt size; 468 469 PetscFunctionBegin; 470 PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 471 PetscValidPointer(sdraw,2); 472 473 ierr = MPI_Comm_size(PetscObjectComm((PetscObject)draw),&size);CHKERRQ(ierr); 474 if (size == 1) *sdraw = draw; 475 else { 476 if (draw->ops->getsingleton) { 477 ierr = (*draw->ops->getsingleton)(draw,sdraw);CHKERRQ(ierr); 478 } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot get singleton for this type %s of draw object",((PetscObject)draw)->type_name); 479 } 480 PetscFunctionReturn(0); 481 } 482 483 #undef __FUNCT__ 484 #define __FUNCT__ "PetscDrawRestoreSingleton" 485 /*@C 486 PetscDrawRestoreSingleton - Remove access to a PetscDraw object as if it were owned 487 by the one process. 488 489 Collective on PetscDraw 490 491 Input Parameters: 492 + draw - the original window 493 - sdraw - the singleton window 494 495 Level: advanced 496 497 .seealso: PetscDrawGetSingleton(), PetscViewerGetSingleton(), PetscViewerRestoreSingleton() 498 499 @*/ 500 PetscErrorCode PetscDrawRestoreSingleton(PetscDraw draw,PetscDraw *sdraw) 501 { 502 PetscErrorCode ierr; 503 PetscMPIInt size; 504 505 PetscFunctionBegin; 506 PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 507 PetscValidPointer(sdraw,2); 508 PetscValidHeaderSpecific(*sdraw,PETSC_DRAW_CLASSID,2); 509 510 ierr = MPI_Comm_size(PetscObjectComm((PetscObject)draw),&size);CHKERRQ(ierr); 511 if (size != 1) { 512 if (draw->ops->restoresingleton) { 513 ierr = (*draw->ops->restoresingleton)(draw,sdraw);CHKERRQ(ierr); 514 } else SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot restore singleton for this type %s of draw object",((PetscObject)draw)->type_name); 515 } 516 PetscFunctionReturn(0); 517 } 518