151fa3d41SBarry Smith 251fa3d41SBarry Smith /* 351fa3d41SBarry Smith Contains the data structure for plotting a bargraph in a window with an axis. 451fa3d41SBarry Smith */ 5*999739cfSJacob Faibussowitsch 6*999739cfSJacob 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 PetscErrorCode ierr; 4051fa3d41SBarry Smith 4151fa3d41SBarry Smith PetscFunctionBegin; 4251fa3d41SBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 4373107ff1SLisandro Dalcin PetscValidPointer(bar,2); 44e118a51fSLisandro Dalcin 4571917b75SLisandro Dalcin ierr = PetscHeaderCreate(h,PETSC_DRAWBAR_CLASSID,"DrawBar","Bar Graph","Draw",PetscObjectComm((PetscObject)draw),PetscDrawBarDestroy,NULL);CHKERRQ(ierr); 46e118a51fSLisandro Dalcin ierr = PetscLogObjectParent((PetscObject)draw,(PetscObject)h);CHKERRQ(ierr); 47e118a51fSLisandro Dalcin 48e118a51fSLisandro Dalcin ierr = PetscObjectReference((PetscObject)draw);CHKERRQ(ierr); 49e118a51fSLisandro Dalcin h->win = draw; 5051fa3d41SBarry Smith 5151fa3d41SBarry Smith h->view = NULL; 5251fa3d41SBarry Smith h->destroy = NULL; 5351fa3d41SBarry Smith h->color = PETSC_DRAW_GREEN; 5451fa3d41SBarry Smith h->ymin = 0.; /* if user has not set these then they are determined from the data */ 5551fa3d41SBarry Smith h->ymax = 0.; 5651fa3d41SBarry Smith h->numBins = 0; 5751fa3d41SBarry Smith 5851fa3d41SBarry Smith ierr = PetscDrawAxisCreate(draw,&h->axis);CHKERRQ(ierr); 5945f3bb6eSLisandro Dalcin h->axis->xticks = NULL; 60e118a51fSLisandro Dalcin 6151fa3d41SBarry Smith *bar = h; 6251fa3d41SBarry Smith PetscFunctionReturn(0); 6351fa3d41SBarry Smith } 6451fa3d41SBarry Smith 6551fa3d41SBarry Smith /*@C 6651fa3d41SBarry Smith PetscDrawBarSetData 6751fa3d41SBarry Smith 685b399a63SLisandro Dalcin Logically Collective on PetscDrawBar 6951fa3d41SBarry Smith 70d8d19677SJose E. Roman Input Parameters: 7151fa3d41SBarry Smith + bar - The bar graph context. 7251fa3d41SBarry Smith . bins - number of items 7351fa3d41SBarry Smith . values - values of each item 7451fa3d41SBarry Smith - labels - optional label for each bar, NULL terminated array of strings 7551fa3d41SBarry Smith 7651fa3d41SBarry Smith Level: intermediate 7751fa3d41SBarry Smith 7895452b02SPatrick Sanan Notes: 7995452b02SPatrick Sanan Call PetscDrawBarDraw() after this call to display the new plot 800afdd333SBarry Smith 810afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarDraw() 8251fa3d41SBarry Smith 8351fa3d41SBarry Smith @*/ 8451fa3d41SBarry Smith PetscErrorCode PetscDrawBarSetData(PetscDrawBar bar,PetscInt bins,const PetscReal data[],const char *const *labels) 8551fa3d41SBarry Smith { 8651fa3d41SBarry Smith PetscErrorCode ierr; 8751fa3d41SBarry Smith 8851fa3d41SBarry Smith PetscFunctionBegin; 8951fa3d41SBarry Smith PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 90e118a51fSLisandro Dalcin 9151fa3d41SBarry Smith if (bar->numBins != bins) { 9251fa3d41SBarry Smith ierr = PetscFree(bar->values);CHKERRQ(ierr); 9351fa3d41SBarry Smith ierr = PetscMalloc1(bins, &bar->values);CHKERRQ(ierr); 9451fa3d41SBarry Smith bar->numBins = bins; 9551fa3d41SBarry Smith } 96580bdb30SBarry Smith ierr = PetscArraycpy(bar->values,data,bins);CHKERRQ(ierr); 9751fa3d41SBarry Smith bar->numBins = bins; 9851fa3d41SBarry Smith if (labels) { 9951fa3d41SBarry Smith ierr = PetscStrArrayallocpy(labels,&bar->labels);CHKERRQ(ierr); 10051fa3d41SBarry Smith } 10151fa3d41SBarry Smith PetscFunctionReturn(0); 10251fa3d41SBarry Smith } 10351fa3d41SBarry Smith 10451fa3d41SBarry Smith /*@C 10551fa3d41SBarry Smith PetscDrawBarDestroy - Frees all space taken up by bar graph data structure. 10651fa3d41SBarry Smith 10751fa3d41SBarry Smith Collective over PetscDrawBar 10851fa3d41SBarry Smith 10951fa3d41SBarry Smith Input Parameter: 11051fa3d41SBarry Smith . bar - The bar graph context 11151fa3d41SBarry Smith 11251fa3d41SBarry Smith Level: intermediate 11351fa3d41SBarry Smith 11451fa3d41SBarry Smith .seealso: PetscDrawBarCreate() 11551fa3d41SBarry Smith @*/ 11651fa3d41SBarry Smith PetscErrorCode PetscDrawBarDestroy(PetscDrawBar *bar) 11751fa3d41SBarry Smith { 11851fa3d41SBarry Smith PetscErrorCode ierr; 11951fa3d41SBarry Smith 12051fa3d41SBarry Smith PetscFunctionBegin; 12151fa3d41SBarry Smith if (!*bar) PetscFunctionReturn(0); 122e118a51fSLisandro Dalcin PetscValidHeaderSpecific(*bar,PETSC_DRAWBAR_CLASSID,1); 12351fa3d41SBarry Smith if (--((PetscObject)(*bar))->refct > 0) PetscFunctionReturn(0); 124e118a51fSLisandro Dalcin 12551fa3d41SBarry Smith ierr = PetscFree((*bar)->values);CHKERRQ(ierr); 12651fa3d41SBarry Smith ierr = PetscStrArrayDestroy(&(*bar)->labels);CHKERRQ(ierr); 127e118a51fSLisandro Dalcin ierr = PetscDrawAxisDestroy(&(*bar)->axis);CHKERRQ(ierr); 128e118a51fSLisandro Dalcin ierr = PetscDrawDestroy(&(*bar)->win);CHKERRQ(ierr); 12951fa3d41SBarry Smith ierr = PetscHeaderDestroy(bar);CHKERRQ(ierr); 13051fa3d41SBarry Smith PetscFunctionReturn(0); 13151fa3d41SBarry Smith } 13251fa3d41SBarry Smith 13351fa3d41SBarry Smith /*@ 13451fa3d41SBarry Smith PetscDrawBarDraw - Redraws a bar graph. 13551fa3d41SBarry Smith 1365b399a63SLisandro Dalcin Collective on PetscDrawBar 13751fa3d41SBarry Smith 13851fa3d41SBarry Smith Input Parameter: 13951fa3d41SBarry Smith . bar - The bar graph context 14051fa3d41SBarry Smith 14151fa3d41SBarry Smith Level: intermediate 14251fa3d41SBarry Smith 1430afdd333SBarry Smith .seealso: PetscDrawBar, PetscDrawBarCreate(), PetscDrawBarSetData() 1440afdd333SBarry Smith 14551fa3d41SBarry Smith @*/ 14651fa3d41SBarry Smith PetscErrorCode PetscDrawBarDraw(PetscDrawBar bar) 14751fa3d41SBarry Smith { 148e118a51fSLisandro Dalcin PetscDraw draw; 14951fa3d41SBarry Smith PetscBool isnull; 15051fa3d41SBarry Smith PetscReal xmin,xmax,ymin,ymax,*values,binLeft,binRight; 15151fa3d41SBarry Smith PetscInt numValues,i,bcolor,color,idx,*perm,nplot; 152e118a51fSLisandro Dalcin PetscMPIInt rank; 15351fa3d41SBarry Smith PetscErrorCode ierr; 15451fa3d41SBarry Smith char **labels; 15551fa3d41SBarry Smith 15651fa3d41SBarry Smith PetscFunctionBegin; 15751fa3d41SBarry Smith PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 1588f69470aSLisandro Dalcin ierr = PetscDrawIsNull(bar->win,&isnull);CHKERRQ(ierr); 1598f69470aSLisandro Dalcin if (isnull) PetscFunctionReturn(0); 160ffc4695bSBarry Smith ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)bar),&rank);CHKERRMPI(ierr); 16151fa3d41SBarry Smith 1625b399a63SLisandro Dalcin if (bar->numBins < 1) PetscFunctionReturn(0); 1635b399a63SLisandro Dalcin 16451fa3d41SBarry Smith color = bar->color; 16571917b75SLisandro Dalcin if (color == PETSC_DRAW_ROTATE) bcolor = PETSC_DRAW_BLACK+1; 16651fa3d41SBarry Smith else bcolor = color; 16751fa3d41SBarry Smith 16851fa3d41SBarry Smith numValues = bar->numBins; 16951fa3d41SBarry Smith values = bar->values; 17051fa3d41SBarry Smith if (bar->ymin == bar->ymax) { 17151fa3d41SBarry Smith /* user has not set bounds on bars so set them based on the data */ 17251fa3d41SBarry Smith ymin = PETSC_MAX_REAL; 17351fa3d41SBarry Smith ymax = PETSC_MIN_REAL; 17451fa3d41SBarry Smith for (i=0; i<numValues; i++) { 17551fa3d41SBarry Smith ymin = PetscMin(ymin,values[i]); 17651fa3d41SBarry Smith ymax = PetscMax(ymax,values[i]); 17751fa3d41SBarry Smith } 17851fa3d41SBarry Smith } else { 17951fa3d41SBarry Smith ymin = bar->ymin; 18051fa3d41SBarry Smith ymax = bar->ymax; 18151fa3d41SBarry Smith } 18251fa3d41SBarry Smith nplot = numValues; /* number of points to actually plot; if some are lower than requested tolerance */ 18351fa3d41SBarry Smith xmin = 0.0; 184e118a51fSLisandro Dalcin xmax = nplot; 18551fa3d41SBarry Smith labels = bar->labels; 18651fa3d41SBarry Smith 18751fa3d41SBarry Smith if (bar->sort) { 18851fa3d41SBarry Smith ierr = PetscMalloc1(numValues,&perm);CHKERRQ(ierr); 18951fa3d41SBarry Smith for (i=0; i<numValues;i++) perm[i] = i; 19051fa3d41SBarry Smith ierr = PetscSortRealWithPermutation(numValues,values,perm);CHKERRQ(ierr); 19151fa3d41SBarry Smith if (bar->sorttolerance) { 19251fa3d41SBarry Smith for (i=0; i<numValues;i++) { 19351fa3d41SBarry Smith if (values[perm[numValues - i - 1]] < bar->sorttolerance) { 19451fa3d41SBarry Smith nplot = i; 19551fa3d41SBarry Smith break; 19651fa3d41SBarry Smith } 19751fa3d41SBarry Smith } 19851fa3d41SBarry Smith } 19951fa3d41SBarry Smith } 20051fa3d41SBarry Smith 2015b399a63SLisandro Dalcin draw = bar->win; 202e118a51fSLisandro Dalcin ierr = PetscDrawCheckResizedWindow(draw);CHKERRQ(ierr); 2035b399a63SLisandro Dalcin ierr = PetscDrawClear(draw);CHKERRQ(ierr); 204e118a51fSLisandro Dalcin 20551fa3d41SBarry Smith ierr = PetscDrawAxisSetLimits(bar->axis,xmin,xmax,ymin,ymax);CHKERRQ(ierr); 20651fa3d41SBarry Smith ierr = PetscDrawAxisDraw(bar->axis);CHKERRQ(ierr); 20751fa3d41SBarry Smith 2085b399a63SLisandro Dalcin ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr); 209dd400576SPatrick Sanan if (rank == 0) { /* Draw bins */ 21051fa3d41SBarry Smith for (i=0; i<nplot; i++) { 21151fa3d41SBarry Smith idx = (bar->sort ? perm[numValues - i - 1] : i); 21251fa3d41SBarry Smith binLeft = xmin + i; 21351fa3d41SBarry Smith binRight = xmin + i + 1; 21451fa3d41SBarry Smith ierr = PetscDrawRectangle(draw,binLeft,ymin,binRight,values[idx],bcolor,bcolor,bcolor,bcolor);CHKERRQ(ierr); 21551fa3d41SBarry Smith ierr = PetscDrawLine(draw,binLeft,ymin,binLeft,values[idx],PETSC_DRAW_BLACK);CHKERRQ(ierr); 21651fa3d41SBarry Smith ierr = PetscDrawLine(draw,binRight,ymin,binRight,values[idx],PETSC_DRAW_BLACK);CHKERRQ(ierr); 21751fa3d41SBarry Smith ierr = PetscDrawLine(draw,binLeft,values[idx],binRight,values[idx],PETSC_DRAW_BLACK);CHKERRQ(ierr); 21851fa3d41SBarry Smith if (labels) { 21951fa3d41SBarry Smith PetscReal h; 22051fa3d41SBarry Smith ierr = PetscDrawStringGetSize(draw,NULL,&h);CHKERRQ(ierr); 22171917b75SLisandro Dalcin ierr = PetscDrawStringCentered(draw,.5*(binLeft+binRight),ymin - 1.5*h,bcolor,labels[idx]);CHKERRQ(ierr); 22251fa3d41SBarry Smith } 22351fa3d41SBarry Smith if (color == PETSC_DRAW_ROTATE) bcolor++; 22471917b75SLisandro Dalcin if (bcolor > PETSC_DRAW_BASIC_COLORS-1) bcolor = PETSC_DRAW_BLACK+1; 22551fa3d41SBarry Smith } 22651fa3d41SBarry Smith } 2275b399a63SLisandro Dalcin ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr); 228e118a51fSLisandro Dalcin if (bar->sort) {ierr = PetscFree(perm);CHKERRQ(ierr);} 229e118a51fSLisandro Dalcin 2305b399a63SLisandro Dalcin ierr = PetscDrawFlush(draw);CHKERRQ(ierr); 23151fa3d41SBarry Smith ierr = PetscDrawPause(draw);CHKERRQ(ierr); 23251fa3d41SBarry Smith PetscFunctionReturn(0); 23351fa3d41SBarry Smith } 23451fa3d41SBarry Smith 23557fd6651SLisandro Dalcin /*@ 23657fd6651SLisandro Dalcin PetscDrawBarSave - Saves a drawn image 23757fd6651SLisandro Dalcin 23857fd6651SLisandro Dalcin Collective on PetscDrawBar 23957fd6651SLisandro Dalcin 24057fd6651SLisandro Dalcin Input Parameters: 24157fd6651SLisandro Dalcin . bar - The bar graph context 24257fd6651SLisandro Dalcin 24357fd6651SLisandro Dalcin Level: intermediate 24457fd6651SLisandro Dalcin 2450afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBarGetDraw(), PetscDrawSetSave(), PetscDrawSave(), PetscDrawBarSetData() 24657fd6651SLisandro Dalcin @*/ 24757fd6651SLisandro Dalcin PetscErrorCode PetscDrawBarSave(PetscDrawBar bar) 24857fd6651SLisandro Dalcin { 24957fd6651SLisandro Dalcin PetscErrorCode ierr; 25057fd6651SLisandro Dalcin 25157fd6651SLisandro Dalcin PetscFunctionBegin; 25257fd6651SLisandro Dalcin PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 25357fd6651SLisandro Dalcin ierr = PetscDrawSave(bar->win);CHKERRQ(ierr); 25457fd6651SLisandro Dalcin PetscFunctionReturn(0); 25557fd6651SLisandro Dalcin } 25657fd6651SLisandro Dalcin 25751fa3d41SBarry Smith /*@ 25851fa3d41SBarry Smith PetscDrawBarSetColor - Sets the color the bars will be drawn with. 25951fa3d41SBarry Smith 2605b399a63SLisandro Dalcin Logically Collective on PetscDrawBar 26151fa3d41SBarry Smith 26251fa3d41SBarry Smith Input Parameters: 26351fa3d41SBarry Smith + bar - The bar graph context 26451fa3d41SBarry Smith - color - one of the colors defined in petscdraw.h or PETSC_DRAW_ROTATE to make each bar a 26551fa3d41SBarry Smith different color 26651fa3d41SBarry Smith 26751fa3d41SBarry Smith Level: intermediate 26851fa3d41SBarry Smith 2690afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarSetData(), PetscDrawBarDraw(), PetscDrawBarGetAxis() 2700afdd333SBarry Smith 27151fa3d41SBarry Smith @*/ 27251fa3d41SBarry Smith PetscErrorCode PetscDrawBarSetColor(PetscDrawBar bar, int color) 27351fa3d41SBarry Smith { 27451fa3d41SBarry Smith PetscFunctionBegin; 27551fa3d41SBarry Smith PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID,1); 27651fa3d41SBarry Smith bar->color = color; 27751fa3d41SBarry Smith PetscFunctionReturn(0); 27851fa3d41SBarry Smith } 27951fa3d41SBarry Smith 28051fa3d41SBarry Smith /*@ 28151fa3d41SBarry Smith PetscDrawBarSort - Sorts the values before drawing the bar chart 28251fa3d41SBarry Smith 2835b399a63SLisandro Dalcin Logically Collective on PetscDrawBar 28451fa3d41SBarry Smith 28551fa3d41SBarry Smith Input Parameters: 28651fa3d41SBarry Smith + bar - The bar graph context 28751fa3d41SBarry Smith . sort - PETSC_TRUE to sort the values 288a2b725a8SWilliam Gropp - tolerance - discard values less than tolerance 28951fa3d41SBarry Smith 29051fa3d41SBarry Smith Level: intermediate 29151fa3d41SBarry Smith 2920afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarSetData(), PetscDrawBarSetColor(), PetscDrawBarDraw(), PetscDrawBarGetAxis() 29351fa3d41SBarry Smith @*/ 29451fa3d41SBarry Smith PetscErrorCode PetscDrawBarSort(PetscDrawBar bar, PetscBool sort, PetscReal tolerance) 29551fa3d41SBarry Smith { 29651fa3d41SBarry Smith PetscFunctionBegin; 29751fa3d41SBarry Smith PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 29851fa3d41SBarry Smith bar->sort = sort; 29951fa3d41SBarry Smith bar->sorttolerance = tolerance; 30051fa3d41SBarry Smith PetscFunctionReturn(0); 30151fa3d41SBarry Smith } 30251fa3d41SBarry Smith 30351fa3d41SBarry Smith /*@ 30451fa3d41SBarry Smith PetscDrawBarSetLimits - Sets the axis limits for a bar graph. If more 30551fa3d41SBarry Smith points are added after this call, the limits will be adjusted to 30651fa3d41SBarry Smith include those additional points. 30751fa3d41SBarry Smith 3085b399a63SLisandro Dalcin Logically Collective on PetscDrawBar 30951fa3d41SBarry Smith 31051fa3d41SBarry Smith Input Parameters: 31151fa3d41SBarry Smith + bar - The bar graph context 31251fa3d41SBarry Smith - y_min,y_max - The limits 31351fa3d41SBarry Smith 31451fa3d41SBarry Smith Level: intermediate 31551fa3d41SBarry Smith 3160afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarGetAxis(), PetscDrawBarSetData(), PetscDrawBarDraw() 31751fa3d41SBarry Smith @*/ 31851fa3d41SBarry Smith PetscErrorCode PetscDrawBarSetLimits(PetscDrawBar bar, PetscReal y_min, PetscReal y_max) 31951fa3d41SBarry Smith { 32051fa3d41SBarry Smith PetscFunctionBegin; 32151fa3d41SBarry Smith PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 32251fa3d41SBarry Smith bar->ymin = y_min; 32351fa3d41SBarry Smith bar->ymax = y_max; 32451fa3d41SBarry Smith PetscFunctionReturn(0); 32551fa3d41SBarry Smith } 32651fa3d41SBarry Smith 32751fa3d41SBarry Smith /*@C 32851fa3d41SBarry Smith PetscDrawBarGetAxis - Gets the axis context associated with a bar graph. 32951fa3d41SBarry Smith This is useful if one wants to change some axis property, such as 33051fa3d41SBarry Smith labels, color, etc. The axis context should not be destroyed by the 33151fa3d41SBarry Smith application code. 33251fa3d41SBarry Smith 3335b399a63SLisandro Dalcin Not Collective, PetscDrawAxis is parallel if PetscDrawBar is parallel 33451fa3d41SBarry Smith 33551fa3d41SBarry Smith Input Parameter: 33651fa3d41SBarry Smith . bar - The bar graph context 33751fa3d41SBarry Smith 33851fa3d41SBarry Smith Output Parameter: 33951fa3d41SBarry Smith . axis - The axis context 34051fa3d41SBarry Smith 34151fa3d41SBarry Smith Level: intermediate 34251fa3d41SBarry Smith 3430afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawAxis, PetscDrawAxisCreate() 34451fa3d41SBarry Smith @*/ 34551fa3d41SBarry Smith PetscErrorCode PetscDrawBarGetAxis(PetscDrawBar bar,PetscDrawAxis *axis) 34651fa3d41SBarry Smith { 34751fa3d41SBarry Smith PetscFunctionBegin; 348e118a51fSLisandro Dalcin PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 34945f3bb6eSLisandro Dalcin PetscValidPointer(axis,2); 35051fa3d41SBarry Smith *axis = bar->axis; 35151fa3d41SBarry Smith PetscFunctionReturn(0); 35251fa3d41SBarry Smith } 35351fa3d41SBarry Smith 35451fa3d41SBarry Smith /*@C 35551fa3d41SBarry Smith PetscDrawBarGetDraw - Gets the draw context associated with a bar graph. 35651fa3d41SBarry Smith 35751fa3d41SBarry Smith Not Collective, PetscDraw is parallel if PetscDrawBar is parallel 35851fa3d41SBarry Smith 35951fa3d41SBarry Smith Input Parameter: 36051fa3d41SBarry Smith . bar - The bar graph context 36151fa3d41SBarry Smith 36251fa3d41SBarry Smith Output Parameter: 363e118a51fSLisandro Dalcin . draw - The draw context 36451fa3d41SBarry Smith 36551fa3d41SBarry Smith Level: intermediate 36651fa3d41SBarry Smith 3670afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarDraw(), PetscDraw 36851fa3d41SBarry Smith @*/ 369e118a51fSLisandro Dalcin PetscErrorCode PetscDrawBarGetDraw(PetscDrawBar bar,PetscDraw *draw) 37051fa3d41SBarry Smith { 37151fa3d41SBarry Smith PetscFunctionBegin; 37251fa3d41SBarry Smith PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 37345f3bb6eSLisandro Dalcin PetscValidPointer(draw,2); 374e118a51fSLisandro Dalcin *draw = bar->win; 37551fa3d41SBarry Smith PetscFunctionReturn(0); 37651fa3d41SBarry Smith } 37751fa3d41SBarry Smith 37851fa3d41SBarry Smith /*@ 37951fa3d41SBarry Smith PetscDrawBarSetFromOptions - Sets options related to the PetscDrawBar 38051fa3d41SBarry Smith 38151fa3d41SBarry Smith Collective over PetscDrawBar 38251fa3d41SBarry Smith 38351fa3d41SBarry Smith Options Database: 38451fa3d41SBarry Smith . -bar_sort - sort the entries before drawing the bar graph 38551fa3d41SBarry Smith 38651fa3d41SBarry Smith Level: intermediate 38751fa3d41SBarry Smith 3880afdd333SBarry Smith .seealso: PetscDrawBarDestroy(), PetscDrawBarCreate(), PetscDrawBarSort() 38951fa3d41SBarry Smith @*/ 39051fa3d41SBarry Smith PetscErrorCode PetscDrawBarSetFromOptions(PetscDrawBar bar) 39151fa3d41SBarry Smith { 39251fa3d41SBarry Smith PetscErrorCode ierr; 39351fa3d41SBarry Smith PetscBool set; 39451fa3d41SBarry Smith 39551fa3d41SBarry Smith PetscFunctionBegin; 396e118a51fSLisandro Dalcin PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 397e118a51fSLisandro Dalcin 39871917b75SLisandro Dalcin ierr = PetscOptionsHasName(((PetscObject)bar)->options,((PetscObject)bar)->prefix,"-bar_sort",&set);CHKERRQ(ierr); 39951fa3d41SBarry Smith if (set) { 400e118a51fSLisandro Dalcin PetscReal tol = bar->sorttolerance; 40171917b75SLisandro Dalcin ierr = PetscOptionsGetReal(((PetscObject)bar)->options,((PetscObject)bar)->prefix,"-bar_sort",&tol,NULL);CHKERRQ(ierr); 40251fa3d41SBarry Smith ierr = PetscDrawBarSort(bar,PETSC_TRUE,tol);CHKERRQ(ierr); 40351fa3d41SBarry Smith } 40451fa3d41SBarry Smith PetscFunctionReturn(0); 40551fa3d41SBarry Smith } 406