15c6c1daeSBarry Smith 25c6c1daeSBarry Smith /* 35c6c1daeSBarry Smith Provides the registration process for PETSc PetscDraw routines 45c6c1daeSBarry Smith */ 55c6c1daeSBarry Smith #include <petsc-private/drawimpl.h> /*I "petscdraw.h" I*/ 65c6c1daeSBarry Smith 75c6c1daeSBarry Smith /* 85c6c1daeSBarry Smith Contains the list of registered PetscDraw routines 95c6c1daeSBarry Smith */ 10140e18c1SBarry Smith PetscFunctionList PetscDrawList = 0; 115c6c1daeSBarry Smith 12*e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS) 13*e04113cfSBarry Smith #include <petscviewersaws.h> 140076e027SBarry Smith #endif 150076e027SBarry 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 270076e027SBarry Smith Options Database Keys: 280076e027SBarry Smith . -draw_view - print the ksp data structure at the end of a PetscDrawSetFromOptions() call 290076e027SBarry Smith 300076e027SBarry Smith Note: 310076e027SBarry Smith The available visualization contexts include 320076e027SBarry Smith + PETSC_VIEWER_STDOUT_SELF - standard output (default) 330076e027SBarry Smith - PETSC_VIEWER_STDOUT_WORLD - synchronized standard 340076e027SBarry Smith output where only the first processor opens 350076e027SBarry Smith the file. All other processors send their 360076e027SBarry Smith data to the first processor to print. 370076e027SBarry Smith 380076e027SBarry Smith The user can open an alternative visualization context with 390076e027SBarry Smith PetscViewerASCIIOpen() - output to a specified file. 400076e027SBarry Smith 410076e027SBarry Smith Level: beginner 420076e027SBarry Smith 430076e027SBarry Smith .keywords: PetscDraw, view 440076e027SBarry Smith 450076e027SBarry Smith .seealso: PCView(), PetscViewerASCIIOpen() 460076e027SBarry Smith @*/ 470076e027SBarry Smith PetscErrorCode PetscDrawView(PetscDraw indraw,PetscViewer viewer) 480076e027SBarry Smith { 490076e027SBarry Smith PetscErrorCode ierr; 500076e027SBarry Smith PetscBool isdraw; 51*e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS) 520076e027SBarry Smith PetscBool isams; 530076e027SBarry Smith #endif 540076e027SBarry Smith 550076e027SBarry Smith PetscFunctionBegin; 560076e027SBarry Smith PetscValidHeaderSpecific(indraw,PETSC_DRAW_CLASSID,1); 570076e027SBarry Smith if (!viewer) viewer = PETSC_VIEWER_STDOUT_(PetscObjectComm((PetscObject)indraw)); 580076e027SBarry Smith PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2); 590076e027SBarry Smith PetscCheckSameComm(indraw,1,viewer,2); 600076e027SBarry Smith 610076e027SBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr); 62*e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS) 63*e04113cfSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERSAWS,&isams);CHKERRQ(ierr); 640076e027SBarry Smith #endif 650076e027SBarry Smith if (isdraw) { 660076e027SBarry Smith PetscDraw draw; 670076e027SBarry Smith char str[36]; 680076e027SBarry Smith PetscReal x,y,bottom,h; 690076e027SBarry Smith 700076e027SBarry Smith ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr); 710076e027SBarry Smith ierr = PetscDrawGetCurrentPoint(draw,&x,&y);CHKERRQ(ierr); 720076e027SBarry Smith ierr = PetscStrcpy(str,"PetscDraw: ");CHKERRQ(ierr); 730076e027SBarry Smith ierr = PetscStrcat(str,((PetscObject)indraw)->type_name);CHKERRQ(ierr); 740076e027SBarry Smith ierr = PetscDrawBoxedString(draw,x,y,PETSC_DRAW_RED,PETSC_DRAW_BLACK,str,NULL,&h);CHKERRQ(ierr); 750076e027SBarry Smith bottom = y - h; 760076e027SBarry Smith ierr = PetscDrawPushCurrentPoint(draw,x,bottom);CHKERRQ(ierr); 77*e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS) 780076e027SBarry Smith } else if (isams) { 790076e027SBarry Smith if (!((PetscObject)indraw)->amsmem) { 80*e04113cfSBarry Smith ierr = PetscObjectViewSAWs((PetscObject)indraw,viewer);CHKERRQ(ierr); 810076e027SBarry Smith } 820076e027SBarry Smith #endif 830076e027SBarry Smith } else if (indraw->ops->view) { 840076e027SBarry Smith ierr = (*indraw->ops->view)(indraw,viewer);CHKERRQ(ierr); 850076e027SBarry Smith } 860076e027SBarry Smith PetscFunctionReturn(0); 870076e027SBarry Smith } 880076e027SBarry Smith 895c6c1daeSBarry Smith #undef __FUNCT__ 905c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawCreate" 915c6c1daeSBarry Smith /*@C 925c6c1daeSBarry Smith PetscDrawCreate - Creates a graphics context. 935c6c1daeSBarry Smith 945c6c1daeSBarry Smith Collective on MPI_Comm 955c6c1daeSBarry Smith 965c6c1daeSBarry Smith Input Parameter: 975c6c1daeSBarry Smith + comm - MPI communicator 985c6c1daeSBarry Smith . display - X display when using X windows 995c6c1daeSBarry Smith . title - optional title added to top of window 1005c6c1daeSBarry Smith . x,y - coordinates of lower left corner of window or PETSC_DECIDE 1015c6c1daeSBarry Smith - w, h - width and height of window or PETSC_DECIDE or PETSC_DRAW_HALF_SIZE, PETSC_DRAW_FULL_SIZE, 1025c6c1daeSBarry Smith or PETSC_DRAW_THIRD_SIZE or PETSC_DRAW_QUARTER_SIZE 1035c6c1daeSBarry Smith 1045c6c1daeSBarry Smith Output Parameter: 1055c6c1daeSBarry Smith . draw - location to put the PetscDraw context 1065c6c1daeSBarry Smith 1075c6c1daeSBarry Smith Level: beginner 1085c6c1daeSBarry Smith 1095c6c1daeSBarry Smith Concepts: graphics^creating context 1105c6c1daeSBarry Smith Concepts: drawing^creating context 1115c6c1daeSBarry Smith 1125c6c1daeSBarry Smith .seealso: PetscDrawSetFromOptions(), PetscDrawDestroy(), PetscDrawSetType() 1135c6c1daeSBarry Smith @*/ 1145c6c1daeSBarry Smith PetscErrorCode PetscDrawCreate(MPI_Comm comm,const char display[],const char title[],int x,int y,int w,int h,PetscDraw *indraw) 1155c6c1daeSBarry Smith { 1165c6c1daeSBarry Smith PetscDraw draw; 1175c6c1daeSBarry Smith PetscErrorCode ierr; 1185c6c1daeSBarry Smith PetscReal dpause; 1195c6c1daeSBarry Smith PetscBool flag; 1205c6c1daeSBarry Smith 1215c6c1daeSBarry Smith PetscFunctionBegin; 122519f805aSKarl Rupp #if !defined(PETSC_USE_DYNAMIC_LIBRARIES) 123607a6623SBarry Smith ierr = PetscDrawInitializePackage();CHKERRQ(ierr); 1245c6c1daeSBarry Smith #endif 1255c6c1daeSBarry Smith *indraw = 0; 1260076e027SBarry Smith ierr = PetscHeaderCreate(draw,_p_PetscDraw,struct _PetscDrawOps,PETSC_DRAW_CLASSID,"Draw","Graphics","Draw",comm,PetscDrawDestroy,PetscDrawView);CHKERRQ(ierr); 127a297a907SKarl Rupp 1285c6c1daeSBarry Smith draw->data = 0; 1295c6c1daeSBarry Smith ierr = PetscStrallocpy(title,&draw->title);CHKERRQ(ierr); 1305c6c1daeSBarry Smith ierr = PetscStrallocpy(display,&draw->display);CHKERRQ(ierr); 1315c6c1daeSBarry Smith draw->x = x; 1325c6c1daeSBarry Smith draw->y = y; 1335c6c1daeSBarry Smith draw->w = w; 1345c6c1daeSBarry Smith draw->h = h; 1355c6c1daeSBarry Smith draw->pause = 0.0; 1365c6c1daeSBarry Smith draw->coor_xl = 0.0; 1375c6c1daeSBarry Smith draw->coor_xr = 1.0; 1385c6c1daeSBarry Smith draw->coor_yl = 0.0; 1395c6c1daeSBarry Smith draw->coor_yr = 1.0; 1405c6c1daeSBarry Smith draw->port_xl = 0.0; 1415c6c1daeSBarry Smith draw->port_xr = 1.0; 1425c6c1daeSBarry Smith draw->port_yl = 0.0; 1435c6c1daeSBarry Smith draw->port_yr = 1.0; 1445c6c1daeSBarry Smith draw->popup = 0; 145a297a907SKarl Rupp 1460298fd71SBarry Smith ierr = PetscOptionsGetReal(NULL,"-draw_pause",&dpause,&flag);CHKERRQ(ierr); 1475c6c1daeSBarry Smith if (flag) draw->pause = dpause; 1480298fd71SBarry Smith draw->savefilename = NULL; 1495c6c1daeSBarry Smith draw->savefilemovie = PETSC_FALSE; 1505c6c1daeSBarry Smith draw->savefilecount = -1; 151a297a907SKarl Rupp 1525c6c1daeSBarry Smith ierr = PetscDrawSetCurrentPoint(draw,.5,.9);CHKERRQ(ierr); 153a297a907SKarl Rupp 1545c6c1daeSBarry Smith draw->boundbox_xl = .5; 1555c6c1daeSBarry Smith draw->boundbox_xr = .5; 1565c6c1daeSBarry Smith draw->boundbox_yl = .9; 1575c6c1daeSBarry Smith draw->boundbox_yr = .9; 1585c6c1daeSBarry Smith 1595c6c1daeSBarry Smith *indraw = draw; 1605c6c1daeSBarry Smith PetscFunctionReturn(0); 1615c6c1daeSBarry Smith } 1625c6c1daeSBarry Smith 1635c6c1daeSBarry Smith #undef __FUNCT__ 1645c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawSetType" 1655c6c1daeSBarry Smith /*@C 1665c6c1daeSBarry Smith PetscDrawSetType - Builds graphics object for a particular implementation 1675c6c1daeSBarry Smith 1685c6c1daeSBarry Smith Collective on PetscDraw 1695c6c1daeSBarry Smith 1705c6c1daeSBarry Smith Input Parameter: 1715c6c1daeSBarry Smith + draw - the graphics context 1725c6c1daeSBarry Smith - type - for example, PETSC_DRAW_X 1735c6c1daeSBarry Smith 1745c6c1daeSBarry Smith Options Database Command: 1755c6c1daeSBarry Smith . -draw_type <type> - Sets the type; use -help for a list 1765c6c1daeSBarry Smith of available methods (for instance, x) 1775c6c1daeSBarry Smith 1785c6c1daeSBarry Smith Level: intermediate 1795c6c1daeSBarry Smith 1805c6c1daeSBarry Smith Notes: 1815c6c1daeSBarry Smith See "petsc/include/petscdraw.h" for available methods (for instance, 1825c6c1daeSBarry Smith PETSC_DRAW_X) 1835c6c1daeSBarry Smith 1845c6c1daeSBarry Smith Concepts: drawing^X windows 1855c6c1daeSBarry Smith Concepts: X windows^graphics 1865c6c1daeSBarry Smith Concepts: drawing^Microsoft Windows 1875c6c1daeSBarry Smith 1885c6c1daeSBarry Smith .seealso: PetscDrawSetFromOptions(), PetscDrawCreate(), PetscDrawDestroy() 1895c6c1daeSBarry Smith @*/ 1905c6c1daeSBarry Smith PetscErrorCode PetscDrawSetType(PetscDraw draw,PetscDrawType type) 1915c6c1daeSBarry Smith { 1925c6c1daeSBarry Smith PetscErrorCode ierr,(*r)(PetscDraw); 1935c6c1daeSBarry Smith PetscBool match; 1945c6c1daeSBarry Smith PetscBool flg=PETSC_FALSE; 1955c6c1daeSBarry Smith 1965c6c1daeSBarry Smith PetscFunctionBegin; 1975c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 1985c6c1daeSBarry Smith PetscValidCharPointer(type,2); 1995c6c1daeSBarry Smith 2005c6c1daeSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)draw,type,&match);CHKERRQ(ierr); 2015c6c1daeSBarry Smith if (match) PetscFunctionReturn(0); 2025c6c1daeSBarry Smith 2035c6c1daeSBarry Smith /* User requests no graphics */ 2040298fd71SBarry Smith ierr = PetscOptionsHasName(NULL,"-nox",&flg);CHKERRQ(ierr); 2055c6c1daeSBarry Smith 2065c6c1daeSBarry Smith /* 2075c6c1daeSBarry Smith This is not ideal, but it allows codes to continue to run if X graphics 2085c6c1daeSBarry Smith was requested but is not installed on this machine. Mostly this is for 2095c6c1daeSBarry Smith testing. 2105c6c1daeSBarry Smith */ 2115c6c1daeSBarry Smith #if !defined(PETSC_HAVE_X) 2125c6c1daeSBarry Smith if (!flg) { 2135c6c1daeSBarry Smith ierr = PetscStrcmp(type,PETSC_DRAW_X,&match);CHKERRQ(ierr); 2145c6c1daeSBarry Smith if (match) { 2155c6c1daeSBarry Smith PetscBool dontwarn = PETSC_TRUE; 2165c6c1daeSBarry Smith flg = PETSC_TRUE; 2170298fd71SBarry Smith ierr = PetscOptionsHasName(NULL,"-nox_warning",&dontwarn);CHKERRQ(ierr); 218a297a907SKarl Rupp if (!dontwarn) (*PetscErrorPrintf)("PETSc installed without X windows on this machine\nproceeding without graphics\n"); 2195c6c1daeSBarry Smith } 2205c6c1daeSBarry Smith } 2215c6c1daeSBarry Smith #endif 222a297a907SKarl Rupp if (flg) type = PETSC_DRAW_NULL; 2235c6c1daeSBarry Smith 2245c6c1daeSBarry Smith if (draw->data) { 2255c6c1daeSBarry Smith /* destroy the old private PetscDraw context */ 2265c6c1daeSBarry Smith ierr = (*draw->ops->destroy)(draw);CHKERRQ(ierr); 2270298fd71SBarry Smith draw->ops->destroy = NULL; 2285c6c1daeSBarry Smith draw->data = 0; 2295c6c1daeSBarry Smith } 2305c6c1daeSBarry Smith 2311c9cd337SJed Brown ierr = PetscFunctionListFind(PetscDrawList,type,&r);CHKERRQ(ierr); 2325c6c1daeSBarry Smith if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown PetscDraw type given: %s",type); 2335c6c1daeSBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)draw,type);CHKERRQ(ierr); 2345c6c1daeSBarry Smith draw->data = 0; 2355c6c1daeSBarry Smith ierr = (*r)(draw);CHKERRQ(ierr); 2365c6c1daeSBarry Smith PetscFunctionReturn(0); 2375c6c1daeSBarry Smith } 2385c6c1daeSBarry Smith 2395c6c1daeSBarry Smith #undef __FUNCT__ 2405c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawGetType" 2415c6c1daeSBarry Smith /*@C 2425c6c1daeSBarry Smith PetscDrawGetType - Gets the PetscDraw type as a string from the PetscDraw object. 2435c6c1daeSBarry Smith 2445c6c1daeSBarry Smith Not Collective 2455c6c1daeSBarry Smith 2465c6c1daeSBarry Smith Input Parameter: 2475c6c1daeSBarry Smith . draw - Krylov context 2485c6c1daeSBarry Smith 2495c6c1daeSBarry Smith Output Parameters: 2505c6c1daeSBarry Smith . name - name of PetscDraw method 2515c6c1daeSBarry Smith 2525c6c1daeSBarry Smith Level: advanced 2535c6c1daeSBarry Smith 2545c6c1daeSBarry Smith @*/ 2555c6c1daeSBarry Smith PetscErrorCode PetscDrawGetType(PetscDraw draw,PetscDrawType *type) 2565c6c1daeSBarry Smith { 2575c6c1daeSBarry Smith PetscFunctionBegin; 2585c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 2595c6c1daeSBarry Smith PetscValidPointer(type,2); 2605c6c1daeSBarry Smith *type = ((PetscObject)draw)->type_name; 2615c6c1daeSBarry Smith PetscFunctionReturn(0); 2625c6c1daeSBarry Smith } 2635c6c1daeSBarry Smith 2645c6c1daeSBarry Smith #undef __FUNCT__ 2655c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawRegister" 266607a6623SBarry Smith /*@C 2671c84c290SBarry Smith PetscDrawRegister - Adds a method to the graphics package. 2681c84c290SBarry Smith 2691c84c290SBarry Smith Not Collective 2701c84c290SBarry Smith 2711c84c290SBarry Smith Input Parameters: 2720076e027SBarry Smith + name_solver - name of a new user-defined graphics class 2731c84c290SBarry Smith - routine_create - routine to create method context 2741c84c290SBarry Smith 2751c84c290SBarry Smith Level: developer 2761c84c290SBarry Smith 2771c84c290SBarry Smith Notes: 2780076e027SBarry Smith PetscDrawRegister() may be called multiple times to add several user-defined graphics classes 2791c84c290SBarry Smith 2801c84c290SBarry Smith Sample usage: 2811c84c290SBarry Smith .vb 282bdf89e91SBarry Smith PetscDrawRegister("my_draw_type", MyDrawCreate); 2831c84c290SBarry Smith .ve 2841c84c290SBarry Smith 2850076e027SBarry Smith Then, your specific graphics package can be chosen with the procedural interface via 2861c84c290SBarry Smith $ PetscDrawSetType(ksp,"my_draw_type") 2871c84c290SBarry Smith or at runtime via the option 2881c84c290SBarry Smith $ -draw_type my_draw_type 2891c84c290SBarry Smith 2901c84c290SBarry Smith Concepts: graphics^registering new draw classes 2911c84c290SBarry Smith Concepts: PetscDraw^registering new draw classes 2921c84c290SBarry Smith 2931c84c290SBarry Smith .seealso: PetscDrawRegisterAll(), PetscDrawRegisterDestroy() 2941c84c290SBarry Smith @*/ 295bdf89e91SBarry Smith PetscErrorCode PetscDrawRegister(const char *sname,PetscErrorCode (*function)(PetscDraw)) 2965c6c1daeSBarry Smith { 2975c6c1daeSBarry Smith PetscErrorCode ierr; 2985c6c1daeSBarry Smith 2995c6c1daeSBarry Smith PetscFunctionBegin; 300a240a19fSJed Brown ierr = PetscFunctionListAdd(&PetscDrawList,sname,function);CHKERRQ(ierr); 3015c6c1daeSBarry Smith PetscFunctionReturn(0); 3025c6c1daeSBarry Smith } 3035c6c1daeSBarry Smith 3045c6c1daeSBarry Smith #undef __FUNCT__ 3055c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawSetFromOptions" 3065c6c1daeSBarry Smith /*@ 3075c6c1daeSBarry Smith PetscDrawSetFromOptions - Sets the graphics type from the options database. 3085c6c1daeSBarry Smith Defaults to a PETSc X windows graphics. 3095c6c1daeSBarry Smith 3105c6c1daeSBarry Smith Collective on PetscDraw 3115c6c1daeSBarry Smith 3125c6c1daeSBarry Smith Input Parameter: 3135c6c1daeSBarry Smith . draw - the graphics context 3145c6c1daeSBarry Smith 3155c6c1daeSBarry Smith Options Database Keys: 3165c6c1daeSBarry Smith + -nox - do not use X graphics (ignore graphics calls, but run program correctly) 3175c6c1daeSBarry Smith . -nox_warning - when X windows support is not installed this prevents the warning message 3185c6c1daeSBarry Smith from being printed 3197450148dSBarry Smith . -draw_pause <pause amount> -- -1 indicates wait for mouse input, -2 indicates pause when window is to be destroyed 3205c6c1daeSBarry Smith . -draw_save [optional filename] - (X windows only) saves each image before it is cleared to a file 321a4494fc1SBarry Smith . -draw_save_movie - converts image files to a movie at the end of the run. See PetscDrawSetSave() 3228b7fcac6SBarry Smith . -draw_save_on_flush - saves an image on each flush in addition to each clear 3238b7fcac6SBarry Smith - -draw_save_single_file - saves each new image in the same file, normally each new image is saved in a new file with filename_%d 3245c6c1daeSBarry Smith 3255c6c1daeSBarry Smith Level: intermediate 3265c6c1daeSBarry Smith 3275c6c1daeSBarry Smith Notes: 3285c6c1daeSBarry Smith Must be called after PetscDrawCreate() before the PetscDrawtor is used. 3295c6c1daeSBarry Smith 3305c6c1daeSBarry Smith Concepts: drawing^setting options 3315c6c1daeSBarry Smith Concepts: graphics^setting options 3325c6c1daeSBarry Smith 3335c6c1daeSBarry Smith .seealso: PetscDrawCreate(), PetscDrawSetType(), PetscDrawSetSave() 3345c6c1daeSBarry Smith 3355c6c1daeSBarry Smith @*/ 3365c6c1daeSBarry Smith PetscErrorCode PetscDrawSetFromOptions(PetscDraw draw) 3375c6c1daeSBarry Smith { 3385c6c1daeSBarry Smith PetscErrorCode ierr; 3395c6c1daeSBarry Smith PetscBool flg,nox; 3405c6c1daeSBarry Smith char vtype[256]; 3415c6c1daeSBarry Smith const char *def; 3427450148dSBarry Smith PetscReal dpause; 3435c6c1daeSBarry Smith #if !defined(PETSC_USE_WINDOWS_GRAPHICS) && !defined(PETSC_HAVE_X) 3445c6c1daeSBarry Smith PetscBool warn; 3455c6c1daeSBarry Smith #endif 3460076e027SBarry Smith PetscViewer v2; 3470076e027SBarry Smith PetscViewerFormat format; 3485c6c1daeSBarry Smith 3495c6c1daeSBarry Smith PetscFunctionBegin; 3505c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 3515c6c1daeSBarry Smith 3525c6c1daeSBarry Smith if (!PetscDrawList) { 353607a6623SBarry Smith ierr = PetscDrawRegisterAll();CHKERRQ(ierr); 3545c6c1daeSBarry Smith } 3555c6c1daeSBarry Smith 356a297a907SKarl Rupp if (((PetscObject)draw)->type_name) def = ((PetscObject)draw)->type_name; 357a297a907SKarl Rupp else { 3580298fd71SBarry Smith ierr = PetscOptionsHasName(NULL,"-nox",&nox);CHKERRQ(ierr); 3595c6c1daeSBarry Smith def = PETSC_DRAW_NULL; 3605c6c1daeSBarry Smith #if defined(PETSC_USE_WINDOWS_GRAPHICS) 3615c6c1daeSBarry Smith if (!nox) def = PETSC_DRAW_WIN32; 3625c6c1daeSBarry Smith #elif defined(PETSC_HAVE_X) 3635c6c1daeSBarry Smith if (!nox) def = PETSC_DRAW_X; 3645c6c1daeSBarry Smith #elif defined(PETSC_HAVE_GLUT) 3655c6c1daeSBarry Smith if (!nox) def = PETSC_DRAW_GLUT; 3665c6c1daeSBarry Smith #elif defined(PETSC_HAVE_OPENGLES) 3675c6c1daeSBarry Smith if (!nox) def = PETSC_DRAW_OPENGLES; 3685c6c1daeSBarry Smith #else 3690298fd71SBarry Smith ierr = PetscOptionsHasName(NULL,"-nox_warning",&warn);CHKERRQ(ierr); 370a297a907SKarl Rupp if (!nox && !warn) (*PetscErrorPrintf)("PETSc installed without X windows, Microsoft Graphics, OpenGL ES, or GLUT/OpenGL on this machine\nproceeding without graphics\n"); 3715c6c1daeSBarry Smith #endif 3725c6c1daeSBarry Smith } 3735c6c1daeSBarry Smith ierr = PetscObjectOptionsBegin((PetscObject)draw);CHKERRQ(ierr); 3745c6c1daeSBarry Smith ierr = PetscOptionsList("-draw_type","Type of graphical output","PetscDrawSetType",PetscDrawList,def,vtype,256,&flg);CHKERRQ(ierr); 3755c6c1daeSBarry Smith if (flg) { 3765c6c1daeSBarry Smith ierr = PetscDrawSetType(draw,vtype);CHKERRQ(ierr); 3775c6c1daeSBarry Smith } else if (!((PetscObject)draw)->type_name) { 3785c6c1daeSBarry Smith ierr = PetscDrawSetType(draw,def);CHKERRQ(ierr); 3795c6c1daeSBarry Smith } 3805c6c1daeSBarry Smith ierr = PetscOptionsName("-nox","Run without graphics","None",&nox);CHKERRQ(ierr); 3815c6c1daeSBarry Smith #if defined(PETSC_HAVE_X) 3825c6c1daeSBarry Smith { 3835c6c1daeSBarry Smith char filename[PETSC_MAX_PATH_LEN]; 3845c6c1daeSBarry Smith PetscBool save,movie = PETSC_FALSE; 3850298fd71SBarry Smith ierr = PetscOptionsBool("-draw_save_movie","Make a movie from the images saved (X Windows only)","PetscDrawSetSave",movie,&movie,NULL);CHKERRQ(ierr); 3868b7fcac6SBarry Smith ierr = PetscOptionsBool("-draw_save_single_file","Each new image replaces previous image in file","PetscDrawSetSave",draw->savesinglefile,&draw->savesinglefile,NULL);CHKERRQ(ierr); 3875c6c1daeSBarry Smith ierr = PetscOptionsString("-draw_save","Save graphics to file (X Windows only)","PetscDrawSetSave",filename,filename,PETSC_MAX_PATH_LEN,&save);CHKERRQ(ierr); 3885c6c1daeSBarry Smith if (save) { 3895c6c1daeSBarry Smith ierr = PetscDrawSetSave(draw,filename,movie);CHKERRQ(ierr); 3905c6c1daeSBarry Smith } 391a4494fc1SBarry Smith ierr = PetscOptionsBool("-draw_save_on_flush","Save graphics to file (X Windows only) on each flush","PetscDrawSetSave",draw->saveonflush,&draw->saveonflush,NULL);CHKERRQ(ierr); 3925c6c1daeSBarry Smith } 3935c6c1daeSBarry Smith #endif 3947450148dSBarry Smith ierr = PetscOptionsGetReal(NULL,"-draw_pause",&dpause,&flg);CHKERRQ(ierr); 3957450148dSBarry Smith if (flg) draw->pause = dpause; 3965c6c1daeSBarry Smith 3975c6c1daeSBarry Smith /* process any options handlers added with PetscObjectAddOptionsHandler() */ 3985c6c1daeSBarry Smith ierr = PetscObjectProcessOptionsHandlers((PetscObject)draw);CHKERRQ(ierr); 3990076e027SBarry Smith ierr = PetscOptionsViewer("-draw_view","Display Draw with the viewer","PetscDrawView",&v2,&format,&flg);CHKERRQ(ierr); 4000076e027SBarry Smith if (flg) { 4010076e027SBarry Smith ierr = PetscViewerPushFormat(v2,format);CHKERRQ(ierr); 4020076e027SBarry Smith ierr = PetscDrawView(draw,v2);CHKERRQ(ierr); 4030076e027SBarry Smith ierr = PetscViewerPopFormat(v2);CHKERRQ(ierr); 4040076e027SBarry Smith } 4055c6c1daeSBarry Smith ierr = PetscOptionsEnd();CHKERRQ(ierr); 4065c6c1daeSBarry Smith PetscFunctionReturn(0); 4075c6c1daeSBarry Smith } 4085c6c1daeSBarry Smith 4095c6c1daeSBarry Smith #undef __FUNCT__ 4105c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawSetSave" 4115c6c1daeSBarry Smith /*@C 41299bbeb84SJed Brown PetscDrawSetSave - Saves images produced in a PetscDraw into a file as a Gif file using AfterImage 4135c6c1daeSBarry Smith 4145c6c1daeSBarry Smith Collective on PetscDraw 4155c6c1daeSBarry Smith 4165c6c1daeSBarry Smith Input Parameter: 4175c6c1daeSBarry Smith + draw - the graphics context 4180298fd71SBarry Smith . filename - name of the file, if NULL uses name of draw object 4195c6c1daeSBarry Smith - movie - produce a movie of all the images 4205c6c1daeSBarry Smith 4215c6c1daeSBarry Smith Options Database Command: 4225c6c1daeSBarry Smith + -draw_save <filename> 4235c6c1daeSBarry Smith - -draw_save_movie 4245c6c1daeSBarry Smith 4255c6c1daeSBarry Smith Level: intermediate 4265c6c1daeSBarry Smith 4275c6c1daeSBarry Smith Concepts: X windows^graphics 4285c6c1daeSBarry Smith 4295c6c1daeSBarry Smith Notes: You should call this BEFORE calling PetscDrawClear() and creating your image. 4305c6c1daeSBarry Smith 4315c6c1daeSBarry Smith 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 4325c6c1daeSBarry Smith 4335c6c1daeSBarry Smith If X windows generates an error message about X_CreateWindow() failing then Afterimage was installed without X windows. Reinstall Afterimage using the 4345c6c1daeSBarry Smith ./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 4355c6c1daeSBarry Smith 4365c6c1daeSBarry Smith 43799bbeb84SJed Brown .seealso: PetscDrawSetFromOptions(), PetscDrawCreate(), PetscDrawDestroy() 4385c6c1daeSBarry Smith @*/ 4395c6c1daeSBarry Smith PetscErrorCode PetscDrawSetSave(PetscDraw draw,const char *filename,PetscBool movie) 4405c6c1daeSBarry Smith { 4415c6c1daeSBarry Smith PetscErrorCode ierr; 4425c6c1daeSBarry Smith 4435c6c1daeSBarry Smith PetscFunctionBegin; 4445c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 4455c6c1daeSBarry Smith ierr = PetscFree(draw->savefilename);CHKERRQ(ierr); 446a297a907SKarl Rupp 4475c6c1daeSBarry Smith draw->savefilemovie = movie; 4485c6c1daeSBarry Smith if (filename && filename[0]) { 4495c6c1daeSBarry Smith ierr = PetscStrallocpy(filename,&draw->savefilename);CHKERRQ(ierr); 4505c6c1daeSBarry Smith } else { 4515c6c1daeSBarry Smith const char *name; 4525c6c1daeSBarry Smith ierr = PetscObjectGetName((PetscObject)draw,&name);CHKERRQ(ierr); 4535c6c1daeSBarry Smith ierr = PetscStrallocpy(name,&draw->savefilename);CHKERRQ(ierr); 4545c6c1daeSBarry Smith } 4555c6c1daeSBarry Smith if (draw->ops->setsave) { 4565c6c1daeSBarry Smith ierr = (*draw->ops->setsave)(draw,filename);CHKERRQ(ierr); 4575c6c1daeSBarry Smith } 4585c6c1daeSBarry Smith PetscFunctionReturn(0); 4595c6c1daeSBarry Smith } 460