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 #undef __FUNCT__ 3051fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarCreate" 3151fa3d41SBarry Smith /*@C 3251fa3d41SBarry Smith PetscDrawBarCreate - Creates a bar graph data structure. 3351fa3d41SBarry Smith 3451fa3d41SBarry Smith Collective over PetscDraw 3551fa3d41SBarry Smith 3651fa3d41SBarry Smith Input Parameters: 3751fa3d41SBarry Smith . draw - The window where the graph will be made 3851fa3d41SBarry Smith 3951fa3d41SBarry Smith Output Parameters: 4051fa3d41SBarry Smith . bar - The bar graph context 4151fa3d41SBarry Smith 420afdd333SBarry Smith Notes: Call PetscDrawBarSetData() to provide the bins to be plotted and then PetscDrawBarDraw() to display the new plot 430afdd333SBarry Smith 440afdd333SBarry Smith The difference between a bar chart, PetscDrawBar, and a histogram, PetscDrawHG, is explained here http://stattrek.com/statistics/charts/histogram.aspx?Tutorial=AP 45*7e25d57eSBarry Smith 46*7e25d57eSBarry 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 47*7e25d57eSBarry Smith zeroth MPI process in the communicator. All MPI processes in the communicator must call PetscDrawBarDraw() to display the updated graph. 480afdd333SBarry Smith 4951fa3d41SBarry Smith Level: intermediate 5051fa3d41SBarry Smith 5151fa3d41SBarry Smith Concepts: bar graph^creating 5251fa3d41SBarry Smith 530afdd333SBarry Smith .seealso: PetscDrawLGCreate(), PetscDrawLG, PetscDrawSPCreate(), PetscDrawSP, PetscDrawHGCreate(), PetscDrawHG, PetscDrawBarDestroy(), PetscDrawBarSetData(), 540afdd333SBarry Smith PetscDrawBar, PetscDrawBarDraw(), PetscDrawBarSave(), PetscDrawBarSetColor(), PetscDrawBarSort(), PetscDrawBarSetLimits(), PetscDrawBarGetAxis(), PetscDrawAxis, 550afdd333SBarry Smith PetscDrawBarGetDraw(), PetscDrawBarSetFromOptions() 5651fa3d41SBarry Smith @*/ 5751fa3d41SBarry Smith PetscErrorCode PetscDrawBarCreate(PetscDraw draw,PetscDrawBar *bar) 5851fa3d41SBarry Smith { 5951fa3d41SBarry Smith PetscDrawBar h; 6051fa3d41SBarry Smith PetscErrorCode ierr; 6151fa3d41SBarry Smith 6251fa3d41SBarry Smith PetscFunctionBegin; 6351fa3d41SBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 6473107ff1SLisandro Dalcin PetscValidPointer(bar,2); 65e118a51fSLisandro Dalcin 6671917b75SLisandro Dalcin ierr = PetscHeaderCreate(h,PETSC_DRAWBAR_CLASSID,"DrawBar","Bar Graph","Draw",PetscObjectComm((PetscObject)draw),PetscDrawBarDestroy,NULL);CHKERRQ(ierr); 67e118a51fSLisandro Dalcin ierr = PetscLogObjectParent((PetscObject)draw,(PetscObject)h);CHKERRQ(ierr); 68e118a51fSLisandro Dalcin 69e118a51fSLisandro Dalcin ierr = PetscObjectReference((PetscObject)draw);CHKERRQ(ierr); 70e118a51fSLisandro Dalcin h->win = draw; 7151fa3d41SBarry Smith 7251fa3d41SBarry Smith h->view = NULL; 7351fa3d41SBarry Smith h->destroy = NULL; 7451fa3d41SBarry Smith h->color = PETSC_DRAW_GREEN; 7551fa3d41SBarry Smith h->ymin = 0.; /* if user has not set these then they are determined from the data */ 7651fa3d41SBarry Smith h->ymax = 0.; 7751fa3d41SBarry Smith h->numBins = 0; 7851fa3d41SBarry Smith 7951fa3d41SBarry Smith ierr = PetscDrawAxisCreate(draw,&h->axis);CHKERRQ(ierr); 8045f3bb6eSLisandro Dalcin h->axis->xticks = NULL; 81e118a51fSLisandro Dalcin 8251fa3d41SBarry Smith *bar = h; 8351fa3d41SBarry Smith PetscFunctionReturn(0); 8451fa3d41SBarry Smith } 8551fa3d41SBarry Smith 8651fa3d41SBarry Smith #undef __FUNCT__ 8751fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSetData" 8851fa3d41SBarry Smith /*@C 8951fa3d41SBarry Smith PetscDrawBarSetData 9051fa3d41SBarry Smith 915b399a63SLisandro Dalcin Logically Collective on PetscDrawBar 9251fa3d41SBarry Smith 9351fa3d41SBarry Smith Input Parameter: 9451fa3d41SBarry Smith + bar - The bar graph context. 9551fa3d41SBarry Smith . bins - number of items 9651fa3d41SBarry Smith . values - values of each item 9751fa3d41SBarry Smith - labels - optional label for each bar, NULL terminated array of strings 9851fa3d41SBarry Smith 9951fa3d41SBarry Smith Level: intermediate 10051fa3d41SBarry Smith 1010afdd333SBarry Smith Notes: Call PetscDrawBarDraw() after this call to display the new plot 1020afdd333SBarry Smith 1030afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarDraw() 10451fa3d41SBarry Smith 10551fa3d41SBarry Smith @*/ 10651fa3d41SBarry Smith PetscErrorCode PetscDrawBarSetData(PetscDrawBar bar,PetscInt bins,const PetscReal data[],const char *const *labels) 10751fa3d41SBarry Smith { 10851fa3d41SBarry Smith PetscErrorCode ierr; 10951fa3d41SBarry Smith 11051fa3d41SBarry Smith PetscFunctionBegin; 11151fa3d41SBarry Smith PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 112e118a51fSLisandro Dalcin 11351fa3d41SBarry Smith if (bar->numBins != bins) { 11451fa3d41SBarry Smith ierr = PetscFree(bar->values);CHKERRQ(ierr); 11551fa3d41SBarry Smith ierr = PetscMalloc1(bins, &bar->values);CHKERRQ(ierr); 11651fa3d41SBarry Smith bar->numBins = bins; 11751fa3d41SBarry Smith } 11851fa3d41SBarry Smith ierr = PetscMemcpy(bar->values,data,bins*sizeof(PetscReal));CHKERRQ(ierr); 11951fa3d41SBarry Smith bar->numBins = bins; 12051fa3d41SBarry Smith if (labels) { 12151fa3d41SBarry Smith ierr = PetscStrArrayallocpy(labels,&bar->labels);CHKERRQ(ierr); 12251fa3d41SBarry Smith } 12351fa3d41SBarry Smith PetscFunctionReturn(0); 12451fa3d41SBarry Smith } 12551fa3d41SBarry Smith 12651fa3d41SBarry Smith #undef __FUNCT__ 12751fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarDestroy" 12851fa3d41SBarry Smith /*@C 12951fa3d41SBarry Smith PetscDrawBarDestroy - Frees all space taken up by bar graph data structure. 13051fa3d41SBarry Smith 13151fa3d41SBarry Smith Collective over PetscDrawBar 13251fa3d41SBarry Smith 13351fa3d41SBarry Smith Input Parameter: 13451fa3d41SBarry Smith . bar - The bar graph context 13551fa3d41SBarry Smith 13651fa3d41SBarry Smith Level: intermediate 13751fa3d41SBarry Smith 13851fa3d41SBarry Smith .seealso: PetscDrawBarCreate() 13951fa3d41SBarry Smith @*/ 14051fa3d41SBarry Smith PetscErrorCode PetscDrawBarDestroy(PetscDrawBar *bar) 14151fa3d41SBarry Smith { 14251fa3d41SBarry Smith PetscErrorCode ierr; 14351fa3d41SBarry Smith 14451fa3d41SBarry Smith PetscFunctionBegin; 14551fa3d41SBarry Smith if (!*bar) PetscFunctionReturn(0); 146e118a51fSLisandro Dalcin PetscValidHeaderSpecific(*bar,PETSC_DRAWBAR_CLASSID,1); 14751fa3d41SBarry Smith if (--((PetscObject)(*bar))->refct > 0) PetscFunctionReturn(0); 148e118a51fSLisandro Dalcin 14951fa3d41SBarry Smith ierr = PetscFree((*bar)->values);CHKERRQ(ierr); 15051fa3d41SBarry Smith ierr = PetscStrArrayDestroy(&(*bar)->labels);CHKERRQ(ierr); 151e118a51fSLisandro Dalcin ierr = PetscDrawAxisDestroy(&(*bar)->axis);CHKERRQ(ierr); 152e118a51fSLisandro Dalcin ierr = PetscDrawDestroy(&(*bar)->win);CHKERRQ(ierr); 15351fa3d41SBarry Smith ierr = PetscHeaderDestroy(bar);CHKERRQ(ierr); 15451fa3d41SBarry Smith PetscFunctionReturn(0); 15551fa3d41SBarry Smith } 15651fa3d41SBarry Smith 15751fa3d41SBarry Smith #undef __FUNCT__ 15851fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarDraw" 15951fa3d41SBarry Smith /*@ 16051fa3d41SBarry Smith PetscDrawBarDraw - Redraws a bar graph. 16151fa3d41SBarry Smith 1625b399a63SLisandro Dalcin Collective on PetscDrawBar 16351fa3d41SBarry Smith 16451fa3d41SBarry Smith Input Parameter: 16551fa3d41SBarry Smith . bar - The bar graph context 16651fa3d41SBarry Smith 16751fa3d41SBarry Smith Level: intermediate 16851fa3d41SBarry Smith 1690afdd333SBarry Smith .seealso: PetscDrawBar, PetscDrawBarCreate(), PetscDrawBarSetData() 1700afdd333SBarry Smith 17151fa3d41SBarry Smith @*/ 17251fa3d41SBarry Smith PetscErrorCode PetscDrawBarDraw(PetscDrawBar bar) 17351fa3d41SBarry Smith { 174e118a51fSLisandro Dalcin PetscDraw draw; 17551fa3d41SBarry Smith PetscBool isnull; 17651fa3d41SBarry Smith PetscReal xmin,xmax,ymin,ymax,*values,binLeft,binRight; 17751fa3d41SBarry Smith PetscInt numValues,i,bcolor,color,idx,*perm,nplot; 178e118a51fSLisandro Dalcin PetscMPIInt rank; 17951fa3d41SBarry Smith PetscErrorCode ierr; 18051fa3d41SBarry Smith char **labels; 18151fa3d41SBarry Smith 18251fa3d41SBarry Smith PetscFunctionBegin; 18351fa3d41SBarry Smith PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 1848f69470aSLisandro Dalcin ierr = PetscDrawIsNull(bar->win,&isnull);CHKERRQ(ierr); 1858f69470aSLisandro Dalcin if (isnull) PetscFunctionReturn(0); 186e118a51fSLisandro Dalcin ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)bar),&rank);CHKERRQ(ierr); 18751fa3d41SBarry Smith 1885b399a63SLisandro Dalcin if (bar->numBins < 1) PetscFunctionReturn(0); 1895b399a63SLisandro Dalcin 19051fa3d41SBarry Smith color = bar->color; 19171917b75SLisandro Dalcin if (color == PETSC_DRAW_ROTATE) bcolor = PETSC_DRAW_BLACK+1; 19251fa3d41SBarry Smith else bcolor = color; 19351fa3d41SBarry Smith 19451fa3d41SBarry Smith numValues = bar->numBins; 19551fa3d41SBarry Smith values = bar->values; 19651fa3d41SBarry Smith if (bar->ymin == bar->ymax) { 19751fa3d41SBarry Smith /* user has not set bounds on bars so set them based on the data */ 19851fa3d41SBarry Smith ymin = PETSC_MAX_REAL; 19951fa3d41SBarry Smith ymax = PETSC_MIN_REAL; 20051fa3d41SBarry Smith for (i=0; i<numValues; i++) { 20151fa3d41SBarry Smith ymin = PetscMin(ymin,values[i]); 20251fa3d41SBarry Smith ymax = PetscMax(ymax,values[i]); 20351fa3d41SBarry Smith } 20451fa3d41SBarry Smith } else { 20551fa3d41SBarry Smith ymin = bar->ymin; 20651fa3d41SBarry Smith ymax = bar->ymax; 20751fa3d41SBarry Smith } 20851fa3d41SBarry Smith nplot = numValues; /* number of points to actually plot; if some are lower than requested tolerance */ 20951fa3d41SBarry Smith xmin = 0.0; 210e118a51fSLisandro Dalcin xmax = nplot; 21151fa3d41SBarry Smith labels = bar->labels; 21251fa3d41SBarry Smith 21351fa3d41SBarry Smith if (bar->sort) { 21451fa3d41SBarry Smith ierr = PetscMalloc1(numValues,&perm);CHKERRQ(ierr); 21551fa3d41SBarry Smith for (i=0; i<numValues;i++) perm[i] = i; 21651fa3d41SBarry Smith ierr = PetscSortRealWithPermutation(numValues,values,perm);CHKERRQ(ierr); 21751fa3d41SBarry Smith if (bar->sorttolerance) { 21851fa3d41SBarry Smith for (i=0; i<numValues;i++) { 21951fa3d41SBarry Smith if (values[perm[numValues - i - 1]] < bar->sorttolerance) { 22051fa3d41SBarry Smith nplot = i; 22151fa3d41SBarry Smith break; 22251fa3d41SBarry Smith } 22351fa3d41SBarry Smith } 22451fa3d41SBarry Smith } 22551fa3d41SBarry Smith } 22651fa3d41SBarry Smith 2275b399a63SLisandro Dalcin draw = bar->win; 228e118a51fSLisandro Dalcin ierr = PetscDrawCheckResizedWindow(draw);CHKERRQ(ierr); 2295b399a63SLisandro Dalcin ierr = PetscDrawClear(draw);CHKERRQ(ierr); 230e118a51fSLisandro Dalcin 23151fa3d41SBarry Smith ierr = PetscDrawAxisSetLimits(bar->axis,xmin,xmax,ymin,ymax);CHKERRQ(ierr); 23251fa3d41SBarry Smith ierr = PetscDrawAxisDraw(bar->axis);CHKERRQ(ierr); 23351fa3d41SBarry Smith 2345b399a63SLisandro Dalcin ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr); 235e118a51fSLisandro Dalcin if (!rank) { /* Draw bins */ 23651fa3d41SBarry Smith for (i=0; i<nplot; i++) { 23751fa3d41SBarry Smith idx = (bar->sort ? perm[numValues - i - 1] : i); 23851fa3d41SBarry Smith binLeft = xmin + i; 23951fa3d41SBarry Smith binRight = xmin + i + 1; 24051fa3d41SBarry Smith ierr = PetscDrawRectangle(draw,binLeft,ymin,binRight,values[idx],bcolor,bcolor,bcolor,bcolor);CHKERRQ(ierr); 24151fa3d41SBarry Smith ierr = PetscDrawLine(draw,binLeft,ymin,binLeft,values[idx],PETSC_DRAW_BLACK);CHKERRQ(ierr); 24251fa3d41SBarry Smith ierr = PetscDrawLine(draw,binRight,ymin,binRight,values[idx],PETSC_DRAW_BLACK);CHKERRQ(ierr); 24351fa3d41SBarry Smith ierr = PetscDrawLine(draw,binLeft,values[idx],binRight,values[idx],PETSC_DRAW_BLACK);CHKERRQ(ierr); 24451fa3d41SBarry Smith if (labels) { 24551fa3d41SBarry Smith PetscReal h; 24651fa3d41SBarry Smith ierr = PetscDrawStringGetSize(draw,NULL,&h);CHKERRQ(ierr); 24771917b75SLisandro Dalcin ierr = PetscDrawStringCentered(draw,.5*(binLeft+binRight),ymin - 1.5*h,bcolor,labels[idx]);CHKERRQ(ierr); 24851fa3d41SBarry Smith } 24951fa3d41SBarry Smith if (color == PETSC_DRAW_ROTATE) bcolor++; 25071917b75SLisandro Dalcin if (bcolor > PETSC_DRAW_BASIC_COLORS-1) bcolor = PETSC_DRAW_BLACK+1; 25151fa3d41SBarry Smith } 25251fa3d41SBarry Smith } 2535b399a63SLisandro Dalcin ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr); 254e118a51fSLisandro Dalcin if (bar->sort) {ierr = PetscFree(perm);CHKERRQ(ierr);} 255e118a51fSLisandro Dalcin 2565b399a63SLisandro Dalcin ierr = PetscDrawFlush(draw);CHKERRQ(ierr); 25751fa3d41SBarry Smith ierr = PetscDrawPause(draw);CHKERRQ(ierr); 25851fa3d41SBarry Smith PetscFunctionReturn(0); 25951fa3d41SBarry Smith } 26051fa3d41SBarry Smith 26151fa3d41SBarry Smith #undef __FUNCT__ 26257fd6651SLisandro Dalcin #define __FUNCT__ "PetscDrawBarSave" 26357fd6651SLisandro Dalcin /*@ 26457fd6651SLisandro Dalcin PetscDrawBarSave - Saves a drawn image 26557fd6651SLisandro Dalcin 26657fd6651SLisandro Dalcin Collective on PetscDrawBar 26757fd6651SLisandro Dalcin 26857fd6651SLisandro Dalcin Input Parameters: 26957fd6651SLisandro Dalcin . bar - The bar graph context 27057fd6651SLisandro Dalcin 27157fd6651SLisandro Dalcin Level: intermediate 27257fd6651SLisandro Dalcin 27357fd6651SLisandro Dalcin Concepts: bar graph^saving 27457fd6651SLisandro Dalcin 2750afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBarGetDraw(), PetscDrawSetSave(), PetscDrawSave(), PetscDrawBarSetData() 27657fd6651SLisandro Dalcin @*/ 27757fd6651SLisandro Dalcin PetscErrorCode PetscDrawBarSave(PetscDrawBar bar) 27857fd6651SLisandro Dalcin { 27957fd6651SLisandro Dalcin PetscErrorCode ierr; 28057fd6651SLisandro Dalcin 28157fd6651SLisandro Dalcin PetscFunctionBegin; 28257fd6651SLisandro Dalcin PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 28357fd6651SLisandro Dalcin ierr = PetscDrawSave(bar->win);CHKERRQ(ierr); 28457fd6651SLisandro Dalcin PetscFunctionReturn(0); 28557fd6651SLisandro Dalcin } 28657fd6651SLisandro Dalcin 28757fd6651SLisandro Dalcin #undef __FUNCT__ 28851fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSetColor" 28951fa3d41SBarry Smith /*@ 29051fa3d41SBarry Smith PetscDrawBarSetColor - Sets the color the bars will be drawn with. 29151fa3d41SBarry Smith 2925b399a63SLisandro Dalcin Logically Collective on PetscDrawBar 29351fa3d41SBarry Smith 29451fa3d41SBarry Smith Input Parameters: 29551fa3d41SBarry Smith + bar - The bar graph context 29651fa3d41SBarry Smith - color - one of the colors defined in petscdraw.h or PETSC_DRAW_ROTATE to make each bar a 29751fa3d41SBarry Smith different color 29851fa3d41SBarry Smith 29951fa3d41SBarry Smith Level: intermediate 30051fa3d41SBarry Smith 3010afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarSetData(), PetscDrawBarDraw(), PetscDrawBarGetAxis() 3020afdd333SBarry Smith 30351fa3d41SBarry Smith @*/ 30451fa3d41SBarry Smith PetscErrorCode PetscDrawBarSetColor(PetscDrawBar bar, int color) 30551fa3d41SBarry Smith { 30651fa3d41SBarry Smith PetscFunctionBegin; 30751fa3d41SBarry Smith PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID,1); 30851fa3d41SBarry Smith bar->color = color; 30951fa3d41SBarry Smith PetscFunctionReturn(0); 31051fa3d41SBarry Smith } 31151fa3d41SBarry Smith 31251fa3d41SBarry Smith #undef __FUNCT__ 31351fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSort" 31451fa3d41SBarry Smith /*@ 31551fa3d41SBarry Smith PetscDrawBarSort - Sorts the values before drawing the bar chart 31651fa3d41SBarry Smith 3175b399a63SLisandro Dalcin Logically Collective on PetscDrawBar 31851fa3d41SBarry Smith 31951fa3d41SBarry Smith Input Parameters: 32051fa3d41SBarry Smith + bar - The bar graph context 32151fa3d41SBarry Smith . sort - PETSC_TRUE to sort the values 32251fa3d41SBarry Smith . tolerance - discard values less than tolerance 32351fa3d41SBarry Smith 32451fa3d41SBarry Smith Level: intermediate 32551fa3d41SBarry Smith 32651fa3d41SBarry Smith Concepts: bar graph^setting axis 3270afdd333SBarry Smith 3280afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarSetData(), PetscDrawBarSetColor(), PetscDrawBarDraw(), PetscDrawBarGetAxis() 32951fa3d41SBarry Smith @*/ 33051fa3d41SBarry Smith PetscErrorCode PetscDrawBarSort(PetscDrawBar bar, PetscBool sort, PetscReal tolerance) 33151fa3d41SBarry Smith { 33251fa3d41SBarry Smith PetscFunctionBegin; 33351fa3d41SBarry Smith PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 33451fa3d41SBarry Smith bar->sort = sort; 33551fa3d41SBarry Smith bar->sorttolerance = tolerance; 33651fa3d41SBarry Smith PetscFunctionReturn(0); 33751fa3d41SBarry Smith } 33851fa3d41SBarry Smith 33951fa3d41SBarry Smith #undef __FUNCT__ 34051fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSetLimits" 34151fa3d41SBarry Smith /*@ 34251fa3d41SBarry Smith PetscDrawBarSetLimits - Sets the axis limits for a bar graph. If more 34351fa3d41SBarry Smith points are added after this call, the limits will be adjusted to 34451fa3d41SBarry Smith include those additional points. 34551fa3d41SBarry Smith 3465b399a63SLisandro Dalcin Logically Collective on PetscDrawBar 34751fa3d41SBarry Smith 34851fa3d41SBarry Smith Input Parameters: 34951fa3d41SBarry Smith + bar - The bar graph context 35051fa3d41SBarry Smith - y_min,y_max - The limits 35151fa3d41SBarry Smith 35251fa3d41SBarry Smith Level: intermediate 35351fa3d41SBarry Smith 35451fa3d41SBarry Smith Concepts: bar graph^setting axis 3550afdd333SBarry Smith 3560afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarGetAxis(), PetscDrawBarSetData(), PetscDrawBarDraw() 35751fa3d41SBarry Smith @*/ 35851fa3d41SBarry Smith PetscErrorCode PetscDrawBarSetLimits(PetscDrawBar bar, PetscReal y_min, PetscReal y_max) 35951fa3d41SBarry Smith { 36051fa3d41SBarry Smith PetscFunctionBegin; 36151fa3d41SBarry Smith PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 36251fa3d41SBarry Smith bar->ymin = y_min; 36351fa3d41SBarry Smith bar->ymax = y_max; 36451fa3d41SBarry Smith PetscFunctionReturn(0); 36551fa3d41SBarry Smith } 36651fa3d41SBarry Smith 36751fa3d41SBarry Smith #undef __FUNCT__ 36851fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarGetAxis" 36951fa3d41SBarry Smith /*@C 37051fa3d41SBarry Smith PetscDrawBarGetAxis - Gets the axis context associated with a bar graph. 37151fa3d41SBarry Smith This is useful if one wants to change some axis property, such as 37251fa3d41SBarry Smith labels, color, etc. The axis context should not be destroyed by the 37351fa3d41SBarry Smith application code. 37451fa3d41SBarry Smith 3755b399a63SLisandro Dalcin Not Collective, PetscDrawAxis is parallel if PetscDrawBar is parallel 37651fa3d41SBarry Smith 37751fa3d41SBarry Smith Input Parameter: 37851fa3d41SBarry Smith . bar - The bar graph context 37951fa3d41SBarry Smith 38051fa3d41SBarry Smith Output Parameter: 38151fa3d41SBarry Smith . axis - The axis context 38251fa3d41SBarry Smith 38351fa3d41SBarry Smith Level: intermediate 38451fa3d41SBarry Smith 3850afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawAxis, PetscDrawAxisCreate() 38651fa3d41SBarry Smith @*/ 38751fa3d41SBarry Smith PetscErrorCode PetscDrawBarGetAxis(PetscDrawBar bar,PetscDrawAxis *axis) 38851fa3d41SBarry Smith { 38951fa3d41SBarry Smith PetscFunctionBegin; 390e118a51fSLisandro Dalcin PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 39145f3bb6eSLisandro Dalcin PetscValidPointer(axis,2); 39251fa3d41SBarry Smith *axis = bar->axis; 39351fa3d41SBarry Smith PetscFunctionReturn(0); 39451fa3d41SBarry Smith } 39551fa3d41SBarry Smith 39651fa3d41SBarry Smith #undef __FUNCT__ 39751fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarGetDraw" 39851fa3d41SBarry Smith /*@C 39951fa3d41SBarry Smith PetscDrawBarGetDraw - Gets the draw context associated with a bar graph. 40051fa3d41SBarry Smith 40151fa3d41SBarry Smith Not Collective, PetscDraw is parallel if PetscDrawBar is parallel 40251fa3d41SBarry Smith 40351fa3d41SBarry Smith Input Parameter: 40451fa3d41SBarry Smith . bar - The bar graph context 40551fa3d41SBarry Smith 40651fa3d41SBarry Smith Output Parameter: 407e118a51fSLisandro Dalcin . draw - The draw context 40851fa3d41SBarry Smith 40951fa3d41SBarry Smith Level: intermediate 41051fa3d41SBarry Smith 4110afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarDraw(), PetscDraw 41251fa3d41SBarry Smith @*/ 413e118a51fSLisandro Dalcin PetscErrorCode PetscDrawBarGetDraw(PetscDrawBar bar,PetscDraw *draw) 41451fa3d41SBarry Smith { 41551fa3d41SBarry Smith PetscFunctionBegin; 41651fa3d41SBarry Smith PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 41745f3bb6eSLisandro Dalcin PetscValidPointer(draw,2); 418e118a51fSLisandro Dalcin *draw = bar->win; 41951fa3d41SBarry Smith PetscFunctionReturn(0); 42051fa3d41SBarry Smith } 42151fa3d41SBarry Smith 42251fa3d41SBarry Smith #undef __FUNCT__ 42351fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSetFromOptions" 42451fa3d41SBarry Smith /*@ 42551fa3d41SBarry Smith PetscDrawBarSetFromOptions - Sets options related to the PetscDrawBar 42651fa3d41SBarry Smith 42751fa3d41SBarry Smith Collective over PetscDrawBar 42851fa3d41SBarry Smith 42951fa3d41SBarry Smith Options Database: 43051fa3d41SBarry Smith . -bar_sort - sort the entries before drawing the bar graph 43151fa3d41SBarry Smith 43251fa3d41SBarry Smith Level: intermediate 43351fa3d41SBarry Smith 43451fa3d41SBarry Smith 4350afdd333SBarry Smith .seealso: PetscDrawBarDestroy(), PetscDrawBarCreate(), PetscDrawBarSort() 43651fa3d41SBarry Smith @*/ 43751fa3d41SBarry Smith PetscErrorCode PetscDrawBarSetFromOptions(PetscDrawBar bar) 43851fa3d41SBarry Smith { 43951fa3d41SBarry Smith PetscErrorCode ierr; 44051fa3d41SBarry Smith PetscBool set; 44151fa3d41SBarry Smith 44251fa3d41SBarry Smith PetscFunctionBegin; 443e118a51fSLisandro Dalcin PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 444e118a51fSLisandro Dalcin 44571917b75SLisandro Dalcin ierr = PetscOptionsHasName(((PetscObject)bar)->options,((PetscObject)bar)->prefix,"-bar_sort",&set);CHKERRQ(ierr); 44651fa3d41SBarry Smith if (set) { 447e118a51fSLisandro Dalcin PetscReal tol = bar->sorttolerance; 44871917b75SLisandro Dalcin ierr = PetscOptionsGetReal(((PetscObject)bar)->options,((PetscObject)bar)->prefix,"-bar_sort",&tol,NULL);CHKERRQ(ierr); 44951fa3d41SBarry Smith ierr = PetscDrawBarSort(bar,PETSC_TRUE,tol);CHKERRQ(ierr); 45051fa3d41SBarry Smith } 45151fa3d41SBarry Smith PetscFunctionReturn(0); 45251fa3d41SBarry Smith } 45351fa3d41SBarry Smith 454