xref: /petsc/src/sys/classes/draw/utils/lgc.c (revision c2bac40754836c26941952704178e7bcc5eb0a06)
15c6c1daeSBarry Smith 
25ccc9f3cSMatthew G Knepley #include <petscviewer.h>
3e118a51fSLisandro Dalcin #include <../src/sys/classes/draw/utils/lgimpl.h>  /*I   "petscdraw.h"  I*/
45c6c1daeSBarry Smith PetscClassId PETSC_DRAWLG_CLASSID = 0;
55c6c1daeSBarry Smith 
65c6c1daeSBarry Smith #undef __FUNCT__
75c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGGetAxis"
85c6c1daeSBarry Smith /*@
95c6c1daeSBarry Smith    PetscDrawLGGetAxis - Gets the axis context associated with a line graph.
105c6c1daeSBarry Smith    This is useful if one wants to change some axis property, such as
115c6c1daeSBarry Smith    labels, color, etc. The axis context should not be destroyed by the
125c6c1daeSBarry Smith    application code.
135c6c1daeSBarry Smith 
145c6c1daeSBarry Smith    Not Collective, if PetscDrawLG is parallel then PetscDrawAxis is parallel
155c6c1daeSBarry Smith 
165c6c1daeSBarry Smith    Input Parameter:
175c6c1daeSBarry Smith .  lg - the line graph context
185c6c1daeSBarry Smith 
195c6c1daeSBarry Smith    Output Parameter:
205c6c1daeSBarry Smith .  axis - the axis context
215c6c1daeSBarry Smith 
225c6c1daeSBarry Smith    Level: advanced
235c6c1daeSBarry Smith 
245c6c1daeSBarry Smith @*/
255c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGGetAxis(PetscDrawLG lg,PetscDrawAxis *axis)
265c6c1daeSBarry Smith {
275c6c1daeSBarry Smith   PetscFunctionBegin;
285c6c1daeSBarry Smith   PetscValidPointer(axis,2);
29e118a51fSLisandro Dalcin   if (!lg) {*axis = NULL; PetscFunctionReturn(0);}
30e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
315c6c1daeSBarry Smith   *axis = lg->axis;
325c6c1daeSBarry Smith   PetscFunctionReturn(0);
335c6c1daeSBarry Smith }
345c6c1daeSBarry Smith 
355c6c1daeSBarry Smith #undef __FUNCT__
365c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGGetDraw"
375c6c1daeSBarry Smith /*@
385c6c1daeSBarry Smith    PetscDrawLGGetDraw - Gets the draw context associated with a line graph.
395c6c1daeSBarry Smith 
405c6c1daeSBarry Smith    Not Collective, if PetscDrawLG is parallel then PetscDraw is parallel
415c6c1daeSBarry Smith 
425c6c1daeSBarry Smith    Input Parameter:
435c6c1daeSBarry Smith .  lg - the line graph context
445c6c1daeSBarry Smith 
455c6c1daeSBarry Smith    Output Parameter:
465c6c1daeSBarry Smith .  draw - the draw context
475c6c1daeSBarry Smith 
485c6c1daeSBarry Smith    Level: intermediate
495c6c1daeSBarry Smith 
505c6c1daeSBarry Smith @*/
515c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGGetDraw(PetscDrawLG lg,PetscDraw *draw)
525c6c1daeSBarry Smith {
535c6c1daeSBarry Smith   PetscFunctionBegin;
545c6c1daeSBarry Smith   PetscValidPointer(draw,2);
55e118a51fSLisandro Dalcin   if (!lg) {*draw = NULL; PetscFunctionReturn(0);}
565c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
575c6c1daeSBarry Smith   *draw = lg->win;
585c6c1daeSBarry Smith   PetscFunctionReturn(0);
595c6c1daeSBarry Smith }
605c6c1daeSBarry Smith 
615c6c1daeSBarry Smith 
625c6c1daeSBarry Smith #undef __FUNCT__
635c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGSPDraw"
645c6c1daeSBarry Smith /*@
655c6c1daeSBarry Smith    PetscDrawLGSPDraw - Redraws a line graph.
665c6c1daeSBarry Smith 
675b399a63SLisandro Dalcin    Collective on PetscDrawLG
685c6c1daeSBarry Smith 
695c6c1daeSBarry Smith    Input Parameter:
705c6c1daeSBarry Smith .  lg - the line graph context
715c6c1daeSBarry Smith 
725c6c1daeSBarry Smith    Level: intermediate
735c6c1daeSBarry Smith 
745c6c1daeSBarry Smith .seealso: PetscDrawLGDraw(), PetscDrawSPDraw()
755c6c1daeSBarry Smith 
765c6c1daeSBarry Smith    Developer Notes: This code cheats and uses the fact that the LG and SP structs are the same
775c6c1daeSBarry Smith 
785c6c1daeSBarry Smith @*/
795c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGSPDraw(PetscDrawLG lg,PetscDrawSP spin)
805c6c1daeSBarry Smith {
815c6c1daeSBarry Smith   PetscDrawLG    sp = (PetscDrawLG)spin;
825c6c1daeSBarry Smith   PetscReal      xmin,xmax,ymin,ymax;
835c6c1daeSBarry Smith   PetscErrorCode ierr;
84e118a51fSLisandro Dalcin   PetscBool      isnull;
85e118a51fSLisandro Dalcin   PetscMPIInt    rank;
86e118a51fSLisandro Dalcin   PetscDraw      draw;
875c6c1daeSBarry Smith 
885c6c1daeSBarry Smith   PetscFunctionBegin;
89e118a51fSLisandro Dalcin   if (!lg || !spin) {PetscFunctionReturn(0);}
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 
1525c6c1daeSBarry Smith .seealso:  PetscDrawLGDestroy()
1535c6c1daeSBarry Smith @*/
154e118a51fSLisandro Dalcin PetscErrorCode  PetscDrawLGCreate(PetscDraw draw,PetscInt dim,PetscDrawLG *outlg)
1555c6c1daeSBarry Smith {
1565c6c1daeSBarry Smith   PetscBool      isnull;
1575c6c1daeSBarry Smith   PetscDrawLG    lg;
158e118a51fSLisandro Dalcin   PetscErrorCode ierr;
1595c6c1daeSBarry Smith 
1605c6c1daeSBarry Smith   PetscFunctionBegin;
1615c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
162e118a51fSLisandro Dalcin   PetscValidLogicalCollectiveInt(draw,dim,2);
163e118a51fSLisandro Dalcin   PetscValidPointer(outlg,3);
164e118a51fSLisandro Dalcin   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
165e118a51fSLisandro Dalcin   if (isnull) {*outlg = NULL; PetscFunctionReturn(0);}
166e118a51fSLisandro Dalcin 
167e118a51fSLisandro Dalcin   ierr = PetscHeaderCreate(lg,PETSC_DRAWLG_CLASSID,"PetscDrawLG","Line graph","Draw",PetscObjectComm((PetscObject)draw),PetscDrawLGDestroy,NULL);CHKERRQ(ierr);
168e118a51fSLisandro Dalcin   ierr = PetscLogObjectParent((PetscObject)draw,(PetscObject)lg);CHKERRQ(ierr);
169*c2bac407SLisandro Dalcin   ierr = PetscDrawLGSetOptionsPrefix(lg,((PetscObject)draw)->prefix);CHKERRQ(ierr);
170e118a51fSLisandro Dalcin 
171e118a51fSLisandro Dalcin   ierr = PetscObjectReference((PetscObject)draw);CHKERRQ(ierr);
172e118a51fSLisandro Dalcin   lg->win = draw;
173a297a907SKarl Rupp 
17469c83917SLisandro Dalcin   lg->view    = NULL;
17569c83917SLisandro Dalcin   lg->destroy = NULL;
1765c6c1daeSBarry Smith   lg->nopts   = 0;
1775c6c1daeSBarry Smith   lg->dim     = dim;
1785c6c1daeSBarry Smith   lg->xmin    = 1.e20;
1795c6c1daeSBarry Smith   lg->ymin    = 1.e20;
1805c6c1daeSBarry Smith   lg->xmax    = -1.e20;
1815c6c1daeSBarry Smith   lg->ymax    = -1.e20;
182a297a907SKarl Rupp 
183dcca6d9dSJed Brown   ierr = PetscMalloc2(dim*CHUNCKSIZE,&lg->x,dim*CHUNCKSIZE,&lg->y);CHKERRQ(ierr);
1843bb1ff40SBarry Smith   ierr = PetscLogObjectMemory((PetscObject)lg,2*dim*CHUNCKSIZE*sizeof(PetscReal));CHKERRQ(ierr);
185a297a907SKarl Rupp 
1865c6c1daeSBarry Smith   lg->len         = dim*CHUNCKSIZE;
1875c6c1daeSBarry Smith   lg->loc         = 0;
188b6fe0379SLisandro Dalcin   lg->use_markers = PETSC_FALSE;
189a297a907SKarl Rupp 
1905c6c1daeSBarry Smith   ierr = PetscDrawAxisCreate(draw,&lg->axis);CHKERRQ(ierr);
1913bb1ff40SBarry Smith   ierr = PetscLogObjectParent((PetscObject)lg,(PetscObject)lg->axis);CHKERRQ(ierr);
192a297a907SKarl Rupp 
193e118a51fSLisandro Dalcin   *outlg = lg;
1945c6c1daeSBarry Smith   PetscFunctionReturn(0);
1955c6c1daeSBarry Smith }
1965c6c1daeSBarry Smith 
1975c6c1daeSBarry Smith #undef __FUNCT__
1985c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGSetColors"
1995c6c1daeSBarry Smith /*@
2005c6c1daeSBarry Smith    PetscDrawLGSetColors - Sets the color of each line graph drawn
2015c6c1daeSBarry Smith 
2025b399a63SLisandro Dalcin    Logically Collective on PetscDrawLG
2035c6c1daeSBarry Smith 
2045c6c1daeSBarry Smith    Input Parameter:
2055c6c1daeSBarry Smith +  lg - the line graph context.
2065c6c1daeSBarry Smith -  colors - the colors
2075c6c1daeSBarry Smith 
2085c6c1daeSBarry Smith    Level: intermediate
2095c6c1daeSBarry Smith 
2105c6c1daeSBarry Smith    Concepts: line graph^setting number of lines
2115c6c1daeSBarry Smith 
2125c6c1daeSBarry Smith @*/
2135c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGSetColors(PetscDrawLG lg,const int *colors)
2145c6c1daeSBarry Smith {
2155c6c1daeSBarry Smith   PetscErrorCode ierr;
2165c6c1daeSBarry Smith 
2175c6c1daeSBarry Smith   PetscFunctionBegin;
218e118a51fSLisandro Dalcin   if (!lg) PetscFunctionReturn(0);
2195c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
220e118a51fSLisandro Dalcin 
2215c6c1daeSBarry Smith   ierr = PetscFree(lg->colors);CHKERRQ(ierr);
222785e854fSJed Brown   ierr = PetscMalloc1(lg->dim,&lg->colors);CHKERRQ(ierr);
2235c6c1daeSBarry Smith   ierr = PetscMemcpy(lg->colors,colors,lg->dim*sizeof(int));CHKERRQ(ierr);
2245c6c1daeSBarry Smith   PetscFunctionReturn(0);
2255c6c1daeSBarry Smith }
2265c6c1daeSBarry Smith 
2275c6c1daeSBarry Smith #undef __FUNCT__
2285c6c1daeSBarry Smith #undef __FUNCT__
2295c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGSetLegend"
2305c6c1daeSBarry Smith /*@C
2315c6c1daeSBarry Smith    PetscDrawLGSetLegend - sets the names of each curve plotted
2325c6c1daeSBarry Smith 
2335b399a63SLisandro Dalcin    Logically Collective on PetscDrawLG
2345c6c1daeSBarry Smith 
2355c6c1daeSBarry Smith    Input Parameter:
2365c6c1daeSBarry Smith +  lg - the line graph context.
2375c6c1daeSBarry Smith -  names - the names for each curve
2385c6c1daeSBarry Smith 
2395c6c1daeSBarry Smith    Level: intermediate
2405c6c1daeSBarry Smith 
2415c6c1daeSBarry Smith    Concepts: line graph^setting number of lines
2425c6c1daeSBarry Smith 
2435c6c1daeSBarry Smith @*/
2445c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGSetLegend(PetscDrawLG lg,const char *const *names)
2455c6c1daeSBarry Smith {
2465c6c1daeSBarry Smith   PetscErrorCode ierr;
2475c6c1daeSBarry Smith   PetscInt       i;
2485c6c1daeSBarry Smith 
2495c6c1daeSBarry Smith   PetscFunctionBegin;
250e118a51fSLisandro Dalcin   if (!lg) PetscFunctionReturn(0);
2515c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
2525c6c1daeSBarry Smith 
2535c6c1daeSBarry Smith   if (lg->legend) {
2545c6c1daeSBarry Smith     for (i=0; i<lg->dim; i++) {
2555c6c1daeSBarry Smith       ierr = PetscFree(lg->legend[i]);CHKERRQ(ierr);
2565c6c1daeSBarry Smith     }
2575c6c1daeSBarry Smith     ierr = PetscFree(lg->legend);CHKERRQ(ierr);
2585c6c1daeSBarry Smith   }
2595c6c1daeSBarry Smith   if (names) {
260785e854fSJed Brown     ierr = PetscMalloc1(lg->dim,&lg->legend);CHKERRQ(ierr);
2615c6c1daeSBarry Smith     for (i=0; i<lg->dim; i++) {
2625c6c1daeSBarry Smith       ierr = PetscStrallocpy(names[i],&lg->legend[i]);CHKERRQ(ierr);
2635c6c1daeSBarry Smith     }
2645c6c1daeSBarry Smith   }
2655c6c1daeSBarry Smith   PetscFunctionReturn(0);
2665c6c1daeSBarry Smith }
2675c6c1daeSBarry Smith 
2685c6c1daeSBarry Smith #undef __FUNCT__
2695c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGGetDimension"
2705c6c1daeSBarry Smith /*@
2715c6c1daeSBarry Smith    PetscDrawLGGetDimension - Change the number of lines that are to be drawn.
2725c6c1daeSBarry Smith 
2735b399a63SLisandro Dalcin    Not Collective
2745c6c1daeSBarry Smith 
2755c6c1daeSBarry Smith    Input Parameter:
2765c6c1daeSBarry Smith .  lg - the line graph context.
2775c6c1daeSBarry Smith 
2785c6c1daeSBarry Smith    Output Parameter:
2795c6c1daeSBarry Smith .  dim - the number of curves.
2805c6c1daeSBarry Smith 
2815c6c1daeSBarry Smith    Level: intermediate
2825c6c1daeSBarry Smith 
2835c6c1daeSBarry Smith    Concepts: line graph^setting number of lines
2845c6c1daeSBarry Smith 
2855c6c1daeSBarry Smith @*/
2865c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGGetDimension(PetscDrawLG lg,PetscInt *dim)
2875c6c1daeSBarry Smith {
2885c6c1daeSBarry Smith   PetscFunctionBegin;
289e118a51fSLisandro Dalcin   if (!lg) PetscFunctionReturn(0);
2905c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
291e118a51fSLisandro Dalcin 
2925c6c1daeSBarry Smith   *dim = lg->dim;
2935c6c1daeSBarry Smith   PetscFunctionReturn(0);
2945c6c1daeSBarry Smith }
2955c6c1daeSBarry Smith 
2965c6c1daeSBarry Smith #undef __FUNCT__
2975c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGSetDimension"
2985c6c1daeSBarry Smith /*@
2995c6c1daeSBarry Smith    PetscDrawLGSetDimension - Change the number of lines that are to be drawn.
3005c6c1daeSBarry Smith 
3015b399a63SLisandro Dalcin    Logically Collective on PetscDrawLG
3025c6c1daeSBarry Smith 
3035c6c1daeSBarry Smith    Input Parameter:
3045c6c1daeSBarry Smith +  lg - the line graph context.
3055c6c1daeSBarry Smith -  dim - the number of curves.
3065c6c1daeSBarry Smith 
3075c6c1daeSBarry Smith    Level: intermediate
3085c6c1daeSBarry Smith 
3095c6c1daeSBarry Smith    Concepts: line graph^setting number of lines
3105c6c1daeSBarry Smith 
3115c6c1daeSBarry Smith @*/
3125c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGSetDimension(PetscDrawLG lg,PetscInt dim)
3135c6c1daeSBarry Smith {
3145c6c1daeSBarry Smith   PetscErrorCode ierr;
3155c6c1daeSBarry Smith   PetscInt       i;
3165c6c1daeSBarry Smith 
3175c6c1daeSBarry Smith   PetscFunctionBegin;
318e118a51fSLisandro Dalcin   if (!lg) PetscFunctionReturn(0);
3195c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
3205c6c1daeSBarry Smith   PetscValidLogicalCollectiveInt(lg,dim,2);
3215c6c1daeSBarry Smith   if (lg->dim == dim) PetscFunctionReturn(0);
3225c6c1daeSBarry Smith 
3235c6c1daeSBarry Smith   ierr = PetscFree2(lg->x,lg->y);CHKERRQ(ierr);
3245c6c1daeSBarry Smith   if (lg->legend) {
3255c6c1daeSBarry Smith     for (i=0; i<lg->dim; i++) {
3265c6c1daeSBarry Smith       ierr = PetscFree(lg->legend[i]);CHKERRQ(ierr);
3275c6c1daeSBarry Smith     }
3285c6c1daeSBarry Smith     ierr = PetscFree(lg->legend);CHKERRQ(ierr);
3295c6c1daeSBarry Smith   }
3305c6c1daeSBarry Smith   ierr    = PetscFree(lg->colors);CHKERRQ(ierr);
3315c6c1daeSBarry Smith   lg->dim = dim;
332dcca6d9dSJed Brown   ierr    = PetscMalloc2(dim*CHUNCKSIZE,&lg->x,dim*CHUNCKSIZE,&lg->y);CHKERRQ(ierr);
3333bb1ff40SBarry Smith   ierr    = PetscLogObjectMemory((PetscObject)lg,2*dim*CHUNCKSIZE*sizeof(PetscReal));CHKERRQ(ierr);
3345c6c1daeSBarry Smith   lg->len = dim*CHUNCKSIZE;
3355c6c1daeSBarry Smith   PetscFunctionReturn(0);
3365c6c1daeSBarry Smith }
3375c6c1daeSBarry Smith 
3385c6c1daeSBarry Smith #undef __FUNCT__
3395c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGReset"
3405c6c1daeSBarry Smith /*@
3415c6c1daeSBarry Smith    PetscDrawLGReset - Clears line graph to allow for reuse with new data.
3425c6c1daeSBarry Smith 
3435b399a63SLisandro Dalcin    Logically Collective on PetscDrawLG
3445c6c1daeSBarry Smith 
3455c6c1daeSBarry Smith    Input Parameter:
3465c6c1daeSBarry Smith .  lg - the line graph context.
3475c6c1daeSBarry Smith 
3485c6c1daeSBarry Smith    Level: intermediate
3495c6c1daeSBarry Smith 
3505c6c1daeSBarry Smith    Concepts: line graph^restarting
3515c6c1daeSBarry Smith 
3525c6c1daeSBarry Smith @*/
3535c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGReset(PetscDrawLG lg)
3545c6c1daeSBarry Smith {
3555c6c1daeSBarry Smith   PetscFunctionBegin;
356e118a51fSLisandro Dalcin   if (!lg) PetscFunctionReturn(0);
3575c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
3585c6c1daeSBarry Smith   lg->xmin  = 1.e20;
3595c6c1daeSBarry Smith   lg->ymin  = 1.e20;
3605c6c1daeSBarry Smith   lg->xmax  = -1.e20;
3615c6c1daeSBarry Smith   lg->ymax  = -1.e20;
3625c6c1daeSBarry Smith   lg->loc   = 0;
3635c6c1daeSBarry Smith   lg->nopts = 0;
3645c6c1daeSBarry Smith   PetscFunctionReturn(0);
3655c6c1daeSBarry Smith }
3665c6c1daeSBarry Smith 
3675c6c1daeSBarry Smith #undef __FUNCT__
3685c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGDestroy"
3695c6c1daeSBarry Smith /*@
3705c6c1daeSBarry Smith    PetscDrawLGDestroy - Frees all space taken up by line graph data structure.
3715c6c1daeSBarry Smith 
3725b399a63SLisandro Dalcin    Collective on PetscDrawLG
3735c6c1daeSBarry Smith 
3745c6c1daeSBarry Smith    Input Parameter:
3755c6c1daeSBarry Smith .  lg - the line graph context
3765c6c1daeSBarry Smith 
3775c6c1daeSBarry Smith    Level: intermediate
3785c6c1daeSBarry Smith 
3795c6c1daeSBarry Smith .seealso:  PetscDrawLGCreate()
3805c6c1daeSBarry Smith @*/
3815c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGDestroy(PetscDrawLG *lg)
3825c6c1daeSBarry Smith {
3835c6c1daeSBarry Smith   PetscErrorCode ierr;
3845c6c1daeSBarry Smith   PetscInt       i;
3855c6c1daeSBarry Smith 
3865c6c1daeSBarry Smith   PetscFunctionBegin;
3875c6c1daeSBarry Smith   if (!*lg) PetscFunctionReturn(0);
388e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(*lg,PETSC_DRAWLG_CLASSID,1);
389e118a51fSLisandro Dalcin   if (--((PetscObject)(*lg))->refct > 0) {*lg = NULL; PetscFunctionReturn(0);}
3905c6c1daeSBarry Smith 
3915c6c1daeSBarry Smith   if ((*lg)->legend) {
3925c6c1daeSBarry Smith     for (i=0; i<(*lg)->dim; i++) {
3935c6c1daeSBarry Smith       ierr = PetscFree((*lg)->legend[i]);CHKERRQ(ierr);
3945c6c1daeSBarry Smith     }
3955c6c1daeSBarry Smith     ierr = PetscFree((*lg)->legend);CHKERRQ(ierr);
3965c6c1daeSBarry Smith   }
3975c6c1daeSBarry Smith   ierr = PetscFree((*lg)->colors);CHKERRQ(ierr);
3985c6c1daeSBarry Smith   ierr = PetscFree2((*lg)->x,(*lg)->y);CHKERRQ(ierr);
399e118a51fSLisandro Dalcin   ierr = PetscDrawAxisDestroy(&(*lg)->axis);CHKERRQ(ierr);
400e118a51fSLisandro Dalcin   ierr = PetscDrawDestroy(&(*lg)->win);CHKERRQ(ierr);
4015c6c1daeSBarry Smith   ierr = PetscHeaderDestroy(lg);CHKERRQ(ierr);
4025c6c1daeSBarry Smith   PetscFunctionReturn(0);
4035c6c1daeSBarry Smith }
4045c6c1daeSBarry Smith #undef __FUNCT__
405b6fe0379SLisandro Dalcin #define __FUNCT__ "PetscDrawLGSetUseMarkers"
4065c6c1daeSBarry Smith /*@
407b6fe0379SLisandro Dalcin    PetscDrawLGSetUseMarkers - Causes LG to draw a marker for each data-point.
4085c6c1daeSBarry Smith 
4095b399a63SLisandro Dalcin    Logically Collective on PetscDrawLG
4105c6c1daeSBarry Smith 
4115c6c1daeSBarry Smith    Input Parameters:
412287de1a7SBarry Smith +  lg - the linegraph context
413287de1a7SBarry Smith -  flg - should mark each data point
414287de1a7SBarry Smith 
415287de1a7SBarry Smith    Options Database:
416b6fe0379SLisandro Dalcin .  -lg_use_markers  <true,false>
4175c6c1daeSBarry Smith 
4185c6c1daeSBarry Smith    Level: intermediate
4195c6c1daeSBarry Smith 
4205c6c1daeSBarry Smith    Concepts: line graph^showing points
4215c6c1daeSBarry Smith 
4225c6c1daeSBarry Smith @*/
423b6fe0379SLisandro Dalcin PetscErrorCode  PetscDrawLGSetUseMarkers(PetscDrawLG lg,PetscBool flg)
4245c6c1daeSBarry Smith {
4255c6c1daeSBarry Smith   PetscFunctionBegin;
426e118a51fSLisandro Dalcin   if (!lg) PetscFunctionReturn(0);
427e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
4285c6c1daeSBarry Smith 
429b6fe0379SLisandro Dalcin   lg->use_markers = flg;
4305c6c1daeSBarry Smith   PetscFunctionReturn(0);
4315c6c1daeSBarry Smith }
4325c6c1daeSBarry Smith 
4335c6c1daeSBarry Smith #undef __FUNCT__
4345c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGDraw"
4355c6c1daeSBarry Smith /*@
4365c6c1daeSBarry Smith    PetscDrawLGDraw - Redraws a line graph.
4375c6c1daeSBarry Smith 
4385b399a63SLisandro Dalcin    Collective on PetscDrawLG
4395c6c1daeSBarry Smith 
4405c6c1daeSBarry Smith    Input Parameter:
4415c6c1daeSBarry Smith .  lg - the line graph context
4425c6c1daeSBarry Smith 
4435c6c1daeSBarry Smith    Level: intermediate
4445c6c1daeSBarry Smith 
4455c6c1daeSBarry Smith .seealso: PetscDrawSPDraw(), PetscDrawLGSPDraw()
4465c6c1daeSBarry Smith 
4475c6c1daeSBarry Smith @*/
4485c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGDraw(PetscDrawLG lg)
4495c6c1daeSBarry Smith {
450e118a51fSLisandro Dalcin   PetscReal      xmin,xmax,ymin,ymax;
4515c6c1daeSBarry Smith   PetscErrorCode ierr;
452e118a51fSLisandro Dalcin   PetscMPIInt    rank;
453e118a51fSLisandro Dalcin   PetscDraw      draw;
4545c6c1daeSBarry Smith   PetscBool      isnull;
4555c6c1daeSBarry Smith 
4565c6c1daeSBarry Smith   PetscFunctionBegin;
457e118a51fSLisandro Dalcin   if (!lg) PetscFunctionReturn(0);
4585c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
4598f69470aSLisandro Dalcin   ierr = PetscDrawIsNull(lg->win,&isnull);CHKERRQ(ierr);
4608f69470aSLisandro Dalcin   if (isnull) PetscFunctionReturn(0);
461e118a51fSLisandro Dalcin   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)lg),&rank);CHKERRQ(ierr);
4625c6c1daeSBarry Smith 
4635b399a63SLisandro Dalcin   draw = lg->win;
4645c6c1daeSBarry Smith   ierr = PetscDrawCheckResizedWindow(draw);CHKERRQ(ierr);
4655b399a63SLisandro Dalcin   ierr = PetscDrawClear(draw);CHKERRQ(ierr);
466e118a51fSLisandro Dalcin 
467e118a51fSLisandro Dalcin   xmin = lg->xmin; xmax = lg->xmax; ymin = lg->ymin; ymax = lg->ymax;
4685c6c1daeSBarry Smith   ierr = PetscDrawAxisSetLimits(lg->axis,xmin,xmax,ymin,ymax);CHKERRQ(ierr);
4695c6c1daeSBarry Smith   ierr = PetscDrawAxisDraw(lg->axis);CHKERRQ(ierr);
4705c6c1daeSBarry Smith 
4715b399a63SLisandro Dalcin   ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
4725c6c1daeSBarry Smith   if (!rank) {
473e118a51fSLisandro Dalcin     int i,j,dim=lg->dim,nopts=lg->nopts,cl;
4745c6c1daeSBarry Smith     for (i=0; i<dim; i++) {
4755c6c1daeSBarry Smith       for (j=1; j<nopts; j++) {
4765c6c1daeSBarry Smith         if (lg->colors) cl = lg->colors[i];
4775c6c1daeSBarry Smith         else cl = PETSC_DRAW_BLACK+i;
4785c6c1daeSBarry 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);
479b6fe0379SLisandro Dalcin         if (lg->use_markers) {
48078e9f83eSLisandro Dalcin           ierr = PetscDrawMarker(draw,lg->x[j*dim+i],lg->y[j*dim+i],cl);CHKERRQ(ierr);
4815c6c1daeSBarry Smith         }
4825c6c1daeSBarry Smith       }
4835c6c1daeSBarry Smith     }
4845c6c1daeSBarry Smith   }
48556a02f31SLisandro Dalcin   if (!rank && lg->legend) {
486e118a51fSLisandro Dalcin     int       i,dim=lg->dim,cl;
4875c6c1daeSBarry Smith     PetscReal xl,yl,xr,yr,tw,th;
4885c6c1daeSBarry Smith     size_t    len,mlen = 0;
4895c6c1daeSBarry Smith     ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr);
4905c6c1daeSBarry Smith     ierr = PetscDrawStringGetSize(draw,&tw,&th);CHKERRQ(ierr);
4915c6c1daeSBarry Smith     for (i=0; i<dim; i++) {
4925c6c1daeSBarry Smith       ierr = PetscStrlen(lg->legend[i],&len);CHKERRQ(ierr);
4935c6c1daeSBarry Smith       mlen = PetscMax(mlen,len);
4945c6c1daeSBarry Smith     }
4955c6c1daeSBarry Smith     ierr = PetscDrawLine(draw,xr - (mlen + 8)*tw,yr - 3*th,xr - 2*tw,yr - 3*th,PETSC_DRAW_BLACK);CHKERRQ(ierr);
4965c6c1daeSBarry Smith     ierr = PetscDrawLine(draw,xr - (mlen + 8)*tw,yr - 3*th,xr - (mlen + 8)*tw,yr - (4+lg->dim)*th,PETSC_DRAW_BLACK);CHKERRQ(ierr);
4975c6c1daeSBarry Smith     for  (i=0; i<dim; i++) {
4985c6c1daeSBarry Smith       cl   = (lg->colors ? lg->colors[i] : i + 1);
4995c6c1daeSBarry Smith       ierr = PetscDrawLine(draw,xr - (mlen + 6.7)*tw,yr - (4 + i)*th,xr - (mlen + 3.2)*tw,yr - (4 + i)*th,cl);CHKERRQ(ierr);
5005c6c1daeSBarry Smith       ierr = PetscDrawString(draw,xr - (mlen + 3)*tw,yr - (4.5 + i)*th,PETSC_DRAW_BLACK,lg->legend[i]);CHKERRQ(ierr);
5015c6c1daeSBarry Smith     }
5025c6c1daeSBarry Smith     ierr = PetscDrawLine(draw,xr - 2*tw,yr - 3*th,xr - 2*tw,yr - (4+lg->dim)*th,PETSC_DRAW_BLACK);CHKERRQ(ierr);
5035c6c1daeSBarry Smith     ierr = PetscDrawLine(draw,xr - (mlen + 8)*tw,yr - (4+lg->dim)*th,xr - 2*tw,yr - (4+lg->dim)*th,PETSC_DRAW_BLACK);CHKERRQ(ierr);
5045c6c1daeSBarry Smith   }
505e118a51fSLisandro Dalcin   ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
5065b399a63SLisandro Dalcin 
5075b399a63SLisandro Dalcin   ierr = PetscDrawFlush(draw);CHKERRQ(ierr);
508e118a51fSLisandro Dalcin   ierr = PetscDrawPause(draw);CHKERRQ(ierr);
5095c6c1daeSBarry Smith   PetscFunctionReturn(0);
5105c6c1daeSBarry Smith }
5115c6c1daeSBarry Smith 
5125c6c1daeSBarry Smith #undef __FUNCT__
51357fd6651SLisandro Dalcin #define __FUNCT__ "PetscDrawLGSave"
51457fd6651SLisandro Dalcin /*@
51557fd6651SLisandro Dalcin   PetscDrawLGSave - Saves a drawn image
51657fd6651SLisandro Dalcin 
51757fd6651SLisandro Dalcin   Collective on PetscDrawLG
51857fd6651SLisandro Dalcin 
51957fd6651SLisandro Dalcin   Input Parameter:
52057fd6651SLisandro Dalcin . lg - The line graph context
52157fd6651SLisandro Dalcin 
52257fd6651SLisandro Dalcin   Level: intermediate
52357fd6651SLisandro Dalcin 
52457fd6651SLisandro Dalcin   Concepts: line graph^saving
52557fd6651SLisandro Dalcin 
52657fd6651SLisandro Dalcin .seealso:  PetscDrawLGCreate(), PetscDrawLGGetDraw(), PetscDrawSetSave(), PetscDrawSave()
52757fd6651SLisandro Dalcin @*/
52857fd6651SLisandro Dalcin PetscErrorCode  PetscDrawLGSave(PetscDrawLG lg)
52957fd6651SLisandro Dalcin {
53057fd6651SLisandro Dalcin   PetscErrorCode ierr;
53157fd6651SLisandro Dalcin 
53257fd6651SLisandro Dalcin   PetscFunctionBegin;
53357fd6651SLisandro Dalcin   if (!lg) PetscFunctionReturn(0);
53457fd6651SLisandro Dalcin   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
53557fd6651SLisandro Dalcin   ierr = PetscDrawSave(lg->win);CHKERRQ(ierr);
53657fd6651SLisandro Dalcin   PetscFunctionReturn(0);
53757fd6651SLisandro Dalcin }
53857fd6651SLisandro Dalcin 
53957fd6651SLisandro Dalcin #undef __FUNCT__
54034a5a0e3SBarry Smith #define __FUNCT__ "PetscDrawLGView"
5415c6c1daeSBarry Smith /*@
54234a5a0e3SBarry Smith   PetscDrawLGView - Prints a line graph.
5435c6c1daeSBarry Smith 
5445b399a63SLisandro Dalcin   Collective on PetscDrawLG
5455c6c1daeSBarry Smith 
5465c6c1daeSBarry Smith   Input Parameter:
5475c6c1daeSBarry Smith . lg - the line graph context
5485c6c1daeSBarry Smith 
5495c6c1daeSBarry Smith   Level: beginner
5505c6c1daeSBarry Smith 
5515c6c1daeSBarry Smith .keywords:  draw, line, graph
5525c6c1daeSBarry Smith @*/
55334a5a0e3SBarry Smith PetscErrorCode  PetscDrawLGView(PetscDrawLG lg,PetscViewer viewer)
5545c6c1daeSBarry Smith {
5555c6c1daeSBarry Smith   PetscReal      xmin=lg->xmin, xmax=lg->xmax, ymin=lg->ymin, ymax=lg->ymax;
55634a5a0e3SBarry Smith   PetscInt       i, j, dim = lg->dim, nopts = lg->nopts;
55734a5a0e3SBarry Smith   PetscErrorCode ierr;
5585c6c1daeSBarry Smith 
5595c6c1daeSBarry Smith   PetscFunctionBegin;
560e118a51fSLisandro Dalcin   if (!lg) PetscFunctionReturn(0);
5615c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
562e118a51fSLisandro Dalcin 
5635c6c1daeSBarry Smith   if (nopts < 1)                  PetscFunctionReturn(0);
5645c6c1daeSBarry Smith   if (xmin > xmax || ymin > ymax) PetscFunctionReturn(0);
5655c6c1daeSBarry Smith 
56634a5a0e3SBarry Smith   if (!viewer){
56734a5a0e3SBarry Smith     ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)lg),&viewer);CHKERRQ(ierr);
56834a5a0e3SBarry Smith   }
56998c3331eSBarry Smith   ierr = PetscObjectPrintClassNamePrefixType((PetscObject)lg,viewer);CHKERRQ(ierr);
5705c6c1daeSBarry Smith   for (i = 0; i < dim; i++) {
57134a5a0e3SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer, "Line %D>\n", i);CHKERRQ(ierr);
5725c6c1daeSBarry Smith     for (j = 0; j < nopts; j++) {
57334a5a0e3SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer, "  X: %g Y: %g\n", (double)lg->x[j*dim+i], (double)lg->y[j*dim+i]);CHKERRQ(ierr);
5745c6c1daeSBarry Smith     }
5755c6c1daeSBarry Smith   }
5765c6c1daeSBarry Smith   PetscFunctionReturn(0);
5775c6c1daeSBarry Smith }
578287de1a7SBarry Smith 
579287de1a7SBarry Smith #undef __FUNCT__
580*c2bac407SLisandro Dalcin #define __FUNCT__ "PetscDrawLGSetOptionsPrefix"
581*c2bac407SLisandro Dalcin /*@C
582*c2bac407SLisandro Dalcin    PetscDrawLGSetOptionsPrefix - Sets the prefix used for searching for all
583*c2bac407SLisandro Dalcin    PetscDrawLG options in the database.
584*c2bac407SLisandro Dalcin 
585*c2bac407SLisandro Dalcin    Logically Collective on PetscDrawLG
586*c2bac407SLisandro Dalcin 
587*c2bac407SLisandro Dalcin    Input Parameter:
588*c2bac407SLisandro Dalcin +  lg - the line graph context
589*c2bac407SLisandro Dalcin -  prefix - the prefix to prepend to all option names
590*c2bac407SLisandro Dalcin 
591*c2bac407SLisandro Dalcin    Level: advanced
592*c2bac407SLisandro Dalcin 
593*c2bac407SLisandro Dalcin .keywords: PetscDrawLG, set, options, prefix, database
594*c2bac407SLisandro Dalcin 
595*c2bac407SLisandro Dalcin .seealso: PetscDrawLGSetFromOptions()
596*c2bac407SLisandro Dalcin @*/
597*c2bac407SLisandro Dalcin PetscErrorCode  PetscDrawLGSetOptionsPrefix(PetscDrawLG lg,const char prefix[])
598*c2bac407SLisandro Dalcin {
599*c2bac407SLisandro Dalcin   PetscErrorCode ierr;
600*c2bac407SLisandro Dalcin 
601*c2bac407SLisandro Dalcin   PetscFunctionBegin;
602*c2bac407SLisandro Dalcin   if (!lg) PetscFunctionReturn(0);
603*c2bac407SLisandro Dalcin   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
604*c2bac407SLisandro Dalcin   ierr = PetscObjectSetOptionsPrefix((PetscObject)lg,prefix);CHKERRQ(ierr);
605*c2bac407SLisandro Dalcin   PetscFunctionReturn(0);
606*c2bac407SLisandro Dalcin }
607*c2bac407SLisandro Dalcin 
608*c2bac407SLisandro Dalcin #undef __FUNCT__
609287de1a7SBarry Smith #define __FUNCT__ "PetscDrawLGSetFromOptions"
610287de1a7SBarry Smith /*@
611287de1a7SBarry Smith     PetscDrawLGSetFromOptions - Sets options related to the PetscDrawLG
612287de1a7SBarry Smith 
6135b399a63SLisandro Dalcin     Collective on PetscDrawLG
614287de1a7SBarry Smith 
615287de1a7SBarry Smith     Options Database:
616287de1a7SBarry Smith 
617287de1a7SBarry Smith     Level: intermediate
618287de1a7SBarry Smith 
619287de1a7SBarry Smith     Concepts: line graph^creating
620287de1a7SBarry Smith 
621287de1a7SBarry Smith .seealso:  PetscDrawLGDestroy(), PetscDrawLGCreate()
622287de1a7SBarry Smith @*/
623287de1a7SBarry Smith PetscErrorCode  PetscDrawLGSetFromOptions(PetscDrawLG lg)
624287de1a7SBarry Smith {
625287de1a7SBarry Smith   PetscErrorCode ierr;
626b6fe0379SLisandro Dalcin   PetscBool      flg=PETSC_FALSE, set;
627287de1a7SBarry Smith 
628287de1a7SBarry Smith   PetscFunctionBegin;
629e118a51fSLisandro Dalcin   if (!lg) PetscFunctionReturn(0);
630e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
631e118a51fSLisandro Dalcin 
632c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(((PetscObject)lg)->options,NULL,"-lg_use_markers",&flg,&set);CHKERRQ(ierr);
633b6fe0379SLisandro Dalcin   if (set) {ierr = PetscDrawLGSetUseMarkers(lg,flg);CHKERRQ(ierr);}
634287de1a7SBarry Smith   PetscFunctionReturn(0);
635287de1a7SBarry Smith }
636