xref: /petsc/src/sys/classes/draw/utils/lgc.c (revision ba1e01c44f2f740c97c9026fe63e360558b7709b)
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 
24*ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate(), PetscDrawAxis
25*ba1e01c4SBarry Smith 
265c6c1daeSBarry Smith @*/
275c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGGetAxis(PetscDrawLG lg,PetscDrawAxis *axis)
285c6c1daeSBarry Smith {
295c6c1daeSBarry Smith   PetscFunctionBegin;
30e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
3145f3bb6eSLisandro Dalcin   PetscValidPointer(axis,2);
325c6c1daeSBarry Smith   *axis = lg->axis;
335c6c1daeSBarry Smith   PetscFunctionReturn(0);
345c6c1daeSBarry Smith }
355c6c1daeSBarry Smith 
365c6c1daeSBarry Smith #undef __FUNCT__
375c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGGetDraw"
385c6c1daeSBarry Smith /*@
395c6c1daeSBarry Smith    PetscDrawLGGetDraw - Gets the draw context associated with a line graph.
405c6c1daeSBarry Smith 
415c6c1daeSBarry Smith    Not Collective, if PetscDrawLG is parallel then PetscDraw is parallel
425c6c1daeSBarry Smith 
435c6c1daeSBarry Smith    Input Parameter:
445c6c1daeSBarry Smith .  lg - the line graph context
455c6c1daeSBarry Smith 
465c6c1daeSBarry Smith    Output Parameter:
475c6c1daeSBarry Smith .  draw - the draw context
485c6c1daeSBarry Smith 
495c6c1daeSBarry Smith    Level: intermediate
505c6c1daeSBarry Smith 
51*ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate(), PetscDraw
525c6c1daeSBarry Smith @*/
535c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGGetDraw(PetscDrawLG lg,PetscDraw *draw)
545c6c1daeSBarry Smith {
555c6c1daeSBarry Smith   PetscFunctionBegin;
565c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
5745f3bb6eSLisandro Dalcin   PetscValidPointer(draw,2);
585c6c1daeSBarry Smith   *draw = lg->win;
595c6c1daeSBarry Smith   PetscFunctionReturn(0);
605c6c1daeSBarry Smith }
615c6c1daeSBarry Smith 
625c6c1daeSBarry Smith 
635c6c1daeSBarry Smith #undef __FUNCT__
645c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGSPDraw"
655c6c1daeSBarry Smith /*@
665c6c1daeSBarry Smith    PetscDrawLGSPDraw - Redraws a line graph.
675c6c1daeSBarry Smith 
685b399a63SLisandro Dalcin    Collective on PetscDrawLG
695c6c1daeSBarry Smith 
705c6c1daeSBarry Smith    Input Parameter:
715c6c1daeSBarry Smith .  lg - the line graph context
725c6c1daeSBarry Smith 
735c6c1daeSBarry Smith    Level: intermediate
745c6c1daeSBarry Smith 
755c6c1daeSBarry Smith .seealso: PetscDrawLGDraw(), PetscDrawSPDraw()
765c6c1daeSBarry Smith 
775c6c1daeSBarry Smith    Developer Notes: This code cheats and uses the fact that the LG and SP structs are the same
785c6c1daeSBarry Smith 
795c6c1daeSBarry Smith @*/
805c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGSPDraw(PetscDrawLG lg,PetscDrawSP spin)
815c6c1daeSBarry Smith {
825c6c1daeSBarry Smith   PetscDrawLG    sp = (PetscDrawLG)spin;
835c6c1daeSBarry Smith   PetscReal      xmin,xmax,ymin,ymax;
845c6c1daeSBarry Smith   PetscErrorCode ierr;
85e118a51fSLisandro Dalcin   PetscBool      isnull;
86e118a51fSLisandro Dalcin   PetscMPIInt    rank;
87e118a51fSLisandro Dalcin   PetscDraw      draw;
885c6c1daeSBarry Smith 
895c6c1daeSBarry Smith   PetscFunctionBegin;
905c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
915c6c1daeSBarry Smith   PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,2);
925b399a63SLisandro Dalcin   ierr = PetscDrawIsNull(lg->win,&isnull);CHKERRQ(ierr);
93e118a51fSLisandro Dalcin   if (isnull) PetscFunctionReturn(0);
94e118a51fSLisandro Dalcin   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)lg),&rank);CHKERRQ(ierr);
955c6c1daeSBarry Smith 
965b399a63SLisandro Dalcin   draw = lg->win;
97e118a51fSLisandro Dalcin   ierr = PetscDrawCheckResizedWindow(draw);CHKERRQ(ierr);
985b399a63SLisandro Dalcin   ierr = PetscDrawClear(draw);CHKERRQ(ierr);
99e118a51fSLisandro Dalcin 
100e118a51fSLisandro Dalcin   xmin = PetscMin(lg->xmin,sp->xmin); ymin = PetscMin(lg->ymin,sp->ymin);
101e118a51fSLisandro Dalcin   xmax = PetscMax(lg->xmax,sp->xmax); ymax = PetscMax(lg->ymax,sp->ymax);
1025c6c1daeSBarry Smith   ierr = PetscDrawAxisSetLimits(lg->axis,xmin,xmax,ymin,ymax);CHKERRQ(ierr);
1035c6c1daeSBarry Smith   ierr = PetscDrawAxisDraw(lg->axis);CHKERRQ(ierr);
1045c6c1daeSBarry Smith 
1055b399a63SLisandro Dalcin   ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
1065c6c1daeSBarry Smith   if (!rank) {
107e118a51fSLisandro Dalcin     int i,j,dim,nopts;
1085c6c1daeSBarry Smith     dim   = lg->dim;
1095c6c1daeSBarry Smith     nopts = lg->nopts;
1105c6c1daeSBarry Smith     for (i=0; i<dim; i++) {
1115c6c1daeSBarry Smith       for (j=1; j<nopts; j++) {
1125c6c1daeSBarry 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);
113b6fe0379SLisandro Dalcin         if (lg->use_markers) {
11478e9f83eSLisandro Dalcin           ierr = PetscDrawMarker(draw,lg->x[j*dim+i],lg->y[j*dim+i],PETSC_DRAW_RED);CHKERRQ(ierr);
1155c6c1daeSBarry Smith         }
1165c6c1daeSBarry Smith       }
1175c6c1daeSBarry Smith     }
1185c6c1daeSBarry Smith     dim   = sp->dim;
1195c6c1daeSBarry Smith     nopts = sp->nopts;
1205c6c1daeSBarry Smith     for (i=0; i<dim; i++) {
1215c6c1daeSBarry Smith       for (j=0; j<nopts; j++) {
12278e9f83eSLisandro Dalcin         ierr = PetscDrawMarker(draw,sp->x[j*dim+i],sp->y[j*dim+i],PETSC_DRAW_RED);CHKERRQ(ierr);
1235c6c1daeSBarry Smith       }
1245c6c1daeSBarry Smith     }
1255c6c1daeSBarry Smith   }
126e118a51fSLisandro Dalcin   ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
1275b399a63SLisandro Dalcin 
1285b399a63SLisandro Dalcin   ierr = PetscDrawFlush(draw);CHKERRQ(ierr);
1295b399a63SLisandro Dalcin   ierr = PetscDrawPause(draw);CHKERRQ(ierr);
1305c6c1daeSBarry Smith   PetscFunctionReturn(0);
1315c6c1daeSBarry Smith }
1325c6c1daeSBarry Smith 
1335c6c1daeSBarry Smith 
1345c6c1daeSBarry Smith #undef __FUNCT__
1355c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGCreate"
1365c6c1daeSBarry Smith /*@
1375c6c1daeSBarry Smith     PetscDrawLGCreate - Creates a line graph data structure.
1385c6c1daeSBarry Smith 
1395b399a63SLisandro Dalcin     Collective on PetscDraw
1405c6c1daeSBarry Smith 
1415c6c1daeSBarry Smith     Input Parameters:
1425c6c1daeSBarry Smith +   draw - the window where the graph will be made.
1435c6c1daeSBarry Smith -   dim - the number of curves which will be drawn
1445c6c1daeSBarry Smith 
1455c6c1daeSBarry Smith     Output Parameters:
146e118a51fSLisandro Dalcin .   outlg - the line graph context
1475c6c1daeSBarry Smith 
1485c6c1daeSBarry Smith     Level: intermediate
1495c6c1daeSBarry Smith 
1505c6c1daeSBarry Smith     Concepts: line graph^creating
1515c6c1daeSBarry Smith 
152*ba1e01c4SBarry Smith .seealso:  PetscDrawLGDestroy(), PetscDrawLGAddPoint(), PetscDrawLGAddCommonPoint(), PetscDrawLGAddPoints(), PetscDrawLGDraw(), PetscDrawLGSave(),
153*ba1e01c4SBarry Smith            PetscDrawLGView(), PetscDrawLGReset(), PetscDrawLGSetDimension(), PetscDrawLGGetDimension(), PetscDrawLGSetLegend(), PetscDrawLGGetAxis(),
154*ba1e01c4SBarry Smith            PetscDrawLGGetDraw(), PetscDrawLGSetUseMarkers(), PetscDrawLGSetLimits(), PetscDrawLGSetColors(), PetscDrawLGSetOptionsPrefix(), PetscDrawLGSetFromOptions()
1555c6c1daeSBarry Smith @*/
156e118a51fSLisandro Dalcin PetscErrorCode  PetscDrawLGCreate(PetscDraw draw,PetscInt dim,PetscDrawLG *outlg)
1575c6c1daeSBarry Smith {
1585c6c1daeSBarry Smith   PetscDrawLG    lg;
159e118a51fSLisandro Dalcin   PetscErrorCode ierr;
1605c6c1daeSBarry Smith 
1615c6c1daeSBarry Smith   PetscFunctionBegin;
1625c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
163e118a51fSLisandro Dalcin   PetscValidLogicalCollectiveInt(draw,dim,2);
164e118a51fSLisandro Dalcin   PetscValidPointer(outlg,3);
165e118a51fSLisandro Dalcin 
16671917b75SLisandro Dalcin   ierr = PetscHeaderCreate(lg,PETSC_DRAWLG_CLASSID,"DrawLG","Line Graph","Draw",PetscObjectComm((PetscObject)draw),PetscDrawLGDestroy,NULL);CHKERRQ(ierr);
167e118a51fSLisandro Dalcin   ierr = PetscLogObjectParent((PetscObject)draw,(PetscObject)lg);CHKERRQ(ierr);
168c2bac407SLisandro Dalcin   ierr = PetscDrawLGSetOptionsPrefix(lg,((PetscObject)draw)->prefix);CHKERRQ(ierr);
169e118a51fSLisandro Dalcin 
170e118a51fSLisandro Dalcin   ierr = PetscObjectReference((PetscObject)draw);CHKERRQ(ierr);
171e118a51fSLisandro Dalcin   lg->win = draw;
172a297a907SKarl Rupp 
17369c83917SLisandro Dalcin   lg->view    = NULL;
17469c83917SLisandro Dalcin   lg->destroy = NULL;
1755c6c1daeSBarry Smith   lg->nopts   = 0;
1765c6c1daeSBarry Smith   lg->dim     = dim;
1775c6c1daeSBarry Smith   lg->xmin    = 1.e20;
1785c6c1daeSBarry Smith   lg->ymin    = 1.e20;
1795c6c1daeSBarry Smith   lg->xmax    = -1.e20;
1805c6c1daeSBarry Smith   lg->ymax    = -1.e20;
181a297a907SKarl Rupp 
182dcca6d9dSJed Brown   ierr = PetscMalloc2(dim*CHUNCKSIZE,&lg->x,dim*CHUNCKSIZE,&lg->y);CHKERRQ(ierr);
1833bb1ff40SBarry Smith   ierr = PetscLogObjectMemory((PetscObject)lg,2*dim*CHUNCKSIZE*sizeof(PetscReal));CHKERRQ(ierr);
184a297a907SKarl Rupp 
1855c6c1daeSBarry Smith   lg->len         = dim*CHUNCKSIZE;
1865c6c1daeSBarry Smith   lg->loc         = 0;
187b6fe0379SLisandro Dalcin   lg->use_markers = PETSC_FALSE;
188a297a907SKarl Rupp 
1895c6c1daeSBarry Smith   ierr = PetscDrawAxisCreate(draw,&lg->axis);CHKERRQ(ierr);
1903bb1ff40SBarry Smith   ierr = PetscLogObjectParent((PetscObject)lg,(PetscObject)lg->axis);CHKERRQ(ierr);
191a297a907SKarl Rupp 
192e118a51fSLisandro Dalcin   *outlg = lg;
1935c6c1daeSBarry Smith   PetscFunctionReturn(0);
1945c6c1daeSBarry Smith }
1955c6c1daeSBarry Smith 
1965c6c1daeSBarry Smith #undef __FUNCT__
1975c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGSetColors"
1985c6c1daeSBarry Smith /*@
1995c6c1daeSBarry Smith    PetscDrawLGSetColors - Sets the color of each line graph drawn
2005c6c1daeSBarry Smith 
2015b399a63SLisandro Dalcin    Logically Collective on PetscDrawLG
2025c6c1daeSBarry Smith 
2035c6c1daeSBarry Smith    Input Parameter:
2045c6c1daeSBarry Smith +  lg - the line graph context.
2055c6c1daeSBarry Smith -  colors - the colors
2065c6c1daeSBarry Smith 
2075c6c1daeSBarry Smith    Level: intermediate
2085c6c1daeSBarry Smith 
2095c6c1daeSBarry Smith    Concepts: line graph^setting number of lines
2105c6c1daeSBarry Smith 
211*ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate()
212*ba1e01c4SBarry Smith 
2135c6c1daeSBarry Smith @*/
21445f3bb6eSLisandro Dalcin PetscErrorCode  PetscDrawLGSetColors(PetscDrawLG lg,const int colors[])
2155c6c1daeSBarry Smith {
2165c6c1daeSBarry Smith   PetscErrorCode ierr;
2175c6c1daeSBarry Smith 
2185c6c1daeSBarry Smith   PetscFunctionBegin;
2195c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
22045f3bb6eSLisandro Dalcin   if (lg->dim) PetscValidIntPointer(colors,2);
221e118a51fSLisandro Dalcin 
2225c6c1daeSBarry Smith   ierr = PetscFree(lg->colors);CHKERRQ(ierr);
223785e854fSJed Brown   ierr = PetscMalloc1(lg->dim,&lg->colors);CHKERRQ(ierr);
2245c6c1daeSBarry Smith   ierr = PetscMemcpy(lg->colors,colors,lg->dim*sizeof(int));CHKERRQ(ierr);
2255c6c1daeSBarry Smith   PetscFunctionReturn(0);
2265c6c1daeSBarry Smith }
2275c6c1daeSBarry Smith 
2285c6c1daeSBarry Smith #undef __FUNCT__
2295c6c1daeSBarry Smith #undef __FUNCT__
2305c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGSetLegend"
2315c6c1daeSBarry Smith /*@C
2325c6c1daeSBarry Smith    PetscDrawLGSetLegend - sets the names of each curve plotted
2335c6c1daeSBarry Smith 
2345b399a63SLisandro Dalcin    Logically Collective on PetscDrawLG
2355c6c1daeSBarry Smith 
2365c6c1daeSBarry Smith    Input Parameter:
2375c6c1daeSBarry Smith +  lg - the line graph context.
2385c6c1daeSBarry Smith -  names - the names for each curve
2395c6c1daeSBarry Smith 
2405c6c1daeSBarry Smith    Level: intermediate
2415c6c1daeSBarry Smith 
242*ba1e01c4SBarry Smith    Notes: Call PetscDrawLGGetAxis() and then change properties of the PetscDrawAxis for detailed control of the plot
243*ba1e01c4SBarry Smith 
2445c6c1daeSBarry Smith    Concepts: line graph^setting number of lines
2455c6c1daeSBarry Smith 
246*ba1e01c4SBarry Smith .seealso: PetscDrawLGGetAxis(), PetscDrawAxis, PetscDrawAxisSetColors(), PetscDrawAxisSetLabels(), PetscDrawAxisSetHoldLimits()
247*ba1e01c4SBarry Smith 
2485c6c1daeSBarry Smith @*/
2495c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGSetLegend(PetscDrawLG lg,const char *const *names)
2505c6c1daeSBarry Smith {
2515c6c1daeSBarry Smith   PetscErrorCode ierr;
2525c6c1daeSBarry Smith   PetscInt       i;
2535c6c1daeSBarry Smith 
2545c6c1daeSBarry Smith   PetscFunctionBegin;
2555c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
25645f3bb6eSLisandro Dalcin   if (names) PetscValidPointer(names,2);
2575c6c1daeSBarry Smith 
2585c6c1daeSBarry Smith   if (lg->legend) {
2595c6c1daeSBarry Smith     for (i=0; i<lg->dim; i++) {
2605c6c1daeSBarry Smith       ierr = PetscFree(lg->legend[i]);CHKERRQ(ierr);
2615c6c1daeSBarry Smith     }
2625c6c1daeSBarry Smith     ierr = PetscFree(lg->legend);CHKERRQ(ierr);
2635c6c1daeSBarry Smith   }
2645c6c1daeSBarry Smith   if (names) {
265785e854fSJed Brown     ierr = PetscMalloc1(lg->dim,&lg->legend);CHKERRQ(ierr);
2665c6c1daeSBarry Smith     for (i=0; i<lg->dim; i++) {
2675c6c1daeSBarry Smith       ierr = PetscStrallocpy(names[i],&lg->legend[i]);CHKERRQ(ierr);
2685c6c1daeSBarry Smith     }
2695c6c1daeSBarry Smith   }
2705c6c1daeSBarry Smith   PetscFunctionReturn(0);
2715c6c1daeSBarry Smith }
2725c6c1daeSBarry Smith 
2735c6c1daeSBarry Smith #undef __FUNCT__
2745c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGGetDimension"
2755c6c1daeSBarry Smith /*@
2765c6c1daeSBarry Smith    PetscDrawLGGetDimension - Change the number of lines that are to be drawn.
2775c6c1daeSBarry Smith 
2785b399a63SLisandro Dalcin    Not Collective
2795c6c1daeSBarry Smith 
2805c6c1daeSBarry Smith    Input Parameter:
2815c6c1daeSBarry Smith .  lg - the line graph context.
2825c6c1daeSBarry Smith 
2835c6c1daeSBarry Smith    Output Parameter:
2845c6c1daeSBarry Smith .  dim - the number of curves.
2855c6c1daeSBarry Smith 
2865c6c1daeSBarry Smith    Level: intermediate
2875c6c1daeSBarry Smith 
2885c6c1daeSBarry Smith    Concepts: line graph^setting number of lines
2895c6c1daeSBarry Smith 
290*ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate(), PetscDrawLGSetDimension()
291*ba1e01c4SBarry Smith 
2925c6c1daeSBarry Smith @*/
2935c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGGetDimension(PetscDrawLG lg,PetscInt *dim)
2945c6c1daeSBarry Smith {
2955c6c1daeSBarry Smith   PetscFunctionBegin;
2965c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
29745f3bb6eSLisandro Dalcin   PetscValidIntPointer(dim,2);
2985c6c1daeSBarry Smith   *dim = lg->dim;
2995c6c1daeSBarry Smith   PetscFunctionReturn(0);
3005c6c1daeSBarry Smith }
3015c6c1daeSBarry Smith 
3025c6c1daeSBarry Smith #undef __FUNCT__
3035c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGSetDimension"
3045c6c1daeSBarry Smith /*@
3055c6c1daeSBarry Smith    PetscDrawLGSetDimension - Change the number of lines that are to be drawn.
3065c6c1daeSBarry Smith 
3075b399a63SLisandro Dalcin    Logically Collective on PetscDrawLG
3085c6c1daeSBarry Smith 
3095c6c1daeSBarry Smith    Input Parameter:
3105c6c1daeSBarry Smith +  lg - the line graph context.
3115c6c1daeSBarry Smith -  dim - the number of curves.
3125c6c1daeSBarry Smith 
3135c6c1daeSBarry Smith    Level: intermediate
3145c6c1daeSBarry Smith 
3155c6c1daeSBarry Smith    Concepts: line graph^setting number of lines
3165c6c1daeSBarry Smith 
317*ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate(), PetscDrawLGGetDimension()
3185c6c1daeSBarry Smith @*/
3195c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGSetDimension(PetscDrawLG lg,PetscInt dim)
3205c6c1daeSBarry Smith {
3215c6c1daeSBarry Smith   PetscErrorCode ierr;
3225c6c1daeSBarry Smith   PetscInt       i;
3235c6c1daeSBarry Smith 
3245c6c1daeSBarry Smith   PetscFunctionBegin;
3255c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
3265c6c1daeSBarry Smith   PetscValidLogicalCollectiveInt(lg,dim,2);
3275c6c1daeSBarry Smith   if (lg->dim == dim) PetscFunctionReturn(0);
3285c6c1daeSBarry Smith 
3295c6c1daeSBarry Smith   ierr = PetscFree2(lg->x,lg->y);CHKERRQ(ierr);
3305c6c1daeSBarry Smith   if (lg->legend) {
3315c6c1daeSBarry Smith     for (i=0; i<lg->dim; i++) {
3325c6c1daeSBarry Smith       ierr = PetscFree(lg->legend[i]);CHKERRQ(ierr);
3335c6c1daeSBarry Smith     }
3345c6c1daeSBarry Smith     ierr = PetscFree(lg->legend);CHKERRQ(ierr);
3355c6c1daeSBarry Smith   }
3365c6c1daeSBarry Smith   ierr    = PetscFree(lg->colors);CHKERRQ(ierr);
3375c6c1daeSBarry Smith   lg->dim = dim;
338dcca6d9dSJed Brown   ierr    = PetscMalloc2(dim*CHUNCKSIZE,&lg->x,dim*CHUNCKSIZE,&lg->y);CHKERRQ(ierr);
3393bb1ff40SBarry Smith   ierr    = PetscLogObjectMemory((PetscObject)lg,2*dim*CHUNCKSIZE*sizeof(PetscReal));CHKERRQ(ierr);
3405c6c1daeSBarry Smith   lg->len = dim*CHUNCKSIZE;
3415c6c1daeSBarry Smith   PetscFunctionReturn(0);
3425c6c1daeSBarry Smith }
3435c6c1daeSBarry Smith 
34471917b75SLisandro Dalcin 
34571917b75SLisandro Dalcin #undef __FUNCT__
34671917b75SLisandro Dalcin #define __FUNCT__ "PetscDrawLGSetLimits"
34771917b75SLisandro Dalcin /*@
34871917b75SLisandro Dalcin    PetscDrawLGSetLimits - Sets the axis limits for a line graph. If more
34971917b75SLisandro Dalcin    points are added after this call, the limits will be adjusted to
35071917b75SLisandro Dalcin    include those additional points.
35171917b75SLisandro Dalcin 
35271917b75SLisandro Dalcin    Logically Collective on PetscDrawLG
35371917b75SLisandro Dalcin 
35471917b75SLisandro Dalcin    Input Parameters:
35571917b75SLisandro Dalcin +  xlg - the line graph context
35671917b75SLisandro Dalcin -  x_min,x_max,y_min,y_max - the limits
35771917b75SLisandro Dalcin 
35871917b75SLisandro Dalcin    Level: intermediate
35971917b75SLisandro Dalcin 
36071917b75SLisandro Dalcin    Concepts: line graph^setting axis
36171917b75SLisandro Dalcin 
362*ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate()
363*ba1e01c4SBarry Smith 
36471917b75SLisandro Dalcin @*/
36571917b75SLisandro Dalcin PetscErrorCode  PetscDrawLGSetLimits(PetscDrawLG lg,PetscReal x_min,PetscReal x_max,PetscReal y_min,PetscReal y_max)
36671917b75SLisandro Dalcin {
36771917b75SLisandro Dalcin   PetscFunctionBegin;
36871917b75SLisandro Dalcin   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
36971917b75SLisandro Dalcin 
37071917b75SLisandro Dalcin   (lg)->xmin = x_min;
37171917b75SLisandro Dalcin   (lg)->xmax = x_max;
37271917b75SLisandro Dalcin   (lg)->ymin = y_min;
37371917b75SLisandro Dalcin   (lg)->ymax = y_max;
37471917b75SLisandro Dalcin   PetscFunctionReturn(0);
37571917b75SLisandro Dalcin }
37671917b75SLisandro Dalcin 
3775c6c1daeSBarry Smith #undef __FUNCT__
3785c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGReset"
3795c6c1daeSBarry Smith /*@
3805c6c1daeSBarry Smith    PetscDrawLGReset - Clears line graph to allow for reuse with new data.
3815c6c1daeSBarry Smith 
3825b399a63SLisandro Dalcin    Logically Collective on PetscDrawLG
3835c6c1daeSBarry Smith 
3845c6c1daeSBarry Smith    Input Parameter:
3855c6c1daeSBarry Smith .  lg - the line graph context.
3865c6c1daeSBarry Smith 
3875c6c1daeSBarry Smith    Level: intermediate
3885c6c1daeSBarry Smith 
3895c6c1daeSBarry Smith    Concepts: line graph^restarting
3905c6c1daeSBarry Smith 
391*ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate()
392*ba1e01c4SBarry Smith 
3935c6c1daeSBarry Smith @*/
3945c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGReset(PetscDrawLG lg)
3955c6c1daeSBarry Smith {
3965c6c1daeSBarry Smith   PetscFunctionBegin;
3975c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
3985c6c1daeSBarry Smith   lg->xmin  = 1.e20;
3995c6c1daeSBarry Smith   lg->ymin  = 1.e20;
4005c6c1daeSBarry Smith   lg->xmax  = -1.e20;
4015c6c1daeSBarry Smith   lg->ymax  = -1.e20;
4025c6c1daeSBarry Smith   lg->loc   = 0;
4035c6c1daeSBarry Smith   lg->nopts = 0;
4045c6c1daeSBarry Smith   PetscFunctionReturn(0);
4055c6c1daeSBarry Smith }
4065c6c1daeSBarry Smith 
4075c6c1daeSBarry Smith #undef __FUNCT__
4085c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGDestroy"
4095c6c1daeSBarry Smith /*@
4105c6c1daeSBarry Smith    PetscDrawLGDestroy - Frees all space taken up by line graph data structure.
4115c6c1daeSBarry Smith 
4125b399a63SLisandro Dalcin    Collective on PetscDrawLG
4135c6c1daeSBarry Smith 
4145c6c1daeSBarry Smith    Input Parameter:
4155c6c1daeSBarry Smith .  lg - the line graph context
4165c6c1daeSBarry Smith 
4175c6c1daeSBarry Smith    Level: intermediate
4185c6c1daeSBarry Smith 
4195c6c1daeSBarry Smith .seealso:  PetscDrawLGCreate()
4205c6c1daeSBarry Smith @*/
4215c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGDestroy(PetscDrawLG *lg)
4225c6c1daeSBarry Smith {
4235c6c1daeSBarry Smith   PetscErrorCode ierr;
4245c6c1daeSBarry Smith   PetscInt       i;
4255c6c1daeSBarry Smith 
4265c6c1daeSBarry Smith   PetscFunctionBegin;
4275c6c1daeSBarry Smith   if (!*lg) PetscFunctionReturn(0);
428e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(*lg,PETSC_DRAWLG_CLASSID,1);
429e118a51fSLisandro Dalcin   if (--((PetscObject)(*lg))->refct > 0) {*lg = NULL; PetscFunctionReturn(0);}
4305c6c1daeSBarry Smith 
4315c6c1daeSBarry Smith   if ((*lg)->legend) {
4325c6c1daeSBarry Smith     for (i=0; i<(*lg)->dim; i++) {
4335c6c1daeSBarry Smith       ierr = PetscFree((*lg)->legend[i]);CHKERRQ(ierr);
4345c6c1daeSBarry Smith     }
4355c6c1daeSBarry Smith     ierr = PetscFree((*lg)->legend);CHKERRQ(ierr);
4365c6c1daeSBarry Smith   }
4375c6c1daeSBarry Smith   ierr = PetscFree((*lg)->colors);CHKERRQ(ierr);
4385c6c1daeSBarry Smith   ierr = PetscFree2((*lg)->x,(*lg)->y);CHKERRQ(ierr);
439e118a51fSLisandro Dalcin   ierr = PetscDrawAxisDestroy(&(*lg)->axis);CHKERRQ(ierr);
440e118a51fSLisandro Dalcin   ierr = PetscDrawDestroy(&(*lg)->win);CHKERRQ(ierr);
4415c6c1daeSBarry Smith   ierr = PetscHeaderDestroy(lg);CHKERRQ(ierr);
4425c6c1daeSBarry Smith   PetscFunctionReturn(0);
4435c6c1daeSBarry Smith }
4445c6c1daeSBarry Smith #undef __FUNCT__
445b6fe0379SLisandro Dalcin #define __FUNCT__ "PetscDrawLGSetUseMarkers"
4465c6c1daeSBarry Smith /*@
447b6fe0379SLisandro Dalcin    PetscDrawLGSetUseMarkers - Causes LG to draw a marker for each data-point.
4485c6c1daeSBarry Smith 
4495b399a63SLisandro Dalcin    Logically Collective on PetscDrawLG
4505c6c1daeSBarry Smith 
4515c6c1daeSBarry Smith    Input Parameters:
452287de1a7SBarry Smith +  lg - the linegraph context
453287de1a7SBarry Smith -  flg - should mark each data point
454287de1a7SBarry Smith 
455287de1a7SBarry Smith    Options Database:
456b6fe0379SLisandro Dalcin .  -lg_use_markers  <true,false>
4575c6c1daeSBarry Smith 
4585c6c1daeSBarry Smith    Level: intermediate
4595c6c1daeSBarry Smith 
4605c6c1daeSBarry Smith    Concepts: line graph^showing points
4615c6c1daeSBarry Smith 
462*ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate()
463*ba1e01c4SBarry Smith 
4645c6c1daeSBarry Smith @*/
465b6fe0379SLisandro Dalcin PetscErrorCode  PetscDrawLGSetUseMarkers(PetscDrawLG lg,PetscBool flg)
4665c6c1daeSBarry Smith {
4675c6c1daeSBarry Smith   PetscFunctionBegin;
468e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
46945f3bb6eSLisandro Dalcin   PetscValidLogicalCollectiveBool(lg,flg,2);
470b6fe0379SLisandro Dalcin   lg->use_markers = flg;
4715c6c1daeSBarry Smith   PetscFunctionReturn(0);
4725c6c1daeSBarry Smith }
4735c6c1daeSBarry Smith 
4745c6c1daeSBarry Smith #undef __FUNCT__
4755c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGDraw"
4765c6c1daeSBarry Smith /*@
4775c6c1daeSBarry Smith    PetscDrawLGDraw - Redraws a line graph.
4785c6c1daeSBarry Smith 
4795b399a63SLisandro Dalcin    Collective on PetscDrawLG
4805c6c1daeSBarry Smith 
4815c6c1daeSBarry Smith    Input Parameter:
4825c6c1daeSBarry Smith .  lg - the line graph context
4835c6c1daeSBarry Smith 
4845c6c1daeSBarry Smith    Level: intermediate
4855c6c1daeSBarry Smith 
486*ba1e01c4SBarry Smith .seealso: PetscDrawSPDraw(), PetscDrawLGSPDraw(), PetscDrawLGReset()
4875c6c1daeSBarry Smith 
4885c6c1daeSBarry Smith @*/
4895c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGDraw(PetscDrawLG lg)
4905c6c1daeSBarry Smith {
491e118a51fSLisandro Dalcin   PetscReal      xmin,xmax,ymin,ymax;
4925c6c1daeSBarry Smith   PetscErrorCode ierr;
493e118a51fSLisandro Dalcin   PetscMPIInt    rank;
494e118a51fSLisandro Dalcin   PetscDraw      draw;
4955c6c1daeSBarry Smith   PetscBool      isnull;
4965c6c1daeSBarry Smith 
4975c6c1daeSBarry Smith   PetscFunctionBegin;
4985c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
4998f69470aSLisandro Dalcin   ierr = PetscDrawIsNull(lg->win,&isnull);CHKERRQ(ierr);
5008f69470aSLisandro Dalcin   if (isnull) PetscFunctionReturn(0);
501e118a51fSLisandro Dalcin   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)lg),&rank);CHKERRQ(ierr);
5025c6c1daeSBarry Smith 
5035b399a63SLisandro Dalcin   draw = lg->win;
5045c6c1daeSBarry Smith   ierr = PetscDrawCheckResizedWindow(draw);CHKERRQ(ierr);
5055b399a63SLisandro Dalcin   ierr = PetscDrawClear(draw);CHKERRQ(ierr);
506e118a51fSLisandro Dalcin 
507e118a51fSLisandro Dalcin   xmin = lg->xmin; xmax = lg->xmax; ymin = lg->ymin; ymax = lg->ymax;
5085c6c1daeSBarry Smith   ierr = PetscDrawAxisSetLimits(lg->axis,xmin,xmax,ymin,ymax);CHKERRQ(ierr);
5095c6c1daeSBarry Smith   ierr = PetscDrawAxisDraw(lg->axis);CHKERRQ(ierr);
5105c6c1daeSBarry Smith 
5115b399a63SLisandro Dalcin   ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
5125c6c1daeSBarry Smith   if (!rank) {
513e118a51fSLisandro Dalcin     int i,j,dim=lg->dim,nopts=lg->nopts,cl;
5145c6c1daeSBarry Smith     for (i=0; i<dim; i++) {
5155c6c1daeSBarry Smith       for (j=1; j<nopts; j++) {
51671917b75SLisandro Dalcin         cl   = lg->colors ? lg->colors[i] : (PETSC_DRAW_BLACK + i);
5175c6c1daeSBarry 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);
51871917b75SLisandro Dalcin         if (lg->use_markers) {ierr = PetscDrawMarker(draw,lg->x[j*dim+i],lg->y[j*dim+i],cl);CHKERRQ(ierr);}
5195c6c1daeSBarry Smith       }
5205c6c1daeSBarry Smith     }
5215c6c1daeSBarry Smith   }
52256a02f31SLisandro Dalcin   if (!rank && lg->legend) {
523e118a51fSLisandro Dalcin     int       i,dim=lg->dim,cl;
5245c6c1daeSBarry Smith     PetscReal xl,yl,xr,yr,tw,th;
52571917b75SLisandro Dalcin     size_t    slen,len=0;
52671917b75SLisandro Dalcin     ierr = PetscDrawAxisGetLimits(lg->axis,&xl,&xr,&yl,&yr);CHKERRQ(ierr);
5275c6c1daeSBarry Smith     ierr = PetscDrawStringGetSize(draw,&tw,&th);CHKERRQ(ierr);
5285c6c1daeSBarry Smith     for (i=0; i<dim; i++) {
52971917b75SLisandro Dalcin       ierr = PetscStrlen(lg->legend[i],&slen);CHKERRQ(ierr);
53071917b75SLisandro Dalcin       len = PetscMax(len,slen);
5315c6c1daeSBarry Smith     }
53271917b75SLisandro Dalcin     xr = xr - 1.5*tw; xl = xr - (len + 7)*tw;
53371917b75SLisandro Dalcin     yr = yr - 1.0*th; yl = yr - (dim + 1)*th;
53471917b75SLisandro Dalcin     ierr = PetscDrawLine(draw,xl,yl,xr,yl,PETSC_DRAW_BLACK);CHKERRQ(ierr);
53571917b75SLisandro Dalcin     ierr = PetscDrawLine(draw,xr,yl,xr,yr,PETSC_DRAW_BLACK);CHKERRQ(ierr);
53671917b75SLisandro Dalcin     ierr = PetscDrawLine(draw,xr,yr,xl,yr,PETSC_DRAW_BLACK);CHKERRQ(ierr);
53771917b75SLisandro Dalcin     ierr = PetscDrawLine(draw,xl,yr,xl,yl,PETSC_DRAW_BLACK);CHKERRQ(ierr);
5385c6c1daeSBarry Smith     for  (i=0; i<dim; i++) {
53971917b75SLisandro Dalcin       cl   = lg->colors ? lg->colors[i] : (PETSC_DRAW_BLACK + i);
54071917b75SLisandro Dalcin       ierr = PetscDrawLine(draw,xl + 1*tw,yr - (i + 1)*th,xl + 5*tw,yr - (i + 1)*th,cl);CHKERRQ(ierr);
54171917b75SLisandro Dalcin       ierr = PetscDrawString(draw,xl + 6*tw,yr - (i + 1.5)*th,PETSC_DRAW_BLACK,lg->legend[i]);CHKERRQ(ierr);
5425c6c1daeSBarry Smith     }
5435c6c1daeSBarry Smith   }
544e118a51fSLisandro Dalcin   ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
5455b399a63SLisandro Dalcin 
5465b399a63SLisandro Dalcin   ierr = PetscDrawFlush(draw);CHKERRQ(ierr);
547e118a51fSLisandro Dalcin   ierr = PetscDrawPause(draw);CHKERRQ(ierr);
5485c6c1daeSBarry Smith   PetscFunctionReturn(0);
5495c6c1daeSBarry Smith }
5505c6c1daeSBarry Smith 
5515c6c1daeSBarry Smith #undef __FUNCT__
55257fd6651SLisandro Dalcin #define __FUNCT__ "PetscDrawLGSave"
55357fd6651SLisandro Dalcin /*@
55457fd6651SLisandro Dalcin   PetscDrawLGSave - Saves a drawn image
55557fd6651SLisandro Dalcin 
55657fd6651SLisandro Dalcin   Collective on PetscDrawLG
55757fd6651SLisandro Dalcin 
55857fd6651SLisandro Dalcin   Input Parameter:
55957fd6651SLisandro Dalcin . lg - The line graph context
56057fd6651SLisandro Dalcin 
56157fd6651SLisandro Dalcin   Level: intermediate
56257fd6651SLisandro Dalcin 
56357fd6651SLisandro Dalcin   Concepts: line graph^saving
56457fd6651SLisandro Dalcin 
56557fd6651SLisandro Dalcin .seealso:  PetscDrawLGCreate(), PetscDrawLGGetDraw(), PetscDrawSetSave(), PetscDrawSave()
56657fd6651SLisandro Dalcin @*/
56757fd6651SLisandro Dalcin PetscErrorCode  PetscDrawLGSave(PetscDrawLG lg)
56857fd6651SLisandro Dalcin {
56957fd6651SLisandro Dalcin   PetscErrorCode ierr;
57057fd6651SLisandro Dalcin 
57157fd6651SLisandro Dalcin   PetscFunctionBegin;
57257fd6651SLisandro Dalcin   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
57357fd6651SLisandro Dalcin   ierr = PetscDrawSave(lg->win);CHKERRQ(ierr);
57457fd6651SLisandro Dalcin   PetscFunctionReturn(0);
57557fd6651SLisandro Dalcin }
57657fd6651SLisandro Dalcin 
57757fd6651SLisandro Dalcin #undef __FUNCT__
57834a5a0e3SBarry Smith #define __FUNCT__ "PetscDrawLGView"
5795c6c1daeSBarry Smith /*@
58034a5a0e3SBarry Smith   PetscDrawLGView - Prints a line graph.
5815c6c1daeSBarry Smith 
5825b399a63SLisandro Dalcin   Collective on PetscDrawLG
5835c6c1daeSBarry Smith 
5845c6c1daeSBarry Smith   Input Parameter:
5855c6c1daeSBarry Smith . lg - the line graph context
5865c6c1daeSBarry Smith 
5875c6c1daeSBarry Smith   Level: beginner
5885c6c1daeSBarry Smith 
589*ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate()
590*ba1e01c4SBarry Smith 
5915c6c1daeSBarry Smith .keywords:  draw, line, graph
5925c6c1daeSBarry Smith @*/
59334a5a0e3SBarry Smith PetscErrorCode  PetscDrawLGView(PetscDrawLG lg,PetscViewer viewer)
5945c6c1daeSBarry Smith {
5955c6c1daeSBarry Smith   PetscReal      xmin=lg->xmin, xmax=lg->xmax, ymin=lg->ymin, ymax=lg->ymax;
59634a5a0e3SBarry Smith   PetscInt       i, j, dim = lg->dim, nopts = lg->nopts;
59734a5a0e3SBarry Smith   PetscErrorCode ierr;
5985c6c1daeSBarry Smith 
5995c6c1daeSBarry Smith   PetscFunctionBegin;
6005c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
601e118a51fSLisandro Dalcin 
6025c6c1daeSBarry Smith   if (nopts < 1)                  PetscFunctionReturn(0);
6035c6c1daeSBarry Smith   if (xmin > xmax || ymin > ymax) PetscFunctionReturn(0);
6045c6c1daeSBarry Smith 
60534a5a0e3SBarry Smith   if (!viewer){
60634a5a0e3SBarry Smith     ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)lg),&viewer);CHKERRQ(ierr);
60734a5a0e3SBarry Smith   }
60898c3331eSBarry Smith   ierr = PetscObjectPrintClassNamePrefixType((PetscObject)lg,viewer);CHKERRQ(ierr);
6095c6c1daeSBarry Smith   for (i = 0; i < dim; i++) {
61034a5a0e3SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer, "Line %D>\n", i);CHKERRQ(ierr);
6115c6c1daeSBarry Smith     for (j = 0; j < nopts; j++) {
61234a5a0e3SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer, "  X: %g Y: %g\n", (double)lg->x[j*dim+i], (double)lg->y[j*dim+i]);CHKERRQ(ierr);
6135c6c1daeSBarry Smith     }
6145c6c1daeSBarry Smith   }
6155c6c1daeSBarry Smith   PetscFunctionReturn(0);
6165c6c1daeSBarry Smith }
617287de1a7SBarry Smith 
618287de1a7SBarry Smith #undef __FUNCT__
619c2bac407SLisandro Dalcin #define __FUNCT__ "PetscDrawLGSetOptionsPrefix"
620c2bac407SLisandro Dalcin /*@C
621c2bac407SLisandro Dalcin    PetscDrawLGSetOptionsPrefix - Sets the prefix used for searching for all
622c2bac407SLisandro Dalcin    PetscDrawLG options in the database.
623c2bac407SLisandro Dalcin 
624c2bac407SLisandro Dalcin    Logically Collective on PetscDrawLG
625c2bac407SLisandro Dalcin 
626c2bac407SLisandro Dalcin    Input Parameter:
627c2bac407SLisandro Dalcin +  lg - the line graph context
628c2bac407SLisandro Dalcin -  prefix - the prefix to prepend to all option names
629c2bac407SLisandro Dalcin 
630c2bac407SLisandro Dalcin    Level: advanced
631c2bac407SLisandro Dalcin 
632c2bac407SLisandro Dalcin .keywords: PetscDrawLG, set, options, prefix, database
633c2bac407SLisandro Dalcin 
634*ba1e01c4SBarry Smith .seealso: PetscDrawLGSetFromOptions(), PetscDrawLGCreate()
635c2bac407SLisandro Dalcin @*/
636c2bac407SLisandro Dalcin PetscErrorCode  PetscDrawLGSetOptionsPrefix(PetscDrawLG lg,const char prefix[])
637c2bac407SLisandro Dalcin {
638c2bac407SLisandro Dalcin   PetscErrorCode ierr;
639c2bac407SLisandro Dalcin 
640c2bac407SLisandro Dalcin   PetscFunctionBegin;
641c2bac407SLisandro Dalcin   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
642c2bac407SLisandro Dalcin   ierr = PetscObjectSetOptionsPrefix((PetscObject)lg,prefix);CHKERRQ(ierr);
643c2bac407SLisandro Dalcin   PetscFunctionReturn(0);
644c2bac407SLisandro Dalcin }
645c2bac407SLisandro Dalcin 
646c2bac407SLisandro Dalcin #undef __FUNCT__
647287de1a7SBarry Smith #define __FUNCT__ "PetscDrawLGSetFromOptions"
648287de1a7SBarry Smith /*@
649287de1a7SBarry Smith     PetscDrawLGSetFromOptions - Sets options related to the PetscDrawLG
650287de1a7SBarry Smith 
6515b399a63SLisandro Dalcin     Collective on PetscDrawLG
652287de1a7SBarry Smith 
653287de1a7SBarry Smith     Options Database:
654287de1a7SBarry Smith 
655287de1a7SBarry Smith     Level: intermediate
656287de1a7SBarry Smith 
657287de1a7SBarry Smith     Concepts: line graph^creating
658287de1a7SBarry Smith 
659287de1a7SBarry Smith .seealso:  PetscDrawLGDestroy(), PetscDrawLGCreate()
660287de1a7SBarry Smith @*/
661287de1a7SBarry Smith PetscErrorCode  PetscDrawLGSetFromOptions(PetscDrawLG lg)
662287de1a7SBarry Smith {
663287de1a7SBarry Smith   PetscErrorCode      ierr;
66471917b75SLisandro Dalcin   PetscBool           usemarkers,set;
66571917b75SLisandro Dalcin   PetscDrawMarkerType markertype;
666287de1a7SBarry Smith 
667287de1a7SBarry Smith   PetscFunctionBegin;
668e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
669e118a51fSLisandro Dalcin 
67071917b75SLisandro Dalcin   ierr = PetscDrawGetMarkerType(lg->win,&markertype);CHKERRQ(ierr);
67171917b75SLisandro Dalcin   ierr = PetscOptionsGetEnum(((PetscObject)lg)->options,((PetscObject)lg)->prefix,"-lg_marker_type",PetscDrawMarkerTypes,(PetscEnum*)&markertype,&set);CHKERRQ(ierr);
67271917b75SLisandro Dalcin   if (set) {
67371917b75SLisandro Dalcin     ierr = PetscDrawLGSetUseMarkers(lg,PETSC_TRUE);CHKERRQ(ierr);
67471917b75SLisandro Dalcin     ierr = PetscDrawSetMarkerType(lg->win,markertype);CHKERRQ(ierr);
67571917b75SLisandro Dalcin   }
67671917b75SLisandro Dalcin   usemarkers = lg->use_markers;
67771917b75SLisandro Dalcin   ierr = PetscOptionsGetBool(((PetscObject)lg)->options,((PetscObject)lg)->prefix,"-lg_use_markers",&usemarkers,&set);CHKERRQ(ierr);
67871917b75SLisandro Dalcin   if (set) {ierr = PetscDrawLGSetUseMarkers(lg,usemarkers);CHKERRQ(ierr);}
679287de1a7SBarry Smith   PetscFunctionReturn(0);
680287de1a7SBarry Smith }
681