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 1451fa3d41SBarry Smith Collective over PetscDraw 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: 2395452b02SPatrick Sanan Call PetscDrawBarSetData() to provide the bins to be plotted and then PetscDrawBarDraw() to display the new plot 240afdd333SBarry Smith 25a8d69d7bSBarry 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 277e25d57eSBarry 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 287e25d57eSBarry Smith zeroth MPI process in the communicator. All MPI processes in the communicator must call PetscDrawBarDraw() to display the updated graph. 290afdd333SBarry Smith 3051fa3d41SBarry Smith Level: intermediate 3151fa3d41SBarry Smith 32db781477SPatrick Sanan .seealso: `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 665b399a63SLisandro Dalcin Logically Collective on PetscDrawBar 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: 7795452b02SPatrick Sanan Call PetscDrawBarDraw() after this call to display the new plot 780afdd333SBarry Smith 79db781477SPatrick Sanan .seealso: `PetscDrawBarCreate()`, `PetscDrawBar`, `PetscDrawBarDraw()` 8051fa3d41SBarry Smith 8151fa3d41SBarry Smith @*/ 829371c9d4SSatish Balay PetscErrorCode PetscDrawBarSetData(PetscDrawBar bar, PetscInt bins, const PetscReal data[], const char *const *labels) { 8351fa3d41SBarry Smith PetscFunctionBegin; 8451fa3d41SBarry Smith PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1); 85e118a51fSLisandro Dalcin 8651fa3d41SBarry Smith if (bar->numBins != bins) { 879566063dSJacob Faibussowitsch PetscCall(PetscFree(bar->values)); 889566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(bins, &bar->values)); 8951fa3d41SBarry Smith bar->numBins = bins; 9051fa3d41SBarry Smith } 919566063dSJacob Faibussowitsch PetscCall(PetscArraycpy(bar->values, data, bins)); 9251fa3d41SBarry Smith bar->numBins = bins; 93*48a46eb9SPierre Jolivet if (labels) PetscCall(PetscStrArrayallocpy(labels, &bar->labels)); 9451fa3d41SBarry Smith PetscFunctionReturn(0); 9551fa3d41SBarry Smith } 9651fa3d41SBarry Smith 9751fa3d41SBarry Smith /*@C 9851fa3d41SBarry Smith PetscDrawBarDestroy - Frees all space taken up by bar graph data structure. 9951fa3d41SBarry Smith 10051fa3d41SBarry Smith Collective over PetscDrawBar 10151fa3d41SBarry Smith 10251fa3d41SBarry Smith Input Parameter: 10351fa3d41SBarry Smith . bar - The bar graph context 10451fa3d41SBarry Smith 10551fa3d41SBarry Smith Level: intermediate 10651fa3d41SBarry Smith 107db781477SPatrick Sanan .seealso: `PetscDrawBarCreate()` 10851fa3d41SBarry Smith @*/ 1099371c9d4SSatish Balay PetscErrorCode PetscDrawBarDestroy(PetscDrawBar *bar) { 11051fa3d41SBarry Smith PetscFunctionBegin; 11151fa3d41SBarry Smith if (!*bar) PetscFunctionReturn(0); 112e118a51fSLisandro Dalcin PetscValidHeaderSpecific(*bar, PETSC_DRAWBAR_CLASSID, 1); 11351fa3d41SBarry Smith if (--((PetscObject)(*bar))->refct > 0) PetscFunctionReturn(0); 114e118a51fSLisandro Dalcin 1159566063dSJacob Faibussowitsch PetscCall(PetscFree((*bar)->values)); 1169566063dSJacob Faibussowitsch PetscCall(PetscStrArrayDestroy(&(*bar)->labels)); 1179566063dSJacob Faibussowitsch PetscCall(PetscDrawAxisDestroy(&(*bar)->axis)); 1189566063dSJacob Faibussowitsch PetscCall(PetscDrawDestroy(&(*bar)->win)); 1199566063dSJacob Faibussowitsch PetscCall(PetscHeaderDestroy(bar)); 12051fa3d41SBarry Smith PetscFunctionReturn(0); 12151fa3d41SBarry Smith } 12251fa3d41SBarry Smith 12351fa3d41SBarry Smith /*@ 12451fa3d41SBarry Smith PetscDrawBarDraw - Redraws a bar graph. 12551fa3d41SBarry Smith 1265b399a63SLisandro Dalcin Collective on PetscDrawBar 12751fa3d41SBarry Smith 12851fa3d41SBarry Smith Input Parameter: 12951fa3d41SBarry Smith . bar - The bar graph context 13051fa3d41SBarry Smith 13151fa3d41SBarry Smith Level: intermediate 13251fa3d41SBarry Smith 133db781477SPatrick Sanan .seealso: `PetscDrawBar`, `PetscDrawBarCreate()`, `PetscDrawBarSetData()` 1340afdd333SBarry Smith 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 /*@ 22457fd6651SLisandro Dalcin PetscDrawBarSave - Saves a drawn image 22557fd6651SLisandro Dalcin 22657fd6651SLisandro Dalcin Collective on PetscDrawBar 22757fd6651SLisandro Dalcin 22857fd6651SLisandro Dalcin Input Parameters: 22957fd6651SLisandro Dalcin . bar - The bar graph context 23057fd6651SLisandro Dalcin 23157fd6651SLisandro Dalcin Level: intermediate 23257fd6651SLisandro Dalcin 233db781477SPatrick Sanan .seealso: `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 2455b399a63SLisandro Dalcin Logically Collective on PetscDrawBar 24651fa3d41SBarry Smith 24751fa3d41SBarry Smith Input Parameters: 24851fa3d41SBarry Smith + bar - The bar graph context 24951fa3d41SBarry 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()` 2550afdd333SBarry Smith 25651fa3d41SBarry Smith @*/ 2579371c9d4SSatish Balay PetscErrorCode PetscDrawBarSetColor(PetscDrawBar bar, int color) { 25851fa3d41SBarry Smith PetscFunctionBegin; 25951fa3d41SBarry Smith PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1); 26051fa3d41SBarry Smith bar->color = color; 26151fa3d41SBarry Smith PetscFunctionReturn(0); 26251fa3d41SBarry Smith } 26351fa3d41SBarry Smith 26451fa3d41SBarry Smith /*@ 26551fa3d41SBarry Smith PetscDrawBarSort - Sorts the values before drawing the bar chart 26651fa3d41SBarry Smith 2675b399a63SLisandro Dalcin Logically Collective on PetscDrawBar 26851fa3d41SBarry Smith 26951fa3d41SBarry Smith Input Parameters: 27051fa3d41SBarry Smith + bar - The bar graph context 27151fa3d41SBarry Smith . sort - PETSC_TRUE to sort the values 272a2b725a8SWilliam Gropp - tolerance - discard values less than tolerance 27351fa3d41SBarry Smith 27451fa3d41SBarry Smith Level: intermediate 27551fa3d41SBarry Smith 276db781477SPatrick Sanan .seealso: `PetscDrawBarCreate()`, `PetscDrawBar`, `PetscDrawBarSetData()`, `PetscDrawBarSetColor()`, `PetscDrawBarDraw()`, `PetscDrawBarGetAxis()` 27751fa3d41SBarry Smith @*/ 2789371c9d4SSatish Balay PetscErrorCode PetscDrawBarSort(PetscDrawBar bar, PetscBool sort, PetscReal tolerance) { 27951fa3d41SBarry Smith PetscFunctionBegin; 28051fa3d41SBarry Smith PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1); 28151fa3d41SBarry Smith bar->sort = sort; 28251fa3d41SBarry Smith bar->sorttolerance = tolerance; 28351fa3d41SBarry Smith PetscFunctionReturn(0); 28451fa3d41SBarry Smith } 28551fa3d41SBarry Smith 28651fa3d41SBarry Smith /*@ 28751fa3d41SBarry Smith PetscDrawBarSetLimits - Sets the axis limits for a bar graph. If more 28851fa3d41SBarry Smith points are added after this call, the limits will be adjusted to 28951fa3d41SBarry Smith include those additional points. 29051fa3d41SBarry Smith 2915b399a63SLisandro Dalcin Logically Collective on PetscDrawBar 29251fa3d41SBarry Smith 29351fa3d41SBarry Smith Input Parameters: 29451fa3d41SBarry Smith + bar - The bar graph context 29551fa3d41SBarry Smith - y_min,y_max - The limits 29651fa3d41SBarry Smith 29751fa3d41SBarry Smith Level: intermediate 29851fa3d41SBarry Smith 299db781477SPatrick Sanan .seealso: `PetscDrawBarCreate()`, `PetscDrawBar`, `PetscDrawBarGetAxis()`, `PetscDrawBarSetData()`, `PetscDrawBarDraw()` 30051fa3d41SBarry Smith @*/ 3019371c9d4SSatish Balay PetscErrorCode PetscDrawBarSetLimits(PetscDrawBar bar, PetscReal y_min, PetscReal y_max) { 30251fa3d41SBarry Smith PetscFunctionBegin; 30351fa3d41SBarry Smith PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1); 30451fa3d41SBarry Smith bar->ymin = y_min; 30551fa3d41SBarry Smith bar->ymax = y_max; 30651fa3d41SBarry Smith PetscFunctionReturn(0); 30751fa3d41SBarry Smith } 30851fa3d41SBarry Smith 30951fa3d41SBarry Smith /*@C 31051fa3d41SBarry Smith PetscDrawBarGetAxis - Gets the axis context associated with a bar graph. 31151fa3d41SBarry Smith This is useful if one wants to change some axis property, such as 31251fa3d41SBarry Smith labels, color, etc. The axis context should not be destroyed by the 31351fa3d41SBarry Smith application code. 31451fa3d41SBarry Smith 3155b399a63SLisandro Dalcin Not Collective, PetscDrawAxis is parallel if PetscDrawBar is parallel 31651fa3d41SBarry Smith 31751fa3d41SBarry Smith Input Parameter: 31851fa3d41SBarry Smith . bar - The bar graph context 31951fa3d41SBarry Smith 32051fa3d41SBarry Smith Output Parameter: 32151fa3d41SBarry Smith . axis - The axis context 32251fa3d41SBarry Smith 32351fa3d41SBarry Smith Level: intermediate 32451fa3d41SBarry Smith 325db781477SPatrick Sanan .seealso: `PetscDrawBarCreate()`, `PetscDrawBar`, `PetscDrawAxis`, `PetscDrawAxisCreate()` 32651fa3d41SBarry Smith @*/ 3279371c9d4SSatish Balay PetscErrorCode PetscDrawBarGetAxis(PetscDrawBar bar, PetscDrawAxis *axis) { 32851fa3d41SBarry Smith PetscFunctionBegin; 329e118a51fSLisandro Dalcin PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1); 33045f3bb6eSLisandro Dalcin PetscValidPointer(axis, 2); 33151fa3d41SBarry Smith *axis = bar->axis; 33251fa3d41SBarry Smith PetscFunctionReturn(0); 33351fa3d41SBarry Smith } 33451fa3d41SBarry Smith 33551fa3d41SBarry Smith /*@C 33651fa3d41SBarry Smith PetscDrawBarGetDraw - Gets the draw context associated with a bar graph. 33751fa3d41SBarry Smith 33851fa3d41SBarry Smith Not Collective, PetscDraw is parallel if PetscDrawBar is parallel 33951fa3d41SBarry Smith 34051fa3d41SBarry Smith Input Parameter: 34151fa3d41SBarry Smith . bar - The bar graph context 34251fa3d41SBarry Smith 34351fa3d41SBarry Smith Output Parameter: 344e118a51fSLisandro Dalcin . draw - The draw context 34551fa3d41SBarry Smith 34651fa3d41SBarry Smith Level: intermediate 34751fa3d41SBarry Smith 348db781477SPatrick Sanan .seealso: `PetscDrawBarCreate()`, `PetscDrawBar`, `PetscDrawBarDraw()`, `PetscDraw` 34951fa3d41SBarry Smith @*/ 3509371c9d4SSatish Balay PetscErrorCode PetscDrawBarGetDraw(PetscDrawBar bar, PetscDraw *draw) { 35151fa3d41SBarry Smith PetscFunctionBegin; 35251fa3d41SBarry Smith PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1); 35345f3bb6eSLisandro Dalcin PetscValidPointer(draw, 2); 354e118a51fSLisandro Dalcin *draw = bar->win; 35551fa3d41SBarry Smith PetscFunctionReturn(0); 35651fa3d41SBarry Smith } 35751fa3d41SBarry Smith 35851fa3d41SBarry Smith /*@ 35951fa3d41SBarry Smith PetscDrawBarSetFromOptions - Sets options related to the PetscDrawBar 36051fa3d41SBarry Smith 36151fa3d41SBarry Smith Collective over PetscDrawBar 36251fa3d41SBarry Smith 36351fa3d41SBarry Smith Options Database: 36451fa3d41SBarry Smith . -bar_sort - sort the entries before drawing the bar graph 36551fa3d41SBarry Smith 36651fa3d41SBarry Smith Level: intermediate 36751fa3d41SBarry Smith 368db781477SPatrick Sanan .seealso: `PetscDrawBarDestroy()`, `PetscDrawBarCreate()`, `PetscDrawBarSort()` 36951fa3d41SBarry Smith @*/ 3709371c9d4SSatish Balay PetscErrorCode PetscDrawBarSetFromOptions(PetscDrawBar bar) { 37151fa3d41SBarry Smith PetscBool set; 37251fa3d41SBarry Smith 37351fa3d41SBarry Smith PetscFunctionBegin; 374e118a51fSLisandro Dalcin PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID, 1); 375e118a51fSLisandro Dalcin 3769566063dSJacob Faibussowitsch PetscCall(PetscOptionsHasName(((PetscObject)bar)->options, ((PetscObject)bar)->prefix, "-bar_sort", &set)); 37751fa3d41SBarry Smith if (set) { 378e118a51fSLisandro Dalcin PetscReal tol = bar->sorttolerance; 3799566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetReal(((PetscObject)bar)->options, ((PetscObject)bar)->prefix, "-bar_sort", &tol, NULL)); 3809566063dSJacob Faibussowitsch PetscCall(PetscDrawBarSort(bar, PETSC_TRUE, tol)); 38151fa3d41SBarry Smith } 38251fa3d41SBarry Smith PetscFunctionReturn(0); 38351fa3d41SBarry Smith } 384