xref: /petsc/src/sys/classes/draw/utils/bars.c (revision 2fe279fdf3e687a416e4eadb7d3c7a82d60442c6)
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 
14811af0c4SBarry Smith    Collective over draw
1551fa3d41SBarry Smith 
16*2fe279fdSBarry Smith    Input Parameter:
1751fa3d41SBarry Smith .  draw  - The window where the graph will be made
1851fa3d41SBarry Smith 
19*2fe279fdSBarry Smith    Output Parameter:
2051fa3d41SBarry Smith .  bar - The bar graph context
2151fa3d41SBarry Smith 
2295452b02SPatrick Sanan    Notes:
23811af0c4SBarry Smith     Call `PetscDrawBarSetData()` to provide the bins to be plotted and then `PetscDrawBarDraw()` to display the new plot
240afdd333SBarry Smith 
25811af0c4SBarry 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 
27811af0c4SBarry 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
28811af0c4SBarry Smith    zeroth MPI rank in the communicator. All MPI ranks in the communicator must call `PetscDrawBarDraw()` to display the updated graph.
290afdd333SBarry Smith 
3051fa3d41SBarry Smith    Level: intermediate
3151fa3d41SBarry Smith 
32811af0c4SBarry Smith .seealso: `PetscDrawBar`, `PetscDrawLGCreate()`, `PetscDrawLG`, `PetscDrawSPCreate()`, `PetscDrawSP`, `PetscDrawHGCreate()`, `PetscDrawHG`, `PetscDrawBarDestroy()`, `PetscDrawBarSetData()`,
33db781477SPatrick Sanan           `PetscDrawBar`, `PetscDrawBarDraw()`, `PetscDrawBarSave()`, `PetscDrawBarSetColor()`, `PetscDrawBarSort()`, `PetscDrawBarSetLimits()`, `PetscDrawBarGetAxis()`, `PetscDrawAxis`,
34db781477SPatrick Sanan           `PetscDrawBarGetDraw()`, `PetscDrawBarSetFromOptions()`
3551fa3d41SBarry Smith @*/
36d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarCreate(PetscDraw draw, PetscDrawBar *bar)
37d71ae5a4SJacob Faibussowitsch {
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));
45e118a51fSLisandro Dalcin 
469566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)draw));
47e118a51fSLisandro Dalcin   h->win = draw;
4851fa3d41SBarry Smith 
4951fa3d41SBarry Smith   h->view    = NULL;
5051fa3d41SBarry Smith   h->destroy = NULL;
5151fa3d41SBarry Smith   h->color   = PETSC_DRAW_GREEN;
5251fa3d41SBarry Smith   h->ymin    = 0.; /* if user has not set these then they are determined from the data */
5351fa3d41SBarry Smith   h->ymax    = 0.;
5451fa3d41SBarry Smith   h->numBins = 0;
5551fa3d41SBarry Smith 
569566063dSJacob Faibussowitsch   PetscCall(PetscDrawAxisCreate(draw, &h->axis));
5745f3bb6eSLisandro Dalcin   h->axis->xticks = NULL;
58e118a51fSLisandro Dalcin 
5951fa3d41SBarry Smith   *bar = h;
603ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
6151fa3d41SBarry Smith }
6251fa3d41SBarry Smith 
6351fa3d41SBarry Smith /*@C
6451fa3d41SBarry Smith    PetscDrawBarSetData
6551fa3d41SBarry Smith 
66c3339decSBarry Smith    Logically Collective
6751fa3d41SBarry Smith 
68d8d19677SJose E. Roman    Input Parameters:
6951fa3d41SBarry Smith +  bar - The bar graph context.
7051fa3d41SBarry Smith .  bins  - number of items
7151fa3d41SBarry Smith .  values - values of each item
7251fa3d41SBarry Smith -  labels - optional label for each bar, NULL terminated array of strings
7351fa3d41SBarry Smith 
7451fa3d41SBarry Smith    Level: intermediate
7551fa3d41SBarry Smith 
7695452b02SPatrick Sanan    Notes:
77811af0c4SBarry Smith     Call `PetscDrawBarDraw()` after this call to display the new plot
780afdd333SBarry Smith 
79811af0c4SBarry Smith    The data is ignored on all ranks except zero
8051fa3d41SBarry Smith 
81811af0c4SBarry Smith .seealso: `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawBar`, `PetscDrawBarDraw()`
8251fa3d41SBarry Smith @*/
83d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarSetData(PetscDrawBar bar, PetscInt bins, const PetscReal data[], const char *const *labels)
84d71ae5a4SJacob Faibussowitsch {
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;
9548a46eb9SPierre Jolivet   if (labels) PetscCall(PetscStrArrayallocpy(labels, &bar->labels));
963ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
9751fa3d41SBarry Smith }
9851fa3d41SBarry Smith 
9951fa3d41SBarry Smith /*@C
10051fa3d41SBarry Smith   PetscDrawBarDestroy - Frees all space taken up by bar graph data structure.
10151fa3d41SBarry Smith 
102811af0c4SBarry Smith   Collective over bar
10351fa3d41SBarry Smith 
10451fa3d41SBarry Smith   Input Parameter:
10551fa3d41SBarry Smith . bar - The bar graph context
10651fa3d41SBarry Smith 
10751fa3d41SBarry Smith   Level: intermediate
10851fa3d41SBarry Smith 
109811af0c4SBarry Smith .seealso: `PetscDrawBar`, `PetscDrawBarCreate()`
11051fa3d41SBarry Smith @*/
111d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarDestroy(PetscDrawBar *bar)
112d71ae5a4SJacob Faibussowitsch {
11351fa3d41SBarry Smith   PetscFunctionBegin;
1143ba16761SJacob Faibussowitsch   if (!*bar) PetscFunctionReturn(PETSC_SUCCESS);
115e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(*bar, PETSC_DRAWBAR_CLASSID, 1);
1163ba16761SJacob Faibussowitsch   if (--((PetscObject)(*bar))->refct > 0) PetscFunctionReturn(PETSC_SUCCESS);
117e118a51fSLisandro Dalcin 
1189566063dSJacob Faibussowitsch   PetscCall(PetscFree((*bar)->values));
1199566063dSJacob Faibussowitsch   PetscCall(PetscStrArrayDestroy(&(*bar)->labels));
1209566063dSJacob Faibussowitsch   PetscCall(PetscDrawAxisDestroy(&(*bar)->axis));
1219566063dSJacob Faibussowitsch   PetscCall(PetscDrawDestroy(&(*bar)->win));
1229566063dSJacob Faibussowitsch   PetscCall(PetscHeaderDestroy(bar));
1233ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
12451fa3d41SBarry Smith }
12551fa3d41SBarry Smith 
12651fa3d41SBarry Smith /*@
12751fa3d41SBarry Smith   PetscDrawBarDraw - Redraws a bar graph.
12851fa3d41SBarry Smith 
129c3339decSBarry Smith   Collective
13051fa3d41SBarry Smith 
13151fa3d41SBarry Smith   Input Parameter:
13251fa3d41SBarry Smith . bar - The bar graph context
13351fa3d41SBarry Smith 
13451fa3d41SBarry Smith   Level: intermediate
13551fa3d41SBarry Smith 
136db781477SPatrick Sanan .seealso: `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawBarSetData()`
13751fa3d41SBarry Smith @*/
138d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarDraw(PetscDrawBar bar)
139d71ae5a4SJacob Faibussowitsch {
140e118a51fSLisandro Dalcin   PetscDraw   draw;
14151fa3d41SBarry Smith   PetscBool   isnull;
14251fa3d41SBarry Smith   PetscReal   xmin, xmax, ymin, ymax, *values, binLeft, binRight;
14351fa3d41SBarry Smith   PetscInt    numValues, i, bcolor, color, idx, *perm, nplot;
144e118a51fSLisandro Dalcin   PetscMPIInt rank;
14551fa3d41SBarry Smith   char      **labels;
14651fa3d41SBarry Smith 
14751fa3d41SBarry Smith   PetscFunctionBegin;
14851fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
1499566063dSJacob Faibussowitsch   PetscCall(PetscDrawIsNull(bar->win, &isnull));
1503ba16761SJacob Faibussowitsch   if (isnull) PetscFunctionReturn(PETSC_SUCCESS);
1519566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)bar), &rank));
15251fa3d41SBarry Smith 
1533ba16761SJacob Faibussowitsch   if (bar->numBins < 1) PetscFunctionReturn(PETSC_SUCCESS);
1545b399a63SLisandro Dalcin 
15551fa3d41SBarry Smith   color = bar->color;
15671917b75SLisandro Dalcin   if (color == PETSC_DRAW_ROTATE) bcolor = PETSC_DRAW_BLACK + 1;
15751fa3d41SBarry Smith   else bcolor = color;
15851fa3d41SBarry Smith 
15951fa3d41SBarry Smith   numValues = bar->numBins;
16051fa3d41SBarry Smith   values    = bar->values;
16151fa3d41SBarry Smith   if (bar->ymin == bar->ymax) {
16251fa3d41SBarry Smith     /* user has not set bounds on bars so set them based on the data */
16351fa3d41SBarry Smith     ymin = PETSC_MAX_REAL;
16451fa3d41SBarry Smith     ymax = PETSC_MIN_REAL;
16551fa3d41SBarry Smith     for (i = 0; i < numValues; i++) {
16651fa3d41SBarry Smith       ymin = PetscMin(ymin, values[i]);
16751fa3d41SBarry Smith       ymax = PetscMax(ymax, values[i]);
16851fa3d41SBarry Smith     }
16951fa3d41SBarry Smith   } else {
17051fa3d41SBarry Smith     ymin = bar->ymin;
17151fa3d41SBarry Smith     ymax = bar->ymax;
17251fa3d41SBarry Smith   }
17351fa3d41SBarry Smith   nplot  = numValues; /* number of points to actually plot; if some are lower than requested tolerance */
17451fa3d41SBarry Smith   xmin   = 0.0;
175e118a51fSLisandro Dalcin   xmax   = nplot;
17651fa3d41SBarry Smith   labels = bar->labels;
17751fa3d41SBarry Smith 
17851fa3d41SBarry Smith   if (bar->sort) {
1799566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(numValues, &perm));
18051fa3d41SBarry Smith     for (i = 0; i < numValues; i++) perm[i] = i;
1819566063dSJacob Faibussowitsch     PetscCall(PetscSortRealWithPermutation(numValues, values, perm));
18251fa3d41SBarry Smith     if (bar->sorttolerance) {
18351fa3d41SBarry Smith       for (i = 0; i < numValues; i++) {
18451fa3d41SBarry Smith         if (values[perm[numValues - i - 1]] < bar->sorttolerance) {
18551fa3d41SBarry Smith           nplot = i;
18651fa3d41SBarry Smith           break;
18751fa3d41SBarry Smith         }
18851fa3d41SBarry Smith       }
18951fa3d41SBarry Smith     }
19051fa3d41SBarry Smith   }
19151fa3d41SBarry Smith 
1925b399a63SLisandro Dalcin   draw = bar->win;
1939566063dSJacob Faibussowitsch   PetscCall(PetscDrawCheckResizedWindow(draw));
1949566063dSJacob Faibussowitsch   PetscCall(PetscDrawClear(draw));
195e118a51fSLisandro Dalcin 
1969566063dSJacob Faibussowitsch   PetscCall(PetscDrawAxisSetLimits(bar->axis, xmin, xmax, ymin, ymax));
1979566063dSJacob Faibussowitsch   PetscCall(PetscDrawAxisDraw(bar->axis));
19851fa3d41SBarry Smith 
199d0609cedSBarry Smith   PetscDrawCollectiveBegin(draw);
200dd400576SPatrick Sanan   if (rank == 0) { /* Draw bins */
20151fa3d41SBarry Smith     for (i = 0; i < nplot; i++) {
20251fa3d41SBarry Smith       idx      = (bar->sort ? perm[numValues - i - 1] : i);
20351fa3d41SBarry Smith       binLeft  = xmin + i;
20451fa3d41SBarry Smith       binRight = xmin + i + 1;
2059566063dSJacob Faibussowitsch       PetscCall(PetscDrawRectangle(draw, binLeft, ymin, binRight, values[idx], bcolor, bcolor, bcolor, bcolor));
2069566063dSJacob Faibussowitsch       PetscCall(PetscDrawLine(draw, binLeft, ymin, binLeft, values[idx], PETSC_DRAW_BLACK));
2079566063dSJacob Faibussowitsch       PetscCall(PetscDrawLine(draw, binRight, ymin, binRight, values[idx], PETSC_DRAW_BLACK));
2089566063dSJacob Faibussowitsch       PetscCall(PetscDrawLine(draw, binLeft, values[idx], binRight, values[idx], PETSC_DRAW_BLACK));
20951fa3d41SBarry Smith       if (labels) {
21051fa3d41SBarry Smith         PetscReal h;
2119566063dSJacob Faibussowitsch         PetscCall(PetscDrawStringGetSize(draw, NULL, &h));
2129566063dSJacob Faibussowitsch         PetscCall(PetscDrawStringCentered(draw, .5 * (binLeft + binRight), ymin - 1.5 * h, bcolor, labels[idx]));
21351fa3d41SBarry Smith       }
21451fa3d41SBarry Smith       if (color == PETSC_DRAW_ROTATE) bcolor++;
21571917b75SLisandro Dalcin       if (bcolor > PETSC_DRAW_BASIC_COLORS - 1) bcolor = PETSC_DRAW_BLACK + 1;
21651fa3d41SBarry Smith     }
21751fa3d41SBarry Smith   }
218d0609cedSBarry Smith   PetscDrawCollectiveEnd(draw);
2199566063dSJacob Faibussowitsch   if (bar->sort) PetscCall(PetscFree(perm));
220e118a51fSLisandro Dalcin 
2219566063dSJacob Faibussowitsch   PetscCall(PetscDrawFlush(draw));
2229566063dSJacob Faibussowitsch   PetscCall(PetscDrawPause(draw));
2233ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
22451fa3d41SBarry Smith }
22551fa3d41SBarry Smith 
22657fd6651SLisandro Dalcin /*@
227811af0c4SBarry Smith   PetscDrawBarSave - Saves a drawn bar graph
22857fd6651SLisandro Dalcin 
229c3339decSBarry Smith   Collective
23057fd6651SLisandro Dalcin 
231*2fe279fdSBarry Smith   Input Parameter:
23257fd6651SLisandro Dalcin . bar - The bar graph context
23357fd6651SLisandro Dalcin 
23457fd6651SLisandro Dalcin   Level: intermediate
23557fd6651SLisandro Dalcin 
236811af0c4SBarry Smith .seealso: `PetscDrawSave()`, `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawBarGetDraw()`, `PetscDrawSetSave()`, `PetscDrawSave()`, `PetscDrawBarSetData()`
23757fd6651SLisandro Dalcin @*/
238d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarSave(PetscDrawBar bar)
239d71ae5a4SJacob Faibussowitsch {
24057fd6651SLisandro Dalcin   PetscFunctionBegin;
24157fd6651SLisandro Dalcin   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
2429566063dSJacob Faibussowitsch   PetscCall(PetscDrawSave(bar->win));
2433ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
24457fd6651SLisandro Dalcin }
24557fd6651SLisandro Dalcin 
24651fa3d41SBarry Smith /*@
24751fa3d41SBarry Smith   PetscDrawBarSetColor - Sets the color the bars will be drawn with.
24851fa3d41SBarry Smith 
249c3339decSBarry Smith   Logically Collective
25051fa3d41SBarry Smith 
25151fa3d41SBarry Smith   Input Parameters:
25251fa3d41SBarry Smith + bar - The bar graph context
253811af0c4SBarry Smith - color - one of the colors defined in petscdraw.h or `PETSC_DRAW_ROTATE` to make each bar a
25451fa3d41SBarry Smith           different color
25551fa3d41SBarry Smith 
25651fa3d41SBarry Smith   Level: intermediate
25751fa3d41SBarry Smith 
258db781477SPatrick Sanan .seealso: `PetscDrawBarCreate()`, `PetscDrawBar`, `PetscDrawBarSetData()`, `PetscDrawBarDraw()`, `PetscDrawBarGetAxis()`
25951fa3d41SBarry Smith @*/
260d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarSetColor(PetscDrawBar bar, int color)
261d71ae5a4SJacob Faibussowitsch {
26251fa3d41SBarry Smith   PetscFunctionBegin;
26351fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
26451fa3d41SBarry Smith   bar->color = color;
2653ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
26651fa3d41SBarry Smith }
26751fa3d41SBarry Smith 
26851fa3d41SBarry Smith /*@
269811af0c4SBarry Smith   PetscDrawBarSort - Sorts the values before drawing the bar chart, the bars will be in ascending order from left to right
27051fa3d41SBarry Smith 
271c3339decSBarry Smith   Logically Collective
27251fa3d41SBarry Smith 
27351fa3d41SBarry Smith   Input Parameters:
27451fa3d41SBarry Smith + bar - The bar graph context
275811af0c4SBarry Smith . sort - `PETSC_TRUE` to sort the values
276a2b725a8SWilliam Gropp - tolerance - discard values less than tolerance
27751fa3d41SBarry Smith 
27851fa3d41SBarry Smith   Level: intermediate
27951fa3d41SBarry Smith 
280811af0c4SBarry Smith .seealso: `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawBar`, `PetscDrawBarSetData()`, `PetscDrawBarSetColor()`, `PetscDrawBarDraw()`, `PetscDrawBarGetAxis()`
28151fa3d41SBarry Smith @*/
282d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarSort(PetscDrawBar bar, PetscBool sort, PetscReal tolerance)
283d71ae5a4SJacob Faibussowitsch {
28451fa3d41SBarry Smith   PetscFunctionBegin;
28551fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
28651fa3d41SBarry Smith   bar->sort          = sort;
28751fa3d41SBarry Smith   bar->sorttolerance = tolerance;
2883ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
28951fa3d41SBarry Smith }
29051fa3d41SBarry Smith 
29151fa3d41SBarry Smith /*@
29251fa3d41SBarry Smith   PetscDrawBarSetLimits - Sets the axis limits for a bar graph. If more
29351fa3d41SBarry Smith   points are added after this call, the limits will be adjusted to
29451fa3d41SBarry Smith   include those additional points.
29551fa3d41SBarry Smith 
296c3339decSBarry Smith   Logically Collective
29751fa3d41SBarry Smith 
29851fa3d41SBarry Smith   Input Parameters:
29951fa3d41SBarry Smith + bar - The bar graph context
300*2fe279fdSBarry Smith . y_min - The lower limit
301*2fe279fdSBarry Smith - y_max - The upper limit
30251fa3d41SBarry Smith 
30351fa3d41SBarry Smith   Level: intermediate
30451fa3d41SBarry Smith 
305811af0c4SBarry Smith .seealso: `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawBar`, `PetscDrawBarGetAxis()`, `PetscDrawBarSetData()`, `PetscDrawBarDraw()`
30651fa3d41SBarry Smith @*/
307d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarSetLimits(PetscDrawBar bar, PetscReal y_min, PetscReal y_max)
308d71ae5a4SJacob Faibussowitsch {
30951fa3d41SBarry Smith   PetscFunctionBegin;
31051fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
31151fa3d41SBarry Smith   bar->ymin = y_min;
31251fa3d41SBarry Smith   bar->ymax = y_max;
3133ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
31451fa3d41SBarry Smith }
31551fa3d41SBarry Smith 
31651fa3d41SBarry Smith /*@C
31751fa3d41SBarry Smith   PetscDrawBarGetAxis - Gets the axis context associated with a bar graph.
31851fa3d41SBarry Smith   This is useful if one wants to change some axis property, such as
31951fa3d41SBarry Smith   labels, color, etc. The axis context should not be destroyed by the
32051fa3d41SBarry Smith   application code.
32151fa3d41SBarry Smith 
322811af0c4SBarry Smith   Not Collective, axis is parallel if bar is parallel
32351fa3d41SBarry Smith 
32451fa3d41SBarry Smith   Input Parameter:
32551fa3d41SBarry Smith . bar - The bar graph context
32651fa3d41SBarry Smith 
32751fa3d41SBarry Smith   Output Parameter:
32851fa3d41SBarry Smith . axis - The axis context
32951fa3d41SBarry Smith 
33051fa3d41SBarry Smith   Level: intermediate
33151fa3d41SBarry Smith 
332811af0c4SBarry Smith .seealso: `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawBar`, `PetscDrawAxis`, `PetscDrawAxisCreate()`
33351fa3d41SBarry Smith @*/
334d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarGetAxis(PetscDrawBar bar, PetscDrawAxis *axis)
335d71ae5a4SJacob Faibussowitsch {
33651fa3d41SBarry Smith   PetscFunctionBegin;
337e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
33845f3bb6eSLisandro Dalcin   PetscValidPointer(axis, 2);
33951fa3d41SBarry Smith   *axis = bar->axis;
3403ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
34151fa3d41SBarry Smith }
34251fa3d41SBarry Smith 
34351fa3d41SBarry Smith /*@C
34451fa3d41SBarry Smith   PetscDrawBarGetDraw - Gets the draw context associated with a bar graph.
34551fa3d41SBarry Smith 
346811af0c4SBarry Smith   Not Collective, draw is parallel if bar is parallel
34751fa3d41SBarry Smith 
34851fa3d41SBarry Smith   Input Parameter:
34951fa3d41SBarry Smith . bar - The bar graph context
35051fa3d41SBarry Smith 
35151fa3d41SBarry Smith   Output Parameter:
352e118a51fSLisandro Dalcin . draw  - The draw context
35351fa3d41SBarry Smith 
35451fa3d41SBarry Smith   Level: intermediate
35551fa3d41SBarry Smith 
356811af0c4SBarry Smith .seealso: `PetscDrawBar`, `PetscDraw`, `PetscDrawBarCreate()`, `PetscDrawBar`, `PetscDrawBarDraw()`, `PetscDraw`
35751fa3d41SBarry Smith @*/
358d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarGetDraw(PetscDrawBar bar, PetscDraw *draw)
359d71ae5a4SJacob Faibussowitsch {
36051fa3d41SBarry Smith   PetscFunctionBegin;
36151fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
36245f3bb6eSLisandro Dalcin   PetscValidPointer(draw, 2);
363e118a51fSLisandro Dalcin   *draw = bar->win;
3643ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
36551fa3d41SBarry Smith }
36651fa3d41SBarry Smith 
36751fa3d41SBarry Smith /*@
368811af0c4SBarry Smith     PetscDrawBarSetFromOptions - Sets options related to the display of the `PetscDrawBar`
36951fa3d41SBarry Smith 
370811af0c4SBarry Smith     Collective over bar
37151fa3d41SBarry Smith 
372811af0c4SBarry Smith     Options Database Key:
37351fa3d41SBarry Smith .  -bar_sort - sort the entries before drawing the bar graph
37451fa3d41SBarry Smith 
37551fa3d41SBarry Smith     Level: intermediate
37651fa3d41SBarry Smith 
377811af0c4SBarry Smith     Note:
378811af0c4SBarry Smith     Does not set options related to the underlying `PetscDraw` or `PetscDrawAxis`
379811af0c4SBarry Smith 
380811af0c4SBarry Smith .seealso: `PetscDrawBar`, `PetscDrawBarDestroy()`, `PetscDrawBarCreate()`, `PetscDrawBarSort()`
38151fa3d41SBarry Smith @*/
382d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarSetFromOptions(PetscDrawBar bar)
383d71ae5a4SJacob Faibussowitsch {
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   }
3953ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
39651fa3d41SBarry Smith }
397