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 14*811af0c4SBarry 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: 23*811af0c4SBarry Smith Call `PetscDrawBarSetData()` to provide the bins to be plotted and then `PetscDrawBarDraw()` to display the new plot 240afdd333SBarry Smith 25*811af0c4SBarry 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 27*811af0c4SBarry 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 28*811af0c4SBarry 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 32*811af0c4SBarry 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 @*/ 369371c9d4SSatish Balay PetscErrorCode PetscDrawBarCreate(PetscDraw draw, PetscDrawBar *bar) { 3751fa3d41SBarry Smith PetscDrawBar h; 3851fa3d41SBarry Smith 3951fa3d41SBarry Smith PetscFunctionBegin; 4051fa3d41SBarry Smith PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 4173107ff1SLisandro Dalcin PetscValidPointer(bar, 2); 42e118a51fSLisandro Dalcin 439566063dSJacob Faibussowitsch PetscCall(PetscHeaderCreate(h, PETSC_DRAWBAR_CLASSID, "DrawBar", "Bar Graph", "Draw", PetscObjectComm((PetscObject)draw), PetscDrawBarDestroy, NULL)); 449566063dSJacob Faibussowitsch PetscCall(PetscLogObjectParent((PetscObject)draw, (PetscObject)h)); 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*811af0c4SBarry Smith Logically Collective on bar 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: 77*811af0c4SBarry Smith Call `PetscDrawBarDraw()` after this call to display the new plot 780afdd333SBarry Smith 79*811af0c4SBarry Smith The data is ignored on all ranks except zero 8051fa3d41SBarry Smith 81*811af0c4SBarry Smith .seealso: `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawBar`, `PetscDrawBarDraw()` 8251fa3d41SBarry Smith @*/ 839371c9d4SSatish Balay PetscErrorCode PetscDrawBarSetData(PetscDrawBar bar, PetscInt bins, const PetscReal data[], const char *const *labels) { 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)); 9551fa3d41SBarry Smith PetscFunctionReturn(0); 9651fa3d41SBarry Smith } 9751fa3d41SBarry Smith 9851fa3d41SBarry Smith /*@C 9951fa3d41SBarry Smith PetscDrawBarDestroy - Frees all space taken up by bar graph data structure. 10051fa3d41SBarry Smith 101*811af0c4SBarry Smith Collective over bar 10251fa3d41SBarry Smith 10351fa3d41SBarry Smith Input Parameter: 10451fa3d41SBarry Smith . bar - The bar graph context 10551fa3d41SBarry Smith 10651fa3d41SBarry Smith Level: intermediate 10751fa3d41SBarry Smith 108*811af0c4SBarry Smith .seealso: `PetscDrawBar`, `PetscDrawBarCreate()` 10951fa3d41SBarry Smith @*/ 1109371c9d4SSatish Balay PetscErrorCode PetscDrawBarDestroy(PetscDrawBar *bar) { 11151fa3d41SBarry Smith PetscFunctionBegin; 11251fa3d41SBarry Smith if (!*bar) PetscFunctionReturn(0); 113e118a51fSLisandro Dalcin PetscValidHeaderSpecific(*bar, PETSC_DRAWBAR_CLASSID, 1); 11451fa3d41SBarry Smith if (--((PetscObject)(*bar))->refct > 0) PetscFunctionReturn(0); 115e118a51fSLisandro Dalcin 1169566063dSJacob Faibussowitsch PetscCall(PetscFree((*bar)->values)); 1179566063dSJacob Faibussowitsch PetscCall(PetscStrArrayDestroy(&(*bar)->labels)); 1189566063dSJacob Faibussowitsch PetscCall(PetscDrawAxisDestroy(&(*bar)->axis)); 1199566063dSJacob Faibussowitsch PetscCall(PetscDrawDestroy(&(*bar)->win)); 1209566063dSJacob Faibussowitsch PetscCall(PetscHeaderDestroy(bar)); 12151fa3d41SBarry Smith PetscFunctionReturn(0); 12251fa3d41SBarry Smith } 12351fa3d41SBarry Smith 12451fa3d41SBarry Smith /*@ 12551fa3d41SBarry Smith PetscDrawBarDraw - Redraws a bar graph. 12651fa3d41SBarry Smith 127*811af0c4SBarry Smith Collective on bar 12851fa3d41SBarry Smith 12951fa3d41SBarry Smith Input Parameter: 13051fa3d41SBarry Smith . bar - The bar graph context 13151fa3d41SBarry Smith 13251fa3d41SBarry Smith Level: intermediate 13351fa3d41SBarry Smith 134db781477SPatrick Sanan .seealso: `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawBarSetData()` 13551fa3d41SBarry Smith @*/ 1369371c9d4SSatish Balay PetscErrorCode PetscDrawBarDraw(PetscDrawBar bar) { 137e118a51fSLisandro Dalcin PetscDraw draw; 13851fa3d41SBarry Smith PetscBool isnull; 13951fa3d41SBarry Smith PetscReal xmin, xmax, ymin, ymax, *values, binLeft, binRight; 14051fa3d41SBarry Smith PetscInt numValues, i, bcolor, color, idx, *perm, nplot; 141e118a51fSLisandro Dalcin PetscMPIInt rank; 14251fa3d41SBarry Smith char **labels; 14351fa3d41SBarry Smith 14451fa3d41SBarry Smith PetscFunctionBegin; 14551fa3d41SBarry Smith PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1); 1469566063dSJacob Faibussowitsch PetscCall(PetscDrawIsNull(bar->win, &isnull)); 1478f69470aSLisandro Dalcin if (isnull) PetscFunctionReturn(0); 1489566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)bar), &rank)); 14951fa3d41SBarry Smith 1505b399a63SLisandro Dalcin if (bar->numBins < 1) PetscFunctionReturn(0); 1515b399a63SLisandro Dalcin 15251fa3d41SBarry Smith color = bar->color; 15371917b75SLisandro Dalcin if (color == PETSC_DRAW_ROTATE) bcolor = PETSC_DRAW_BLACK + 1; 15451fa3d41SBarry Smith else bcolor = color; 15551fa3d41SBarry Smith 15651fa3d41SBarry Smith numValues = bar->numBins; 15751fa3d41SBarry Smith values = bar->values; 15851fa3d41SBarry Smith if (bar->ymin == bar->ymax) { 15951fa3d41SBarry Smith /* user has not set bounds on bars so set them based on the data */ 16051fa3d41SBarry Smith ymin = PETSC_MAX_REAL; 16151fa3d41SBarry Smith ymax = PETSC_MIN_REAL; 16251fa3d41SBarry Smith for (i = 0; i < numValues; i++) { 16351fa3d41SBarry Smith ymin = PetscMin(ymin, values[i]); 16451fa3d41SBarry Smith ymax = PetscMax(ymax, values[i]); 16551fa3d41SBarry Smith } 16651fa3d41SBarry Smith } else { 16751fa3d41SBarry Smith ymin = bar->ymin; 16851fa3d41SBarry Smith ymax = bar->ymax; 16951fa3d41SBarry Smith } 17051fa3d41SBarry Smith nplot = numValues; /* number of points to actually plot; if some are lower than requested tolerance */ 17151fa3d41SBarry Smith xmin = 0.0; 172e118a51fSLisandro Dalcin xmax = nplot; 17351fa3d41SBarry Smith labels = bar->labels; 17451fa3d41SBarry Smith 17551fa3d41SBarry Smith if (bar->sort) { 1769566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(numValues, &perm)); 17751fa3d41SBarry Smith for (i = 0; i < numValues; i++) perm[i] = i; 1789566063dSJacob Faibussowitsch PetscCall(PetscSortRealWithPermutation(numValues, values, perm)); 17951fa3d41SBarry Smith if (bar->sorttolerance) { 18051fa3d41SBarry Smith for (i = 0; i < numValues; i++) { 18151fa3d41SBarry Smith if (values[perm[numValues - i - 1]] < bar->sorttolerance) { 18251fa3d41SBarry Smith nplot = i; 18351fa3d41SBarry Smith break; 18451fa3d41SBarry Smith } 18551fa3d41SBarry Smith } 18651fa3d41SBarry Smith } 18751fa3d41SBarry Smith } 18851fa3d41SBarry Smith 1895b399a63SLisandro Dalcin draw = bar->win; 1909566063dSJacob Faibussowitsch PetscCall(PetscDrawCheckResizedWindow(draw)); 1919566063dSJacob Faibussowitsch PetscCall(PetscDrawClear(draw)); 192e118a51fSLisandro Dalcin 1939566063dSJacob Faibussowitsch PetscCall(PetscDrawAxisSetLimits(bar->axis, xmin, xmax, ymin, ymax)); 1949566063dSJacob Faibussowitsch PetscCall(PetscDrawAxisDraw(bar->axis)); 19551fa3d41SBarry Smith 196d0609cedSBarry Smith PetscDrawCollectiveBegin(draw); 197dd400576SPatrick Sanan if (rank == 0) { /* Draw bins */ 19851fa3d41SBarry Smith for (i = 0; i < nplot; i++) { 19951fa3d41SBarry Smith idx = (bar->sort ? perm[numValues - i - 1] : i); 20051fa3d41SBarry Smith binLeft = xmin + i; 20151fa3d41SBarry Smith binRight = xmin + i + 1; 2029566063dSJacob Faibussowitsch PetscCall(PetscDrawRectangle(draw, binLeft, ymin, binRight, values[idx], bcolor, bcolor, bcolor, bcolor)); 2039566063dSJacob Faibussowitsch PetscCall(PetscDrawLine(draw, binLeft, ymin, binLeft, values[idx], PETSC_DRAW_BLACK)); 2049566063dSJacob Faibussowitsch PetscCall(PetscDrawLine(draw, binRight, ymin, binRight, values[idx], PETSC_DRAW_BLACK)); 2059566063dSJacob Faibussowitsch PetscCall(PetscDrawLine(draw, binLeft, values[idx], binRight, values[idx], PETSC_DRAW_BLACK)); 20651fa3d41SBarry Smith if (labels) { 20751fa3d41SBarry Smith PetscReal h; 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)); 22051fa3d41SBarry Smith PetscFunctionReturn(0); 22151fa3d41SBarry Smith } 22251fa3d41SBarry Smith 22357fd6651SLisandro Dalcin /*@ 224*811af0c4SBarry Smith PetscDrawBarSave - Saves a drawn bar graph 22557fd6651SLisandro Dalcin 226*811af0c4SBarry Smith Collective on bar 22757fd6651SLisandro Dalcin 22857fd6651SLisandro Dalcin Input Parameters: 22957fd6651SLisandro Dalcin . bar - The bar graph context 23057fd6651SLisandro Dalcin 23157fd6651SLisandro Dalcin Level: intermediate 23257fd6651SLisandro Dalcin 233*811af0c4SBarry Smith .seealso: `PetscDrawSave()`, `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawBarGetDraw()`, `PetscDrawSetSave()`, `PetscDrawSave()`, `PetscDrawBarSetData()` 23457fd6651SLisandro Dalcin @*/ 2359371c9d4SSatish Balay PetscErrorCode PetscDrawBarSave(PetscDrawBar bar) { 23657fd6651SLisandro Dalcin PetscFunctionBegin; 23757fd6651SLisandro Dalcin PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1); 2389566063dSJacob Faibussowitsch PetscCall(PetscDrawSave(bar->win)); 23957fd6651SLisandro Dalcin PetscFunctionReturn(0); 24057fd6651SLisandro Dalcin } 24157fd6651SLisandro Dalcin 24251fa3d41SBarry Smith /*@ 24351fa3d41SBarry Smith PetscDrawBarSetColor - Sets the color the bars will be drawn with. 24451fa3d41SBarry Smith 245*811af0c4SBarry Smith Logically Collective on bar 24651fa3d41SBarry Smith 24751fa3d41SBarry Smith Input Parameters: 24851fa3d41SBarry Smith + bar - The bar graph context 249*811af0c4SBarry 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 @*/ 2569371c9d4SSatish Balay PetscErrorCode PetscDrawBarSetColor(PetscDrawBar bar, int color) { 25751fa3d41SBarry Smith PetscFunctionBegin; 25851fa3d41SBarry Smith PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1); 25951fa3d41SBarry Smith bar->color = color; 26051fa3d41SBarry Smith PetscFunctionReturn(0); 26151fa3d41SBarry Smith } 26251fa3d41SBarry Smith 26351fa3d41SBarry Smith /*@ 264*811af0c4SBarry Smith PetscDrawBarSort - Sorts the values before drawing the bar chart, the bars will be in ascending order from left to right 26551fa3d41SBarry Smith 266*811af0c4SBarry Smith Logically Collective on bar 26751fa3d41SBarry Smith 26851fa3d41SBarry Smith Input Parameters: 26951fa3d41SBarry Smith + bar - The bar graph context 270*811af0c4SBarry Smith . sort - `PETSC_TRUE` to sort the values 271a2b725a8SWilliam Gropp - tolerance - discard values less than tolerance 27251fa3d41SBarry Smith 27351fa3d41SBarry Smith Level: intermediate 27451fa3d41SBarry Smith 275*811af0c4SBarry Smith .seealso: `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawBar`, `PetscDrawBarSetData()`, `PetscDrawBarSetColor()`, `PetscDrawBarDraw()`, `PetscDrawBarGetAxis()` 27651fa3d41SBarry Smith @*/ 2779371c9d4SSatish Balay PetscErrorCode PetscDrawBarSort(PetscDrawBar bar, PetscBool sort, PetscReal tolerance) { 27851fa3d41SBarry Smith PetscFunctionBegin; 27951fa3d41SBarry Smith PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1); 28051fa3d41SBarry Smith bar->sort = sort; 28151fa3d41SBarry Smith bar->sorttolerance = tolerance; 28251fa3d41SBarry Smith PetscFunctionReturn(0); 28351fa3d41SBarry Smith } 28451fa3d41SBarry Smith 28551fa3d41SBarry Smith /*@ 28651fa3d41SBarry Smith PetscDrawBarSetLimits - Sets the axis limits for a bar graph. If more 28751fa3d41SBarry Smith points are added after this call, the limits will be adjusted to 28851fa3d41SBarry Smith include those additional points. 28951fa3d41SBarry Smith 290*811af0c4SBarry Smith Logically Collective on bar 29151fa3d41SBarry Smith 29251fa3d41SBarry Smith Input Parameters: 29351fa3d41SBarry Smith + bar - The bar graph context 29451fa3d41SBarry Smith - y_min,y_max - The limits 29551fa3d41SBarry Smith 29651fa3d41SBarry Smith Level: intermediate 29751fa3d41SBarry Smith 298*811af0c4SBarry Smith .seealso: `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawBar`, `PetscDrawBarGetAxis()`, `PetscDrawBarSetData()`, `PetscDrawBarDraw()` 29951fa3d41SBarry Smith @*/ 3009371c9d4SSatish Balay PetscErrorCode PetscDrawBarSetLimits(PetscDrawBar bar, PetscReal y_min, PetscReal y_max) { 30151fa3d41SBarry Smith PetscFunctionBegin; 30251fa3d41SBarry Smith PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1); 30351fa3d41SBarry Smith bar->ymin = y_min; 30451fa3d41SBarry Smith bar->ymax = y_max; 30551fa3d41SBarry Smith PetscFunctionReturn(0); 30651fa3d41SBarry Smith } 30751fa3d41SBarry Smith 30851fa3d41SBarry Smith /*@C 30951fa3d41SBarry Smith PetscDrawBarGetAxis - Gets the axis context associated with a bar graph. 31051fa3d41SBarry Smith This is useful if one wants to change some axis property, such as 31151fa3d41SBarry Smith labels, color, etc. The axis context should not be destroyed by the 31251fa3d41SBarry Smith application code. 31351fa3d41SBarry Smith 314*811af0c4SBarry Smith Not Collective, axis is parallel if bar is parallel 31551fa3d41SBarry Smith 31651fa3d41SBarry Smith Input Parameter: 31751fa3d41SBarry Smith . bar - The bar graph context 31851fa3d41SBarry Smith 31951fa3d41SBarry Smith Output Parameter: 32051fa3d41SBarry Smith . axis - The axis context 32151fa3d41SBarry Smith 32251fa3d41SBarry Smith Level: intermediate 32351fa3d41SBarry Smith 324*811af0c4SBarry Smith .seealso: `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawBar`, `PetscDrawAxis`, `PetscDrawAxisCreate()` 32551fa3d41SBarry Smith @*/ 3269371c9d4SSatish Balay PetscErrorCode PetscDrawBarGetAxis(PetscDrawBar bar, PetscDrawAxis *axis) { 32751fa3d41SBarry Smith PetscFunctionBegin; 328e118a51fSLisandro Dalcin PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1); 32945f3bb6eSLisandro Dalcin PetscValidPointer(axis, 2); 33051fa3d41SBarry Smith *axis = bar->axis; 33151fa3d41SBarry Smith PetscFunctionReturn(0); 33251fa3d41SBarry Smith } 33351fa3d41SBarry Smith 33451fa3d41SBarry Smith /*@C 33551fa3d41SBarry Smith PetscDrawBarGetDraw - Gets the draw context associated with a bar graph. 33651fa3d41SBarry Smith 337*811af0c4SBarry Smith Not Collective, draw is parallel if bar is parallel 33851fa3d41SBarry Smith 33951fa3d41SBarry Smith Input Parameter: 34051fa3d41SBarry Smith . bar - The bar graph context 34151fa3d41SBarry Smith 34251fa3d41SBarry Smith Output Parameter: 343e118a51fSLisandro Dalcin . draw - The draw context 34451fa3d41SBarry Smith 34551fa3d41SBarry Smith Level: intermediate 34651fa3d41SBarry Smith 347*811af0c4SBarry Smith .seealso: `PetscDrawBar`, `PetscDraw`, `PetscDrawBarCreate()`, `PetscDrawBar`, `PetscDrawBarDraw()`, `PetscDraw` 34851fa3d41SBarry Smith @*/ 3499371c9d4SSatish Balay PetscErrorCode PetscDrawBarGetDraw(PetscDrawBar bar, PetscDraw *draw) { 35051fa3d41SBarry Smith PetscFunctionBegin; 35151fa3d41SBarry Smith PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1); 35245f3bb6eSLisandro Dalcin PetscValidPointer(draw, 2); 353e118a51fSLisandro Dalcin *draw = bar->win; 35451fa3d41SBarry Smith PetscFunctionReturn(0); 35551fa3d41SBarry Smith } 35651fa3d41SBarry Smith 35751fa3d41SBarry Smith /*@ 358*811af0c4SBarry Smith PetscDrawBarSetFromOptions - Sets options related to the display of the `PetscDrawBar` 35951fa3d41SBarry Smith 360*811af0c4SBarry Smith Collective over bar 36151fa3d41SBarry Smith 362*811af0c4SBarry Smith Options Database Key: 36351fa3d41SBarry Smith . -bar_sort - sort the entries before drawing the bar graph 36451fa3d41SBarry Smith 36551fa3d41SBarry Smith Level: intermediate 36651fa3d41SBarry Smith 367*811af0c4SBarry Smith Note: 368*811af0c4SBarry Smith Does not set options related to the underlying `PetscDraw` or `PetscDrawAxis` 369*811af0c4SBarry Smith 370*811af0c4SBarry Smith .seealso: `PetscDrawBar`, `PetscDrawBarDestroy()`, `PetscDrawBarCreate()`, `PetscDrawBarSort()` 37151fa3d41SBarry Smith @*/ 3729371c9d4SSatish Balay PetscErrorCode PetscDrawBarSetFromOptions(PetscDrawBar bar) { 37351fa3d41SBarry Smith PetscBool set; 37451fa3d41SBarry Smith 37551fa3d41SBarry Smith PetscFunctionBegin; 376e118a51fSLisandro Dalcin PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1); 377e118a51fSLisandro Dalcin 3789566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(((PetscObject)bar)->options, ((PetscObject)bar)->prefix, "-bar_sort", &set)); 37951fa3d41SBarry Smith if (set) { 380e118a51fSLisandro Dalcin PetscReal tol = bar->sorttolerance; 3819566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetReal(((PetscObject)bar)->options, ((PetscObject)bar)->prefix, "-bar_sort", &tol, NULL)); 3829566063dSJacob Faibussowitsch PetscCall(PetscDrawBarSort(bar, PETSC_TRUE, tol)); 38351fa3d41SBarry Smith } 38451fa3d41SBarry Smith PetscFunctionReturn(0); 38551fa3d41SBarry Smith } 386