xref: /petsc/src/sys/classes/draw/utils/bars.c (revision 811af0c4b09a35de4306c442f88bd09fdc09897d)
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 
14*811af0c4SBarry Smith    Collective over draw
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:
23*811af0c4SBarry Smith     Call `PetscDrawBarSetData()` to provide the bins to be plotted and then `PetscDrawBarDraw()` to display the new plot
240afdd333SBarry Smith 
25*811af0c4SBarry 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 
27*811af0c4SBarry 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
28*811af0c4SBarry 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 
32*811af0c4SBarry 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 @*/
369371c9d4SSatish Balay PetscErrorCode PetscDrawBarCreate(PetscDraw draw, PetscDrawBar *bar) {
3751fa3d41SBarry Smith   PetscDrawBar h;
3851fa3d41SBarry Smith 
3951fa3d41SBarry Smith   PetscFunctionBegin;
4051fa3d41SBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
4173107ff1SLisandro Dalcin   PetscValidPointer(bar, 2);
42e118a51fSLisandro Dalcin 
439566063dSJacob Faibussowitsch   PetscCall(PetscHeaderCreate(h, PETSC_DRAWBAR_CLASSID, "DrawBar", "Bar Graph", "Draw", PetscObjectComm((PetscObject)draw), PetscDrawBarDestroy, NULL));
449566063dSJacob Faibussowitsch   PetscCall(PetscLogObjectParent((PetscObject)draw, (PetscObject)h));
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;
6051fa3d41SBarry Smith   PetscFunctionReturn(0);
6151fa3d41SBarry Smith }
6251fa3d41SBarry Smith 
6351fa3d41SBarry Smith /*@C
6451fa3d41SBarry Smith    PetscDrawBarSetData
6551fa3d41SBarry Smith 
66*811af0c4SBarry Smith    Logically Collective on bar
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:
77*811af0c4SBarry Smith     Call `PetscDrawBarDraw()` after this call to display the new plot
780afdd333SBarry Smith 
79*811af0c4SBarry Smith    The data is ignored on all ranks except zero
8051fa3d41SBarry Smith 
81*811af0c4SBarry Smith .seealso: `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawBar`, `PetscDrawBarDraw()`
8251fa3d41SBarry Smith @*/
839371c9d4SSatish Balay PetscErrorCode PetscDrawBarSetData(PetscDrawBar bar, PetscInt bins, const PetscReal data[], const char *const *labels) {
8451fa3d41SBarry Smith   PetscFunctionBegin;
8551fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
86e118a51fSLisandro Dalcin 
8751fa3d41SBarry Smith   if (bar->numBins != bins) {
889566063dSJacob Faibussowitsch     PetscCall(PetscFree(bar->values));
899566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(bins, &bar->values));
9051fa3d41SBarry Smith     bar->numBins = bins;
9151fa3d41SBarry Smith   }
929566063dSJacob Faibussowitsch   PetscCall(PetscArraycpy(bar->values, data, bins));
9351fa3d41SBarry Smith   bar->numBins = bins;
9448a46eb9SPierre Jolivet   if (labels) PetscCall(PetscStrArrayallocpy(labels, &bar->labels));
9551fa3d41SBarry Smith   PetscFunctionReturn(0);
9651fa3d41SBarry Smith }
9751fa3d41SBarry Smith 
9851fa3d41SBarry Smith /*@C
9951fa3d41SBarry Smith   PetscDrawBarDestroy - Frees all space taken up by bar graph data structure.
10051fa3d41SBarry Smith 
101*811af0c4SBarry Smith   Collective over bar
10251fa3d41SBarry Smith 
10351fa3d41SBarry Smith   Input Parameter:
10451fa3d41SBarry Smith . bar - The bar graph context
10551fa3d41SBarry Smith 
10651fa3d41SBarry Smith   Level: intermediate
10751fa3d41SBarry Smith 
108*811af0c4SBarry Smith .seealso: `PetscDrawBar`, `PetscDrawBarCreate()`
10951fa3d41SBarry Smith @*/
1109371c9d4SSatish Balay PetscErrorCode PetscDrawBarDestroy(PetscDrawBar *bar) {
11151fa3d41SBarry Smith   PetscFunctionBegin;
11251fa3d41SBarry Smith   if (!*bar) PetscFunctionReturn(0);
113e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(*bar, PETSC_DRAWBAR_CLASSID, 1);
11451fa3d41SBarry Smith   if (--((PetscObject)(*bar))->refct > 0) PetscFunctionReturn(0);
115e118a51fSLisandro Dalcin 
1169566063dSJacob Faibussowitsch   PetscCall(PetscFree((*bar)->values));
1179566063dSJacob Faibussowitsch   PetscCall(PetscStrArrayDestroy(&(*bar)->labels));
1189566063dSJacob Faibussowitsch   PetscCall(PetscDrawAxisDestroy(&(*bar)->axis));
1199566063dSJacob Faibussowitsch   PetscCall(PetscDrawDestroy(&(*bar)->win));
1209566063dSJacob Faibussowitsch   PetscCall(PetscHeaderDestroy(bar));
12151fa3d41SBarry Smith   PetscFunctionReturn(0);
12251fa3d41SBarry Smith }
12351fa3d41SBarry Smith 
12451fa3d41SBarry Smith /*@
12551fa3d41SBarry Smith   PetscDrawBarDraw - Redraws a bar graph.
12651fa3d41SBarry Smith 
127*811af0c4SBarry Smith   Collective on bar
12851fa3d41SBarry Smith 
12951fa3d41SBarry Smith   Input Parameter:
13051fa3d41SBarry Smith . bar - The bar graph context
13151fa3d41SBarry Smith 
13251fa3d41SBarry Smith   Level: intermediate
13351fa3d41SBarry Smith 
134db781477SPatrick Sanan .seealso: `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawBarSetData()`
13551fa3d41SBarry Smith @*/
1369371c9d4SSatish Balay PetscErrorCode PetscDrawBarDraw(PetscDrawBar bar) {
137e118a51fSLisandro Dalcin   PetscDraw   draw;
13851fa3d41SBarry Smith   PetscBool   isnull;
13951fa3d41SBarry Smith   PetscReal   xmin, xmax, ymin, ymax, *values, binLeft, binRight;
14051fa3d41SBarry Smith   PetscInt    numValues, i, bcolor, color, idx, *perm, nplot;
141e118a51fSLisandro Dalcin   PetscMPIInt rank;
14251fa3d41SBarry Smith   char      **labels;
14351fa3d41SBarry Smith 
14451fa3d41SBarry Smith   PetscFunctionBegin;
14551fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
1469566063dSJacob Faibussowitsch   PetscCall(PetscDrawIsNull(bar->win, &isnull));
1478f69470aSLisandro Dalcin   if (isnull) PetscFunctionReturn(0);
1489566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)bar), &rank));
14951fa3d41SBarry Smith 
1505b399a63SLisandro Dalcin   if (bar->numBins < 1) PetscFunctionReturn(0);
1515b399a63SLisandro Dalcin 
15251fa3d41SBarry Smith   color = bar->color;
15371917b75SLisandro Dalcin   if (color == PETSC_DRAW_ROTATE) bcolor = PETSC_DRAW_BLACK + 1;
15451fa3d41SBarry Smith   else bcolor = color;
15551fa3d41SBarry Smith 
15651fa3d41SBarry Smith   numValues = bar->numBins;
15751fa3d41SBarry Smith   values    = bar->values;
15851fa3d41SBarry Smith   if (bar->ymin == bar->ymax) {
15951fa3d41SBarry Smith     /* user has not set bounds on bars so set them based on the data */
16051fa3d41SBarry Smith     ymin = PETSC_MAX_REAL;
16151fa3d41SBarry Smith     ymax = PETSC_MIN_REAL;
16251fa3d41SBarry Smith     for (i = 0; i < numValues; i++) {
16351fa3d41SBarry Smith       ymin = PetscMin(ymin, values[i]);
16451fa3d41SBarry Smith       ymax = PetscMax(ymax, values[i]);
16551fa3d41SBarry Smith     }
16651fa3d41SBarry Smith   } else {
16751fa3d41SBarry Smith     ymin = bar->ymin;
16851fa3d41SBarry Smith     ymax = bar->ymax;
16951fa3d41SBarry Smith   }
17051fa3d41SBarry Smith   nplot  = numValues; /* number of points to actually plot; if some are lower than requested tolerance */
17151fa3d41SBarry Smith   xmin   = 0.0;
172e118a51fSLisandro Dalcin   xmax   = nplot;
17351fa3d41SBarry Smith   labels = bar->labels;
17451fa3d41SBarry Smith 
17551fa3d41SBarry Smith   if (bar->sort) {
1769566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(numValues, &perm));
17751fa3d41SBarry Smith     for (i = 0; i < numValues; i++) perm[i] = i;
1789566063dSJacob Faibussowitsch     PetscCall(PetscSortRealWithPermutation(numValues, values, perm));
17951fa3d41SBarry Smith     if (bar->sorttolerance) {
18051fa3d41SBarry Smith       for (i = 0; i < numValues; i++) {
18151fa3d41SBarry Smith         if (values[perm[numValues - i - 1]] < bar->sorttolerance) {
18251fa3d41SBarry Smith           nplot = i;
18351fa3d41SBarry Smith           break;
18451fa3d41SBarry Smith         }
18551fa3d41SBarry Smith       }
18651fa3d41SBarry Smith     }
18751fa3d41SBarry Smith   }
18851fa3d41SBarry Smith 
1895b399a63SLisandro Dalcin   draw = bar->win;
1909566063dSJacob Faibussowitsch   PetscCall(PetscDrawCheckResizedWindow(draw));
1919566063dSJacob Faibussowitsch   PetscCall(PetscDrawClear(draw));
192e118a51fSLisandro Dalcin 
1939566063dSJacob Faibussowitsch   PetscCall(PetscDrawAxisSetLimits(bar->axis, xmin, xmax, ymin, ymax));
1949566063dSJacob Faibussowitsch   PetscCall(PetscDrawAxisDraw(bar->axis));
19551fa3d41SBarry Smith 
196d0609cedSBarry Smith   PetscDrawCollectiveBegin(draw);
197dd400576SPatrick Sanan   if (rank == 0) { /* Draw bins */
19851fa3d41SBarry Smith     for (i = 0; i < nplot; i++) {
19951fa3d41SBarry Smith       idx      = (bar->sort ? perm[numValues - i - 1] : i);
20051fa3d41SBarry Smith       binLeft  = xmin + i;
20151fa3d41SBarry Smith       binRight = xmin + i + 1;
2029566063dSJacob Faibussowitsch       PetscCall(PetscDrawRectangle(draw, binLeft, ymin, binRight, values[idx], bcolor, bcolor, bcolor, bcolor));
2039566063dSJacob Faibussowitsch       PetscCall(PetscDrawLine(draw, binLeft, ymin, binLeft, values[idx], PETSC_DRAW_BLACK));
2049566063dSJacob Faibussowitsch       PetscCall(PetscDrawLine(draw, binRight, ymin, binRight, values[idx], PETSC_DRAW_BLACK));
2059566063dSJacob Faibussowitsch       PetscCall(PetscDrawLine(draw, binLeft, values[idx], binRight, values[idx], PETSC_DRAW_BLACK));
20651fa3d41SBarry Smith       if (labels) {
20751fa3d41SBarry Smith         PetscReal h;
2089566063dSJacob Faibussowitsch         PetscCall(PetscDrawStringGetSize(draw, NULL, &h));
2099566063dSJacob Faibussowitsch         PetscCall(PetscDrawStringCentered(draw, .5 * (binLeft + binRight), ymin - 1.5 * h, bcolor, labels[idx]));
21051fa3d41SBarry Smith       }
21151fa3d41SBarry Smith       if (color == PETSC_DRAW_ROTATE) bcolor++;
21271917b75SLisandro Dalcin       if (bcolor > PETSC_DRAW_BASIC_COLORS - 1) bcolor = PETSC_DRAW_BLACK + 1;
21351fa3d41SBarry Smith     }
21451fa3d41SBarry Smith   }
215d0609cedSBarry Smith   PetscDrawCollectiveEnd(draw);
2169566063dSJacob Faibussowitsch   if (bar->sort) PetscCall(PetscFree(perm));
217e118a51fSLisandro Dalcin 
2189566063dSJacob Faibussowitsch   PetscCall(PetscDrawFlush(draw));
2199566063dSJacob Faibussowitsch   PetscCall(PetscDrawPause(draw));
22051fa3d41SBarry Smith   PetscFunctionReturn(0);
22151fa3d41SBarry Smith }
22251fa3d41SBarry Smith 
22357fd6651SLisandro Dalcin /*@
224*811af0c4SBarry Smith   PetscDrawBarSave - Saves a drawn bar graph
22557fd6651SLisandro Dalcin 
226*811af0c4SBarry Smith   Collective on bar
22757fd6651SLisandro Dalcin 
22857fd6651SLisandro Dalcin   Input Parameters:
22957fd6651SLisandro Dalcin . bar - The bar graph context
23057fd6651SLisandro Dalcin 
23157fd6651SLisandro Dalcin   Level: intermediate
23257fd6651SLisandro Dalcin 
233*811af0c4SBarry Smith .seealso: `PetscDrawSave()`, `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawBarGetDraw()`, `PetscDrawSetSave()`, `PetscDrawSave()`, `PetscDrawBarSetData()`
23457fd6651SLisandro Dalcin @*/
2359371c9d4SSatish Balay PetscErrorCode PetscDrawBarSave(PetscDrawBar bar) {
23657fd6651SLisandro Dalcin   PetscFunctionBegin;
23757fd6651SLisandro Dalcin   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
2389566063dSJacob Faibussowitsch   PetscCall(PetscDrawSave(bar->win));
23957fd6651SLisandro Dalcin   PetscFunctionReturn(0);
24057fd6651SLisandro Dalcin }
24157fd6651SLisandro Dalcin 
24251fa3d41SBarry Smith /*@
24351fa3d41SBarry Smith   PetscDrawBarSetColor - Sets the color the bars will be drawn with.
24451fa3d41SBarry Smith 
245*811af0c4SBarry Smith   Logically Collective on bar
24651fa3d41SBarry Smith 
24751fa3d41SBarry Smith   Input Parameters:
24851fa3d41SBarry Smith + bar - The bar graph context
249*811af0c4SBarry Smith - color - one of the colors defined in petscdraw.h or `PETSC_DRAW_ROTATE` to make each bar a
25051fa3d41SBarry Smith           different color
25151fa3d41SBarry Smith 
25251fa3d41SBarry Smith   Level: intermediate
25351fa3d41SBarry Smith 
254db781477SPatrick Sanan .seealso: `PetscDrawBarCreate()`, `PetscDrawBar`, `PetscDrawBarSetData()`, `PetscDrawBarDraw()`, `PetscDrawBarGetAxis()`
25551fa3d41SBarry Smith @*/
2569371c9d4SSatish Balay PetscErrorCode PetscDrawBarSetColor(PetscDrawBar bar, int color) {
25751fa3d41SBarry Smith   PetscFunctionBegin;
25851fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
25951fa3d41SBarry Smith   bar->color = color;
26051fa3d41SBarry Smith   PetscFunctionReturn(0);
26151fa3d41SBarry Smith }
26251fa3d41SBarry Smith 
26351fa3d41SBarry Smith /*@
264*811af0c4SBarry Smith   PetscDrawBarSort - Sorts the values before drawing the bar chart, the bars will be in ascending order from left to right
26551fa3d41SBarry Smith 
266*811af0c4SBarry Smith   Logically Collective on bar
26751fa3d41SBarry Smith 
26851fa3d41SBarry Smith   Input Parameters:
26951fa3d41SBarry Smith + bar - The bar graph context
270*811af0c4SBarry Smith . sort - `PETSC_TRUE` to sort the values
271a2b725a8SWilliam Gropp - tolerance - discard values less than tolerance
27251fa3d41SBarry Smith 
27351fa3d41SBarry Smith   Level: intermediate
27451fa3d41SBarry Smith 
275*811af0c4SBarry Smith .seealso: `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawBar`, `PetscDrawBarSetData()`, `PetscDrawBarSetColor()`, `PetscDrawBarDraw()`, `PetscDrawBarGetAxis()`
27651fa3d41SBarry Smith @*/
2779371c9d4SSatish Balay PetscErrorCode PetscDrawBarSort(PetscDrawBar bar, PetscBool sort, PetscReal tolerance) {
27851fa3d41SBarry Smith   PetscFunctionBegin;
27951fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
28051fa3d41SBarry Smith   bar->sort          = sort;
28151fa3d41SBarry Smith   bar->sorttolerance = tolerance;
28251fa3d41SBarry Smith   PetscFunctionReturn(0);
28351fa3d41SBarry Smith }
28451fa3d41SBarry Smith 
28551fa3d41SBarry Smith /*@
28651fa3d41SBarry Smith   PetscDrawBarSetLimits - Sets the axis limits for a bar graph. If more
28751fa3d41SBarry Smith   points are added after this call, the limits will be adjusted to
28851fa3d41SBarry Smith   include those additional points.
28951fa3d41SBarry Smith 
290*811af0c4SBarry Smith   Logically Collective on bar
29151fa3d41SBarry Smith 
29251fa3d41SBarry Smith   Input Parameters:
29351fa3d41SBarry Smith + bar - The bar graph context
29451fa3d41SBarry Smith - y_min,y_max - The limits
29551fa3d41SBarry Smith 
29651fa3d41SBarry Smith   Level: intermediate
29751fa3d41SBarry Smith 
298*811af0c4SBarry Smith .seealso: `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawBar`, `PetscDrawBarGetAxis()`, `PetscDrawBarSetData()`, `PetscDrawBarDraw()`
29951fa3d41SBarry Smith @*/
3009371c9d4SSatish Balay PetscErrorCode PetscDrawBarSetLimits(PetscDrawBar bar, PetscReal y_min, PetscReal y_max) {
30151fa3d41SBarry Smith   PetscFunctionBegin;
30251fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
30351fa3d41SBarry Smith   bar->ymin = y_min;
30451fa3d41SBarry Smith   bar->ymax = y_max;
30551fa3d41SBarry Smith   PetscFunctionReturn(0);
30651fa3d41SBarry Smith }
30751fa3d41SBarry Smith 
30851fa3d41SBarry Smith /*@C
30951fa3d41SBarry Smith   PetscDrawBarGetAxis - Gets the axis context associated with a bar graph.
31051fa3d41SBarry Smith   This is useful if one wants to change some axis property, such as
31151fa3d41SBarry Smith   labels, color, etc. The axis context should not be destroyed by the
31251fa3d41SBarry Smith   application code.
31351fa3d41SBarry Smith 
314*811af0c4SBarry Smith   Not Collective, axis is parallel if bar is parallel
31551fa3d41SBarry Smith 
31651fa3d41SBarry Smith   Input Parameter:
31751fa3d41SBarry Smith . bar - The bar graph context
31851fa3d41SBarry Smith 
31951fa3d41SBarry Smith   Output Parameter:
32051fa3d41SBarry Smith . axis - The axis context
32151fa3d41SBarry Smith 
32251fa3d41SBarry Smith   Level: intermediate
32351fa3d41SBarry Smith 
324*811af0c4SBarry Smith .seealso: `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawBar`, `PetscDrawAxis`, `PetscDrawAxisCreate()`
32551fa3d41SBarry Smith @*/
3269371c9d4SSatish Balay PetscErrorCode PetscDrawBarGetAxis(PetscDrawBar bar, PetscDrawAxis *axis) {
32751fa3d41SBarry Smith   PetscFunctionBegin;
328e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
32945f3bb6eSLisandro Dalcin   PetscValidPointer(axis, 2);
33051fa3d41SBarry Smith   *axis = bar->axis;
33151fa3d41SBarry Smith   PetscFunctionReturn(0);
33251fa3d41SBarry Smith }
33351fa3d41SBarry Smith 
33451fa3d41SBarry Smith /*@C
33551fa3d41SBarry Smith   PetscDrawBarGetDraw - Gets the draw context associated with a bar graph.
33651fa3d41SBarry Smith 
337*811af0c4SBarry Smith   Not Collective, draw is parallel if bar is parallel
33851fa3d41SBarry Smith 
33951fa3d41SBarry Smith   Input Parameter:
34051fa3d41SBarry Smith . bar - The bar graph context
34151fa3d41SBarry Smith 
34251fa3d41SBarry Smith   Output Parameter:
343e118a51fSLisandro Dalcin . draw  - The draw context
34451fa3d41SBarry Smith 
34551fa3d41SBarry Smith   Level: intermediate
34651fa3d41SBarry Smith 
347*811af0c4SBarry Smith .seealso: `PetscDrawBar`, `PetscDraw`, `PetscDrawBarCreate()`, `PetscDrawBar`, `PetscDrawBarDraw()`, `PetscDraw`
34851fa3d41SBarry Smith @*/
3499371c9d4SSatish Balay PetscErrorCode PetscDrawBarGetDraw(PetscDrawBar bar, PetscDraw *draw) {
35051fa3d41SBarry Smith   PetscFunctionBegin;
35151fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
35245f3bb6eSLisandro Dalcin   PetscValidPointer(draw, 2);
353e118a51fSLisandro Dalcin   *draw = bar->win;
35451fa3d41SBarry Smith   PetscFunctionReturn(0);
35551fa3d41SBarry Smith }
35651fa3d41SBarry Smith 
35751fa3d41SBarry Smith /*@
358*811af0c4SBarry Smith     PetscDrawBarSetFromOptions - Sets options related to the display of the `PetscDrawBar`
35951fa3d41SBarry Smith 
360*811af0c4SBarry Smith     Collective over bar
36151fa3d41SBarry Smith 
362*811af0c4SBarry Smith     Options Database Key:
36351fa3d41SBarry Smith .  -bar_sort - sort the entries before drawing the bar graph
36451fa3d41SBarry Smith 
36551fa3d41SBarry Smith     Level: intermediate
36651fa3d41SBarry Smith 
367*811af0c4SBarry Smith     Note:
368*811af0c4SBarry Smith     Does not set options related to the underlying `PetscDraw` or `PetscDrawAxis`
369*811af0c4SBarry Smith 
370*811af0c4SBarry Smith .seealso: `PetscDrawBar`, `PetscDrawBarDestroy()`, `PetscDrawBarCreate()`, `PetscDrawBarSort()`
37151fa3d41SBarry Smith @*/
3729371c9d4SSatish Balay PetscErrorCode PetscDrawBarSetFromOptions(PetscDrawBar bar) {
37351fa3d41SBarry Smith   PetscBool set;
37451fa3d41SBarry Smith 
37551fa3d41SBarry Smith   PetscFunctionBegin;
376e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
377e118a51fSLisandro Dalcin 
3789566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasName(((PetscObject)bar)->options, ((PetscObject)bar)->prefix, "-bar_sort", &set));
37951fa3d41SBarry Smith   if (set) {
380e118a51fSLisandro Dalcin     PetscReal tol = bar->sorttolerance;
3819566063dSJacob Faibussowitsch     PetscCall(PetscOptionsGetReal(((PetscObject)bar)->options, ((PetscObject)bar)->prefix, "-bar_sort", &tol, NULL));
3829566063dSJacob Faibussowitsch     PetscCall(PetscDrawBarSort(bar, PETSC_TRUE, tol));
38351fa3d41SBarry Smith   }
38451fa3d41SBarry Smith   PetscFunctionReturn(0);
38551fa3d41SBarry Smith }
386