1 2 /* 3 Provides the registration process for PETSc PetscDraw routines 4 */ 5 #include <petsc-private/drawimpl.h> /*I "petscdraw.h" I*/ 6 7 /* 8 Contains the list of registered PetscDraw routines 9 */ 10 PetscFList PetscDrawList = 0; 11 12 #undef __FUNCT__ 13 #define __FUNCT__ "PetscDrawCreate" 14 /*@C 15 PetscDrawCreate - Creates a graphics context. 16 17 Collective on MPI_Comm 18 19 Input Parameter: 20 + comm - MPI communicator 21 . display - X display when using X windows 22 . title - optional title added to top of window 23 . x,y - coordinates of lower left corner of window or PETSC_DECIDE 24 - w, h - width and height of window or PETSC_DECIDE or PETSC_DRAW_HALF_SIZE, PETSC_DRAW_FULL_SIZE, 25 or PETSC_DRAW_THIRD_SIZE or PETSC_DRAW_QUARTER_SIZE 26 27 Output Parameter: 28 . draw - location to put the PetscDraw context 29 30 Level: beginner 31 32 Concepts: graphics^creating context 33 Concepts: drawing^creating context 34 35 .seealso: PetscDrawSetFromOptions(), PetscDrawDestroy(), PetscDrawSetType() 36 @*/ 37 PetscErrorCode PetscDrawCreate(MPI_Comm comm,const char display[],const char title[],int x,int y,int w,int h,PetscDraw *indraw) 38 { 39 PetscDraw draw; 40 PetscErrorCode ierr; 41 PetscReal dpause; 42 PetscBool flag; 43 44 PetscFunctionBegin; 45 #ifndef PETSC_USE_DYNAMIC_LIBRARIES 46 ierr = PetscDrawInitializePackage(PETSC_NULL);CHKERRQ(ierr); 47 #endif 48 *indraw = 0; 49 ierr = PetscHeaderCreate(draw,_p_PetscDraw,struct _PetscDrawOps,PETSC_DRAW_CLASSID,-1,"Draw","Graphics","Draw",comm,PetscDrawDestroy,0);CHKERRQ(ierr); 50 draw->data = 0; 51 ierr = PetscStrallocpy(title,&draw->title);CHKERRQ(ierr); 52 ierr = PetscStrallocpy(display,&draw->display);CHKERRQ(ierr); 53 draw->x = x; 54 draw->y = y; 55 draw->w = w; 56 draw->h = h; 57 draw->pause = 0.0; 58 draw->coor_xl = 0.0; 59 draw->coor_xr = 1.0; 60 draw->coor_yl = 0.0; 61 draw->coor_yr = 1.0; 62 draw->port_xl = 0.0; 63 draw->port_xr = 1.0; 64 draw->port_yl = 0.0; 65 draw->port_yr = 1.0; 66 draw->popup = 0; 67 ierr = PetscOptionsGetReal(PETSC_NULL,"-draw_pause",&dpause,&flag);CHKERRQ(ierr); 68 if (flag) draw->pause = dpause; 69 draw->savefilename = PETSC_NULL; 70 draw->savefilemovie = PETSC_FALSE; 71 draw->savefilecount = -1; 72 ierr = PetscDrawSetCurrentPoint(draw,.5,.9);CHKERRQ(ierr); 73 draw->boundbox_xl = .5; 74 draw->boundbox_xr = .5; 75 draw->boundbox_yl = .9; 76 draw->boundbox_yr = .9; 77 78 *indraw = draw; 79 PetscFunctionReturn(0); 80 } 81 82 #undef __FUNCT__ 83 #define __FUNCT__ "PetscDrawSetType" 84 /*@C 85 PetscDrawSetType - Builds graphics object for a particular implementation 86 87 Collective on PetscDraw 88 89 Input Parameter: 90 + draw - the graphics context 91 - type - for example, PETSC_DRAW_X 92 93 Options Database Command: 94 . -draw_type <type> - Sets the type; use -help for a list 95 of available methods (for instance, x) 96 97 Level: intermediate 98 99 Notes: 100 See "petsc/include/petscdraw.h" for available methods (for instance, 101 PETSC_DRAW_X) 102 103 Concepts: drawing^X windows 104 Concepts: X windows^graphics 105 Concepts: drawing^Microsoft Windows 106 107 .seealso: PetscDrawSetFromOptions(), PetscDrawCreate(), PetscDrawDestroy() 108 @*/ 109 PetscErrorCode PetscDrawSetType(PetscDraw draw,PetscDrawType type) 110 { 111 PetscErrorCode ierr,(*r)(PetscDraw); 112 PetscBool match; 113 PetscBool flg=PETSC_FALSE; 114 115 PetscFunctionBegin; 116 PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 117 PetscValidCharPointer(type,2); 118 119 ierr = PetscObjectTypeCompare((PetscObject)draw,type,&match);CHKERRQ(ierr); 120 if (match) PetscFunctionReturn(0); 121 122 /* User requests no graphics */ 123 ierr = PetscOptionsHasName(PETSC_NULL,"-nox",&flg);CHKERRQ(ierr); 124 125 /* 126 This is not ideal, but it allows codes to continue to run if X graphics 127 was requested but is not installed on this machine. Mostly this is for 128 testing. 129 */ 130 #if !defined(PETSC_HAVE_X) 131 if (!flg) { 132 ierr = PetscStrcmp(type,PETSC_DRAW_X,&match);CHKERRQ(ierr); 133 if (match) { 134 PetscBool dontwarn = PETSC_TRUE; 135 flg = PETSC_TRUE; 136 ierr = PetscOptionsHasName(PETSC_NULL,"-nox_warning",&dontwarn);CHKERRQ(ierr); 137 if (!dontwarn) { 138 (*PetscErrorPrintf)("PETSc installed without X windows on this machine\nproceeding without graphics\n"); 139 } 140 } 141 } 142 #endif 143 if (flg) { 144 type = PETSC_DRAW_NULL; 145 } 146 147 if (draw->data) { 148 /* destroy the old private PetscDraw context */ 149 ierr = (*draw->ops->destroy)(draw);CHKERRQ(ierr); 150 draw->ops->destroy = PETSC_NULL; 151 draw->data = 0; 152 } 153 154 ierr = PetscFListFind(PetscDrawList,((PetscObject)draw)->comm,type,PETSC_TRUE,(void (**)(void)) &r);CHKERRQ(ierr); 155 if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown PetscDraw type given: %s",type); 156 ierr = PetscObjectChangeTypeName((PetscObject)draw,type);CHKERRQ(ierr); 157 draw->data = 0; 158 ierr = (*r)(draw);CHKERRQ(ierr); 159 PetscFunctionReturn(0); 160 } 161 162 #undef __FUNCT__ 163 #define __FUNCT__ "PetscDrawRegisterDestroy" 164 /*@C 165 PetscDrawRegisterDestroy - Frees the list of PetscDraw methods that were 166 registered by PetscDrawRegisterDynamic(). 167 168 Not Collective 169 170 Level: developer 171 172 .seealso: PetscDrawRegisterDynamic(), PetscDrawRegisterAll() 173 @*/ 174 PetscErrorCode PetscDrawRegisterDestroy(void) 175 { 176 PetscErrorCode ierr; 177 178 PetscFunctionBegin; 179 ierr = PetscFListDestroy(&PetscDrawList);CHKERRQ(ierr); 180 PetscFunctionReturn(0); 181 } 182 183 #undef __FUNCT__ 184 #define __FUNCT__ "PetscDrawGetType" 185 /*@C 186 PetscDrawGetType - Gets the PetscDraw type as a string from the PetscDraw object. 187 188 Not Collective 189 190 Input Parameter: 191 . draw - Krylov context 192 193 Output Parameters: 194 . name - name of PetscDraw method 195 196 Level: advanced 197 198 @*/ 199 PetscErrorCode PetscDrawGetType(PetscDraw draw,PetscDrawType *type) 200 { 201 PetscFunctionBegin; 202 PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 203 PetscValidPointer(type,2); 204 *type = ((PetscObject)draw)->type_name; 205 PetscFunctionReturn(0); 206 } 207 208 #undef __FUNCT__ 209 #define __FUNCT__ "PetscDrawRegister" 210 PetscErrorCode PetscDrawRegister(const char *sname,const char *path,const char *name,PetscErrorCode (*function)(PetscDraw)) 211 { 212 PetscErrorCode ierr; 213 char fullname[PETSC_MAX_PATH_LEN]; 214 215 PetscFunctionBegin; 216 ierr = PetscFListConcat(path,name,fullname);CHKERRQ(ierr); 217 ierr = PetscFListAdd(&PetscDrawList,sname,fullname,(void (*)(void))function);CHKERRQ(ierr); 218 PetscFunctionReturn(0); 219 } 220 221 #undef __FUNCT__ 222 #define __FUNCT__ "PetscDrawSetFromOptions" 223 /*@ 224 PetscDrawSetFromOptions - Sets the graphics type from the options database. 225 Defaults to a PETSc X windows graphics. 226 227 Collective on PetscDraw 228 229 Input Parameter: 230 . draw - the graphics context 231 232 Options Database Keys: 233 + -nox - do not use X graphics (ignore graphics calls, but run program correctly) 234 . -nox_warning - when X windows support is not installed this prevents the warning message 235 from being printed 236 . -draw_save [optional filename] - (X windows only) saves each image before it is cleared to a file 237 - -draw_save_movie - converts image files to a movie at the end of the run. See PetscDrawSetSave() 238 239 Level: intermediate 240 241 Notes: 242 Must be called after PetscDrawCreate() before the PetscDrawtor is used. 243 244 Concepts: drawing^setting options 245 Concepts: graphics^setting options 246 247 .seealso: PetscDrawCreate(), PetscDrawSetType(), PetscDrawSetSave() 248 249 @*/ 250 PetscErrorCode PetscDrawSetFromOptions(PetscDraw draw) 251 { 252 PetscErrorCode ierr; 253 PetscBool flg,nox; 254 char vtype[256]; 255 const char *def; 256 #if !defined(PETSC_USE_WINDOWS_GRAPHICS) && !defined(PETSC_HAVE_X) 257 PetscBool warn; 258 #endif 259 260 PetscFunctionBegin; 261 PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 262 263 if (!PetscDrawList) { 264 ierr = PetscDrawRegisterAll(PETSC_NULL);CHKERRQ(ierr); 265 } 266 267 if (((PetscObject)draw)->type_name) { 268 def = ((PetscObject)draw)->type_name; 269 } else { 270 ierr = PetscOptionsHasName(PETSC_NULL,"-nox",&nox);CHKERRQ(ierr); 271 def = PETSC_DRAW_NULL; 272 #if defined(PETSC_USE_WINDOWS_GRAPHICS) 273 if (!nox) def = PETSC_DRAW_WIN32; 274 #elif defined(PETSC_HAVE_X) 275 if (!nox) def = PETSC_DRAW_X; 276 #elif defined(PETSC_HAVE_GLUT) 277 if (!nox) def = PETSC_DRAW_GLUT; 278 #elif defined(PETSC_HAVE_OPENGLES) 279 if (!nox) def = PETSC_DRAW_OPENGLES; 280 #else 281 ierr = PetscOptionsHasName(PETSC_NULL,"-nox_warning",&warn);CHKERRQ(ierr); 282 if (!nox && !warn) { 283 (*PetscErrorPrintf)("PETSc installed without X windows, Microsoft Graphics, OpenGL ES, or GLUT/OpenGL on this machine\nproceeding without graphics\n"); 284 } 285 #endif 286 } 287 ierr = PetscObjectOptionsBegin((PetscObject)draw);CHKERRQ(ierr); 288 ierr = PetscOptionsList("-draw_type","Type of graphical output","PetscDrawSetType",PetscDrawList,def,vtype,256,&flg);CHKERRQ(ierr); 289 if (flg) { 290 ierr = PetscDrawSetType(draw,vtype);CHKERRQ(ierr); 291 } else if (!((PetscObject)draw)->type_name) { 292 ierr = PetscDrawSetType(draw,def);CHKERRQ(ierr); 293 } 294 ierr = PetscOptionsName("-nox","Run without graphics","None",&nox);CHKERRQ(ierr); 295 #if defined(PETSC_HAVE_X) 296 { 297 char filename[PETSC_MAX_PATH_LEN]; 298 PetscBool save,movie = PETSC_FALSE; 299 ierr = PetscOptionsBool("-draw_save_movie","Make a movie from the images saved (X Windows only)","PetscDrawSetSave",movie,&movie,PETSC_NULL);CHKERRQ(ierr); 300 ierr = PetscOptionsString("-draw_save","Save graphics to file (X Windows only)","PetscDrawSetSave",filename,filename,PETSC_MAX_PATH_LEN,&save);CHKERRQ(ierr); 301 if (save) { 302 ierr = PetscDrawSetSave(draw,filename,movie);CHKERRQ(ierr); 303 } 304 } 305 #endif 306 307 /* process any options handlers added with PetscObjectAddOptionsHandler() */ 308 ierr = PetscObjectProcessOptionsHandlers((PetscObject)draw);CHKERRQ(ierr); 309 ierr = PetscOptionsEnd();CHKERRQ(ierr); 310 PetscFunctionReturn(0); 311 } 312 313 #undef __FUNCT__ 314 #define __FUNCT__ "PetscDrawSetSave" 315 /*@C 316 PetscDrawSave - Saves images produced in a PetscDraw into a file as a Gif file using AfterImage 317 318 Collective on PetscDraw 319 320 Input Parameter: 321 + draw - the graphics context 322 . filename - name of the file, if PETSC_NULL uses name of draw object 323 - movie - produce a movie of all the images 324 325 Options Database Command: 326 + -draw_save <filename> 327 - -draw_save_movie 328 329 Level: intermediate 330 331 Concepts: X windows^graphics 332 333 Notes: You should call this BEFORE calling PetscDrawClear() and creating your image. 334 335 Requires that PETSc be configured with the option --with-afterimage to save the images and ffmpeg must be in your path to make the movie 336 337 If X windows generates an error message about X_CreateWindow() failing then Afterimage was installed without X windows. Reinstall Afterimage using the 338 ./configure flags --x-includes=/pathtoXincludes --x-libraries=/pathtoXlibraries For example under Mac OS X Mountain Lion --x-includes=/opt/X11/include -x-libraries=/opt/X11/lib 339 340 341 .seealso: PetscDrawSetFromOptions(), PetscDrawCreate(), PetscDrawDestroy(), PetscDrawSave() 342 @*/ 343 PetscErrorCode PetscDrawSetSave(PetscDraw draw,const char *filename,PetscBool movie) 344 { 345 PetscErrorCode ierr; 346 347 PetscFunctionBegin; 348 PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 349 ierr = PetscFree(draw->savefilename);CHKERRQ(ierr); 350 draw->savefilemovie = movie; 351 if (filename && filename[0]) { 352 ierr = PetscStrallocpy(filename,&draw->savefilename);CHKERRQ(ierr); 353 } else { 354 const char *name; 355 ierr = PetscObjectGetName((PetscObject)draw,&name);CHKERRQ(ierr); 356 ierr = PetscStrallocpy(name,&draw->savefilename);CHKERRQ(ierr); 357 } 358 if (draw->ops->setsave) { 359 ierr = (*draw->ops->setsave)(draw,filename);CHKERRQ(ierr); 360 } 361 PetscFunctionReturn(0); 362 } 363