xref: /petsc/src/sys/classes/draw/utils/bars.c (revision a8d69d7b0124b1e6ce75950a93e6ff079980e86f)
151fa3d41SBarry Smith 
251fa3d41SBarry Smith /*
351fa3d41SBarry Smith   Contains the data structure for plotting a bargraph in a window with an axis.
451fa3d41SBarry Smith */
551fa3d41SBarry Smith #include <petscdraw.h>                       /*I "petscdraw.h" I*/
6af0996ceSBarry Smith #include <petsc/private/petscimpl.h>         /*I "petscsys.h" I*/
751fa3d41SBarry Smith #include <petscviewer.h>                     /*I "petscviewer.h" I*/
851fa3d41SBarry Smith #include <../src/sys/classes/draw/utils/axisimpl.h>   /* so we can directly modify axis xticks */
951fa3d41SBarry Smith 
1051fa3d41SBarry Smith PetscClassId PETSC_DRAWBAR_CLASSID = 0;
1151fa3d41SBarry Smith 
1251fa3d41SBarry Smith struct _p_PetscDrawBar {
1351fa3d41SBarry Smith   PETSCHEADER(int);
1451fa3d41SBarry Smith   PetscErrorCode (*destroy)(PetscDrawSP);
1551fa3d41SBarry Smith   PetscErrorCode (*view)(PetscDrawSP,PetscViewer);
1651fa3d41SBarry Smith   PetscDraw      win;
1751fa3d41SBarry Smith   PetscDrawAxis  axis;
1851fa3d41SBarry Smith   PetscReal      ymin,ymax;
1951fa3d41SBarry Smith   int            numBins;
2051fa3d41SBarry Smith   PetscReal      *values;
2151fa3d41SBarry Smith   int            color;
2251fa3d41SBarry Smith   char           **labels;
2351fa3d41SBarry Smith   PetscBool      sort;
2451fa3d41SBarry Smith   PetscReal      sorttolerance;
2551fa3d41SBarry Smith };
2651fa3d41SBarry Smith 
2751fa3d41SBarry Smith #define CHUNKSIZE 100
2851fa3d41SBarry Smith 
2951fa3d41SBarry Smith /*@C
3051fa3d41SBarry Smith    PetscDrawBarCreate - Creates a bar graph data structure.
3151fa3d41SBarry Smith 
3251fa3d41SBarry Smith    Collective over PetscDraw
3351fa3d41SBarry Smith 
3451fa3d41SBarry Smith    Input Parameters:
3551fa3d41SBarry Smith .  draw  - The window where the graph will be made
3651fa3d41SBarry Smith 
3751fa3d41SBarry Smith    Output Parameters:
3851fa3d41SBarry Smith .  bar - The bar graph context
3951fa3d41SBarry Smith 
4095452b02SPatrick Sanan    Notes:
4195452b02SPatrick Sanan     Call PetscDrawBarSetData() to provide the bins to be plotted and then PetscDrawBarDraw() to display the new plot
420afdd333SBarry Smith 
43*a8d69d7bSBarry Smith   The difference between a bar chart, PetscDrawBar, and a histogram, PetscDrawHG, is explained here https://stattrek.com/statistics/charts/histogram.aspx?Tutorial=AP
447e25d57eSBarry Smith 
457e25d57eSBarry Smith    The MPI communicator that owns the PetscDraw owns this PetscDrawBar, but the calls to set options and add data are ignored on all processes except the
467e25d57eSBarry Smith    zeroth MPI process in the communicator. All MPI processes in the communicator must call PetscDrawBarDraw() to display the updated graph.
470afdd333SBarry Smith 
4851fa3d41SBarry Smith    Level: intermediate
4951fa3d41SBarry Smith 
5051fa3d41SBarry Smith    Concepts: bar graph^creating
5151fa3d41SBarry Smith 
520afdd333SBarry Smith .seealso: PetscDrawLGCreate(), PetscDrawLG, PetscDrawSPCreate(), PetscDrawSP, PetscDrawHGCreate(), PetscDrawHG, PetscDrawBarDestroy(), PetscDrawBarSetData(),
530afdd333SBarry Smith           PetscDrawBar, PetscDrawBarDraw(), PetscDrawBarSave(), PetscDrawBarSetColor(), PetscDrawBarSort(), PetscDrawBarSetLimits(), PetscDrawBarGetAxis(), PetscDrawAxis,
540afdd333SBarry Smith           PetscDrawBarGetDraw(), PetscDrawBarSetFromOptions()
5551fa3d41SBarry Smith @*/
5651fa3d41SBarry Smith PetscErrorCode  PetscDrawBarCreate(PetscDraw draw,PetscDrawBar *bar)
5751fa3d41SBarry Smith {
5851fa3d41SBarry Smith   PetscDrawBar   h;
5951fa3d41SBarry Smith   PetscErrorCode ierr;
6051fa3d41SBarry Smith 
6151fa3d41SBarry Smith   PetscFunctionBegin;
6251fa3d41SBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
6373107ff1SLisandro Dalcin   PetscValidPointer(bar,2);
64e118a51fSLisandro Dalcin 
6571917b75SLisandro Dalcin   ierr = PetscHeaderCreate(h,PETSC_DRAWBAR_CLASSID,"DrawBar","Bar Graph","Draw",PetscObjectComm((PetscObject)draw),PetscDrawBarDestroy,NULL);CHKERRQ(ierr);
66e118a51fSLisandro Dalcin   ierr = PetscLogObjectParent((PetscObject)draw,(PetscObject)h);CHKERRQ(ierr);
67e118a51fSLisandro Dalcin 
68e118a51fSLisandro Dalcin   ierr = PetscObjectReference((PetscObject)draw);CHKERRQ(ierr);
69e118a51fSLisandro Dalcin   h->win = draw;
7051fa3d41SBarry Smith 
7151fa3d41SBarry Smith   h->view        = NULL;
7251fa3d41SBarry Smith   h->destroy     = NULL;
7351fa3d41SBarry Smith   h->color       = PETSC_DRAW_GREEN;
7451fa3d41SBarry Smith   h->ymin        = 0.;  /* if user has not set these then they are determined from the data */
7551fa3d41SBarry Smith   h->ymax        = 0.;
7651fa3d41SBarry Smith   h->numBins     = 0;
7751fa3d41SBarry Smith 
7851fa3d41SBarry Smith   ierr = PetscDrawAxisCreate(draw,&h->axis);CHKERRQ(ierr);
7945f3bb6eSLisandro Dalcin   h->axis->xticks = NULL;
80e118a51fSLisandro Dalcin 
8151fa3d41SBarry Smith   *bar = h;
8251fa3d41SBarry Smith   PetscFunctionReturn(0);
8351fa3d41SBarry Smith }
8451fa3d41SBarry Smith 
8551fa3d41SBarry Smith /*@C
8651fa3d41SBarry Smith    PetscDrawBarSetData
8751fa3d41SBarry Smith 
885b399a63SLisandro Dalcin    Logically Collective on PetscDrawBar
8951fa3d41SBarry Smith 
9051fa3d41SBarry Smith    Input Parameter:
9151fa3d41SBarry Smith +  bar - The bar graph context.
9251fa3d41SBarry Smith .  bins  - number of items
9351fa3d41SBarry Smith .  values - values of each item
9451fa3d41SBarry Smith -  labels - optional label for each bar, NULL terminated array of strings
9551fa3d41SBarry Smith 
9651fa3d41SBarry Smith    Level: intermediate
9751fa3d41SBarry Smith 
9895452b02SPatrick Sanan    Notes:
9995452b02SPatrick Sanan     Call PetscDrawBarDraw() after this call to display the new plot
1000afdd333SBarry Smith 
1010afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarDraw()
10251fa3d41SBarry Smith 
10351fa3d41SBarry Smith @*/
10451fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSetData(PetscDrawBar bar,PetscInt bins,const PetscReal data[],const char *const *labels)
10551fa3d41SBarry Smith {
10651fa3d41SBarry Smith   PetscErrorCode ierr;
10751fa3d41SBarry Smith 
10851fa3d41SBarry Smith   PetscFunctionBegin;
10951fa3d41SBarry Smith   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
110e118a51fSLisandro Dalcin 
11151fa3d41SBarry Smith   if (bar->numBins != bins) {
11251fa3d41SBarry Smith     ierr = PetscFree(bar->values);CHKERRQ(ierr);
11351fa3d41SBarry Smith     ierr = PetscMalloc1(bins, &bar->values);CHKERRQ(ierr);
11451fa3d41SBarry Smith     bar->numBins = bins;
11551fa3d41SBarry Smith   }
11651fa3d41SBarry Smith   ierr = PetscMemcpy(bar->values,data,bins*sizeof(PetscReal));CHKERRQ(ierr);
11751fa3d41SBarry Smith   bar->numBins = bins;
11851fa3d41SBarry Smith   if (labels) {
11951fa3d41SBarry Smith     ierr = PetscStrArrayallocpy(labels,&bar->labels);CHKERRQ(ierr);
12051fa3d41SBarry Smith   }
12151fa3d41SBarry Smith   PetscFunctionReturn(0);
12251fa3d41SBarry Smith }
12351fa3d41SBarry Smith 
12451fa3d41SBarry Smith /*@C
12551fa3d41SBarry Smith   PetscDrawBarDestroy - Frees all space taken up by bar graph data structure.
12651fa3d41SBarry Smith 
12751fa3d41SBarry Smith   Collective over PetscDrawBar
12851fa3d41SBarry Smith 
12951fa3d41SBarry Smith   Input Parameter:
13051fa3d41SBarry Smith . bar - The bar graph context
13151fa3d41SBarry Smith 
13251fa3d41SBarry Smith   Level: intermediate
13351fa3d41SBarry Smith 
13451fa3d41SBarry Smith .seealso:  PetscDrawBarCreate()
13551fa3d41SBarry Smith @*/
13651fa3d41SBarry Smith PetscErrorCode  PetscDrawBarDestroy(PetscDrawBar *bar)
13751fa3d41SBarry Smith {
13851fa3d41SBarry Smith   PetscErrorCode ierr;
13951fa3d41SBarry Smith 
14051fa3d41SBarry Smith   PetscFunctionBegin;
14151fa3d41SBarry Smith   if (!*bar) PetscFunctionReturn(0);
142e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(*bar,PETSC_DRAWBAR_CLASSID,1);
14351fa3d41SBarry Smith   if (--((PetscObject)(*bar))->refct > 0) PetscFunctionReturn(0);
144e118a51fSLisandro Dalcin 
14551fa3d41SBarry Smith   ierr = PetscFree((*bar)->values);CHKERRQ(ierr);
14651fa3d41SBarry Smith   ierr = PetscStrArrayDestroy(&(*bar)->labels);CHKERRQ(ierr);
147e118a51fSLisandro Dalcin   ierr = PetscDrawAxisDestroy(&(*bar)->axis);CHKERRQ(ierr);
148e118a51fSLisandro Dalcin   ierr = PetscDrawDestroy(&(*bar)->win);CHKERRQ(ierr);
14951fa3d41SBarry Smith   ierr = PetscHeaderDestroy(bar);CHKERRQ(ierr);
15051fa3d41SBarry Smith   PetscFunctionReturn(0);
15151fa3d41SBarry Smith }
15251fa3d41SBarry Smith 
15351fa3d41SBarry Smith /*@
15451fa3d41SBarry Smith   PetscDrawBarDraw - Redraws a bar graph.
15551fa3d41SBarry Smith 
1565b399a63SLisandro Dalcin   Collective on PetscDrawBar
15751fa3d41SBarry Smith 
15851fa3d41SBarry Smith   Input Parameter:
15951fa3d41SBarry Smith . bar - The bar graph context
16051fa3d41SBarry Smith 
16151fa3d41SBarry Smith   Level: intermediate
16251fa3d41SBarry Smith 
1630afdd333SBarry Smith .seealso: PetscDrawBar, PetscDrawBarCreate(), PetscDrawBarSetData()
1640afdd333SBarry Smith 
16551fa3d41SBarry Smith @*/
16651fa3d41SBarry Smith PetscErrorCode  PetscDrawBarDraw(PetscDrawBar bar)
16751fa3d41SBarry Smith {
168e118a51fSLisandro Dalcin   PetscDraw      draw;
16951fa3d41SBarry Smith   PetscBool      isnull;
17051fa3d41SBarry Smith   PetscReal      xmin,xmax,ymin,ymax,*values,binLeft,binRight;
17151fa3d41SBarry Smith   PetscInt       numValues,i,bcolor,color,idx,*perm,nplot;
172e118a51fSLisandro Dalcin   PetscMPIInt    rank;
17351fa3d41SBarry Smith   PetscErrorCode ierr;
17451fa3d41SBarry Smith   char           **labels;
17551fa3d41SBarry Smith 
17651fa3d41SBarry Smith   PetscFunctionBegin;
17751fa3d41SBarry Smith   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
1788f69470aSLisandro Dalcin   ierr = PetscDrawIsNull(bar->win,&isnull);CHKERRQ(ierr);
1798f69470aSLisandro Dalcin   if (isnull) PetscFunctionReturn(0);
180e118a51fSLisandro Dalcin   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)bar),&rank);CHKERRQ(ierr);
18151fa3d41SBarry Smith 
1825b399a63SLisandro Dalcin   if (bar->numBins < 1) PetscFunctionReturn(0);
1835b399a63SLisandro Dalcin 
18451fa3d41SBarry Smith   color = bar->color;
18571917b75SLisandro Dalcin   if (color == PETSC_DRAW_ROTATE) bcolor = PETSC_DRAW_BLACK+1;
18651fa3d41SBarry Smith   else bcolor = color;
18751fa3d41SBarry Smith 
18851fa3d41SBarry Smith   numValues = bar->numBins;
18951fa3d41SBarry Smith   values    = bar->values;
19051fa3d41SBarry Smith   if (bar->ymin == bar->ymax) {
19151fa3d41SBarry Smith     /* user has not set bounds on bars so set them based on the data */
19251fa3d41SBarry Smith     ymin = PETSC_MAX_REAL;
19351fa3d41SBarry Smith     ymax = PETSC_MIN_REAL;
19451fa3d41SBarry Smith     for (i=0; i<numValues; i++) {
19551fa3d41SBarry Smith       ymin = PetscMin(ymin,values[i]);
19651fa3d41SBarry Smith       ymax = PetscMax(ymax,values[i]);
19751fa3d41SBarry Smith     }
19851fa3d41SBarry Smith   } else {
19951fa3d41SBarry Smith     ymin = bar->ymin;
20051fa3d41SBarry Smith     ymax = bar->ymax;
20151fa3d41SBarry Smith   }
20251fa3d41SBarry Smith   nplot  = numValues;  /* number of points to actually plot; if some are lower than requested tolerance */
20351fa3d41SBarry Smith   xmin   = 0.0;
204e118a51fSLisandro Dalcin   xmax   = nplot;
20551fa3d41SBarry Smith   labels = bar->labels;
20651fa3d41SBarry Smith 
20751fa3d41SBarry Smith   if (bar->sort) {
20851fa3d41SBarry Smith     ierr = PetscMalloc1(numValues,&perm);CHKERRQ(ierr);
20951fa3d41SBarry Smith     for (i=0; i<numValues;i++) perm[i] = i;
21051fa3d41SBarry Smith     ierr = PetscSortRealWithPermutation(numValues,values,perm);CHKERRQ(ierr);
21151fa3d41SBarry Smith     if (bar->sorttolerance) {
21251fa3d41SBarry Smith       for (i=0; i<numValues;i++) {
21351fa3d41SBarry Smith         if (values[perm[numValues - i - 1]] < bar->sorttolerance) {
21451fa3d41SBarry Smith           nplot = i;
21551fa3d41SBarry Smith           break;
21651fa3d41SBarry Smith         }
21751fa3d41SBarry Smith       }
21851fa3d41SBarry Smith     }
21951fa3d41SBarry Smith   }
22051fa3d41SBarry Smith 
2215b399a63SLisandro Dalcin   draw = bar->win;
222e118a51fSLisandro Dalcin   ierr = PetscDrawCheckResizedWindow(draw);CHKERRQ(ierr);
2235b399a63SLisandro Dalcin   ierr = PetscDrawClear(draw);CHKERRQ(ierr);
224e118a51fSLisandro Dalcin 
22551fa3d41SBarry Smith   ierr = PetscDrawAxisSetLimits(bar->axis,xmin,xmax,ymin,ymax);CHKERRQ(ierr);
22651fa3d41SBarry Smith   ierr = PetscDrawAxisDraw(bar->axis);CHKERRQ(ierr);
22751fa3d41SBarry Smith 
2285b399a63SLisandro Dalcin   ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
229e118a51fSLisandro Dalcin   if (!rank) { /* Draw bins */
23051fa3d41SBarry Smith     for (i=0; i<nplot; i++) {
23151fa3d41SBarry Smith       idx = (bar->sort ? perm[numValues - i - 1] : i);
23251fa3d41SBarry Smith       binLeft  = xmin + i;
23351fa3d41SBarry Smith       binRight = xmin + i + 1;
23451fa3d41SBarry Smith       ierr = PetscDrawRectangle(draw,binLeft,ymin,binRight,values[idx],bcolor,bcolor,bcolor,bcolor);CHKERRQ(ierr);
23551fa3d41SBarry Smith       ierr = PetscDrawLine(draw,binLeft,ymin,binLeft,values[idx],PETSC_DRAW_BLACK);CHKERRQ(ierr);
23651fa3d41SBarry Smith       ierr = PetscDrawLine(draw,binRight,ymin,binRight,values[idx],PETSC_DRAW_BLACK);CHKERRQ(ierr);
23751fa3d41SBarry Smith       ierr = PetscDrawLine(draw,binLeft,values[idx],binRight,values[idx],PETSC_DRAW_BLACK);CHKERRQ(ierr);
23851fa3d41SBarry Smith       if (labels) {
23951fa3d41SBarry Smith         PetscReal h;
24051fa3d41SBarry Smith         ierr = PetscDrawStringGetSize(draw,NULL,&h);CHKERRQ(ierr);
24171917b75SLisandro Dalcin         ierr = PetscDrawStringCentered(draw,.5*(binLeft+binRight),ymin - 1.5*h,bcolor,labels[idx]);CHKERRQ(ierr);
24251fa3d41SBarry Smith       }
24351fa3d41SBarry Smith       if (color == PETSC_DRAW_ROTATE) bcolor++;
24471917b75SLisandro Dalcin       if (bcolor > PETSC_DRAW_BASIC_COLORS-1) bcolor = PETSC_DRAW_BLACK+1;
24551fa3d41SBarry Smith     }
24651fa3d41SBarry Smith   }
2475b399a63SLisandro Dalcin   ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
248e118a51fSLisandro Dalcin   if (bar->sort) {ierr = PetscFree(perm);CHKERRQ(ierr);}
249e118a51fSLisandro Dalcin 
2505b399a63SLisandro Dalcin   ierr = PetscDrawFlush(draw);CHKERRQ(ierr);
25151fa3d41SBarry Smith   ierr = PetscDrawPause(draw);CHKERRQ(ierr);
25251fa3d41SBarry Smith   PetscFunctionReturn(0);
25351fa3d41SBarry Smith }
25451fa3d41SBarry Smith 
25557fd6651SLisandro Dalcin /*@
25657fd6651SLisandro Dalcin   PetscDrawBarSave - Saves a drawn image
25757fd6651SLisandro Dalcin 
25857fd6651SLisandro Dalcin   Collective on PetscDrawBar
25957fd6651SLisandro Dalcin 
26057fd6651SLisandro Dalcin   Input Parameters:
26157fd6651SLisandro Dalcin . bar - The bar graph context
26257fd6651SLisandro Dalcin 
26357fd6651SLisandro Dalcin   Level: intermediate
26457fd6651SLisandro Dalcin 
26557fd6651SLisandro Dalcin   Concepts: bar graph^saving
26657fd6651SLisandro Dalcin 
2670afdd333SBarry Smith .seealso:  PetscDrawBarCreate(), PetscDrawBarGetDraw(), PetscDrawSetSave(), PetscDrawSave(), PetscDrawBarSetData()
26857fd6651SLisandro Dalcin @*/
26957fd6651SLisandro Dalcin PetscErrorCode  PetscDrawBarSave(PetscDrawBar bar)
27057fd6651SLisandro Dalcin {
27157fd6651SLisandro Dalcin   PetscErrorCode ierr;
27257fd6651SLisandro Dalcin 
27357fd6651SLisandro Dalcin   PetscFunctionBegin;
27457fd6651SLisandro Dalcin   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
27557fd6651SLisandro Dalcin   ierr = PetscDrawSave(bar->win);CHKERRQ(ierr);
27657fd6651SLisandro Dalcin   PetscFunctionReturn(0);
27757fd6651SLisandro Dalcin }
27857fd6651SLisandro Dalcin 
27951fa3d41SBarry Smith /*@
28051fa3d41SBarry Smith   PetscDrawBarSetColor - Sets the color the bars will be drawn with.
28151fa3d41SBarry Smith 
2825b399a63SLisandro Dalcin   Logically Collective on PetscDrawBar
28351fa3d41SBarry Smith 
28451fa3d41SBarry Smith   Input Parameters:
28551fa3d41SBarry Smith + bar - The bar graph context
28651fa3d41SBarry Smith - color - one of the colors defined in petscdraw.h or PETSC_DRAW_ROTATE to make each bar a
28751fa3d41SBarry Smith           different color
28851fa3d41SBarry Smith 
28951fa3d41SBarry Smith   Level: intermediate
29051fa3d41SBarry Smith 
2910afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarSetData(), PetscDrawBarDraw(), PetscDrawBarGetAxis()
2920afdd333SBarry Smith 
29351fa3d41SBarry Smith @*/
29451fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSetColor(PetscDrawBar bar, int color)
29551fa3d41SBarry Smith {
29651fa3d41SBarry Smith   PetscFunctionBegin;
29751fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID,1);
29851fa3d41SBarry Smith   bar->color = color;
29951fa3d41SBarry Smith   PetscFunctionReturn(0);
30051fa3d41SBarry Smith }
30151fa3d41SBarry Smith 
30251fa3d41SBarry Smith /*@
30351fa3d41SBarry Smith   PetscDrawBarSort - Sorts the values before drawing the bar chart
30451fa3d41SBarry Smith 
3055b399a63SLisandro Dalcin   Logically Collective on PetscDrawBar
30651fa3d41SBarry Smith 
30751fa3d41SBarry Smith   Input Parameters:
30851fa3d41SBarry Smith + bar - The bar graph context
30951fa3d41SBarry Smith . sort - PETSC_TRUE to sort the values
31051fa3d41SBarry Smith . tolerance - discard values less than tolerance
31151fa3d41SBarry Smith 
31251fa3d41SBarry Smith   Level: intermediate
31351fa3d41SBarry Smith 
31451fa3d41SBarry Smith   Concepts: bar graph^setting axis
3150afdd333SBarry Smith 
3160afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarSetData(), PetscDrawBarSetColor(), PetscDrawBarDraw(), PetscDrawBarGetAxis()
31751fa3d41SBarry Smith @*/
31851fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSort(PetscDrawBar bar, PetscBool sort, PetscReal tolerance)
31951fa3d41SBarry Smith {
32051fa3d41SBarry Smith   PetscFunctionBegin;
32151fa3d41SBarry Smith   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
32251fa3d41SBarry Smith   bar->sort          = sort;
32351fa3d41SBarry Smith   bar->sorttolerance = tolerance;
32451fa3d41SBarry Smith   PetscFunctionReturn(0);
32551fa3d41SBarry Smith }
32651fa3d41SBarry Smith 
32751fa3d41SBarry Smith /*@
32851fa3d41SBarry Smith   PetscDrawBarSetLimits - Sets the axis limits for a bar graph. If more
32951fa3d41SBarry Smith   points are added after this call, the limits will be adjusted to
33051fa3d41SBarry Smith   include those additional points.
33151fa3d41SBarry Smith 
3325b399a63SLisandro Dalcin   Logically Collective on PetscDrawBar
33351fa3d41SBarry Smith 
33451fa3d41SBarry Smith   Input Parameters:
33551fa3d41SBarry Smith + bar - The bar graph context
33651fa3d41SBarry Smith - y_min,y_max - The limits
33751fa3d41SBarry Smith 
33851fa3d41SBarry Smith   Level: intermediate
33951fa3d41SBarry Smith 
34051fa3d41SBarry Smith   Concepts: bar graph^setting axis
3410afdd333SBarry Smith 
3420afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarGetAxis(), PetscDrawBarSetData(), PetscDrawBarDraw()
34351fa3d41SBarry Smith @*/
34451fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSetLimits(PetscDrawBar bar, PetscReal y_min, PetscReal y_max)
34551fa3d41SBarry Smith {
34651fa3d41SBarry Smith   PetscFunctionBegin;
34751fa3d41SBarry Smith   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
34851fa3d41SBarry Smith   bar->ymin = y_min;
34951fa3d41SBarry Smith   bar->ymax = y_max;
35051fa3d41SBarry Smith   PetscFunctionReturn(0);
35151fa3d41SBarry Smith }
35251fa3d41SBarry Smith 
35351fa3d41SBarry Smith /*@C
35451fa3d41SBarry Smith   PetscDrawBarGetAxis - Gets the axis context associated with a bar graph.
35551fa3d41SBarry Smith   This is useful if one wants to change some axis property, such as
35651fa3d41SBarry Smith   labels, color, etc. The axis context should not be destroyed by the
35751fa3d41SBarry Smith   application code.
35851fa3d41SBarry Smith 
3595b399a63SLisandro Dalcin   Not Collective, PetscDrawAxis is parallel if PetscDrawBar is parallel
36051fa3d41SBarry Smith 
36151fa3d41SBarry Smith   Input Parameter:
36251fa3d41SBarry Smith . bar - The bar graph context
36351fa3d41SBarry Smith 
36451fa3d41SBarry Smith   Output Parameter:
36551fa3d41SBarry Smith . axis - The axis context
36651fa3d41SBarry Smith 
36751fa3d41SBarry Smith   Level: intermediate
36851fa3d41SBarry Smith 
3690afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawAxis, PetscDrawAxisCreate()
37051fa3d41SBarry Smith @*/
37151fa3d41SBarry Smith PetscErrorCode  PetscDrawBarGetAxis(PetscDrawBar bar,PetscDrawAxis *axis)
37251fa3d41SBarry Smith {
37351fa3d41SBarry Smith   PetscFunctionBegin;
374e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
37545f3bb6eSLisandro Dalcin   PetscValidPointer(axis,2);
37651fa3d41SBarry Smith   *axis = bar->axis;
37751fa3d41SBarry Smith   PetscFunctionReturn(0);
37851fa3d41SBarry Smith }
37951fa3d41SBarry Smith 
38051fa3d41SBarry Smith /*@C
38151fa3d41SBarry Smith   PetscDrawBarGetDraw - Gets the draw context associated with a bar graph.
38251fa3d41SBarry Smith 
38351fa3d41SBarry Smith   Not Collective, PetscDraw is parallel if PetscDrawBar is parallel
38451fa3d41SBarry Smith 
38551fa3d41SBarry Smith   Input Parameter:
38651fa3d41SBarry Smith . bar - The bar graph context
38751fa3d41SBarry Smith 
38851fa3d41SBarry Smith   Output Parameter:
389e118a51fSLisandro Dalcin . draw  - The draw context
39051fa3d41SBarry Smith 
39151fa3d41SBarry Smith   Level: intermediate
39251fa3d41SBarry Smith 
3930afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarDraw(), PetscDraw
39451fa3d41SBarry Smith @*/
395e118a51fSLisandro Dalcin PetscErrorCode  PetscDrawBarGetDraw(PetscDrawBar bar,PetscDraw *draw)
39651fa3d41SBarry Smith {
39751fa3d41SBarry Smith   PetscFunctionBegin;
39851fa3d41SBarry Smith   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
39945f3bb6eSLisandro Dalcin   PetscValidPointer(draw,2);
400e118a51fSLisandro Dalcin   *draw = bar->win;
40151fa3d41SBarry Smith   PetscFunctionReturn(0);
40251fa3d41SBarry Smith }
40351fa3d41SBarry Smith 
40451fa3d41SBarry Smith /*@
40551fa3d41SBarry Smith     PetscDrawBarSetFromOptions - Sets options related to the PetscDrawBar
40651fa3d41SBarry Smith 
40751fa3d41SBarry Smith     Collective over PetscDrawBar
40851fa3d41SBarry Smith 
40951fa3d41SBarry Smith     Options Database:
41051fa3d41SBarry Smith .  -bar_sort - sort the entries before drawing the bar graph
41151fa3d41SBarry Smith 
41251fa3d41SBarry Smith     Level: intermediate
41351fa3d41SBarry Smith 
41451fa3d41SBarry Smith 
4150afdd333SBarry Smith .seealso:  PetscDrawBarDestroy(), PetscDrawBarCreate(), PetscDrawBarSort()
41651fa3d41SBarry Smith @*/
41751fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSetFromOptions(PetscDrawBar bar)
41851fa3d41SBarry Smith {
41951fa3d41SBarry Smith   PetscErrorCode ierr;
42051fa3d41SBarry Smith   PetscBool      set;
42151fa3d41SBarry Smith 
42251fa3d41SBarry Smith   PetscFunctionBegin;
423e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
424e118a51fSLisandro Dalcin 
42571917b75SLisandro Dalcin   ierr = PetscOptionsHasName(((PetscObject)bar)->options,((PetscObject)bar)->prefix,"-bar_sort",&set);CHKERRQ(ierr);
42651fa3d41SBarry Smith   if (set) {
427e118a51fSLisandro Dalcin     PetscReal tol = bar->sorttolerance;
42871917b75SLisandro Dalcin     ierr = PetscOptionsGetReal(((PetscObject)bar)->options,((PetscObject)bar)->prefix,"-bar_sort",&tol,NULL);CHKERRQ(ierr);
42951fa3d41SBarry Smith     ierr = PetscDrawBarSort(bar,PETSC_TRUE,tol);CHKERRQ(ierr);
43051fa3d41SBarry Smith   }
43151fa3d41SBarry Smith   PetscFunctionReturn(0);
43251fa3d41SBarry Smith }
43351fa3d41SBarry Smith 
434