xref: /petsc/src/sys/classes/draw/interface/drawreg.c (revision 21fcc2dd6bc1ebf375bce21e8740a4d99e126a8d) !
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 /*@C
170076e027SBarry Smith    PetscDrawView - Prints the PetscDraw data structure.
180076e027SBarry Smith 
190076e027SBarry Smith    Collective on PetscDraw
200076e027SBarry Smith 
210076e027SBarry Smith    Input Parameters:
220076e027SBarry Smith +  indraw - the PetscDraw context
230076e027SBarry Smith -  viewer - visualization context
240076e027SBarry Smith 
25236f5a4dSBarry Smith    See PetscDrawSetFromOptions() for options database keys
260076e027SBarry Smith 
270076e027SBarry Smith    Note:
280076e027SBarry Smith    The available visualization contexts include
290076e027SBarry Smith +     PETSC_VIEWER_STDOUT_SELF - standard output (default)
300076e027SBarry Smith -     PETSC_VIEWER_STDOUT_WORLD - synchronized standard
310076e027SBarry Smith          output where only the first processor opens
320076e027SBarry Smith          the file.  All other processors send their
330076e027SBarry Smith          data to the first processor to print.
340076e027SBarry Smith 
350076e027SBarry Smith    The user can open an alternative visualization context with
360076e027SBarry Smith    PetscViewerASCIIOpen() - output to a specified file.
370076e027SBarry Smith 
380076e027SBarry Smith    Level: beginner
390076e027SBarry Smith 
400076e027SBarry Smith .keywords: PetscDraw, view
410076e027SBarry Smith 
420076e027SBarry Smith .seealso: PCView(), PetscViewerASCIIOpen()
430076e027SBarry Smith @*/
440076e027SBarry Smith PetscErrorCode  PetscDrawView(PetscDraw indraw,PetscViewer viewer)
450076e027SBarry Smith {
460076e027SBarry Smith   PetscErrorCode ierr;
470076e027SBarry Smith   PetscBool      isdraw;
48e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
49536b137fSBarry Smith   PetscBool      issaws;
500076e027SBarry Smith #endif
510076e027SBarry Smith 
520076e027SBarry Smith   PetscFunctionBegin;
530076e027SBarry Smith   PetscValidHeaderSpecific(indraw,PETSC_DRAW_CLASSID,1);
54f55353a2SBarry Smith   if (!viewer) {
55f55353a2SBarry Smith     ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)indraw),&viewer);CHKERRQ(ierr);
56f55353a2SBarry Smith   }
570076e027SBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
580076e027SBarry Smith   PetscCheckSameComm(indraw,1,viewer,2);
590076e027SBarry Smith 
6098c3331eSBarry Smith   ierr = PetscObjectPrintClassNamePrefixType((PetscObject)indraw,viewer);CHKERRQ(ierr);
610076e027SBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr);
62e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
63536b137fSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERSAWS,&issaws);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);
7451fa3d41SBarry Smith     ierr   = PetscDrawStringBoxed(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)
78536b137fSBarry Smith   } else if (issaws) {
79d45a07a7SBarry Smith     PetscMPIInt rank;
80d45a07a7SBarry Smith 
81d45a07a7SBarry Smith     ierr = PetscObjectName((PetscObject)indraw);CHKERRQ(ierr);
82d45a07a7SBarry Smith     ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRQ(ierr);
83d45a07a7SBarry Smith     if (!((PetscObject)indraw)->amsmem && !rank) {
84e04113cfSBarry Smith       ierr = PetscObjectViewSAWs((PetscObject)indraw,viewer);CHKERRQ(ierr);
850076e027SBarry Smith     }
860076e027SBarry Smith #endif
870076e027SBarry Smith   } else if (indraw->ops->view) {
880076e027SBarry Smith     ierr = (*indraw->ops->view)(indraw,viewer);CHKERRQ(ierr);
890076e027SBarry Smith   }
900076e027SBarry Smith   PetscFunctionReturn(0);
910076e027SBarry Smith }
920076e027SBarry Smith 
935c6c1daeSBarry Smith /*@C
945c6c1daeSBarry Smith    PetscDrawCreate - Creates a graphics context.
955c6c1daeSBarry Smith 
965c6c1daeSBarry Smith    Collective on MPI_Comm
975c6c1daeSBarry Smith 
985c6c1daeSBarry Smith    Input Parameter:
995c6c1daeSBarry Smith +  comm - MPI communicator
1005c6c1daeSBarry Smith .  display - X display when using X windows
1015c6c1daeSBarry Smith .  title - optional title added to top of window
1025c6c1daeSBarry Smith .  x,y - coordinates of lower left corner of window or PETSC_DECIDE
1035c6c1daeSBarry Smith -  w, h - width and height of window or PETSC_DECIDE or PETSC_DRAW_HALF_SIZE, PETSC_DRAW_FULL_SIZE,
1045c6c1daeSBarry Smith           or PETSC_DRAW_THIRD_SIZE or PETSC_DRAW_QUARTER_SIZE
1055c6c1daeSBarry Smith 
1065c6c1daeSBarry Smith    Output Parameter:
1075c6c1daeSBarry Smith .  draw - location to put the PetscDraw context
1085c6c1daeSBarry Smith 
1095c6c1daeSBarry Smith    Level: beginner
1105c6c1daeSBarry Smith 
1115c6c1daeSBarry Smith    Concepts: graphics^creating context
1125c6c1daeSBarry Smith    Concepts: drawing^creating context
1135c6c1daeSBarry Smith 
114ba1e01c4SBarry Smith .seealso: PetscDrawSetType(), PetscDrawSetFromOptions(), PetscDrawDestroy(), PetscDrawSetType(), PetscDrawLGCreate(), PetscDrawSPCreate(),
115ba1e01c4SBarry Smith           PetscDrawViewPortsCreate(), PetscDrawViewPortsSet(), PetscDrawAxisCreate(), PetscDrawHGCreate(), PetscDrawBarCreate(),
116ba1e01c4SBarry Smith           PetscViewerDrawGetDraw(), PetscDrawSetFromOptions(), PetscDrawSetSave(), PetscDrawSetSaveMovie(), PetscDrawSetSaveFinalImage(),
117ba1e01c4SBarry Smith           PetscDrawOpenX(), PetscDrawOpenImage(), PetscDrawIsNull(), PetscDrawGetPopup(), PetscDrawCheckResizedWindow(), PetscDrawResizeWindow(),
118ba1e01c4SBarry Smith           PetscDrawGetWindowSize(), PetscDrawLine(), PetscDrawArrow(), PetscDrawLineSetWidth(), PetscDrawLineGetWidth(), PetscDrawMarker(),
119ba1e01c4SBarry Smith           PetscDrawPoint(), PetscDrawRectangle(), PetscDrawTriangle(), PetscDrawEllipse(), PetscDrawString(), PetscDrawStringCentered(),
120*21fcc2ddSBarry Smith           PetscDrawStringBoxed(), PetscDrawStringBoxed(), PetscDrawStringVertical(), PetscDrawSetViewPort(), PetscDrawGetViewPort(),
121ba1e01c4SBarry Smith           PetscDrawSplitViewPort(), PetscDrawSetTitle(), PetscDrawAppendTitle(), PetscDrawGetTitle(), PetscDrawSetPause(), PetscDrawGetPause(),
122ba1e01c4SBarry Smith           PetscDrawPause(), PetscDrawSetDoubleBuffer(), PetscDrawClear(), PetscDrawFlush(), PetscDrawGetSingleton(), PetscDrawGetMouseButton(),
123ba1e01c4SBarry Smith           PetscDrawZoom(), PetscDrawGetBoundingBox()
124ba1e01c4SBarry Smith 
1255c6c1daeSBarry Smith @*/
1265c6c1daeSBarry Smith PetscErrorCode  PetscDrawCreate(MPI_Comm comm,const char display[],const char title[],int x,int y,int w,int h,PetscDraw *indraw)
1275c6c1daeSBarry Smith {
1285c6c1daeSBarry Smith   PetscDraw      draw;
1295c6c1daeSBarry Smith   PetscErrorCode ierr;
130e118a51fSLisandro Dalcin   PetscReal      dpause = 0.0;
1315c6c1daeSBarry Smith   PetscBool      flag;
1325c6c1daeSBarry Smith 
1335c6c1daeSBarry Smith   PetscFunctionBegin;
134607a6623SBarry Smith   ierr = PetscDrawInitializePackage();CHKERRQ(ierr);
1355c6c1daeSBarry Smith   *indraw = 0;
13673107ff1SLisandro Dalcin   ierr = PetscHeaderCreate(draw,PETSC_DRAW_CLASSID,"Draw","Graphics","Draw",comm,PetscDrawDestroy,PetscDrawView);CHKERRQ(ierr);
137a297a907SKarl Rupp 
1388f69470aSLisandro Dalcin   draw->data    = NULL;
1395c6c1daeSBarry Smith   ierr          = PetscStrallocpy(display,&draw->display);CHKERRQ(ierr);
140815f00f0SLisandro Dalcin   ierr          = PetscStrallocpy(title,&draw->title);CHKERRQ(ierr);
1415c6c1daeSBarry Smith   draw->x       = x;
1425c6c1daeSBarry Smith   draw->y       = y;
1435c6c1daeSBarry Smith   draw->w       = w;
1445c6c1daeSBarry Smith   draw->h       = h;
1455c6c1daeSBarry Smith   draw->pause   = 0.0;
1465c6c1daeSBarry Smith   draw->coor_xl = 0.0;
1475c6c1daeSBarry Smith   draw->coor_xr = 1.0;
1485c6c1daeSBarry Smith   draw->coor_yl = 0.0;
1495c6c1daeSBarry Smith   draw->coor_yr = 1.0;
1505c6c1daeSBarry Smith   draw->port_xl = 0.0;
1515c6c1daeSBarry Smith   draw->port_xr = 1.0;
1525c6c1daeSBarry Smith   draw->port_yl = 0.0;
1535c6c1daeSBarry Smith   draw->port_yr = 1.0;
154e118a51fSLisandro Dalcin   draw->popup   = NULL;
155a297a907SKarl Rupp 
156c5929fdfSBarry Smith   ierr = PetscOptionsGetReal(NULL,NULL,"-draw_pause",&dpause,&flag);CHKERRQ(ierr);
1575c6c1daeSBarry Smith   if (flag) draw->pause = dpause;
1588067a7d5SLisandro Dalcin 
1590298fd71SBarry Smith   draw->savefilename   = NULL;
1608067a7d5SLisandro Dalcin   draw->saveimageext   = NULL;
1618067a7d5SLisandro Dalcin   draw->savemovieext   = NULL;
1625b399a63SLisandro Dalcin   draw->savefilecount  = 0;
1638067a7d5SLisandro Dalcin   draw->savesinglefile = PETSC_FALSE;
1643d242201SLisandro Dalcin   draw->savemoviefps   = PETSC_DECIDE;
165a297a907SKarl Rupp 
1665c6c1daeSBarry Smith   ierr = PetscDrawSetCurrentPoint(draw,.5,.9);CHKERRQ(ierr);
167a297a907SKarl Rupp 
1685c6c1daeSBarry Smith   draw->boundbox_xl  = .5;
1695c6c1daeSBarry Smith   draw->boundbox_xr  = .5;
1705c6c1daeSBarry Smith   draw->boundbox_yl  = .9;
1715c6c1daeSBarry Smith   draw->boundbox_yr  = .9;
1725c6c1daeSBarry Smith 
1735c6c1daeSBarry Smith   *indraw = draw;
1745c6c1daeSBarry Smith   PetscFunctionReturn(0);
1755c6c1daeSBarry Smith }
1765c6c1daeSBarry Smith 
1775c6c1daeSBarry Smith /*@C
1785c6c1daeSBarry Smith    PetscDrawSetType - Builds graphics object for a particular implementation
1795c6c1daeSBarry Smith 
1805c6c1daeSBarry Smith    Collective on PetscDraw
1815c6c1daeSBarry Smith 
1825c6c1daeSBarry Smith    Input Parameter:
1835c6c1daeSBarry Smith +  draw      - the graphics context
1845c6c1daeSBarry Smith -  type      - for example, PETSC_DRAW_X
1855c6c1daeSBarry Smith 
1865c6c1daeSBarry Smith    Options Database Command:
187236f5a4dSBarry Smith .  -draw_type  <type> - Sets the type; use -help for a list of available methods (for instance, x)
188236f5a4dSBarry Smith 
189ba1e01c4SBarry Smith    See PetscDrawSetFromOptions() for additional options database keys
1905c6c1daeSBarry Smith 
1915c6c1daeSBarry Smith    Level: intermediate
1925c6c1daeSBarry Smith 
1935c6c1daeSBarry Smith    Notes:
1945c6c1daeSBarry Smith    See "petsc/include/petscdraw.h" for available methods (for instance,
195ba1e01c4SBarry Smith    PETSC_DRAW_X, PETSC_DRAW_TIKZ or PETSC_DRAW_IMAGE)
1965c6c1daeSBarry Smith 
1975c6c1daeSBarry Smith    Concepts: drawing^X windows
1985c6c1daeSBarry Smith    Concepts: X windows^graphics
1995c6c1daeSBarry Smith    Concepts: drawing^Microsoft Windows
2005c6c1daeSBarry Smith 
201ba1e01c4SBarry Smith .seealso: PetscDrawSetFromOptions(), PetscDrawCreate(), PetscDrawDestroy(), PetscDrawType
2025c6c1daeSBarry Smith @*/
2035c6c1daeSBarry Smith PetscErrorCode  PetscDrawSetType(PetscDraw draw,PetscDrawType type)
2045c6c1daeSBarry Smith {
2055c6c1daeSBarry Smith   PetscErrorCode ierr,(*r)(PetscDraw);
2065c6c1daeSBarry Smith   PetscBool      match;
2075c6c1daeSBarry Smith   PetscBool      flg=PETSC_FALSE;
2085c6c1daeSBarry Smith 
2095c6c1daeSBarry Smith   PetscFunctionBegin;
2105c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
2115c6c1daeSBarry Smith   PetscValidCharPointer(type,2);
2125c6c1daeSBarry Smith 
2135c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)draw,type,&match);CHKERRQ(ierr);
2145c6c1daeSBarry Smith   if (match) PetscFunctionReturn(0);
2155c6c1daeSBarry Smith 
2165c6c1daeSBarry Smith   /*  User requests no graphics */
217c5929fdfSBarry Smith   ierr = PetscOptionsHasName(((PetscObject)draw)->options,NULL,"-nox",&flg);CHKERRQ(ierr);
2185c6c1daeSBarry Smith 
2195c6c1daeSBarry Smith   /*
2205c6c1daeSBarry Smith      This is not ideal, but it allows codes to continue to run if X graphics
2215c6c1daeSBarry Smith    was requested but is not installed on this machine. Mostly this is for
2225c6c1daeSBarry Smith    testing.
2235c6c1daeSBarry Smith    */
2245c6c1daeSBarry Smith #if !defined(PETSC_HAVE_X)
2255c6c1daeSBarry Smith   if (!flg) {
2265c6c1daeSBarry Smith     ierr = PetscStrcmp(type,PETSC_DRAW_X,&match);CHKERRQ(ierr);
2275c6c1daeSBarry Smith     if (match) {
2285c6c1daeSBarry Smith       PetscBool dontwarn = PETSC_TRUE;
2295c6c1daeSBarry Smith       flg  = PETSC_TRUE;
23076a34f28SBarry Smith       ierr = PetscOptionsHasName(NULL,NULL,"-nox_warning",&dontwarn);CHKERRQ(ierr);
231a297a907SKarl Rupp       if (!dontwarn) (*PetscErrorPrintf)("PETSc installed without X windows on this machine\nproceeding without graphics\n");
2325c6c1daeSBarry Smith     }
2335c6c1daeSBarry Smith   }
2345c6c1daeSBarry Smith #endif
2350b50c7b2SBarry Smith   if (flg) {
236abc0061bSSatish Balay     ierr = PetscOptionsHasName(NULL,NULL,"-draw_double_buffer",NULL);CHKERRQ(ierr);
237abc0061bSSatish Balay     ierr = PetscOptionsHasName(NULL,NULL,"-draw_virtual",NULL);CHKERRQ(ierr);
238abc0061bSSatish Balay     ierr = PetscOptionsHasName(NULL,NULL,"-draw_fast",NULL);CHKERRQ(ierr);
239abc0061bSSatish Balay     ierr = PetscOptionsHasName(NULL,NULL,"-draw_ports",NULL);CHKERRQ(ierr);
240a82f89fdSSatish Balay     ierr = PetscOptionsHasName(NULL,NULL,"-draw_coordinates",NULL);CHKERRQ(ierr);
2410b50c7b2SBarry Smith     ierr = PetscStrcmp(type,"tikz",&flg);CHKERRQ(ierr);
2420b50c7b2SBarry Smith     if (!flg) type = PETSC_DRAW_NULL;
2430b50c7b2SBarry Smith   }
2445c6c1daeSBarry Smith 
2451c9cd337SJed Brown   ierr =  PetscFunctionListFind(PetscDrawList,type,&r);CHKERRQ(ierr);
2465c6c1daeSBarry Smith   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown PetscDraw type given: %s",type);
247618c1b54SLisandro Dalcin   if (draw->ops->destroy) {ierr = (*draw->ops->destroy)(draw);CHKERRQ(ierr);}
248618c1b54SLisandro Dalcin   ierr = PetscMemzero(draw->ops,sizeof(struct _PetscDrawOps));CHKERRQ(ierr);
2495c6c1daeSBarry Smith   ierr = PetscObjectChangeTypeName((PetscObject)draw,type);CHKERRQ(ierr);
2505c6c1daeSBarry Smith   ierr = (*r)(draw);CHKERRQ(ierr);
2515c6c1daeSBarry Smith   PetscFunctionReturn(0);
2525c6c1daeSBarry Smith }
2535c6c1daeSBarry Smith 
2545c6c1daeSBarry Smith /*@C
2555c6c1daeSBarry Smith    PetscDrawGetType - Gets the PetscDraw type as a string from the PetscDraw object.
2565c6c1daeSBarry Smith 
2575c6c1daeSBarry Smith    Not Collective
2585c6c1daeSBarry Smith 
2595c6c1daeSBarry Smith    Input Parameter:
2605c6c1daeSBarry Smith .  draw - Krylov context
2615c6c1daeSBarry Smith 
2625c6c1daeSBarry Smith    Output Parameters:
2635c6c1daeSBarry Smith .  name - name of PetscDraw method
2645c6c1daeSBarry Smith 
2655c6c1daeSBarry Smith    Level: advanced
2665c6c1daeSBarry Smith 
267ba1e01c4SBarry Smith .seealso: PetscDrawSetType(), PetscDrawType
268ba1e01c4SBarry Smith 
2695c6c1daeSBarry Smith @*/
2705c6c1daeSBarry Smith PetscErrorCode  PetscDrawGetType(PetscDraw draw,PetscDrawType *type)
2715c6c1daeSBarry Smith {
2725c6c1daeSBarry Smith   PetscFunctionBegin;
2735c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
2745c6c1daeSBarry Smith   PetscValidPointer(type,2);
2755c6c1daeSBarry Smith   *type = ((PetscObject)draw)->type_name;
2765c6c1daeSBarry Smith   PetscFunctionReturn(0);
2775c6c1daeSBarry Smith }
2785c6c1daeSBarry Smith 
279607a6623SBarry Smith /*@C
2801c84c290SBarry Smith    PetscDrawRegister - Adds a method to the graphics package.
2811c84c290SBarry Smith 
2821c84c290SBarry Smith    Not Collective
2831c84c290SBarry Smith 
2841c84c290SBarry Smith    Input Parameters:
2850076e027SBarry Smith +  name_solver - name of a new user-defined graphics class
2861c84c290SBarry Smith -  routine_create - routine to create method context
2871c84c290SBarry Smith 
2881c84c290SBarry Smith    Level: developer
2891c84c290SBarry Smith 
2901c84c290SBarry Smith    Notes:
2910076e027SBarry Smith    PetscDrawRegister() may be called multiple times to add several user-defined graphics classes
2921c84c290SBarry Smith 
2931c84c290SBarry Smith    Sample usage:
2941c84c290SBarry Smith .vb
295bdf89e91SBarry Smith    PetscDrawRegister("my_draw_type", MyDrawCreate);
2961c84c290SBarry Smith .ve
2971c84c290SBarry Smith 
2980076e027SBarry Smith    Then, your specific graphics package can be chosen with the procedural interface via
2991c84c290SBarry Smith $     PetscDrawSetType(ksp,"my_draw_type")
3001c84c290SBarry Smith    or at runtime via the option
3011c84c290SBarry Smith $     -draw_type my_draw_type
3021c84c290SBarry Smith 
3031c84c290SBarry Smith    Concepts: graphics^registering new draw classes
3041c84c290SBarry Smith    Concepts: PetscDraw^registering new draw classes
3051c84c290SBarry Smith 
306ba1e01c4SBarry Smith .seealso: PetscDrawRegisterAll(), PetscDrawRegisterDestroy(), PetscDrawType, PetscDrawSetType()
3071c84c290SBarry Smith @*/
308bdf89e91SBarry Smith PetscErrorCode  PetscDrawRegister(const char *sname,PetscErrorCode (*function)(PetscDraw))
3095c6c1daeSBarry Smith {
3105c6c1daeSBarry Smith   PetscErrorCode ierr;
3115c6c1daeSBarry Smith 
3125c6c1daeSBarry Smith   PetscFunctionBegin;
313a240a19fSJed Brown   ierr = PetscFunctionListAdd(&PetscDrawList,sname,function);CHKERRQ(ierr);
3145c6c1daeSBarry Smith   PetscFunctionReturn(0);
3155c6c1daeSBarry Smith }
3165c6c1daeSBarry Smith 
3177faeec8aSLisandro Dalcin /*@C
3187faeec8aSLisandro Dalcin    PetscDrawSetOptionsPrefix - Sets the prefix used for searching for all
3197faeec8aSLisandro Dalcin    PetscDraw options in the database.
3207faeec8aSLisandro Dalcin 
3217faeec8aSLisandro Dalcin    Logically Collective on PetscDraw
3227faeec8aSLisandro Dalcin 
3237faeec8aSLisandro Dalcin    Input Parameter:
3247faeec8aSLisandro Dalcin +  draw - the draw context
3257faeec8aSLisandro Dalcin -  prefix - the prefix to prepend to all option names
3267faeec8aSLisandro Dalcin 
3277faeec8aSLisandro Dalcin    Level: advanced
3287faeec8aSLisandro Dalcin 
3297faeec8aSLisandro Dalcin .keywords: PetscDraw, set, options, prefix, database
3307faeec8aSLisandro Dalcin 
331ba1e01c4SBarry Smith .seealso: PetscDrawSetFromOptions(), PetscDrawCreate()
3327faeec8aSLisandro Dalcin @*/
3337faeec8aSLisandro Dalcin PetscErrorCode  PetscDrawSetOptionsPrefix(PetscDraw draw,const char prefix[])
3347faeec8aSLisandro Dalcin {
3357faeec8aSLisandro Dalcin   PetscErrorCode ierr;
3367faeec8aSLisandro Dalcin 
3377faeec8aSLisandro Dalcin   PetscFunctionBegin;
3387faeec8aSLisandro Dalcin   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
3397faeec8aSLisandro Dalcin   ierr = PetscObjectSetOptionsPrefix((PetscObject)draw,prefix);CHKERRQ(ierr);
3407faeec8aSLisandro Dalcin   PetscFunctionReturn(0);
3417faeec8aSLisandro Dalcin }
3427faeec8aSLisandro Dalcin 
3435c6c1daeSBarry Smith /*@
3445c6c1daeSBarry Smith    PetscDrawSetFromOptions - Sets the graphics type from the options database.
3455c6c1daeSBarry Smith       Defaults to a PETSc X windows graphics.
3465c6c1daeSBarry Smith 
3475c6c1daeSBarry Smith    Collective on PetscDraw
3485c6c1daeSBarry Smith 
3495c6c1daeSBarry Smith    Input Parameter:
3505c6c1daeSBarry Smith .     draw - the graphics context
3515c6c1daeSBarry Smith 
3525c6c1daeSBarry Smith    Options Database Keys:
3535c6c1daeSBarry Smith +   -nox - do not use X graphics (ignore graphics calls, but run program correctly)
3541cda70a7SBarry Smith .   -nox_warning - when X windows support is not installed this prevents the warning message from being printed
3557450148dSBarry Smith .   -draw_pause <pause amount> -- -1 indicates wait for mouse input, -2 indicates pause when window is to be destroyed
35673f7a4c5SBarry Smith .   -draw_marker_type - <x,point>
3575c6c1daeSBarry Smith .   -draw_save [optional filename] - (X windows only) saves each image before it is cleared to a file
358287de1a7SBarry Smith .   -draw_save_final_image [optional filename] - (X windows only) saves the final image displayed in a window
359a4494fc1SBarry Smith .   -draw_save_movie - converts image files to a movie  at the end of the run. See PetscDrawSetSave()
360df8d4941SLisandro 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'
361df8d4941SLisandro Dalcin .   -draw_save_on_clear - saves an image on each clear, mainly for debugging
362df8d4941SLisandro Dalcin -   -draw_save_on_flush - saves an image on each flush, mainly for debugging
3635c6c1daeSBarry Smith 
3645c6c1daeSBarry Smith    Level: intermediate
3655c6c1daeSBarry Smith 
3668067a7d5SLisandro Dalcin    Notes: Must be called after PetscDrawCreate() before the PetscDraw is used.
3675c6c1daeSBarry Smith 
3685c6c1daeSBarry Smith    Concepts: drawing^setting options
3695c6c1daeSBarry Smith    Concepts: graphics^setting options
3705c6c1daeSBarry Smith 
371ba1e01c4SBarry Smith .seealso: PetscDrawCreate(), PetscDrawSetType(), PetscDrawSetSave(), PetscDrawSetSaveFinalImage(), PetscDrawPause(), PetscDrawSetPause()
3725c6c1daeSBarry Smith 
3735c6c1daeSBarry Smith @*/
3745c6c1daeSBarry Smith PetscErrorCode  PetscDrawSetFromOptions(PetscDraw draw)
3755c6c1daeSBarry Smith {
3765c6c1daeSBarry Smith   PetscErrorCode    ierr;
3775c6c1daeSBarry Smith   PetscBool         flg,nox;
3785c6c1daeSBarry Smith   char              vtype[256];
3795c6c1daeSBarry Smith   const char        *def;
3805c6c1daeSBarry Smith #if !defined(PETSC_USE_WINDOWS_GRAPHICS) && !defined(PETSC_HAVE_X)
3815c6c1daeSBarry Smith   PetscBool         warn;
3825c6c1daeSBarry Smith #endif
3835c6c1daeSBarry Smith 
3845c6c1daeSBarry Smith   PetscFunctionBegin;
3855c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
3865c6c1daeSBarry Smith 
387607a6623SBarry Smith   ierr = PetscDrawRegisterAll();CHKERRQ(ierr);
3885c6c1daeSBarry Smith 
389a297a907SKarl Rupp   if (((PetscObject)draw)->type_name) def = ((PetscObject)draw)->type_name;
390a297a907SKarl Rupp   else {
391c5929fdfSBarry Smith     ierr = PetscOptionsHasName(((PetscObject)draw)->options,NULL,"-nox",&nox);CHKERRQ(ierr);
3925c6c1daeSBarry Smith     def  = PETSC_DRAW_NULL;
3935c6c1daeSBarry Smith #if defined(PETSC_USE_WINDOWS_GRAPHICS)
3945c6c1daeSBarry Smith     if (!nox) def = PETSC_DRAW_WIN32;
3955c6c1daeSBarry Smith #elif defined(PETSC_HAVE_X)
3965c6c1daeSBarry Smith     if (!nox) def = PETSC_DRAW_X;
3975c6c1daeSBarry Smith #elif defined(PETSC_HAVE_GLUT)
3985c6c1daeSBarry Smith     if (!nox) def = PETSC_DRAW_GLUT;
3995c6c1daeSBarry Smith #elif defined(PETSC_HAVE_OPENGLES)
4005c6c1daeSBarry Smith     if (!nox) def = PETSC_DRAW_OPENGLES;
4015c6c1daeSBarry Smith #else
40276a34f28SBarry Smith     ierr = PetscOptionsHasName(NULL,NULL,"-nox_warning",&warn);CHKERRQ(ierr);
403a297a907SKarl Rupp     if (!nox && !warn) (*PetscErrorPrintf)("PETSc installed without X windows, Microsoft Graphics, OpenGL ES, or GLUT/OpenGL on this machine\nproceeding without graphics\n");
4045c6c1daeSBarry Smith #endif
4055c6c1daeSBarry Smith   }
4065c6c1daeSBarry Smith   ierr = PetscObjectOptionsBegin((PetscObject)draw);CHKERRQ(ierr);
407a264d7a6SBarry Smith   ierr = PetscOptionsFList("-draw_type","Type of graphical output","PetscDrawSetType",PetscDrawList,def,vtype,256,&flg);CHKERRQ(ierr);
4085c6c1daeSBarry Smith   if (flg) {
4095c6c1daeSBarry Smith     ierr = PetscDrawSetType(draw,vtype);CHKERRQ(ierr);
4105c6c1daeSBarry Smith   } else if (!((PetscObject)draw)->type_name) {
4115c6c1daeSBarry Smith     ierr = PetscDrawSetType(draw,def);CHKERRQ(ierr);
4125c6c1daeSBarry Smith   }
4135c6c1daeSBarry Smith   ierr = PetscOptionsName("-nox","Run without graphics","None",&nox);CHKERRQ(ierr);
4145c6c1daeSBarry Smith   {
41549c04938SLisandro Dalcin     char      filename[PETSC_MAX_PATH_LEN];
41649c04938SLisandro Dalcin     char      movieext[32];
41749c04938SLisandro Dalcin     PetscBool image,movie;
41849c04938SLisandro Dalcin     ierr = PetscSNPrintf(filename,sizeof(filename),"%s%s",draw->savefilename?draw->savefilename:"",draw->saveimageext?draw->saveimageext:"");CHKERRQ(ierr);
41949c04938SLisandro Dalcin     ierr = PetscSNPrintf(movieext,sizeof(movieext),"%s",draw->savemovieext?draw->savemovieext:"");CHKERRQ(ierr);
4204f7a95f2SLisandro Dalcin     ierr = PetscOptionsString("-draw_save","Save graphics to image file","PetscDrawSetSave",filename,filename,sizeof(filename),&image);CHKERRQ(ierr);
4214f7a95f2SLisandro Dalcin     ierr = PetscOptionsString("-draw_save_movie","Make a movie from saved images","PetscDrawSetSaveMovie",movieext,movieext,sizeof(movieext),&movie);CHKERRQ(ierr);
422fbfcfee5SBarry Smith     ierr = PetscOptionsInt("-draw_save_movie_fps","Set frames per second in saved movie",PETSC_FUNCTION_NAME,draw->savemoviefps,&draw->savemoviefps,NULL);CHKERRQ(ierr);
423fbfcfee5SBarry Smith     ierr = PetscOptionsBool("-draw_save_single_file","Each new image replaces previous image in file",PETSC_FUNCTION_NAME,draw->savesinglefile,&draw->savesinglefile,NULL);CHKERRQ(ierr);
42449c04938SLisandro Dalcin     if (image) {ierr = PetscDrawSetSave(draw,filename);CHKERRQ(ierr);}
42549c04938SLisandro Dalcin     if (movie) {ierr = PetscDrawSetSaveMovie(draw,movieext);CHKERRQ(ierr);}
4264f7a95f2SLisandro Dalcin     ierr = PetscOptionsString("-draw_save_final_image","Save final graphics to image file","PetscDrawSetSaveFinalImage",filename,filename,sizeof(filename),&image);CHKERRQ(ierr);
42749c04938SLisandro Dalcin     if (image) {ierr = PetscDrawSetSaveFinalImage(draw,filename);CHKERRQ(ierr);}
428fbfcfee5SBarry Smith     ierr = PetscOptionsBool("-draw_save_on_clear","Save graphics to file on each clear",PETSC_FUNCTION_NAME,draw->saveonclear,&draw->saveonclear,NULL);CHKERRQ(ierr);
429fbfcfee5SBarry Smith     ierr = PetscOptionsBool("-draw_save_on_flush","Save graphics to file on each flush",PETSC_FUNCTION_NAME,draw->saveonflush,&draw->saveonflush,NULL);CHKERRQ(ierr);
4305c6c1daeSBarry Smith   }
431e118a51fSLisandro Dalcin   ierr = PetscOptionsReal("-draw_pause","Amount of time that program pauses after plots","PetscDrawSetPause",draw->pause,&draw->pause,NULL);CHKERRQ(ierr);
43273f7a4c5SBarry Smith   ierr = PetscOptionsEnum("-draw_marker_type","Type of marker to use on plots","PetscDrawSetMarkerType",PetscDrawMarkerTypes,(PetscEnum)draw->markertype,(PetscEnum *)&draw->markertype,NULL);CHKERRQ(ierr);
43373f7a4c5SBarry Smith 
4345c6c1daeSBarry Smith   /* process any options handlers added with PetscObjectAddOptionsHandler() */
4350633abcbSJed Brown   ierr = PetscObjectProcessOptionsHandlers(PetscOptionsObject,(PetscObject)draw);CHKERRQ(ierr);
436ce1779c8SBarry Smith 
437ce1779c8SBarry Smith   ierr = PetscDrawViewFromOptions(draw,NULL,"-draw_view");CHKERRQ(ierr);
4385c6c1daeSBarry Smith   ierr = PetscOptionsEnd();CHKERRQ(ierr);
4395c6c1daeSBarry Smith   PetscFunctionReturn(0);
4405c6c1daeSBarry Smith }
441