151fa3d41SBarry Smith 251fa3d41SBarry Smith /* 351fa3d41SBarry Smith Contains the data structure for plotting a bargraph in a window with an axis. 451fa3d41SBarry Smith */ 551fa3d41SBarry Smith #include <petscdraw.h> /*I "petscdraw.h" I*/ 6af0996ceSBarry Smith #include <petsc/private/petscimpl.h> /*I "petscsys.h" I*/ 751fa3d41SBarry Smith #include <petscviewer.h> /*I "petscviewer.h" I*/ 851fa3d41SBarry Smith #include <../src/sys/classes/draw/utils/axisimpl.h> /* so we can directly modify axis xticks */ 951fa3d41SBarry Smith 1051fa3d41SBarry Smith PetscClassId PETSC_DRAWBAR_CLASSID = 0; 1151fa3d41SBarry Smith 1251fa3d41SBarry Smith struct _p_PetscDrawBar { 1351fa3d41SBarry Smith PETSCHEADER(int); 1451fa3d41SBarry Smith PetscErrorCode (*destroy)(PetscDrawSP); 1551fa3d41SBarry Smith PetscErrorCode (*view)(PetscDrawSP,PetscViewer); 1651fa3d41SBarry Smith PetscDraw win; 1751fa3d41SBarry Smith PetscDrawAxis axis; 1851fa3d41SBarry Smith PetscReal ymin,ymax; 1951fa3d41SBarry Smith int numBins; 2051fa3d41SBarry Smith PetscReal *values; 2151fa3d41SBarry Smith int color; 2251fa3d41SBarry Smith char **labels; 2351fa3d41SBarry Smith PetscBool sort; 2451fa3d41SBarry Smith PetscReal sorttolerance; 2551fa3d41SBarry Smith }; 2651fa3d41SBarry Smith 2751fa3d41SBarry Smith #define CHUNKSIZE 100 2851fa3d41SBarry Smith 2951fa3d41SBarry Smith /*@C 3051fa3d41SBarry Smith PetscDrawBarCreate - Creates a bar graph data structure. 3151fa3d41SBarry Smith 3251fa3d41SBarry Smith Collective over PetscDraw 3351fa3d41SBarry Smith 3451fa3d41SBarry Smith Input Parameters: 3551fa3d41SBarry Smith . draw - The window where the graph will be made 3651fa3d41SBarry Smith 3751fa3d41SBarry Smith Output Parameters: 3851fa3d41SBarry Smith . bar - The bar graph context 3951fa3d41SBarry Smith 4095452b02SPatrick Sanan Notes: 4195452b02SPatrick Sanan Call PetscDrawBarSetData() to provide the bins to be plotted and then PetscDrawBarDraw() to display the new plot 420afdd333SBarry Smith 430afdd333SBarry Smith The difference between a bar chart, PetscDrawBar, and a histogram, PetscDrawHG, is explained here http://stattrek.com/statistics/charts/histogram.aspx?Tutorial=AP 447e25d57eSBarry Smith 457e25d57eSBarry 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 467e25d57eSBarry Smith zeroth MPI process in the communicator. All MPI processes in the communicator must call PetscDrawBarDraw() to display the updated graph. 470afdd333SBarry Smith 4851fa3d41SBarry Smith Level: intermediate 4951fa3d41SBarry Smith 5051fa3d41SBarry Smith Concepts: bar graph^creating 5151fa3d41SBarry Smith 520afdd333SBarry Smith .seealso: PetscDrawLGCreate(), PetscDrawLG, PetscDrawSPCreate(), PetscDrawSP, PetscDrawHGCreate(), PetscDrawHG, PetscDrawBarDestroy(), PetscDrawBarSetData(), 530afdd333SBarry Smith PetscDrawBar, PetscDrawBarDraw(), PetscDrawBarSave(), PetscDrawBarSetColor(), PetscDrawBarSort(), PetscDrawBarSetLimits(), PetscDrawBarGetAxis(), PetscDrawAxis, 540afdd333SBarry Smith PetscDrawBarGetDraw(), PetscDrawBarSetFromOptions() 5551fa3d41SBarry Smith @*/ 5651fa3d41SBarry Smith PetscErrorCode PetscDrawBarCreate(PetscDraw draw,PetscDrawBar *bar) 5751fa3d41SBarry Smith { 5851fa3d41SBarry Smith PetscDrawBar h; 5951fa3d41SBarry Smith PetscErrorCode ierr; 6051fa3d41SBarry Smith 6151fa3d41SBarry Smith PetscFunctionBegin; 6251fa3d41SBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 6373107ff1SLisandro Dalcin PetscValidPointer(bar,2); 64e118a51fSLisandro Dalcin 6571917b75SLisandro Dalcin ierr = PetscHeaderCreate(h,PETSC_DRAWBAR_CLASSID,"DrawBar","Bar Graph","Draw",PetscObjectComm((PetscObject)draw),PetscDrawBarDestroy,NULL);CHKERRQ(ierr); 66e118a51fSLisandro Dalcin ierr = PetscLogObjectParent((PetscObject)draw,(PetscObject)h);CHKERRQ(ierr); 67e118a51fSLisandro Dalcin 68e118a51fSLisandro Dalcin ierr = PetscObjectReference((PetscObject)draw);CHKERRQ(ierr); 69e118a51fSLisandro Dalcin h->win = draw; 7051fa3d41SBarry Smith 7151fa3d41SBarry Smith h->view = NULL; 7251fa3d41SBarry Smith h->destroy = NULL; 7351fa3d41SBarry Smith h->color = PETSC_DRAW_GREEN; 7451fa3d41SBarry Smith h->ymin = 0.; /* if user has not set these then they are determined from the data */ 7551fa3d41SBarry Smith h->ymax = 0.; 7651fa3d41SBarry Smith h->numBins = 0; 7751fa3d41SBarry Smith 7851fa3d41SBarry Smith ierr = PetscDrawAxisCreate(draw,&h->axis);CHKERRQ(ierr); 7945f3bb6eSLisandro Dalcin h->axis->xticks = NULL; 80e118a51fSLisandro Dalcin 8151fa3d41SBarry Smith *bar = h; 8251fa3d41SBarry Smith PetscFunctionReturn(0); 8351fa3d41SBarry Smith } 8451fa3d41SBarry Smith 8551fa3d41SBarry Smith /*@C 8651fa3d41SBarry Smith PetscDrawBarSetData 8751fa3d41SBarry Smith 885b399a63SLisandro Dalcin Logically Collective on PetscDrawBar 8951fa3d41SBarry Smith 9051fa3d41SBarry Smith Input Parameter: 9151fa3d41SBarry Smith + bar - The bar graph context. 9251fa3d41SBarry Smith . bins - number of items 9351fa3d41SBarry Smith . values - values of each item 9451fa3d41SBarry Smith - labels - optional label for each bar, NULL terminated array of strings 9551fa3d41SBarry Smith 9651fa3d41SBarry Smith Level: intermediate 9751fa3d41SBarry Smith 9895452b02SPatrick Sanan Notes: 9995452b02SPatrick Sanan Call PetscDrawBarDraw() after this call to display the new plot 1000afdd333SBarry Smith 1010afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarDraw() 10251fa3d41SBarry Smith 10351fa3d41SBarry Smith @*/ 10451fa3d41SBarry Smith PetscErrorCode PetscDrawBarSetData(PetscDrawBar bar,PetscInt bins,const PetscReal data[],const char *const *labels) 10551fa3d41SBarry Smith { 10651fa3d41SBarry Smith PetscErrorCode ierr; 10751fa3d41SBarry Smith 10851fa3d41SBarry Smith PetscFunctionBegin; 10951fa3d41SBarry Smith PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 110e118a51fSLisandro Dalcin 11151fa3d41SBarry Smith if (bar->numBins != bins) { 11251fa3d41SBarry Smith ierr = PetscFree(bar->values);CHKERRQ(ierr); 11351fa3d41SBarry Smith ierr = PetscMalloc1(bins, &bar->values);CHKERRQ(ierr); 11451fa3d41SBarry Smith bar->numBins = bins; 11551fa3d41SBarry Smith } 11651fa3d41SBarry Smith ierr = PetscMemcpy(bar->values,data,bins*sizeof(PetscReal));CHKERRQ(ierr); 11751fa3d41SBarry Smith bar->numBins = bins; 11851fa3d41SBarry Smith if (labels) { 11951fa3d41SBarry Smith ierr = PetscStrArrayallocpy(labels,&bar->labels);CHKERRQ(ierr); 12051fa3d41SBarry Smith } 12151fa3d41SBarry Smith PetscFunctionReturn(0); 12251fa3d41SBarry Smith } 12351fa3d41SBarry Smith 12451fa3d41SBarry Smith /*@C 12551fa3d41SBarry Smith PetscDrawBarDestroy - Frees all space taken up by bar graph data structure. 12651fa3d41SBarry Smith 12751fa3d41SBarry Smith Collective over PetscDrawBar 12851fa3d41SBarry Smith 12951fa3d41SBarry Smith Input Parameter: 13051fa3d41SBarry Smith . bar - The bar graph context 13151fa3d41SBarry Smith 13251fa3d41SBarry Smith Level: intermediate 13351fa3d41SBarry Smith 13451fa3d41SBarry Smith .seealso: PetscDrawBarCreate() 13551fa3d41SBarry Smith @*/ 13651fa3d41SBarry Smith PetscErrorCode PetscDrawBarDestroy(PetscDrawBar *bar) 13751fa3d41SBarry Smith { 13851fa3d41SBarry Smith PetscErrorCode ierr; 13951fa3d41SBarry Smith 14051fa3d41SBarry Smith PetscFunctionBegin; 14151fa3d41SBarry Smith if (!*bar) PetscFunctionReturn(0); 142e118a51fSLisandro Dalcin PetscValidHeaderSpecific(*bar,PETSC_DRAWBAR_CLASSID,1); 14351fa3d41SBarry Smith if (--((PetscObject)(*bar))->refct > 0) PetscFunctionReturn(0); 144e118a51fSLisandro Dalcin 14551fa3d41SBarry Smith ierr = PetscFree((*bar)->values);CHKERRQ(ierr); 14651fa3d41SBarry Smith ierr = PetscStrArrayDestroy(&(*bar)->labels);CHKERRQ(ierr); 147e118a51fSLisandro Dalcin ierr = PetscDrawAxisDestroy(&(*bar)->axis);CHKERRQ(ierr); 148e118a51fSLisandro Dalcin ierr = PetscDrawDestroy(&(*bar)->win);CHKERRQ(ierr); 14951fa3d41SBarry Smith ierr = PetscHeaderDestroy(bar);CHKERRQ(ierr); 15051fa3d41SBarry Smith PetscFunctionReturn(0); 15151fa3d41SBarry Smith } 15251fa3d41SBarry Smith 15351fa3d41SBarry Smith /*@ 15451fa3d41SBarry Smith PetscDrawBarDraw - Redraws a bar graph. 15551fa3d41SBarry Smith 1565b399a63SLisandro Dalcin Collective on PetscDrawBar 15751fa3d41SBarry Smith 15851fa3d41SBarry Smith Input Parameter: 15951fa3d41SBarry Smith . bar - The bar graph context 16051fa3d41SBarry Smith 16151fa3d41SBarry Smith Level: intermediate 16251fa3d41SBarry Smith 1630afdd333SBarry Smith .seealso: PetscDrawBar, PetscDrawBarCreate(), PetscDrawBarSetData() 1640afdd333SBarry Smith 16551fa3d41SBarry Smith @*/ 16651fa3d41SBarry Smith PetscErrorCode PetscDrawBarDraw(PetscDrawBar bar) 16751fa3d41SBarry Smith { 168e118a51fSLisandro Dalcin PetscDraw draw; 16951fa3d41SBarry Smith PetscBool isnull; 17051fa3d41SBarry Smith PetscReal xmin,xmax,ymin,ymax,*values,binLeft,binRight; 17151fa3d41SBarry Smith PetscInt numValues,i,bcolor,color,idx,*perm,nplot; 172e118a51fSLisandro Dalcin PetscMPIInt rank; 17351fa3d41SBarry Smith PetscErrorCode ierr; 17451fa3d41SBarry Smith char **labels; 17551fa3d41SBarry Smith 17651fa3d41SBarry Smith PetscFunctionBegin; 17751fa3d41SBarry Smith PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 1788f69470aSLisandro Dalcin ierr = PetscDrawIsNull(bar->win,&isnull);CHKERRQ(ierr); 1798f69470aSLisandro Dalcin if (isnull) PetscFunctionReturn(0); 180e118a51fSLisandro Dalcin ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)bar),&rank);CHKERRQ(ierr); 18151fa3d41SBarry Smith 1825b399a63SLisandro Dalcin if (bar->numBins < 1) PetscFunctionReturn(0); 1835b399a63SLisandro Dalcin 18451fa3d41SBarry Smith color = bar->color; 18571917b75SLisandro Dalcin if (color == PETSC_DRAW_ROTATE) bcolor = PETSC_DRAW_BLACK+1; 18651fa3d41SBarry Smith else bcolor = color; 18751fa3d41SBarry Smith 18851fa3d41SBarry Smith numValues = bar->numBins; 18951fa3d41SBarry Smith values = bar->values; 19051fa3d41SBarry Smith if (bar->ymin == bar->ymax) { 19151fa3d41SBarry Smith /* user has not set bounds on bars so set them based on the data */ 19251fa3d41SBarry Smith ymin = PETSC_MAX_REAL; 19351fa3d41SBarry Smith ymax = PETSC_MIN_REAL; 19451fa3d41SBarry Smith for (i=0; i<numValues; i++) { 19551fa3d41SBarry Smith ymin = PetscMin(ymin,values[i]); 19651fa3d41SBarry Smith ymax = PetscMax(ymax,values[i]); 19751fa3d41SBarry Smith } 19851fa3d41SBarry Smith } else { 19951fa3d41SBarry Smith ymin = bar->ymin; 20051fa3d41SBarry Smith ymax = bar->ymax; 20151fa3d41SBarry Smith } 20251fa3d41SBarry Smith nplot = numValues; /* number of points to actually plot; if some are lower than requested tolerance */ 20351fa3d41SBarry Smith xmin = 0.0; 204e118a51fSLisandro Dalcin xmax = nplot; 20551fa3d41SBarry Smith labels = bar->labels; 20651fa3d41SBarry Smith 20751fa3d41SBarry Smith if (bar->sort) { 20851fa3d41SBarry Smith ierr = PetscMalloc1(numValues,&perm);CHKERRQ(ierr); 20951fa3d41SBarry Smith for (i=0; i<numValues;i++) perm[i] = i; 21051fa3d41SBarry Smith ierr = PetscSortRealWithPermutation(numValues,values,perm);CHKERRQ(ierr); 21151fa3d41SBarry Smith if (bar->sorttolerance) { 21251fa3d41SBarry Smith for (i=0; i<numValues;i++) { 21351fa3d41SBarry Smith if (values[perm[numValues - i - 1]] < bar->sorttolerance) { 21451fa3d41SBarry Smith nplot = i; 21551fa3d41SBarry Smith break; 21651fa3d41SBarry Smith } 21751fa3d41SBarry Smith } 21851fa3d41SBarry Smith } 21951fa3d41SBarry Smith } 22051fa3d41SBarry Smith 2215b399a63SLisandro Dalcin draw = bar->win; 222e118a51fSLisandro Dalcin ierr = PetscDrawCheckResizedWindow(draw);CHKERRQ(ierr); 2235b399a63SLisandro Dalcin ierr = PetscDrawClear(draw);CHKERRQ(ierr); 224e118a51fSLisandro Dalcin 22551fa3d41SBarry Smith ierr = PetscDrawAxisSetLimits(bar->axis,xmin,xmax,ymin,ymax);CHKERRQ(ierr); 22651fa3d41SBarry Smith ierr = PetscDrawAxisDraw(bar->axis);CHKERRQ(ierr); 22751fa3d41SBarry Smith 2285b399a63SLisandro Dalcin ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr); 229e118a51fSLisandro Dalcin if (!rank) { /* Draw bins */ 23051fa3d41SBarry Smith for (i=0; i<nplot; i++) { 23151fa3d41SBarry Smith idx = (bar->sort ? perm[numValues - i - 1] : i); 23251fa3d41SBarry Smith binLeft = xmin + i; 23351fa3d41SBarry Smith binRight = xmin + i + 1; 23451fa3d41SBarry Smith ierr = PetscDrawRectangle(draw,binLeft,ymin,binRight,values[idx],bcolor,bcolor,bcolor,bcolor);CHKERRQ(ierr); 23551fa3d41SBarry Smith ierr = PetscDrawLine(draw,binLeft,ymin,binLeft,values[idx],PETSC_DRAW_BLACK);CHKERRQ(ierr); 23651fa3d41SBarry Smith ierr = PetscDrawLine(draw,binRight,ymin,binRight,values[idx],PETSC_DRAW_BLACK);CHKERRQ(ierr); 23751fa3d41SBarry Smith ierr = PetscDrawLine(draw,binLeft,values[idx],binRight,values[idx],PETSC_DRAW_BLACK);CHKERRQ(ierr); 23851fa3d41SBarry Smith if (labels) { 23951fa3d41SBarry Smith PetscReal h; 24051fa3d41SBarry Smith ierr = PetscDrawStringGetSize(draw,NULL,&h);CHKERRQ(ierr); 24171917b75SLisandro Dalcin ierr = PetscDrawStringCentered(draw,.5*(binLeft+binRight),ymin - 1.5*h,bcolor,labels[idx]);CHKERRQ(ierr); 24251fa3d41SBarry Smith } 24351fa3d41SBarry Smith if (color == PETSC_DRAW_ROTATE) bcolor++; 24471917b75SLisandro Dalcin if (bcolor > PETSC_DRAW_BASIC_COLORS-1) bcolor = PETSC_DRAW_BLACK+1; 24551fa3d41SBarry Smith } 24651fa3d41SBarry Smith } 2475b399a63SLisandro Dalcin ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr); 248e118a51fSLisandro Dalcin if (bar->sort) {ierr = PetscFree(perm);CHKERRQ(ierr);} 249e118a51fSLisandro Dalcin 2505b399a63SLisandro Dalcin ierr = PetscDrawFlush(draw);CHKERRQ(ierr); 25151fa3d41SBarry Smith ierr = PetscDrawPause(draw);CHKERRQ(ierr); 25251fa3d41SBarry Smith PetscFunctionReturn(0); 25351fa3d41SBarry Smith } 25451fa3d41SBarry Smith 25557fd6651SLisandro Dalcin /*@ 25657fd6651SLisandro Dalcin PetscDrawBarSave - Saves a drawn image 25757fd6651SLisandro Dalcin 25857fd6651SLisandro Dalcin Collective on PetscDrawBar 25957fd6651SLisandro Dalcin 26057fd6651SLisandro Dalcin Input Parameters: 26157fd6651SLisandro Dalcin . bar - The bar graph context 26257fd6651SLisandro Dalcin 26357fd6651SLisandro Dalcin Level: intermediate 26457fd6651SLisandro Dalcin 26557fd6651SLisandro Dalcin Concepts: bar graph^saving 26657fd6651SLisandro Dalcin 2670afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBarGetDraw(), PetscDrawSetSave(), PetscDrawSave(), PetscDrawBarSetData() 26857fd6651SLisandro Dalcin @*/ 26957fd6651SLisandro Dalcin PetscErrorCode PetscDrawBarSave(PetscDrawBar bar) 27057fd6651SLisandro Dalcin { 27157fd6651SLisandro Dalcin PetscErrorCode ierr; 27257fd6651SLisandro Dalcin 27357fd6651SLisandro Dalcin PetscFunctionBegin; 27457fd6651SLisandro Dalcin PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 27557fd6651SLisandro Dalcin ierr = PetscDrawSave(bar->win);CHKERRQ(ierr); 27657fd6651SLisandro Dalcin PetscFunctionReturn(0); 27757fd6651SLisandro Dalcin } 27857fd6651SLisandro Dalcin 27951fa3d41SBarry Smith /*@ 28051fa3d41SBarry Smith PetscDrawBarSetColor - Sets the color the bars will be drawn with. 28151fa3d41SBarry Smith 2825b399a63SLisandro Dalcin Logically Collective on PetscDrawBar 28351fa3d41SBarry Smith 28451fa3d41SBarry Smith Input Parameters: 28551fa3d41SBarry Smith + bar - The bar graph context 28651fa3d41SBarry Smith - color - one of the colors defined in petscdraw.h or PETSC_DRAW_ROTATE to make each bar a 28751fa3d41SBarry Smith different color 28851fa3d41SBarry Smith 28951fa3d41SBarry Smith Level: intermediate 29051fa3d41SBarry Smith 2910afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarSetData(), PetscDrawBarDraw(), PetscDrawBarGetAxis() 2920afdd333SBarry Smith 29351fa3d41SBarry Smith @*/ 29451fa3d41SBarry Smith PetscErrorCode PetscDrawBarSetColor(PetscDrawBar bar, int color) 29551fa3d41SBarry Smith { 29651fa3d41SBarry Smith PetscFunctionBegin; 29751fa3d41SBarry Smith PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID,1); 29851fa3d41SBarry Smith bar->color = color; 29951fa3d41SBarry Smith PetscFunctionReturn(0); 30051fa3d41SBarry Smith } 30151fa3d41SBarry Smith 30251fa3d41SBarry Smith /*@ 30351fa3d41SBarry Smith PetscDrawBarSort - Sorts the values before drawing the bar chart 30451fa3d41SBarry Smith 3055b399a63SLisandro Dalcin Logically Collective on PetscDrawBar 30651fa3d41SBarry Smith 30751fa3d41SBarry Smith Input Parameters: 30851fa3d41SBarry Smith + bar - The bar graph context 30951fa3d41SBarry Smith . sort - PETSC_TRUE to sort the values 310*a2b725a8SWilliam Gropp - tolerance - discard values less than tolerance 31151fa3d41SBarry Smith 31251fa3d41SBarry Smith Level: intermediate 31351fa3d41SBarry Smith 31451fa3d41SBarry Smith Concepts: bar graph^setting axis 3150afdd333SBarry Smith 3160afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarSetData(), PetscDrawBarSetColor(), PetscDrawBarDraw(), PetscDrawBarGetAxis() 31751fa3d41SBarry Smith @*/ 31851fa3d41SBarry Smith PetscErrorCode PetscDrawBarSort(PetscDrawBar bar, PetscBool sort, PetscReal tolerance) 31951fa3d41SBarry Smith { 32051fa3d41SBarry Smith PetscFunctionBegin; 32151fa3d41SBarry Smith PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 32251fa3d41SBarry Smith bar->sort = sort; 32351fa3d41SBarry Smith bar->sorttolerance = tolerance; 32451fa3d41SBarry Smith PetscFunctionReturn(0); 32551fa3d41SBarry Smith } 32651fa3d41SBarry Smith 32751fa3d41SBarry Smith /*@ 32851fa3d41SBarry Smith PetscDrawBarSetLimits - Sets the axis limits for a bar graph. If more 32951fa3d41SBarry Smith points are added after this call, the limits will be adjusted to 33051fa3d41SBarry Smith include those additional points. 33151fa3d41SBarry Smith 3325b399a63SLisandro Dalcin Logically Collective on PetscDrawBar 33351fa3d41SBarry Smith 33451fa3d41SBarry Smith Input Parameters: 33551fa3d41SBarry Smith + bar - The bar graph context 33651fa3d41SBarry Smith - y_min,y_max - The limits 33751fa3d41SBarry Smith 33851fa3d41SBarry Smith Level: intermediate 33951fa3d41SBarry Smith 34051fa3d41SBarry Smith Concepts: bar graph^setting axis 3410afdd333SBarry Smith 3420afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarGetAxis(), PetscDrawBarSetData(), PetscDrawBarDraw() 34351fa3d41SBarry Smith @*/ 34451fa3d41SBarry Smith PetscErrorCode PetscDrawBarSetLimits(PetscDrawBar bar, PetscReal y_min, PetscReal y_max) 34551fa3d41SBarry Smith { 34651fa3d41SBarry Smith PetscFunctionBegin; 34751fa3d41SBarry Smith PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 34851fa3d41SBarry Smith bar->ymin = y_min; 34951fa3d41SBarry Smith bar->ymax = y_max; 35051fa3d41SBarry Smith PetscFunctionReturn(0); 35151fa3d41SBarry Smith } 35251fa3d41SBarry Smith 35351fa3d41SBarry Smith /*@C 35451fa3d41SBarry Smith PetscDrawBarGetAxis - Gets the axis context associated with a bar graph. 35551fa3d41SBarry Smith This is useful if one wants to change some axis property, such as 35651fa3d41SBarry Smith labels, color, etc. The axis context should not be destroyed by the 35751fa3d41SBarry Smith application code. 35851fa3d41SBarry Smith 3595b399a63SLisandro Dalcin Not Collective, PetscDrawAxis is parallel if PetscDrawBar is parallel 36051fa3d41SBarry Smith 36151fa3d41SBarry Smith Input Parameter: 36251fa3d41SBarry Smith . bar - The bar graph context 36351fa3d41SBarry Smith 36451fa3d41SBarry Smith Output Parameter: 36551fa3d41SBarry Smith . axis - The axis context 36651fa3d41SBarry Smith 36751fa3d41SBarry Smith Level: intermediate 36851fa3d41SBarry Smith 3690afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawAxis, PetscDrawAxisCreate() 37051fa3d41SBarry Smith @*/ 37151fa3d41SBarry Smith PetscErrorCode PetscDrawBarGetAxis(PetscDrawBar bar,PetscDrawAxis *axis) 37251fa3d41SBarry Smith { 37351fa3d41SBarry Smith PetscFunctionBegin; 374e118a51fSLisandro Dalcin PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 37545f3bb6eSLisandro Dalcin PetscValidPointer(axis,2); 37651fa3d41SBarry Smith *axis = bar->axis; 37751fa3d41SBarry Smith PetscFunctionReturn(0); 37851fa3d41SBarry Smith } 37951fa3d41SBarry Smith 38051fa3d41SBarry Smith /*@C 38151fa3d41SBarry Smith PetscDrawBarGetDraw - Gets the draw context associated with a bar graph. 38251fa3d41SBarry Smith 38351fa3d41SBarry Smith Not Collective, PetscDraw is parallel if PetscDrawBar is parallel 38451fa3d41SBarry Smith 38551fa3d41SBarry Smith Input Parameter: 38651fa3d41SBarry Smith . bar - The bar graph context 38751fa3d41SBarry Smith 38851fa3d41SBarry Smith Output Parameter: 389e118a51fSLisandro Dalcin . draw - The draw context 39051fa3d41SBarry Smith 39151fa3d41SBarry Smith Level: intermediate 39251fa3d41SBarry Smith 3930afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarDraw(), PetscDraw 39451fa3d41SBarry Smith @*/ 395e118a51fSLisandro Dalcin PetscErrorCode PetscDrawBarGetDraw(PetscDrawBar bar,PetscDraw *draw) 39651fa3d41SBarry Smith { 39751fa3d41SBarry Smith PetscFunctionBegin; 39851fa3d41SBarry Smith PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 39945f3bb6eSLisandro Dalcin PetscValidPointer(draw,2); 400e118a51fSLisandro Dalcin *draw = bar->win; 40151fa3d41SBarry Smith PetscFunctionReturn(0); 40251fa3d41SBarry Smith } 40351fa3d41SBarry Smith 40451fa3d41SBarry Smith /*@ 40551fa3d41SBarry Smith PetscDrawBarSetFromOptions - Sets options related to the PetscDrawBar 40651fa3d41SBarry Smith 40751fa3d41SBarry Smith Collective over PetscDrawBar 40851fa3d41SBarry Smith 40951fa3d41SBarry Smith Options Database: 41051fa3d41SBarry Smith . -bar_sort - sort the entries before drawing the bar graph 41151fa3d41SBarry Smith 41251fa3d41SBarry Smith Level: intermediate 41351fa3d41SBarry Smith 41451fa3d41SBarry Smith 4150afdd333SBarry Smith .seealso: PetscDrawBarDestroy(), PetscDrawBarCreate(), PetscDrawBarSort() 41651fa3d41SBarry Smith @*/ 41751fa3d41SBarry Smith PetscErrorCode PetscDrawBarSetFromOptions(PetscDrawBar bar) 41851fa3d41SBarry Smith { 41951fa3d41SBarry Smith PetscErrorCode ierr; 42051fa3d41SBarry Smith PetscBool set; 42151fa3d41SBarry Smith 42251fa3d41SBarry Smith PetscFunctionBegin; 423e118a51fSLisandro Dalcin PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 424e118a51fSLisandro Dalcin 42571917b75SLisandro Dalcin ierr = PetscOptionsHasName(((PetscObject)bar)->options,((PetscObject)bar)->prefix,"-bar_sort",&set);CHKERRQ(ierr); 42651fa3d41SBarry Smith if (set) { 427e118a51fSLisandro Dalcin PetscReal tol = bar->sorttolerance; 42871917b75SLisandro Dalcin ierr = PetscOptionsGetReal(((PetscObject)bar)->options,((PetscObject)bar)->prefix,"-bar_sort",&tol,NULL);CHKERRQ(ierr); 42951fa3d41SBarry Smith ierr = PetscDrawBarSort(bar,PETSC_TRUE,tol);CHKERRQ(ierr); 43051fa3d41SBarry Smith } 43151fa3d41SBarry Smith PetscFunctionReturn(0); 43251fa3d41SBarry Smith } 43351fa3d41SBarry Smith 434