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 14811af0c4SBarry 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: 23811af0c4SBarry Smith Call `PetscDrawBarSetData()` to provide the bins to be plotted and then `PetscDrawBarDraw()` to display the new plot 240afdd333SBarry Smith 25811af0c4SBarry 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 27811af0c4SBarry 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 28811af0c4SBarry 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 32811af0c4SBarry 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 @*/ 36d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarCreate(PetscDraw draw, PetscDrawBar *bar) 37d71ae5a4SJacob Faibussowitsch { 3851fa3d41SBarry Smith PetscDrawBar h; 3951fa3d41SBarry Smith 4051fa3d41SBarry Smith PetscFunctionBegin; 4151fa3d41SBarry Smith PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 4273107ff1SLisandro Dalcin PetscValidPointer(bar, 2); 43e118a51fSLisandro Dalcin 449566063dSJacob Faibussowitsch PetscCall(PetscHeaderCreate(h, PETSC_DRAWBAR_CLASSID, "DrawBar", "Bar Graph", "Draw", PetscObjectComm((PetscObject)draw), PetscDrawBarDestroy, NULL)); 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*c3339decSBarry Smith Logically Collective 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: 77811af0c4SBarry Smith Call `PetscDrawBarDraw()` after this call to display the new plot 780afdd333SBarry Smith 79811af0c4SBarry Smith The data is ignored on all ranks except zero 8051fa3d41SBarry Smith 81811af0c4SBarry Smith .seealso: `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawBar`, `PetscDrawBarDraw()` 8251fa3d41SBarry Smith @*/ 83d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarSetData(PetscDrawBar bar, PetscInt bins, const PetscReal data[], const char *const *labels) 84d71ae5a4SJacob Faibussowitsch { 8551fa3d41SBarry Smith PetscFunctionBegin; 8651fa3d41SBarry Smith PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1); 87e118a51fSLisandro Dalcin 8851fa3d41SBarry Smith if (bar->numBins != bins) { 899566063dSJacob Faibussowitsch PetscCall(PetscFree(bar->values)); 909566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(bins, &bar->values)); 9151fa3d41SBarry Smith bar->numBins = bins; 9251fa3d41SBarry Smith } 939566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(bar->values, data, bins)); 9451fa3d41SBarry Smith bar->numBins = bins; 9548a46eb9SPierre Jolivet if (labels) PetscCall(PetscStrArrayallocpy(labels, &bar->labels)); 9651fa3d41SBarry Smith PetscFunctionReturn(0); 9751fa3d41SBarry Smith } 9851fa3d41SBarry Smith 9951fa3d41SBarry Smith /*@C 10051fa3d41SBarry Smith PetscDrawBarDestroy - Frees all space taken up by bar graph data structure. 10151fa3d41SBarry Smith 102811af0c4SBarry Smith Collective over bar 10351fa3d41SBarry Smith 10451fa3d41SBarry Smith Input Parameter: 10551fa3d41SBarry Smith . bar - The bar graph context 10651fa3d41SBarry Smith 10751fa3d41SBarry Smith Level: intermediate 10851fa3d41SBarry Smith 109811af0c4SBarry Smith .seealso: `PetscDrawBar`, `PetscDrawBarCreate()` 11051fa3d41SBarry Smith @*/ 111d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarDestroy(PetscDrawBar *bar) 112d71ae5a4SJacob Faibussowitsch { 11351fa3d41SBarry Smith PetscFunctionBegin; 11451fa3d41SBarry Smith if (!*bar) PetscFunctionReturn(0); 115e118a51fSLisandro Dalcin PetscValidHeaderSpecific(*bar, PETSC_DRAWBAR_CLASSID, 1); 11651fa3d41SBarry Smith if (--((PetscObject)(*bar))->refct > 0) PetscFunctionReturn(0); 117e118a51fSLisandro Dalcin 1189566063dSJacob Faibussowitsch PetscCall(PetscFree((*bar)->values)); 1199566063dSJacob Faibussowitsch PetscCall(PetscStrArrayDestroy(&(*bar)->labels)); 1209566063dSJacob Faibussowitsch PetscCall(PetscDrawAxisDestroy(&(*bar)->axis)); 1219566063dSJacob Faibussowitsch PetscCall(PetscDrawDestroy(&(*bar)->win)); 1229566063dSJacob Faibussowitsch PetscCall(PetscHeaderDestroy(bar)); 12351fa3d41SBarry Smith PetscFunctionReturn(0); 12451fa3d41SBarry Smith } 12551fa3d41SBarry Smith 12651fa3d41SBarry Smith /*@ 12751fa3d41SBarry Smith PetscDrawBarDraw - Redraws a bar graph. 12851fa3d41SBarry Smith 129*c3339decSBarry Smith Collective 13051fa3d41SBarry Smith 13151fa3d41SBarry Smith Input Parameter: 13251fa3d41SBarry Smith . bar - The bar graph context 13351fa3d41SBarry Smith 13451fa3d41SBarry Smith Level: intermediate 13551fa3d41SBarry Smith 136db781477SPatrick Sanan .seealso: `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawBarSetData()` 13751fa3d41SBarry Smith @*/ 138d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarDraw(PetscDrawBar bar) 139d71ae5a4SJacob Faibussowitsch { 140e118a51fSLisandro Dalcin PetscDraw draw; 14151fa3d41SBarry Smith PetscBool isnull; 14251fa3d41SBarry Smith PetscReal xmin, xmax, ymin, ymax, *values, binLeft, binRight; 14351fa3d41SBarry Smith PetscInt numValues, i, bcolor, color, idx, *perm, nplot; 144e118a51fSLisandro Dalcin PetscMPIInt rank; 14551fa3d41SBarry Smith char **labels; 14651fa3d41SBarry Smith 14751fa3d41SBarry Smith PetscFunctionBegin; 14851fa3d41SBarry Smith PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1); 1499566063dSJacob Faibussowitsch PetscCall(PetscDrawIsNull(bar->win, &isnull)); 1508f69470aSLisandro Dalcin if (isnull) PetscFunctionReturn(0); 1519566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)bar), &rank)); 15251fa3d41SBarry Smith 1535b399a63SLisandro Dalcin if (bar->numBins < 1) PetscFunctionReturn(0); 1545b399a63SLisandro Dalcin 15551fa3d41SBarry Smith color = bar->color; 15671917b75SLisandro Dalcin if (color == PETSC_DRAW_ROTATE) bcolor = PETSC_DRAW_BLACK + 1; 15751fa3d41SBarry Smith else bcolor = color; 15851fa3d41SBarry Smith 15951fa3d41SBarry Smith numValues = bar->numBins; 16051fa3d41SBarry Smith values = bar->values; 16151fa3d41SBarry Smith if (bar->ymin == bar->ymax) { 16251fa3d41SBarry Smith /* user has not set bounds on bars so set them based on the data */ 16351fa3d41SBarry Smith ymin = PETSC_MAX_REAL; 16451fa3d41SBarry Smith ymax = PETSC_MIN_REAL; 16551fa3d41SBarry Smith for (i = 0; i < numValues; i++) { 16651fa3d41SBarry Smith ymin = PetscMin(ymin, values[i]); 16751fa3d41SBarry Smith ymax = PetscMax(ymax, values[i]); 16851fa3d41SBarry Smith } 16951fa3d41SBarry Smith } else { 17051fa3d41SBarry Smith ymin = bar->ymin; 17151fa3d41SBarry Smith ymax = bar->ymax; 17251fa3d41SBarry Smith } 17351fa3d41SBarry Smith nplot = numValues; /* number of points to actually plot; if some are lower than requested tolerance */ 17451fa3d41SBarry Smith xmin = 0.0; 175e118a51fSLisandro Dalcin xmax = nplot; 17651fa3d41SBarry Smith labels = bar->labels; 17751fa3d41SBarry Smith 17851fa3d41SBarry Smith if (bar->sort) { 1799566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(numValues, &perm)); 18051fa3d41SBarry Smith for (i = 0; i < numValues; i++) perm[i] = i; 1819566063dSJacob Faibussowitsch PetscCall(PetscSortRealWithPermutation(numValues, values, perm)); 18251fa3d41SBarry Smith if (bar->sorttolerance) { 18351fa3d41SBarry Smith for (i = 0; i < numValues; i++) { 18451fa3d41SBarry Smith if (values[perm[numValues - i - 1]] < bar->sorttolerance) { 18551fa3d41SBarry Smith nplot = i; 18651fa3d41SBarry Smith break; 18751fa3d41SBarry Smith } 18851fa3d41SBarry Smith } 18951fa3d41SBarry Smith } 19051fa3d41SBarry Smith } 19151fa3d41SBarry Smith 1925b399a63SLisandro Dalcin draw = bar->win; 1939566063dSJacob Faibussowitsch PetscCall(PetscDrawCheckResizedWindow(draw)); 1949566063dSJacob Faibussowitsch PetscCall(PetscDrawClear(draw)); 195e118a51fSLisandro Dalcin 1969566063dSJacob Faibussowitsch PetscCall(PetscDrawAxisSetLimits(bar->axis, xmin, xmax, ymin, ymax)); 1979566063dSJacob Faibussowitsch PetscCall(PetscDrawAxisDraw(bar->axis)); 19851fa3d41SBarry Smith 199d0609cedSBarry Smith PetscDrawCollectiveBegin(draw); 200dd400576SPatrick Sanan if (rank == 0) { /* Draw bins */ 20151fa3d41SBarry Smith for (i = 0; i < nplot; i++) { 20251fa3d41SBarry Smith idx = (bar->sort ? perm[numValues - i - 1] : i); 20351fa3d41SBarry Smith binLeft = xmin + i; 20451fa3d41SBarry Smith binRight = xmin + i + 1; 2059566063dSJacob Faibussowitsch PetscCall(PetscDrawRectangle(draw, binLeft, ymin, binRight, values[idx], bcolor, bcolor, bcolor, bcolor)); 2069566063dSJacob Faibussowitsch PetscCall(PetscDrawLine(draw, binLeft, ymin, binLeft, values[idx], PETSC_DRAW_BLACK)); 2079566063dSJacob Faibussowitsch PetscCall(PetscDrawLine(draw, binRight, ymin, binRight, values[idx], PETSC_DRAW_BLACK)); 2089566063dSJacob Faibussowitsch PetscCall(PetscDrawLine(draw, binLeft, values[idx], binRight, values[idx], PETSC_DRAW_BLACK)); 20951fa3d41SBarry Smith if (labels) { 21051fa3d41SBarry Smith PetscReal h; 2119566063dSJacob Faibussowitsch PetscCall(PetscDrawStringGetSize(draw, NULL, &h)); 2129566063dSJacob Faibussowitsch PetscCall(PetscDrawStringCentered(draw, .5 * (binLeft + binRight), ymin - 1.5 * h, bcolor, labels[idx])); 21351fa3d41SBarry Smith } 21451fa3d41SBarry Smith if (color == PETSC_DRAW_ROTATE) bcolor++; 21571917b75SLisandro Dalcin if (bcolor > PETSC_DRAW_BASIC_COLORS - 1) bcolor = PETSC_DRAW_BLACK + 1; 21651fa3d41SBarry Smith } 21751fa3d41SBarry Smith } 218d0609cedSBarry Smith PetscDrawCollectiveEnd(draw); 2199566063dSJacob Faibussowitsch if (bar->sort) PetscCall(PetscFree(perm)); 220e118a51fSLisandro Dalcin 2219566063dSJacob Faibussowitsch PetscCall(PetscDrawFlush(draw)); 2229566063dSJacob Faibussowitsch PetscCall(PetscDrawPause(draw)); 22351fa3d41SBarry Smith PetscFunctionReturn(0); 22451fa3d41SBarry Smith } 22551fa3d41SBarry Smith 22657fd6651SLisandro Dalcin /*@ 227811af0c4SBarry Smith PetscDrawBarSave - Saves a drawn bar graph 22857fd6651SLisandro Dalcin 229*c3339decSBarry Smith Collective 23057fd6651SLisandro Dalcin 23157fd6651SLisandro Dalcin Input Parameters: 23257fd6651SLisandro Dalcin . bar - The bar graph context 23357fd6651SLisandro Dalcin 23457fd6651SLisandro Dalcin Level: intermediate 23557fd6651SLisandro Dalcin 236811af0c4SBarry Smith .seealso: `PetscDrawSave()`, `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawBarGetDraw()`, `PetscDrawSetSave()`, `PetscDrawSave()`, `PetscDrawBarSetData()` 23757fd6651SLisandro Dalcin @*/ 238d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarSave(PetscDrawBar bar) 239d71ae5a4SJacob Faibussowitsch { 24057fd6651SLisandro Dalcin PetscFunctionBegin; 24157fd6651SLisandro Dalcin PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1); 2429566063dSJacob Faibussowitsch PetscCall(PetscDrawSave(bar->win)); 24357fd6651SLisandro Dalcin PetscFunctionReturn(0); 24457fd6651SLisandro Dalcin } 24557fd6651SLisandro Dalcin 24651fa3d41SBarry Smith /*@ 24751fa3d41SBarry Smith PetscDrawBarSetColor - Sets the color the bars will be drawn with. 24851fa3d41SBarry Smith 249*c3339decSBarry Smith Logically Collective 25051fa3d41SBarry Smith 25151fa3d41SBarry Smith Input Parameters: 25251fa3d41SBarry Smith + bar - The bar graph context 253811af0c4SBarry Smith - color - one of the colors defined in petscdraw.h or `PETSC_DRAW_ROTATE` to make each bar a 25451fa3d41SBarry Smith different color 25551fa3d41SBarry Smith 25651fa3d41SBarry Smith Level: intermediate 25751fa3d41SBarry Smith 258db781477SPatrick Sanan .seealso: `PetscDrawBarCreate()`, `PetscDrawBar`, `PetscDrawBarSetData()`, `PetscDrawBarDraw()`, `PetscDrawBarGetAxis()` 25951fa3d41SBarry Smith @*/ 260d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarSetColor(PetscDrawBar bar, int color) 261d71ae5a4SJacob Faibussowitsch { 26251fa3d41SBarry Smith PetscFunctionBegin; 26351fa3d41SBarry Smith PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1); 26451fa3d41SBarry Smith bar->color = color; 26551fa3d41SBarry Smith PetscFunctionReturn(0); 26651fa3d41SBarry Smith } 26751fa3d41SBarry Smith 26851fa3d41SBarry Smith /*@ 269811af0c4SBarry Smith PetscDrawBarSort - Sorts the values before drawing the bar chart, the bars will be in ascending order from left to right 27051fa3d41SBarry Smith 271*c3339decSBarry Smith Logically Collective 27251fa3d41SBarry Smith 27351fa3d41SBarry Smith Input Parameters: 27451fa3d41SBarry Smith + bar - The bar graph context 275811af0c4SBarry Smith . sort - `PETSC_TRUE` to sort the values 276a2b725a8SWilliam Gropp - tolerance - discard values less than tolerance 27751fa3d41SBarry Smith 27851fa3d41SBarry Smith Level: intermediate 27951fa3d41SBarry Smith 280811af0c4SBarry Smith .seealso: `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawBar`, `PetscDrawBarSetData()`, `PetscDrawBarSetColor()`, `PetscDrawBarDraw()`, `PetscDrawBarGetAxis()` 28151fa3d41SBarry Smith @*/ 282d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarSort(PetscDrawBar bar, PetscBool sort, PetscReal tolerance) 283d71ae5a4SJacob Faibussowitsch { 28451fa3d41SBarry Smith PetscFunctionBegin; 28551fa3d41SBarry Smith PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1); 28651fa3d41SBarry Smith bar->sort = sort; 28751fa3d41SBarry Smith bar->sorttolerance = tolerance; 28851fa3d41SBarry Smith PetscFunctionReturn(0); 28951fa3d41SBarry Smith } 29051fa3d41SBarry Smith 29151fa3d41SBarry Smith /*@ 29251fa3d41SBarry Smith PetscDrawBarSetLimits - Sets the axis limits for a bar graph. If more 29351fa3d41SBarry Smith points are added after this call, the limits will be adjusted to 29451fa3d41SBarry Smith include those additional points. 29551fa3d41SBarry Smith 296*c3339decSBarry Smith Logically Collective 29751fa3d41SBarry Smith 29851fa3d41SBarry Smith Input Parameters: 29951fa3d41SBarry Smith + bar - The bar graph context 30051fa3d41SBarry Smith - y_min,y_max - The limits 30151fa3d41SBarry Smith 30251fa3d41SBarry Smith Level: intermediate 30351fa3d41SBarry Smith 304811af0c4SBarry Smith .seealso: `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawBar`, `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; 31251fa3d41SBarry Smith PetscFunctionReturn(0); 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 331811af0c4SBarry Smith .seealso: `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawBar`, `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); 33745f3bb6eSLisandro Dalcin PetscValidPointer(axis, 2); 33851fa3d41SBarry Smith *axis = bar->axis; 33951fa3d41SBarry Smith PetscFunctionReturn(0); 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 355811af0c4SBarry Smith .seealso: `PetscDrawBar`, `PetscDraw`, `PetscDrawBarCreate()`, `PetscDrawBar`, `PetscDrawBarDraw()`, `PetscDraw` 35651fa3d41SBarry Smith @*/ 357d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarGetDraw(PetscDrawBar bar, PetscDraw *draw) 358d71ae5a4SJacob Faibussowitsch { 35951fa3d41SBarry Smith PetscFunctionBegin; 36051fa3d41SBarry Smith PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1); 36145f3bb6eSLisandro Dalcin PetscValidPointer(draw, 2); 362e118a51fSLisandro Dalcin *draw = bar->win; 36351fa3d41SBarry Smith PetscFunctionReturn(0); 36451fa3d41SBarry Smith } 36551fa3d41SBarry Smith 36651fa3d41SBarry Smith /*@ 367811af0c4SBarry Smith PetscDrawBarSetFromOptions - Sets options related to the display of the `PetscDrawBar` 36851fa3d41SBarry Smith 369811af0c4SBarry Smith Collective over bar 37051fa3d41SBarry Smith 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 @*/ 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 } 39451fa3d41SBarry Smith PetscFunctionReturn(0); 39551fa3d41SBarry Smith } 396