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