xref: /petsc/src/sys/classes/draw/interface/drawreg.c (revision e1dfdf8ee4c7821fb66aa2bc5b82c246b72b1bc1)
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 */
1402c9f0b5SLisandro Dalcin PetscFunctionList PetscDrawList = NULL;
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 .seealso: PCView(), PetscViewerASCIIOpen()
410076e027SBarry Smith @*/
420076e027SBarry Smith PetscErrorCode  PetscDrawView(PetscDraw indraw,PetscViewer viewer)
430076e027SBarry Smith {
440076e027SBarry Smith   PetscErrorCode ierr;
450076e027SBarry Smith   PetscBool      isdraw;
46e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
47536b137fSBarry Smith   PetscBool      issaws;
480076e027SBarry Smith #endif
490076e027SBarry Smith 
500076e027SBarry Smith   PetscFunctionBegin;
510076e027SBarry Smith   PetscValidHeaderSpecific(indraw,PETSC_DRAW_CLASSID,1);
52f55353a2SBarry Smith   if (!viewer) {
53f55353a2SBarry Smith     ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)indraw),&viewer);CHKERRQ(ierr);
54f55353a2SBarry Smith   }
550076e027SBarry Smith   PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,2);
560076e027SBarry Smith   PetscCheckSameComm(indraw,1,viewer,2);
570076e027SBarry Smith 
5898c3331eSBarry Smith   ierr = PetscObjectPrintClassNamePrefixType((PetscObject)indraw,viewer);CHKERRQ(ierr);
590076e027SBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr);
60e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
61536b137fSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERSAWS,&issaws);CHKERRQ(ierr);
620076e027SBarry Smith #endif
630076e027SBarry Smith   if (isdraw) {
640076e027SBarry Smith     PetscDraw draw;
650076e027SBarry Smith     char      str[36];
660076e027SBarry Smith     PetscReal x,y,bottom,h;
670076e027SBarry Smith 
680076e027SBarry Smith     ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr);
690076e027SBarry Smith     ierr = PetscDrawGetCurrentPoint(draw,&x,&y);CHKERRQ(ierr);
70a126751eSBarry Smith     ierr   = PetscStrncpy(str,"PetscDraw: ",sizeof(str));CHKERRQ(ierr);
71a126751eSBarry Smith     ierr   = PetscStrlcat(str,((PetscObject)indraw)->type_name,sizeof(str));CHKERRQ(ierr);
7251fa3d41SBarry Smith     ierr   = PetscDrawStringBoxed(draw,x,y,PETSC_DRAW_RED,PETSC_DRAW_BLACK,str,NULL,&h);CHKERRQ(ierr);
730076e027SBarry Smith     bottom = y - h;
740076e027SBarry Smith     ierr = PetscDrawPushCurrentPoint(draw,x,bottom);CHKERRQ(ierr);
75e04113cfSBarry Smith #if defined(PETSC_HAVE_SAWS)
76536b137fSBarry Smith   } else if (issaws) {
77d45a07a7SBarry Smith     PetscMPIInt rank;
78d45a07a7SBarry Smith 
79d45a07a7SBarry Smith     ierr = PetscObjectName((PetscObject)indraw);CHKERRQ(ierr);
80ffc4695bSBarry Smith     ierr = MPI_Comm_rank(PETSC_COMM_WORLD,&rank);CHKERRMPI(ierr);
81dd400576SPatrick Sanan     if (!((PetscObject)indraw)->amsmem && rank == 0) {
82e04113cfSBarry Smith       ierr = PetscObjectViewSAWs((PetscObject)indraw,viewer);CHKERRQ(ierr);
830076e027SBarry Smith     }
840076e027SBarry Smith #endif
850076e027SBarry Smith   } else if (indraw->ops->view) {
860076e027SBarry Smith     ierr = (*indraw->ops->view)(indraw,viewer);CHKERRQ(ierr);
870076e027SBarry Smith   }
880076e027SBarry Smith   PetscFunctionReturn(0);
890076e027SBarry Smith }
900076e027SBarry Smith 
915c6c1daeSBarry Smith /*@C
92fe2efc57SMark    PetscDrawViewFromOptions - View from Options
93fe2efc57SMark 
94fe2efc57SMark    Collective on PetscDraw
95fe2efc57SMark 
96fe2efc57SMark    Input Parameters:
97fe2efc57SMark +  A - the PetscDraw context
98736c3998SJose E. Roman .  obj - Optional object
99736c3998SJose E. Roman -  name - command line option
100fe2efc57SMark 
101fe2efc57SMark    Level: intermediate
102fe2efc57SMark .seealso:  PetscDraw, PetscDrawView, PetscObjectViewFromOptions(), PetscDrawCreate()
103fe2efc57SMark @*/
104fe2efc57SMark PetscErrorCode  PetscDrawViewFromOptions(PetscDraw A,PetscObject obj,const char name[])
105fe2efc57SMark {
106fe2efc57SMark   PetscErrorCode ierr;
107fe2efc57SMark 
108fe2efc57SMark   PetscFunctionBegin;
109fe2efc57SMark   PetscValidHeaderSpecific(A,PETSC_DRAW_CLASSID,1);
110fe2efc57SMark   ierr = PetscObjectViewFromOptions((PetscObject)A,obj,name);CHKERRQ(ierr);
111fe2efc57SMark   PetscFunctionReturn(0);
112fe2efc57SMark }
113fe2efc57SMark 
114fe2efc57SMark /*@C
1155c6c1daeSBarry Smith    PetscDrawCreate - Creates a graphics context.
1165c6c1daeSBarry Smith 
117d083f849SBarry Smith    Collective
1185c6c1daeSBarry Smith 
119d8d19677SJose E. Roman    Input Parameters:
1205c6c1daeSBarry Smith +  comm - MPI communicator
121*e1dfdf8eSBarry Smith .  display - X display when using X Windows
1225c6c1daeSBarry Smith .  title - optional title added to top of window
1235c6c1daeSBarry Smith .  x,y - coordinates of lower left corner of window or PETSC_DECIDE
1245c6c1daeSBarry Smith -  w, h - width and height of window or PETSC_DECIDE or PETSC_DRAW_HALF_SIZE, PETSC_DRAW_FULL_SIZE,
1255c6c1daeSBarry Smith           or PETSC_DRAW_THIRD_SIZE or PETSC_DRAW_QUARTER_SIZE
1265c6c1daeSBarry Smith 
1275c6c1daeSBarry Smith    Output Parameter:
1285c6c1daeSBarry Smith .  draw - location to put the PetscDraw context
1295c6c1daeSBarry Smith 
1305c6c1daeSBarry Smith    Level: beginner
1315c6c1daeSBarry Smith 
132ba1e01c4SBarry Smith .seealso: PetscDrawSetType(), PetscDrawSetFromOptions(), PetscDrawDestroy(), PetscDrawSetType(), PetscDrawLGCreate(), PetscDrawSPCreate(),
133ba1e01c4SBarry Smith           PetscDrawViewPortsCreate(), PetscDrawViewPortsSet(), PetscDrawAxisCreate(), PetscDrawHGCreate(), PetscDrawBarCreate(),
134ba1e01c4SBarry Smith           PetscViewerDrawGetDraw(), PetscDrawSetFromOptions(), PetscDrawSetSave(), PetscDrawSetSaveMovie(), PetscDrawSetSaveFinalImage(),
135ba1e01c4SBarry Smith           PetscDrawOpenX(), PetscDrawOpenImage(), PetscDrawIsNull(), PetscDrawGetPopup(), PetscDrawCheckResizedWindow(), PetscDrawResizeWindow(),
136ba1e01c4SBarry Smith           PetscDrawGetWindowSize(), PetscDrawLine(), PetscDrawArrow(), PetscDrawLineSetWidth(), PetscDrawLineGetWidth(), PetscDrawMarker(),
137ba1e01c4SBarry Smith           PetscDrawPoint(), PetscDrawRectangle(), PetscDrawTriangle(), PetscDrawEllipse(), PetscDrawString(), PetscDrawStringCentered(),
13850d92d24SPierre Jolivet           PetscDrawStringBoxed(), PetscDrawStringVertical(), PetscDrawSetViewPort(), PetscDrawGetViewPort(),
139ba1e01c4SBarry Smith           PetscDrawSplitViewPort(), PetscDrawSetTitle(), PetscDrawAppendTitle(), PetscDrawGetTitle(), PetscDrawSetPause(), PetscDrawGetPause(),
140ba1e01c4SBarry Smith           PetscDrawPause(), PetscDrawSetDoubleBuffer(), PetscDrawClear(), PetscDrawFlush(), PetscDrawGetSingleton(), PetscDrawGetMouseButton(),
141ba1e01c4SBarry Smith           PetscDrawZoom(), PetscDrawGetBoundingBox()
142ba1e01c4SBarry Smith 
1435c6c1daeSBarry Smith @*/
1445c6c1daeSBarry Smith PetscErrorCode  PetscDrawCreate(MPI_Comm comm,const char display[],const char title[],int x,int y,int w,int h,PetscDraw *indraw)
1455c6c1daeSBarry Smith {
1465c6c1daeSBarry Smith   PetscDraw      draw;
1475c6c1daeSBarry Smith   PetscErrorCode ierr;
148e118a51fSLisandro Dalcin   PetscReal      dpause = 0.0;
1495c6c1daeSBarry Smith   PetscBool      flag;
1505c6c1daeSBarry Smith 
1515c6c1daeSBarry Smith   PetscFunctionBegin;
152607a6623SBarry Smith   ierr = PetscDrawInitializePackage();CHKERRQ(ierr);
15302c9f0b5SLisandro Dalcin   *indraw = NULL;
15473107ff1SLisandro Dalcin   ierr = PetscHeaderCreate(draw,PETSC_DRAW_CLASSID,"Draw","Graphics","Draw",comm,PetscDrawDestroy,PetscDrawView);CHKERRQ(ierr);
155a297a907SKarl Rupp 
1568f69470aSLisandro Dalcin   draw->data    = NULL;
1575c6c1daeSBarry Smith   ierr          = PetscStrallocpy(display,&draw->display);CHKERRQ(ierr);
158815f00f0SLisandro Dalcin   ierr          = PetscStrallocpy(title,&draw->title);CHKERRQ(ierr);
1595c6c1daeSBarry Smith   draw->x       = x;
1605c6c1daeSBarry Smith   draw->y       = y;
1615c6c1daeSBarry Smith   draw->w       = w;
1625c6c1daeSBarry Smith   draw->h       = h;
1635c6c1daeSBarry Smith   draw->pause   = 0.0;
1645c6c1daeSBarry Smith   draw->coor_xl = 0.0;
1655c6c1daeSBarry Smith   draw->coor_xr = 1.0;
1665c6c1daeSBarry Smith   draw->coor_yl = 0.0;
1675c6c1daeSBarry Smith   draw->coor_yr = 1.0;
1685c6c1daeSBarry Smith   draw->port_xl = 0.0;
1695c6c1daeSBarry Smith   draw->port_xr = 1.0;
1705c6c1daeSBarry Smith   draw->port_yl = 0.0;
1715c6c1daeSBarry Smith   draw->port_yr = 1.0;
172e118a51fSLisandro Dalcin   draw->popup   = NULL;
173a297a907SKarl Rupp 
174c5929fdfSBarry Smith   ierr = PetscOptionsGetReal(NULL,NULL,"-draw_pause",&dpause,&flag);CHKERRQ(ierr);
1755c6c1daeSBarry Smith   if (flag) draw->pause = dpause;
1768067a7d5SLisandro Dalcin 
1770298fd71SBarry Smith   draw->savefilename   = NULL;
1788067a7d5SLisandro Dalcin   draw->saveimageext   = NULL;
1798067a7d5SLisandro Dalcin   draw->savemovieext   = NULL;
1805b399a63SLisandro Dalcin   draw->savefilecount  = 0;
1818067a7d5SLisandro Dalcin   draw->savesinglefile = PETSC_FALSE;
1823d242201SLisandro Dalcin   draw->savemoviefps   = PETSC_DECIDE;
183a297a907SKarl Rupp 
1845c6c1daeSBarry Smith   ierr = PetscDrawSetCurrentPoint(draw,.5,.9);CHKERRQ(ierr);
185a297a907SKarl Rupp 
1865c6c1daeSBarry Smith   draw->boundbox_xl  = .5;
1875c6c1daeSBarry Smith   draw->boundbox_xr  = .5;
1885c6c1daeSBarry Smith   draw->boundbox_yl  = .9;
1895c6c1daeSBarry Smith   draw->boundbox_yr  = .9;
1905c6c1daeSBarry Smith 
1915c6c1daeSBarry Smith   *indraw = draw;
1925c6c1daeSBarry Smith   PetscFunctionReturn(0);
1935c6c1daeSBarry Smith }
1945c6c1daeSBarry Smith 
1955c6c1daeSBarry Smith /*@C
1965c6c1daeSBarry Smith    PetscDrawSetType - Builds graphics object for a particular implementation
1975c6c1daeSBarry Smith 
1985c6c1daeSBarry Smith    Collective on PetscDraw
1995c6c1daeSBarry Smith 
200d8d19677SJose E. Roman    Input Parameters:
2015c6c1daeSBarry Smith +  draw      - the graphics context
2025c6c1daeSBarry Smith -  type      - for example, PETSC_DRAW_X
2035c6c1daeSBarry Smith 
2045c6c1daeSBarry Smith    Options Database Command:
205236f5a4dSBarry Smith .  -draw_type  <type> - Sets the type; use -help for a list of available methods (for instance, x)
206236f5a4dSBarry Smith 
207ba1e01c4SBarry Smith    See PetscDrawSetFromOptions() for additional options database keys
2085c6c1daeSBarry Smith 
2095c6c1daeSBarry Smith    Level: intermediate
2105c6c1daeSBarry Smith 
2115c6c1daeSBarry Smith    Notes:
2125c6c1daeSBarry Smith    See "petsc/include/petscdraw.h" for available methods (for instance,
213ba1e01c4SBarry Smith    PETSC_DRAW_X, PETSC_DRAW_TIKZ or PETSC_DRAW_IMAGE)
2145c6c1daeSBarry Smith 
215ba1e01c4SBarry Smith .seealso: PetscDrawSetFromOptions(), PetscDrawCreate(), PetscDrawDestroy(), PetscDrawType
2165c6c1daeSBarry Smith @*/
2175c6c1daeSBarry Smith PetscErrorCode  PetscDrawSetType(PetscDraw draw,PetscDrawType type)
2185c6c1daeSBarry Smith {
2195c6c1daeSBarry Smith   PetscErrorCode ierr,(*r)(PetscDraw);
2205c6c1daeSBarry Smith   PetscBool      match;
2215c6c1daeSBarry Smith   PetscBool      flg=PETSC_FALSE;
2225c6c1daeSBarry Smith 
2235c6c1daeSBarry Smith   PetscFunctionBegin;
2245c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
2255c6c1daeSBarry Smith   PetscValidCharPointer(type,2);
2265c6c1daeSBarry Smith 
2275c6c1daeSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)draw,type,&match);CHKERRQ(ierr);
2285c6c1daeSBarry Smith   if (match) PetscFunctionReturn(0);
2295c6c1daeSBarry Smith 
2305c6c1daeSBarry Smith   /*  User requests no graphics */
231c5929fdfSBarry Smith   ierr = PetscOptionsHasName(((PetscObject)draw)->options,NULL,"-nox",&flg);CHKERRQ(ierr);
2325c6c1daeSBarry Smith 
2335c6c1daeSBarry Smith   /*
2345c6c1daeSBarry Smith      This is not ideal, but it allows codes to continue to run if X graphics
2355c6c1daeSBarry Smith    was requested but is not installed on this machine. Mostly this is for
2365c6c1daeSBarry Smith    testing.
2375c6c1daeSBarry Smith    */
2385c6c1daeSBarry Smith #if !defined(PETSC_HAVE_X)
2395c6c1daeSBarry Smith   if (!flg) {
2405c6c1daeSBarry Smith     ierr = PetscStrcmp(type,PETSC_DRAW_X,&match);CHKERRQ(ierr);
2415c6c1daeSBarry Smith     if (match) {
2425c6c1daeSBarry Smith       PetscBool dontwarn = PETSC_TRUE;
2435c6c1daeSBarry Smith       flg  = PETSC_TRUE;
24476a34f28SBarry Smith       ierr = PetscOptionsHasName(NULL,NULL,"-nox_warning",&dontwarn);CHKERRQ(ierr);
245*e1dfdf8eSBarry Smith       if (!dontwarn) (*PetscErrorPrintf)("PETSc installed without X Windows on this machine\nproceeding without graphics\n");
2465c6c1daeSBarry Smith     }
2475c6c1daeSBarry Smith   }
2485c6c1daeSBarry Smith #endif
2490b50c7b2SBarry Smith   if (flg) {
2509c8bf542SScott Kruger     ierr = PetscStrcmp(type,"tikz",&flg);CHKERRQ(ierr);
2519c8bf542SScott Kruger     if (!flg) type = PETSC_DRAW_NULL;
2529c8bf542SScott Kruger   }
2539c8bf542SScott Kruger 
2549c8bf542SScott Kruger   ierr = PetscStrcmp(type,PETSC_DRAW_NULL,&match);CHKERRQ(ierr);
2559c8bf542SScott Kruger   if (match) {
256abc0061bSSatish Balay     ierr = PetscOptionsHasName(NULL,NULL,"-draw_double_buffer",NULL);CHKERRQ(ierr);
257abc0061bSSatish Balay     ierr = PetscOptionsHasName(NULL,NULL,"-draw_virtual",NULL);CHKERRQ(ierr);
258abc0061bSSatish Balay     ierr = PetscOptionsHasName(NULL,NULL,"-draw_fast",NULL);CHKERRQ(ierr);
259abc0061bSSatish Balay     ierr = PetscOptionsHasName(NULL,NULL,"-draw_ports",NULL);CHKERRQ(ierr);
260a82f89fdSSatish Balay     ierr = PetscOptionsHasName(NULL,NULL,"-draw_coordinates",NULL);CHKERRQ(ierr);
2610b50c7b2SBarry Smith   }
2625c6c1daeSBarry Smith 
2631c9cd337SJed Brown   ierr =  PetscFunctionListFind(PetscDrawList,type,&r);CHKERRQ(ierr);
2645c6c1daeSBarry Smith   if (!r) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_ARG_UNKNOWN_TYPE,"Unknown PetscDraw type given: %s",type);
265618c1b54SLisandro Dalcin   if (draw->ops->destroy) {ierr = (*draw->ops->destroy)(draw);CHKERRQ(ierr);}
266618c1b54SLisandro Dalcin   ierr = PetscMemzero(draw->ops,sizeof(struct _PetscDrawOps));CHKERRQ(ierr);
2675c6c1daeSBarry Smith   ierr = PetscObjectChangeTypeName((PetscObject)draw,type);CHKERRQ(ierr);
2685c6c1daeSBarry Smith   ierr = (*r)(draw);CHKERRQ(ierr);
2695c6c1daeSBarry Smith   PetscFunctionReturn(0);
2705c6c1daeSBarry Smith }
2715c6c1daeSBarry Smith 
2725c6c1daeSBarry Smith /*@C
2735c6c1daeSBarry Smith    PetscDrawGetType - Gets the PetscDraw type as a string from the PetscDraw object.
2745c6c1daeSBarry Smith 
2755c6c1daeSBarry Smith    Not Collective
2765c6c1daeSBarry Smith 
2775c6c1daeSBarry Smith    Input Parameter:
2785c6c1daeSBarry Smith .  draw - Krylov context
2795c6c1daeSBarry Smith 
2805c6c1daeSBarry Smith    Output Parameters:
2815c6c1daeSBarry Smith .  name - name of PetscDraw method
2825c6c1daeSBarry Smith 
2835c6c1daeSBarry Smith    Level: advanced
2845c6c1daeSBarry Smith 
285ba1e01c4SBarry Smith .seealso: PetscDrawSetType(), PetscDrawType
286ba1e01c4SBarry Smith 
2875c6c1daeSBarry Smith @*/
2885c6c1daeSBarry Smith PetscErrorCode  PetscDrawGetType(PetscDraw draw,PetscDrawType *type)
2895c6c1daeSBarry Smith {
2905c6c1daeSBarry Smith   PetscFunctionBegin;
2915c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
2925c6c1daeSBarry Smith   PetscValidPointer(type,2);
2935c6c1daeSBarry Smith   *type = ((PetscObject)draw)->type_name;
2945c6c1daeSBarry Smith   PetscFunctionReturn(0);
2955c6c1daeSBarry Smith }
2965c6c1daeSBarry Smith 
297607a6623SBarry Smith /*@C
2981c84c290SBarry Smith    PetscDrawRegister - Adds a method to the graphics package.
2991c84c290SBarry Smith 
3001c84c290SBarry Smith    Not Collective
3011c84c290SBarry Smith 
3021c84c290SBarry Smith    Input Parameters:
3030076e027SBarry Smith +  name_solver - name of a new user-defined graphics class
3041c84c290SBarry Smith -  routine_create - routine to create method context
3051c84c290SBarry Smith 
3061c84c290SBarry Smith    Level: developer
3071c84c290SBarry Smith 
3081c84c290SBarry Smith    Notes:
3090076e027SBarry Smith    PetscDrawRegister() may be called multiple times to add several user-defined graphics classes
3101c84c290SBarry Smith 
3111c84c290SBarry Smith    Sample usage:
3121c84c290SBarry Smith .vb
313bdf89e91SBarry Smith    PetscDrawRegister("my_draw_type", MyDrawCreate);
3141c84c290SBarry Smith .ve
3151c84c290SBarry Smith 
3160076e027SBarry Smith    Then, your specific graphics package can be chosen with the procedural interface via
3171c84c290SBarry Smith $     PetscDrawSetType(ksp,"my_draw_type")
3181c84c290SBarry Smith    or at runtime via the option
3191c84c290SBarry Smith $     -draw_type my_draw_type
3201c84c290SBarry Smith 
321ba1e01c4SBarry Smith .seealso: PetscDrawRegisterAll(), PetscDrawRegisterDestroy(), PetscDrawType, PetscDrawSetType()
3221c84c290SBarry Smith @*/
323bdf89e91SBarry Smith PetscErrorCode  PetscDrawRegister(const char *sname,PetscErrorCode (*function)(PetscDraw))
3245c6c1daeSBarry Smith {
3255c6c1daeSBarry Smith   PetscErrorCode ierr;
3265c6c1daeSBarry Smith 
3275c6c1daeSBarry Smith   PetscFunctionBegin;
3281d36bdfdSBarry Smith   ierr = PetscDrawInitializePackage();CHKERRQ(ierr);
329a240a19fSJed Brown   ierr = PetscFunctionListAdd(&PetscDrawList,sname,function);CHKERRQ(ierr);
3305c6c1daeSBarry Smith   PetscFunctionReturn(0);
3315c6c1daeSBarry Smith }
3325c6c1daeSBarry Smith 
3337faeec8aSLisandro Dalcin /*@C
3347faeec8aSLisandro Dalcin    PetscDrawSetOptionsPrefix - Sets the prefix used for searching for all
3357faeec8aSLisandro Dalcin    PetscDraw options in the database.
3367faeec8aSLisandro Dalcin 
3377faeec8aSLisandro Dalcin    Logically Collective on PetscDraw
3387faeec8aSLisandro Dalcin 
339d8d19677SJose E. Roman    Input Parameters:
3407faeec8aSLisandro Dalcin +  draw - the draw context
3417faeec8aSLisandro Dalcin -  prefix - the prefix to prepend to all option names
3427faeec8aSLisandro Dalcin 
3437faeec8aSLisandro Dalcin    Level: advanced
3447faeec8aSLisandro Dalcin 
345ba1e01c4SBarry Smith .seealso: PetscDrawSetFromOptions(), PetscDrawCreate()
3467faeec8aSLisandro Dalcin @*/
3477faeec8aSLisandro Dalcin PetscErrorCode  PetscDrawSetOptionsPrefix(PetscDraw draw,const char prefix[])
3487faeec8aSLisandro Dalcin {
3497faeec8aSLisandro Dalcin   PetscErrorCode ierr;
3507faeec8aSLisandro Dalcin 
3517faeec8aSLisandro Dalcin   PetscFunctionBegin;
3527faeec8aSLisandro Dalcin   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
3537faeec8aSLisandro Dalcin   ierr = PetscObjectSetOptionsPrefix((PetscObject)draw,prefix);CHKERRQ(ierr);
3547faeec8aSLisandro Dalcin   PetscFunctionReturn(0);
3557faeec8aSLisandro Dalcin }
3567faeec8aSLisandro Dalcin 
3575c6c1daeSBarry Smith /*@
3585c6c1daeSBarry Smith    PetscDrawSetFromOptions - Sets the graphics type from the options database.
359*e1dfdf8eSBarry Smith       Defaults to a PETSc X Windows graphics.
3605c6c1daeSBarry Smith 
3615c6c1daeSBarry Smith    Collective on PetscDraw
3625c6c1daeSBarry Smith 
3635c6c1daeSBarry Smith    Input Parameter:
3645c6c1daeSBarry Smith .     draw - the graphics context
3655c6c1daeSBarry Smith 
3665c6c1daeSBarry Smith    Options Database Keys:
3675c6c1daeSBarry Smith +   -nox - do not use X graphics (ignore graphics calls, but run program correctly)
368*e1dfdf8eSBarry Smith .   -nox_warning - when X Windows support is not installed this prevents the warning message from being printed
3697450148dSBarry Smith .   -draw_pause <pause amount> -- -1 indicates wait for mouse input, -2 indicates pause when window is to be destroyed
37073f7a4c5SBarry Smith .   -draw_marker_type - <x,point>
371*e1dfdf8eSBarry Smith .   -draw_save [optional filename] - (X Windows only) saves each image before it is cleared to a file
372*e1dfdf8eSBarry Smith .   -draw_save_final_image [optional filename] - (X Windows only) saves the final image displayed in a window
373a4494fc1SBarry Smith .   -draw_save_movie - converts image files to a movie  at the end of the run. See PetscDrawSetSave()
374df8d4941SLisandro 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'
375df8d4941SLisandro Dalcin .   -draw_save_on_clear - saves an image on each clear, mainly for debugging
376df8d4941SLisandro Dalcin -   -draw_save_on_flush - saves an image on each flush, mainly for debugging
3775c6c1daeSBarry Smith 
3785c6c1daeSBarry Smith    Level: intermediate
3795c6c1daeSBarry Smith 
38095452b02SPatrick Sanan    Notes:
38195452b02SPatrick Sanan     Must be called after PetscDrawCreate() before the PetscDraw is used.
3825c6c1daeSBarry Smith 
383ba1e01c4SBarry Smith .seealso: PetscDrawCreate(), PetscDrawSetType(), PetscDrawSetSave(), PetscDrawSetSaveFinalImage(), PetscDrawPause(), PetscDrawSetPause()
3845c6c1daeSBarry Smith 
3855c6c1daeSBarry Smith @*/
3865c6c1daeSBarry Smith PetscErrorCode  PetscDrawSetFromOptions(PetscDraw draw)
3875c6c1daeSBarry Smith {
3885c6c1daeSBarry Smith   PetscErrorCode    ierr;
3895c6c1daeSBarry Smith   PetscBool         flg,nox;
3905c6c1daeSBarry Smith   char              vtype[256];
3915c6c1daeSBarry Smith   const char        *def;
3925c6c1daeSBarry Smith #if !defined(PETSC_USE_WINDOWS_GRAPHICS) && !defined(PETSC_HAVE_X)
3935c6c1daeSBarry Smith   PetscBool         warn;
3945c6c1daeSBarry Smith #endif
3955c6c1daeSBarry Smith 
3965c6c1daeSBarry Smith   PetscFunctionBegin;
3975c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
3985c6c1daeSBarry Smith 
399607a6623SBarry Smith   ierr = PetscDrawRegisterAll();CHKERRQ(ierr);
4005c6c1daeSBarry Smith 
401a297a907SKarl Rupp   if (((PetscObject)draw)->type_name) def = ((PetscObject)draw)->type_name;
402a297a907SKarl Rupp   else {
403c5929fdfSBarry Smith     ierr = PetscOptionsHasName(((PetscObject)draw)->options,NULL,"-nox",&nox);CHKERRQ(ierr);
4045c6c1daeSBarry Smith     def  = PETSC_DRAW_NULL;
4055c6c1daeSBarry Smith #if defined(PETSC_USE_WINDOWS_GRAPHICS)
4065c6c1daeSBarry Smith     if (!nox) def = PETSC_DRAW_WIN32;
4075c6c1daeSBarry Smith #elif defined(PETSC_HAVE_X)
4085c6c1daeSBarry Smith     if (!nox) def = PETSC_DRAW_X;
4095c6c1daeSBarry Smith #else
41076a34f28SBarry Smith     ierr = PetscOptionsHasName(NULL,NULL,"-nox_warning",&warn);CHKERRQ(ierr);
411*e1dfdf8eSBarry Smith     if (!nox && !warn) (*PetscErrorPrintf)("PETSc installed without X Windows or Microsoft Graphics on this machine\nproceeding without graphics\n");
4125c6c1daeSBarry Smith #endif
4135c6c1daeSBarry Smith   }
4145c6c1daeSBarry Smith   ierr = PetscObjectOptionsBegin((PetscObject)draw);CHKERRQ(ierr);
415a264d7a6SBarry Smith   ierr = PetscOptionsFList("-draw_type","Type of graphical output","PetscDrawSetType",PetscDrawList,def,vtype,256,&flg);CHKERRQ(ierr);
4165c6c1daeSBarry Smith   if (flg) {
4175c6c1daeSBarry Smith     ierr = PetscDrawSetType(draw,vtype);CHKERRQ(ierr);
4185c6c1daeSBarry Smith   } else if (!((PetscObject)draw)->type_name) {
4195c6c1daeSBarry Smith     ierr = PetscDrawSetType(draw,def);CHKERRQ(ierr);
4205c6c1daeSBarry Smith   }
4215c6c1daeSBarry Smith   ierr = PetscOptionsName("-nox","Run without graphics","None",&nox);CHKERRQ(ierr);
4225c6c1daeSBarry Smith   {
42349c04938SLisandro Dalcin     char      filename[PETSC_MAX_PATH_LEN];
42449c04938SLisandro Dalcin     char      movieext[32];
42549c04938SLisandro Dalcin     PetscBool image,movie;
42649c04938SLisandro Dalcin     ierr = PetscSNPrintf(filename,sizeof(filename),"%s%s",draw->savefilename?draw->savefilename:"",draw->saveimageext?draw->saveimageext:"");CHKERRQ(ierr);
42749c04938SLisandro Dalcin     ierr = PetscSNPrintf(movieext,sizeof(movieext),"%s",draw->savemovieext?draw->savemovieext:"");CHKERRQ(ierr);
4284f7a95f2SLisandro Dalcin     ierr = PetscOptionsString("-draw_save","Save graphics to image file","PetscDrawSetSave",filename,filename,sizeof(filename),&image);CHKERRQ(ierr);
4294f7a95f2SLisandro Dalcin     ierr = PetscOptionsString("-draw_save_movie","Make a movie from saved images","PetscDrawSetSaveMovie",movieext,movieext,sizeof(movieext),&movie);CHKERRQ(ierr);
430fbfcfee5SBarry Smith     ierr = PetscOptionsInt("-draw_save_movie_fps","Set frames per second in saved movie",PETSC_FUNCTION_NAME,draw->savemoviefps,&draw->savemoviefps,NULL);CHKERRQ(ierr);
431fbfcfee5SBarry 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);
43249c04938SLisandro Dalcin     if (image) {ierr = PetscDrawSetSave(draw,filename);CHKERRQ(ierr);}
43349c04938SLisandro Dalcin     if (movie) {ierr = PetscDrawSetSaveMovie(draw,movieext);CHKERRQ(ierr);}
4344f7a95f2SLisandro Dalcin     ierr = PetscOptionsString("-draw_save_final_image","Save final graphics to image file","PetscDrawSetSaveFinalImage",filename,filename,sizeof(filename),&image);CHKERRQ(ierr);
43549c04938SLisandro Dalcin     if (image) {ierr = PetscDrawSetSaveFinalImage(draw,filename);CHKERRQ(ierr);}
436fbfcfee5SBarry Smith     ierr = PetscOptionsBool("-draw_save_on_clear","Save graphics to file on each clear",PETSC_FUNCTION_NAME,draw->saveonclear,&draw->saveonclear,NULL);CHKERRQ(ierr);
437fbfcfee5SBarry Smith     ierr = PetscOptionsBool("-draw_save_on_flush","Save graphics to file on each flush",PETSC_FUNCTION_NAME,draw->saveonflush,&draw->saveonflush,NULL);CHKERRQ(ierr);
4385c6c1daeSBarry Smith   }
439e118a51fSLisandro Dalcin   ierr = PetscOptionsReal("-draw_pause","Amount of time that program pauses after plots","PetscDrawSetPause",draw->pause,&draw->pause,NULL);CHKERRQ(ierr);
44073f7a4c5SBarry Smith   ierr = PetscOptionsEnum("-draw_marker_type","Type of marker to use on plots","PetscDrawSetMarkerType",PetscDrawMarkerTypes,(PetscEnum)draw->markertype,(PetscEnum *)&draw->markertype,NULL);CHKERRQ(ierr);
44173f7a4c5SBarry Smith 
4425c6c1daeSBarry Smith   /* process any options handlers added with PetscObjectAddOptionsHandler() */
4430633abcbSJed Brown   ierr = PetscObjectProcessOptionsHandlers(PetscOptionsObject,(PetscObject)draw);CHKERRQ(ierr);
444ce1779c8SBarry Smith 
445ce1779c8SBarry Smith   ierr = PetscDrawViewFromOptions(draw,NULL,"-draw_view");CHKERRQ(ierr);
4465c6c1daeSBarry Smith   ierr = PetscOptionsEnd();CHKERRQ(ierr);
4475c6c1daeSBarry Smith   PetscFunctionReturn(0);
4485c6c1daeSBarry Smith }
449