xref: /petsc/src/sys/classes/draw/utils/lgc.c (revision 7e25d57eb54699967dd470a5d26171ae4cb7a45d)
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 
24ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate(), PetscDrawAxis
25ba1e01c4SBarry 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 
51ba1e01c4SBarry 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 
150*7e25d57eSBarry 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
151*7e25d57eSBarry Smith            zeroth MPI process in the communicator. All MPI processes in the communicator must call PetscDrawLGDraw() to display the updated graph.
152*7e25d57eSBarry Smith 
1535c6c1daeSBarry Smith     Concepts: line graph^creating
1545c6c1daeSBarry Smith 
155ba1e01c4SBarry Smith .seealso:  PetscDrawLGDestroy(), PetscDrawLGAddPoint(), PetscDrawLGAddCommonPoint(), PetscDrawLGAddPoints(), PetscDrawLGDraw(), PetscDrawLGSave(),
156ba1e01c4SBarry Smith            PetscDrawLGView(), PetscDrawLGReset(), PetscDrawLGSetDimension(), PetscDrawLGGetDimension(), PetscDrawLGSetLegend(), PetscDrawLGGetAxis(),
157ba1e01c4SBarry Smith            PetscDrawLGGetDraw(), PetscDrawLGSetUseMarkers(), PetscDrawLGSetLimits(), PetscDrawLGSetColors(), PetscDrawLGSetOptionsPrefix(), PetscDrawLGSetFromOptions()
1585c6c1daeSBarry Smith @*/
159e118a51fSLisandro Dalcin PetscErrorCode  PetscDrawLGCreate(PetscDraw draw,PetscInt dim,PetscDrawLG *outlg)
1605c6c1daeSBarry Smith {
1615c6c1daeSBarry Smith   PetscDrawLG    lg;
162e118a51fSLisandro Dalcin   PetscErrorCode ierr;
1635c6c1daeSBarry Smith 
1645c6c1daeSBarry Smith   PetscFunctionBegin;
1655c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
166e118a51fSLisandro Dalcin   PetscValidLogicalCollectiveInt(draw,dim,2);
167e118a51fSLisandro Dalcin   PetscValidPointer(outlg,3);
168e118a51fSLisandro Dalcin 
16971917b75SLisandro Dalcin   ierr = PetscHeaderCreate(lg,PETSC_DRAWLG_CLASSID,"DrawLG","Line Graph","Draw",PetscObjectComm((PetscObject)draw),PetscDrawLGDestroy,NULL);CHKERRQ(ierr);
170e118a51fSLisandro Dalcin   ierr = PetscLogObjectParent((PetscObject)draw,(PetscObject)lg);CHKERRQ(ierr);
171c2bac407SLisandro Dalcin   ierr = PetscDrawLGSetOptionsPrefix(lg,((PetscObject)draw)->prefix);CHKERRQ(ierr);
172e118a51fSLisandro Dalcin 
173e118a51fSLisandro Dalcin   ierr = PetscObjectReference((PetscObject)draw);CHKERRQ(ierr);
174e118a51fSLisandro Dalcin   lg->win = draw;
175a297a907SKarl Rupp 
17669c83917SLisandro Dalcin   lg->view    = NULL;
17769c83917SLisandro Dalcin   lg->destroy = NULL;
1785c6c1daeSBarry Smith   lg->nopts   = 0;
1795c6c1daeSBarry Smith   lg->dim     = dim;
1805c6c1daeSBarry Smith   lg->xmin    = 1.e20;
1815c6c1daeSBarry Smith   lg->ymin    = 1.e20;
1825c6c1daeSBarry Smith   lg->xmax    = -1.e20;
1835c6c1daeSBarry Smith   lg->ymax    = -1.e20;
184a297a907SKarl Rupp 
185dcca6d9dSJed Brown   ierr = PetscMalloc2(dim*CHUNCKSIZE,&lg->x,dim*CHUNCKSIZE,&lg->y);CHKERRQ(ierr);
1863bb1ff40SBarry Smith   ierr = PetscLogObjectMemory((PetscObject)lg,2*dim*CHUNCKSIZE*sizeof(PetscReal));CHKERRQ(ierr);
187a297a907SKarl Rupp 
1885c6c1daeSBarry Smith   lg->len         = dim*CHUNCKSIZE;
1895c6c1daeSBarry Smith   lg->loc         = 0;
190b6fe0379SLisandro Dalcin   lg->use_markers = PETSC_FALSE;
191a297a907SKarl Rupp 
1925c6c1daeSBarry Smith   ierr = PetscDrawAxisCreate(draw,&lg->axis);CHKERRQ(ierr);
1933bb1ff40SBarry Smith   ierr = PetscLogObjectParent((PetscObject)lg,(PetscObject)lg->axis);CHKERRQ(ierr);
194a297a907SKarl Rupp 
195e118a51fSLisandro Dalcin   *outlg = lg;
1965c6c1daeSBarry Smith   PetscFunctionReturn(0);
1975c6c1daeSBarry Smith }
1985c6c1daeSBarry Smith 
1995c6c1daeSBarry Smith #undef __FUNCT__
2005c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGSetColors"
2015c6c1daeSBarry Smith /*@
2025c6c1daeSBarry Smith    PetscDrawLGSetColors - Sets the color of each line graph drawn
2035c6c1daeSBarry Smith 
2045b399a63SLisandro Dalcin    Logically Collective on PetscDrawLG
2055c6c1daeSBarry Smith 
2065c6c1daeSBarry Smith    Input Parameter:
2075c6c1daeSBarry Smith +  lg - the line graph context.
2085c6c1daeSBarry Smith -  colors - the colors
2095c6c1daeSBarry Smith 
2105c6c1daeSBarry Smith    Level: intermediate
2115c6c1daeSBarry Smith 
2125c6c1daeSBarry Smith    Concepts: line graph^setting number of lines
2135c6c1daeSBarry Smith 
214ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate()
215ba1e01c4SBarry Smith 
2165c6c1daeSBarry Smith @*/
21745f3bb6eSLisandro Dalcin PetscErrorCode  PetscDrawLGSetColors(PetscDrawLG lg,const int colors[])
2185c6c1daeSBarry Smith {
2195c6c1daeSBarry Smith   PetscErrorCode ierr;
2205c6c1daeSBarry Smith 
2215c6c1daeSBarry Smith   PetscFunctionBegin;
2225c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
22345f3bb6eSLisandro Dalcin   if (lg->dim) PetscValidIntPointer(colors,2);
224e118a51fSLisandro Dalcin 
2255c6c1daeSBarry Smith   ierr = PetscFree(lg->colors);CHKERRQ(ierr);
226785e854fSJed Brown   ierr = PetscMalloc1(lg->dim,&lg->colors);CHKERRQ(ierr);
2275c6c1daeSBarry Smith   ierr = PetscMemcpy(lg->colors,colors,lg->dim*sizeof(int));CHKERRQ(ierr);
2285c6c1daeSBarry Smith   PetscFunctionReturn(0);
2295c6c1daeSBarry Smith }
2305c6c1daeSBarry Smith 
2315c6c1daeSBarry Smith #undef __FUNCT__
2325c6c1daeSBarry Smith #undef __FUNCT__
2335c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGSetLegend"
2345c6c1daeSBarry Smith /*@C
2355c6c1daeSBarry Smith    PetscDrawLGSetLegend - sets the names of each curve plotted
2365c6c1daeSBarry Smith 
2375b399a63SLisandro Dalcin    Logically Collective on PetscDrawLG
2385c6c1daeSBarry Smith 
2395c6c1daeSBarry Smith    Input Parameter:
2405c6c1daeSBarry Smith +  lg - the line graph context.
2415c6c1daeSBarry Smith -  names - the names for each curve
2425c6c1daeSBarry Smith 
2435c6c1daeSBarry Smith    Level: intermediate
2445c6c1daeSBarry Smith 
245ba1e01c4SBarry Smith    Notes: Call PetscDrawLGGetAxis() and then change properties of the PetscDrawAxis for detailed control of the plot
246ba1e01c4SBarry Smith 
2475c6c1daeSBarry Smith    Concepts: line graph^setting number of lines
2485c6c1daeSBarry Smith 
249ba1e01c4SBarry Smith .seealso: PetscDrawLGGetAxis(), PetscDrawAxis, PetscDrawAxisSetColors(), PetscDrawAxisSetLabels(), PetscDrawAxisSetHoldLimits()
250ba1e01c4SBarry Smith 
2515c6c1daeSBarry Smith @*/
2525c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGSetLegend(PetscDrawLG lg,const char *const *names)
2535c6c1daeSBarry Smith {
2545c6c1daeSBarry Smith   PetscErrorCode ierr;
2555c6c1daeSBarry Smith   PetscInt       i;
2565c6c1daeSBarry Smith 
2575c6c1daeSBarry Smith   PetscFunctionBegin;
2585c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
25945f3bb6eSLisandro Dalcin   if (names) PetscValidPointer(names,2);
2605c6c1daeSBarry Smith 
2615c6c1daeSBarry Smith   if (lg->legend) {
2625c6c1daeSBarry Smith     for (i=0; i<lg->dim; i++) {
2635c6c1daeSBarry Smith       ierr = PetscFree(lg->legend[i]);CHKERRQ(ierr);
2645c6c1daeSBarry Smith     }
2655c6c1daeSBarry Smith     ierr = PetscFree(lg->legend);CHKERRQ(ierr);
2665c6c1daeSBarry Smith   }
2675c6c1daeSBarry Smith   if (names) {
268785e854fSJed Brown     ierr = PetscMalloc1(lg->dim,&lg->legend);CHKERRQ(ierr);
2695c6c1daeSBarry Smith     for (i=0; i<lg->dim; i++) {
2705c6c1daeSBarry Smith       ierr = PetscStrallocpy(names[i],&lg->legend[i]);CHKERRQ(ierr);
2715c6c1daeSBarry Smith     }
2725c6c1daeSBarry Smith   }
2735c6c1daeSBarry Smith   PetscFunctionReturn(0);
2745c6c1daeSBarry Smith }
2755c6c1daeSBarry Smith 
2765c6c1daeSBarry Smith #undef __FUNCT__
2775c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGGetDimension"
2785c6c1daeSBarry Smith /*@
2795c6c1daeSBarry Smith    PetscDrawLGGetDimension - Change the number of lines that are to be drawn.
2805c6c1daeSBarry Smith 
2815b399a63SLisandro Dalcin    Not Collective
2825c6c1daeSBarry Smith 
2835c6c1daeSBarry Smith    Input Parameter:
2845c6c1daeSBarry Smith .  lg - the line graph context.
2855c6c1daeSBarry Smith 
2865c6c1daeSBarry Smith    Output Parameter:
2875c6c1daeSBarry Smith .  dim - the number of curves.
2885c6c1daeSBarry Smith 
2895c6c1daeSBarry Smith    Level: intermediate
2905c6c1daeSBarry Smith 
2915c6c1daeSBarry Smith    Concepts: line graph^setting number of lines
2925c6c1daeSBarry Smith 
293ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate(), PetscDrawLGSetDimension()
294ba1e01c4SBarry Smith 
2955c6c1daeSBarry Smith @*/
2965c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGGetDimension(PetscDrawLG lg,PetscInt *dim)
2975c6c1daeSBarry Smith {
2985c6c1daeSBarry Smith   PetscFunctionBegin;
2995c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
30045f3bb6eSLisandro Dalcin   PetscValidIntPointer(dim,2);
3015c6c1daeSBarry Smith   *dim = lg->dim;
3025c6c1daeSBarry Smith   PetscFunctionReturn(0);
3035c6c1daeSBarry Smith }
3045c6c1daeSBarry Smith 
3055c6c1daeSBarry Smith #undef __FUNCT__
3065c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGSetDimension"
3075c6c1daeSBarry Smith /*@
3085c6c1daeSBarry Smith    PetscDrawLGSetDimension - Change the number of lines that are to be drawn.
3095c6c1daeSBarry Smith 
3105b399a63SLisandro Dalcin    Logically Collective on PetscDrawLG
3115c6c1daeSBarry Smith 
3125c6c1daeSBarry Smith    Input Parameter:
3135c6c1daeSBarry Smith +  lg - the line graph context.
3145c6c1daeSBarry Smith -  dim - the number of curves.
3155c6c1daeSBarry Smith 
3165c6c1daeSBarry Smith    Level: intermediate
3175c6c1daeSBarry Smith 
3185c6c1daeSBarry Smith    Concepts: line graph^setting number of lines
3195c6c1daeSBarry Smith 
320ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate(), PetscDrawLGGetDimension()
3215c6c1daeSBarry Smith @*/
3225c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGSetDimension(PetscDrawLG lg,PetscInt dim)
3235c6c1daeSBarry Smith {
3245c6c1daeSBarry Smith   PetscErrorCode ierr;
3255c6c1daeSBarry Smith   PetscInt       i;
3265c6c1daeSBarry Smith 
3275c6c1daeSBarry Smith   PetscFunctionBegin;
3285c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
3295c6c1daeSBarry Smith   PetscValidLogicalCollectiveInt(lg,dim,2);
3305c6c1daeSBarry Smith   if (lg->dim == dim) PetscFunctionReturn(0);
3315c6c1daeSBarry Smith 
3325c6c1daeSBarry Smith   ierr = PetscFree2(lg->x,lg->y);CHKERRQ(ierr);
3335c6c1daeSBarry Smith   if (lg->legend) {
3345c6c1daeSBarry Smith     for (i=0; i<lg->dim; i++) {
3355c6c1daeSBarry Smith       ierr = PetscFree(lg->legend[i]);CHKERRQ(ierr);
3365c6c1daeSBarry Smith     }
3375c6c1daeSBarry Smith     ierr = PetscFree(lg->legend);CHKERRQ(ierr);
3385c6c1daeSBarry Smith   }
3395c6c1daeSBarry Smith   ierr    = PetscFree(lg->colors);CHKERRQ(ierr);
3405c6c1daeSBarry Smith   lg->dim = dim;
341dcca6d9dSJed Brown   ierr    = PetscMalloc2(dim*CHUNCKSIZE,&lg->x,dim*CHUNCKSIZE,&lg->y);CHKERRQ(ierr);
3423bb1ff40SBarry Smith   ierr    = PetscLogObjectMemory((PetscObject)lg,2*dim*CHUNCKSIZE*sizeof(PetscReal));CHKERRQ(ierr);
3435c6c1daeSBarry Smith   lg->len = dim*CHUNCKSIZE;
3445c6c1daeSBarry Smith   PetscFunctionReturn(0);
3455c6c1daeSBarry Smith }
3465c6c1daeSBarry Smith 
34771917b75SLisandro Dalcin 
34871917b75SLisandro Dalcin #undef __FUNCT__
34971917b75SLisandro Dalcin #define __FUNCT__ "PetscDrawLGSetLimits"
35071917b75SLisandro Dalcin /*@
35171917b75SLisandro Dalcin    PetscDrawLGSetLimits - Sets the axis limits for a line graph. If more
35271917b75SLisandro Dalcin    points are added after this call, the limits will be adjusted to
35371917b75SLisandro Dalcin    include those additional points.
35471917b75SLisandro Dalcin 
35571917b75SLisandro Dalcin    Logically Collective on PetscDrawLG
35671917b75SLisandro Dalcin 
35771917b75SLisandro Dalcin    Input Parameters:
35871917b75SLisandro Dalcin +  xlg - the line graph context
35971917b75SLisandro Dalcin -  x_min,x_max,y_min,y_max - the limits
36071917b75SLisandro Dalcin 
36171917b75SLisandro Dalcin    Level: intermediate
36271917b75SLisandro Dalcin 
36371917b75SLisandro Dalcin    Concepts: line graph^setting axis
36471917b75SLisandro Dalcin 
365ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate()
366ba1e01c4SBarry Smith 
36771917b75SLisandro Dalcin @*/
36871917b75SLisandro Dalcin PetscErrorCode  PetscDrawLGSetLimits(PetscDrawLG lg,PetscReal x_min,PetscReal x_max,PetscReal y_min,PetscReal y_max)
36971917b75SLisandro Dalcin {
37071917b75SLisandro Dalcin   PetscFunctionBegin;
37171917b75SLisandro Dalcin   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
37271917b75SLisandro Dalcin 
37371917b75SLisandro Dalcin   (lg)->xmin = x_min;
37471917b75SLisandro Dalcin   (lg)->xmax = x_max;
37571917b75SLisandro Dalcin   (lg)->ymin = y_min;
37671917b75SLisandro Dalcin   (lg)->ymax = y_max;
37771917b75SLisandro Dalcin   PetscFunctionReturn(0);
37871917b75SLisandro Dalcin }
37971917b75SLisandro Dalcin 
3805c6c1daeSBarry Smith #undef __FUNCT__
3815c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGReset"
3825c6c1daeSBarry Smith /*@
3835c6c1daeSBarry Smith    PetscDrawLGReset - Clears line graph to allow for reuse with new data.
3845c6c1daeSBarry Smith 
3855b399a63SLisandro Dalcin    Logically Collective on PetscDrawLG
3865c6c1daeSBarry Smith 
3875c6c1daeSBarry Smith    Input Parameter:
3885c6c1daeSBarry Smith .  lg - the line graph context.
3895c6c1daeSBarry Smith 
3905c6c1daeSBarry Smith    Level: intermediate
3915c6c1daeSBarry Smith 
3925c6c1daeSBarry Smith    Concepts: line graph^restarting
3935c6c1daeSBarry Smith 
394ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate()
395ba1e01c4SBarry Smith 
3965c6c1daeSBarry Smith @*/
3975c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGReset(PetscDrawLG lg)
3985c6c1daeSBarry Smith {
3995c6c1daeSBarry Smith   PetscFunctionBegin;
4005c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
4015c6c1daeSBarry Smith   lg->xmin  = 1.e20;
4025c6c1daeSBarry Smith   lg->ymin  = 1.e20;
4035c6c1daeSBarry Smith   lg->xmax  = -1.e20;
4045c6c1daeSBarry Smith   lg->ymax  = -1.e20;
4055c6c1daeSBarry Smith   lg->loc   = 0;
4065c6c1daeSBarry Smith   lg->nopts = 0;
4075c6c1daeSBarry Smith   PetscFunctionReturn(0);
4085c6c1daeSBarry Smith }
4095c6c1daeSBarry Smith 
4105c6c1daeSBarry Smith #undef __FUNCT__
4115c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGDestroy"
4125c6c1daeSBarry Smith /*@
4135c6c1daeSBarry Smith    PetscDrawLGDestroy - Frees all space taken up by line graph data structure.
4145c6c1daeSBarry Smith 
4155b399a63SLisandro Dalcin    Collective on PetscDrawLG
4165c6c1daeSBarry Smith 
4175c6c1daeSBarry Smith    Input Parameter:
4185c6c1daeSBarry Smith .  lg - the line graph context
4195c6c1daeSBarry Smith 
4205c6c1daeSBarry Smith    Level: intermediate
4215c6c1daeSBarry Smith 
4225c6c1daeSBarry Smith .seealso:  PetscDrawLGCreate()
4235c6c1daeSBarry Smith @*/
4245c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGDestroy(PetscDrawLG *lg)
4255c6c1daeSBarry Smith {
4265c6c1daeSBarry Smith   PetscErrorCode ierr;
4275c6c1daeSBarry Smith   PetscInt       i;
4285c6c1daeSBarry Smith 
4295c6c1daeSBarry Smith   PetscFunctionBegin;
4305c6c1daeSBarry Smith   if (!*lg) PetscFunctionReturn(0);
431e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(*lg,PETSC_DRAWLG_CLASSID,1);
432e118a51fSLisandro Dalcin   if (--((PetscObject)(*lg))->refct > 0) {*lg = NULL; PetscFunctionReturn(0);}
4335c6c1daeSBarry Smith 
4345c6c1daeSBarry Smith   if ((*lg)->legend) {
4355c6c1daeSBarry Smith     for (i=0; i<(*lg)->dim; i++) {
4365c6c1daeSBarry Smith       ierr = PetscFree((*lg)->legend[i]);CHKERRQ(ierr);
4375c6c1daeSBarry Smith     }
4385c6c1daeSBarry Smith     ierr = PetscFree((*lg)->legend);CHKERRQ(ierr);
4395c6c1daeSBarry Smith   }
4405c6c1daeSBarry Smith   ierr = PetscFree((*lg)->colors);CHKERRQ(ierr);
4415c6c1daeSBarry Smith   ierr = PetscFree2((*lg)->x,(*lg)->y);CHKERRQ(ierr);
442e118a51fSLisandro Dalcin   ierr = PetscDrawAxisDestroy(&(*lg)->axis);CHKERRQ(ierr);
443e118a51fSLisandro Dalcin   ierr = PetscDrawDestroy(&(*lg)->win);CHKERRQ(ierr);
4445c6c1daeSBarry Smith   ierr = PetscHeaderDestroy(lg);CHKERRQ(ierr);
4455c6c1daeSBarry Smith   PetscFunctionReturn(0);
4465c6c1daeSBarry Smith }
4475c6c1daeSBarry Smith #undef __FUNCT__
448b6fe0379SLisandro Dalcin #define __FUNCT__ "PetscDrawLGSetUseMarkers"
4495c6c1daeSBarry Smith /*@
450b6fe0379SLisandro Dalcin    PetscDrawLGSetUseMarkers - Causes LG to draw a marker for each data-point.
4515c6c1daeSBarry Smith 
4525b399a63SLisandro Dalcin    Logically Collective on PetscDrawLG
4535c6c1daeSBarry Smith 
4545c6c1daeSBarry Smith    Input Parameters:
455287de1a7SBarry Smith +  lg - the linegraph context
456287de1a7SBarry Smith -  flg - should mark each data point
457287de1a7SBarry Smith 
458287de1a7SBarry Smith    Options Database:
459b6fe0379SLisandro Dalcin .  -lg_use_markers  <true,false>
4605c6c1daeSBarry Smith 
4615c6c1daeSBarry Smith    Level: intermediate
4625c6c1daeSBarry Smith 
4635c6c1daeSBarry Smith    Concepts: line graph^showing points
4645c6c1daeSBarry Smith 
465ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate()
466ba1e01c4SBarry Smith 
4675c6c1daeSBarry Smith @*/
468b6fe0379SLisandro Dalcin PetscErrorCode  PetscDrawLGSetUseMarkers(PetscDrawLG lg,PetscBool flg)
4695c6c1daeSBarry Smith {
4705c6c1daeSBarry Smith   PetscFunctionBegin;
471e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
47245f3bb6eSLisandro Dalcin   PetscValidLogicalCollectiveBool(lg,flg,2);
473b6fe0379SLisandro Dalcin   lg->use_markers = flg;
4745c6c1daeSBarry Smith   PetscFunctionReturn(0);
4755c6c1daeSBarry Smith }
4765c6c1daeSBarry Smith 
4775c6c1daeSBarry Smith #undef __FUNCT__
4785c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGDraw"
4795c6c1daeSBarry Smith /*@
4805c6c1daeSBarry Smith    PetscDrawLGDraw - Redraws a line graph.
4815c6c1daeSBarry Smith 
4825b399a63SLisandro Dalcin    Collective on PetscDrawLG
4835c6c1daeSBarry Smith 
4845c6c1daeSBarry Smith    Input Parameter:
4855c6c1daeSBarry Smith .  lg - the line graph context
4865c6c1daeSBarry Smith 
4875c6c1daeSBarry Smith    Level: intermediate
4885c6c1daeSBarry Smith 
489ba1e01c4SBarry Smith .seealso: PetscDrawSPDraw(), PetscDrawLGSPDraw(), PetscDrawLGReset()
4905c6c1daeSBarry Smith 
4915c6c1daeSBarry Smith @*/
4925c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGDraw(PetscDrawLG lg)
4935c6c1daeSBarry Smith {
494e118a51fSLisandro Dalcin   PetscReal      xmin,xmax,ymin,ymax;
4955c6c1daeSBarry Smith   PetscErrorCode ierr;
496e118a51fSLisandro Dalcin   PetscMPIInt    rank;
497e118a51fSLisandro Dalcin   PetscDraw      draw;
4985c6c1daeSBarry Smith   PetscBool      isnull;
4995c6c1daeSBarry Smith 
5005c6c1daeSBarry Smith   PetscFunctionBegin;
5015c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
5028f69470aSLisandro Dalcin   ierr = PetscDrawIsNull(lg->win,&isnull);CHKERRQ(ierr);
5038f69470aSLisandro Dalcin   if (isnull) PetscFunctionReturn(0);
504e118a51fSLisandro Dalcin   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)lg),&rank);CHKERRQ(ierr);
5055c6c1daeSBarry Smith 
5065b399a63SLisandro Dalcin   draw = lg->win;
5075c6c1daeSBarry Smith   ierr = PetscDrawCheckResizedWindow(draw);CHKERRQ(ierr);
5085b399a63SLisandro Dalcin   ierr = PetscDrawClear(draw);CHKERRQ(ierr);
509e118a51fSLisandro Dalcin 
510e118a51fSLisandro Dalcin   xmin = lg->xmin; xmax = lg->xmax; ymin = lg->ymin; ymax = lg->ymax;
5115c6c1daeSBarry Smith   ierr = PetscDrawAxisSetLimits(lg->axis,xmin,xmax,ymin,ymax);CHKERRQ(ierr);
5125c6c1daeSBarry Smith   ierr = PetscDrawAxisDraw(lg->axis);CHKERRQ(ierr);
5135c6c1daeSBarry Smith 
5145b399a63SLisandro Dalcin   ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
5155c6c1daeSBarry Smith   if (!rank) {
516e118a51fSLisandro Dalcin     int i,j,dim=lg->dim,nopts=lg->nopts,cl;
5175c6c1daeSBarry Smith     for (i=0; i<dim; i++) {
5185c6c1daeSBarry Smith       for (j=1; j<nopts; j++) {
51971917b75SLisandro Dalcin         cl   = lg->colors ? lg->colors[i] : (PETSC_DRAW_BLACK + i);
5205c6c1daeSBarry 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);
52171917b75SLisandro Dalcin         if (lg->use_markers) {ierr = PetscDrawMarker(draw,lg->x[j*dim+i],lg->y[j*dim+i],cl);CHKERRQ(ierr);}
5225c6c1daeSBarry Smith       }
5235c6c1daeSBarry Smith     }
5245c6c1daeSBarry Smith   }
52556a02f31SLisandro Dalcin   if (!rank && lg->legend) {
526e118a51fSLisandro Dalcin     int       i,dim=lg->dim,cl;
5275c6c1daeSBarry Smith     PetscReal xl,yl,xr,yr,tw,th;
52871917b75SLisandro Dalcin     size_t    slen,len=0;
52971917b75SLisandro Dalcin     ierr = PetscDrawAxisGetLimits(lg->axis,&xl,&xr,&yl,&yr);CHKERRQ(ierr);
5305c6c1daeSBarry Smith     ierr = PetscDrawStringGetSize(draw,&tw,&th);CHKERRQ(ierr);
5315c6c1daeSBarry Smith     for (i=0; i<dim; i++) {
53271917b75SLisandro Dalcin       ierr = PetscStrlen(lg->legend[i],&slen);CHKERRQ(ierr);
53371917b75SLisandro Dalcin       len = PetscMax(len,slen);
5345c6c1daeSBarry Smith     }
53571917b75SLisandro Dalcin     xr = xr - 1.5*tw; xl = xr - (len + 7)*tw;
53671917b75SLisandro Dalcin     yr = yr - 1.0*th; yl = yr - (dim + 1)*th;
53771917b75SLisandro Dalcin     ierr = PetscDrawLine(draw,xl,yl,xr,yl,PETSC_DRAW_BLACK);CHKERRQ(ierr);
53871917b75SLisandro Dalcin     ierr = PetscDrawLine(draw,xr,yl,xr,yr,PETSC_DRAW_BLACK);CHKERRQ(ierr);
53971917b75SLisandro Dalcin     ierr = PetscDrawLine(draw,xr,yr,xl,yr,PETSC_DRAW_BLACK);CHKERRQ(ierr);
54071917b75SLisandro Dalcin     ierr = PetscDrawLine(draw,xl,yr,xl,yl,PETSC_DRAW_BLACK);CHKERRQ(ierr);
5415c6c1daeSBarry Smith     for  (i=0; i<dim; i++) {
54271917b75SLisandro Dalcin       cl   = lg->colors ? lg->colors[i] : (PETSC_DRAW_BLACK + i);
54371917b75SLisandro Dalcin       ierr = PetscDrawLine(draw,xl + 1*tw,yr - (i + 1)*th,xl + 5*tw,yr - (i + 1)*th,cl);CHKERRQ(ierr);
54471917b75SLisandro Dalcin       ierr = PetscDrawString(draw,xl + 6*tw,yr - (i + 1.5)*th,PETSC_DRAW_BLACK,lg->legend[i]);CHKERRQ(ierr);
5455c6c1daeSBarry Smith     }
5465c6c1daeSBarry Smith   }
547e118a51fSLisandro Dalcin   ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
5485b399a63SLisandro Dalcin 
5495b399a63SLisandro Dalcin   ierr = PetscDrawFlush(draw);CHKERRQ(ierr);
550e118a51fSLisandro Dalcin   ierr = PetscDrawPause(draw);CHKERRQ(ierr);
5515c6c1daeSBarry Smith   PetscFunctionReturn(0);
5525c6c1daeSBarry Smith }
5535c6c1daeSBarry Smith 
5545c6c1daeSBarry Smith #undef __FUNCT__
55557fd6651SLisandro Dalcin #define __FUNCT__ "PetscDrawLGSave"
55657fd6651SLisandro Dalcin /*@
55757fd6651SLisandro Dalcin   PetscDrawLGSave - Saves a drawn image
55857fd6651SLisandro Dalcin 
55957fd6651SLisandro Dalcin   Collective on PetscDrawLG
56057fd6651SLisandro Dalcin 
56157fd6651SLisandro Dalcin   Input Parameter:
56257fd6651SLisandro Dalcin . lg - The line graph context
56357fd6651SLisandro Dalcin 
56457fd6651SLisandro Dalcin   Level: intermediate
56557fd6651SLisandro Dalcin 
56657fd6651SLisandro Dalcin   Concepts: line graph^saving
56757fd6651SLisandro Dalcin 
56857fd6651SLisandro Dalcin .seealso:  PetscDrawLGCreate(), PetscDrawLGGetDraw(), PetscDrawSetSave(), PetscDrawSave()
56957fd6651SLisandro Dalcin @*/
57057fd6651SLisandro Dalcin PetscErrorCode  PetscDrawLGSave(PetscDrawLG lg)
57157fd6651SLisandro Dalcin {
57257fd6651SLisandro Dalcin   PetscErrorCode ierr;
57357fd6651SLisandro Dalcin 
57457fd6651SLisandro Dalcin   PetscFunctionBegin;
57557fd6651SLisandro Dalcin   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
57657fd6651SLisandro Dalcin   ierr = PetscDrawSave(lg->win);CHKERRQ(ierr);
57757fd6651SLisandro Dalcin   PetscFunctionReturn(0);
57857fd6651SLisandro Dalcin }
57957fd6651SLisandro Dalcin 
58057fd6651SLisandro Dalcin #undef __FUNCT__
58134a5a0e3SBarry Smith #define __FUNCT__ "PetscDrawLGView"
5825c6c1daeSBarry Smith /*@
58334a5a0e3SBarry Smith   PetscDrawLGView - Prints a line graph.
5845c6c1daeSBarry Smith 
5855b399a63SLisandro Dalcin   Collective on PetscDrawLG
5865c6c1daeSBarry Smith 
5875c6c1daeSBarry Smith   Input Parameter:
5885c6c1daeSBarry Smith . lg - the line graph context
5895c6c1daeSBarry Smith 
5905c6c1daeSBarry Smith   Level: beginner
5915c6c1daeSBarry Smith 
592ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate()
593ba1e01c4SBarry Smith 
5945c6c1daeSBarry Smith .keywords:  draw, line, graph
5955c6c1daeSBarry Smith @*/
59634a5a0e3SBarry Smith PetscErrorCode  PetscDrawLGView(PetscDrawLG lg,PetscViewer viewer)
5975c6c1daeSBarry Smith {
5985c6c1daeSBarry Smith   PetscReal      xmin=lg->xmin, xmax=lg->xmax, ymin=lg->ymin, ymax=lg->ymax;
59934a5a0e3SBarry Smith   PetscInt       i, j, dim = lg->dim, nopts = lg->nopts;
60034a5a0e3SBarry Smith   PetscErrorCode ierr;
6015c6c1daeSBarry Smith 
6025c6c1daeSBarry Smith   PetscFunctionBegin;
6035c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
604e118a51fSLisandro Dalcin 
6055c6c1daeSBarry Smith   if (nopts < 1)                  PetscFunctionReturn(0);
6065c6c1daeSBarry Smith   if (xmin > xmax || ymin > ymax) PetscFunctionReturn(0);
6075c6c1daeSBarry Smith 
60834a5a0e3SBarry Smith   if (!viewer){
60934a5a0e3SBarry Smith     ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)lg),&viewer);CHKERRQ(ierr);
61034a5a0e3SBarry Smith   }
61198c3331eSBarry Smith   ierr = PetscObjectPrintClassNamePrefixType((PetscObject)lg,viewer);CHKERRQ(ierr);
6125c6c1daeSBarry Smith   for (i = 0; i < dim; i++) {
61334a5a0e3SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer, "Line %D>\n", i);CHKERRQ(ierr);
6145c6c1daeSBarry Smith     for (j = 0; j < nopts; j++) {
61534a5a0e3SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer, "  X: %g Y: %g\n", (double)lg->x[j*dim+i], (double)lg->y[j*dim+i]);CHKERRQ(ierr);
6165c6c1daeSBarry Smith     }
6175c6c1daeSBarry Smith   }
6185c6c1daeSBarry Smith   PetscFunctionReturn(0);
6195c6c1daeSBarry Smith }
620287de1a7SBarry Smith 
621287de1a7SBarry Smith #undef __FUNCT__
622c2bac407SLisandro Dalcin #define __FUNCT__ "PetscDrawLGSetOptionsPrefix"
623c2bac407SLisandro Dalcin /*@C
624c2bac407SLisandro Dalcin    PetscDrawLGSetOptionsPrefix - Sets the prefix used for searching for all
625c2bac407SLisandro Dalcin    PetscDrawLG options in the database.
626c2bac407SLisandro Dalcin 
627c2bac407SLisandro Dalcin    Logically Collective on PetscDrawLG
628c2bac407SLisandro Dalcin 
629c2bac407SLisandro Dalcin    Input Parameter:
630c2bac407SLisandro Dalcin +  lg - the line graph context
631c2bac407SLisandro Dalcin -  prefix - the prefix to prepend to all option names
632c2bac407SLisandro Dalcin 
633c2bac407SLisandro Dalcin    Level: advanced
634c2bac407SLisandro Dalcin 
635c2bac407SLisandro Dalcin .keywords: PetscDrawLG, set, options, prefix, database
636c2bac407SLisandro Dalcin 
637ba1e01c4SBarry Smith .seealso: PetscDrawLGSetFromOptions(), PetscDrawLGCreate()
638c2bac407SLisandro Dalcin @*/
639c2bac407SLisandro Dalcin PetscErrorCode  PetscDrawLGSetOptionsPrefix(PetscDrawLG lg,const char prefix[])
640c2bac407SLisandro Dalcin {
641c2bac407SLisandro Dalcin   PetscErrorCode ierr;
642c2bac407SLisandro Dalcin 
643c2bac407SLisandro Dalcin   PetscFunctionBegin;
644c2bac407SLisandro Dalcin   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
645c2bac407SLisandro Dalcin   ierr = PetscObjectSetOptionsPrefix((PetscObject)lg,prefix);CHKERRQ(ierr);
646c2bac407SLisandro Dalcin   PetscFunctionReturn(0);
647c2bac407SLisandro Dalcin }
648c2bac407SLisandro Dalcin 
649c2bac407SLisandro Dalcin #undef __FUNCT__
650287de1a7SBarry Smith #define __FUNCT__ "PetscDrawLGSetFromOptions"
651287de1a7SBarry Smith /*@
652287de1a7SBarry Smith     PetscDrawLGSetFromOptions - Sets options related to the PetscDrawLG
653287de1a7SBarry Smith 
6545b399a63SLisandro Dalcin     Collective on PetscDrawLG
655287de1a7SBarry Smith 
656287de1a7SBarry Smith     Options Database:
657287de1a7SBarry Smith 
658287de1a7SBarry Smith     Level: intermediate
659287de1a7SBarry Smith 
660287de1a7SBarry Smith     Concepts: line graph^creating
661287de1a7SBarry Smith 
662287de1a7SBarry Smith .seealso:  PetscDrawLGDestroy(), PetscDrawLGCreate()
663287de1a7SBarry Smith @*/
664287de1a7SBarry Smith PetscErrorCode  PetscDrawLGSetFromOptions(PetscDrawLG lg)
665287de1a7SBarry Smith {
666287de1a7SBarry Smith   PetscErrorCode      ierr;
66771917b75SLisandro Dalcin   PetscBool           usemarkers,set;
66871917b75SLisandro Dalcin   PetscDrawMarkerType markertype;
669287de1a7SBarry Smith 
670287de1a7SBarry Smith   PetscFunctionBegin;
671e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
672e118a51fSLisandro Dalcin 
67371917b75SLisandro Dalcin   ierr = PetscDrawGetMarkerType(lg->win,&markertype);CHKERRQ(ierr);
67471917b75SLisandro Dalcin   ierr = PetscOptionsGetEnum(((PetscObject)lg)->options,((PetscObject)lg)->prefix,"-lg_marker_type",PetscDrawMarkerTypes,(PetscEnum*)&markertype,&set);CHKERRQ(ierr);
67571917b75SLisandro Dalcin   if (set) {
67671917b75SLisandro Dalcin     ierr = PetscDrawLGSetUseMarkers(lg,PETSC_TRUE);CHKERRQ(ierr);
67771917b75SLisandro Dalcin     ierr = PetscDrawSetMarkerType(lg->win,markertype);CHKERRQ(ierr);
67871917b75SLisandro Dalcin   }
67971917b75SLisandro Dalcin   usemarkers = lg->use_markers;
68071917b75SLisandro Dalcin   ierr = PetscOptionsGetBool(((PetscObject)lg)->options,((PetscObject)lg)->prefix,"-lg_use_markers",&usemarkers,&set);CHKERRQ(ierr);
68171917b75SLisandro Dalcin   if (set) {ierr = PetscDrawLGSetUseMarkers(lg,usemarkers);CHKERRQ(ierr);}
682287de1a7SBarry Smith   PetscFunctionReturn(0);
683287de1a7SBarry Smith }
684