xref: /petsc/src/sys/classes/draw/utils/bars.c (revision d0609ced746bc51b019815ca91d747429db24893)
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 
449566063dSJacob Faibussowitsch   PetscCall(PetscHeaderCreate(h,PETSC_DRAWBAR_CLASSID,"DrawBar","Bar Graph","Draw",PetscObjectComm((PetscObject)draw),PetscDrawBarDestroy,NULL));
459566063dSJacob Faibussowitsch   PetscCall(PetscLogObjectParent((PetscObject)draw,(PetscObject)h));
46e118a51fSLisandro Dalcin 
479566063dSJacob Faibussowitsch   PetscCall(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 
579566063dSJacob Faibussowitsch   PetscCall(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) {
899566063dSJacob Faibussowitsch     PetscCall(PetscFree(bar->values));
909566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(bins, &bar->values));
9151fa3d41SBarry Smith     bar->numBins = bins;
9251fa3d41SBarry Smith   }
939566063dSJacob Faibussowitsch   PetscCall(PetscArraycpy(bar->values,data,bins));
9451fa3d41SBarry Smith   bar->numBins = bins;
9551fa3d41SBarry Smith   if (labels) {
969566063dSJacob Faibussowitsch     PetscCall(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 
1209566063dSJacob Faibussowitsch   PetscCall(PetscFree((*bar)->values));
1219566063dSJacob Faibussowitsch   PetscCall(PetscStrArrayDestroy(&(*bar)->labels));
1229566063dSJacob Faibussowitsch   PetscCall(PetscDrawAxisDestroy(&(*bar)->axis));
1239566063dSJacob Faibussowitsch   PetscCall(PetscDrawDestroy(&(*bar)->win));
1249566063dSJacob Faibussowitsch   PetscCall(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;
14951fa3d41SBarry Smith 
15051fa3d41SBarry Smith   PetscFunctionBegin;
15151fa3d41SBarry Smith   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
1529566063dSJacob Faibussowitsch   PetscCall(PetscDrawIsNull(bar->win,&isnull));
1538f69470aSLisandro Dalcin   if (isnull) PetscFunctionReturn(0);
1549566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)bar),&rank));
15551fa3d41SBarry Smith 
1565b399a63SLisandro Dalcin   if (bar->numBins < 1) PetscFunctionReturn(0);
1575b399a63SLisandro Dalcin 
15851fa3d41SBarry Smith   color = bar->color;
15971917b75SLisandro Dalcin   if (color == PETSC_DRAW_ROTATE) bcolor = PETSC_DRAW_BLACK+1;
16051fa3d41SBarry Smith   else bcolor = color;
16151fa3d41SBarry Smith 
16251fa3d41SBarry Smith   numValues = bar->numBins;
16351fa3d41SBarry Smith   values    = bar->values;
16451fa3d41SBarry Smith   if (bar->ymin == bar->ymax) {
16551fa3d41SBarry Smith     /* user has not set bounds on bars so set them based on the data */
16651fa3d41SBarry Smith     ymin = PETSC_MAX_REAL;
16751fa3d41SBarry Smith     ymax = PETSC_MIN_REAL;
16851fa3d41SBarry Smith     for (i=0; i<numValues; i++) {
16951fa3d41SBarry Smith       ymin = PetscMin(ymin,values[i]);
17051fa3d41SBarry Smith       ymax = PetscMax(ymax,values[i]);
17151fa3d41SBarry Smith     }
17251fa3d41SBarry Smith   } else {
17351fa3d41SBarry Smith     ymin = bar->ymin;
17451fa3d41SBarry Smith     ymax = bar->ymax;
17551fa3d41SBarry Smith   }
17651fa3d41SBarry Smith   nplot  = numValues;  /* number of points to actually plot; if some are lower than requested tolerance */
17751fa3d41SBarry Smith   xmin   = 0.0;
178e118a51fSLisandro Dalcin   xmax   = nplot;
17951fa3d41SBarry Smith   labels = bar->labels;
18051fa3d41SBarry Smith 
18151fa3d41SBarry Smith   if (bar->sort) {
1829566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(numValues,&perm));
18351fa3d41SBarry Smith     for (i=0; i<numValues;i++) perm[i] = i;
1849566063dSJacob Faibussowitsch     PetscCall(PetscSortRealWithPermutation(numValues,values,perm));
18551fa3d41SBarry Smith     if (bar->sorttolerance) {
18651fa3d41SBarry Smith       for (i=0; i<numValues;i++) {
18751fa3d41SBarry Smith         if (values[perm[numValues - i - 1]] < bar->sorttolerance) {
18851fa3d41SBarry Smith           nplot = i;
18951fa3d41SBarry Smith           break;
19051fa3d41SBarry Smith         }
19151fa3d41SBarry Smith       }
19251fa3d41SBarry Smith     }
19351fa3d41SBarry Smith   }
19451fa3d41SBarry Smith 
1955b399a63SLisandro Dalcin   draw = bar->win;
1969566063dSJacob Faibussowitsch   PetscCall(PetscDrawCheckResizedWindow(draw));
1979566063dSJacob Faibussowitsch   PetscCall(PetscDrawClear(draw));
198e118a51fSLisandro Dalcin 
1999566063dSJacob Faibussowitsch   PetscCall(PetscDrawAxisSetLimits(bar->axis,xmin,xmax,ymin,ymax));
2009566063dSJacob Faibussowitsch   PetscCall(PetscDrawAxisDraw(bar->axis));
20151fa3d41SBarry Smith 
202*d0609cedSBarry Smith   PetscDrawCollectiveBegin(draw);
203dd400576SPatrick Sanan   if (rank == 0) { /* Draw bins */
20451fa3d41SBarry Smith     for (i=0; i<nplot; i++) {
20551fa3d41SBarry Smith       idx = (bar->sort ? perm[numValues - i - 1] : i);
20651fa3d41SBarry Smith       binLeft  = xmin + i;
20751fa3d41SBarry Smith       binRight = xmin + i + 1;
2089566063dSJacob Faibussowitsch       PetscCall(PetscDrawRectangle(draw,binLeft,ymin,binRight,values[idx],bcolor,bcolor,bcolor,bcolor));
2099566063dSJacob Faibussowitsch       PetscCall(PetscDrawLine(draw,binLeft,ymin,binLeft,values[idx],PETSC_DRAW_BLACK));
2109566063dSJacob Faibussowitsch       PetscCall(PetscDrawLine(draw,binRight,ymin,binRight,values[idx],PETSC_DRAW_BLACK));
2119566063dSJacob Faibussowitsch       PetscCall(PetscDrawLine(draw,binLeft,values[idx],binRight,values[idx],PETSC_DRAW_BLACK));
21251fa3d41SBarry Smith       if (labels) {
21351fa3d41SBarry Smith         PetscReal h;
2149566063dSJacob Faibussowitsch         PetscCall(PetscDrawStringGetSize(draw,NULL,&h));
2159566063dSJacob Faibussowitsch         PetscCall(PetscDrawStringCentered(draw,.5*(binLeft+binRight),ymin - 1.5*h,bcolor,labels[idx]));
21651fa3d41SBarry Smith       }
21751fa3d41SBarry Smith       if (color == PETSC_DRAW_ROTATE) bcolor++;
21871917b75SLisandro Dalcin       if (bcolor > PETSC_DRAW_BASIC_COLORS-1) bcolor = PETSC_DRAW_BLACK+1;
21951fa3d41SBarry Smith     }
22051fa3d41SBarry Smith   }
221*d0609cedSBarry Smith   PetscDrawCollectiveEnd(draw);
2229566063dSJacob Faibussowitsch   if (bar->sort) PetscCall(PetscFree(perm));
223e118a51fSLisandro Dalcin 
2249566063dSJacob Faibussowitsch   PetscCall(PetscDrawFlush(draw));
2259566063dSJacob Faibussowitsch   PetscCall(PetscDrawPause(draw));
22651fa3d41SBarry Smith   PetscFunctionReturn(0);
22751fa3d41SBarry Smith }
22851fa3d41SBarry Smith 
22957fd6651SLisandro Dalcin /*@
23057fd6651SLisandro Dalcin   PetscDrawBarSave - Saves a drawn image
23157fd6651SLisandro Dalcin 
23257fd6651SLisandro Dalcin   Collective on PetscDrawBar
23357fd6651SLisandro Dalcin 
23457fd6651SLisandro Dalcin   Input Parameters:
23557fd6651SLisandro Dalcin . bar - The bar graph context
23657fd6651SLisandro Dalcin 
23757fd6651SLisandro Dalcin   Level: intermediate
23857fd6651SLisandro Dalcin 
2390afdd333SBarry Smith .seealso:  PetscDrawBarCreate(), PetscDrawBarGetDraw(), PetscDrawSetSave(), PetscDrawSave(), PetscDrawBarSetData()
24057fd6651SLisandro Dalcin @*/
24157fd6651SLisandro Dalcin PetscErrorCode  PetscDrawBarSave(PetscDrawBar bar)
24257fd6651SLisandro Dalcin {
24357fd6651SLisandro Dalcin   PetscFunctionBegin;
24457fd6651SLisandro Dalcin   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
2459566063dSJacob Faibussowitsch   PetscCall(PetscDrawSave(bar->win));
24657fd6651SLisandro Dalcin   PetscFunctionReturn(0);
24757fd6651SLisandro Dalcin }
24857fd6651SLisandro Dalcin 
24951fa3d41SBarry Smith /*@
25051fa3d41SBarry Smith   PetscDrawBarSetColor - Sets the color the bars will be drawn with.
25151fa3d41SBarry Smith 
2525b399a63SLisandro Dalcin   Logically Collective on PetscDrawBar
25351fa3d41SBarry Smith 
25451fa3d41SBarry Smith   Input Parameters:
25551fa3d41SBarry Smith + bar - The bar graph context
25651fa3d41SBarry Smith - color - one of the colors defined in petscdraw.h or PETSC_DRAW_ROTATE to make each bar a
25751fa3d41SBarry Smith           different color
25851fa3d41SBarry Smith 
25951fa3d41SBarry Smith   Level: intermediate
26051fa3d41SBarry Smith 
2610afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarSetData(), PetscDrawBarDraw(), PetscDrawBarGetAxis()
2620afdd333SBarry Smith 
26351fa3d41SBarry Smith @*/
26451fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSetColor(PetscDrawBar bar, int color)
26551fa3d41SBarry Smith {
26651fa3d41SBarry Smith   PetscFunctionBegin;
26751fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID,1);
26851fa3d41SBarry Smith   bar->color = color;
26951fa3d41SBarry Smith   PetscFunctionReturn(0);
27051fa3d41SBarry Smith }
27151fa3d41SBarry Smith 
27251fa3d41SBarry Smith /*@
27351fa3d41SBarry Smith   PetscDrawBarSort - Sorts the values before drawing the bar chart
27451fa3d41SBarry Smith 
2755b399a63SLisandro Dalcin   Logically Collective on PetscDrawBar
27651fa3d41SBarry Smith 
27751fa3d41SBarry Smith   Input Parameters:
27851fa3d41SBarry Smith + bar - The bar graph context
27951fa3d41SBarry Smith . sort - PETSC_TRUE to sort the values
280a2b725a8SWilliam Gropp - tolerance - discard values less than tolerance
28151fa3d41SBarry Smith 
28251fa3d41SBarry Smith   Level: intermediate
28351fa3d41SBarry Smith 
2840afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarSetData(), PetscDrawBarSetColor(), PetscDrawBarDraw(), PetscDrawBarGetAxis()
28551fa3d41SBarry Smith @*/
28651fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSort(PetscDrawBar bar, PetscBool sort, PetscReal tolerance)
28751fa3d41SBarry Smith {
28851fa3d41SBarry Smith   PetscFunctionBegin;
28951fa3d41SBarry Smith   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
29051fa3d41SBarry Smith   bar->sort          = sort;
29151fa3d41SBarry Smith   bar->sorttolerance = tolerance;
29251fa3d41SBarry Smith   PetscFunctionReturn(0);
29351fa3d41SBarry Smith }
29451fa3d41SBarry Smith 
29551fa3d41SBarry Smith /*@
29651fa3d41SBarry Smith   PetscDrawBarSetLimits - Sets the axis limits for a bar graph. If more
29751fa3d41SBarry Smith   points are added after this call, the limits will be adjusted to
29851fa3d41SBarry Smith   include those additional points.
29951fa3d41SBarry Smith 
3005b399a63SLisandro Dalcin   Logically Collective on PetscDrawBar
30151fa3d41SBarry Smith 
30251fa3d41SBarry Smith   Input Parameters:
30351fa3d41SBarry Smith + bar - The bar graph context
30451fa3d41SBarry Smith - y_min,y_max - The limits
30551fa3d41SBarry Smith 
30651fa3d41SBarry Smith   Level: intermediate
30751fa3d41SBarry Smith 
3080afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarGetAxis(), PetscDrawBarSetData(), PetscDrawBarDraw()
30951fa3d41SBarry Smith @*/
31051fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSetLimits(PetscDrawBar bar, PetscReal y_min, PetscReal y_max)
31151fa3d41SBarry Smith {
31251fa3d41SBarry Smith   PetscFunctionBegin;
31351fa3d41SBarry Smith   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
31451fa3d41SBarry Smith   bar->ymin = y_min;
31551fa3d41SBarry Smith   bar->ymax = y_max;
31651fa3d41SBarry Smith   PetscFunctionReturn(0);
31751fa3d41SBarry Smith }
31851fa3d41SBarry Smith 
31951fa3d41SBarry Smith /*@C
32051fa3d41SBarry Smith   PetscDrawBarGetAxis - Gets the axis context associated with a bar graph.
32151fa3d41SBarry Smith   This is useful if one wants to change some axis property, such as
32251fa3d41SBarry Smith   labels, color, etc. The axis context should not be destroyed by the
32351fa3d41SBarry Smith   application code.
32451fa3d41SBarry Smith 
3255b399a63SLisandro Dalcin   Not Collective, PetscDrawAxis is parallel if PetscDrawBar is parallel
32651fa3d41SBarry Smith 
32751fa3d41SBarry Smith   Input Parameter:
32851fa3d41SBarry Smith . bar - The bar graph context
32951fa3d41SBarry Smith 
33051fa3d41SBarry Smith   Output Parameter:
33151fa3d41SBarry Smith . axis - The axis context
33251fa3d41SBarry Smith 
33351fa3d41SBarry Smith   Level: intermediate
33451fa3d41SBarry Smith 
3350afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawAxis, PetscDrawAxisCreate()
33651fa3d41SBarry Smith @*/
33751fa3d41SBarry Smith PetscErrorCode  PetscDrawBarGetAxis(PetscDrawBar bar,PetscDrawAxis *axis)
33851fa3d41SBarry Smith {
33951fa3d41SBarry Smith   PetscFunctionBegin;
340e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
34145f3bb6eSLisandro Dalcin   PetscValidPointer(axis,2);
34251fa3d41SBarry Smith   *axis = bar->axis;
34351fa3d41SBarry Smith   PetscFunctionReturn(0);
34451fa3d41SBarry Smith }
34551fa3d41SBarry Smith 
34651fa3d41SBarry Smith /*@C
34751fa3d41SBarry Smith   PetscDrawBarGetDraw - Gets the draw context associated with a bar graph.
34851fa3d41SBarry Smith 
34951fa3d41SBarry Smith   Not Collective, PetscDraw is parallel if PetscDrawBar is parallel
35051fa3d41SBarry Smith 
35151fa3d41SBarry Smith   Input Parameter:
35251fa3d41SBarry Smith . bar - The bar graph context
35351fa3d41SBarry Smith 
35451fa3d41SBarry Smith   Output Parameter:
355e118a51fSLisandro Dalcin . draw  - The draw context
35651fa3d41SBarry Smith 
35751fa3d41SBarry Smith   Level: intermediate
35851fa3d41SBarry Smith 
3590afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarDraw(), PetscDraw
36051fa3d41SBarry Smith @*/
361e118a51fSLisandro Dalcin PetscErrorCode  PetscDrawBarGetDraw(PetscDrawBar bar,PetscDraw *draw)
36251fa3d41SBarry Smith {
36351fa3d41SBarry Smith   PetscFunctionBegin;
36451fa3d41SBarry Smith   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
36545f3bb6eSLisandro Dalcin   PetscValidPointer(draw,2);
366e118a51fSLisandro Dalcin   *draw = bar->win;
36751fa3d41SBarry Smith   PetscFunctionReturn(0);
36851fa3d41SBarry Smith }
36951fa3d41SBarry Smith 
37051fa3d41SBarry Smith /*@
37151fa3d41SBarry Smith     PetscDrawBarSetFromOptions - Sets options related to the PetscDrawBar
37251fa3d41SBarry Smith 
37351fa3d41SBarry Smith     Collective over PetscDrawBar
37451fa3d41SBarry Smith 
37551fa3d41SBarry Smith     Options Database:
37651fa3d41SBarry Smith .  -bar_sort - sort the entries before drawing the bar graph
37751fa3d41SBarry Smith 
37851fa3d41SBarry Smith     Level: intermediate
37951fa3d41SBarry Smith 
3800afdd333SBarry Smith .seealso:  PetscDrawBarDestroy(), PetscDrawBarCreate(), PetscDrawBarSort()
38151fa3d41SBarry Smith @*/
38251fa3d41SBarry Smith PetscErrorCode  PetscDrawBarSetFromOptions(PetscDrawBar bar)
38351fa3d41SBarry Smith {
38451fa3d41SBarry Smith   PetscBool      set;
38551fa3d41SBarry Smith 
38651fa3d41SBarry Smith   PetscFunctionBegin;
387e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1);
388e118a51fSLisandro Dalcin 
3899566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasName(((PetscObject)bar)->options,((PetscObject)bar)->prefix,"-bar_sort",&set));
39051fa3d41SBarry Smith   if (set) {
391e118a51fSLisandro Dalcin     PetscReal tol = bar->sorttolerance;
3929566063dSJacob Faibussowitsch     PetscCall(PetscOptionsGetReal(((PetscObject)bar)->options,((PetscObject)bar)->prefix,"-bar_sort",&tol,NULL));
3939566063dSJacob Faibussowitsch     PetscCall(PetscDrawBarSort(bar,PETSC_TRUE,tol));
39451fa3d41SBarry Smith   }
39551fa3d41SBarry Smith   PetscFunctionReturn(0);
39651fa3d41SBarry Smith }
397