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 320afdd333SBarry Smith .seealso: PetscDrawLGCreate(), PetscDrawLG, PetscDrawSPCreate(), PetscDrawSP, PetscDrawHGCreate(), PetscDrawHG, PetscDrawBarDestroy(), PetscDrawBarSetData(), 330afdd333SBarry Smith PetscDrawBar, PetscDrawBarDraw(), PetscDrawBarSave(), PetscDrawBarSetColor(), PetscDrawBarSort(), PetscDrawBarSetLimits(), PetscDrawBarGetAxis(), PetscDrawAxis, 340afdd333SBarry Smith PetscDrawBarGetDraw(), PetscDrawBarSetFromOptions() 3551fa3d41SBarry Smith @*/ 3651fa3d41SBarry Smith PetscErrorCode PetscDrawBarCreate(PetscDraw draw,PetscDrawBar *bar) 3751fa3d41SBarry Smith { 3851fa3d41SBarry Smith PetscDrawBar h; 3951fa3d41SBarry Smith 4051fa3d41SBarry Smith PetscFunctionBegin; 4151fa3d41SBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 4273107ff1SLisandro Dalcin PetscValidPointer(bar,2); 43e118a51fSLisandro Dalcin 44*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscHeaderCreate(h,PETSC_DRAWBAR_CLASSID,"DrawBar","Bar Graph","Draw",PetscObjectComm((PetscObject)draw),PetscDrawBarDestroy,NULL)); 45*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscLogObjectParent((PetscObject)draw,(PetscObject)h)); 46e118a51fSLisandro Dalcin 47*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectReference((PetscObject)draw)); 48e118a51fSLisandro Dalcin h->win = draw; 4951fa3d41SBarry Smith 5051fa3d41SBarry Smith h->view = NULL; 5151fa3d41SBarry Smith h->destroy = NULL; 5251fa3d41SBarry Smith h->color = PETSC_DRAW_GREEN; 5351fa3d41SBarry Smith h->ymin = 0.; /* if user has not set these then they are determined from the data */ 5451fa3d41SBarry Smith h->ymax = 0.; 5551fa3d41SBarry Smith h->numBins = 0; 5651fa3d41SBarry Smith 57*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawAxisCreate(draw,&h->axis)); 5845f3bb6eSLisandro Dalcin h->axis->xticks = NULL; 59e118a51fSLisandro Dalcin 6051fa3d41SBarry Smith *bar = h; 6151fa3d41SBarry Smith PetscFunctionReturn(0); 6251fa3d41SBarry Smith } 6351fa3d41SBarry Smith 6451fa3d41SBarry Smith /*@C 6551fa3d41SBarry Smith PetscDrawBarSetData 6651fa3d41SBarry Smith 675b399a63SLisandro Dalcin Logically Collective on PetscDrawBar 6851fa3d41SBarry Smith 69d8d19677SJose E. Roman Input Parameters: 7051fa3d41SBarry Smith + bar - The bar graph context. 7151fa3d41SBarry Smith . bins - number of items 7251fa3d41SBarry Smith . values - values of each item 7351fa3d41SBarry Smith - labels - optional label for each bar, NULL terminated array of strings 7451fa3d41SBarry Smith 7551fa3d41SBarry Smith Level: intermediate 7651fa3d41SBarry Smith 7795452b02SPatrick Sanan Notes: 7895452b02SPatrick Sanan Call PetscDrawBarDraw() after this call to display the new plot 790afdd333SBarry Smith 800afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarDraw() 8151fa3d41SBarry Smith 8251fa3d41SBarry Smith @*/ 8351fa3d41SBarry Smith PetscErrorCode PetscDrawBarSetData(PetscDrawBar bar,PetscInt bins,const PetscReal data[],const char *const *labels) 8451fa3d41SBarry Smith { 8551fa3d41SBarry Smith PetscFunctionBegin; 8651fa3d41SBarry Smith PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 87e118a51fSLisandro Dalcin 8851fa3d41SBarry Smith if (bar->numBins != bins) { 89*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree(bar->values)); 90*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscMalloc1(bins, &bar->values)); 9151fa3d41SBarry Smith bar->numBins = bins; 9251fa3d41SBarry Smith } 93*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscArraycpy(bar->values,data,bins)); 9451fa3d41SBarry Smith bar->numBins = bins; 9551fa3d41SBarry Smith if (labels) { 96*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrArrayallocpy(labels,&bar->labels)); 9751fa3d41SBarry Smith } 9851fa3d41SBarry Smith PetscFunctionReturn(0); 9951fa3d41SBarry Smith } 10051fa3d41SBarry Smith 10151fa3d41SBarry Smith /*@C 10251fa3d41SBarry Smith PetscDrawBarDestroy - Frees all space taken up by bar graph data structure. 10351fa3d41SBarry Smith 10451fa3d41SBarry Smith Collective over PetscDrawBar 10551fa3d41SBarry Smith 10651fa3d41SBarry Smith Input Parameter: 10751fa3d41SBarry Smith . bar - The bar graph context 10851fa3d41SBarry Smith 10951fa3d41SBarry Smith Level: intermediate 11051fa3d41SBarry Smith 11151fa3d41SBarry Smith .seealso: PetscDrawBarCreate() 11251fa3d41SBarry Smith @*/ 11351fa3d41SBarry Smith PetscErrorCode PetscDrawBarDestroy(PetscDrawBar *bar) 11451fa3d41SBarry Smith { 11551fa3d41SBarry Smith PetscFunctionBegin; 11651fa3d41SBarry Smith if (!*bar) PetscFunctionReturn(0); 117e118a51fSLisandro Dalcin PetscValidHeaderSpecific(*bar,PETSC_DRAWBAR_CLASSID,1); 11851fa3d41SBarry Smith if (--((PetscObject)(*bar))->refct > 0) PetscFunctionReturn(0); 119e118a51fSLisandro Dalcin 120*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree((*bar)->values)); 121*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrArrayDestroy(&(*bar)->labels)); 122*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawAxisDestroy(&(*bar)->axis)); 123*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawDestroy(&(*bar)->win)); 124*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscHeaderDestroy(bar)); 12551fa3d41SBarry Smith PetscFunctionReturn(0); 12651fa3d41SBarry Smith } 12751fa3d41SBarry Smith 12851fa3d41SBarry Smith /*@ 12951fa3d41SBarry Smith PetscDrawBarDraw - Redraws a bar graph. 13051fa3d41SBarry Smith 1315b399a63SLisandro Dalcin Collective on PetscDrawBar 13251fa3d41SBarry Smith 13351fa3d41SBarry Smith Input Parameter: 13451fa3d41SBarry Smith . bar - The bar graph context 13551fa3d41SBarry Smith 13651fa3d41SBarry Smith Level: intermediate 13751fa3d41SBarry Smith 1380afdd333SBarry Smith .seealso: PetscDrawBar, PetscDrawBarCreate(), PetscDrawBarSetData() 1390afdd333SBarry Smith 14051fa3d41SBarry Smith @*/ 14151fa3d41SBarry Smith PetscErrorCode PetscDrawBarDraw(PetscDrawBar bar) 14251fa3d41SBarry Smith { 143e118a51fSLisandro Dalcin PetscDraw draw; 14451fa3d41SBarry Smith PetscBool isnull; 14551fa3d41SBarry Smith PetscReal xmin,xmax,ymin,ymax,*values,binLeft,binRight; 14651fa3d41SBarry Smith PetscInt numValues,i,bcolor,color,idx,*perm,nplot; 147e118a51fSLisandro Dalcin PetscMPIInt rank; 14851fa3d41SBarry Smith char **labels; 149*5f80ce2aSJacob Faibussowitsch PetscErrorCode ierr; 15051fa3d41SBarry Smith 15151fa3d41SBarry Smith PetscFunctionBegin; 15251fa3d41SBarry Smith PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 153*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawIsNull(bar->win,&isnull)); 1548f69470aSLisandro Dalcin if (isnull) PetscFunctionReturn(0); 155*5f80ce2aSJacob Faibussowitsch CHKERRMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)bar),&rank)); 15651fa3d41SBarry Smith 1575b399a63SLisandro Dalcin if (bar->numBins < 1) PetscFunctionReturn(0); 1585b399a63SLisandro Dalcin 15951fa3d41SBarry Smith color = bar->color; 16071917b75SLisandro Dalcin if (color == PETSC_DRAW_ROTATE) bcolor = PETSC_DRAW_BLACK+1; 16151fa3d41SBarry Smith else bcolor = color; 16251fa3d41SBarry Smith 16351fa3d41SBarry Smith numValues = bar->numBins; 16451fa3d41SBarry Smith values = bar->values; 16551fa3d41SBarry Smith if (bar->ymin == bar->ymax) { 16651fa3d41SBarry Smith /* user has not set bounds on bars so set them based on the data */ 16751fa3d41SBarry Smith ymin = PETSC_MAX_REAL; 16851fa3d41SBarry Smith ymax = PETSC_MIN_REAL; 16951fa3d41SBarry Smith for (i=0; i<numValues; i++) { 17051fa3d41SBarry Smith ymin = PetscMin(ymin,values[i]); 17151fa3d41SBarry Smith ymax = PetscMax(ymax,values[i]); 17251fa3d41SBarry Smith } 17351fa3d41SBarry Smith } else { 17451fa3d41SBarry Smith ymin = bar->ymin; 17551fa3d41SBarry Smith ymax = bar->ymax; 17651fa3d41SBarry Smith } 17751fa3d41SBarry Smith nplot = numValues; /* number of points to actually plot; if some are lower than requested tolerance */ 17851fa3d41SBarry Smith xmin = 0.0; 179e118a51fSLisandro Dalcin xmax = nplot; 18051fa3d41SBarry Smith labels = bar->labels; 18151fa3d41SBarry Smith 18251fa3d41SBarry Smith if (bar->sort) { 183*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscMalloc1(numValues,&perm)); 18451fa3d41SBarry Smith for (i=0; i<numValues;i++) perm[i] = i; 185*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscSortRealWithPermutation(numValues,values,perm)); 18651fa3d41SBarry Smith if (bar->sorttolerance) { 18751fa3d41SBarry Smith for (i=0; i<numValues;i++) { 18851fa3d41SBarry Smith if (values[perm[numValues - i - 1]] < bar->sorttolerance) { 18951fa3d41SBarry Smith nplot = i; 19051fa3d41SBarry Smith break; 19151fa3d41SBarry Smith } 19251fa3d41SBarry Smith } 19351fa3d41SBarry Smith } 19451fa3d41SBarry Smith } 19551fa3d41SBarry Smith 1965b399a63SLisandro Dalcin draw = bar->win; 197*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawCheckResizedWindow(draw)); 198*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawClear(draw)); 199e118a51fSLisandro Dalcin 200*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawAxisSetLimits(bar->axis,xmin,xmax,ymin,ymax)); 201*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawAxisDraw(bar->axis)); 20251fa3d41SBarry Smith 2035b399a63SLisandro Dalcin ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr); 204dd400576SPatrick Sanan if (rank == 0) { /* Draw bins */ 20551fa3d41SBarry Smith for (i=0; i<nplot; i++) { 20651fa3d41SBarry Smith idx = (bar->sort ? perm[numValues - i - 1] : i); 20751fa3d41SBarry Smith binLeft = xmin + i; 20851fa3d41SBarry Smith binRight = xmin + i + 1; 209*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawRectangle(draw,binLeft,ymin,binRight,values[idx],bcolor,bcolor,bcolor,bcolor)); 210*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawLine(draw,binLeft,ymin,binLeft,values[idx],PETSC_DRAW_BLACK)); 211*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawLine(draw,binRight,ymin,binRight,values[idx],PETSC_DRAW_BLACK)); 212*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawLine(draw,binLeft,values[idx],binRight,values[idx],PETSC_DRAW_BLACK)); 21351fa3d41SBarry Smith if (labels) { 21451fa3d41SBarry Smith PetscReal h; 215*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawStringGetSize(draw,NULL,&h)); 216*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawStringCentered(draw,.5*(binLeft+binRight),ymin - 1.5*h,bcolor,labels[idx])); 21751fa3d41SBarry Smith } 21851fa3d41SBarry Smith if (color == PETSC_DRAW_ROTATE) bcolor++; 21971917b75SLisandro Dalcin if (bcolor > PETSC_DRAW_BASIC_COLORS-1) bcolor = PETSC_DRAW_BLACK+1; 22051fa3d41SBarry Smith } 22151fa3d41SBarry Smith } 2225b399a63SLisandro Dalcin ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr); 223*5f80ce2aSJacob Faibussowitsch if (bar->sort) CHKERRQ(PetscFree(perm)); 224e118a51fSLisandro Dalcin 225*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawFlush(draw)); 226*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawPause(draw)); 22751fa3d41SBarry Smith PetscFunctionReturn(0); 22851fa3d41SBarry Smith } 22951fa3d41SBarry Smith 23057fd6651SLisandro Dalcin /*@ 23157fd6651SLisandro Dalcin PetscDrawBarSave - Saves a drawn image 23257fd6651SLisandro Dalcin 23357fd6651SLisandro Dalcin Collective on PetscDrawBar 23457fd6651SLisandro Dalcin 23557fd6651SLisandro Dalcin Input Parameters: 23657fd6651SLisandro Dalcin . bar - The bar graph context 23757fd6651SLisandro Dalcin 23857fd6651SLisandro Dalcin Level: intermediate 23957fd6651SLisandro Dalcin 2400afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBarGetDraw(), PetscDrawSetSave(), PetscDrawSave(), PetscDrawBarSetData() 24157fd6651SLisandro Dalcin @*/ 24257fd6651SLisandro Dalcin PetscErrorCode PetscDrawBarSave(PetscDrawBar bar) 24357fd6651SLisandro Dalcin { 24457fd6651SLisandro Dalcin PetscFunctionBegin; 24557fd6651SLisandro Dalcin PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 246*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawSave(bar->win)); 24757fd6651SLisandro Dalcin PetscFunctionReturn(0); 24857fd6651SLisandro Dalcin } 24957fd6651SLisandro Dalcin 25051fa3d41SBarry Smith /*@ 25151fa3d41SBarry Smith PetscDrawBarSetColor - Sets the color the bars will be drawn with. 25251fa3d41SBarry Smith 2535b399a63SLisandro Dalcin Logically Collective on PetscDrawBar 25451fa3d41SBarry Smith 25551fa3d41SBarry Smith Input Parameters: 25651fa3d41SBarry Smith + bar - The bar graph context 25751fa3d41SBarry Smith - color - one of the colors defined in petscdraw.h or PETSC_DRAW_ROTATE to make each bar a 25851fa3d41SBarry Smith different color 25951fa3d41SBarry Smith 26051fa3d41SBarry Smith Level: intermediate 26151fa3d41SBarry Smith 2620afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarSetData(), PetscDrawBarDraw(), PetscDrawBarGetAxis() 2630afdd333SBarry Smith 26451fa3d41SBarry Smith @*/ 26551fa3d41SBarry Smith PetscErrorCode PetscDrawBarSetColor(PetscDrawBar bar, int color) 26651fa3d41SBarry Smith { 26751fa3d41SBarry Smith PetscFunctionBegin; 26851fa3d41SBarry Smith PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID,1); 26951fa3d41SBarry Smith bar->color = color; 27051fa3d41SBarry Smith PetscFunctionReturn(0); 27151fa3d41SBarry Smith } 27251fa3d41SBarry Smith 27351fa3d41SBarry Smith /*@ 27451fa3d41SBarry Smith PetscDrawBarSort - Sorts the values before drawing the bar chart 27551fa3d41SBarry Smith 2765b399a63SLisandro Dalcin Logically Collective on PetscDrawBar 27751fa3d41SBarry Smith 27851fa3d41SBarry Smith Input Parameters: 27951fa3d41SBarry Smith + bar - The bar graph context 28051fa3d41SBarry Smith . sort - PETSC_TRUE to sort the values 281a2b725a8SWilliam Gropp - tolerance - discard values less than tolerance 28251fa3d41SBarry Smith 28351fa3d41SBarry Smith Level: intermediate 28451fa3d41SBarry Smith 2850afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarSetData(), PetscDrawBarSetColor(), PetscDrawBarDraw(), PetscDrawBarGetAxis() 28651fa3d41SBarry Smith @*/ 28751fa3d41SBarry Smith PetscErrorCode PetscDrawBarSort(PetscDrawBar bar, PetscBool sort, PetscReal tolerance) 28851fa3d41SBarry Smith { 28951fa3d41SBarry Smith PetscFunctionBegin; 29051fa3d41SBarry Smith PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 29151fa3d41SBarry Smith bar->sort = sort; 29251fa3d41SBarry Smith bar->sorttolerance = tolerance; 29351fa3d41SBarry Smith PetscFunctionReturn(0); 29451fa3d41SBarry Smith } 29551fa3d41SBarry Smith 29651fa3d41SBarry Smith /*@ 29751fa3d41SBarry Smith PetscDrawBarSetLimits - Sets the axis limits for a bar graph. If more 29851fa3d41SBarry Smith points are added after this call, the limits will be adjusted to 29951fa3d41SBarry Smith include those additional points. 30051fa3d41SBarry Smith 3015b399a63SLisandro Dalcin Logically Collective on PetscDrawBar 30251fa3d41SBarry Smith 30351fa3d41SBarry Smith Input Parameters: 30451fa3d41SBarry Smith + bar - The bar graph context 30551fa3d41SBarry Smith - y_min,y_max - The limits 30651fa3d41SBarry Smith 30751fa3d41SBarry Smith Level: intermediate 30851fa3d41SBarry Smith 3090afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarGetAxis(), PetscDrawBarSetData(), PetscDrawBarDraw() 31051fa3d41SBarry Smith @*/ 31151fa3d41SBarry Smith PetscErrorCode PetscDrawBarSetLimits(PetscDrawBar bar, PetscReal y_min, PetscReal y_max) 31251fa3d41SBarry Smith { 31351fa3d41SBarry Smith PetscFunctionBegin; 31451fa3d41SBarry Smith PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 31551fa3d41SBarry Smith bar->ymin = y_min; 31651fa3d41SBarry Smith bar->ymax = y_max; 31751fa3d41SBarry Smith PetscFunctionReturn(0); 31851fa3d41SBarry Smith } 31951fa3d41SBarry Smith 32051fa3d41SBarry Smith /*@C 32151fa3d41SBarry Smith PetscDrawBarGetAxis - Gets the axis context associated with a bar graph. 32251fa3d41SBarry Smith This is useful if one wants to change some axis property, such as 32351fa3d41SBarry Smith labels, color, etc. The axis context should not be destroyed by the 32451fa3d41SBarry Smith application code. 32551fa3d41SBarry Smith 3265b399a63SLisandro Dalcin Not Collective, PetscDrawAxis is parallel if PetscDrawBar is parallel 32751fa3d41SBarry Smith 32851fa3d41SBarry Smith Input Parameter: 32951fa3d41SBarry Smith . bar - The bar graph context 33051fa3d41SBarry Smith 33151fa3d41SBarry Smith Output Parameter: 33251fa3d41SBarry Smith . axis - The axis context 33351fa3d41SBarry Smith 33451fa3d41SBarry Smith Level: intermediate 33551fa3d41SBarry Smith 3360afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawAxis, PetscDrawAxisCreate() 33751fa3d41SBarry Smith @*/ 33851fa3d41SBarry Smith PetscErrorCode PetscDrawBarGetAxis(PetscDrawBar bar,PetscDrawAxis *axis) 33951fa3d41SBarry Smith { 34051fa3d41SBarry Smith PetscFunctionBegin; 341e118a51fSLisandro Dalcin PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 34245f3bb6eSLisandro Dalcin PetscValidPointer(axis,2); 34351fa3d41SBarry Smith *axis = bar->axis; 34451fa3d41SBarry Smith PetscFunctionReturn(0); 34551fa3d41SBarry Smith } 34651fa3d41SBarry Smith 34751fa3d41SBarry Smith /*@C 34851fa3d41SBarry Smith PetscDrawBarGetDraw - Gets the draw context associated with a bar graph. 34951fa3d41SBarry Smith 35051fa3d41SBarry Smith Not Collective, PetscDraw is parallel if PetscDrawBar is parallel 35151fa3d41SBarry Smith 35251fa3d41SBarry Smith Input Parameter: 35351fa3d41SBarry Smith . bar - The bar graph context 35451fa3d41SBarry Smith 35551fa3d41SBarry Smith Output Parameter: 356e118a51fSLisandro Dalcin . draw - The draw context 35751fa3d41SBarry Smith 35851fa3d41SBarry Smith Level: intermediate 35951fa3d41SBarry Smith 3600afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarDraw(), PetscDraw 36151fa3d41SBarry Smith @*/ 362e118a51fSLisandro Dalcin PetscErrorCode PetscDrawBarGetDraw(PetscDrawBar bar,PetscDraw *draw) 36351fa3d41SBarry Smith { 36451fa3d41SBarry Smith PetscFunctionBegin; 36551fa3d41SBarry Smith PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 36645f3bb6eSLisandro Dalcin PetscValidPointer(draw,2); 367e118a51fSLisandro Dalcin *draw = bar->win; 36851fa3d41SBarry Smith PetscFunctionReturn(0); 36951fa3d41SBarry Smith } 37051fa3d41SBarry Smith 37151fa3d41SBarry Smith /*@ 37251fa3d41SBarry Smith PetscDrawBarSetFromOptions - Sets options related to the PetscDrawBar 37351fa3d41SBarry Smith 37451fa3d41SBarry Smith Collective over PetscDrawBar 37551fa3d41SBarry Smith 37651fa3d41SBarry Smith Options Database: 37751fa3d41SBarry Smith . -bar_sort - sort the entries before drawing the bar graph 37851fa3d41SBarry Smith 37951fa3d41SBarry Smith Level: intermediate 38051fa3d41SBarry Smith 3810afdd333SBarry Smith .seealso: PetscDrawBarDestroy(), PetscDrawBarCreate(), PetscDrawBarSort() 38251fa3d41SBarry Smith @*/ 38351fa3d41SBarry Smith PetscErrorCode PetscDrawBarSetFromOptions(PetscDrawBar bar) 38451fa3d41SBarry Smith { 38551fa3d41SBarry Smith PetscBool set; 38651fa3d41SBarry Smith 38751fa3d41SBarry Smith PetscFunctionBegin; 388e118a51fSLisandro Dalcin PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 389e118a51fSLisandro Dalcin 390*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsHasName(((PetscObject)bar)->options,((PetscObject)bar)->prefix,"-bar_sort",&set)); 39151fa3d41SBarry Smith if (set) { 392e118a51fSLisandro Dalcin PetscReal tol = bar->sorttolerance; 393*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetReal(((PetscObject)bar)->options,((PetscObject)bar)->prefix,"-bar_sort",&tol,NULL)); 394*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawBarSort(bar,PETSC_TRUE,tol)); 39551fa3d41SBarry Smith } 39651fa3d41SBarry Smith PetscFunctionReturn(0); 39751fa3d41SBarry Smith } 398