xref: /petsc/src/sys/classes/draw/utils/bars.c (revision 48a46eb9bd028bec07ec0f396b1a3abb43f14558)
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 
32db781477SPatrick Sanan .seealso: `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 
665b399a63SLisandro Dalcin    Logically Collective on PetscDrawBar
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:
7795452b02SPatrick Sanan     Call PetscDrawBarDraw() after this call to display the new plot
780afdd333SBarry Smith 
79db781477SPatrick Sanan .seealso: `PetscDrawBarCreate()`, `PetscDrawBar`, `PetscDrawBarDraw()`
8051fa3d41SBarry Smith 
8151fa3d41SBarry Smith @*/
829371c9d4SSatish Balay PetscErrorCode PetscDrawBarSetData(PetscDrawBar bar, PetscInt bins, const PetscReal data[], const char *const *labels) {
8351fa3d41SBarry Smith   PetscFunctionBegin;
8451fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
85e118a51fSLisandro Dalcin 
8651fa3d41SBarry Smith   if (bar->numBins != bins) {
879566063dSJacob Faibussowitsch     PetscCall(PetscFree(bar->values));
889566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(bins, &bar->values));
8951fa3d41SBarry Smith     bar->numBins = bins;
9051fa3d41SBarry Smith   }
919566063dSJacob Faibussowitsch   PetscCall(PetscArraycpy(bar->values, data, bins));
9251fa3d41SBarry Smith   bar->numBins = bins;
93*48a46eb9SPierre Jolivet   if (labels) PetscCall(PetscStrArrayallocpy(labels, &bar->labels));
9451fa3d41SBarry Smith   PetscFunctionReturn(0);
9551fa3d41SBarry Smith }
9651fa3d41SBarry Smith 
9751fa3d41SBarry Smith /*@C
9851fa3d41SBarry Smith   PetscDrawBarDestroy - Frees all space taken up by bar graph data structure.
9951fa3d41SBarry Smith 
10051fa3d41SBarry Smith   Collective over PetscDrawBar
10151fa3d41SBarry Smith 
10251fa3d41SBarry Smith   Input Parameter:
10351fa3d41SBarry Smith . bar - The bar graph context
10451fa3d41SBarry Smith 
10551fa3d41SBarry Smith   Level: intermediate
10651fa3d41SBarry Smith 
107db781477SPatrick Sanan .seealso: `PetscDrawBarCreate()`
10851fa3d41SBarry Smith @*/
1099371c9d4SSatish Balay PetscErrorCode PetscDrawBarDestroy(PetscDrawBar *bar) {
11051fa3d41SBarry Smith   PetscFunctionBegin;
11151fa3d41SBarry Smith   if (!*bar) PetscFunctionReturn(0);
112e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(*bar, PETSC_DRAWBAR_CLASSID, 1);
11351fa3d41SBarry Smith   if (--((PetscObject)(*bar))->refct > 0) PetscFunctionReturn(0);
114e118a51fSLisandro Dalcin 
1159566063dSJacob Faibussowitsch   PetscCall(PetscFree((*bar)->values));
1169566063dSJacob Faibussowitsch   PetscCall(PetscStrArrayDestroy(&(*bar)->labels));
1179566063dSJacob Faibussowitsch   PetscCall(PetscDrawAxisDestroy(&(*bar)->axis));
1189566063dSJacob Faibussowitsch   PetscCall(PetscDrawDestroy(&(*bar)->win));
1199566063dSJacob Faibussowitsch   PetscCall(PetscHeaderDestroy(bar));
12051fa3d41SBarry Smith   PetscFunctionReturn(0);
12151fa3d41SBarry Smith }
12251fa3d41SBarry Smith 
12351fa3d41SBarry Smith /*@
12451fa3d41SBarry Smith   PetscDrawBarDraw - Redraws a bar graph.
12551fa3d41SBarry Smith 
1265b399a63SLisandro Dalcin   Collective on PetscDrawBar
12751fa3d41SBarry Smith 
12851fa3d41SBarry Smith   Input Parameter:
12951fa3d41SBarry Smith . bar - The bar graph context
13051fa3d41SBarry Smith 
13151fa3d41SBarry Smith   Level: intermediate
13251fa3d41SBarry Smith 
133db781477SPatrick Sanan .seealso: `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawBarSetData()`
1340afdd333SBarry Smith 
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 /*@
22457fd6651SLisandro Dalcin   PetscDrawBarSave - Saves a drawn image
22557fd6651SLisandro Dalcin 
22657fd6651SLisandro Dalcin   Collective on PetscDrawBar
22757fd6651SLisandro Dalcin 
22857fd6651SLisandro Dalcin   Input Parameters:
22957fd6651SLisandro Dalcin . bar - The bar graph context
23057fd6651SLisandro Dalcin 
23157fd6651SLisandro Dalcin   Level: intermediate
23257fd6651SLisandro Dalcin 
233db781477SPatrick Sanan .seealso: `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 
2455b399a63SLisandro Dalcin   Logically Collective on PetscDrawBar
24651fa3d41SBarry Smith 
24751fa3d41SBarry Smith   Input Parameters:
24851fa3d41SBarry Smith + bar - The bar graph context
24951fa3d41SBarry 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()`
2550afdd333SBarry Smith 
25651fa3d41SBarry Smith @*/
2579371c9d4SSatish Balay PetscErrorCode PetscDrawBarSetColor(PetscDrawBar bar, int color) {
25851fa3d41SBarry Smith   PetscFunctionBegin;
25951fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
26051fa3d41SBarry Smith   bar->color = color;
26151fa3d41SBarry Smith   PetscFunctionReturn(0);
26251fa3d41SBarry Smith }
26351fa3d41SBarry Smith 
26451fa3d41SBarry Smith /*@
26551fa3d41SBarry Smith   PetscDrawBarSort - Sorts the values before drawing the bar chart
26651fa3d41SBarry Smith 
2675b399a63SLisandro Dalcin   Logically Collective on PetscDrawBar
26851fa3d41SBarry Smith 
26951fa3d41SBarry Smith   Input Parameters:
27051fa3d41SBarry Smith + bar - The bar graph context
27151fa3d41SBarry Smith . sort - PETSC_TRUE to sort the values
272a2b725a8SWilliam Gropp - tolerance - discard values less than tolerance
27351fa3d41SBarry Smith 
27451fa3d41SBarry Smith   Level: intermediate
27551fa3d41SBarry Smith 
276db781477SPatrick Sanan .seealso: `PetscDrawBarCreate()`, `PetscDrawBar`, `PetscDrawBarSetData()`, `PetscDrawBarSetColor()`, `PetscDrawBarDraw()`, `PetscDrawBarGetAxis()`
27751fa3d41SBarry Smith @*/
2789371c9d4SSatish Balay PetscErrorCode PetscDrawBarSort(PetscDrawBar bar, PetscBool sort, PetscReal tolerance) {
27951fa3d41SBarry Smith   PetscFunctionBegin;
28051fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
28151fa3d41SBarry Smith   bar->sort          = sort;
28251fa3d41SBarry Smith   bar->sorttolerance = tolerance;
28351fa3d41SBarry Smith   PetscFunctionReturn(0);
28451fa3d41SBarry Smith }
28551fa3d41SBarry Smith 
28651fa3d41SBarry Smith /*@
28751fa3d41SBarry Smith   PetscDrawBarSetLimits - Sets the axis limits for a bar graph. If more
28851fa3d41SBarry Smith   points are added after this call, the limits will be adjusted to
28951fa3d41SBarry Smith   include those additional points.
29051fa3d41SBarry Smith 
2915b399a63SLisandro Dalcin   Logically Collective on PetscDrawBar
29251fa3d41SBarry Smith 
29351fa3d41SBarry Smith   Input Parameters:
29451fa3d41SBarry Smith + bar - The bar graph context
29551fa3d41SBarry Smith - y_min,y_max - The limits
29651fa3d41SBarry Smith 
29751fa3d41SBarry Smith   Level: intermediate
29851fa3d41SBarry Smith 
299db781477SPatrick Sanan .seealso: `PetscDrawBarCreate()`, `PetscDrawBar`, `PetscDrawBarGetAxis()`, `PetscDrawBarSetData()`, `PetscDrawBarDraw()`
30051fa3d41SBarry Smith @*/
3019371c9d4SSatish Balay PetscErrorCode PetscDrawBarSetLimits(PetscDrawBar bar, PetscReal y_min, PetscReal y_max) {
30251fa3d41SBarry Smith   PetscFunctionBegin;
30351fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
30451fa3d41SBarry Smith   bar->ymin = y_min;
30551fa3d41SBarry Smith   bar->ymax = y_max;
30651fa3d41SBarry Smith   PetscFunctionReturn(0);
30751fa3d41SBarry Smith }
30851fa3d41SBarry Smith 
30951fa3d41SBarry Smith /*@C
31051fa3d41SBarry Smith   PetscDrawBarGetAxis - Gets the axis context associated with a bar graph.
31151fa3d41SBarry Smith   This is useful if one wants to change some axis property, such as
31251fa3d41SBarry Smith   labels, color, etc. The axis context should not be destroyed by the
31351fa3d41SBarry Smith   application code.
31451fa3d41SBarry Smith 
3155b399a63SLisandro Dalcin   Not Collective, PetscDrawAxis is parallel if PetscDrawBar is parallel
31651fa3d41SBarry Smith 
31751fa3d41SBarry Smith   Input Parameter:
31851fa3d41SBarry Smith . bar - The bar graph context
31951fa3d41SBarry Smith 
32051fa3d41SBarry Smith   Output Parameter:
32151fa3d41SBarry Smith . axis - The axis context
32251fa3d41SBarry Smith 
32351fa3d41SBarry Smith   Level: intermediate
32451fa3d41SBarry Smith 
325db781477SPatrick Sanan .seealso: `PetscDrawBarCreate()`, `PetscDrawBar`, `PetscDrawAxis`, `PetscDrawAxisCreate()`
32651fa3d41SBarry Smith @*/
3279371c9d4SSatish Balay PetscErrorCode PetscDrawBarGetAxis(PetscDrawBar bar, PetscDrawAxis *axis) {
32851fa3d41SBarry Smith   PetscFunctionBegin;
329e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
33045f3bb6eSLisandro Dalcin   PetscValidPointer(axis, 2);
33151fa3d41SBarry Smith   *axis = bar->axis;
33251fa3d41SBarry Smith   PetscFunctionReturn(0);
33351fa3d41SBarry Smith }
33451fa3d41SBarry Smith 
33551fa3d41SBarry Smith /*@C
33651fa3d41SBarry Smith   PetscDrawBarGetDraw - Gets the draw context associated with a bar graph.
33751fa3d41SBarry Smith 
33851fa3d41SBarry Smith   Not Collective, PetscDraw is parallel if PetscDrawBar is parallel
33951fa3d41SBarry Smith 
34051fa3d41SBarry Smith   Input Parameter:
34151fa3d41SBarry Smith . bar - The bar graph context
34251fa3d41SBarry Smith 
34351fa3d41SBarry Smith   Output Parameter:
344e118a51fSLisandro Dalcin . draw  - The draw context
34551fa3d41SBarry Smith 
34651fa3d41SBarry Smith   Level: intermediate
34751fa3d41SBarry Smith 
348db781477SPatrick Sanan .seealso: `PetscDrawBarCreate()`, `PetscDrawBar`, `PetscDrawBarDraw()`, `PetscDraw`
34951fa3d41SBarry Smith @*/
3509371c9d4SSatish Balay PetscErrorCode PetscDrawBarGetDraw(PetscDrawBar bar, PetscDraw *draw) {
35151fa3d41SBarry Smith   PetscFunctionBegin;
35251fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
35345f3bb6eSLisandro Dalcin   PetscValidPointer(draw, 2);
354e118a51fSLisandro Dalcin   *draw = bar->win;
35551fa3d41SBarry Smith   PetscFunctionReturn(0);
35651fa3d41SBarry Smith }
35751fa3d41SBarry Smith 
35851fa3d41SBarry Smith /*@
35951fa3d41SBarry Smith     PetscDrawBarSetFromOptions - Sets options related to the PetscDrawBar
36051fa3d41SBarry Smith 
36151fa3d41SBarry Smith     Collective over PetscDrawBar
36251fa3d41SBarry Smith 
36351fa3d41SBarry Smith     Options Database:
36451fa3d41SBarry Smith .  -bar_sort - sort the entries before drawing the bar graph
36551fa3d41SBarry Smith 
36651fa3d41SBarry Smith     Level: intermediate
36751fa3d41SBarry Smith 
368db781477SPatrick Sanan .seealso: `PetscDrawBarDestroy()`, `PetscDrawBarCreate()`, `PetscDrawBarSort()`
36951fa3d41SBarry Smith @*/
3709371c9d4SSatish Balay PetscErrorCode PetscDrawBarSetFromOptions(PetscDrawBar bar) {
37151fa3d41SBarry Smith   PetscBool set;
37251fa3d41SBarry Smith 
37351fa3d41SBarry Smith   PetscFunctionBegin;
374e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
375e118a51fSLisandro Dalcin 
3769566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasName(((PetscObject)bar)->options, ((PetscObject)bar)->prefix, "-bar_sort", &set));
37751fa3d41SBarry Smith   if (set) {
378e118a51fSLisandro Dalcin     PetscReal tol = bar->sorttolerance;
3799566063dSJacob Faibussowitsch     PetscCall(PetscOptionsGetReal(((PetscObject)bar)->options, ((PetscObject)bar)->prefix, "-bar_sort", &tol, NULL));
3809566063dSJacob Faibussowitsch     PetscCall(PetscDrawBarSort(bar, PETSC_TRUE, tol));
38151fa3d41SBarry Smith   }
38251fa3d41SBarry Smith   PetscFunctionReturn(0);
38351fa3d41SBarry Smith }
384