xref: /petsc/src/sys/classes/draw/utils/bars.c (revision 5d83a8b16d06840f96948f1a43aa9c83c769a60a)
151fa3d41SBarry Smith /*
251fa3d41SBarry Smith   Contains the data structure for plotting a bargraph in a window with an axis.
351fa3d41SBarry Smith */
4999739cfSJacob Faibussowitsch 
5999739cfSJacob Faibussowitsch #include <petsc/private/drawimpl.h> /*I "petscdraw.h" I*/
651fa3d41SBarry Smith #include <petscviewer.h>            /*I "petscviewer.h" I*/
751fa3d41SBarry Smith 
851fa3d41SBarry Smith PetscClassId PETSC_DRAWBAR_CLASSID = 0;
951fa3d41SBarry Smith 
10cc4c1da9SBarry Smith /*@
1151fa3d41SBarry Smith   PetscDrawBarCreate - Creates a bar graph data structure.
1251fa3d41SBarry Smith 
138f14a041SBarry Smith   Collective
1451fa3d41SBarry Smith 
152fe279fdSBarry Smith   Input Parameter:
1651fa3d41SBarry Smith . draw - The window where the graph will be made
1751fa3d41SBarry Smith 
182fe279fdSBarry Smith   Output Parameter:
1951fa3d41SBarry Smith . bar - The bar graph context
2051fa3d41SBarry Smith 
2195452b02SPatrick Sanan   Notes:
22811af0c4SBarry Smith   Call `PetscDrawBarSetData()` to provide the bins to be plotted and then `PetscDrawBarDraw()` to display the new plot
230afdd333SBarry Smith 
241d27aa22SBarry Smith   The difference between a bar chart, `PetscDrawBar`, and a histogram, `PetscDrawHG`, is explained here <https://stattrek.com/statistics/charts/histogram.aspx?Tutorial=AP>
257e25d57eSBarry Smith 
26811af0c4SBarry 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
271d27aa22SBarry Smith   zeroth MPI process in the communicator. All MPI processes in the communicator must call `PetscDrawBarDraw()` to display the updated graph.
280afdd333SBarry Smith 
2951fa3d41SBarry Smith   Level: intermediate
3051fa3d41SBarry Smith 
31811af0c4SBarry Smith .seealso: `PetscDrawBar`, `PetscDrawLGCreate()`, `PetscDrawLG`, `PetscDrawSPCreate()`, `PetscDrawSP`, `PetscDrawHGCreate()`, `PetscDrawHG`, `PetscDrawBarDestroy()`, `PetscDrawBarSetData()`,
32aec76313SJacob Faibussowitsch           `PetscDrawBarDraw()`, `PetscDrawBarSave()`, `PetscDrawBarSetColor()`, `PetscDrawBarSort()`, `PetscDrawBarSetLimits()`, `PetscDrawBarGetAxis()`, `PetscDrawAxis`,
33db781477SPatrick Sanan           `PetscDrawBarGetDraw()`, `PetscDrawBarSetFromOptions()`
3451fa3d41SBarry Smith @*/
35d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarCreate(PetscDraw draw, PetscDrawBar *bar)
36d71ae5a4SJacob Faibussowitsch {
3751fa3d41SBarry Smith   PetscDrawBar h;
3851fa3d41SBarry Smith 
3951fa3d41SBarry Smith   PetscFunctionBegin;
4051fa3d41SBarry Smith   PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1);
414f572ea9SToby Isaac   PetscAssertPointer(bar, 2);
42e118a51fSLisandro Dalcin 
439566063dSJacob Faibussowitsch   PetscCall(PetscHeaderCreate(h, PETSC_DRAWBAR_CLASSID, "DrawBar", "Bar Graph", "Draw", PetscObjectComm((PetscObject)draw), PetscDrawBarDestroy, NULL));
449566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)draw));
45e118a51fSLisandro Dalcin   h->win     = draw;
4651fa3d41SBarry Smith   h->view    = NULL;
4751fa3d41SBarry Smith   h->destroy = NULL;
4851fa3d41SBarry Smith   h->color   = PETSC_DRAW_GREEN;
4951fa3d41SBarry Smith   h->ymin    = 0.; /* if user has not set these then they are determined from the data */
5051fa3d41SBarry Smith   h->ymax    = 0.;
5151fa3d41SBarry Smith   h->numBins = 0;
529566063dSJacob Faibussowitsch   PetscCall(PetscDrawAxisCreate(draw, &h->axis));
5345f3bb6eSLisandro Dalcin   h->axis->xticks = NULL;
5451fa3d41SBarry Smith   *bar            = h;
553ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
5651fa3d41SBarry Smith }
5751fa3d41SBarry Smith 
5851fa3d41SBarry Smith /*@C
5910450e9eSJacob Faibussowitsch   PetscDrawBarSetData - Set the data for a bar graph
6051fa3d41SBarry Smith 
61c3339decSBarry Smith   Logically Collective
6251fa3d41SBarry Smith 
63d8d19677SJose E. Roman   Input Parameters:
6451fa3d41SBarry Smith + bar    - The bar graph context.
6551fa3d41SBarry Smith . bins   - number of items
66aec76313SJacob Faibussowitsch . data   - values of each item
67a3b724e8SBarry Smith - labels - optional label for each bar, `NULL` terminated array of strings
6851fa3d41SBarry Smith 
6951fa3d41SBarry Smith   Level: intermediate
7051fa3d41SBarry Smith 
7195452b02SPatrick Sanan   Notes:
72811af0c4SBarry Smith   Call `PetscDrawBarDraw()` after this call to display the new plot
730afdd333SBarry Smith 
74a3b724e8SBarry Smith   The data is ignored on all MPI processes except rank zero
7551fa3d41SBarry Smith 
76aec76313SJacob Faibussowitsch .seealso: `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawBarDraw()`
7751fa3d41SBarry Smith @*/
78*5d83a8b1SBarry Smith PetscErrorCode PetscDrawBarSetData(PetscDrawBar bar, PetscInt bins, const PetscReal data[], const char *const labels[])
79d71ae5a4SJacob Faibussowitsch {
8051fa3d41SBarry Smith   PetscFunctionBegin;
8151fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
82e118a51fSLisandro Dalcin 
8351fa3d41SBarry Smith   if (bar->numBins != bins) {
849566063dSJacob Faibussowitsch     PetscCall(PetscFree(bar->values));
859566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(bins, &bar->values));
8651fa3d41SBarry Smith     bar->numBins = bins;
8751fa3d41SBarry Smith   }
889566063dSJacob Faibussowitsch   PetscCall(PetscArraycpy(bar->values, data, bins));
8951fa3d41SBarry Smith   bar->numBins = bins;
9048a46eb9SPierre Jolivet   if (labels) PetscCall(PetscStrArrayallocpy(labels, &bar->labels));
913ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
9251fa3d41SBarry Smith }
9351fa3d41SBarry Smith 
94*5d83a8b1SBarry Smith /*@
9551fa3d41SBarry Smith   PetscDrawBarDestroy - Frees all space taken up by bar graph data structure.
9651fa3d41SBarry Smith 
978f14a041SBarry Smith   Collective
9851fa3d41SBarry Smith 
9951fa3d41SBarry Smith   Input Parameter:
10051fa3d41SBarry Smith . bar - The bar graph context
10151fa3d41SBarry Smith 
10251fa3d41SBarry Smith   Level: intermediate
10351fa3d41SBarry Smith 
104811af0c4SBarry Smith .seealso: `PetscDrawBar`, `PetscDrawBarCreate()`
10551fa3d41SBarry Smith @*/
106d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarDestroy(PetscDrawBar *bar)
107d71ae5a4SJacob Faibussowitsch {
10851fa3d41SBarry Smith   PetscFunctionBegin;
1093ba16761SJacob Faibussowitsch   if (!*bar) PetscFunctionReturn(PETSC_SUCCESS);
110e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(*bar, PETSC_DRAWBAR_CLASSID, 1);
111f4f49eeaSPierre Jolivet   if (--((PetscObject)*bar)->refct > 0) PetscFunctionReturn(PETSC_SUCCESS);
112e118a51fSLisandro Dalcin 
1139566063dSJacob Faibussowitsch   PetscCall(PetscFree((*bar)->values));
1149566063dSJacob Faibussowitsch   PetscCall(PetscStrArrayDestroy(&(*bar)->labels));
1159566063dSJacob Faibussowitsch   PetscCall(PetscDrawAxisDestroy(&(*bar)->axis));
1169566063dSJacob Faibussowitsch   PetscCall(PetscDrawDestroy(&(*bar)->win));
1179566063dSJacob Faibussowitsch   PetscCall(PetscHeaderDestroy(bar));
1183ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
11951fa3d41SBarry Smith }
12051fa3d41SBarry Smith 
12151fa3d41SBarry Smith /*@
12251fa3d41SBarry Smith   PetscDrawBarDraw - Redraws a bar graph.
12351fa3d41SBarry Smith 
124c3339decSBarry Smith   Collective
12551fa3d41SBarry Smith 
12651fa3d41SBarry Smith   Input Parameter:
12751fa3d41SBarry Smith . bar - The bar graph context
12851fa3d41SBarry Smith 
12951fa3d41SBarry Smith   Level: intermediate
13051fa3d41SBarry Smith 
131db781477SPatrick Sanan .seealso: `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawBarSetData()`
13251fa3d41SBarry Smith @*/
133d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarDraw(PetscDrawBar bar)
134d71ae5a4SJacob Faibussowitsch {
135e118a51fSLisandro Dalcin   PetscDraw   draw;
13651fa3d41SBarry Smith   PetscBool   isnull;
13751fa3d41SBarry Smith   PetscReal   xmin, xmax, ymin, ymax, *values, binLeft, binRight;
13851fa3d41SBarry Smith   PetscInt    numValues, i, bcolor, color, idx, *perm, nplot;
139e118a51fSLisandro Dalcin   PetscMPIInt rank;
14051fa3d41SBarry Smith   char      **labels;
14151fa3d41SBarry Smith 
14251fa3d41SBarry Smith   PetscFunctionBegin;
14351fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
1449566063dSJacob Faibussowitsch   PetscCall(PetscDrawIsNull(bar->win, &isnull));
1453ba16761SJacob Faibussowitsch   if (isnull) PetscFunctionReturn(PETSC_SUCCESS);
1469566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)bar), &rank));
14751fa3d41SBarry Smith 
1483ba16761SJacob Faibussowitsch   if (bar->numBins < 1) PetscFunctionReturn(PETSC_SUCCESS);
1495b399a63SLisandro Dalcin 
15051fa3d41SBarry Smith   color = bar->color;
15171917b75SLisandro Dalcin   if (color == PETSC_DRAW_ROTATE) bcolor = PETSC_DRAW_BLACK + 1;
15251fa3d41SBarry Smith   else bcolor = color;
15351fa3d41SBarry Smith 
15451fa3d41SBarry Smith   numValues = bar->numBins;
15551fa3d41SBarry Smith   values    = bar->values;
15651fa3d41SBarry Smith   if (bar->ymin == bar->ymax) {
15751fa3d41SBarry Smith     /* user has not set bounds on bars so set them based on the data */
15851fa3d41SBarry Smith     ymin = PETSC_MAX_REAL;
15951fa3d41SBarry Smith     ymax = PETSC_MIN_REAL;
16051fa3d41SBarry Smith     for (i = 0; i < numValues; i++) {
16151fa3d41SBarry Smith       ymin = PetscMin(ymin, values[i]);
16251fa3d41SBarry Smith       ymax = PetscMax(ymax, values[i]);
16351fa3d41SBarry Smith     }
16451fa3d41SBarry Smith   } else {
16551fa3d41SBarry Smith     ymin = bar->ymin;
16651fa3d41SBarry Smith     ymax = bar->ymax;
16751fa3d41SBarry Smith   }
16851fa3d41SBarry Smith   nplot  = numValues; /* number of points to actually plot; if some are lower than requested tolerance */
16951fa3d41SBarry Smith   xmin   = 0.0;
170e118a51fSLisandro Dalcin   xmax   = nplot;
17151fa3d41SBarry Smith   labels = bar->labels;
17251fa3d41SBarry Smith 
17351fa3d41SBarry Smith   if (bar->sort) {
1749566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(numValues, &perm));
17551fa3d41SBarry Smith     for (i = 0; i < numValues; i++) perm[i] = i;
1769566063dSJacob Faibussowitsch     PetscCall(PetscSortRealWithPermutation(numValues, values, perm));
17751fa3d41SBarry Smith     if (bar->sorttolerance) {
17851fa3d41SBarry Smith       for (i = 0; i < numValues; i++) {
17951fa3d41SBarry Smith         if (values[perm[numValues - i - 1]] < bar->sorttolerance) {
18051fa3d41SBarry Smith           nplot = i;
18151fa3d41SBarry Smith           break;
18251fa3d41SBarry Smith         }
18351fa3d41SBarry Smith       }
18451fa3d41SBarry Smith     }
18551fa3d41SBarry Smith   }
18651fa3d41SBarry Smith 
1875b399a63SLisandro Dalcin   draw = bar->win;
1889566063dSJacob Faibussowitsch   PetscCall(PetscDrawCheckResizedWindow(draw));
1899566063dSJacob Faibussowitsch   PetscCall(PetscDrawClear(draw));
190e118a51fSLisandro Dalcin 
1919566063dSJacob Faibussowitsch   PetscCall(PetscDrawAxisSetLimits(bar->axis, xmin, xmax, ymin, ymax));
1929566063dSJacob Faibussowitsch   PetscCall(PetscDrawAxisDraw(bar->axis));
19351fa3d41SBarry Smith 
194d0609cedSBarry Smith   PetscDrawCollectiveBegin(draw);
195dd400576SPatrick Sanan   if (rank == 0) { /* Draw bins */
19651fa3d41SBarry Smith     for (i = 0; i < nplot; i++) {
19751fa3d41SBarry Smith       idx      = (bar->sort ? perm[numValues - i - 1] : i);
19851fa3d41SBarry Smith       binLeft  = xmin + i;
19951fa3d41SBarry Smith       binRight = xmin + i + 1;
2009566063dSJacob Faibussowitsch       PetscCall(PetscDrawRectangle(draw, binLeft, ymin, binRight, values[idx], bcolor, bcolor, bcolor, bcolor));
2019566063dSJacob Faibussowitsch       PetscCall(PetscDrawLine(draw, binLeft, ymin, binLeft, values[idx], PETSC_DRAW_BLACK));
2029566063dSJacob Faibussowitsch       PetscCall(PetscDrawLine(draw, binRight, ymin, binRight, values[idx], PETSC_DRAW_BLACK));
2039566063dSJacob Faibussowitsch       PetscCall(PetscDrawLine(draw, binLeft, values[idx], binRight, values[idx], PETSC_DRAW_BLACK));
20451fa3d41SBarry Smith       if (labels) {
20551fa3d41SBarry Smith         PetscReal h;
2069566063dSJacob Faibussowitsch         PetscCall(PetscDrawStringGetSize(draw, NULL, &h));
2079566063dSJacob Faibussowitsch         PetscCall(PetscDrawStringCentered(draw, .5 * (binLeft + binRight), ymin - 1.5 * h, bcolor, labels[idx]));
20851fa3d41SBarry Smith       }
20951fa3d41SBarry Smith       if (color == PETSC_DRAW_ROTATE) bcolor++;
21071917b75SLisandro Dalcin       if (bcolor > PETSC_DRAW_BASIC_COLORS - 1) bcolor = PETSC_DRAW_BLACK + 1;
21151fa3d41SBarry Smith     }
21251fa3d41SBarry Smith   }
213d0609cedSBarry Smith   PetscDrawCollectiveEnd(draw);
2149566063dSJacob Faibussowitsch   if (bar->sort) PetscCall(PetscFree(perm));
215e118a51fSLisandro Dalcin 
2169566063dSJacob Faibussowitsch   PetscCall(PetscDrawFlush(draw));
2179566063dSJacob Faibussowitsch   PetscCall(PetscDrawPause(draw));
2183ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
21951fa3d41SBarry Smith }
22051fa3d41SBarry Smith 
22157fd6651SLisandro Dalcin /*@
222811af0c4SBarry Smith   PetscDrawBarSave - Saves a drawn bar graph
22357fd6651SLisandro Dalcin 
224c3339decSBarry Smith   Collective
22557fd6651SLisandro Dalcin 
2262fe279fdSBarry Smith   Input Parameter:
22757fd6651SLisandro Dalcin . bar - The bar graph context
22857fd6651SLisandro Dalcin 
22957fd6651SLisandro Dalcin   Level: intermediate
23057fd6651SLisandro Dalcin 
231aec76313SJacob Faibussowitsch .seealso: `PetscDrawSave()`, `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawBarGetDraw()`, `PetscDrawSetSave()`, `PetscDrawBarSetData()`
23257fd6651SLisandro Dalcin @*/
233d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarSave(PetscDrawBar bar)
234d71ae5a4SJacob Faibussowitsch {
23557fd6651SLisandro Dalcin   PetscFunctionBegin;
23657fd6651SLisandro Dalcin   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
2379566063dSJacob Faibussowitsch   PetscCall(PetscDrawSave(bar->win));
2383ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
23957fd6651SLisandro Dalcin }
24057fd6651SLisandro Dalcin 
24151fa3d41SBarry Smith /*@
24251fa3d41SBarry Smith   PetscDrawBarSetColor - Sets the color the bars will be drawn with.
24351fa3d41SBarry Smith 
244c3339decSBarry Smith   Logically Collective
24551fa3d41SBarry Smith 
24651fa3d41SBarry Smith   Input Parameters:
24751fa3d41SBarry Smith + bar   - The bar graph context
248811af0c4SBarry Smith - color - one of the colors defined in petscdraw.h or `PETSC_DRAW_ROTATE` to make each bar a
24951fa3d41SBarry Smith           different color
25051fa3d41SBarry Smith 
25151fa3d41SBarry Smith   Level: intermediate
25251fa3d41SBarry Smith 
253db781477SPatrick Sanan .seealso: `PetscDrawBarCreate()`, `PetscDrawBar`, `PetscDrawBarSetData()`, `PetscDrawBarDraw()`, `PetscDrawBarGetAxis()`
25451fa3d41SBarry Smith @*/
255d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarSetColor(PetscDrawBar bar, int color)
256d71ae5a4SJacob Faibussowitsch {
25751fa3d41SBarry Smith   PetscFunctionBegin;
25851fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
25951fa3d41SBarry Smith   bar->color = color;
2603ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
26151fa3d41SBarry Smith }
26251fa3d41SBarry Smith 
26351fa3d41SBarry Smith /*@
264811af0c4SBarry Smith   PetscDrawBarSort - Sorts the values before drawing the bar chart, the bars will be in ascending order from left to right
26551fa3d41SBarry Smith 
266c3339decSBarry Smith   Logically Collective
26751fa3d41SBarry Smith 
26851fa3d41SBarry Smith   Input Parameters:
26951fa3d41SBarry Smith + bar       - The bar graph context
270811af0c4SBarry Smith . sort      - `PETSC_TRUE` to sort the values
271a2b725a8SWilliam Gropp - tolerance - discard values less than tolerance
27251fa3d41SBarry Smith 
27351fa3d41SBarry Smith   Level: intermediate
27451fa3d41SBarry Smith 
275aec76313SJacob Faibussowitsch .seealso: `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawBarSetData()`, `PetscDrawBarSetColor()`, `PetscDrawBarDraw()`, `PetscDrawBarGetAxis()`
27651fa3d41SBarry Smith @*/
277d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarSort(PetscDrawBar bar, PetscBool sort, PetscReal tolerance)
278d71ae5a4SJacob Faibussowitsch {
27951fa3d41SBarry Smith   PetscFunctionBegin;
28051fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
28151fa3d41SBarry Smith   bar->sort          = sort;
28251fa3d41SBarry Smith   bar->sorttolerance = tolerance;
2833ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
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 
291c3339decSBarry Smith   Logically Collective
29251fa3d41SBarry Smith 
29351fa3d41SBarry Smith   Input Parameters:
29451fa3d41SBarry Smith + bar   - The bar graph context
2952fe279fdSBarry Smith . y_min - The lower limit
2962fe279fdSBarry Smith - y_max - The upper limit
29751fa3d41SBarry Smith 
29851fa3d41SBarry Smith   Level: intermediate
29951fa3d41SBarry Smith 
300aec76313SJacob Faibussowitsch .seealso: `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawBarGetAxis()`, `PetscDrawBarSetData()`, `PetscDrawBarDraw()`
30151fa3d41SBarry Smith @*/
302d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarSetLimits(PetscDrawBar bar, PetscReal y_min, PetscReal y_max)
303d71ae5a4SJacob Faibussowitsch {
30451fa3d41SBarry Smith   PetscFunctionBegin;
30551fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
30651fa3d41SBarry Smith   bar->ymin = y_min;
30751fa3d41SBarry Smith   bar->ymax = y_max;
3083ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
30951fa3d41SBarry Smith }
31051fa3d41SBarry Smith 
311cc4c1da9SBarry Smith /*@
31251fa3d41SBarry Smith   PetscDrawBarGetAxis - Gets the axis context associated with a bar graph.
31351fa3d41SBarry Smith   This is useful if one wants to change some axis property, such as
31451fa3d41SBarry Smith   labels, color, etc. The axis context should not be destroyed by the
31551fa3d41SBarry Smith   application code.
31651fa3d41SBarry Smith 
317811af0c4SBarry Smith   Not Collective, axis is parallel if bar is parallel
31851fa3d41SBarry Smith 
31951fa3d41SBarry Smith   Input Parameter:
32051fa3d41SBarry Smith . bar - The bar graph context
32151fa3d41SBarry Smith 
32251fa3d41SBarry Smith   Output Parameter:
32351fa3d41SBarry Smith . axis - The axis context
32451fa3d41SBarry Smith 
32551fa3d41SBarry Smith   Level: intermediate
32651fa3d41SBarry Smith 
327aec76313SJacob Faibussowitsch .seealso: `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawAxis`, `PetscDrawAxisCreate()`
32851fa3d41SBarry Smith @*/
329d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarGetAxis(PetscDrawBar bar, PetscDrawAxis *axis)
330d71ae5a4SJacob Faibussowitsch {
33151fa3d41SBarry Smith   PetscFunctionBegin;
332e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
3334f572ea9SToby Isaac   PetscAssertPointer(axis, 2);
33451fa3d41SBarry Smith   *axis = bar->axis;
3353ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
33651fa3d41SBarry Smith }
33751fa3d41SBarry Smith 
338cc4c1da9SBarry Smith /*@
33951fa3d41SBarry Smith   PetscDrawBarGetDraw - Gets the draw context associated with a bar graph.
34051fa3d41SBarry Smith 
341811af0c4SBarry Smith   Not Collective, draw is parallel if bar is parallel
34251fa3d41SBarry Smith 
34351fa3d41SBarry Smith   Input Parameter:
34451fa3d41SBarry Smith . bar - The bar graph context
34551fa3d41SBarry Smith 
34651fa3d41SBarry Smith   Output Parameter:
347e118a51fSLisandro Dalcin . draw - The draw context
34851fa3d41SBarry Smith 
34951fa3d41SBarry Smith   Level: intermediate
35051fa3d41SBarry Smith 
351aec76313SJacob Faibussowitsch .seealso: `PetscDrawBar`, `PetscDraw`, `PetscDrawBarCreate()`, `PetscDrawBarDraw()`
35251fa3d41SBarry Smith @*/
353d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarGetDraw(PetscDrawBar bar, PetscDraw *draw)
354d71ae5a4SJacob Faibussowitsch {
35551fa3d41SBarry Smith   PetscFunctionBegin;
35651fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
3574f572ea9SToby Isaac   PetscAssertPointer(draw, 2);
358e118a51fSLisandro Dalcin   *draw = bar->win;
3593ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
36051fa3d41SBarry Smith }
36151fa3d41SBarry Smith 
36251fa3d41SBarry Smith /*@
363811af0c4SBarry Smith   PetscDrawBarSetFromOptions - Sets options related to the display of the `PetscDrawBar`
36451fa3d41SBarry Smith 
3658f14a041SBarry Smith   Collective
36651fa3d41SBarry Smith 
36710450e9eSJacob Faibussowitsch   Input Parameter:
36810450e9eSJacob Faibussowitsch . bar - the bar graph context
36910450e9eSJacob Faibussowitsch 
370811af0c4SBarry Smith   Options Database Key:
37151fa3d41SBarry Smith . -bar_sort - sort the entries before drawing the bar graph
37251fa3d41SBarry Smith 
37351fa3d41SBarry Smith   Level: intermediate
37451fa3d41SBarry Smith 
375811af0c4SBarry Smith   Note:
376811af0c4SBarry Smith   Does not set options related to the underlying `PetscDraw` or `PetscDrawAxis`
377811af0c4SBarry Smith 
378811af0c4SBarry Smith .seealso: `PetscDrawBar`, `PetscDrawBarDestroy()`, `PetscDrawBarCreate()`, `PetscDrawBarSort()`
37951fa3d41SBarry Smith @*/
380d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarSetFromOptions(PetscDrawBar bar)
381d71ae5a4SJacob Faibussowitsch {
38251fa3d41SBarry Smith   PetscBool set;
38351fa3d41SBarry Smith 
38451fa3d41SBarry Smith   PetscFunctionBegin;
385e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
386e118a51fSLisandro Dalcin 
3879566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasName(((PetscObject)bar)->options, ((PetscObject)bar)->prefix, "-bar_sort", &set));
38851fa3d41SBarry Smith   if (set) {
389e118a51fSLisandro Dalcin     PetscReal tol = bar->sorttolerance;
3909566063dSJacob Faibussowitsch     PetscCall(PetscOptionsGetReal(((PetscObject)bar)->options, ((PetscObject)bar)->prefix, "-bar_sort", &tol, NULL));
3919566063dSJacob Faibussowitsch     PetscCall(PetscDrawBarSort(bar, PETSC_TRUE, tol));
39251fa3d41SBarry Smith   }
3933ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
39451fa3d41SBarry Smith }
395