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 238 draw->title = newtitle; 239 } else { 240 ierr = PetscStrallocpy(title,&draw->title);CHKERRQ(ierr); 241 } 242 if (draw->ops->settitle) { 243 ierr = (*draw->ops->settitle)(draw,draw->title);CHKERRQ(ierr); 244 } 245 PetscFunctionReturn(0); 246 } 247 248 #undef __FUNCT__ 249 #define __FUNCT__ "PetscDrawDestroy_Private" 250 static PetscErrorCode PetscDrawDestroy_Private(PetscDraw draw) 251 { 252 PetscBool match; 253 PetscErrorCode ierr; 254 255 PetscFunctionBegin; 256 ierr = PetscObjectTypeCompare((PetscObject)draw,PETSC_DRAW_X,&match);CHKERRQ(ierr); 257 if (match) { 258 #if defined(PETSC_HAVE_POPEN) 259 PetscMPIInt rank; 260 ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)draw),&rank);CHKERRQ(ierr); 261 if (!rank && draw->savefilename && draw->savefilemovie) { 262 char command[PETSC_MAX_PATH_LEN]; 263 const char *fname = draw->savefilename; 264 const char *ext = draw->savefilenameext; 265 FILE *fd; 266 ierr = PetscSNPrintf(command,PETSC_MAX_PATH_LEN,"ffmpeg -i %s/%s_%%d%s %s.m4v",fname,fname,ext,fname);CHKERRQ(ierr); 267 ierr = PetscPOpen(PETSC_COMM_SELF,NULL,command,"r",&fd);CHKERRQ(ierr); 268 ierr = PetscPClose(PETSC_COMM_SELF,fd,NULL);CHKERRQ(ierr); 269 } 270 ierr = PetscBarrier((PetscObject)draw);CHKERRQ(ierr); 271 #endif 272 if (draw->savefinalfilename) { 273 ierr = PetscDrawSetSave(draw,draw->savefinalfilename,PETSC_FALSE);CHKERRQ(ierr); 274 draw->savefilecount = 0; 275 ierr = PetscDrawSave(draw);CHKERRQ(ierr); 276 } 277 ierr = PetscBarrier((PetscObject)draw);CHKERRQ(ierr); 278 } 279 PetscFunctionReturn(0); 280 281 } 282 283 #undef __FUNCT__ 284 #define __FUNCT__ "PetscDrawDestroy" 285 /*@ 286 PetscDrawDestroy - Deletes a draw context. 287 288 Collective on PetscDraw 289 290 Input Parameters: 291 . draw - the drawing context 292 293 Level: beginner 294 295 .seealso: PetscDrawCreate() 296 297 @*/ 298 PetscErrorCode PetscDrawDestroy(PetscDraw *draw) 299 { 300 PetscErrorCode ierr; 301 302 PetscFunctionBegin; 303 if (!*draw) PetscFunctionReturn(0); 304 PetscValidHeaderSpecific(*draw,PETSC_DRAW_CLASSID,1); 305 if (--((PetscObject)(*draw))->refct > 0) PetscFunctionReturn(0); 306 307 if ((*draw)->pause == -2) { 308 (*draw)->pause = -1; 309 ierr = PetscDrawPause(*draw);CHKERRQ(ierr); 310 } 311 312 /* if memory was published then destroy it */ 313 ierr = PetscObjectSAWsViewOff((PetscObject)*draw);CHKERRQ(ierr); 314 315 ierr = PetscDrawDestroy_Private(*draw);CHKERRQ(ierr); 316 317 if ((*draw)->ops->destroy) { 318 ierr = (*(*draw)->ops->destroy)(*draw);CHKERRQ(ierr); 319 } 320 ierr = PetscDrawDestroy(&(*draw)->popup);CHKERRQ(ierr); 321 ierr = PetscFree((*draw)->title);CHKERRQ(ierr); 322 ierr = PetscFree((*draw)->display);CHKERRQ(ierr); 323 ierr = PetscFree((*draw)->savefilename);CHKERRQ(ierr); 324 ierr = PetscFree((*draw)->savefilenameext);CHKERRQ(ierr); 325 ierr = PetscFree((*draw)->savefinalfilename);CHKERRQ(ierr); 326 ierr = PetscHeaderDestroy(draw);CHKERRQ(ierr); 327 PetscFunctionReturn(0); 328 } 329 330 #undef __FUNCT__ 331 #define __FUNCT__ "PetscDrawGetPopup" 332 /*@ 333 PetscDrawGetPopup - Creates a popup window associated with a PetscDraw window. 334 335 Collective on PetscDraw 336 337 Input Parameter: 338 . draw - the original window 339 340 Output Parameter: 341 . popup - the new popup window 342 343 Level: advanced 344 345 @*/ 346 PetscErrorCode PetscDrawGetPopup(PetscDraw draw,PetscDraw *popup) 347 { 348 PetscErrorCode ierr; 349 350 PetscFunctionBegin; 351 PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 352 PetscValidPointer(popup,2); 353 354 if (draw->popup) *popup = draw->popup; 355 else if (draw->ops->getpopup) { 356 ierr = (*draw->ops->getpopup)(draw,popup);CHKERRQ(ierr); 357 if (*popup) { 358 ierr = PetscObjectSetOptionsPrefix((PetscObject)*popup,"popup_");CHKERRQ(ierr); 359 (*popup)->pause = 0.0; 360 ierr = PetscDrawSetFromOptions(*popup);CHKERRQ(ierr); 361 } 362 } else *popup = NULL; 363 PetscFunctionReturn(0); 364 } 365 366 #undef __FUNCT__ 367 #define __FUNCT__ "PetscDrawDestroy_Null" 368 PetscErrorCode PetscDrawDestroy_Null(PetscDraw draw) 369 { 370 PetscFunctionBegin; 371 PetscFunctionReturn(0); 372 } 373 374 #undef __FUNCT__ 375 #define __FUNCT__ "PetscDrawOpenNull" 376 /* 377 PetscDrawOpenNull - Opens a null drawing context. All draw commands to 378 it are ignored. 379 380 Output Parameter: 381 . win - the drawing context 382 383 Level: advanced 384 385 */ 386 PetscErrorCode PetscDrawOpenNull(MPI_Comm comm,PetscDraw *win) 387 { 388 PetscErrorCode ierr; 389 390 PetscFunctionBegin; 391 ierr = PetscDrawCreate(comm,NULL,NULL,0,0,1,1,win);CHKERRQ(ierr); 392 ierr = PetscDrawSetType(*win,PETSC_DRAW_NULL);CHKERRQ(ierr); 393 PetscFunctionReturn(0); 394 } 395 396 #undef __FUNCT__ 397 #define __FUNCT__ "PetscDrawSetDisplay" 398 /*@ 399 PetscDrawSetDisplay - Sets the display where a PetscDraw object will be displayed 400 401 Input Parameter: 402 + draw - the drawing context 403 - display - the X windows display 404 405 Level: advanced 406 407 @*/ 408 PetscErrorCode PetscDrawSetDisplay(PetscDraw draw,const char display[]) 409 { 410 PetscErrorCode ierr; 411 412 PetscFunctionBegin; 413 ierr = PetscFree(draw->display);CHKERRQ(ierr); 414 ierr = PetscStrallocpy(display,&draw->display);CHKERRQ(ierr); 415 PetscFunctionReturn(0); 416 } 417 418 #undef __FUNCT__ 419 #define __FUNCT__ "PetscDrawCreate_Null" 420 /* 421 PetscDrawCreate_Null - Opens a null drawing context. All draw commands to 422 it are ignored. 423 424 Input Parameter: 425 . win - the drawing context 426 */ 427 PETSC_EXTERN PetscErrorCode PetscDrawCreate_Null(PetscDraw draw) 428 { 429 PetscErrorCode ierr; 430 431 PetscFunctionBegin; 432 ierr = PetscMemzero(draw->ops,sizeof(struct _PetscDrawOps));CHKERRQ(ierr); 433 434 draw->ops->destroy = PetscDrawDestroy_Null; 435 draw->ops->view = 0; 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 = 0; 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 519 520 521 522 523 524 525