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 @*/
PetscDrawBarCreate(PetscDraw draw,PetscDrawBar * bar)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 @*/
PetscDrawBarSetData(PetscDrawBar bar,PetscInt bins,const PetscReal data[],const char * const labels[])785d83a8b1SBarry 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 }
879566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(bar->values, data, bins));
88*835f2295SStefano Zampini PetscCall(PetscCIntCast(bins, &bar->numBins));
8948a46eb9SPierre Jolivet if (labels) PetscCall(PetscStrArrayallocpy(labels, &bar->labels));
903ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
9151fa3d41SBarry Smith }
9251fa3d41SBarry Smith
935d83a8b1SBarry Smith /*@
9451fa3d41SBarry Smith PetscDrawBarDestroy - Frees all space taken up by bar graph data structure.
9551fa3d41SBarry Smith
968f14a041SBarry Smith Collective
9751fa3d41SBarry Smith
9851fa3d41SBarry Smith Input Parameter:
9951fa3d41SBarry Smith . bar - The bar graph context
10051fa3d41SBarry Smith
10151fa3d41SBarry Smith Level: intermediate
10251fa3d41SBarry Smith
103811af0c4SBarry Smith .seealso: `PetscDrawBar`, `PetscDrawBarCreate()`
10451fa3d41SBarry Smith @*/
PetscDrawBarDestroy(PetscDrawBar * bar)105d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarDestroy(PetscDrawBar *bar)
106d71ae5a4SJacob Faibussowitsch {
10751fa3d41SBarry Smith PetscFunctionBegin;
1083ba16761SJacob Faibussowitsch if (!*bar) PetscFunctionReturn(PETSC_SUCCESS);
109e118a51fSLisandro Dalcin PetscValidHeaderSpecific(*bar, PETSC_DRAWBAR_CLASSID, 1);
110f4f49eeaSPierre Jolivet if (--((PetscObject)*bar)->refct > 0) PetscFunctionReturn(PETSC_SUCCESS);
111e118a51fSLisandro Dalcin
1129566063dSJacob Faibussowitsch PetscCall(PetscFree((*bar)->values));
1139566063dSJacob Faibussowitsch PetscCall(PetscStrArrayDestroy(&(*bar)->labels));
1149566063dSJacob Faibussowitsch PetscCall(PetscDrawAxisDestroy(&(*bar)->axis));
1159566063dSJacob Faibussowitsch PetscCall(PetscDrawDestroy(&(*bar)->win));
1169566063dSJacob Faibussowitsch PetscCall(PetscHeaderDestroy(bar));
1173ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
11851fa3d41SBarry Smith }
11951fa3d41SBarry Smith
12051fa3d41SBarry Smith /*@
12151fa3d41SBarry Smith PetscDrawBarDraw - Redraws a bar graph.
12251fa3d41SBarry Smith
123c3339decSBarry Smith Collective
12451fa3d41SBarry Smith
12551fa3d41SBarry Smith Input Parameter:
12651fa3d41SBarry Smith . bar - The bar graph context
12751fa3d41SBarry Smith
12851fa3d41SBarry Smith Level: intermediate
12951fa3d41SBarry Smith
130db781477SPatrick Sanan .seealso: `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawBarSetData()`
13151fa3d41SBarry Smith @*/
PetscDrawBarDraw(PetscDrawBar bar)132d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarDraw(PetscDrawBar bar)
133d71ae5a4SJacob Faibussowitsch {
134e118a51fSLisandro Dalcin PetscDraw draw;
13551fa3d41SBarry Smith PetscBool isnull;
13651fa3d41SBarry Smith PetscReal xmin, xmax, ymin, ymax, *values, binLeft, binRight;
1376497c311SBarry Smith PetscInt numValues, i, idx, *perm, nplot;
138e118a51fSLisandro Dalcin PetscMPIInt rank;
13951fa3d41SBarry Smith char **labels;
1406497c311SBarry Smith int bcolor, color;
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;
1706497c311SBarry Smith xmax = (PetscReal)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);
1986497c311SBarry Smith binLeft = xmin + (PetscReal)i;
1996497c311SBarry Smith binRight = xmin + (PetscReal)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;
2066497c311SBarry Smith
2079566063dSJacob Faibussowitsch PetscCall(PetscDrawStringGetSize(draw, NULL, &h));
2089566063dSJacob Faibussowitsch PetscCall(PetscDrawStringCentered(draw, .5 * (binLeft + binRight), ymin - 1.5 * h, bcolor, labels[idx]));
20951fa3d41SBarry Smith }
21051fa3d41SBarry Smith if (color == PETSC_DRAW_ROTATE) bcolor++;
21171917b75SLisandro Dalcin if (bcolor > PETSC_DRAW_BASIC_COLORS - 1) bcolor = PETSC_DRAW_BLACK + 1;
21251fa3d41SBarry Smith }
21351fa3d41SBarry Smith }
214d0609cedSBarry Smith PetscDrawCollectiveEnd(draw);
2159566063dSJacob Faibussowitsch if (bar->sort) PetscCall(PetscFree(perm));
216e118a51fSLisandro Dalcin
2179566063dSJacob Faibussowitsch PetscCall(PetscDrawFlush(draw));
2189566063dSJacob Faibussowitsch PetscCall(PetscDrawPause(draw));
2193ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
22051fa3d41SBarry Smith }
22151fa3d41SBarry Smith
22257fd6651SLisandro Dalcin /*@
223811af0c4SBarry Smith PetscDrawBarSave - Saves a drawn bar graph
22457fd6651SLisandro Dalcin
225c3339decSBarry Smith Collective
22657fd6651SLisandro Dalcin
2272fe279fdSBarry Smith Input Parameter:
22857fd6651SLisandro Dalcin . bar - The bar graph context
22957fd6651SLisandro Dalcin
23057fd6651SLisandro Dalcin Level: intermediate
23157fd6651SLisandro Dalcin
232aec76313SJacob Faibussowitsch .seealso: `PetscDrawSave()`, `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawBarGetDraw()`, `PetscDrawSetSave()`, `PetscDrawBarSetData()`
23357fd6651SLisandro Dalcin @*/
PetscDrawBarSave(PetscDrawBar bar)234d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarSave(PetscDrawBar bar)
235d71ae5a4SJacob Faibussowitsch {
23657fd6651SLisandro Dalcin PetscFunctionBegin;
23757fd6651SLisandro Dalcin PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
2389566063dSJacob Faibussowitsch PetscCall(PetscDrawSave(bar->win));
2393ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
24057fd6651SLisandro Dalcin }
24157fd6651SLisandro Dalcin
24251fa3d41SBarry Smith /*@
24351fa3d41SBarry Smith PetscDrawBarSetColor - Sets the color the bars will be drawn with.
24451fa3d41SBarry Smith
245c3339decSBarry Smith Logically Collective
24651fa3d41SBarry Smith
24751fa3d41SBarry Smith Input Parameters:
24851fa3d41SBarry Smith + bar - The bar graph context
249811af0c4SBarry 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 @*/
PetscDrawBarSetColor(PetscDrawBar bar,int color)256d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarSetColor(PetscDrawBar bar, int color)
257d71ae5a4SJacob Faibussowitsch {
25851fa3d41SBarry Smith PetscFunctionBegin;
25951fa3d41SBarry Smith PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
26051fa3d41SBarry Smith bar->color = color;
2613ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
26251fa3d41SBarry Smith }
26351fa3d41SBarry Smith
26451fa3d41SBarry Smith /*@
265811af0c4SBarry Smith PetscDrawBarSort - Sorts the values before drawing the bar chart, the bars will be in ascending order from left to right
26651fa3d41SBarry Smith
267c3339decSBarry Smith Logically Collective
26851fa3d41SBarry Smith
26951fa3d41SBarry Smith Input Parameters:
27051fa3d41SBarry Smith + bar - The bar graph context
271811af0c4SBarry Smith . sort - `PETSC_TRUE` to sort the values
272a2b725a8SWilliam Gropp - tolerance - discard values less than tolerance
27351fa3d41SBarry Smith
27451fa3d41SBarry Smith Level: intermediate
27551fa3d41SBarry Smith
276aec76313SJacob Faibussowitsch .seealso: `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawBarSetData()`, `PetscDrawBarSetColor()`, `PetscDrawBarDraw()`, `PetscDrawBarGetAxis()`
27751fa3d41SBarry Smith @*/
PetscDrawBarSort(PetscDrawBar bar,PetscBool sort,PetscReal tolerance)278d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarSort(PetscDrawBar bar, PetscBool sort, PetscReal tolerance)
279d71ae5a4SJacob Faibussowitsch {
28051fa3d41SBarry Smith PetscFunctionBegin;
28151fa3d41SBarry Smith PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
28251fa3d41SBarry Smith bar->sort = sort;
28351fa3d41SBarry Smith bar->sorttolerance = tolerance;
2843ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
28551fa3d41SBarry Smith }
28651fa3d41SBarry Smith
28751fa3d41SBarry Smith /*@
28851fa3d41SBarry Smith PetscDrawBarSetLimits - Sets the axis limits for a bar graph. If more
28951fa3d41SBarry Smith points are added after this call, the limits will be adjusted to
29051fa3d41SBarry Smith include those additional points.
29151fa3d41SBarry Smith
292c3339decSBarry Smith Logically Collective
29351fa3d41SBarry Smith
29451fa3d41SBarry Smith Input Parameters:
29551fa3d41SBarry Smith + bar - The bar graph context
2962fe279fdSBarry Smith . y_min - The lower limit
2972fe279fdSBarry Smith - y_max - The upper limit
29851fa3d41SBarry Smith
29951fa3d41SBarry Smith Level: intermediate
30051fa3d41SBarry Smith
301aec76313SJacob Faibussowitsch .seealso: `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawBarGetAxis()`, `PetscDrawBarSetData()`, `PetscDrawBarDraw()`
30251fa3d41SBarry Smith @*/
PetscDrawBarSetLimits(PetscDrawBar bar,PetscReal y_min,PetscReal y_max)303d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarSetLimits(PetscDrawBar bar, PetscReal y_min, PetscReal y_max)
304d71ae5a4SJacob Faibussowitsch {
30551fa3d41SBarry Smith PetscFunctionBegin;
30651fa3d41SBarry Smith PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
30751fa3d41SBarry Smith bar->ymin = y_min;
30851fa3d41SBarry Smith bar->ymax = y_max;
3093ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
31051fa3d41SBarry Smith }
31151fa3d41SBarry Smith
312cc4c1da9SBarry Smith /*@
31351fa3d41SBarry Smith PetscDrawBarGetAxis - Gets the axis context associated with a bar graph.
31451fa3d41SBarry Smith This is useful if one wants to change some axis property, such as
31551fa3d41SBarry Smith labels, color, etc. The axis context should not be destroyed by the
31651fa3d41SBarry Smith application code.
31751fa3d41SBarry Smith
318811af0c4SBarry Smith Not Collective, axis is parallel if bar is parallel
31951fa3d41SBarry Smith
32051fa3d41SBarry Smith Input Parameter:
32151fa3d41SBarry Smith . bar - The bar graph context
32251fa3d41SBarry Smith
32351fa3d41SBarry Smith Output Parameter:
32451fa3d41SBarry Smith . axis - The axis context
32551fa3d41SBarry Smith
32651fa3d41SBarry Smith Level: intermediate
32751fa3d41SBarry Smith
328aec76313SJacob Faibussowitsch .seealso: `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawAxis`, `PetscDrawAxisCreate()`
32951fa3d41SBarry Smith @*/
PetscDrawBarGetAxis(PetscDrawBar bar,PetscDrawAxis * axis)330d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarGetAxis(PetscDrawBar bar, PetscDrawAxis *axis)
331d71ae5a4SJacob Faibussowitsch {
33251fa3d41SBarry Smith PetscFunctionBegin;
333e118a51fSLisandro Dalcin PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
3344f572ea9SToby Isaac PetscAssertPointer(axis, 2);
33551fa3d41SBarry Smith *axis = bar->axis;
3363ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
33751fa3d41SBarry Smith }
33851fa3d41SBarry Smith
339cc4c1da9SBarry Smith /*@
34051fa3d41SBarry Smith PetscDrawBarGetDraw - Gets the draw context associated with a bar graph.
34151fa3d41SBarry Smith
342811af0c4SBarry Smith Not Collective, draw is parallel if bar is parallel
34351fa3d41SBarry Smith
34451fa3d41SBarry Smith Input Parameter:
34551fa3d41SBarry Smith . bar - The bar graph context
34651fa3d41SBarry Smith
34751fa3d41SBarry Smith Output Parameter:
348e118a51fSLisandro Dalcin . draw - The draw context
34951fa3d41SBarry Smith
35051fa3d41SBarry Smith Level: intermediate
35151fa3d41SBarry Smith
352aec76313SJacob Faibussowitsch .seealso: `PetscDrawBar`, `PetscDraw`, `PetscDrawBarCreate()`, `PetscDrawBarDraw()`
35351fa3d41SBarry Smith @*/
PetscDrawBarGetDraw(PetscDrawBar bar,PetscDraw * draw)354d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarGetDraw(PetscDrawBar bar, PetscDraw *draw)
355d71ae5a4SJacob Faibussowitsch {
35651fa3d41SBarry Smith PetscFunctionBegin;
35751fa3d41SBarry Smith PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
3584f572ea9SToby Isaac PetscAssertPointer(draw, 2);
359e118a51fSLisandro Dalcin *draw = bar->win;
3603ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
36151fa3d41SBarry Smith }
36251fa3d41SBarry Smith
36351fa3d41SBarry Smith /*@
364811af0c4SBarry Smith PetscDrawBarSetFromOptions - Sets options related to the display of the `PetscDrawBar`
36551fa3d41SBarry Smith
3668f14a041SBarry Smith Collective
36751fa3d41SBarry Smith
36810450e9eSJacob Faibussowitsch Input Parameter:
36910450e9eSJacob Faibussowitsch . bar - the bar graph context
37010450e9eSJacob Faibussowitsch
371811af0c4SBarry Smith Options Database Key:
37251fa3d41SBarry Smith . -bar_sort - sort the entries before drawing the bar graph
37351fa3d41SBarry Smith
37451fa3d41SBarry Smith Level: intermediate
37551fa3d41SBarry Smith
376811af0c4SBarry Smith Note:
377811af0c4SBarry Smith Does not set options related to the underlying `PetscDraw` or `PetscDrawAxis`
378811af0c4SBarry Smith
379811af0c4SBarry Smith .seealso: `PetscDrawBar`, `PetscDrawBarDestroy()`, `PetscDrawBarCreate()`, `PetscDrawBarSort()`
38051fa3d41SBarry Smith @*/
PetscDrawBarSetFromOptions(PetscDrawBar bar)381d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarSetFromOptions(PetscDrawBar bar)
382d71ae5a4SJacob Faibussowitsch {
38351fa3d41SBarry Smith PetscBool set;
38451fa3d41SBarry Smith
38551fa3d41SBarry Smith PetscFunctionBegin;
386e118a51fSLisandro Dalcin PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1);
387e118a51fSLisandro Dalcin
3889566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(((PetscObject)bar)->options, ((PetscObject)bar)->prefix, "-bar_sort", &set));
38951fa3d41SBarry Smith if (set) {
390e118a51fSLisandro Dalcin PetscReal tol = bar->sorttolerance;
3919566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetReal(((PetscObject)bar)->options, ((PetscObject)bar)->prefix, "-bar_sort", &tol, NULL));
3929566063dSJacob Faibussowitsch PetscCall(PetscDrawBarSort(bar, PETSC_TRUE, tol));
39351fa3d41SBarry Smith }
3943ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS);
39551fa3d41SBarry Smith }
396