xref: /petsc/src/sys/classes/draw/utils/bars.c (revision 1d27aa22b2f6148b2c4e3f06a75e0638d6493e09)
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 
1051fa3d41SBarry Smith /*@C
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 
24*1d27aa22SBarry 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
27*1d27aa22SBarry 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));
44e118a51fSLisandro Dalcin 
459566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)draw));
46e118a51fSLisandro Dalcin   h->win = draw;
4751fa3d41SBarry Smith 
4851fa3d41SBarry Smith   h->view    = NULL;
4951fa3d41SBarry Smith   h->destroy = NULL;
5051fa3d41SBarry Smith   h->color   = PETSC_DRAW_GREEN;
5151fa3d41SBarry Smith   h->ymin    = 0.; /* if user has not set these then they are determined from the data */
5251fa3d41SBarry Smith   h->ymax    = 0.;
5351fa3d41SBarry Smith   h->numBins = 0;
5451fa3d41SBarry Smith 
559566063dSJacob Faibussowitsch   PetscCall(PetscDrawAxisCreate(draw, &h->axis));
5645f3bb6eSLisandro Dalcin   h->axis->xticks = NULL;
57e118a51fSLisandro Dalcin 
5851fa3d41SBarry Smith   *bar = h;
593ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
6051fa3d41SBarry Smith }
6151fa3d41SBarry Smith 
6251fa3d41SBarry Smith /*@C
6310450e9eSJacob Faibussowitsch   PetscDrawBarSetData - Set the data for a bar graph
6451fa3d41SBarry Smith 
65c3339decSBarry Smith   Logically Collective
6651fa3d41SBarry Smith 
67d8d19677SJose E. Roman   Input Parameters:
6851fa3d41SBarry Smith + bar    - The bar graph context.
6951fa3d41SBarry Smith . bins   - number of items
70aec76313SJacob Faibussowitsch . data   - values of each item
7151fa3d41SBarry Smith - labels - optional label for each bar, NULL terminated array of strings
7251fa3d41SBarry Smith 
7351fa3d41SBarry Smith   Level: intermediate
7451fa3d41SBarry Smith 
7595452b02SPatrick Sanan   Notes:
76811af0c4SBarry Smith   Call `PetscDrawBarDraw()` after this call to display the new plot
770afdd333SBarry Smith 
78811af0c4SBarry Smith   The data is ignored on all ranks except zero
7951fa3d41SBarry Smith 
80aec76313SJacob Faibussowitsch .seealso: `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawBarDraw()`
8151fa3d41SBarry Smith @*/
82d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarSetData(PetscDrawBar bar, PetscInt bins, const PetscReal data[], const char *const *labels)
83d71ae5a4SJacob Faibussowitsch {
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));
953ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
9651fa3d41SBarry Smith }
9751fa3d41SBarry Smith 
9851fa3d41SBarry Smith /*@C
9951fa3d41SBarry Smith   PetscDrawBarDestroy - Frees all space taken up by bar graph data structure.
10051fa3d41SBarry Smith 
1018f14a041SBarry Smith   Collective
10251fa3d41SBarry Smith 
10351fa3d41SBarry Smith   Input Parameter:
10451fa3d41SBarry Smith . bar - The bar graph context
10551fa3d41SBarry Smith 
10651fa3d41SBarry Smith   Level: intermediate
10751fa3d41SBarry Smith 
108811af0c4SBarry Smith .seealso: `PetscDrawBar`, `PetscDrawBarCreate()`
10951fa3d41SBarry Smith @*/
110d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarDestroy(PetscDrawBar *bar)
111d71ae5a4SJacob Faibussowitsch {
11251fa3d41SBarry Smith   PetscFunctionBegin;
1133ba16761SJacob Faibussowitsch   if (!*bar) PetscFunctionReturn(PETSC_SUCCESS);
114e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(*bar, PETSC_DRAWBAR_CLASSID, 1);
1153ba16761SJacob Faibussowitsch   if (--((PetscObject)(*bar))->refct > 0) PetscFunctionReturn(PETSC_SUCCESS);
116e118a51fSLisandro Dalcin 
1179566063dSJacob Faibussowitsch   PetscCall(PetscFree((*bar)->values));
1189566063dSJacob Faibussowitsch   PetscCall(PetscStrArrayDestroy(&(*bar)->labels));
1199566063dSJacob Faibussowitsch   PetscCall(PetscDrawAxisDestroy(&(*bar)->axis));
1209566063dSJacob Faibussowitsch   PetscCall(PetscDrawDestroy(&(*bar)->win));
1219566063dSJacob Faibussowitsch   PetscCall(PetscHeaderDestroy(bar));
1223ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
12351fa3d41SBarry Smith }
12451fa3d41SBarry Smith 
12551fa3d41SBarry Smith /*@
12651fa3d41SBarry Smith   PetscDrawBarDraw - Redraws a bar graph.
12751fa3d41SBarry Smith 
128c3339decSBarry Smith   Collective
12951fa3d41SBarry Smith 
13051fa3d41SBarry Smith   Input Parameter:
13151fa3d41SBarry Smith . bar - The bar graph context
13251fa3d41SBarry Smith 
13351fa3d41SBarry Smith   Level: intermediate
13451fa3d41SBarry Smith 
135db781477SPatrick Sanan .seealso: `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawBarSetData()`
13651fa3d41SBarry Smith @*/
137d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarDraw(PetscDrawBar bar)
138d71ae5a4SJacob Faibussowitsch {
139e118a51fSLisandro Dalcin   PetscDraw   draw;
14051fa3d41SBarry Smith   PetscBool   isnull;
14151fa3d41SBarry Smith   PetscReal   xmin, xmax, ymin, ymax, *values, binLeft, binRight;
14251fa3d41SBarry Smith   PetscInt    numValues, i, bcolor, color, idx, *perm, nplot;
143e118a51fSLisandro Dalcin   PetscMPIInt rank;
14451fa3d41SBarry Smith   char      **labels;
14551fa3d41SBarry Smith 
14651fa3d41SBarry Smith   PetscFunctionBegin;
14751fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
1489566063dSJacob Faibussowitsch   PetscCall(PetscDrawIsNull(bar->win, &isnull));
1493ba16761SJacob Faibussowitsch   if (isnull) PetscFunctionReturn(PETSC_SUCCESS);
1509566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)bar), &rank));
15151fa3d41SBarry Smith 
1523ba16761SJacob Faibussowitsch   if (bar->numBins < 1) PetscFunctionReturn(PETSC_SUCCESS);
1535b399a63SLisandro Dalcin 
15451fa3d41SBarry Smith   color = bar->color;
15571917b75SLisandro Dalcin   if (color == PETSC_DRAW_ROTATE) bcolor = PETSC_DRAW_BLACK + 1;
15651fa3d41SBarry Smith   else bcolor = color;
15751fa3d41SBarry Smith 
15851fa3d41SBarry Smith   numValues = bar->numBins;
15951fa3d41SBarry Smith   values    = bar->values;
16051fa3d41SBarry Smith   if (bar->ymin == bar->ymax) {
16151fa3d41SBarry Smith     /* user has not set bounds on bars so set them based on the data */
16251fa3d41SBarry Smith     ymin = PETSC_MAX_REAL;
16351fa3d41SBarry Smith     ymax = PETSC_MIN_REAL;
16451fa3d41SBarry Smith     for (i = 0; i < numValues; i++) {
16551fa3d41SBarry Smith       ymin = PetscMin(ymin, values[i]);
16651fa3d41SBarry Smith       ymax = PetscMax(ymax, values[i]);
16751fa3d41SBarry Smith     }
16851fa3d41SBarry Smith   } else {
16951fa3d41SBarry Smith     ymin = bar->ymin;
17051fa3d41SBarry Smith     ymax = bar->ymax;
17151fa3d41SBarry Smith   }
17251fa3d41SBarry Smith   nplot  = numValues; /* number of points to actually plot; if some are lower than requested tolerance */
17351fa3d41SBarry Smith   xmin   = 0.0;
174e118a51fSLisandro Dalcin   xmax   = nplot;
17551fa3d41SBarry Smith   labels = bar->labels;
17651fa3d41SBarry Smith 
17751fa3d41SBarry Smith   if (bar->sort) {
1789566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(numValues, &perm));
17951fa3d41SBarry Smith     for (i = 0; i < numValues; i++) perm[i] = i;
1809566063dSJacob Faibussowitsch     PetscCall(PetscSortRealWithPermutation(numValues, values, perm));
18151fa3d41SBarry Smith     if (bar->sorttolerance) {
18251fa3d41SBarry Smith       for (i = 0; i < numValues; i++) {
18351fa3d41SBarry Smith         if (values[perm[numValues - i - 1]] < bar->sorttolerance) {
18451fa3d41SBarry Smith           nplot = i;
18551fa3d41SBarry Smith           break;
18651fa3d41SBarry Smith         }
18751fa3d41SBarry Smith       }
18851fa3d41SBarry Smith     }
18951fa3d41SBarry Smith   }
19051fa3d41SBarry Smith 
1915b399a63SLisandro Dalcin   draw = bar->win;
1929566063dSJacob Faibussowitsch   PetscCall(PetscDrawCheckResizedWindow(draw));
1939566063dSJacob Faibussowitsch   PetscCall(PetscDrawClear(draw));
194e118a51fSLisandro Dalcin 
1959566063dSJacob Faibussowitsch   PetscCall(PetscDrawAxisSetLimits(bar->axis, xmin, xmax, ymin, ymax));
1969566063dSJacob Faibussowitsch   PetscCall(PetscDrawAxisDraw(bar->axis));
19751fa3d41SBarry Smith 
198d0609cedSBarry Smith   PetscDrawCollectiveBegin(draw);
199dd400576SPatrick Sanan   if (rank == 0) { /* Draw bins */
20051fa3d41SBarry Smith     for (i = 0; i < nplot; i++) {
20151fa3d41SBarry Smith       idx      = (bar->sort ? perm[numValues - i - 1] : i);
20251fa3d41SBarry Smith       binLeft  = xmin + i;
20351fa3d41SBarry Smith       binRight = xmin + i + 1;
2049566063dSJacob Faibussowitsch       PetscCall(PetscDrawRectangle(draw, binLeft, ymin, binRight, values[idx], bcolor, bcolor, bcolor, bcolor));
2059566063dSJacob Faibussowitsch       PetscCall(PetscDrawLine(draw, binLeft, ymin, binLeft, values[idx], PETSC_DRAW_BLACK));
2069566063dSJacob Faibussowitsch       PetscCall(PetscDrawLine(draw, binRight, ymin, binRight, values[idx], PETSC_DRAW_BLACK));
2079566063dSJacob Faibussowitsch       PetscCall(PetscDrawLine(draw, binLeft, values[idx], binRight, values[idx], PETSC_DRAW_BLACK));
20851fa3d41SBarry Smith       if (labels) {
20951fa3d41SBarry Smith         PetscReal h;
2109566063dSJacob Faibussowitsch         PetscCall(PetscDrawStringGetSize(draw, NULL, &h));
2119566063dSJacob Faibussowitsch         PetscCall(PetscDrawStringCentered(draw, .5 * (binLeft + binRight), ymin - 1.5 * h, bcolor, labels[idx]));
21251fa3d41SBarry Smith       }
21351fa3d41SBarry Smith       if (color == PETSC_DRAW_ROTATE) bcolor++;
21471917b75SLisandro Dalcin       if (bcolor > PETSC_DRAW_BASIC_COLORS - 1) bcolor = PETSC_DRAW_BLACK + 1;
21551fa3d41SBarry Smith     }
21651fa3d41SBarry Smith   }
217d0609cedSBarry Smith   PetscDrawCollectiveEnd(draw);
2189566063dSJacob Faibussowitsch   if (bar->sort) PetscCall(PetscFree(perm));
219e118a51fSLisandro Dalcin 
2209566063dSJacob Faibussowitsch   PetscCall(PetscDrawFlush(draw));
2219566063dSJacob Faibussowitsch   PetscCall(PetscDrawPause(draw));
2223ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
22351fa3d41SBarry Smith }
22451fa3d41SBarry Smith 
22557fd6651SLisandro Dalcin /*@
226811af0c4SBarry Smith   PetscDrawBarSave - Saves a drawn bar graph
22757fd6651SLisandro Dalcin 
228c3339decSBarry Smith   Collective
22957fd6651SLisandro Dalcin 
2302fe279fdSBarry Smith   Input Parameter:
23157fd6651SLisandro Dalcin . bar - The bar graph context
23257fd6651SLisandro Dalcin 
23357fd6651SLisandro Dalcin   Level: intermediate
23457fd6651SLisandro Dalcin 
235aec76313SJacob Faibussowitsch .seealso: `PetscDrawSave()`, `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawBarGetDraw()`, `PetscDrawSetSave()`, `PetscDrawBarSetData()`
23657fd6651SLisandro Dalcin @*/
237d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarSave(PetscDrawBar bar)
238d71ae5a4SJacob Faibussowitsch {
23957fd6651SLisandro Dalcin   PetscFunctionBegin;
24057fd6651SLisandro Dalcin   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
2419566063dSJacob Faibussowitsch   PetscCall(PetscDrawSave(bar->win));
2423ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
24357fd6651SLisandro Dalcin }
24457fd6651SLisandro Dalcin 
24551fa3d41SBarry Smith /*@
24651fa3d41SBarry Smith   PetscDrawBarSetColor - Sets the color the bars will be drawn with.
24751fa3d41SBarry Smith 
248c3339decSBarry Smith   Logically Collective
24951fa3d41SBarry Smith 
25051fa3d41SBarry Smith   Input Parameters:
25151fa3d41SBarry Smith + bar   - The bar graph context
252811af0c4SBarry Smith - color - one of the colors defined in petscdraw.h or `PETSC_DRAW_ROTATE` to make each bar a
25351fa3d41SBarry Smith           different color
25451fa3d41SBarry Smith 
25551fa3d41SBarry Smith   Level: intermediate
25651fa3d41SBarry Smith 
257db781477SPatrick Sanan .seealso: `PetscDrawBarCreate()`, `PetscDrawBar`, `PetscDrawBarSetData()`, `PetscDrawBarDraw()`, `PetscDrawBarGetAxis()`
25851fa3d41SBarry Smith @*/
259d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarSetColor(PetscDrawBar bar, int color)
260d71ae5a4SJacob Faibussowitsch {
26151fa3d41SBarry Smith   PetscFunctionBegin;
26251fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
26351fa3d41SBarry Smith   bar->color = color;
2643ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
26551fa3d41SBarry Smith }
26651fa3d41SBarry Smith 
26751fa3d41SBarry Smith /*@
268811af0c4SBarry Smith   PetscDrawBarSort - Sorts the values before drawing the bar chart, the bars will be in ascending order from left to right
26951fa3d41SBarry Smith 
270c3339decSBarry Smith   Logically Collective
27151fa3d41SBarry Smith 
27251fa3d41SBarry Smith   Input Parameters:
27351fa3d41SBarry Smith + bar       - The bar graph context
274811af0c4SBarry Smith . sort      - `PETSC_TRUE` to sort the values
275a2b725a8SWilliam Gropp - tolerance - discard values less than tolerance
27651fa3d41SBarry Smith 
27751fa3d41SBarry Smith   Level: intermediate
27851fa3d41SBarry Smith 
279aec76313SJacob Faibussowitsch .seealso: `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawBarSetData()`, `PetscDrawBarSetColor()`, `PetscDrawBarDraw()`, `PetscDrawBarGetAxis()`
28051fa3d41SBarry Smith @*/
281d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarSort(PetscDrawBar bar, PetscBool sort, PetscReal tolerance)
282d71ae5a4SJacob Faibussowitsch {
28351fa3d41SBarry Smith   PetscFunctionBegin;
28451fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
28551fa3d41SBarry Smith   bar->sort          = sort;
28651fa3d41SBarry Smith   bar->sorttolerance = tolerance;
2873ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
28851fa3d41SBarry Smith }
28951fa3d41SBarry Smith 
29051fa3d41SBarry Smith /*@
29151fa3d41SBarry Smith   PetscDrawBarSetLimits - Sets the axis limits for a bar graph. If more
29251fa3d41SBarry Smith   points are added after this call, the limits will be adjusted to
29351fa3d41SBarry Smith   include those additional points.
29451fa3d41SBarry Smith 
295c3339decSBarry Smith   Logically Collective
29651fa3d41SBarry Smith 
29751fa3d41SBarry Smith   Input Parameters:
29851fa3d41SBarry Smith + bar   - The bar graph context
2992fe279fdSBarry Smith . y_min - The lower limit
3002fe279fdSBarry Smith - y_max - The upper limit
30151fa3d41SBarry Smith 
30251fa3d41SBarry Smith   Level: intermediate
30351fa3d41SBarry Smith 
304aec76313SJacob Faibussowitsch .seealso: `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawBarGetAxis()`, `PetscDrawBarSetData()`, `PetscDrawBarDraw()`
30551fa3d41SBarry Smith @*/
306d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarSetLimits(PetscDrawBar bar, PetscReal y_min, PetscReal y_max)
307d71ae5a4SJacob Faibussowitsch {
30851fa3d41SBarry Smith   PetscFunctionBegin;
30951fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
31051fa3d41SBarry Smith   bar->ymin = y_min;
31151fa3d41SBarry Smith   bar->ymax = y_max;
3123ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
31351fa3d41SBarry Smith }
31451fa3d41SBarry Smith 
31551fa3d41SBarry Smith /*@C
31651fa3d41SBarry Smith   PetscDrawBarGetAxis - Gets the axis context associated with a bar graph.
31751fa3d41SBarry Smith   This is useful if one wants to change some axis property, such as
31851fa3d41SBarry Smith   labels, color, etc. The axis context should not be destroyed by the
31951fa3d41SBarry Smith   application code.
32051fa3d41SBarry Smith 
321811af0c4SBarry Smith   Not Collective, axis is parallel if bar is parallel
32251fa3d41SBarry Smith 
32351fa3d41SBarry Smith   Input Parameter:
32451fa3d41SBarry Smith . bar - The bar graph context
32551fa3d41SBarry Smith 
32651fa3d41SBarry Smith   Output Parameter:
32751fa3d41SBarry Smith . axis - The axis context
32851fa3d41SBarry Smith 
32951fa3d41SBarry Smith   Level: intermediate
33051fa3d41SBarry Smith 
331aec76313SJacob Faibussowitsch .seealso: `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawAxis`, `PetscDrawAxisCreate()`
33251fa3d41SBarry Smith @*/
333d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarGetAxis(PetscDrawBar bar, PetscDrawAxis *axis)
334d71ae5a4SJacob Faibussowitsch {
33551fa3d41SBarry Smith   PetscFunctionBegin;
336e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
3374f572ea9SToby Isaac   PetscAssertPointer(axis, 2);
33851fa3d41SBarry Smith   *axis = bar->axis;
3393ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
34051fa3d41SBarry Smith }
34151fa3d41SBarry Smith 
34251fa3d41SBarry Smith /*@C
34351fa3d41SBarry Smith   PetscDrawBarGetDraw - Gets the draw context associated with a bar graph.
34451fa3d41SBarry Smith 
345811af0c4SBarry Smith   Not Collective, draw is parallel if bar is parallel
34651fa3d41SBarry Smith 
34751fa3d41SBarry Smith   Input Parameter:
34851fa3d41SBarry Smith . bar - The bar graph context
34951fa3d41SBarry Smith 
35051fa3d41SBarry Smith   Output Parameter:
351e118a51fSLisandro Dalcin . draw - The draw context
35251fa3d41SBarry Smith 
35351fa3d41SBarry Smith   Level: intermediate
35451fa3d41SBarry Smith 
355aec76313SJacob Faibussowitsch .seealso: `PetscDrawBar`, `PetscDraw`, `PetscDrawBarCreate()`, `PetscDrawBarDraw()`
35651fa3d41SBarry Smith @*/
357d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarGetDraw(PetscDrawBar bar, PetscDraw *draw)
358d71ae5a4SJacob Faibussowitsch {
35951fa3d41SBarry Smith   PetscFunctionBegin;
36051fa3d41SBarry Smith   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
3614f572ea9SToby Isaac   PetscAssertPointer(draw, 2);
362e118a51fSLisandro Dalcin   *draw = bar->win;
3633ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
36451fa3d41SBarry Smith }
36551fa3d41SBarry Smith 
36651fa3d41SBarry Smith /*@
367811af0c4SBarry Smith   PetscDrawBarSetFromOptions - Sets options related to the display of the `PetscDrawBar`
36851fa3d41SBarry Smith 
3698f14a041SBarry Smith   Collective
37051fa3d41SBarry Smith 
37110450e9eSJacob Faibussowitsch   Input Parameter:
37210450e9eSJacob Faibussowitsch . bar - the bar graph context
37310450e9eSJacob Faibussowitsch 
374811af0c4SBarry Smith   Options Database Key:
37551fa3d41SBarry Smith . -bar_sort - sort the entries before drawing the bar graph
37651fa3d41SBarry Smith 
37751fa3d41SBarry Smith   Level: intermediate
37851fa3d41SBarry Smith 
379811af0c4SBarry Smith   Note:
380811af0c4SBarry Smith   Does not set options related to the underlying `PetscDraw` or `PetscDrawAxis`
381811af0c4SBarry Smith 
382811af0c4SBarry Smith .seealso: `PetscDrawBar`, `PetscDrawBarDestroy()`, `PetscDrawBarCreate()`, `PetscDrawBarSort()`
38351fa3d41SBarry Smith @*/
384d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarSetFromOptions(PetscDrawBar bar)
385d71ae5a4SJacob Faibussowitsch {
38651fa3d41SBarry Smith   PetscBool set;
38751fa3d41SBarry Smith 
38851fa3d41SBarry Smith   PetscFunctionBegin;
389e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
390e118a51fSLisandro Dalcin 
3919566063dSJacob Faibussowitsch   PetscCall(PetscOptionsHasName(((PetscObject)bar)->options, ((PetscObject)bar)->prefix, "-bar_sort", &set));
39251fa3d41SBarry Smith   if (set) {
393e118a51fSLisandro Dalcin     PetscReal tol = bar->sorttolerance;
3949566063dSJacob Faibussowitsch     PetscCall(PetscOptionsGetReal(((PetscObject)bar)->options, ((PetscObject)bar)->prefix, "-bar_sort", &tol, NULL));
3959566063dSJacob Faibussowitsch     PetscCall(PetscDrawBarSort(bar, PETSC_TRUE, tol));
39651fa3d41SBarry Smith   }
3973ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
39851fa3d41SBarry Smith }
399