15c6c1daeSBarry Smith 25c6c1daeSBarry Smith /* 35c6c1daeSBarry Smith Provides the registration process for PETSc PetscDraw routines 45c6c1daeSBarry Smith */ 5af0996ceSBarry Smith #include <petsc/private/drawimpl.h> /*I "petscdraw.h" I*/ 6111ee811SBarry Smith #include <petscviewer.h> /*I "petscviewer.h" I*/ 7111ee811SBarry Smith #if defined(PETSC_HAVE_SAWS) 8111ee811SBarry Smith #include <petscviewersaws.h> 9111ee811SBarry Smith #endif 105c6c1daeSBarry Smith 115c6c1daeSBarry Smith /* 125c6c1daeSBarry Smith Contains the list of registered PetscDraw routines 135c6c1daeSBarry Smith */ 14140e18c1SBarry Smith PetscFunctionList PetscDrawList = 0; 155c6c1daeSBarry Smith 160076e027SBarry Smith #undef __FUNCT__ 170076e027SBarry Smith #define __FUNCT__ "PetscDrawView" 180076e027SBarry Smith /*@C 190076e027SBarry Smith PetscDrawView - Prints the PetscDraw data structure. 200076e027SBarry Smith 210076e027SBarry Smith Collective on PetscDraw 220076e027SBarry Smith 230076e027SBarry Smith Input Parameters: 240076e027SBarry Smith + indraw - the PetscDraw context 250076e027SBarry Smith - viewer - visualization context 260076e027SBarry Smith 27236f5a4dSBarry Smith See PetscDrawSetFromOptions() for options database keys 280076e027SBarry Smith 290076e027SBarry Smith Note: 300076e027SBarry Smith The available visualization contexts include 310076e027SBarry Smith + PETSC_VIEWER_STDOUT_SELF - standard output (default) 320076e027SBarry Smith - PETSC_VIEWER_STDOUT_WORLD - synchronized standard 330076e027SBarry Smith output where only the first processor opens 340076e027SBarry Smith the file. All other processors send their 350076e027SBarry Smith data to the first processor to print. 360076e027SBarry Smith 370076e027SBarry Smith The user can open an alternative visualization context with 380076e027SBarry Smith PetscViewerASCIIOpen() - output to a specified file. 390076e027SBarry Smith 400076e027SBarry Smith Level: beginner 410076e027SBarry Smith 420076e027SBarry Smith .keywords: PetscDraw, view 430076e027SBarry Smith 440076e027SBarry Smith .seealso: PCView(), PetscViewerASCIIOpen() 450076e027SBarry Smith @*/ 460076e027SBarry Smith PetscErrorCode PetscDrawView(PetscDraw indraw,PetscViewer viewer) 470076e027SBarry Smith { 480076e027SBarry Smith PetscErrorCode ierr; 490076e027SBarry Smith PetscBool isdraw; 50e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS) 51536b137fSBarry Smith PetscBool issaws; 520076e027SBarry Smith #endif 530076e027SBarry Smith 540076e027SBarry Smith PetscFunctionBegin; 550076e027SBarry Smith PetscValidHeaderSpecific(indraw,PETSC_DRAW_CLASSID,1); 56f55353a2SBarry Smith if (!viewer) { 57f55353a2SBarry Smith ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)indraw),&viewer);CHKERRQ(ierr); 58f55353a2SBarry Smith } 590076e027SBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 600076e027SBarry Smith PetscCheckSameComm(indraw,1,viewer,2); 610076e027SBarry Smith 6298c3331eSBarry Smith ierr = PetscObjectPrintClassNamePrefixType((PetscObject)indraw,viewer);CHKERRQ(ierr); 630076e027SBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr); 64e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS) 65536b137fSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERSAWS,&issaws);CHKERRQ(ierr); 660076e027SBarry Smith #endif 670076e027SBarry Smith if (isdraw) { 680076e027SBarry Smith PetscDraw draw; 690076e027SBarry Smith char str[36]; 700076e027SBarry Smith PetscReal x,y,bottom,h; 710076e027SBarry Smith 720076e027SBarry Smith ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr); 730076e027SBarry Smith ierr = PetscDrawGetCurrentPoint(draw,&x,&y);CHKERRQ(ierr); 740076e027SBarry Smith ierr = PetscStrcpy(str,"PetscDraw: ");CHKERRQ(ierr); 750076e027SBarry Smith ierr = PetscStrcat(str,((PetscObject)indraw)->type_name);CHKERRQ(ierr); 7651fa3d41SBarry Smith ierr = PetscDrawStringBoxed(draw,x,y,PETSC_DRAW_RED,PETSC_DRAW_BLACK,str,NULL,&h);CHKERRQ(ierr); 770076e027SBarry Smith bottom = y - h; 780076e027SBarry Smith ierr = PetscDrawPushCurrentPoint(draw,x,bottom);CHKERRQ(ierr); 79e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS) 80536b137fSBarry Smith } else if (issaws) { 81d45a07a7SBarry Smith PetscMPIInt rank; 82d45a07a7SBarry Smith 83d45a07a7SBarry Smith ierr = PetscObjectName((PetscObject)indraw);CHKERRQ(ierr); 84d45a07a7SBarry Smith ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr); 85d45a07a7SBarry Smith if (!((PetscObject)indraw)->amsmem && !rank) { 86e04113cfSBarry Smith ierr = PetscObjectViewSAWs((PetscObject)indraw,viewer);CHKERRQ(ierr); 870076e027SBarry Smith } 880076e027SBarry Smith #endif 890076e027SBarry Smith } else if (indraw->ops->view) { 900076e027SBarry Smith ierr = (*indraw->ops->view)(indraw,viewer);CHKERRQ(ierr); 910076e027SBarry Smith } 920076e027SBarry Smith PetscFunctionReturn(0); 930076e027SBarry Smith } 940076e027SBarry Smith 955c6c1daeSBarry Smith #undef __FUNCT__ 965c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawCreate" 975c6c1daeSBarry Smith /*@C 985c6c1daeSBarry Smith PetscDrawCreate - Creates a graphics context. 995c6c1daeSBarry Smith 1005c6c1daeSBarry Smith Collective on MPI_Comm 1015c6c1daeSBarry Smith 1025c6c1daeSBarry Smith Input Parameter: 1035c6c1daeSBarry Smith + comm - MPI communicator 1045c6c1daeSBarry Smith . display - X display when using X windows 1055c6c1daeSBarry Smith . title - optional title added to top of window 1065c6c1daeSBarry Smith . x,y - coordinates of lower left corner of window or PETSC_DECIDE 1075c6c1daeSBarry Smith - w, h - width and height of window or PETSC_DECIDE or PETSC_DRAW_HALF_SIZE, PETSC_DRAW_FULL_SIZE, 1085c6c1daeSBarry Smith or PETSC_DRAW_THIRD_SIZE or PETSC_DRAW_QUARTER_SIZE 1095c6c1daeSBarry Smith 1105c6c1daeSBarry Smith Output Parameter: 1115c6c1daeSBarry Smith . draw - location to put the PetscDraw context 1125c6c1daeSBarry Smith 1135c6c1daeSBarry Smith Level: beginner 1145c6c1daeSBarry Smith 1155c6c1daeSBarry Smith Concepts: graphics^creating context 1165c6c1daeSBarry Smith Concepts: drawing^creating context 1175c6c1daeSBarry Smith 1185c6c1daeSBarry Smith .seealso: PetscDrawSetFromOptions(), PetscDrawDestroy(), PetscDrawSetType() 1195c6c1daeSBarry Smith @*/ 1205c6c1daeSBarry Smith PetscErrorCode PetscDrawCreate(MPI_Comm comm,const char display[],const char title[],int x,int y,int w,int h,PetscDraw *indraw) 1215c6c1daeSBarry Smith { 1225c6c1daeSBarry Smith PetscDraw draw; 1235c6c1daeSBarry Smith PetscErrorCode ierr; 124e118a51fSLisandro Dalcin PetscReal dpause = 0.0; 1255c6c1daeSBarry Smith PetscBool flag; 1265c6c1daeSBarry Smith 1275c6c1daeSBarry Smith PetscFunctionBegin; 128607a6623SBarry Smith ierr = PetscDrawInitializePackage();CHKERRQ(ierr); 1295c6c1daeSBarry Smith *indraw = 0; 13073107ff1SLisandro Dalcin ierr = PetscHeaderCreate(draw,PETSC_DRAW_CLASSID,"Draw","Graphics","Draw",comm,PetscDrawDestroy,PetscDrawView);CHKERRQ(ierr); 131a297a907SKarl Rupp 1328f69470aSLisandro Dalcin draw->data = NULL; 1335c6c1daeSBarry Smith ierr = PetscStrallocpy(display,&draw->display);CHKERRQ(ierr); 134815f00f0SLisandro Dalcin ierr = PetscStrallocpy(title,&draw->title);CHKERRQ(ierr); 1355c6c1daeSBarry Smith draw->x = x; 1365c6c1daeSBarry Smith draw->y = y; 1375c6c1daeSBarry Smith draw->w = w; 1385c6c1daeSBarry Smith draw->h = h; 1395c6c1daeSBarry Smith draw->pause = 0.0; 1405c6c1daeSBarry Smith draw->coor_xl = 0.0; 1415c6c1daeSBarry Smith draw->coor_xr = 1.0; 1425c6c1daeSBarry Smith draw->coor_yl = 0.0; 1435c6c1daeSBarry Smith draw->coor_yr = 1.0; 1445c6c1daeSBarry Smith draw->port_xl = 0.0; 1455c6c1daeSBarry Smith draw->port_xr = 1.0; 1465c6c1daeSBarry Smith draw->port_yl = 0.0; 1475c6c1daeSBarry Smith draw->port_yr = 1.0; 148e118a51fSLisandro Dalcin draw->popup = NULL; 149a297a907SKarl Rupp 150c5929fdfSBarry Smith ierr = PetscOptionsGetReal(NULL,NULL,"-draw_pause",&dpause,&flag);CHKERRQ(ierr); 1515c6c1daeSBarry Smith if (flag) draw->pause = dpause; 1520298fd71SBarry Smith draw->savefilename = NULL; 1535b399a63SLisandro Dalcin draw->savefilecount = 0; 1545c6c1daeSBarry Smith draw->savefilemovie = PETSC_FALSE; 155a297a907SKarl Rupp 1565c6c1daeSBarry Smith ierr = PetscDrawSetCurrentPoint(draw,.5,.9);CHKERRQ(ierr); 157a297a907SKarl Rupp 1585c6c1daeSBarry Smith draw->boundbox_xl = .5; 1595c6c1daeSBarry Smith draw->boundbox_xr = .5; 1605c6c1daeSBarry Smith draw->boundbox_yl = .9; 1615c6c1daeSBarry Smith draw->boundbox_yr = .9; 1625c6c1daeSBarry Smith 1635c6c1daeSBarry Smith *indraw = draw; 1645c6c1daeSBarry Smith PetscFunctionReturn(0); 1655c6c1daeSBarry Smith } 1665c6c1daeSBarry Smith 1675c6c1daeSBarry Smith #undef __FUNCT__ 1685c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawSetType" 1695c6c1daeSBarry Smith /*@C 1705c6c1daeSBarry Smith PetscDrawSetType - Builds graphics object for a particular implementation 1715c6c1daeSBarry Smith 1725c6c1daeSBarry Smith Collective on PetscDraw 1735c6c1daeSBarry Smith 1745c6c1daeSBarry Smith Input Parameter: 1755c6c1daeSBarry Smith + draw - the graphics context 1765c6c1daeSBarry Smith - type - for example, PETSC_DRAW_X 1775c6c1daeSBarry Smith 1785c6c1daeSBarry Smith Options Database Command: 179236f5a4dSBarry Smith . -draw_type <type> - Sets the type; use -help for a list of available methods (for instance, x) 180236f5a4dSBarry Smith 181236f5a4dSBarry Smith See PetscDrawSetFromOptions for additional options database keys 1825c6c1daeSBarry Smith 1835c6c1daeSBarry Smith Level: intermediate 1845c6c1daeSBarry Smith 1855c6c1daeSBarry Smith Notes: 1865c6c1daeSBarry Smith See "petsc/include/petscdraw.h" for available methods (for instance, 1875c6c1daeSBarry Smith PETSC_DRAW_X) 1885c6c1daeSBarry Smith 1895c6c1daeSBarry Smith Concepts: drawing^X windows 1905c6c1daeSBarry Smith Concepts: X windows^graphics 1915c6c1daeSBarry Smith Concepts: drawing^Microsoft Windows 1925c6c1daeSBarry Smith 1935c6c1daeSBarry Smith .seealso: PetscDrawSetFromOptions(), PetscDrawCreate(), PetscDrawDestroy() 1945c6c1daeSBarry Smith @*/ 1955c6c1daeSBarry Smith PetscErrorCode PetscDrawSetType(PetscDraw draw,PetscDrawType type) 1965c6c1daeSBarry Smith { 1975c6c1daeSBarry Smith PetscErrorCode ierr,(*r)(PetscDraw); 1985c6c1daeSBarry Smith PetscBool match; 1995c6c1daeSBarry Smith PetscBool flg=PETSC_FALSE; 2005c6c1daeSBarry Smith 2015c6c1daeSBarry Smith PetscFunctionBegin; 2025c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 2035c6c1daeSBarry Smith PetscValidCharPointer(type,2); 2045c6c1daeSBarry Smith 2055c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)draw,type,&match);CHKERRQ(ierr); 2065c6c1daeSBarry Smith if (match) PetscFunctionReturn(0); 2075c6c1daeSBarry Smith 2085c6c1daeSBarry Smith /* User requests no graphics */ 209c5929fdfSBarry Smith ierr = PetscOptionsHasName(((PetscObject)draw)->options,NULL,"-nox",&flg);CHKERRQ(ierr); 2105c6c1daeSBarry Smith 2115c6c1daeSBarry Smith /* 2125c6c1daeSBarry Smith This is not ideal, but it allows codes to continue to run if X graphics 2135c6c1daeSBarry Smith was requested but is not installed on this machine. Mostly this is for 2145c6c1daeSBarry Smith testing. 2155c6c1daeSBarry Smith */ 2165c6c1daeSBarry Smith #if !defined(PETSC_HAVE_X) 2175c6c1daeSBarry Smith if (!flg) { 2185c6c1daeSBarry Smith ierr = PetscStrcmp(type,PETSC_DRAW_X,&match);CHKERRQ(ierr); 2195c6c1daeSBarry Smith if (match) { 2205c6c1daeSBarry Smith PetscBool dontwarn = PETSC_TRUE; 2215c6c1daeSBarry Smith flg = PETSC_TRUE; 22276a34f28SBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-nox_warning",&dontwarn);CHKERRQ(ierr); 223a297a907SKarl Rupp if (!dontwarn) (*PetscErrorPrintf)("PETSc installed without X windows on this machine\nproceeding without graphics\n"); 2245c6c1daeSBarry Smith } 2255c6c1daeSBarry Smith } 2265c6c1daeSBarry Smith #endif 227a297a907SKarl Rupp if (flg) type = PETSC_DRAW_NULL; 2285c6c1daeSBarry Smith 2291c9cd337SJed Brown ierr = PetscFunctionListFind(PetscDrawList,type,&r);CHKERRQ(ierr); 2305c6c1daeSBarry Smith if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown PetscDraw type given: %s",type); 231618c1b54SLisandro Dalcin if (draw->ops->destroy) {ierr = (*draw->ops->destroy)(draw);CHKERRQ(ierr);} 232618c1b54SLisandro Dalcin ierr = PetscMemzero(draw->ops,sizeof(struct _PetscDrawOps));CHKERRQ(ierr); 2335c6c1daeSBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)draw,type);CHKERRQ(ierr); 2345c6c1daeSBarry Smith ierr = (*r)(draw);CHKERRQ(ierr); 2355c6c1daeSBarry Smith PetscFunctionReturn(0); 2365c6c1daeSBarry Smith } 2375c6c1daeSBarry Smith 2385c6c1daeSBarry Smith #undef __FUNCT__ 2395c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawGetType" 2405c6c1daeSBarry Smith /*@C 2415c6c1daeSBarry Smith PetscDrawGetType - Gets the PetscDraw type as a string from the PetscDraw object. 2425c6c1daeSBarry Smith 2435c6c1daeSBarry Smith Not Collective 2445c6c1daeSBarry Smith 2455c6c1daeSBarry Smith Input Parameter: 2465c6c1daeSBarry Smith . draw - Krylov context 2475c6c1daeSBarry Smith 2485c6c1daeSBarry Smith Output Parameters: 2495c6c1daeSBarry Smith . name - name of PetscDraw method 2505c6c1daeSBarry Smith 2515c6c1daeSBarry Smith Level: advanced 2525c6c1daeSBarry Smith 2535c6c1daeSBarry Smith @*/ 2545c6c1daeSBarry Smith PetscErrorCode PetscDrawGetType(PetscDraw draw,PetscDrawType *type) 2555c6c1daeSBarry Smith { 2565c6c1daeSBarry Smith PetscFunctionBegin; 2575c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 2585c6c1daeSBarry Smith PetscValidPointer(type,2); 2595c6c1daeSBarry Smith *type = ((PetscObject)draw)->type_name; 2605c6c1daeSBarry Smith PetscFunctionReturn(0); 2615c6c1daeSBarry Smith } 2625c6c1daeSBarry Smith 2635c6c1daeSBarry Smith #undef __FUNCT__ 2645c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawRegister" 265607a6623SBarry Smith /*@C 2661c84c290SBarry Smith PetscDrawRegister - Adds a method to the graphics package. 2671c84c290SBarry Smith 2681c84c290SBarry Smith Not Collective 2691c84c290SBarry Smith 2701c84c290SBarry Smith Input Parameters: 2710076e027SBarry Smith + name_solver - name of a new user-defined graphics class 2721c84c290SBarry Smith - routine_create - routine to create method context 2731c84c290SBarry Smith 2741c84c290SBarry Smith Level: developer 2751c84c290SBarry Smith 2761c84c290SBarry Smith Notes: 2770076e027SBarry Smith PetscDrawRegister() may be called multiple times to add several user-defined graphics classes 2781c84c290SBarry Smith 2791c84c290SBarry Smith Sample usage: 2801c84c290SBarry Smith .vb 281bdf89e91SBarry Smith PetscDrawRegister("my_draw_type", MyDrawCreate); 2821c84c290SBarry Smith .ve 2831c84c290SBarry Smith 2840076e027SBarry Smith Then, your specific graphics package can be chosen with the procedural interface via 2851c84c290SBarry Smith $ PetscDrawSetType(ksp,"my_draw_type") 2861c84c290SBarry Smith or at runtime via the option 2871c84c290SBarry Smith $ -draw_type my_draw_type 2881c84c290SBarry Smith 2891c84c290SBarry Smith Concepts: graphics^registering new draw classes 2901c84c290SBarry Smith Concepts: PetscDraw^registering new draw classes 2911c84c290SBarry Smith 2921c84c290SBarry Smith .seealso: PetscDrawRegisterAll(), PetscDrawRegisterDestroy() 2931c84c290SBarry Smith @*/ 294bdf89e91SBarry Smith PetscErrorCode PetscDrawRegister(const char *sname,PetscErrorCode (*function)(PetscDraw)) 2955c6c1daeSBarry Smith { 2965c6c1daeSBarry Smith PetscErrorCode ierr; 2975c6c1daeSBarry Smith 2985c6c1daeSBarry Smith PetscFunctionBegin; 299a240a19fSJed Brown ierr = PetscFunctionListAdd(&PetscDrawList,sname,function);CHKERRQ(ierr); 3005c6c1daeSBarry Smith PetscFunctionReturn(0); 3015c6c1daeSBarry Smith } 3025c6c1daeSBarry Smith 3035c6c1daeSBarry Smith #undef __FUNCT__ 304*7faeec8aSLisandro Dalcin #define __FUNCT__ "PetscDrawSetOptionsPrefix" 305*7faeec8aSLisandro Dalcin /*@C 306*7faeec8aSLisandro Dalcin PetscDrawSetOptionsPrefix - Sets the prefix used for searching for all 307*7faeec8aSLisandro Dalcin PetscDraw options in the database. 308*7faeec8aSLisandro Dalcin 309*7faeec8aSLisandro Dalcin Logically Collective on PetscDraw 310*7faeec8aSLisandro Dalcin 311*7faeec8aSLisandro Dalcin Input Parameter: 312*7faeec8aSLisandro Dalcin + draw - the draw context 313*7faeec8aSLisandro Dalcin - prefix - the prefix to prepend to all option names 314*7faeec8aSLisandro Dalcin 315*7faeec8aSLisandro Dalcin Level: advanced 316*7faeec8aSLisandro Dalcin 317*7faeec8aSLisandro Dalcin .keywords: PetscDraw, set, options, prefix, database 318*7faeec8aSLisandro Dalcin 319*7faeec8aSLisandro Dalcin .seealso: PetscDrawSetFromOptions() 320*7faeec8aSLisandro Dalcin @*/ 321*7faeec8aSLisandro Dalcin PetscErrorCode PetscDrawSetOptionsPrefix(PetscDraw draw,const char prefix[]) 322*7faeec8aSLisandro Dalcin { 323*7faeec8aSLisandro Dalcin PetscErrorCode ierr; 324*7faeec8aSLisandro Dalcin 325*7faeec8aSLisandro Dalcin PetscFunctionBegin; 326*7faeec8aSLisandro Dalcin PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 327*7faeec8aSLisandro Dalcin ierr = PetscObjectSetOptionsPrefix((PetscObject)draw,prefix);CHKERRQ(ierr); 328*7faeec8aSLisandro Dalcin PetscFunctionReturn(0); 329*7faeec8aSLisandro Dalcin } 330*7faeec8aSLisandro Dalcin 331*7faeec8aSLisandro Dalcin #undef __FUNCT__ 3325c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawSetFromOptions" 3335c6c1daeSBarry Smith /*@ 3345c6c1daeSBarry Smith PetscDrawSetFromOptions - Sets the graphics type from the options database. 3355c6c1daeSBarry Smith Defaults to a PETSc X windows graphics. 3365c6c1daeSBarry Smith 3375c6c1daeSBarry Smith Collective on PetscDraw 3385c6c1daeSBarry Smith 3395c6c1daeSBarry Smith Input Parameter: 3405c6c1daeSBarry Smith . draw - the graphics context 3415c6c1daeSBarry Smith 3425c6c1daeSBarry Smith Options Database Keys: 3435c6c1daeSBarry Smith + -nox - do not use X graphics (ignore graphics calls, but run program correctly) 3441cda70a7SBarry Smith . -nox_warning - when X windows support is not installed this prevents the warning message from being printed 3457450148dSBarry Smith . -draw_pause <pause amount> -- -1 indicates wait for mouse input, -2 indicates pause when window is to be destroyed 34673f7a4c5SBarry Smith . -draw_marker_type - <x,point> 3475c6c1daeSBarry Smith . -draw_save [optional filename] - (X windows only) saves each image before it is cleared to a file 348287de1a7SBarry Smith . -draw_save_final_image [optional filename] - (X windows only) saves the final image displayed in a window 349a4494fc1SBarry Smith . -draw_save_movie - converts image files to a movie at the end of the run. See PetscDrawSetSave() 350df8d4941SLisandro Dalcin . -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' 351df8d4941SLisandro Dalcin . -draw_save_on_clear - saves an image on each clear, mainly for debugging 352df8d4941SLisandro Dalcin - -draw_save_on_flush - saves an image on each flush, mainly for debugging 3535c6c1daeSBarry Smith 3545c6c1daeSBarry Smith Level: intermediate 3555c6c1daeSBarry Smith 3565c6c1daeSBarry Smith Notes: 35799749f0dSBarry Smith Must be called after PetscDrawCreate() before the PetscDraw is used. 3585c6c1daeSBarry Smith 3595c6c1daeSBarry Smith Concepts: drawing^setting options 3605c6c1daeSBarry Smith Concepts: graphics^setting options 3615c6c1daeSBarry Smith 362287de1a7SBarry Smith .seealso: PetscDrawCreate(), PetscDrawSetType(), PetscDrawSetSave(), PetscDrawSetSaveFinalImage() 3635c6c1daeSBarry Smith 3645c6c1daeSBarry Smith @*/ 3655c6c1daeSBarry Smith PetscErrorCode PetscDrawSetFromOptions(PetscDraw draw) 3665c6c1daeSBarry Smith { 3675c6c1daeSBarry Smith PetscErrorCode ierr; 3685c6c1daeSBarry Smith PetscBool flg,nox; 3695c6c1daeSBarry Smith char vtype[256]; 3705c6c1daeSBarry Smith const char *def; 3715c6c1daeSBarry Smith #if !defined(PETSC_USE_WINDOWS_GRAPHICS) && !defined(PETSC_HAVE_X) 3725c6c1daeSBarry Smith PetscBool warn; 3735c6c1daeSBarry Smith #endif 3745c6c1daeSBarry Smith 3755c6c1daeSBarry Smith PetscFunctionBegin; 3765c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 3775c6c1daeSBarry Smith 378607a6623SBarry Smith ierr = PetscDrawRegisterAll();CHKERRQ(ierr); 3795c6c1daeSBarry Smith 380a297a907SKarl Rupp if (((PetscObject)draw)->type_name) def = ((PetscObject)draw)->type_name; 381a297a907SKarl Rupp else { 382c5929fdfSBarry Smith ierr = PetscOptionsHasName(((PetscObject)draw)->options,NULL,"-nox",&nox);CHKERRQ(ierr); 3835c6c1daeSBarry Smith def = PETSC_DRAW_NULL; 3845c6c1daeSBarry Smith #if defined(PETSC_USE_WINDOWS_GRAPHICS) 3855c6c1daeSBarry Smith if (!nox) def = PETSC_DRAW_WIN32; 3865c6c1daeSBarry Smith #elif defined(PETSC_HAVE_X) 3875c6c1daeSBarry Smith if (!nox) def = PETSC_DRAW_X; 3885c6c1daeSBarry Smith #elif defined(PETSC_HAVE_GLUT) 3895c6c1daeSBarry Smith if (!nox) def = PETSC_DRAW_GLUT; 3905c6c1daeSBarry Smith #elif defined(PETSC_HAVE_OPENGLES) 3915c6c1daeSBarry Smith if (!nox) def = PETSC_DRAW_OPENGLES; 3925c6c1daeSBarry Smith #else 39376a34f28SBarry Smith ierr = PetscOptionsHasName(NULL,NULL,"-nox_warning",&warn);CHKERRQ(ierr); 394a297a907SKarl Rupp if (!nox && !warn) (*PetscErrorPrintf)("PETSc installed without X windows, Microsoft Graphics, OpenGL ES, or GLUT/OpenGL on this machine\nproceeding without graphics\n"); 3955c6c1daeSBarry Smith #endif 3965c6c1daeSBarry Smith } 3975c6c1daeSBarry Smith ierr = PetscObjectOptionsBegin((PetscObject)draw);CHKERRQ(ierr); 398a264d7a6SBarry Smith ierr = PetscOptionsFList("-draw_type","Type of graphical output","PetscDrawSetType",PetscDrawList,def,vtype,256,&flg);CHKERRQ(ierr); 3995c6c1daeSBarry Smith if (flg) { 4005c6c1daeSBarry Smith ierr = PetscDrawSetType(draw,vtype);CHKERRQ(ierr); 4015c6c1daeSBarry Smith } else if (!((PetscObject)draw)->type_name) { 4025c6c1daeSBarry Smith ierr = PetscDrawSetType(draw,def);CHKERRQ(ierr); 4035c6c1daeSBarry Smith } 4045c6c1daeSBarry Smith ierr = PetscOptionsName("-nox","Run without graphics","None",&nox);CHKERRQ(ierr); 4055c6c1daeSBarry Smith #if defined(PETSC_HAVE_X) 4065c6c1daeSBarry Smith { 4075c6c1daeSBarry Smith char filename[PETSC_MAX_PATH_LEN]; 4085c6c1daeSBarry Smith PetscBool save,movie = PETSC_FALSE; 4090298fd71SBarry Smith ierr = PetscOptionsBool("-draw_save_movie","Make a movie from the images saved (X Windows only)","PetscDrawSetSave",movie,&movie,NULL);CHKERRQ(ierr); 4108b7fcac6SBarry Smith ierr = PetscOptionsBool("-draw_save_single_file","Each new image replaces previous image in file","PetscDrawSetSave",draw->savesinglefile,&draw->savesinglefile,NULL);CHKERRQ(ierr); 4115c6c1daeSBarry Smith ierr = PetscOptionsString("-draw_save","Save graphics to file (X Windows only)","PetscDrawSetSave",filename,filename,PETSC_MAX_PATH_LEN,&save);CHKERRQ(ierr); 4125c6c1daeSBarry Smith if (save) { 4135c6c1daeSBarry Smith ierr = PetscDrawSetSave(draw,filename,movie);CHKERRQ(ierr); 4145c6c1daeSBarry Smith } 415287de1a7SBarry Smith ierr = PetscOptionsString("-draw_save_final_image","Save graphics to file (X Windows only)","PetscDrawSetSaveFinalImage",filename,filename,PETSC_MAX_PATH_LEN,&save);CHKERRQ(ierr); 416287de1a7SBarry Smith if (save) { 417287de1a7SBarry Smith ierr = PetscDrawSetSaveFinalImage(draw,filename);CHKERRQ(ierr); 418287de1a7SBarry Smith } 419df8d4941SLisandro Dalcin ierr = PetscOptionsBool("-draw_save_on_clear","Save graphics to file (X Windows only) on each clear","PetscDrawSetSave",draw->saveonclear,&draw->saveonclear,NULL);CHKERRQ(ierr); 420df8d4941SLisandro Dalcin ierr = PetscOptionsBool("-draw_save_on_flush","Save graphics to file (X Windows only) on each flush","PetscDrawSetSave",draw->saveonflush,&draw->saveonflush,NULL);CHKERRQ(ierr); 4215c6c1daeSBarry Smith } 4225c6c1daeSBarry Smith #endif 423e118a51fSLisandro Dalcin ierr = PetscOptionsReal("-draw_pause","Amount of time that program pauses after plots","PetscDrawSetPause",draw->pause,&draw->pause,NULL);CHKERRQ(ierr); 42473f7a4c5SBarry Smith ierr = PetscOptionsEnum("-draw_marker_type","Type of marker to use on plots","PetscDrawSetMarkerType",PetscDrawMarkerTypes,(PetscEnum)draw->markertype,(PetscEnum *)&draw->markertype,NULL);CHKERRQ(ierr); 42573f7a4c5SBarry Smith 4265c6c1daeSBarry Smith /* process any options handlers added with PetscObjectAddOptionsHandler() */ 4270633abcbSJed Brown ierr = PetscObjectProcessOptionsHandlers(PetscOptionsObject,(PetscObject)draw);CHKERRQ(ierr); 428ce1779c8SBarry Smith 429ce1779c8SBarry Smith ierr = PetscDrawViewFromOptions(draw,NULL,"-draw_view");CHKERRQ(ierr); 4305c6c1daeSBarry Smith ierr = PetscOptionsEnd();CHKERRQ(ierr); 4315c6c1daeSBarry Smith PetscFunctionReturn(0); 4325c6c1daeSBarry Smith } 433