xref: /petsc/src/sys/classes/draw/utils/bars.c (revision 5f80ce2ab25dff0f4601e710601cbbcecf323266)
151fa3d41SBarry Smith 
251fa3d41SBarry Smith /*
351fa3d41SBarry Smith   Contains the data structure for plotting a bargraph in a window with an axis.
451fa3d41SBarry Smith */
5999739cfSJacob Faibussowitsch 
6999739cfSJacob Faibussowitsch #include <petsc/private/drawimpl.h> /*I "petscdraw.h" I*/
751fa3d41SBarry Smith #include <petscviewer.h>            /*I "petscviewer.h" I*/
851fa3d41SBarry Smith 
951fa3d41SBarry Smith PetscClassId PETSC_DRAWBAR_CLASSID = 0;
1051fa3d41SBarry Smith 
1151fa3d41SBarry Smith /*@C
1251fa3d41SBarry Smith    PetscDrawBarCreate - Creates a bar graph data structure.
1351fa3d41SBarry Smith 
1451fa3d41SBarry Smith    Collective over PetscDraw
1551fa3d41SBarry Smith 
1651fa3d41SBarry Smith    Input Parameters:
1751fa3d41SBarry Smith .  draw  - The window where the graph will be made
1851fa3d41SBarry Smith 
1951fa3d41SBarry Smith    Output Parameters:
2051fa3d41SBarry Smith .  bar - The bar graph context
2151fa3d41SBarry Smith 
2295452b02SPatrick Sanan    Notes:
2395452b02SPatrick Sanan     Call PetscDrawBarSetData() to provide the bins to be plotted and then PetscDrawBarDraw() to display the new plot
240afdd333SBarry Smith 
25a8d69d7bSBarry Smith   The difference between a bar chart, PetscDrawBar, and a histogram, PetscDrawHG, is explained here https://stattrek.com/statistics/charts/histogram.aspx?Tutorial=AP
267e25d57eSBarry Smith 
277e25d57eSBarry 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
287e25d57eSBarry Smith    zeroth MPI process in the communicator. All MPI processes in the communicator must call PetscDrawBarDraw() to display the updated graph.
290afdd333SBarry Smith 
3051fa3d41SBarry Smith    Level: intermediate
3151fa3d41SBarry Smith 
320afdd333SBarry Smith .seealso: PetscDrawLGCreate(), PetscDrawLG, PetscDrawSPCreate(), PetscDrawSP, PetscDrawHGCreate(), PetscDrawHG, PetscDrawBarDestroy(), PetscDrawBarSetData(),
330afdd333SBarry Smith           PetscDrawBar, PetscDrawBarDraw(), PetscDrawBarSave(), PetscDrawBarSetColor(), PetscDrawBarSort(), PetscDrawBarSetLimits(), PetscDrawBarGetAxis(), PetscDrawAxis,
340afdd333SBarry Smith           PetscDrawBarGetDraw(), PetscDrawBarSetFromOptions()
3551fa3d41SBarry Smith @*/
3651fa3d41SBarry Smith PetscErrorCode  PetscDrawBarCreate(PetscDraw draw,PetscDrawBar *bar)
3751fa3d41SBarry Smith {
3851fa3d41SBarry Smith   PetscDrawBar   h;
3951fa3d41SBarry Smith 
4051fa3d41SBarry Smith   PetscFunctionBegin;
4151fa3d41SBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
4273107ff1SLisandro Dalcin   PetscValidPointer(bar,2);
43e118a51fSLisandro Dalcin 
44*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHeaderCreate(h,PETSC_DRAWBAR_CLASSID,"DrawBar","Bar Graph","Draw",PetscObjectComm((PetscObject)draw),PetscDrawBarDestroy,NULL));
45*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscLogObjectParent((PetscObject)draw,(PetscObject)h));
46e118a51fSLisandro Dalcin 
47*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectReference((PetscObject)draw));
48e118a51fSLisandro Dalcin   h->win = draw;
4951fa3d41SBarry Smith 
5051fa3d41SBarry Smith   h->view        = NULL;
5151fa3d41SBarry Smith   h->destroy     = NULL;
5251fa3d41SBarry Smith   h->color       = PETSC_DRAW_GREEN;
5351fa3d41SBarry Smith   h->ymin        = 0.;  /* if user has not set these then they are determined from the data */
5451fa3d41SBarry Smith   h->ymax        = 0.;
5551fa3d41SBarry Smith   h->numBins     = 0;
5651fa3d41SBarry Smith 
57*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawAxisCreate(draw,&h->axis));
5845f3bb6eSLisandro Dalcin   h->axis->xticks = NULL;
59e118a51fSLisandro Dalcin 
6051fa3d41SBarry Smith   *bar = h;
6151fa3d41SBarry Smith   PetscFunctionReturn(0);
6251fa3d41SBarry Smith }
6351fa3d41SBarry Smith 
6451fa3d41SBarry Smith /*@C
6551fa3d41SBarry Smith    PetscDrawBarSetData
6651fa3d41SBarry Smith 
675b399a63SLisandro Dalcin    Logically Collective on PetscDrawBar
6851fa3d41SBarry Smith 
69d8d19677SJose E. Roman    Input Parameters:
7051fa3d41SBarry Smith +  bar - The bar graph context.
7151fa3d41SBarry Smith .  bins  - number of items
7251fa3d41SBarry Smith .  values - values of each item
7351fa3d41SBarry Smith -  labels - optional label for each bar, NULL terminated array of strings
7451fa3d41SBarry Smith 
7551fa3d41SBarry Smith    Level: intermediate
7651fa3d41SBarry Smith 
7795452b02SPatrick Sanan    Notes:
7895452b02SPatrick Sanan     Call PetscDrawBarDraw() after this call to display the new plot
790afdd333SBarry Smith 
800afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarDraw()
8151fa3d41SBarry Smith 
8251fa3d41SBarry Smith @*/
8351fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSetData(PetscDrawBar bar,PetscInt bins,const PetscReal data[],const char *const *labels)
8451fa3d41SBarry Smith {
8551fa3d41SBarry Smith   PetscFunctionBegin;
8651fa3d41SBarry Smith   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
87e118a51fSLisandro Dalcin 
8851fa3d41SBarry Smith   if (bar->numBins != bins) {
89*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscFree(bar->values));
90*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscMalloc1(bins, &bar->values));
9151fa3d41SBarry Smith     bar->numBins = bins;
9251fa3d41SBarry Smith   }
93*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscArraycpy(bar->values,data,bins));
9451fa3d41SBarry Smith   bar->numBins = bins;
9551fa3d41SBarry Smith   if (labels) {
96*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscStrArrayallocpy(labels,&bar->labels));
9751fa3d41SBarry Smith   }
9851fa3d41SBarry Smith   PetscFunctionReturn(0);
9951fa3d41SBarry Smith }
10051fa3d41SBarry Smith 
10151fa3d41SBarry Smith /*@C
10251fa3d41SBarry Smith   PetscDrawBarDestroy - Frees all space taken up by bar graph data structure.
10351fa3d41SBarry Smith 
10451fa3d41SBarry Smith   Collective over PetscDrawBar
10551fa3d41SBarry Smith 
10651fa3d41SBarry Smith   Input Parameter:
10751fa3d41SBarry Smith . bar - The bar graph context
10851fa3d41SBarry Smith 
10951fa3d41SBarry Smith   Level: intermediate
11051fa3d41SBarry Smith 
11151fa3d41SBarry Smith .seealso:  PetscDrawBarCreate()
11251fa3d41SBarry Smith @*/
11351fa3d41SBarry Smith PetscErrorCode  PetscDrawBarDestroy(PetscDrawBar *bar)
11451fa3d41SBarry Smith {
11551fa3d41SBarry Smith   PetscFunctionBegin;
11651fa3d41SBarry Smith   if (!*bar) PetscFunctionReturn(0);
117e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(*bar,PETSC_DRAWBAR_CLASSID,1);
11851fa3d41SBarry Smith   if (--((PetscObject)(*bar))->refct > 0) PetscFunctionReturn(0);
119e118a51fSLisandro Dalcin 
120*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscFree((*bar)->values));
121*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscStrArrayDestroy(&(*bar)->labels));
122*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawAxisDestroy(&(*bar)->axis));
123*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawDestroy(&(*bar)->win));
124*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscHeaderDestroy(bar));
12551fa3d41SBarry Smith   PetscFunctionReturn(0);
12651fa3d41SBarry Smith }
12751fa3d41SBarry Smith 
12851fa3d41SBarry Smith /*@
12951fa3d41SBarry Smith   PetscDrawBarDraw - Redraws a bar graph.
13051fa3d41SBarry Smith 
1315b399a63SLisandro Dalcin   Collective on PetscDrawBar
13251fa3d41SBarry Smith 
13351fa3d41SBarry Smith   Input Parameter:
13451fa3d41SBarry Smith . bar - The bar graph context
13551fa3d41SBarry Smith 
13651fa3d41SBarry Smith   Level: intermediate
13751fa3d41SBarry Smith 
1380afdd333SBarry Smith .seealso: PetscDrawBar, PetscDrawBarCreate(), PetscDrawBarSetData()
1390afdd333SBarry Smith 
14051fa3d41SBarry Smith @*/
14151fa3d41SBarry Smith PetscErrorCode  PetscDrawBarDraw(PetscDrawBar bar)
14251fa3d41SBarry Smith {
143e118a51fSLisandro Dalcin   PetscDraw      draw;
14451fa3d41SBarry Smith   PetscBool      isnull;
14551fa3d41SBarry Smith   PetscReal      xmin,xmax,ymin,ymax,*values,binLeft,binRight;
14651fa3d41SBarry Smith   PetscInt       numValues,i,bcolor,color,idx,*perm,nplot;
147e118a51fSLisandro Dalcin   PetscMPIInt    rank;
14851fa3d41SBarry Smith   char           **labels;
149*5f80ce2aSJacob Faibussowitsch   PetscErrorCode ierr;
15051fa3d41SBarry Smith 
15151fa3d41SBarry Smith   PetscFunctionBegin;
15251fa3d41SBarry Smith   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
153*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawIsNull(bar->win,&isnull));
1548f69470aSLisandro Dalcin   if (isnull) PetscFunctionReturn(0);
155*5f80ce2aSJacob Faibussowitsch   CHKERRMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)bar),&rank));
15651fa3d41SBarry Smith 
1575b399a63SLisandro Dalcin   if (bar->numBins < 1) PetscFunctionReturn(0);
1585b399a63SLisandro Dalcin 
15951fa3d41SBarry Smith   color = bar->color;
16071917b75SLisandro Dalcin   if (color == PETSC_DRAW_ROTATE) bcolor = PETSC_DRAW_BLACK+1;
16151fa3d41SBarry Smith   else bcolor = color;
16251fa3d41SBarry Smith 
16351fa3d41SBarry Smith   numValues = bar->numBins;
16451fa3d41SBarry Smith   values    = bar->values;
16551fa3d41SBarry Smith   if (bar->ymin == bar->ymax) {
16651fa3d41SBarry Smith     /* user has not set bounds on bars so set them based on the data */
16751fa3d41SBarry Smith     ymin = PETSC_MAX_REAL;
16851fa3d41SBarry Smith     ymax = PETSC_MIN_REAL;
16951fa3d41SBarry Smith     for (i=0; i<numValues; i++) {
17051fa3d41SBarry Smith       ymin = PetscMin(ymin,values[i]);
17151fa3d41SBarry Smith       ymax = PetscMax(ymax,values[i]);
17251fa3d41SBarry Smith     }
17351fa3d41SBarry Smith   } else {
17451fa3d41SBarry Smith     ymin = bar->ymin;
17551fa3d41SBarry Smith     ymax = bar->ymax;
17651fa3d41SBarry Smith   }
17751fa3d41SBarry Smith   nplot  = numValues;  /* number of points to actually plot; if some are lower than requested tolerance */
17851fa3d41SBarry Smith   xmin   = 0.0;
179e118a51fSLisandro Dalcin   xmax   = nplot;
18051fa3d41SBarry Smith   labels = bar->labels;
18151fa3d41SBarry Smith 
18251fa3d41SBarry Smith   if (bar->sort) {
183*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscMalloc1(numValues,&perm));
18451fa3d41SBarry Smith     for (i=0; i<numValues;i++) perm[i] = i;
185*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscSortRealWithPermutation(numValues,values,perm));
18651fa3d41SBarry Smith     if (bar->sorttolerance) {
18751fa3d41SBarry Smith       for (i=0; i<numValues;i++) {
18851fa3d41SBarry Smith         if (values[perm[numValues - i - 1]] < bar->sorttolerance) {
18951fa3d41SBarry Smith           nplot = i;
19051fa3d41SBarry Smith           break;
19151fa3d41SBarry Smith         }
19251fa3d41SBarry Smith       }
19351fa3d41SBarry Smith     }
19451fa3d41SBarry Smith   }
19551fa3d41SBarry Smith 
1965b399a63SLisandro Dalcin   draw = bar->win;
197*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawCheckResizedWindow(draw));
198*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawClear(draw));
199e118a51fSLisandro Dalcin 
200*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawAxisSetLimits(bar->axis,xmin,xmax,ymin,ymax));
201*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawAxisDraw(bar->axis));
20251fa3d41SBarry Smith 
2035b399a63SLisandro Dalcin   ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
204dd400576SPatrick Sanan   if (rank == 0) { /* Draw bins */
20551fa3d41SBarry Smith     for (i=0; i<nplot; i++) {
20651fa3d41SBarry Smith       idx = (bar->sort ? perm[numValues - i - 1] : i);
20751fa3d41SBarry Smith       binLeft  = xmin + i;
20851fa3d41SBarry Smith       binRight = xmin + i + 1;
209*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscDrawRectangle(draw,binLeft,ymin,binRight,values[idx],bcolor,bcolor,bcolor,bcolor));
210*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscDrawLine(draw,binLeft,ymin,binLeft,values[idx],PETSC_DRAW_BLACK));
211*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscDrawLine(draw,binRight,ymin,binRight,values[idx],PETSC_DRAW_BLACK));
212*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscDrawLine(draw,binLeft,values[idx],binRight,values[idx],PETSC_DRAW_BLACK));
21351fa3d41SBarry Smith       if (labels) {
21451fa3d41SBarry Smith         PetscReal h;
215*5f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscDrawStringGetSize(draw,NULL,&h));
216*5f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscDrawStringCentered(draw,.5*(binLeft+binRight),ymin - 1.5*h,bcolor,labels[idx]));
21751fa3d41SBarry Smith       }
21851fa3d41SBarry Smith       if (color == PETSC_DRAW_ROTATE) bcolor++;
21971917b75SLisandro Dalcin       if (bcolor > PETSC_DRAW_BASIC_COLORS-1) bcolor = PETSC_DRAW_BLACK+1;
22051fa3d41SBarry Smith     }
22151fa3d41SBarry Smith   }
2225b399a63SLisandro Dalcin   ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
223*5f80ce2aSJacob Faibussowitsch   if (bar->sort) CHKERRQ(PetscFree(perm));
224e118a51fSLisandro Dalcin 
225*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawFlush(draw));
226*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawPause(draw));
22751fa3d41SBarry Smith   PetscFunctionReturn(0);
22851fa3d41SBarry Smith }
22951fa3d41SBarry Smith 
23057fd6651SLisandro Dalcin /*@
23157fd6651SLisandro Dalcin   PetscDrawBarSave - Saves a drawn image
23257fd6651SLisandro Dalcin 
23357fd6651SLisandro Dalcin   Collective on PetscDrawBar
23457fd6651SLisandro Dalcin 
23557fd6651SLisandro Dalcin   Input Parameters:
23657fd6651SLisandro Dalcin . bar - The bar graph context
23757fd6651SLisandro Dalcin 
23857fd6651SLisandro Dalcin   Level: intermediate
23957fd6651SLisandro Dalcin 
2400afdd333SBarry Smith .seealso:  PetscDrawBarCreate(), PetscDrawBarGetDraw(), PetscDrawSetSave(), PetscDrawSave(), PetscDrawBarSetData()
24157fd6651SLisandro Dalcin @*/
24257fd6651SLisandro Dalcin PetscErrorCode  PetscDrawBarSave(PetscDrawBar bar)
24357fd6651SLisandro Dalcin {
24457fd6651SLisandro Dalcin   PetscFunctionBegin;
24557fd6651SLisandro Dalcin   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
246*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawSave(bar->win));
24757fd6651SLisandro Dalcin   PetscFunctionReturn(0);
24857fd6651SLisandro Dalcin }
24957fd6651SLisandro Dalcin 
25051fa3d41SBarry Smith /*@
25151fa3d41SBarry Smith   PetscDrawBarSetColor - Sets the color the bars will be drawn with.
25251fa3d41SBarry Smith 
2535b399a63SLisandro Dalcin   Logically Collective on PetscDrawBar
25451fa3d41SBarry Smith 
25551fa3d41SBarry Smith   Input Parameters:
25651fa3d41SBarry Smith + bar - The bar graph context
25751fa3d41SBarry Smith - color - one of the colors defined in petscdraw.h or PETSC_DRAW_ROTATE to make each bar a
25851fa3d41SBarry Smith           different color
25951fa3d41SBarry Smith 
26051fa3d41SBarry Smith   Level: intermediate
26151fa3d41SBarry Smith 
2620afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarSetData(), PetscDrawBarDraw(), PetscDrawBarGetAxis()
2630afdd333SBarry Smith 
26451fa3d41SBarry Smith @*/
26551fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSetColor(PetscDrawBar bar, int color)
26651fa3d41SBarry Smith {
26751fa3d41SBarry Smith   PetscFunctionBegin;
26851fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID,1);
26951fa3d41SBarry Smith   bar->color = color;
27051fa3d41SBarry Smith   PetscFunctionReturn(0);
27151fa3d41SBarry Smith }
27251fa3d41SBarry Smith 
27351fa3d41SBarry Smith /*@
27451fa3d41SBarry Smith   PetscDrawBarSort - Sorts the values before drawing the bar chart
27551fa3d41SBarry Smith 
2765b399a63SLisandro Dalcin   Logically Collective on PetscDrawBar
27751fa3d41SBarry Smith 
27851fa3d41SBarry Smith   Input Parameters:
27951fa3d41SBarry Smith + bar - The bar graph context
28051fa3d41SBarry Smith . sort - PETSC_TRUE to sort the values
281a2b725a8SWilliam Gropp - tolerance - discard values less than tolerance
28251fa3d41SBarry Smith 
28351fa3d41SBarry Smith   Level: intermediate
28451fa3d41SBarry Smith 
2850afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarSetData(), PetscDrawBarSetColor(), PetscDrawBarDraw(), PetscDrawBarGetAxis()
28651fa3d41SBarry Smith @*/
28751fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSort(PetscDrawBar bar, PetscBool sort, PetscReal tolerance)
28851fa3d41SBarry Smith {
28951fa3d41SBarry Smith   PetscFunctionBegin;
29051fa3d41SBarry Smith   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
29151fa3d41SBarry Smith   bar->sort          = sort;
29251fa3d41SBarry Smith   bar->sorttolerance = tolerance;
29351fa3d41SBarry Smith   PetscFunctionReturn(0);
29451fa3d41SBarry Smith }
29551fa3d41SBarry Smith 
29651fa3d41SBarry Smith /*@
29751fa3d41SBarry Smith   PetscDrawBarSetLimits - Sets the axis limits for a bar graph. If more
29851fa3d41SBarry Smith   points are added after this call, the limits will be adjusted to
29951fa3d41SBarry Smith   include those additional points.
30051fa3d41SBarry Smith 
3015b399a63SLisandro Dalcin   Logically Collective on PetscDrawBar
30251fa3d41SBarry Smith 
30351fa3d41SBarry Smith   Input Parameters:
30451fa3d41SBarry Smith + bar - The bar graph context
30551fa3d41SBarry Smith - y_min,y_max - The limits
30651fa3d41SBarry Smith 
30751fa3d41SBarry Smith   Level: intermediate
30851fa3d41SBarry Smith 
3090afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarGetAxis(), PetscDrawBarSetData(), PetscDrawBarDraw()
31051fa3d41SBarry Smith @*/
31151fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSetLimits(PetscDrawBar bar, PetscReal y_min, PetscReal y_max)
31251fa3d41SBarry Smith {
31351fa3d41SBarry Smith   PetscFunctionBegin;
31451fa3d41SBarry Smith   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
31551fa3d41SBarry Smith   bar->ymin = y_min;
31651fa3d41SBarry Smith   bar->ymax = y_max;
31751fa3d41SBarry Smith   PetscFunctionReturn(0);
31851fa3d41SBarry Smith }
31951fa3d41SBarry Smith 
32051fa3d41SBarry Smith /*@C
32151fa3d41SBarry Smith   PetscDrawBarGetAxis - Gets the axis context associated with a bar graph.
32251fa3d41SBarry Smith   This is useful if one wants to change some axis property, such as
32351fa3d41SBarry Smith   labels, color, etc. The axis context should not be destroyed by the
32451fa3d41SBarry Smith   application code.
32551fa3d41SBarry Smith 
3265b399a63SLisandro Dalcin   Not Collective, PetscDrawAxis is parallel if PetscDrawBar is parallel
32751fa3d41SBarry Smith 
32851fa3d41SBarry Smith   Input Parameter:
32951fa3d41SBarry Smith . bar - The bar graph context
33051fa3d41SBarry Smith 
33151fa3d41SBarry Smith   Output Parameter:
33251fa3d41SBarry Smith . axis - The axis context
33351fa3d41SBarry Smith 
33451fa3d41SBarry Smith   Level: intermediate
33551fa3d41SBarry Smith 
3360afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawAxis, PetscDrawAxisCreate()
33751fa3d41SBarry Smith @*/
33851fa3d41SBarry Smith PetscErrorCode  PetscDrawBarGetAxis(PetscDrawBar bar,PetscDrawAxis *axis)
33951fa3d41SBarry Smith {
34051fa3d41SBarry Smith   PetscFunctionBegin;
341e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
34245f3bb6eSLisandro Dalcin   PetscValidPointer(axis,2);
34351fa3d41SBarry Smith   *axis = bar->axis;
34451fa3d41SBarry Smith   PetscFunctionReturn(0);
34551fa3d41SBarry Smith }
34651fa3d41SBarry Smith 
34751fa3d41SBarry Smith /*@C
34851fa3d41SBarry Smith   PetscDrawBarGetDraw - Gets the draw context associated with a bar graph.
34951fa3d41SBarry Smith 
35051fa3d41SBarry Smith   Not Collective, PetscDraw is parallel if PetscDrawBar is parallel
35151fa3d41SBarry Smith 
35251fa3d41SBarry Smith   Input Parameter:
35351fa3d41SBarry Smith . bar - The bar graph context
35451fa3d41SBarry Smith 
35551fa3d41SBarry Smith   Output Parameter:
356e118a51fSLisandro Dalcin . draw  - The draw context
35751fa3d41SBarry Smith 
35851fa3d41SBarry Smith   Level: intermediate
35951fa3d41SBarry Smith 
3600afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarDraw(), PetscDraw
36151fa3d41SBarry Smith @*/
362e118a51fSLisandro Dalcin PetscErrorCode  PetscDrawBarGetDraw(PetscDrawBar bar,PetscDraw *draw)
36351fa3d41SBarry Smith {
36451fa3d41SBarry Smith   PetscFunctionBegin;
36551fa3d41SBarry Smith   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
36645f3bb6eSLisandro Dalcin   PetscValidPointer(draw,2);
367e118a51fSLisandro Dalcin   *draw = bar->win;
36851fa3d41SBarry Smith   PetscFunctionReturn(0);
36951fa3d41SBarry Smith }
37051fa3d41SBarry Smith 
37151fa3d41SBarry Smith /*@
37251fa3d41SBarry Smith     PetscDrawBarSetFromOptions - Sets options related to the PetscDrawBar
37351fa3d41SBarry Smith 
37451fa3d41SBarry Smith     Collective over PetscDrawBar
37551fa3d41SBarry Smith 
37651fa3d41SBarry Smith     Options Database:
37751fa3d41SBarry Smith .  -bar_sort - sort the entries before drawing the bar graph
37851fa3d41SBarry Smith 
37951fa3d41SBarry Smith     Level: intermediate
38051fa3d41SBarry Smith 
3810afdd333SBarry Smith .seealso:  PetscDrawBarDestroy(), PetscDrawBarCreate(), PetscDrawBarSort()
38251fa3d41SBarry Smith @*/
38351fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSetFromOptions(PetscDrawBar bar)
38451fa3d41SBarry Smith {
38551fa3d41SBarry Smith   PetscBool      set;
38651fa3d41SBarry Smith 
38751fa3d41SBarry Smith   PetscFunctionBegin;
388e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
389e118a51fSLisandro Dalcin 
390*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsHasName(((PetscObject)bar)->options,((PetscObject)bar)->prefix,"-bar_sort",&set));
39151fa3d41SBarry Smith   if (set) {
392e118a51fSLisandro Dalcin     PetscReal tol = bar->sorttolerance;
393*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscOptionsGetReal(((PetscObject)bar)->options,((PetscObject)bar)->prefix,"-bar_sort",&tol,NULL));
394*5f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscDrawBarSort(bar,PETSC_TRUE,tol));
39551fa3d41SBarry Smith   }
39651fa3d41SBarry Smith   PetscFunctionReturn(0);
39751fa3d41SBarry Smith }
398