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 @*/ 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)); 86*6497c311SBarry Smith bar->numBins = (int)bins; 8751fa3d41SBarry Smith } 889566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(bar->values, data, bins)); 89*6497c311SBarry Smith bar->numBins = (int)bins; 9048a46eb9SPierre Jolivet if (labels) PetscCall(PetscStrArrayallocpy(labels, &bar->labels)); 913ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 9251fa3d41SBarry Smith } 9351fa3d41SBarry Smith 945d83a8b1SBarry 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; 138*6497c311SBarry Smith PetscInt numValues, i, idx, *perm, nplot; 139e118a51fSLisandro Dalcin PetscMPIInt rank; 14051fa3d41SBarry Smith char **labels; 141*6497c311SBarry Smith int bcolor, color; 14251fa3d41SBarry Smith 14351fa3d41SBarry Smith PetscFunctionBegin; 14451fa3d41SBarry Smith PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1); 1459566063dSJacob Faibussowitsch PetscCall(PetscDrawIsNull(bar->win, &isnull)); 1463ba16761SJacob Faibussowitsch if (isnull) PetscFunctionReturn(PETSC_SUCCESS); 1479566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)bar), &rank)); 14851fa3d41SBarry Smith 1493ba16761SJacob Faibussowitsch if (bar->numBins < 1) PetscFunctionReturn(PETSC_SUCCESS); 1505b399a63SLisandro Dalcin 15151fa3d41SBarry Smith color = bar->color; 15271917b75SLisandro Dalcin if (color == PETSC_DRAW_ROTATE) bcolor = PETSC_DRAW_BLACK + 1; 15351fa3d41SBarry Smith else bcolor = color; 15451fa3d41SBarry Smith 15551fa3d41SBarry Smith numValues = bar->numBins; 15651fa3d41SBarry Smith values = bar->values; 15751fa3d41SBarry Smith if (bar->ymin == bar->ymax) { 15851fa3d41SBarry Smith /* user has not set bounds on bars so set them based on the data */ 15951fa3d41SBarry Smith ymin = PETSC_MAX_REAL; 16051fa3d41SBarry Smith ymax = PETSC_MIN_REAL; 16151fa3d41SBarry Smith for (i = 0; i < numValues; i++) { 16251fa3d41SBarry Smith ymin = PetscMin(ymin, values[i]); 16351fa3d41SBarry Smith ymax = PetscMax(ymax, values[i]); 16451fa3d41SBarry Smith } 16551fa3d41SBarry Smith } else { 16651fa3d41SBarry Smith ymin = bar->ymin; 16751fa3d41SBarry Smith ymax = bar->ymax; 16851fa3d41SBarry Smith } 16951fa3d41SBarry Smith nplot = numValues; /* number of points to actually plot; if some are lower than requested tolerance */ 17051fa3d41SBarry Smith xmin = 0.0; 171*6497c311SBarry Smith xmax = (PetscReal)nplot; 17251fa3d41SBarry Smith labels = bar->labels; 17351fa3d41SBarry Smith 17451fa3d41SBarry Smith if (bar->sort) { 1759566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(numValues, &perm)); 17651fa3d41SBarry Smith for (i = 0; i < numValues; i++) perm[i] = i; 1779566063dSJacob Faibussowitsch PetscCall(PetscSortRealWithPermutation(numValues, values, perm)); 17851fa3d41SBarry Smith if (bar->sorttolerance) { 17951fa3d41SBarry Smith for (i = 0; i < numValues; i++) { 18051fa3d41SBarry Smith if (values[perm[numValues - i - 1]] < bar->sorttolerance) { 18151fa3d41SBarry Smith nplot = i; 18251fa3d41SBarry Smith break; 18351fa3d41SBarry Smith } 18451fa3d41SBarry Smith } 18551fa3d41SBarry Smith } 18651fa3d41SBarry Smith } 18751fa3d41SBarry Smith 1885b399a63SLisandro Dalcin draw = bar->win; 1899566063dSJacob Faibussowitsch PetscCall(PetscDrawCheckResizedWindow(draw)); 1909566063dSJacob Faibussowitsch PetscCall(PetscDrawClear(draw)); 191e118a51fSLisandro Dalcin 1929566063dSJacob Faibussowitsch PetscCall(PetscDrawAxisSetLimits(bar->axis, xmin, xmax, ymin, ymax)); 1939566063dSJacob Faibussowitsch PetscCall(PetscDrawAxisDraw(bar->axis)); 19451fa3d41SBarry Smith 195d0609cedSBarry Smith PetscDrawCollectiveBegin(draw); 196dd400576SPatrick Sanan if (rank == 0) { /* Draw bins */ 19751fa3d41SBarry Smith for (i = 0; i < nplot; i++) { 19851fa3d41SBarry Smith idx = (bar->sort ? perm[numValues - i - 1] : i); 199*6497c311SBarry Smith binLeft = xmin + (PetscReal)i; 200*6497c311SBarry Smith binRight = xmin + (PetscReal)i + 1; 2019566063dSJacob Faibussowitsch PetscCall(PetscDrawRectangle(draw, binLeft, ymin, binRight, values[idx], bcolor, bcolor, bcolor, bcolor)); 2029566063dSJacob Faibussowitsch PetscCall(PetscDrawLine(draw, binLeft, ymin, binLeft, values[idx], PETSC_DRAW_BLACK)); 2039566063dSJacob Faibussowitsch PetscCall(PetscDrawLine(draw, binRight, ymin, binRight, values[idx], PETSC_DRAW_BLACK)); 2049566063dSJacob Faibussowitsch PetscCall(PetscDrawLine(draw, binLeft, values[idx], binRight, values[idx], PETSC_DRAW_BLACK)); 20551fa3d41SBarry Smith if (labels) { 20651fa3d41SBarry Smith PetscReal h; 207*6497c311SBarry Smith 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)); 2203ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 22151fa3d41SBarry Smith } 22251fa3d41SBarry Smith 22357fd6651SLisandro Dalcin /*@ 224811af0c4SBarry Smith PetscDrawBarSave - Saves a drawn bar graph 22557fd6651SLisandro Dalcin 226c3339decSBarry Smith Collective 22757fd6651SLisandro Dalcin 2282fe279fdSBarry Smith Input Parameter: 22957fd6651SLisandro Dalcin . bar - The bar graph context 23057fd6651SLisandro Dalcin 23157fd6651SLisandro Dalcin Level: intermediate 23257fd6651SLisandro Dalcin 233aec76313SJacob Faibussowitsch .seealso: `PetscDrawSave()`, `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawBarGetDraw()`, `PetscDrawSetSave()`, `PetscDrawBarSetData()` 23457fd6651SLisandro Dalcin @*/ 235d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarSave(PetscDrawBar bar) 236d71ae5a4SJacob Faibussowitsch { 23757fd6651SLisandro Dalcin PetscFunctionBegin; 23857fd6651SLisandro Dalcin PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1); 2399566063dSJacob Faibussowitsch PetscCall(PetscDrawSave(bar->win)); 2403ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 24157fd6651SLisandro Dalcin } 24257fd6651SLisandro Dalcin 24351fa3d41SBarry Smith /*@ 24451fa3d41SBarry Smith PetscDrawBarSetColor - Sets the color the bars will be drawn with. 24551fa3d41SBarry Smith 246c3339decSBarry Smith Logically Collective 24751fa3d41SBarry Smith 24851fa3d41SBarry Smith Input Parameters: 24951fa3d41SBarry Smith + bar - The bar graph context 250811af0c4SBarry Smith - color - one of the colors defined in petscdraw.h or `PETSC_DRAW_ROTATE` to make each bar a 25151fa3d41SBarry Smith different color 25251fa3d41SBarry Smith 25351fa3d41SBarry Smith Level: intermediate 25451fa3d41SBarry Smith 255db781477SPatrick Sanan .seealso: `PetscDrawBarCreate()`, `PetscDrawBar`, `PetscDrawBarSetData()`, `PetscDrawBarDraw()`, `PetscDrawBarGetAxis()` 25651fa3d41SBarry Smith @*/ 257d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarSetColor(PetscDrawBar bar, int color) 258d71ae5a4SJacob Faibussowitsch { 25951fa3d41SBarry Smith PetscFunctionBegin; 26051fa3d41SBarry Smith PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1); 26151fa3d41SBarry Smith bar->color = color; 2623ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 26351fa3d41SBarry Smith } 26451fa3d41SBarry Smith 26551fa3d41SBarry Smith /*@ 266811af0c4SBarry Smith PetscDrawBarSort - Sorts the values before drawing the bar chart, the bars will be in ascending order from left to right 26751fa3d41SBarry Smith 268c3339decSBarry Smith Logically Collective 26951fa3d41SBarry Smith 27051fa3d41SBarry Smith Input Parameters: 27151fa3d41SBarry Smith + bar - The bar graph context 272811af0c4SBarry Smith . sort - `PETSC_TRUE` to sort the values 273a2b725a8SWilliam Gropp - tolerance - discard values less than tolerance 27451fa3d41SBarry Smith 27551fa3d41SBarry Smith Level: intermediate 27651fa3d41SBarry Smith 277aec76313SJacob Faibussowitsch .seealso: `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawBarSetData()`, `PetscDrawBarSetColor()`, `PetscDrawBarDraw()`, `PetscDrawBarGetAxis()` 27851fa3d41SBarry Smith @*/ 279d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarSort(PetscDrawBar bar, PetscBool sort, PetscReal tolerance) 280d71ae5a4SJacob Faibussowitsch { 28151fa3d41SBarry Smith PetscFunctionBegin; 28251fa3d41SBarry Smith PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1); 28351fa3d41SBarry Smith bar->sort = sort; 28451fa3d41SBarry Smith bar->sorttolerance = tolerance; 2853ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 28651fa3d41SBarry Smith } 28751fa3d41SBarry Smith 28851fa3d41SBarry Smith /*@ 28951fa3d41SBarry Smith PetscDrawBarSetLimits - Sets the axis limits for a bar graph. If more 29051fa3d41SBarry Smith points are added after this call, the limits will be adjusted to 29151fa3d41SBarry Smith include those additional points. 29251fa3d41SBarry Smith 293c3339decSBarry Smith Logically Collective 29451fa3d41SBarry Smith 29551fa3d41SBarry Smith Input Parameters: 29651fa3d41SBarry Smith + bar - The bar graph context 2972fe279fdSBarry Smith . y_min - The lower limit 2982fe279fdSBarry Smith - y_max - The upper limit 29951fa3d41SBarry Smith 30051fa3d41SBarry Smith Level: intermediate 30151fa3d41SBarry Smith 302aec76313SJacob Faibussowitsch .seealso: `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawBarGetAxis()`, `PetscDrawBarSetData()`, `PetscDrawBarDraw()` 30351fa3d41SBarry Smith @*/ 304d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarSetLimits(PetscDrawBar bar, PetscReal y_min, PetscReal y_max) 305d71ae5a4SJacob Faibussowitsch { 30651fa3d41SBarry Smith PetscFunctionBegin; 30751fa3d41SBarry Smith PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1); 30851fa3d41SBarry Smith bar->ymin = y_min; 30951fa3d41SBarry Smith bar->ymax = y_max; 3103ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 31151fa3d41SBarry Smith } 31251fa3d41SBarry Smith 313cc4c1da9SBarry Smith /*@ 31451fa3d41SBarry Smith PetscDrawBarGetAxis - Gets the axis context associated with a bar graph. 31551fa3d41SBarry Smith This is useful if one wants to change some axis property, such as 31651fa3d41SBarry Smith labels, color, etc. The axis context should not be destroyed by the 31751fa3d41SBarry Smith application code. 31851fa3d41SBarry Smith 319811af0c4SBarry Smith Not Collective, axis is parallel if bar is parallel 32051fa3d41SBarry Smith 32151fa3d41SBarry Smith Input Parameter: 32251fa3d41SBarry Smith . bar - The bar graph context 32351fa3d41SBarry Smith 32451fa3d41SBarry Smith Output Parameter: 32551fa3d41SBarry Smith . axis - The axis context 32651fa3d41SBarry Smith 32751fa3d41SBarry Smith Level: intermediate 32851fa3d41SBarry Smith 329aec76313SJacob Faibussowitsch .seealso: `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawAxis`, `PetscDrawAxisCreate()` 33051fa3d41SBarry Smith @*/ 331d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarGetAxis(PetscDrawBar bar, PetscDrawAxis *axis) 332d71ae5a4SJacob Faibussowitsch { 33351fa3d41SBarry Smith PetscFunctionBegin; 334e118a51fSLisandro Dalcin PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1); 3354f572ea9SToby Isaac PetscAssertPointer(axis, 2); 33651fa3d41SBarry Smith *axis = bar->axis; 3373ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 33851fa3d41SBarry Smith } 33951fa3d41SBarry Smith 340cc4c1da9SBarry Smith /*@ 34151fa3d41SBarry Smith PetscDrawBarGetDraw - Gets the draw context associated with a bar graph. 34251fa3d41SBarry Smith 343811af0c4SBarry Smith Not Collective, draw is parallel if bar is parallel 34451fa3d41SBarry Smith 34551fa3d41SBarry Smith Input Parameter: 34651fa3d41SBarry Smith . bar - The bar graph context 34751fa3d41SBarry Smith 34851fa3d41SBarry Smith Output Parameter: 349e118a51fSLisandro Dalcin . draw - The draw context 35051fa3d41SBarry Smith 35151fa3d41SBarry Smith Level: intermediate 35251fa3d41SBarry Smith 353aec76313SJacob Faibussowitsch .seealso: `PetscDrawBar`, `PetscDraw`, `PetscDrawBarCreate()`, `PetscDrawBarDraw()` 35451fa3d41SBarry Smith @*/ 355d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarGetDraw(PetscDrawBar bar, PetscDraw *draw) 356d71ae5a4SJacob Faibussowitsch { 35751fa3d41SBarry Smith PetscFunctionBegin; 35851fa3d41SBarry Smith PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1); 3594f572ea9SToby Isaac PetscAssertPointer(draw, 2); 360e118a51fSLisandro Dalcin *draw = bar->win; 3613ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 36251fa3d41SBarry Smith } 36351fa3d41SBarry Smith 36451fa3d41SBarry Smith /*@ 365811af0c4SBarry Smith PetscDrawBarSetFromOptions - Sets options related to the display of the `PetscDrawBar` 36651fa3d41SBarry Smith 3678f14a041SBarry Smith Collective 36851fa3d41SBarry Smith 36910450e9eSJacob Faibussowitsch Input Parameter: 37010450e9eSJacob Faibussowitsch . bar - the bar graph context 37110450e9eSJacob Faibussowitsch 372811af0c4SBarry Smith Options Database Key: 37351fa3d41SBarry Smith . -bar_sort - sort the entries before drawing the bar graph 37451fa3d41SBarry Smith 37551fa3d41SBarry Smith Level: intermediate 37651fa3d41SBarry Smith 377811af0c4SBarry Smith Note: 378811af0c4SBarry Smith Does not set options related to the underlying `PetscDraw` or `PetscDrawAxis` 379811af0c4SBarry Smith 380811af0c4SBarry Smith .seealso: `PetscDrawBar`, `PetscDrawBarDestroy()`, `PetscDrawBarCreate()`, `PetscDrawBarSort()` 38151fa3d41SBarry Smith @*/ 382d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawBarSetFromOptions(PetscDrawBar bar) 383d71ae5a4SJacob Faibussowitsch { 38451fa3d41SBarry Smith PetscBool set; 38551fa3d41SBarry Smith 38651fa3d41SBarry Smith PetscFunctionBegin; 387e118a51fSLisandro Dalcin PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1); 388e118a51fSLisandro Dalcin 3899566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(((PetscObject)bar)->options, ((PetscObject)bar)->prefix, "-bar_sort", &set)); 39051fa3d41SBarry Smith if (set) { 391e118a51fSLisandro Dalcin PetscReal tol = bar->sorttolerance; 3929566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetReal(((PetscObject)bar)->options, ((PetscObject)bar)->prefix, "-bar_sort", &tol, NULL)); 3939566063dSJacob Faibussowitsch PetscCall(PetscDrawBarSort(bar, PETSC_TRUE, tol)); 39451fa3d41SBarry Smith } 3953ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 39651fa3d41SBarry Smith } 397