xref: /petsc/src/sys/classes/draw/utils/lgc.c (revision 71917b759519de482e858f2e8a03b977bf09ff31)
15c6c1daeSBarry Smith 
25ccc9f3cSMatthew G Knepley #include <petscviewer.h>
3e118a51fSLisandro Dalcin #include <../src/sys/classes/draw/utils/lgimpl.h>  /*I   "petscdraw.h"  I*/
45c6c1daeSBarry Smith PetscClassId PETSC_DRAWLG_CLASSID = 0;
55c6c1daeSBarry Smith 
65c6c1daeSBarry Smith #undef __FUNCT__
75c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGGetAxis"
85c6c1daeSBarry Smith /*@
95c6c1daeSBarry Smith    PetscDrawLGGetAxis - Gets the axis context associated with a line graph.
105c6c1daeSBarry Smith    This is useful if one wants to change some axis property, such as
115c6c1daeSBarry Smith    labels, color, etc. The axis context should not be destroyed by the
125c6c1daeSBarry Smith    application code.
135c6c1daeSBarry Smith 
145c6c1daeSBarry Smith    Not Collective, if PetscDrawLG is parallel then PetscDrawAxis is parallel
155c6c1daeSBarry Smith 
165c6c1daeSBarry Smith    Input Parameter:
175c6c1daeSBarry Smith .  lg - the line graph context
185c6c1daeSBarry Smith 
195c6c1daeSBarry Smith    Output Parameter:
205c6c1daeSBarry Smith .  axis - the axis context
215c6c1daeSBarry Smith 
225c6c1daeSBarry Smith    Level: advanced
235c6c1daeSBarry Smith 
245c6c1daeSBarry Smith @*/
255c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGGetAxis(PetscDrawLG lg,PetscDrawAxis *axis)
265c6c1daeSBarry Smith {
275c6c1daeSBarry Smith   PetscFunctionBegin;
28e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
2945f3bb6eSLisandro Dalcin   PetscValidPointer(axis,2);
305c6c1daeSBarry Smith   *axis = lg->axis;
315c6c1daeSBarry Smith   PetscFunctionReturn(0);
325c6c1daeSBarry Smith }
335c6c1daeSBarry Smith 
345c6c1daeSBarry Smith #undef __FUNCT__
355c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGGetDraw"
365c6c1daeSBarry Smith /*@
375c6c1daeSBarry Smith    PetscDrawLGGetDraw - Gets the draw context associated with a line graph.
385c6c1daeSBarry Smith 
395c6c1daeSBarry Smith    Not Collective, if PetscDrawLG is parallel then PetscDraw is parallel
405c6c1daeSBarry Smith 
415c6c1daeSBarry Smith    Input Parameter:
425c6c1daeSBarry Smith .  lg - the line graph context
435c6c1daeSBarry Smith 
445c6c1daeSBarry Smith    Output Parameter:
455c6c1daeSBarry Smith .  draw - the draw context
465c6c1daeSBarry Smith 
475c6c1daeSBarry Smith    Level: intermediate
485c6c1daeSBarry Smith 
495c6c1daeSBarry Smith @*/
505c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGGetDraw(PetscDrawLG lg,PetscDraw *draw)
515c6c1daeSBarry Smith {
525c6c1daeSBarry Smith   PetscFunctionBegin;
535c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
5445f3bb6eSLisandro Dalcin   PetscValidPointer(draw,2);
555c6c1daeSBarry Smith   *draw = lg->win;
565c6c1daeSBarry Smith   PetscFunctionReturn(0);
575c6c1daeSBarry Smith }
585c6c1daeSBarry Smith 
595c6c1daeSBarry Smith 
605c6c1daeSBarry Smith #undef __FUNCT__
615c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGSPDraw"
625c6c1daeSBarry Smith /*@
635c6c1daeSBarry Smith    PetscDrawLGSPDraw - Redraws a line graph.
645c6c1daeSBarry Smith 
655b399a63SLisandro Dalcin    Collective on PetscDrawLG
665c6c1daeSBarry Smith 
675c6c1daeSBarry Smith    Input Parameter:
685c6c1daeSBarry Smith .  lg - the line graph context
695c6c1daeSBarry Smith 
705c6c1daeSBarry Smith    Level: intermediate
715c6c1daeSBarry Smith 
725c6c1daeSBarry Smith .seealso: PetscDrawLGDraw(), PetscDrawSPDraw()
735c6c1daeSBarry Smith 
745c6c1daeSBarry Smith    Developer Notes: This code cheats and uses the fact that the LG and SP structs are the same
755c6c1daeSBarry Smith 
765c6c1daeSBarry Smith @*/
775c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGSPDraw(PetscDrawLG lg,PetscDrawSP spin)
785c6c1daeSBarry Smith {
795c6c1daeSBarry Smith   PetscDrawLG    sp = (PetscDrawLG)spin;
805c6c1daeSBarry Smith   PetscReal      xmin,xmax,ymin,ymax;
815c6c1daeSBarry Smith   PetscErrorCode ierr;
82e118a51fSLisandro Dalcin   PetscBool      isnull;
83e118a51fSLisandro Dalcin   PetscMPIInt    rank;
84e118a51fSLisandro Dalcin   PetscDraw      draw;
855c6c1daeSBarry Smith 
865c6c1daeSBarry Smith   PetscFunctionBegin;
875c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
885c6c1daeSBarry Smith   PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,2);
895b399a63SLisandro Dalcin   ierr = PetscDrawIsNull(lg->win,&isnull);CHKERRQ(ierr);
90e118a51fSLisandro Dalcin   if (isnull) PetscFunctionReturn(0);
91e118a51fSLisandro Dalcin   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)lg),&rank);CHKERRQ(ierr);
925c6c1daeSBarry Smith 
935b399a63SLisandro Dalcin   draw = lg->win;
94e118a51fSLisandro Dalcin   ierr = PetscDrawCheckResizedWindow(draw);CHKERRQ(ierr);
955b399a63SLisandro Dalcin   ierr = PetscDrawClear(draw);CHKERRQ(ierr);
96e118a51fSLisandro Dalcin 
97e118a51fSLisandro Dalcin   xmin = PetscMin(lg->xmin,sp->xmin); ymin = PetscMin(lg->ymin,sp->ymin);
98e118a51fSLisandro Dalcin   xmax = PetscMax(lg->xmax,sp->xmax); ymax = PetscMax(lg->ymax,sp->ymax);
995c6c1daeSBarry Smith   ierr = PetscDrawAxisSetLimits(lg->axis,xmin,xmax,ymin,ymax);CHKERRQ(ierr);
1005c6c1daeSBarry Smith   ierr = PetscDrawAxisDraw(lg->axis);CHKERRQ(ierr);
1015c6c1daeSBarry Smith 
1025b399a63SLisandro Dalcin   ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
1035c6c1daeSBarry Smith   if (!rank) {
104e118a51fSLisandro Dalcin     int i,j,dim,nopts;
1055c6c1daeSBarry Smith     dim   = lg->dim;
1065c6c1daeSBarry Smith     nopts = lg->nopts;
1075c6c1daeSBarry Smith     for (i=0; i<dim; i++) {
1085c6c1daeSBarry Smith       for (j=1; j<nopts; j++) {
1095c6c1daeSBarry Smith         ierr = PetscDrawLine(draw,lg->x[(j-1)*dim+i],lg->y[(j-1)*dim+i],lg->x[j*dim+i],lg->y[j*dim+i],PETSC_DRAW_BLACK+i);CHKERRQ(ierr);
110b6fe0379SLisandro Dalcin         if (lg->use_markers) {
11178e9f83eSLisandro Dalcin           ierr = PetscDrawMarker(draw,lg->x[j*dim+i],lg->y[j*dim+i],PETSC_DRAW_RED);CHKERRQ(ierr);
1125c6c1daeSBarry Smith         }
1135c6c1daeSBarry Smith       }
1145c6c1daeSBarry Smith     }
1155c6c1daeSBarry Smith     dim   = sp->dim;
1165c6c1daeSBarry Smith     nopts = sp->nopts;
1175c6c1daeSBarry Smith     for (i=0; i<dim; i++) {
1185c6c1daeSBarry Smith       for (j=0; j<nopts; j++) {
11978e9f83eSLisandro Dalcin         ierr = PetscDrawMarker(draw,sp->x[j*dim+i],sp->y[j*dim+i],PETSC_DRAW_RED);CHKERRQ(ierr);
1205c6c1daeSBarry Smith       }
1215c6c1daeSBarry Smith     }
1225c6c1daeSBarry Smith   }
123e118a51fSLisandro Dalcin   ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
1245b399a63SLisandro Dalcin 
1255b399a63SLisandro Dalcin   ierr = PetscDrawFlush(draw);CHKERRQ(ierr);
1265b399a63SLisandro Dalcin   ierr = PetscDrawPause(draw);CHKERRQ(ierr);
1275c6c1daeSBarry Smith   PetscFunctionReturn(0);
1285c6c1daeSBarry Smith }
1295c6c1daeSBarry Smith 
1305c6c1daeSBarry Smith 
1315c6c1daeSBarry Smith #undef __FUNCT__
1325c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGCreate"
1335c6c1daeSBarry Smith /*@
1345c6c1daeSBarry Smith     PetscDrawLGCreate - Creates a line graph data structure.
1355c6c1daeSBarry Smith 
1365b399a63SLisandro Dalcin     Collective on PetscDraw
1375c6c1daeSBarry Smith 
1385c6c1daeSBarry Smith     Input Parameters:
1395c6c1daeSBarry Smith +   draw - the window where the graph will be made.
1405c6c1daeSBarry Smith -   dim - the number of curves which will be drawn
1415c6c1daeSBarry Smith 
1425c6c1daeSBarry Smith     Output Parameters:
143e118a51fSLisandro Dalcin .   outlg - the line graph context
1445c6c1daeSBarry Smith 
1455c6c1daeSBarry Smith     Level: intermediate
1465c6c1daeSBarry Smith 
1475c6c1daeSBarry Smith     Concepts: line graph^creating
1485c6c1daeSBarry Smith 
1495c6c1daeSBarry Smith .seealso:  PetscDrawLGDestroy()
1505c6c1daeSBarry Smith @*/
151e118a51fSLisandro Dalcin PetscErrorCode  PetscDrawLGCreate(PetscDraw draw,PetscInt dim,PetscDrawLG *outlg)
1525c6c1daeSBarry Smith {
1535c6c1daeSBarry Smith   PetscDrawLG    lg;
154e118a51fSLisandro Dalcin   PetscErrorCode ierr;
1555c6c1daeSBarry Smith 
1565c6c1daeSBarry Smith   PetscFunctionBegin;
1575c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
158e118a51fSLisandro Dalcin   PetscValidLogicalCollectiveInt(draw,dim,2);
159e118a51fSLisandro Dalcin   PetscValidPointer(outlg,3);
160e118a51fSLisandro Dalcin 
161*71917b75SLisandro Dalcin   ierr = PetscHeaderCreate(lg,PETSC_DRAWLG_CLASSID,"DrawLG","Line Graph","Draw",PetscObjectComm((PetscObject)draw),PetscDrawLGDestroy,NULL);CHKERRQ(ierr);
162e118a51fSLisandro Dalcin   ierr = PetscLogObjectParent((PetscObject)draw,(PetscObject)lg);CHKERRQ(ierr);
163c2bac407SLisandro Dalcin   ierr = PetscDrawLGSetOptionsPrefix(lg,((PetscObject)draw)->prefix);CHKERRQ(ierr);
164e118a51fSLisandro Dalcin 
165e118a51fSLisandro Dalcin   ierr = PetscObjectReference((PetscObject)draw);CHKERRQ(ierr);
166e118a51fSLisandro Dalcin   lg->win = draw;
167a297a907SKarl Rupp 
16869c83917SLisandro Dalcin   lg->view    = NULL;
16969c83917SLisandro Dalcin   lg->destroy = NULL;
1705c6c1daeSBarry Smith   lg->nopts   = 0;
1715c6c1daeSBarry Smith   lg->dim     = dim;
1725c6c1daeSBarry Smith   lg->xmin    = 1.e20;
1735c6c1daeSBarry Smith   lg->ymin    = 1.e20;
1745c6c1daeSBarry Smith   lg->xmax    = -1.e20;
1755c6c1daeSBarry Smith   lg->ymax    = -1.e20;
176a297a907SKarl Rupp 
177dcca6d9dSJed Brown   ierr = PetscMalloc2(dim*CHUNCKSIZE,&lg->x,dim*CHUNCKSIZE,&lg->y);CHKERRQ(ierr);
1783bb1ff40SBarry Smith   ierr = PetscLogObjectMemory((PetscObject)lg,2*dim*CHUNCKSIZE*sizeof(PetscReal));CHKERRQ(ierr);
179a297a907SKarl Rupp 
1805c6c1daeSBarry Smith   lg->len         = dim*CHUNCKSIZE;
1815c6c1daeSBarry Smith   lg->loc         = 0;
182b6fe0379SLisandro Dalcin   lg->use_markers = PETSC_FALSE;
183a297a907SKarl Rupp 
1845c6c1daeSBarry Smith   ierr = PetscDrawAxisCreate(draw,&lg->axis);CHKERRQ(ierr);
1853bb1ff40SBarry Smith   ierr = PetscLogObjectParent((PetscObject)lg,(PetscObject)lg->axis);CHKERRQ(ierr);
186a297a907SKarl Rupp 
187e118a51fSLisandro Dalcin   *outlg = lg;
1885c6c1daeSBarry Smith   PetscFunctionReturn(0);
1895c6c1daeSBarry Smith }
1905c6c1daeSBarry Smith 
1915c6c1daeSBarry Smith #undef __FUNCT__
1925c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGSetColors"
1935c6c1daeSBarry Smith /*@
1945c6c1daeSBarry Smith    PetscDrawLGSetColors - Sets the color of each line graph drawn
1955c6c1daeSBarry Smith 
1965b399a63SLisandro Dalcin    Logically Collective on PetscDrawLG
1975c6c1daeSBarry Smith 
1985c6c1daeSBarry Smith    Input Parameter:
1995c6c1daeSBarry Smith +  lg - the line graph context.
2005c6c1daeSBarry Smith -  colors - the colors
2015c6c1daeSBarry Smith 
2025c6c1daeSBarry Smith    Level: intermediate
2035c6c1daeSBarry Smith 
2045c6c1daeSBarry Smith    Concepts: line graph^setting number of lines
2055c6c1daeSBarry Smith 
2065c6c1daeSBarry Smith @*/
20745f3bb6eSLisandro Dalcin PetscErrorCode  PetscDrawLGSetColors(PetscDrawLG lg,const int colors[])
2085c6c1daeSBarry Smith {
2095c6c1daeSBarry Smith   PetscErrorCode ierr;
2105c6c1daeSBarry Smith 
2115c6c1daeSBarry Smith   PetscFunctionBegin;
2125c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
21345f3bb6eSLisandro Dalcin   if (lg->dim) PetscValidIntPointer(colors,2);
214e118a51fSLisandro Dalcin 
2155c6c1daeSBarry Smith   ierr = PetscFree(lg->colors);CHKERRQ(ierr);
216785e854fSJed Brown   ierr = PetscMalloc1(lg->dim,&lg->colors);CHKERRQ(ierr);
2175c6c1daeSBarry Smith   ierr = PetscMemcpy(lg->colors,colors,lg->dim*sizeof(int));CHKERRQ(ierr);
2185c6c1daeSBarry Smith   PetscFunctionReturn(0);
2195c6c1daeSBarry Smith }
2205c6c1daeSBarry Smith 
2215c6c1daeSBarry Smith #undef __FUNCT__
2225c6c1daeSBarry Smith #undef __FUNCT__
2235c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGSetLegend"
2245c6c1daeSBarry Smith /*@C
2255c6c1daeSBarry Smith    PetscDrawLGSetLegend - sets the names of each curve plotted
2265c6c1daeSBarry Smith 
2275b399a63SLisandro Dalcin    Logically Collective on PetscDrawLG
2285c6c1daeSBarry Smith 
2295c6c1daeSBarry Smith    Input Parameter:
2305c6c1daeSBarry Smith +  lg - the line graph context.
2315c6c1daeSBarry Smith -  names - the names for each curve
2325c6c1daeSBarry Smith 
2335c6c1daeSBarry Smith    Level: intermediate
2345c6c1daeSBarry Smith 
2355c6c1daeSBarry Smith    Concepts: line graph^setting number of lines
2365c6c1daeSBarry Smith 
2375c6c1daeSBarry Smith @*/
2385c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGSetLegend(PetscDrawLG lg,const char *const *names)
2395c6c1daeSBarry Smith {
2405c6c1daeSBarry Smith   PetscErrorCode ierr;
2415c6c1daeSBarry Smith   PetscInt       i;
2425c6c1daeSBarry Smith 
2435c6c1daeSBarry Smith   PetscFunctionBegin;
2445c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
24545f3bb6eSLisandro Dalcin   if (names) PetscValidPointer(names,2);
2465c6c1daeSBarry Smith 
2475c6c1daeSBarry Smith   if (lg->legend) {
2485c6c1daeSBarry Smith     for (i=0; i<lg->dim; i++) {
2495c6c1daeSBarry Smith       ierr = PetscFree(lg->legend[i]);CHKERRQ(ierr);
2505c6c1daeSBarry Smith     }
2515c6c1daeSBarry Smith     ierr = PetscFree(lg->legend);CHKERRQ(ierr);
2525c6c1daeSBarry Smith   }
2535c6c1daeSBarry Smith   if (names) {
254785e854fSJed Brown     ierr = PetscMalloc1(lg->dim,&lg->legend);CHKERRQ(ierr);
2555c6c1daeSBarry Smith     for (i=0; i<lg->dim; i++) {
2565c6c1daeSBarry Smith       ierr = PetscStrallocpy(names[i],&lg->legend[i]);CHKERRQ(ierr);
2575c6c1daeSBarry Smith     }
2585c6c1daeSBarry Smith   }
2595c6c1daeSBarry Smith   PetscFunctionReturn(0);
2605c6c1daeSBarry Smith }
2615c6c1daeSBarry Smith 
2625c6c1daeSBarry Smith #undef __FUNCT__
2635c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGGetDimension"
2645c6c1daeSBarry Smith /*@
2655c6c1daeSBarry Smith    PetscDrawLGGetDimension - Change the number of lines that are to be drawn.
2665c6c1daeSBarry Smith 
2675b399a63SLisandro Dalcin    Not Collective
2685c6c1daeSBarry Smith 
2695c6c1daeSBarry Smith    Input Parameter:
2705c6c1daeSBarry Smith .  lg - the line graph context.
2715c6c1daeSBarry Smith 
2725c6c1daeSBarry Smith    Output Parameter:
2735c6c1daeSBarry Smith .  dim - the number of curves.
2745c6c1daeSBarry Smith 
2755c6c1daeSBarry Smith    Level: intermediate
2765c6c1daeSBarry Smith 
2775c6c1daeSBarry Smith    Concepts: line graph^setting number of lines
2785c6c1daeSBarry Smith 
2795c6c1daeSBarry Smith @*/
2805c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGGetDimension(PetscDrawLG lg,PetscInt *dim)
2815c6c1daeSBarry Smith {
2825c6c1daeSBarry Smith   PetscFunctionBegin;
2835c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
28445f3bb6eSLisandro Dalcin   PetscValidIntPointer(dim,2);
2855c6c1daeSBarry Smith   *dim = lg->dim;
2865c6c1daeSBarry Smith   PetscFunctionReturn(0);
2875c6c1daeSBarry Smith }
2885c6c1daeSBarry Smith 
2895c6c1daeSBarry Smith #undef __FUNCT__
2905c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGSetDimension"
2915c6c1daeSBarry Smith /*@
2925c6c1daeSBarry Smith    PetscDrawLGSetDimension - Change the number of lines that are to be drawn.
2935c6c1daeSBarry Smith 
2945b399a63SLisandro Dalcin    Logically Collective on PetscDrawLG
2955c6c1daeSBarry Smith 
2965c6c1daeSBarry Smith    Input Parameter:
2975c6c1daeSBarry Smith +  lg - the line graph context.
2985c6c1daeSBarry Smith -  dim - the number of curves.
2995c6c1daeSBarry Smith 
3005c6c1daeSBarry Smith    Level: intermediate
3015c6c1daeSBarry Smith 
3025c6c1daeSBarry Smith    Concepts: line graph^setting number of lines
3035c6c1daeSBarry Smith 
3045c6c1daeSBarry Smith @*/
3055c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGSetDimension(PetscDrawLG lg,PetscInt dim)
3065c6c1daeSBarry Smith {
3075c6c1daeSBarry Smith   PetscErrorCode ierr;
3085c6c1daeSBarry Smith   PetscInt       i;
3095c6c1daeSBarry Smith 
3105c6c1daeSBarry Smith   PetscFunctionBegin;
3115c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
3125c6c1daeSBarry Smith   PetscValidLogicalCollectiveInt(lg,dim,2);
3135c6c1daeSBarry Smith   if (lg->dim == dim) PetscFunctionReturn(0);
3145c6c1daeSBarry Smith 
3155c6c1daeSBarry Smith   ierr = PetscFree2(lg->x,lg->y);CHKERRQ(ierr);
3165c6c1daeSBarry Smith   if (lg->legend) {
3175c6c1daeSBarry Smith     for (i=0; i<lg->dim; i++) {
3185c6c1daeSBarry Smith       ierr = PetscFree(lg->legend[i]);CHKERRQ(ierr);
3195c6c1daeSBarry Smith     }
3205c6c1daeSBarry Smith     ierr = PetscFree(lg->legend);CHKERRQ(ierr);
3215c6c1daeSBarry Smith   }
3225c6c1daeSBarry Smith   ierr    = PetscFree(lg->colors);CHKERRQ(ierr);
3235c6c1daeSBarry Smith   lg->dim = dim;
324dcca6d9dSJed Brown   ierr    = PetscMalloc2(dim*CHUNCKSIZE,&lg->x,dim*CHUNCKSIZE,&lg->y);CHKERRQ(ierr);
3253bb1ff40SBarry Smith   ierr    = PetscLogObjectMemory((PetscObject)lg,2*dim*CHUNCKSIZE*sizeof(PetscReal));CHKERRQ(ierr);
3265c6c1daeSBarry Smith   lg->len = dim*CHUNCKSIZE;
3275c6c1daeSBarry Smith   PetscFunctionReturn(0);
3285c6c1daeSBarry Smith }
3295c6c1daeSBarry Smith 
330*71917b75SLisandro Dalcin 
331*71917b75SLisandro Dalcin #undef __FUNCT__
332*71917b75SLisandro Dalcin #define __FUNCT__ "PetscDrawLGSetLimits"
333*71917b75SLisandro Dalcin /*@
334*71917b75SLisandro Dalcin    PetscDrawLGSetLimits - Sets the axis limits for a line graph. If more
335*71917b75SLisandro Dalcin    points are added after this call, the limits will be adjusted to
336*71917b75SLisandro Dalcin    include those additional points.
337*71917b75SLisandro Dalcin 
338*71917b75SLisandro Dalcin    Logically Collective on PetscDrawLG
339*71917b75SLisandro Dalcin 
340*71917b75SLisandro Dalcin    Input Parameters:
341*71917b75SLisandro Dalcin +  xlg - the line graph context
342*71917b75SLisandro Dalcin -  x_min,x_max,y_min,y_max - the limits
343*71917b75SLisandro Dalcin 
344*71917b75SLisandro Dalcin    Level: intermediate
345*71917b75SLisandro Dalcin 
346*71917b75SLisandro Dalcin    Concepts: line graph^setting axis
347*71917b75SLisandro Dalcin 
348*71917b75SLisandro Dalcin @*/
349*71917b75SLisandro Dalcin PetscErrorCode  PetscDrawLGSetLimits(PetscDrawLG lg,PetscReal x_min,PetscReal x_max,PetscReal y_min,PetscReal y_max)
350*71917b75SLisandro Dalcin {
351*71917b75SLisandro Dalcin   PetscFunctionBegin;
352*71917b75SLisandro Dalcin   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
353*71917b75SLisandro Dalcin 
354*71917b75SLisandro Dalcin   (lg)->xmin = x_min;
355*71917b75SLisandro Dalcin   (lg)->xmax = x_max;
356*71917b75SLisandro Dalcin   (lg)->ymin = y_min;
357*71917b75SLisandro Dalcin   (lg)->ymax = y_max;
358*71917b75SLisandro Dalcin   PetscFunctionReturn(0);
359*71917b75SLisandro Dalcin }
360*71917b75SLisandro Dalcin 
3615c6c1daeSBarry Smith #undef __FUNCT__
3625c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGReset"
3635c6c1daeSBarry Smith /*@
3645c6c1daeSBarry Smith    PetscDrawLGReset - Clears line graph to allow for reuse with new data.
3655c6c1daeSBarry Smith 
3665b399a63SLisandro Dalcin    Logically Collective on PetscDrawLG
3675c6c1daeSBarry Smith 
3685c6c1daeSBarry Smith    Input Parameter:
3695c6c1daeSBarry Smith .  lg - the line graph context.
3705c6c1daeSBarry Smith 
3715c6c1daeSBarry Smith    Level: intermediate
3725c6c1daeSBarry Smith 
3735c6c1daeSBarry Smith    Concepts: line graph^restarting
3745c6c1daeSBarry Smith 
3755c6c1daeSBarry Smith @*/
3765c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGReset(PetscDrawLG lg)
3775c6c1daeSBarry Smith {
3785c6c1daeSBarry Smith   PetscFunctionBegin;
3795c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
3805c6c1daeSBarry Smith   lg->xmin  = 1.e20;
3815c6c1daeSBarry Smith   lg->ymin  = 1.e20;
3825c6c1daeSBarry Smith   lg->xmax  = -1.e20;
3835c6c1daeSBarry Smith   lg->ymax  = -1.e20;
3845c6c1daeSBarry Smith   lg->loc   = 0;
3855c6c1daeSBarry Smith   lg->nopts = 0;
3865c6c1daeSBarry Smith   PetscFunctionReturn(0);
3875c6c1daeSBarry Smith }
3885c6c1daeSBarry Smith 
3895c6c1daeSBarry Smith #undef __FUNCT__
3905c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGDestroy"
3915c6c1daeSBarry Smith /*@
3925c6c1daeSBarry Smith    PetscDrawLGDestroy - Frees all space taken up by line graph data structure.
3935c6c1daeSBarry Smith 
3945b399a63SLisandro Dalcin    Collective on PetscDrawLG
3955c6c1daeSBarry Smith 
3965c6c1daeSBarry Smith    Input Parameter:
3975c6c1daeSBarry Smith .  lg - the line graph context
3985c6c1daeSBarry Smith 
3995c6c1daeSBarry Smith    Level: intermediate
4005c6c1daeSBarry Smith 
4015c6c1daeSBarry Smith .seealso:  PetscDrawLGCreate()
4025c6c1daeSBarry Smith @*/
4035c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGDestroy(PetscDrawLG *lg)
4045c6c1daeSBarry Smith {
4055c6c1daeSBarry Smith   PetscErrorCode ierr;
4065c6c1daeSBarry Smith   PetscInt       i;
4075c6c1daeSBarry Smith 
4085c6c1daeSBarry Smith   PetscFunctionBegin;
4095c6c1daeSBarry Smith   if (!*lg) PetscFunctionReturn(0);
410e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(*lg,PETSC_DRAWLG_CLASSID,1);
411e118a51fSLisandro Dalcin   if (--((PetscObject)(*lg))->refct > 0) {*lg = NULL; PetscFunctionReturn(0);}
4125c6c1daeSBarry Smith 
4135c6c1daeSBarry Smith   if ((*lg)->legend) {
4145c6c1daeSBarry Smith     for (i=0; i<(*lg)->dim; i++) {
4155c6c1daeSBarry Smith       ierr = PetscFree((*lg)->legend[i]);CHKERRQ(ierr);
4165c6c1daeSBarry Smith     }
4175c6c1daeSBarry Smith     ierr = PetscFree((*lg)->legend);CHKERRQ(ierr);
4185c6c1daeSBarry Smith   }
4195c6c1daeSBarry Smith   ierr = PetscFree((*lg)->colors);CHKERRQ(ierr);
4205c6c1daeSBarry Smith   ierr = PetscFree2((*lg)->x,(*lg)->y);CHKERRQ(ierr);
421e118a51fSLisandro Dalcin   ierr = PetscDrawAxisDestroy(&(*lg)->axis);CHKERRQ(ierr);
422e118a51fSLisandro Dalcin   ierr = PetscDrawDestroy(&(*lg)->win);CHKERRQ(ierr);
4235c6c1daeSBarry Smith   ierr = PetscHeaderDestroy(lg);CHKERRQ(ierr);
4245c6c1daeSBarry Smith   PetscFunctionReturn(0);
4255c6c1daeSBarry Smith }
4265c6c1daeSBarry Smith #undef __FUNCT__
427b6fe0379SLisandro Dalcin #define __FUNCT__ "PetscDrawLGSetUseMarkers"
4285c6c1daeSBarry Smith /*@
429b6fe0379SLisandro Dalcin    PetscDrawLGSetUseMarkers - Causes LG to draw a marker for each data-point.
4305c6c1daeSBarry Smith 
4315b399a63SLisandro Dalcin    Logically Collective on PetscDrawLG
4325c6c1daeSBarry Smith 
4335c6c1daeSBarry Smith    Input Parameters:
434287de1a7SBarry Smith +  lg - the linegraph context
435287de1a7SBarry Smith -  flg - should mark each data point
436287de1a7SBarry Smith 
437287de1a7SBarry Smith    Options Database:
438b6fe0379SLisandro Dalcin .  -lg_use_markers  <true,false>
4395c6c1daeSBarry Smith 
4405c6c1daeSBarry Smith    Level: intermediate
4415c6c1daeSBarry Smith 
4425c6c1daeSBarry Smith    Concepts: line graph^showing points
4435c6c1daeSBarry Smith 
4445c6c1daeSBarry Smith @*/
445b6fe0379SLisandro Dalcin PetscErrorCode  PetscDrawLGSetUseMarkers(PetscDrawLG lg,PetscBool flg)
4465c6c1daeSBarry Smith {
4475c6c1daeSBarry Smith   PetscFunctionBegin;
448e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
44945f3bb6eSLisandro Dalcin   PetscValidLogicalCollectiveBool(lg,flg,2);
450b6fe0379SLisandro Dalcin   lg->use_markers = flg;
4515c6c1daeSBarry Smith   PetscFunctionReturn(0);
4525c6c1daeSBarry Smith }
4535c6c1daeSBarry Smith 
4545c6c1daeSBarry Smith #undef __FUNCT__
4555c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGDraw"
4565c6c1daeSBarry Smith /*@
4575c6c1daeSBarry Smith    PetscDrawLGDraw - Redraws a line graph.
4585c6c1daeSBarry Smith 
4595b399a63SLisandro Dalcin    Collective on PetscDrawLG
4605c6c1daeSBarry Smith 
4615c6c1daeSBarry Smith    Input Parameter:
4625c6c1daeSBarry Smith .  lg - the line graph context
4635c6c1daeSBarry Smith 
4645c6c1daeSBarry Smith    Level: intermediate
4655c6c1daeSBarry Smith 
4665c6c1daeSBarry Smith .seealso: PetscDrawSPDraw(), PetscDrawLGSPDraw()
4675c6c1daeSBarry Smith 
4685c6c1daeSBarry Smith @*/
4695c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGDraw(PetscDrawLG lg)
4705c6c1daeSBarry Smith {
471e118a51fSLisandro Dalcin   PetscReal      xmin,xmax,ymin,ymax;
4725c6c1daeSBarry Smith   PetscErrorCode ierr;
473e118a51fSLisandro Dalcin   PetscMPIInt    rank;
474e118a51fSLisandro Dalcin   PetscDraw      draw;
4755c6c1daeSBarry Smith   PetscBool      isnull;
4765c6c1daeSBarry Smith 
4775c6c1daeSBarry Smith   PetscFunctionBegin;
4785c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
4798f69470aSLisandro Dalcin   ierr = PetscDrawIsNull(lg->win,&isnull);CHKERRQ(ierr);
4808f69470aSLisandro Dalcin   if (isnull) PetscFunctionReturn(0);
481e118a51fSLisandro Dalcin   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)lg),&rank);CHKERRQ(ierr);
4825c6c1daeSBarry Smith 
4835b399a63SLisandro Dalcin   draw = lg->win;
4845c6c1daeSBarry Smith   ierr = PetscDrawCheckResizedWindow(draw);CHKERRQ(ierr);
4855b399a63SLisandro Dalcin   ierr = PetscDrawClear(draw);CHKERRQ(ierr);
486e118a51fSLisandro Dalcin 
487e118a51fSLisandro Dalcin   xmin = lg->xmin; xmax = lg->xmax; ymin = lg->ymin; ymax = lg->ymax;
4885c6c1daeSBarry Smith   ierr = PetscDrawAxisSetLimits(lg->axis,xmin,xmax,ymin,ymax);CHKERRQ(ierr);
4895c6c1daeSBarry Smith   ierr = PetscDrawAxisDraw(lg->axis);CHKERRQ(ierr);
4905c6c1daeSBarry Smith 
4915b399a63SLisandro Dalcin   ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
4925c6c1daeSBarry Smith   if (!rank) {
493e118a51fSLisandro Dalcin     int i,j,dim=lg->dim,nopts=lg->nopts,cl;
4945c6c1daeSBarry Smith     for (i=0; i<dim; i++) {
4955c6c1daeSBarry Smith       for (j=1; j<nopts; j++) {
496*71917b75SLisandro Dalcin         cl   = lg->colors ? lg->colors[i] : (PETSC_DRAW_BLACK + i);
4975c6c1daeSBarry Smith         ierr = PetscDrawLine(draw,lg->x[(j-1)*dim+i],lg->y[(j-1)*dim+i],lg->x[j*dim+i],lg->y[j*dim+i],cl);CHKERRQ(ierr);
498*71917b75SLisandro Dalcin         if (lg->use_markers) {ierr = PetscDrawMarker(draw,lg->x[j*dim+i],lg->y[j*dim+i],cl);CHKERRQ(ierr);}
4995c6c1daeSBarry Smith       }
5005c6c1daeSBarry Smith     }
5015c6c1daeSBarry Smith   }
50256a02f31SLisandro Dalcin   if (!rank && lg->legend) {
503e118a51fSLisandro Dalcin     int       i,dim=lg->dim,cl;
5045c6c1daeSBarry Smith     PetscReal xl,yl,xr,yr,tw,th;
505*71917b75SLisandro Dalcin     size_t    slen,len=0;
506*71917b75SLisandro Dalcin     ierr = PetscDrawAxisGetLimits(lg->axis,&xl,&xr,&yl,&yr);CHKERRQ(ierr);
5075c6c1daeSBarry Smith     ierr = PetscDrawStringGetSize(draw,&tw,&th);CHKERRQ(ierr);
5085c6c1daeSBarry Smith     for (i=0; i<dim; i++) {
509*71917b75SLisandro Dalcin       ierr = PetscStrlen(lg->legend[i],&slen);CHKERRQ(ierr);
510*71917b75SLisandro Dalcin       len = PetscMax(len,slen);
5115c6c1daeSBarry Smith     }
512*71917b75SLisandro Dalcin     xr = xr - 1.5*tw; xl = xr - (len + 7)*tw;
513*71917b75SLisandro Dalcin     yr = yr - 1.0*th; yl = yr - (dim + 1)*th;
514*71917b75SLisandro Dalcin     ierr = PetscDrawLine(draw,xl,yl,xr,yl,PETSC_DRAW_BLACK);CHKERRQ(ierr);
515*71917b75SLisandro Dalcin     ierr = PetscDrawLine(draw,xr,yl,xr,yr,PETSC_DRAW_BLACK);CHKERRQ(ierr);
516*71917b75SLisandro Dalcin     ierr = PetscDrawLine(draw,xr,yr,xl,yr,PETSC_DRAW_BLACK);CHKERRQ(ierr);
517*71917b75SLisandro Dalcin     ierr = PetscDrawLine(draw,xl,yr,xl,yl,PETSC_DRAW_BLACK);CHKERRQ(ierr);
5185c6c1daeSBarry Smith     for  (i=0; i<dim; i++) {
519*71917b75SLisandro Dalcin       cl   = lg->colors ? lg->colors[i] : (PETSC_DRAW_BLACK + i);
520*71917b75SLisandro Dalcin       ierr = PetscDrawLine(draw,xl + 1*tw,yr - (i + 1)*th,xl + 5*tw,yr - (i + 1)*th,cl);CHKERRQ(ierr);
521*71917b75SLisandro Dalcin       ierr = PetscDrawString(draw,xl + 6*tw,yr - (i + 1.5)*th,PETSC_DRAW_BLACK,lg->legend[i]);CHKERRQ(ierr);
5225c6c1daeSBarry Smith     }
5235c6c1daeSBarry Smith   }
524e118a51fSLisandro Dalcin   ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
5255b399a63SLisandro Dalcin 
5265b399a63SLisandro Dalcin   ierr = PetscDrawFlush(draw);CHKERRQ(ierr);
527e118a51fSLisandro Dalcin   ierr = PetscDrawPause(draw);CHKERRQ(ierr);
5285c6c1daeSBarry Smith   PetscFunctionReturn(0);
5295c6c1daeSBarry Smith }
5305c6c1daeSBarry Smith 
5315c6c1daeSBarry Smith #undef __FUNCT__
53257fd6651SLisandro Dalcin #define __FUNCT__ "PetscDrawLGSave"
53357fd6651SLisandro Dalcin /*@
53457fd6651SLisandro Dalcin   PetscDrawLGSave - Saves a drawn image
53557fd6651SLisandro Dalcin 
53657fd6651SLisandro Dalcin   Collective on PetscDrawLG
53757fd6651SLisandro Dalcin 
53857fd6651SLisandro Dalcin   Input Parameter:
53957fd6651SLisandro Dalcin . lg - The line graph context
54057fd6651SLisandro Dalcin 
54157fd6651SLisandro Dalcin   Level: intermediate
54257fd6651SLisandro Dalcin 
54357fd6651SLisandro Dalcin   Concepts: line graph^saving
54457fd6651SLisandro Dalcin 
54557fd6651SLisandro Dalcin .seealso:  PetscDrawLGCreate(), PetscDrawLGGetDraw(), PetscDrawSetSave(), PetscDrawSave()
54657fd6651SLisandro Dalcin @*/
54757fd6651SLisandro Dalcin PetscErrorCode  PetscDrawLGSave(PetscDrawLG lg)
54857fd6651SLisandro Dalcin {
54957fd6651SLisandro Dalcin   PetscErrorCode ierr;
55057fd6651SLisandro Dalcin 
55157fd6651SLisandro Dalcin   PetscFunctionBegin;
55257fd6651SLisandro Dalcin   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
55357fd6651SLisandro Dalcin   ierr = PetscDrawSave(lg->win);CHKERRQ(ierr);
55457fd6651SLisandro Dalcin   PetscFunctionReturn(0);
55557fd6651SLisandro Dalcin }
55657fd6651SLisandro Dalcin 
55757fd6651SLisandro Dalcin #undef __FUNCT__
55834a5a0e3SBarry Smith #define __FUNCT__ "PetscDrawLGView"
5595c6c1daeSBarry Smith /*@
56034a5a0e3SBarry Smith   PetscDrawLGView - Prints a line graph.
5615c6c1daeSBarry Smith 
5625b399a63SLisandro Dalcin   Collective on PetscDrawLG
5635c6c1daeSBarry Smith 
5645c6c1daeSBarry Smith   Input Parameter:
5655c6c1daeSBarry Smith . lg - the line graph context
5665c6c1daeSBarry Smith 
5675c6c1daeSBarry Smith   Level: beginner
5685c6c1daeSBarry Smith 
5695c6c1daeSBarry Smith .keywords:  draw, line, graph
5705c6c1daeSBarry Smith @*/
57134a5a0e3SBarry Smith PetscErrorCode  PetscDrawLGView(PetscDrawLG lg,PetscViewer viewer)
5725c6c1daeSBarry Smith {
5735c6c1daeSBarry Smith   PetscReal      xmin=lg->xmin, xmax=lg->xmax, ymin=lg->ymin, ymax=lg->ymax;
57434a5a0e3SBarry Smith   PetscInt       i, j, dim = lg->dim, nopts = lg->nopts;
57534a5a0e3SBarry Smith   PetscErrorCode ierr;
5765c6c1daeSBarry Smith 
5775c6c1daeSBarry Smith   PetscFunctionBegin;
5785c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
579e118a51fSLisandro Dalcin 
5805c6c1daeSBarry Smith   if (nopts < 1)                  PetscFunctionReturn(0);
5815c6c1daeSBarry Smith   if (xmin > xmax || ymin > ymax) PetscFunctionReturn(0);
5825c6c1daeSBarry Smith 
58334a5a0e3SBarry Smith   if (!viewer){
58434a5a0e3SBarry Smith     ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)lg),&viewer);CHKERRQ(ierr);
58534a5a0e3SBarry Smith   }
58698c3331eSBarry Smith   ierr = PetscObjectPrintClassNamePrefixType((PetscObject)lg,viewer);CHKERRQ(ierr);
5875c6c1daeSBarry Smith   for (i = 0; i < dim; i++) {
58834a5a0e3SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer, "Line %D>\n", i);CHKERRQ(ierr);
5895c6c1daeSBarry Smith     for (j = 0; j < nopts; j++) {
59034a5a0e3SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer, "  X: %g Y: %g\n", (double)lg->x[j*dim+i], (double)lg->y[j*dim+i]);CHKERRQ(ierr);
5915c6c1daeSBarry Smith     }
5925c6c1daeSBarry Smith   }
5935c6c1daeSBarry Smith   PetscFunctionReturn(0);
5945c6c1daeSBarry Smith }
595287de1a7SBarry Smith 
596287de1a7SBarry Smith #undef __FUNCT__
597c2bac407SLisandro Dalcin #define __FUNCT__ "PetscDrawLGSetOptionsPrefix"
598c2bac407SLisandro Dalcin /*@C
599c2bac407SLisandro Dalcin    PetscDrawLGSetOptionsPrefix - Sets the prefix used for searching for all
600c2bac407SLisandro Dalcin    PetscDrawLG options in the database.
601c2bac407SLisandro Dalcin 
602c2bac407SLisandro Dalcin    Logically Collective on PetscDrawLG
603c2bac407SLisandro Dalcin 
604c2bac407SLisandro Dalcin    Input Parameter:
605c2bac407SLisandro Dalcin +  lg - the line graph context
606c2bac407SLisandro Dalcin -  prefix - the prefix to prepend to all option names
607c2bac407SLisandro Dalcin 
608c2bac407SLisandro Dalcin    Level: advanced
609c2bac407SLisandro Dalcin 
610c2bac407SLisandro Dalcin .keywords: PetscDrawLG, set, options, prefix, database
611c2bac407SLisandro Dalcin 
612c2bac407SLisandro Dalcin .seealso: PetscDrawLGSetFromOptions()
613c2bac407SLisandro Dalcin @*/
614c2bac407SLisandro Dalcin PetscErrorCode  PetscDrawLGSetOptionsPrefix(PetscDrawLG lg,const char prefix[])
615c2bac407SLisandro Dalcin {
616c2bac407SLisandro Dalcin   PetscErrorCode ierr;
617c2bac407SLisandro Dalcin 
618c2bac407SLisandro Dalcin   PetscFunctionBegin;
619c2bac407SLisandro Dalcin   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
620c2bac407SLisandro Dalcin   ierr = PetscObjectSetOptionsPrefix((PetscObject)lg,prefix);CHKERRQ(ierr);
621c2bac407SLisandro Dalcin   PetscFunctionReturn(0);
622c2bac407SLisandro Dalcin }
623c2bac407SLisandro Dalcin 
624c2bac407SLisandro Dalcin #undef __FUNCT__
625287de1a7SBarry Smith #define __FUNCT__ "PetscDrawLGSetFromOptions"
626287de1a7SBarry Smith /*@
627287de1a7SBarry Smith     PetscDrawLGSetFromOptions - Sets options related to the PetscDrawLG
628287de1a7SBarry Smith 
6295b399a63SLisandro Dalcin     Collective on PetscDrawLG
630287de1a7SBarry Smith 
631287de1a7SBarry Smith     Options Database:
632287de1a7SBarry Smith 
633287de1a7SBarry Smith     Level: intermediate
634287de1a7SBarry Smith 
635287de1a7SBarry Smith     Concepts: line graph^creating
636287de1a7SBarry Smith 
637287de1a7SBarry Smith .seealso:  PetscDrawLGDestroy(), PetscDrawLGCreate()
638287de1a7SBarry Smith @*/
639287de1a7SBarry Smith PetscErrorCode  PetscDrawLGSetFromOptions(PetscDrawLG lg)
640287de1a7SBarry Smith {
641287de1a7SBarry Smith   PetscErrorCode      ierr;
642*71917b75SLisandro Dalcin   PetscBool           usemarkers,set;
643*71917b75SLisandro Dalcin   PetscDrawMarkerType markertype;
644287de1a7SBarry Smith 
645287de1a7SBarry Smith   PetscFunctionBegin;
646e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
647e118a51fSLisandro Dalcin 
648*71917b75SLisandro Dalcin   ierr = PetscDrawGetMarkerType(lg->win,&markertype);CHKERRQ(ierr);
649*71917b75SLisandro Dalcin   ierr = PetscOptionsGetEnum(((PetscObject)lg)->options,((PetscObject)lg)->prefix,"-lg_marker_type",PetscDrawMarkerTypes,(PetscEnum*)&markertype,&set);CHKERRQ(ierr);
650*71917b75SLisandro Dalcin   if (set) {
651*71917b75SLisandro Dalcin     ierr = PetscDrawLGSetUseMarkers(lg,PETSC_TRUE);CHKERRQ(ierr);
652*71917b75SLisandro Dalcin     ierr = PetscDrawSetMarkerType(lg->win,markertype);CHKERRQ(ierr);
653*71917b75SLisandro Dalcin   }
654*71917b75SLisandro Dalcin   usemarkers = lg->use_markers;
655*71917b75SLisandro Dalcin   ierr = PetscOptionsGetBool(((PetscObject)lg)->options,((PetscObject)lg)->prefix,"-lg_use_markers",&usemarkers,&set);CHKERRQ(ierr);
656*71917b75SLisandro Dalcin   if (set) {ierr = PetscDrawLGSetUseMarkers(lg,usemarkers);CHKERRQ(ierr);}
657287de1a7SBarry Smith   PetscFunctionReturn(0);
658287de1a7SBarry Smith }
659