xref: /petsc/src/sys/classes/draw/interface/drawreg.c (revision 111ee811d6d6d9be6d32e54c501770a87d0c6b60)
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*/
6*111ee811SBarry Smith #include <petscviewer.h>             /*I "petscviewer.h" I*/
7*111ee811SBarry Smith #if defined(PETSC_HAVE_SAWS)
8*111ee811SBarry Smith #include <petscviewersaws.h>
9*111ee811SBarry 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 
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;
51e04113cfSBarry 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);
62e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
63e04113cfSBarry 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);
77e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
780076e027SBarry Smith   } else if (isams) {
790076e027SBarry Smith     if (!((PetscObject)indraw)->amsmem) {
80e04113cfSBarry 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)
3171cda70a7SBarry Smith .   -nox_warning - when X windows support is not installed this prevents the warning message from being printed
3187450148dSBarry Smith .   -draw_pause <pause amount> -- -1 indicates wait for mouse input, -2 indicates pause when window is to be destroyed
3195c6c1daeSBarry Smith .   -draw_save [optional filename] - (X windows only) saves each image before it is cleared to a file
320a4494fc1SBarry Smith .   -draw_save_movie - converts image files to a movie  at the end of the run. See PetscDrawSetSave()
3218b7fcac6SBarry Smith .   -draw_save_on_flush - saves an image on each flush in addition to each clear
3228b7fcac6SBarry 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
3235c6c1daeSBarry Smith 
3245c6c1daeSBarry Smith    Level: intermediate
3255c6c1daeSBarry Smith 
3265c6c1daeSBarry Smith    Notes:
3275c6c1daeSBarry Smith     Must be called after PetscDrawCreate() before the PetscDrawtor is used.
3285c6c1daeSBarry Smith 
3295c6c1daeSBarry Smith     Concepts: drawing^setting options
3305c6c1daeSBarry Smith     Concepts: graphics^setting options
3315c6c1daeSBarry Smith 
3325c6c1daeSBarry Smith .seealso: PetscDrawCreate(), PetscDrawSetType(), PetscDrawSetSave()
3335c6c1daeSBarry Smith 
3345c6c1daeSBarry Smith @*/
3355c6c1daeSBarry Smith PetscErrorCode  PetscDrawSetFromOptions(PetscDraw draw)
3365c6c1daeSBarry Smith {
3375c6c1daeSBarry Smith   PetscErrorCode    ierr;
3385c6c1daeSBarry Smith   PetscBool         flg,nox;
3395c6c1daeSBarry Smith   char              vtype[256];
3405c6c1daeSBarry Smith   const char        *def;
3417450148dSBarry Smith   PetscReal         dpause;
3425c6c1daeSBarry Smith #if !defined(PETSC_USE_WINDOWS_GRAPHICS) && !defined(PETSC_HAVE_X)
3435c6c1daeSBarry Smith   PetscBool         warn;
3445c6c1daeSBarry Smith #endif
3450076e027SBarry Smith   PetscViewer       v2;
3460076e027SBarry Smith   PetscViewerFormat format;
3475c6c1daeSBarry Smith 
3485c6c1daeSBarry Smith   PetscFunctionBegin;
3495c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
3505c6c1daeSBarry Smith 
3515c6c1daeSBarry Smith   if (!PetscDrawList) {
352607a6623SBarry Smith     ierr = PetscDrawRegisterAll();CHKERRQ(ierr);
3535c6c1daeSBarry Smith   }
3545c6c1daeSBarry Smith 
355a297a907SKarl Rupp   if (((PetscObject)draw)->type_name) def = ((PetscObject)draw)->type_name;
356a297a907SKarl Rupp   else {
3570298fd71SBarry Smith     ierr = PetscOptionsHasName(NULL,"-nox",&nox);CHKERRQ(ierr);
3585c6c1daeSBarry Smith     def  = PETSC_DRAW_NULL;
3595c6c1daeSBarry Smith #if defined(PETSC_USE_WINDOWS_GRAPHICS)
3605c6c1daeSBarry Smith     if (!nox) def = PETSC_DRAW_WIN32;
3615c6c1daeSBarry Smith #elif defined(PETSC_HAVE_X)
3625c6c1daeSBarry Smith     if (!nox) def = PETSC_DRAW_X;
3635c6c1daeSBarry Smith #elif defined(PETSC_HAVE_GLUT)
3645c6c1daeSBarry Smith     if (!nox) def = PETSC_DRAW_GLUT;
3655c6c1daeSBarry Smith #elif defined(PETSC_HAVE_OPENGLES)
3665c6c1daeSBarry Smith     if (!nox) def = PETSC_DRAW_OPENGLES;
3675c6c1daeSBarry Smith #else
3680298fd71SBarry Smith     ierr = PetscOptionsHasName(NULL,"-nox_warning",&warn);CHKERRQ(ierr);
369a297a907SKarl Rupp     if (!nox && !warn) (*PetscErrorPrintf)("PETSc installed without X windows, Microsoft Graphics, OpenGL ES, or GLUT/OpenGL on this machine\nproceeding without graphics\n");
3705c6c1daeSBarry Smith #endif
3715c6c1daeSBarry Smith   }
3725c6c1daeSBarry Smith   ierr = PetscObjectOptionsBegin((PetscObject)draw);CHKERRQ(ierr);
3735c6c1daeSBarry Smith   ierr = PetscOptionsList("-draw_type","Type of graphical output","PetscDrawSetType",PetscDrawList,def,vtype,256,&flg);CHKERRQ(ierr);
3745c6c1daeSBarry Smith   if (flg) {
3755c6c1daeSBarry Smith     ierr = PetscDrawSetType(draw,vtype);CHKERRQ(ierr);
3765c6c1daeSBarry Smith   } else if (!((PetscObject)draw)->type_name) {
3775c6c1daeSBarry Smith     ierr = PetscDrawSetType(draw,def);CHKERRQ(ierr);
3785c6c1daeSBarry Smith   }
3795c6c1daeSBarry Smith   ierr = PetscOptionsName("-nox","Run without graphics","None",&nox);CHKERRQ(ierr);
3805c6c1daeSBarry Smith #if defined(PETSC_HAVE_X)
3815c6c1daeSBarry Smith   {
3825c6c1daeSBarry Smith     char      filename[PETSC_MAX_PATH_LEN];
3835c6c1daeSBarry Smith     PetscBool save,movie = PETSC_FALSE;
3840298fd71SBarry Smith     ierr = PetscOptionsBool("-draw_save_movie","Make a movie from the images saved (X Windows only)","PetscDrawSetSave",movie,&movie,NULL);CHKERRQ(ierr);
3858b7fcac6SBarry Smith     ierr = PetscOptionsBool("-draw_save_single_file","Each new image replaces previous image in file","PetscDrawSetSave",draw->savesinglefile,&draw->savesinglefile,NULL);CHKERRQ(ierr);
3865c6c1daeSBarry Smith     ierr = PetscOptionsString("-draw_save","Save graphics to file (X Windows only)","PetscDrawSetSave",filename,filename,PETSC_MAX_PATH_LEN,&save);CHKERRQ(ierr);
3875c6c1daeSBarry Smith     if (save) {
3885c6c1daeSBarry Smith       ierr = PetscDrawSetSave(draw,filename,movie);CHKERRQ(ierr);
3895c6c1daeSBarry Smith     }
390a4494fc1SBarry 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);
3915c6c1daeSBarry Smith   }
3925c6c1daeSBarry Smith #endif
3937450148dSBarry Smith   ierr = PetscOptionsGetReal(NULL,"-draw_pause",&dpause,&flg);CHKERRQ(ierr);
3947450148dSBarry Smith   if (flg) draw->pause = dpause;
3955c6c1daeSBarry Smith 
3965c6c1daeSBarry Smith   /* process any options handlers added with PetscObjectAddOptionsHandler() */
3975c6c1daeSBarry Smith   ierr = PetscObjectProcessOptionsHandlers((PetscObject)draw);CHKERRQ(ierr);
3980076e027SBarry Smith   ierr = PetscOptionsViewer("-draw_view","Display Draw with the viewer","PetscDrawView",&v2,&format,&flg);CHKERRQ(ierr);
3990076e027SBarry Smith   if (flg) {
4000076e027SBarry Smith     ierr = PetscViewerPushFormat(v2,format);CHKERRQ(ierr);
4010076e027SBarry Smith     ierr = PetscDrawView(draw,v2);CHKERRQ(ierr);
4020076e027SBarry Smith     ierr = PetscViewerPopFormat(v2);CHKERRQ(ierr);
4030076e027SBarry Smith   }
4045c6c1daeSBarry Smith   ierr = PetscOptionsEnd();CHKERRQ(ierr);
4055c6c1daeSBarry Smith   PetscFunctionReturn(0);
4065c6c1daeSBarry Smith }
4075c6c1daeSBarry Smith 
4085c6c1daeSBarry Smith #undef __FUNCT__
4095c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawSetSave"
4105c6c1daeSBarry Smith /*@C
41199bbeb84SJed Brown    PetscDrawSetSave - Saves images produced in a PetscDraw into a file as a Gif file using AfterImage
4125c6c1daeSBarry Smith 
4135c6c1daeSBarry Smith    Collective on PetscDraw
4145c6c1daeSBarry Smith 
4155c6c1daeSBarry Smith    Input Parameter:
4165c6c1daeSBarry Smith +  draw      - the graphics context
4170298fd71SBarry Smith .  filename  - name of the file, if NULL uses name of draw object
4185c6c1daeSBarry Smith -  movie - produce a movie of all the images
4195c6c1daeSBarry Smith 
4205c6c1daeSBarry Smith    Options Database Command:
4215c6c1daeSBarry Smith +  -draw_save  <filename>
4225c6c1daeSBarry Smith -  -draw_save_movie
4235c6c1daeSBarry Smith 
4245c6c1daeSBarry Smith    Level: intermediate
4255c6c1daeSBarry Smith 
4265c6c1daeSBarry Smith    Concepts: X windows^graphics
4275c6c1daeSBarry Smith 
4285c6c1daeSBarry Smith    Notes: You should call this BEFORE calling PetscDrawClear() and creating your image.
4295c6c1daeSBarry Smith 
4305c6c1daeSBarry 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
4315c6c1daeSBarry Smith 
4325c6c1daeSBarry Smith    If X windows generates an error message about X_CreateWindow() failing then Afterimage was installed without X windows. Reinstall Afterimage using the
4335c6c1daeSBarry 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
4345c6c1daeSBarry Smith 
4355c6c1daeSBarry Smith 
43699bbeb84SJed Brown .seealso: PetscDrawSetFromOptions(), PetscDrawCreate(), PetscDrawDestroy()
4375c6c1daeSBarry Smith @*/
4385c6c1daeSBarry Smith PetscErrorCode  PetscDrawSetSave(PetscDraw draw,const char *filename,PetscBool movie)
4395c6c1daeSBarry Smith {
4405c6c1daeSBarry Smith   PetscErrorCode ierr;
4415c6c1daeSBarry Smith 
4425c6c1daeSBarry Smith   PetscFunctionBegin;
4435c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
4445c6c1daeSBarry Smith   ierr = PetscFree(draw->savefilename);CHKERRQ(ierr);
445a297a907SKarl Rupp 
4465c6c1daeSBarry Smith   draw->savefilemovie = movie;
4475c6c1daeSBarry Smith   if (filename && filename[0]) {
4485c6c1daeSBarry Smith     ierr = PetscStrallocpy(filename,&draw->savefilename);CHKERRQ(ierr);
4495c6c1daeSBarry Smith   } else {
4505c6c1daeSBarry Smith     const char *name;
4515c6c1daeSBarry Smith     ierr = PetscObjectGetName((PetscObject)draw,&name);CHKERRQ(ierr);
4525c6c1daeSBarry Smith     ierr = PetscStrallocpy(name,&draw->savefilename);CHKERRQ(ierr);
4535c6c1daeSBarry Smith   }
4545c6c1daeSBarry Smith   if (draw->ops->setsave) {
4555c6c1daeSBarry Smith     ierr = (*draw->ops->setsave)(draw,filename);CHKERRQ(ierr);
4565c6c1daeSBarry Smith   }
4575c6c1daeSBarry Smith   PetscFunctionReturn(0);
4585c6c1daeSBarry Smith }
459