xref: /petsc/src/sys/classes/draw/utils/lgc.c (revision 0ed3bfb6ec21ed29e56fd524d353af30e5ebf413)
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 /*@
75c6c1daeSBarry Smith    PetscDrawLGGetAxis - Gets the axis context associated with a line graph.
85c6c1daeSBarry Smith    This is useful if one wants to change some axis property, such as
95c6c1daeSBarry Smith    labels, color, etc. The axis context should not be destroyed by the
105c6c1daeSBarry Smith    application code.
115c6c1daeSBarry Smith 
125c6c1daeSBarry Smith    Not Collective, if PetscDrawLG is parallel then PetscDrawAxis is parallel
135c6c1daeSBarry Smith 
145c6c1daeSBarry Smith    Input Parameter:
155c6c1daeSBarry Smith .  lg - the line graph context
165c6c1daeSBarry Smith 
175c6c1daeSBarry Smith    Output Parameter:
185c6c1daeSBarry Smith .  axis - the axis context
195c6c1daeSBarry Smith 
205c6c1daeSBarry Smith    Level: advanced
215c6c1daeSBarry Smith 
22ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate(), PetscDrawAxis
23ba1e01c4SBarry 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 /*@
355c6c1daeSBarry Smith    PetscDrawLGGetDraw - Gets the draw context associated with a line graph.
365c6c1daeSBarry Smith 
375c6c1daeSBarry Smith    Not Collective, if PetscDrawLG is parallel then PetscDraw is parallel
385c6c1daeSBarry Smith 
395c6c1daeSBarry Smith    Input Parameter:
405c6c1daeSBarry Smith .  lg - the line graph context
415c6c1daeSBarry Smith 
425c6c1daeSBarry Smith    Output Parameter:
435c6c1daeSBarry Smith .  draw - the draw context
445c6c1daeSBarry Smith 
455c6c1daeSBarry Smith    Level: intermediate
465c6c1daeSBarry Smith 
47ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate(), PetscDraw
485c6c1daeSBarry Smith @*/
495c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGGetDraw(PetscDrawLG lg,PetscDraw *draw)
505c6c1daeSBarry Smith {
515c6c1daeSBarry Smith   PetscFunctionBegin;
525c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
5345f3bb6eSLisandro Dalcin   PetscValidPointer(draw,2);
545c6c1daeSBarry Smith   *draw = lg->win;
555c6c1daeSBarry Smith   PetscFunctionReturn(0);
565c6c1daeSBarry Smith }
575c6c1daeSBarry Smith 
585c6c1daeSBarry Smith 
595c6c1daeSBarry Smith /*@
605c6c1daeSBarry Smith    PetscDrawLGSPDraw - Redraws a line graph.
615c6c1daeSBarry Smith 
625b399a63SLisandro Dalcin    Collective on PetscDrawLG
635c6c1daeSBarry Smith 
645c6c1daeSBarry Smith    Input Parameter:
655c6c1daeSBarry Smith .  lg - the line graph context
665c6c1daeSBarry Smith 
675c6c1daeSBarry Smith    Level: intermediate
685c6c1daeSBarry Smith 
695c6c1daeSBarry Smith .seealso: PetscDrawLGDraw(), PetscDrawSPDraw()
705c6c1daeSBarry Smith 
715c6c1daeSBarry Smith    Developer Notes: This code cheats and uses the fact that the LG and SP structs are the same
725c6c1daeSBarry Smith 
735c6c1daeSBarry Smith @*/
745c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGSPDraw(PetscDrawLG lg,PetscDrawSP spin)
755c6c1daeSBarry Smith {
765c6c1daeSBarry Smith   PetscDrawLG    sp = (PetscDrawLG)spin;
775c6c1daeSBarry Smith   PetscReal      xmin,xmax,ymin,ymax;
785c6c1daeSBarry Smith   PetscErrorCode ierr;
79e118a51fSLisandro Dalcin   PetscBool      isnull;
80e118a51fSLisandro Dalcin   PetscMPIInt    rank;
81e118a51fSLisandro Dalcin   PetscDraw      draw;
825c6c1daeSBarry Smith 
835c6c1daeSBarry Smith   PetscFunctionBegin;
845c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
855c6c1daeSBarry Smith   PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,2);
865b399a63SLisandro Dalcin   ierr = PetscDrawIsNull(lg->win,&isnull);CHKERRQ(ierr);
87e118a51fSLisandro Dalcin   if (isnull) PetscFunctionReturn(0);
88e118a51fSLisandro Dalcin   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)lg),&rank);CHKERRQ(ierr);
895c6c1daeSBarry Smith 
905b399a63SLisandro Dalcin   draw = lg->win;
91e118a51fSLisandro Dalcin   ierr = PetscDrawCheckResizedWindow(draw);CHKERRQ(ierr);
925b399a63SLisandro Dalcin   ierr = PetscDrawClear(draw);CHKERRQ(ierr);
93e118a51fSLisandro Dalcin 
94e118a51fSLisandro Dalcin   xmin = PetscMin(lg->xmin,sp->xmin); ymin = PetscMin(lg->ymin,sp->ymin);
95e118a51fSLisandro Dalcin   xmax = PetscMax(lg->xmax,sp->xmax); ymax = PetscMax(lg->ymax,sp->ymax);
965c6c1daeSBarry Smith   ierr = PetscDrawAxisSetLimits(lg->axis,xmin,xmax,ymin,ymax);CHKERRQ(ierr);
975c6c1daeSBarry Smith   ierr = PetscDrawAxisDraw(lg->axis);CHKERRQ(ierr);
985c6c1daeSBarry Smith 
995b399a63SLisandro Dalcin   ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
1005c6c1daeSBarry Smith   if (!rank) {
101e118a51fSLisandro Dalcin     int i,j,dim,nopts;
1025c6c1daeSBarry Smith     dim   = lg->dim;
1035c6c1daeSBarry Smith     nopts = lg->nopts;
1045c6c1daeSBarry Smith     for (i=0; i<dim; i++) {
1055c6c1daeSBarry Smith       for (j=1; j<nopts; j++) {
1065c6c1daeSBarry 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);
107b6fe0379SLisandro Dalcin         if (lg->use_markers) {
10878e9f83eSLisandro Dalcin           ierr = PetscDrawMarker(draw,lg->x[j*dim+i],lg->y[j*dim+i],PETSC_DRAW_RED);CHKERRQ(ierr);
1095c6c1daeSBarry Smith         }
1105c6c1daeSBarry Smith       }
1115c6c1daeSBarry Smith     }
1125c6c1daeSBarry Smith     dim   = sp->dim;
1135c6c1daeSBarry Smith     nopts = sp->nopts;
1145c6c1daeSBarry Smith     for (i=0; i<dim; i++) {
1155c6c1daeSBarry Smith       for (j=0; j<nopts; j++) {
11678e9f83eSLisandro Dalcin         ierr = PetscDrawMarker(draw,sp->x[j*dim+i],sp->y[j*dim+i],PETSC_DRAW_RED);CHKERRQ(ierr);
1175c6c1daeSBarry Smith       }
1185c6c1daeSBarry Smith     }
1195c6c1daeSBarry Smith   }
120e118a51fSLisandro Dalcin   ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
1215b399a63SLisandro Dalcin 
1225b399a63SLisandro Dalcin   ierr = PetscDrawFlush(draw);CHKERRQ(ierr);
1235b399a63SLisandro Dalcin   ierr = PetscDrawPause(draw);CHKERRQ(ierr);
1245c6c1daeSBarry Smith   PetscFunctionReturn(0);
1255c6c1daeSBarry Smith }
1265c6c1daeSBarry Smith 
1275c6c1daeSBarry Smith 
1285c6c1daeSBarry Smith /*@
1295c6c1daeSBarry Smith     PetscDrawLGCreate - Creates a line graph data structure.
1305c6c1daeSBarry Smith 
1315b399a63SLisandro Dalcin     Collective on PetscDraw
1325c6c1daeSBarry Smith 
1335c6c1daeSBarry Smith     Input Parameters:
1345c6c1daeSBarry Smith +   draw - the window where the graph will be made.
1355c6c1daeSBarry Smith -   dim - the number of curves which will be drawn
1365c6c1daeSBarry Smith 
1375c6c1daeSBarry Smith     Output Parameters:
138e118a51fSLisandro Dalcin .   outlg - the line graph context
1395c6c1daeSBarry Smith 
1405c6c1daeSBarry Smith     Level: intermediate
1415c6c1daeSBarry Smith 
1427e25d57eSBarry Smith     Notes: The MPI communicator that owns the PetscDraw owns this PetscDrawLG, but the calls to set options and add points are ignored on all processes except the
1437e25d57eSBarry Smith            zeroth MPI process in the communicator. All MPI processes in the communicator must call PetscDrawLGDraw() to display the updated graph.
1447e25d57eSBarry Smith 
1455c6c1daeSBarry Smith     Concepts: line graph^creating
1465c6c1daeSBarry Smith 
147ba1e01c4SBarry Smith .seealso:  PetscDrawLGDestroy(), PetscDrawLGAddPoint(), PetscDrawLGAddCommonPoint(), PetscDrawLGAddPoints(), PetscDrawLGDraw(), PetscDrawLGSave(),
148ba1e01c4SBarry Smith            PetscDrawLGView(), PetscDrawLGReset(), PetscDrawLGSetDimension(), PetscDrawLGGetDimension(), PetscDrawLGSetLegend(), PetscDrawLGGetAxis(),
149ba1e01c4SBarry Smith            PetscDrawLGGetDraw(), PetscDrawLGSetUseMarkers(), PetscDrawLGSetLimits(), PetscDrawLGSetColors(), PetscDrawLGSetOptionsPrefix(), PetscDrawLGSetFromOptions()
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 
16171917b75SLisandro 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 /*@
1925c6c1daeSBarry Smith    PetscDrawLGSetColors - Sets the color of each line graph drawn
1935c6c1daeSBarry Smith 
1945b399a63SLisandro Dalcin    Logically Collective on PetscDrawLG
1955c6c1daeSBarry Smith 
1965c6c1daeSBarry Smith    Input Parameter:
1975c6c1daeSBarry Smith +  lg - the line graph context.
1985c6c1daeSBarry Smith -  colors - the colors
1995c6c1daeSBarry Smith 
2005c6c1daeSBarry Smith    Level: intermediate
2015c6c1daeSBarry Smith 
2025c6c1daeSBarry Smith    Concepts: line graph^setting number of lines
2035c6c1daeSBarry Smith 
204ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate()
205ba1e01c4SBarry 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 /*@C
2225c6c1daeSBarry Smith    PetscDrawLGSetLegend - sets the names of each curve plotted
2235c6c1daeSBarry Smith 
2245b399a63SLisandro Dalcin    Logically Collective on PetscDrawLG
2255c6c1daeSBarry Smith 
2265c6c1daeSBarry Smith    Input Parameter:
2275c6c1daeSBarry Smith +  lg - the line graph context.
2285c6c1daeSBarry Smith -  names - the names for each curve
2295c6c1daeSBarry Smith 
2305c6c1daeSBarry Smith    Level: intermediate
2315c6c1daeSBarry Smith 
232ba1e01c4SBarry Smith    Notes: Call PetscDrawLGGetAxis() and then change properties of the PetscDrawAxis for detailed control of the plot
233ba1e01c4SBarry Smith 
2345c6c1daeSBarry Smith    Concepts: line graph^setting number of lines
2355c6c1daeSBarry Smith 
236ba1e01c4SBarry Smith .seealso: PetscDrawLGGetAxis(), PetscDrawAxis, PetscDrawAxisSetColors(), PetscDrawAxisSetLabels(), PetscDrawAxisSetHoldLimits()
237ba1e01c4SBarry Smith 
2385c6c1daeSBarry Smith @*/
2395c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGSetLegend(PetscDrawLG lg,const char *const *names)
2405c6c1daeSBarry Smith {
2415c6c1daeSBarry Smith   PetscErrorCode ierr;
2425c6c1daeSBarry Smith   PetscInt       i;
2435c6c1daeSBarry Smith 
2445c6c1daeSBarry Smith   PetscFunctionBegin;
2455c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
24645f3bb6eSLisandro Dalcin   if (names) PetscValidPointer(names,2);
2475c6c1daeSBarry Smith 
2485c6c1daeSBarry Smith   if (lg->legend) {
2495c6c1daeSBarry Smith     for (i=0; i<lg->dim; i++) {
2505c6c1daeSBarry Smith       ierr = PetscFree(lg->legend[i]);CHKERRQ(ierr);
2515c6c1daeSBarry Smith     }
2525c6c1daeSBarry Smith     ierr = PetscFree(lg->legend);CHKERRQ(ierr);
2535c6c1daeSBarry Smith   }
2545c6c1daeSBarry Smith   if (names) {
255785e854fSJed Brown     ierr = PetscMalloc1(lg->dim,&lg->legend);CHKERRQ(ierr);
2565c6c1daeSBarry Smith     for (i=0; i<lg->dim; i++) {
2575c6c1daeSBarry Smith       ierr = PetscStrallocpy(names[i],&lg->legend[i]);CHKERRQ(ierr);
2585c6c1daeSBarry Smith     }
2595c6c1daeSBarry Smith   }
2605c6c1daeSBarry Smith   PetscFunctionReturn(0);
2615c6c1daeSBarry Smith }
2625c6c1daeSBarry Smith 
2635c6c1daeSBarry Smith /*@
2645c6c1daeSBarry Smith    PetscDrawLGGetDimension - Change the number of lines that are to be drawn.
2655c6c1daeSBarry Smith 
2665b399a63SLisandro Dalcin    Not Collective
2675c6c1daeSBarry Smith 
2685c6c1daeSBarry Smith    Input Parameter:
2695c6c1daeSBarry Smith .  lg - the line graph context.
2705c6c1daeSBarry Smith 
2715c6c1daeSBarry Smith    Output Parameter:
2725c6c1daeSBarry Smith .  dim - the number of curves.
2735c6c1daeSBarry Smith 
2745c6c1daeSBarry Smith    Level: intermediate
2755c6c1daeSBarry Smith 
2765c6c1daeSBarry Smith    Concepts: line graph^setting number of lines
2775c6c1daeSBarry Smith 
278ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate(), PetscDrawLGSetDimension()
279ba1e01c4SBarry Smith 
2805c6c1daeSBarry Smith @*/
2815c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGGetDimension(PetscDrawLG lg,PetscInt *dim)
2825c6c1daeSBarry Smith {
2835c6c1daeSBarry Smith   PetscFunctionBegin;
2845c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
28545f3bb6eSLisandro Dalcin   PetscValidIntPointer(dim,2);
2865c6c1daeSBarry Smith   *dim = lg->dim;
2875c6c1daeSBarry Smith   PetscFunctionReturn(0);
2885c6c1daeSBarry Smith }
2895c6c1daeSBarry Smith 
2905c6c1daeSBarry Smith /*@
2915c6c1daeSBarry Smith    PetscDrawLGSetDimension - Change the number of lines that are to be drawn.
2925c6c1daeSBarry Smith 
2935b399a63SLisandro Dalcin    Logically Collective on PetscDrawLG
2945c6c1daeSBarry Smith 
2955c6c1daeSBarry Smith    Input Parameter:
2965c6c1daeSBarry Smith +  lg - the line graph context.
2975c6c1daeSBarry Smith -  dim - the number of curves.
2985c6c1daeSBarry Smith 
2995c6c1daeSBarry Smith    Level: intermediate
3005c6c1daeSBarry Smith 
3015c6c1daeSBarry Smith    Concepts: line graph^setting number of lines
3025c6c1daeSBarry Smith 
303ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate(), PetscDrawLGGetDimension()
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 
33071917b75SLisandro Dalcin 
33171917b75SLisandro Dalcin /*@
33271917b75SLisandro Dalcin    PetscDrawLGSetLimits - Sets the axis limits for a line graph. If more
33371917b75SLisandro Dalcin    points are added after this call, the limits will be adjusted to
33471917b75SLisandro Dalcin    include those additional points.
33571917b75SLisandro Dalcin 
33671917b75SLisandro Dalcin    Logically Collective on PetscDrawLG
33771917b75SLisandro Dalcin 
33871917b75SLisandro Dalcin    Input Parameters:
33971917b75SLisandro Dalcin +  xlg - the line graph context
34071917b75SLisandro Dalcin -  x_min,x_max,y_min,y_max - the limits
34171917b75SLisandro Dalcin 
34271917b75SLisandro Dalcin    Level: intermediate
34371917b75SLisandro Dalcin 
34471917b75SLisandro Dalcin    Concepts: line graph^setting axis
34571917b75SLisandro Dalcin 
346ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate()
347ba1e01c4SBarry Smith 
34871917b75SLisandro Dalcin @*/
34971917b75SLisandro Dalcin PetscErrorCode  PetscDrawLGSetLimits(PetscDrawLG lg,PetscReal x_min,PetscReal x_max,PetscReal y_min,PetscReal y_max)
35071917b75SLisandro Dalcin {
35171917b75SLisandro Dalcin   PetscFunctionBegin;
35271917b75SLisandro Dalcin   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
35371917b75SLisandro Dalcin 
35471917b75SLisandro Dalcin   (lg)->xmin = x_min;
35571917b75SLisandro Dalcin   (lg)->xmax = x_max;
35671917b75SLisandro Dalcin   (lg)->ymin = y_min;
35771917b75SLisandro Dalcin   (lg)->ymax = y_max;
35871917b75SLisandro Dalcin   PetscFunctionReturn(0);
35971917b75SLisandro Dalcin }
36071917b75SLisandro Dalcin 
3615c6c1daeSBarry Smith /*@
3625c6c1daeSBarry Smith    PetscDrawLGReset - Clears line graph to allow for reuse with new data.
3635c6c1daeSBarry Smith 
3645b399a63SLisandro Dalcin    Logically Collective on PetscDrawLG
3655c6c1daeSBarry Smith 
3665c6c1daeSBarry Smith    Input Parameter:
3675c6c1daeSBarry Smith .  lg - the line graph context.
3685c6c1daeSBarry Smith 
3695c6c1daeSBarry Smith    Level: intermediate
3705c6c1daeSBarry Smith 
3715c6c1daeSBarry Smith    Concepts: line graph^restarting
3725c6c1daeSBarry Smith 
373ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate()
374ba1e01c4SBarry 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 /*@
3905c6c1daeSBarry Smith    PetscDrawLGDestroy - Frees all space taken up by line graph data structure.
3915c6c1daeSBarry Smith 
3925b399a63SLisandro Dalcin    Collective on PetscDrawLG
3935c6c1daeSBarry Smith 
3945c6c1daeSBarry Smith    Input Parameter:
3955c6c1daeSBarry Smith .  lg - the line graph context
3965c6c1daeSBarry Smith 
3975c6c1daeSBarry Smith    Level: intermediate
3985c6c1daeSBarry Smith 
3995c6c1daeSBarry Smith .seealso:  PetscDrawLGCreate()
4005c6c1daeSBarry Smith @*/
4015c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGDestroy(PetscDrawLG *lg)
4025c6c1daeSBarry Smith {
4035c6c1daeSBarry Smith   PetscErrorCode ierr;
4045c6c1daeSBarry Smith   PetscInt       i;
4055c6c1daeSBarry Smith 
4065c6c1daeSBarry Smith   PetscFunctionBegin;
4075c6c1daeSBarry Smith   if (!*lg) PetscFunctionReturn(0);
408e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(*lg,PETSC_DRAWLG_CLASSID,1);
409e118a51fSLisandro Dalcin   if (--((PetscObject)(*lg))->refct > 0) {*lg = NULL; PetscFunctionReturn(0);}
4105c6c1daeSBarry Smith 
4115c6c1daeSBarry Smith   if ((*lg)->legend) {
4125c6c1daeSBarry Smith     for (i=0; i<(*lg)->dim; i++) {
4135c6c1daeSBarry Smith       ierr = PetscFree((*lg)->legend[i]);CHKERRQ(ierr);
4145c6c1daeSBarry Smith     }
4155c6c1daeSBarry Smith     ierr = PetscFree((*lg)->legend);CHKERRQ(ierr);
4165c6c1daeSBarry Smith   }
4175c6c1daeSBarry Smith   ierr = PetscFree((*lg)->colors);CHKERRQ(ierr);
4185c6c1daeSBarry Smith   ierr = PetscFree2((*lg)->x,(*lg)->y);CHKERRQ(ierr);
419e118a51fSLisandro Dalcin   ierr = PetscDrawAxisDestroy(&(*lg)->axis);CHKERRQ(ierr);
420e118a51fSLisandro Dalcin   ierr = PetscDrawDestroy(&(*lg)->win);CHKERRQ(ierr);
4215c6c1daeSBarry Smith   ierr = PetscHeaderDestroy(lg);CHKERRQ(ierr);
4225c6c1daeSBarry Smith   PetscFunctionReturn(0);
4235c6c1daeSBarry Smith }
4245c6c1daeSBarry Smith /*@
425b6fe0379SLisandro Dalcin    PetscDrawLGSetUseMarkers - Causes LG to draw a marker for each data-point.
4265c6c1daeSBarry Smith 
4275b399a63SLisandro Dalcin    Logically Collective on PetscDrawLG
4285c6c1daeSBarry Smith 
4295c6c1daeSBarry Smith    Input Parameters:
430287de1a7SBarry Smith +  lg - the linegraph context
431287de1a7SBarry Smith -  flg - should mark each data point
432287de1a7SBarry Smith 
433287de1a7SBarry Smith    Options Database:
434b6fe0379SLisandro Dalcin .  -lg_use_markers  <true,false>
4355c6c1daeSBarry Smith 
4365c6c1daeSBarry Smith    Level: intermediate
4375c6c1daeSBarry Smith 
4385c6c1daeSBarry Smith    Concepts: line graph^showing points
4395c6c1daeSBarry Smith 
440ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate()
441ba1e01c4SBarry Smith 
4425c6c1daeSBarry Smith @*/
443b6fe0379SLisandro Dalcin PetscErrorCode  PetscDrawLGSetUseMarkers(PetscDrawLG lg,PetscBool flg)
4445c6c1daeSBarry Smith {
4455c6c1daeSBarry Smith   PetscFunctionBegin;
446e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
44745f3bb6eSLisandro Dalcin   PetscValidLogicalCollectiveBool(lg,flg,2);
448b6fe0379SLisandro Dalcin   lg->use_markers = flg;
4495c6c1daeSBarry Smith   PetscFunctionReturn(0);
4505c6c1daeSBarry Smith }
4515c6c1daeSBarry Smith 
4525c6c1daeSBarry Smith /*@
4535c6c1daeSBarry Smith    PetscDrawLGDraw - Redraws a line graph.
4545c6c1daeSBarry Smith 
4555b399a63SLisandro Dalcin    Collective on PetscDrawLG
4565c6c1daeSBarry Smith 
4575c6c1daeSBarry Smith    Input Parameter:
4585c6c1daeSBarry Smith .  lg - the line graph context
4595c6c1daeSBarry Smith 
4605c6c1daeSBarry Smith    Level: intermediate
4615c6c1daeSBarry Smith 
462ba1e01c4SBarry Smith .seealso: PetscDrawSPDraw(), PetscDrawLGSPDraw(), PetscDrawLGReset()
4635c6c1daeSBarry Smith 
4645c6c1daeSBarry Smith @*/
4655c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGDraw(PetscDrawLG lg)
4665c6c1daeSBarry Smith {
467e118a51fSLisandro Dalcin   PetscReal      xmin,xmax,ymin,ymax;
4685c6c1daeSBarry Smith   PetscErrorCode ierr;
469e118a51fSLisandro Dalcin   PetscMPIInt    rank;
470e118a51fSLisandro Dalcin   PetscDraw      draw;
4715c6c1daeSBarry Smith   PetscBool      isnull;
4725c6c1daeSBarry Smith 
4735c6c1daeSBarry Smith   PetscFunctionBegin;
4745c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
4758f69470aSLisandro Dalcin   ierr = PetscDrawIsNull(lg->win,&isnull);CHKERRQ(ierr);
4768f69470aSLisandro Dalcin   if (isnull) PetscFunctionReturn(0);
477e118a51fSLisandro Dalcin   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)lg),&rank);CHKERRQ(ierr);
4785c6c1daeSBarry Smith 
4795b399a63SLisandro Dalcin   draw = lg->win;
4805c6c1daeSBarry Smith   ierr = PetscDrawCheckResizedWindow(draw);CHKERRQ(ierr);
4815b399a63SLisandro Dalcin   ierr = PetscDrawClear(draw);CHKERRQ(ierr);
482e118a51fSLisandro Dalcin 
483e118a51fSLisandro Dalcin   xmin = lg->xmin; xmax = lg->xmax; ymin = lg->ymin; ymax = lg->ymax;
4845c6c1daeSBarry Smith   ierr = PetscDrawAxisSetLimits(lg->axis,xmin,xmax,ymin,ymax);CHKERRQ(ierr);
4855c6c1daeSBarry Smith   ierr = PetscDrawAxisDraw(lg->axis);CHKERRQ(ierr);
4865c6c1daeSBarry Smith 
4875b399a63SLisandro Dalcin   ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
4885c6c1daeSBarry Smith   if (!rank) {
489e118a51fSLisandro Dalcin     int i,j,dim=lg->dim,nopts=lg->nopts,cl;
4905c6c1daeSBarry Smith     for (i=0; i<dim; i++) {
4915c6c1daeSBarry Smith       for (j=1; j<nopts; j++) {
492*0ed3bfb6SBarry Smith         cl   = lg->colors ? lg->colors[i] : ((PETSC_DRAW_BLACK + i) % PETSC_DRAW_MAXCOLOR);
4935c6c1daeSBarry 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);
49471917b75SLisandro Dalcin         if (lg->use_markers) {ierr = PetscDrawMarker(draw,lg->x[j*dim+i],lg->y[j*dim+i],cl);CHKERRQ(ierr);}
4955c6c1daeSBarry Smith       }
4965c6c1daeSBarry Smith     }
4975c6c1daeSBarry Smith   }
49856a02f31SLisandro Dalcin   if (!rank && lg->legend) {
499e118a51fSLisandro Dalcin     int       i,dim=lg->dim,cl;
5005c6c1daeSBarry Smith     PetscReal xl,yl,xr,yr,tw,th;
50171917b75SLisandro Dalcin     size_t    slen,len=0;
50271917b75SLisandro Dalcin     ierr = PetscDrawAxisGetLimits(lg->axis,&xl,&xr,&yl,&yr);CHKERRQ(ierr);
5035c6c1daeSBarry Smith     ierr = PetscDrawStringGetSize(draw,&tw,&th);CHKERRQ(ierr);
5045c6c1daeSBarry Smith     for (i=0; i<dim; i++) {
50571917b75SLisandro Dalcin       ierr = PetscStrlen(lg->legend[i],&slen);CHKERRQ(ierr);
50671917b75SLisandro Dalcin       len = PetscMax(len,slen);
5075c6c1daeSBarry Smith     }
50871917b75SLisandro Dalcin     xr = xr - 1.5*tw; xl = xr - (len + 7)*tw;
50971917b75SLisandro Dalcin     yr = yr - 1.0*th; yl = yr - (dim + 1)*th;
51071917b75SLisandro Dalcin     ierr = PetscDrawLine(draw,xl,yl,xr,yl,PETSC_DRAW_BLACK);CHKERRQ(ierr);
51171917b75SLisandro Dalcin     ierr = PetscDrawLine(draw,xr,yl,xr,yr,PETSC_DRAW_BLACK);CHKERRQ(ierr);
51271917b75SLisandro Dalcin     ierr = PetscDrawLine(draw,xr,yr,xl,yr,PETSC_DRAW_BLACK);CHKERRQ(ierr);
51371917b75SLisandro Dalcin     ierr = PetscDrawLine(draw,xl,yr,xl,yl,PETSC_DRAW_BLACK);CHKERRQ(ierr);
5145c6c1daeSBarry Smith     for  (i=0; i<dim; i++) {
51571917b75SLisandro Dalcin       cl   = lg->colors ? lg->colors[i] : (PETSC_DRAW_BLACK + i);
51671917b75SLisandro Dalcin       ierr = PetscDrawLine(draw,xl + 1*tw,yr - (i + 1)*th,xl + 5*tw,yr - (i + 1)*th,cl);CHKERRQ(ierr);
51771917b75SLisandro Dalcin       ierr = PetscDrawString(draw,xl + 6*tw,yr - (i + 1.5)*th,PETSC_DRAW_BLACK,lg->legend[i]);CHKERRQ(ierr);
5185c6c1daeSBarry Smith     }
5195c6c1daeSBarry Smith   }
520e118a51fSLisandro Dalcin   ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
5215b399a63SLisandro Dalcin 
5225b399a63SLisandro Dalcin   ierr = PetscDrawFlush(draw);CHKERRQ(ierr);
523e118a51fSLisandro Dalcin   ierr = PetscDrawPause(draw);CHKERRQ(ierr);
5245c6c1daeSBarry Smith   PetscFunctionReturn(0);
5255c6c1daeSBarry Smith }
5265c6c1daeSBarry Smith 
52757fd6651SLisandro Dalcin /*@
52857fd6651SLisandro Dalcin   PetscDrawLGSave - Saves a drawn image
52957fd6651SLisandro Dalcin 
53057fd6651SLisandro Dalcin   Collective on PetscDrawLG
53157fd6651SLisandro Dalcin 
53257fd6651SLisandro Dalcin   Input Parameter:
53357fd6651SLisandro Dalcin . lg - The line graph context
53457fd6651SLisandro Dalcin 
53557fd6651SLisandro Dalcin   Level: intermediate
53657fd6651SLisandro Dalcin 
53757fd6651SLisandro Dalcin   Concepts: line graph^saving
53857fd6651SLisandro Dalcin 
53957fd6651SLisandro Dalcin .seealso:  PetscDrawLGCreate(), PetscDrawLGGetDraw(), PetscDrawSetSave(), PetscDrawSave()
54057fd6651SLisandro Dalcin @*/
54157fd6651SLisandro Dalcin PetscErrorCode  PetscDrawLGSave(PetscDrawLG lg)
54257fd6651SLisandro Dalcin {
54357fd6651SLisandro Dalcin   PetscErrorCode ierr;
54457fd6651SLisandro Dalcin 
54557fd6651SLisandro Dalcin   PetscFunctionBegin;
54657fd6651SLisandro Dalcin   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
54757fd6651SLisandro Dalcin   ierr = PetscDrawSave(lg->win);CHKERRQ(ierr);
54857fd6651SLisandro Dalcin   PetscFunctionReturn(0);
54957fd6651SLisandro Dalcin }
55057fd6651SLisandro Dalcin 
5515c6c1daeSBarry Smith /*@
55234a5a0e3SBarry Smith   PetscDrawLGView - Prints a line graph.
5535c6c1daeSBarry Smith 
5545b399a63SLisandro Dalcin   Collective on PetscDrawLG
5555c6c1daeSBarry Smith 
5565c6c1daeSBarry Smith   Input Parameter:
5575c6c1daeSBarry Smith . lg - the line graph context
5585c6c1daeSBarry Smith 
5595c6c1daeSBarry Smith   Level: beginner
5605c6c1daeSBarry Smith 
561ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate()
562ba1e01c4SBarry Smith 
5635c6c1daeSBarry Smith .keywords:  draw, line, graph
5645c6c1daeSBarry Smith @*/
56534a5a0e3SBarry Smith PetscErrorCode  PetscDrawLGView(PetscDrawLG lg,PetscViewer viewer)
5665c6c1daeSBarry Smith {
5675c6c1daeSBarry Smith   PetscReal      xmin=lg->xmin, xmax=lg->xmax, ymin=lg->ymin, ymax=lg->ymax;
56834a5a0e3SBarry Smith   PetscInt       i, j, dim = lg->dim, nopts = lg->nopts;
56934a5a0e3SBarry Smith   PetscErrorCode ierr;
5705c6c1daeSBarry Smith 
5715c6c1daeSBarry Smith   PetscFunctionBegin;
5725c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
573e118a51fSLisandro Dalcin 
5745c6c1daeSBarry Smith   if (nopts < 1)                  PetscFunctionReturn(0);
5755c6c1daeSBarry Smith   if (xmin > xmax || ymin > ymax) PetscFunctionReturn(0);
5765c6c1daeSBarry Smith 
57734a5a0e3SBarry Smith   if (!viewer){
57834a5a0e3SBarry Smith     ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)lg),&viewer);CHKERRQ(ierr);
57934a5a0e3SBarry Smith   }
58098c3331eSBarry Smith   ierr = PetscObjectPrintClassNamePrefixType((PetscObject)lg,viewer);CHKERRQ(ierr);
5815c6c1daeSBarry Smith   for (i = 0; i < dim; i++) {
58234a5a0e3SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer, "Line %D>\n", i);CHKERRQ(ierr);
5835c6c1daeSBarry Smith     for (j = 0; j < nopts; j++) {
58434a5a0e3SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer, "  X: %g Y: %g\n", (double)lg->x[j*dim+i], (double)lg->y[j*dim+i]);CHKERRQ(ierr);
5855c6c1daeSBarry Smith     }
5865c6c1daeSBarry Smith   }
5875c6c1daeSBarry Smith   PetscFunctionReturn(0);
5885c6c1daeSBarry Smith }
589287de1a7SBarry Smith 
590c2bac407SLisandro Dalcin /*@C
591c2bac407SLisandro Dalcin    PetscDrawLGSetOptionsPrefix - Sets the prefix used for searching for all
592c2bac407SLisandro Dalcin    PetscDrawLG options in the database.
593c2bac407SLisandro Dalcin 
594c2bac407SLisandro Dalcin    Logically Collective on PetscDrawLG
595c2bac407SLisandro Dalcin 
596c2bac407SLisandro Dalcin    Input Parameter:
597c2bac407SLisandro Dalcin +  lg - the line graph context
598c2bac407SLisandro Dalcin -  prefix - the prefix to prepend to all option names
599c2bac407SLisandro Dalcin 
600c2bac407SLisandro Dalcin    Level: advanced
601c2bac407SLisandro Dalcin 
602c2bac407SLisandro Dalcin .keywords: PetscDrawLG, set, options, prefix, database
603c2bac407SLisandro Dalcin 
604ba1e01c4SBarry Smith .seealso: PetscDrawLGSetFromOptions(), PetscDrawLGCreate()
605c2bac407SLisandro Dalcin @*/
606c2bac407SLisandro Dalcin PetscErrorCode  PetscDrawLGSetOptionsPrefix(PetscDrawLG lg,const char prefix[])
607c2bac407SLisandro Dalcin {
608c2bac407SLisandro Dalcin   PetscErrorCode ierr;
609c2bac407SLisandro Dalcin 
610c2bac407SLisandro Dalcin   PetscFunctionBegin;
611c2bac407SLisandro Dalcin   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
612c2bac407SLisandro Dalcin   ierr = PetscObjectSetOptionsPrefix((PetscObject)lg,prefix);CHKERRQ(ierr);
613c2bac407SLisandro Dalcin   PetscFunctionReturn(0);
614c2bac407SLisandro Dalcin }
615c2bac407SLisandro Dalcin 
616287de1a7SBarry Smith /*@
617287de1a7SBarry Smith     PetscDrawLGSetFromOptions - Sets options related to the PetscDrawLG
618287de1a7SBarry Smith 
6195b399a63SLisandro Dalcin     Collective on PetscDrawLG
620287de1a7SBarry Smith 
621287de1a7SBarry Smith     Options Database:
622287de1a7SBarry Smith 
623287de1a7SBarry Smith     Level: intermediate
624287de1a7SBarry Smith 
625287de1a7SBarry Smith     Concepts: line graph^creating
626287de1a7SBarry Smith 
627287de1a7SBarry Smith .seealso:  PetscDrawLGDestroy(), PetscDrawLGCreate()
628287de1a7SBarry Smith @*/
629287de1a7SBarry Smith PetscErrorCode  PetscDrawLGSetFromOptions(PetscDrawLG lg)
630287de1a7SBarry Smith {
631287de1a7SBarry Smith   PetscErrorCode      ierr;
63271917b75SLisandro Dalcin   PetscBool           usemarkers,set;
63371917b75SLisandro Dalcin   PetscDrawMarkerType markertype;
634287de1a7SBarry Smith 
635287de1a7SBarry Smith   PetscFunctionBegin;
636e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
637e118a51fSLisandro Dalcin 
63871917b75SLisandro Dalcin   ierr = PetscDrawGetMarkerType(lg->win,&markertype);CHKERRQ(ierr);
63971917b75SLisandro Dalcin   ierr = PetscOptionsGetEnum(((PetscObject)lg)->options,((PetscObject)lg)->prefix,"-lg_marker_type",PetscDrawMarkerTypes,(PetscEnum*)&markertype,&set);CHKERRQ(ierr);
64071917b75SLisandro Dalcin   if (set) {
64171917b75SLisandro Dalcin     ierr = PetscDrawLGSetUseMarkers(lg,PETSC_TRUE);CHKERRQ(ierr);
64271917b75SLisandro Dalcin     ierr = PetscDrawSetMarkerType(lg->win,markertype);CHKERRQ(ierr);
64371917b75SLisandro Dalcin   }
64471917b75SLisandro Dalcin   usemarkers = lg->use_markers;
64571917b75SLisandro Dalcin   ierr = PetscOptionsGetBool(((PetscObject)lg)->options,((PetscObject)lg)->prefix,"-lg_use_markers",&usemarkers,&set);CHKERRQ(ierr);
64671917b75SLisandro Dalcin   if (set) {ierr = PetscDrawLGSetUseMarkers(lg,usemarkers);CHKERRQ(ierr);}
647287de1a7SBarry Smith   PetscFunctionReturn(0);
648287de1a7SBarry Smith }
649