1 2 /* 3 Provides the registration process for PETSc PetscDraw routines 4 */ 5 #include <petsc/private/drawimpl.h> /*I "petscdraw.h" I*/ 6 #include <petscviewer.h> /*I "petscviewer.h" I*/ 7 #if defined(PETSC_HAVE_SAWS) 8 #include <petscviewersaws.h> 9 #endif 10 11 /* 12 Contains the list of registered PetscDraw routines 13 */ 14 PetscFunctionList PetscDrawList = NULL; 15 16 /*@C 17 PetscDrawView - Prints the PetscDraw data structure. 18 19 Collective on PetscDraw 20 21 Input Parameters: 22 + indraw - the PetscDraw context 23 - viewer - visualization context 24 25 See PetscDrawSetFromOptions() for options database keys 26 27 Note: 28 The available visualization contexts include 29 + PETSC_VIEWER_STDOUT_SELF - standard output (default) 30 - PETSC_VIEWER_STDOUT_WORLD - synchronized standard 31 output where only the first processor opens 32 the file. All other processors send their 33 data to the first processor to print. 34 35 The user can open an alternative visualization context with 36 PetscViewerASCIIOpen() - output to a specified file. 37 38 Level: beginner 39 40 .seealso: PCView(), PetscViewerASCIIOpen() 41 @*/ 42 PetscErrorCode PetscDrawView(PetscDraw indraw,PetscViewer viewer) 43 { 44 PetscErrorCode ierr; 45 PetscBool isdraw; 46 #if defined(PETSC_HAVE_SAWS) 47 PetscBool issaws; 48 #endif 49 50 PetscFunctionBegin; 51 PetscValidHeaderSpecific(indraw,PETSC_DRAW_CLASSID,1); 52 if (!viewer) { 53 ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)indraw),&viewer);CHKERRQ(ierr); 54 } 55 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 56 PetscCheckSameComm(indraw,1,viewer,2); 57 58 ierr = PetscObjectPrintClassNamePrefixType((PetscObject)indraw,viewer);CHKERRQ(ierr); 59 ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr); 60 #if defined(PETSC_HAVE_SAWS) 61 ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERSAWS,&issaws);CHKERRQ(ierr); 62 #endif 63 if (isdraw) { 64 PetscDraw draw; 65 char str[36]; 66 PetscReal x,y,bottom,h; 67 68 ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr); 69 ierr = PetscDrawGetCurrentPoint(draw,&x,&y);CHKERRQ(ierr); 70 ierr = PetscStrncpy(str,"PetscDraw: ",sizeof(str));CHKERRQ(ierr); 71 ierr = PetscStrlcat(str,((PetscObject)indraw)->type_name,sizeof(str));CHKERRQ(ierr); 72 ierr = PetscDrawStringBoxed(draw,x,y,PETSC_DRAW_RED,PETSC_DRAW_BLACK,str,NULL,&h);CHKERRQ(ierr); 73 bottom = y - h; 74 ierr = PetscDrawPushCurrentPoint(draw,x,bottom);CHKERRQ(ierr); 75 #if defined(PETSC_HAVE_SAWS) 76 } else if (issaws) { 77 PetscMPIInt rank; 78 79 ierr = PetscObjectName((PetscObject)indraw);CHKERRQ(ierr); 80 ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); 81 if (!((PetscObject)indraw)->amsmem && !rank) { 82 ierr = PetscObjectViewSAWs((PetscObject)indraw,viewer);CHKERRQ(ierr); 83 } 84 #endif 85 } else if (indraw->ops->view) { 86 ierr = (*indraw->ops->view)(indraw,viewer);CHKERRQ(ierr); 87 } 88 PetscFunctionReturn(0); 89 } 90 91 /*@C 92 PetscDrawViewFromOptions - View from Options 93 94 Collective on PetscDraw 95 96 Input Parameters: 97 + A - the PetscDraw context 98 . obj - Optional object 99 - name - command line option 100 101 Level: intermediate 102 .seealso: PetscDraw, PetscDrawView, PetscObjectViewFromOptions(), PetscDrawCreate() 103 @*/ 104 PetscErrorCode PetscDrawViewFromOptions(PetscDraw A,PetscObject obj,const char name[]) 105 { 106 PetscErrorCode ierr; 107 108 PetscFunctionBegin; 109 PetscValidHeaderSpecific(A,PETSC_DRAW_CLASSID,1); 110 ierr = PetscObjectViewFromOptions((PetscObject)A,obj,name);CHKERRQ(ierr); 111 PetscFunctionReturn(0); 112 } 113 114 /*@C 115 PetscDrawCreate - Creates a graphics context. 116 117 Collective 118 119 Input Parameter: 120 + comm - MPI communicator 121 . display - X display when using X windows 122 . title - optional title added to top of window 123 . x,y - coordinates of lower left corner of window or PETSC_DECIDE 124 - w, h - width and height of window or PETSC_DECIDE or PETSC_DRAW_HALF_SIZE, PETSC_DRAW_FULL_SIZE, 125 or PETSC_DRAW_THIRD_SIZE or PETSC_DRAW_QUARTER_SIZE 126 127 Output Parameter: 128 . draw - location to put the PetscDraw context 129 130 Level: beginner 131 132 133 .seealso: PetscDrawSetType(), PetscDrawSetFromOptions(), PetscDrawDestroy(), PetscDrawSetType(), PetscDrawLGCreate(), PetscDrawSPCreate(), 134 PetscDrawViewPortsCreate(), PetscDrawViewPortsSet(), PetscDrawAxisCreate(), PetscDrawHGCreate(), PetscDrawBarCreate(), 135 PetscViewerDrawGetDraw(), PetscDrawSetFromOptions(), PetscDrawSetSave(), PetscDrawSetSaveMovie(), PetscDrawSetSaveFinalImage(), 136 PetscDrawOpenX(), PetscDrawOpenImage(), PetscDrawIsNull(), PetscDrawGetPopup(), PetscDrawCheckResizedWindow(), PetscDrawResizeWindow(), 137 PetscDrawGetWindowSize(), PetscDrawLine(), PetscDrawArrow(), PetscDrawLineSetWidth(), PetscDrawLineGetWidth(), PetscDrawMarker(), 138 PetscDrawPoint(), PetscDrawRectangle(), PetscDrawTriangle(), PetscDrawEllipse(), PetscDrawString(), PetscDrawStringCentered(), 139 PetscDrawStringBoxed(), PetscDrawStringBoxed(), PetscDrawStringVertical(), PetscDrawSetViewPort(), PetscDrawGetViewPort(), 140 PetscDrawSplitViewPort(), PetscDrawSetTitle(), PetscDrawAppendTitle(), PetscDrawGetTitle(), PetscDrawSetPause(), PetscDrawGetPause(), 141 PetscDrawPause(), PetscDrawSetDoubleBuffer(), PetscDrawClear(), PetscDrawFlush(), PetscDrawGetSingleton(), PetscDrawGetMouseButton(), 142 PetscDrawZoom(), PetscDrawGetBoundingBox() 143 144 @*/ 145 PetscErrorCode PetscDrawCreate(MPI_Comm comm,const char display[],const char title[],int x,int y,int w,int h,PetscDraw *indraw) 146 { 147 PetscDraw draw; 148 PetscErrorCode ierr; 149 PetscReal dpause = 0.0; 150 PetscBool flag; 151 152 PetscFunctionBegin; 153 ierr = PetscDrawInitializePackage();CHKERRQ(ierr); 154 *indraw = NULL; 155 ierr = PetscHeaderCreate(draw,PETSC_DRAW_CLASSID,"Draw","Graphics","Draw",comm,PetscDrawDestroy,PetscDrawView);CHKERRQ(ierr); 156 157 draw->data = NULL; 158 ierr = PetscStrallocpy(display,&draw->display);CHKERRQ(ierr); 159 ierr = PetscStrallocpy(title,&draw->title);CHKERRQ(ierr); 160 draw->x = x; 161 draw->y = y; 162 draw->w = w; 163 draw->h = h; 164 draw->pause = 0.0; 165 draw->coor_xl = 0.0; 166 draw->coor_xr = 1.0; 167 draw->coor_yl = 0.0; 168 draw->coor_yr = 1.0; 169 draw->port_xl = 0.0; 170 draw->port_xr = 1.0; 171 draw->port_yl = 0.0; 172 draw->port_yr = 1.0; 173 draw->popup = NULL; 174 175 ierr = PetscOptionsGetReal(NULL,NULL,"-draw_pause",&dpause,&flag);CHKERRQ(ierr); 176 if (flag) draw->pause = dpause; 177 178 draw->savefilename = NULL; 179 draw->saveimageext = NULL; 180 draw->savemovieext = NULL; 181 draw->savefilecount = 0; 182 draw->savesinglefile = PETSC_FALSE; 183 draw->savemoviefps = PETSC_DECIDE; 184 185 ierr = PetscDrawSetCurrentPoint(draw,.5,.9);CHKERRQ(ierr); 186 187 draw->boundbox_xl = .5; 188 draw->boundbox_xr = .5; 189 draw->boundbox_yl = .9; 190 draw->boundbox_yr = .9; 191 192 *indraw = draw; 193 PetscFunctionReturn(0); 194 } 195 196 /*@C 197 PetscDrawSetType - Builds graphics object for a particular implementation 198 199 Collective on PetscDraw 200 201 Input Parameter: 202 + draw - the graphics context 203 - type - for example, PETSC_DRAW_X 204 205 Options Database Command: 206 . -draw_type <type> - Sets the type; use -help for a list of available methods (for instance, x) 207 208 See PetscDrawSetFromOptions() for additional options database keys 209 210 Level: intermediate 211 212 Notes: 213 See "petsc/include/petscdraw.h" for available methods (for instance, 214 PETSC_DRAW_X, PETSC_DRAW_TIKZ or PETSC_DRAW_IMAGE) 215 216 .seealso: PetscDrawSetFromOptions(), PetscDrawCreate(), PetscDrawDestroy(), PetscDrawType 217 @*/ 218 PetscErrorCode PetscDrawSetType(PetscDraw draw,PetscDrawType type) 219 { 220 PetscErrorCode ierr,(*r)(PetscDraw); 221 PetscBool match; 222 PetscBool flg=PETSC_FALSE; 223 224 PetscFunctionBegin; 225 PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 226 PetscValidCharPointer(type,2); 227 228 ierr = PetscObjectTypeCompare((PetscObject)draw,type,&match);CHKERRQ(ierr); 229 if (match) PetscFunctionReturn(0); 230 231 /* User requests no graphics */ 232 ierr = PetscOptionsHasName(((PetscObject)draw)->options,NULL,"-nox",&flg);CHKERRQ(ierr); 233 234 /* 235 This is not ideal, but it allows codes to continue to run if X graphics 236 was requested but is not installed on this machine. Mostly this is for 237 testing. 238 */ 239 #if !defined(PETSC_HAVE_X) 240 if (!flg) { 241 ierr = PetscStrcmp(type,PETSC_DRAW_X,&match);CHKERRQ(ierr); 242 if (match) { 243 PetscBool dontwarn = PETSC_TRUE; 244 flg = PETSC_TRUE; 245 ierr = PetscOptionsHasName(NULL,NULL,"-nox_warning",&dontwarn);CHKERRQ(ierr); 246 if (!dontwarn) (*PetscErrorPrintf)("PETSc installed without X windows on this machine\nproceeding without graphics\n"); 247 } 248 } 249 #endif 250 if (flg) { 251 ierr = PetscStrcmp(type,"tikz",&flg);CHKERRQ(ierr); 252 if (!flg) type = PETSC_DRAW_NULL; 253 } 254 255 ierr = PetscStrcmp(type,PETSC_DRAW_NULL,&match);CHKERRQ(ierr); 256 if (match) { 257 ierr = PetscOptionsHasName(NULL,NULL,"-draw_double_buffer",NULL);CHKERRQ(ierr); 258 ierr = PetscOptionsHasName(NULL,NULL,"-draw_virtual",NULL);CHKERRQ(ierr); 259 ierr = PetscOptionsHasName(NULL,NULL,"-draw_fast",NULL);CHKERRQ(ierr); 260 ierr = PetscOptionsHasName(NULL,NULL,"-draw_ports",NULL);CHKERRQ(ierr); 261 ierr = PetscOptionsHasName(NULL,NULL,"-draw_coordinates",NULL);CHKERRQ(ierr); 262 } 263 264 ierr = PetscFunctionListFind(PetscDrawList,type,&r);CHKERRQ(ierr); 265 if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown PetscDraw type given: %s",type); 266 if (draw->ops->destroy) {ierr = (*draw->ops->destroy)(draw);CHKERRQ(ierr);} 267 ierr = PetscMemzero(draw->ops,sizeof(struct _PetscDrawOps));CHKERRQ(ierr); 268 ierr = PetscObjectChangeTypeName((PetscObject)draw,type);CHKERRQ(ierr); 269 ierr = (*r)(draw);CHKERRQ(ierr); 270 PetscFunctionReturn(0); 271 } 272 273 /*@C 274 PetscDrawGetType - Gets the PetscDraw type as a string from the PetscDraw object. 275 276 Not Collective 277 278 Input Parameter: 279 . draw - Krylov context 280 281 Output Parameters: 282 . name - name of PetscDraw method 283 284 Level: advanced 285 286 .seealso: PetscDrawSetType(), PetscDrawType 287 288 @*/ 289 PetscErrorCode PetscDrawGetType(PetscDraw draw,PetscDrawType *type) 290 { 291 PetscFunctionBegin; 292 PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 293 PetscValidPointer(type,2); 294 *type = ((PetscObject)draw)->type_name; 295 PetscFunctionReturn(0); 296 } 297 298 /*@C 299 PetscDrawRegister - Adds a method to the graphics package. 300 301 Not Collective 302 303 Input Parameters: 304 + name_solver - name of a new user-defined graphics class 305 - routine_create - routine to create method context 306 307 Level: developer 308 309 Notes: 310 PetscDrawRegister() may be called multiple times to add several user-defined graphics classes 311 312 Sample usage: 313 .vb 314 PetscDrawRegister("my_draw_type", MyDrawCreate); 315 .ve 316 317 Then, your specific graphics package can be chosen with the procedural interface via 318 $ PetscDrawSetType(ksp,"my_draw_type") 319 or at runtime via the option 320 $ -draw_type my_draw_type 321 322 323 .seealso: PetscDrawRegisterAll(), PetscDrawRegisterDestroy(), PetscDrawType, PetscDrawSetType() 324 @*/ 325 PetscErrorCode PetscDrawRegister(const char *sname,PetscErrorCode (*function)(PetscDraw)) 326 { 327 PetscErrorCode ierr; 328 329 PetscFunctionBegin; 330 ierr = PetscDrawInitializePackage();CHKERRQ(ierr); 331 ierr = PetscFunctionListAdd(&PetscDrawList,sname,function);CHKERRQ(ierr); 332 PetscFunctionReturn(0); 333 } 334 335 /*@C 336 PetscDrawSetOptionsPrefix - Sets the prefix used for searching for all 337 PetscDraw options in the database. 338 339 Logically Collective on PetscDraw 340 341 Input Parameter: 342 + draw - the draw context 343 - prefix - the prefix to prepend to all option names 344 345 Level: advanced 346 347 .seealso: PetscDrawSetFromOptions(), PetscDrawCreate() 348 @*/ 349 PetscErrorCode PetscDrawSetOptionsPrefix(PetscDraw draw,const char prefix[]) 350 { 351 PetscErrorCode ierr; 352 353 PetscFunctionBegin; 354 PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 355 ierr = PetscObjectSetOptionsPrefix((PetscObject)draw,prefix);CHKERRQ(ierr); 356 PetscFunctionReturn(0); 357 } 358 359 /*@ 360 PetscDrawSetFromOptions - Sets the graphics type from the options database. 361 Defaults to a PETSc X windows graphics. 362 363 Collective on PetscDraw 364 365 Input Parameter: 366 . draw - the graphics context 367 368 Options Database Keys: 369 + -nox - do not use X graphics (ignore graphics calls, but run program correctly) 370 . -nox_warning - when X windows support is not installed this prevents the warning message from being printed 371 . -draw_pause <pause amount> -- -1 indicates wait for mouse input, -2 indicates pause when window is to be destroyed 372 . -draw_marker_type - <x,point> 373 . -draw_save [optional filename] - (X windows only) saves each image before it is cleared to a file 374 . -draw_save_final_image [optional filename] - (X windows only) saves the final image displayed in a window 375 . -draw_save_movie - converts image files to a movie at the end of the run. See PetscDrawSetSave() 376 . -draw_save_single_file - saves each new image in the same file, normally each new image is saved in a new file with 'filename/filename_%d.ext' 377 . -draw_save_on_clear - saves an image on each clear, mainly for debugging 378 - -draw_save_on_flush - saves an image on each flush, mainly for debugging 379 380 Level: intermediate 381 382 Notes: 383 Must be called after PetscDrawCreate() before the PetscDraw is used. 384 385 386 .seealso: PetscDrawCreate(), PetscDrawSetType(), PetscDrawSetSave(), PetscDrawSetSaveFinalImage(), PetscDrawPause(), PetscDrawSetPause() 387 388 @*/ 389 PetscErrorCode PetscDrawSetFromOptions(PetscDraw draw) 390 { 391 PetscErrorCode ierr; 392 PetscBool flg,nox; 393 char vtype[256]; 394 const char *def; 395 #if !defined(PETSC_USE_WINDOWS_GRAPHICS) && !defined(PETSC_HAVE_X) 396 PetscBool warn; 397 #endif 398 399 PetscFunctionBegin; 400 PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 401 402 ierr = PetscDrawRegisterAll();CHKERRQ(ierr); 403 404 if (((PetscObject)draw)->type_name) def = ((PetscObject)draw)->type_name; 405 else { 406 ierr = PetscOptionsHasName(((PetscObject)draw)->options,NULL,"-nox",&nox);CHKERRQ(ierr); 407 def = PETSC_DRAW_NULL; 408 #if defined(PETSC_USE_WINDOWS_GRAPHICS) 409 if (!nox) def = PETSC_DRAW_WIN32; 410 #elif defined(PETSC_HAVE_X) 411 if (!nox) def = PETSC_DRAW_X; 412 #else 413 ierr = PetscOptionsHasName(NULL,NULL,"-nox_warning",&warn);CHKERRQ(ierr); 414 if (!nox && !warn) (*PetscErrorPrintf)("PETSc installed without X windows or Microsoft Graphics on this machine\nproceeding without graphics\n"); 415 #endif 416 } 417 ierr = PetscObjectOptionsBegin((PetscObject)draw);CHKERRQ(ierr); 418 ierr = PetscOptionsFList("-draw_type","Type of graphical output","PetscDrawSetType",PetscDrawList,def,vtype,256,&flg);CHKERRQ(ierr); 419 if (flg) { 420 ierr = PetscDrawSetType(draw,vtype);CHKERRQ(ierr); 421 } else if (!((PetscObject)draw)->type_name) { 422 ierr = PetscDrawSetType(draw,def);CHKERRQ(ierr); 423 } 424 ierr = PetscOptionsName("-nox","Run without graphics","None",&nox);CHKERRQ(ierr); 425 { 426 char filename[PETSC_MAX_PATH_LEN]; 427 char movieext[32]; 428 PetscBool image,movie; 429 ierr = PetscSNPrintf(filename,sizeof(filename),"%s%s",draw->savefilename?draw->savefilename:"",draw->saveimageext?draw->saveimageext:"");CHKERRQ(ierr); 430 ierr = PetscSNPrintf(movieext,sizeof(movieext),"%s",draw->savemovieext?draw->savemovieext:"");CHKERRQ(ierr); 431 ierr = PetscOptionsString("-draw_save","Save graphics to image file","PetscDrawSetSave",filename,filename,sizeof(filename),&image);CHKERRQ(ierr); 432 ierr = PetscOptionsString("-draw_save_movie","Make a movie from saved images","PetscDrawSetSaveMovie",movieext,movieext,sizeof(movieext),&movie);CHKERRQ(ierr); 433 ierr = PetscOptionsInt("-draw_save_movie_fps","Set frames per second in saved movie",PETSC_FUNCTION_NAME,draw->savemoviefps,&draw->savemoviefps,NULL);CHKERRQ(ierr); 434 ierr = PetscOptionsBool("-draw_save_single_file","Each new image replaces previous image in file",PETSC_FUNCTION_NAME,draw->savesinglefile,&draw->savesinglefile,NULL);CHKERRQ(ierr); 435 if (image) {ierr = PetscDrawSetSave(draw,filename);CHKERRQ(ierr);} 436 if (movie) {ierr = PetscDrawSetSaveMovie(draw,movieext);CHKERRQ(ierr);} 437 ierr = PetscOptionsString("-draw_save_final_image","Save final graphics to image file","PetscDrawSetSaveFinalImage",filename,filename,sizeof(filename),&image);CHKERRQ(ierr); 438 if (image) {ierr = PetscDrawSetSaveFinalImage(draw,filename);CHKERRQ(ierr);} 439 ierr = PetscOptionsBool("-draw_save_on_clear","Save graphics to file on each clear",PETSC_FUNCTION_NAME,draw->saveonclear,&draw->saveonclear,NULL);CHKERRQ(ierr); 440 ierr = PetscOptionsBool("-draw_save_on_flush","Save graphics to file on each flush",PETSC_FUNCTION_NAME,draw->saveonflush,&draw->saveonflush,NULL);CHKERRQ(ierr); 441 } 442 ierr = PetscOptionsReal("-draw_pause","Amount of time that program pauses after plots","PetscDrawSetPause",draw->pause,&draw->pause,NULL);CHKERRQ(ierr); 443 ierr = PetscOptionsEnum("-draw_marker_type","Type of marker to use on plots","PetscDrawSetMarkerType",PetscDrawMarkerTypes,(PetscEnum)draw->markertype,(PetscEnum *)&draw->markertype,NULL);CHKERRQ(ierr); 444 445 /* process any options handlers added with PetscObjectAddOptionsHandler() */ 446 ierr = PetscObjectProcessOptionsHandlers(PetscOptionsObject,(PetscObject)draw);CHKERRQ(ierr); 447 448 ierr = PetscDrawViewFromOptions(draw,NULL,"-draw_view");CHKERRQ(ierr); 449 ierr = PetscOptionsEnd();CHKERRQ(ierr); 450 PetscFunctionReturn(0); 451 } 452