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 42*0afdd333SBarry Smith Notes: Call PetscDrawBarSetData() to provide the bins to be plotted and then PetscDrawBarDraw() to display the new plot 43*0afdd333SBarry Smith 44*0afdd333SBarry 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*0afdd333SBarry Smith 4651fa3d41SBarry Smith Level: intermediate 4751fa3d41SBarry Smith 4851fa3d41SBarry Smith Concepts: bar graph^creating 4951fa3d41SBarry Smith 50*0afdd333SBarry Smith .seealso: PetscDrawLGCreate(), PetscDrawLG, PetscDrawSPCreate(), PetscDrawSP, PetscDrawHGCreate(), PetscDrawHG, PetscDrawBarDestroy(), PetscDrawBarSetData(), 51*0afdd333SBarry Smith PetscDrawBar, PetscDrawBarDraw(), PetscDrawBarSave(), PetscDrawBarSetColor(), PetscDrawBarSort(), PetscDrawBarSetLimits(), PetscDrawBarGetAxis(), PetscDrawAxis, 52*0afdd333SBarry Smith PetscDrawBarGetDraw(), PetscDrawBarSetFromOptions() 5351fa3d41SBarry Smith @*/ 5451fa3d41SBarry Smith PetscErrorCode PetscDrawBarCreate(PetscDraw draw,PetscDrawBar *bar) 5551fa3d41SBarry Smith { 5651fa3d41SBarry Smith PetscDrawBar h; 5751fa3d41SBarry Smith PetscErrorCode ierr; 5851fa3d41SBarry Smith 5951fa3d41SBarry Smith PetscFunctionBegin; 6051fa3d41SBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 6173107ff1SLisandro Dalcin PetscValidPointer(bar,2); 62e118a51fSLisandro Dalcin 6371917b75SLisandro Dalcin ierr = PetscHeaderCreate(h,PETSC_DRAWBAR_CLASSID,"DrawBar","Bar Graph","Draw",PetscObjectComm((PetscObject)draw),PetscDrawBarDestroy,NULL);CHKERRQ(ierr); 64e118a51fSLisandro Dalcin ierr = PetscLogObjectParent((PetscObject)draw,(PetscObject)h);CHKERRQ(ierr); 65e118a51fSLisandro Dalcin 66e118a51fSLisandro Dalcin ierr = PetscObjectReference((PetscObject)draw);CHKERRQ(ierr); 67e118a51fSLisandro Dalcin h->win = draw; 6851fa3d41SBarry Smith 6951fa3d41SBarry Smith h->view = NULL; 7051fa3d41SBarry Smith h->destroy = NULL; 7151fa3d41SBarry Smith h->color = PETSC_DRAW_GREEN; 7251fa3d41SBarry Smith h->ymin = 0.; /* if user has not set these then they are determined from the data */ 7351fa3d41SBarry Smith h->ymax = 0.; 7451fa3d41SBarry Smith h->numBins = 0; 7551fa3d41SBarry Smith 7651fa3d41SBarry Smith ierr = PetscDrawAxisCreate(draw,&h->axis);CHKERRQ(ierr); 7745f3bb6eSLisandro Dalcin h->axis->xticks = NULL; 78e118a51fSLisandro Dalcin 7951fa3d41SBarry Smith *bar = h; 8051fa3d41SBarry Smith PetscFunctionReturn(0); 8151fa3d41SBarry Smith } 8251fa3d41SBarry Smith 8351fa3d41SBarry Smith #undef __FUNCT__ 8451fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSetData" 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 98*0afdd333SBarry Smith Notes: Call PetscDrawBarDraw() after this call to display the new plot 99*0afdd333SBarry Smith 100*0afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarDraw() 10151fa3d41SBarry Smith 10251fa3d41SBarry Smith @*/ 10351fa3d41SBarry Smith PetscErrorCode PetscDrawBarSetData(PetscDrawBar bar,PetscInt bins,const PetscReal data[],const char *const *labels) 10451fa3d41SBarry Smith { 10551fa3d41SBarry Smith PetscErrorCode ierr; 10651fa3d41SBarry Smith 10751fa3d41SBarry Smith PetscFunctionBegin; 10851fa3d41SBarry Smith PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 109e118a51fSLisandro Dalcin 11051fa3d41SBarry Smith if (bar->numBins != bins) { 11151fa3d41SBarry Smith ierr = PetscFree(bar->values);CHKERRQ(ierr); 11251fa3d41SBarry Smith ierr = PetscMalloc1(bins, &bar->values);CHKERRQ(ierr); 11351fa3d41SBarry Smith bar->numBins = bins; 11451fa3d41SBarry Smith } 11551fa3d41SBarry Smith ierr = PetscMemcpy(bar->values,data,bins*sizeof(PetscReal));CHKERRQ(ierr); 11651fa3d41SBarry Smith bar->numBins = bins; 11751fa3d41SBarry Smith if (labels) { 11851fa3d41SBarry Smith ierr = PetscStrArrayallocpy(labels,&bar->labels);CHKERRQ(ierr); 11951fa3d41SBarry Smith } 12051fa3d41SBarry Smith PetscFunctionReturn(0); 12151fa3d41SBarry Smith } 12251fa3d41SBarry Smith 12351fa3d41SBarry Smith #undef __FUNCT__ 12451fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarDestroy" 12551fa3d41SBarry Smith /*@C 12651fa3d41SBarry Smith PetscDrawBarDestroy - Frees all space taken up by bar graph data structure. 12751fa3d41SBarry Smith 12851fa3d41SBarry Smith Collective over PetscDrawBar 12951fa3d41SBarry Smith 13051fa3d41SBarry Smith Input Parameter: 13151fa3d41SBarry Smith . bar - The bar graph context 13251fa3d41SBarry Smith 13351fa3d41SBarry Smith Level: intermediate 13451fa3d41SBarry Smith 13551fa3d41SBarry Smith .seealso: PetscDrawBarCreate() 13651fa3d41SBarry Smith @*/ 13751fa3d41SBarry Smith PetscErrorCode PetscDrawBarDestroy(PetscDrawBar *bar) 13851fa3d41SBarry Smith { 13951fa3d41SBarry Smith PetscErrorCode ierr; 14051fa3d41SBarry Smith 14151fa3d41SBarry Smith PetscFunctionBegin; 14251fa3d41SBarry Smith if (!*bar) PetscFunctionReturn(0); 143e118a51fSLisandro Dalcin PetscValidHeaderSpecific(*bar,PETSC_DRAWBAR_CLASSID,1); 14451fa3d41SBarry Smith if (--((PetscObject)(*bar))->refct > 0) PetscFunctionReturn(0); 145e118a51fSLisandro Dalcin 14651fa3d41SBarry Smith ierr = PetscFree((*bar)->values);CHKERRQ(ierr); 14751fa3d41SBarry Smith ierr = PetscStrArrayDestroy(&(*bar)->labels);CHKERRQ(ierr); 148e118a51fSLisandro Dalcin ierr = PetscDrawAxisDestroy(&(*bar)->axis);CHKERRQ(ierr); 149e118a51fSLisandro Dalcin ierr = PetscDrawDestroy(&(*bar)->win);CHKERRQ(ierr); 15051fa3d41SBarry Smith ierr = PetscHeaderDestroy(bar);CHKERRQ(ierr); 15151fa3d41SBarry Smith PetscFunctionReturn(0); 15251fa3d41SBarry Smith } 15351fa3d41SBarry Smith 15451fa3d41SBarry Smith #undef __FUNCT__ 15551fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarDraw" 15651fa3d41SBarry Smith /*@ 15751fa3d41SBarry Smith PetscDrawBarDraw - Redraws a bar graph. 15851fa3d41SBarry Smith 1595b399a63SLisandro Dalcin Collective on PetscDrawBar 16051fa3d41SBarry Smith 16151fa3d41SBarry Smith Input Parameter: 16251fa3d41SBarry Smith . bar - The bar graph context 16351fa3d41SBarry Smith 16451fa3d41SBarry Smith Level: intermediate 16551fa3d41SBarry Smith 166*0afdd333SBarry Smith .seealso: PetscDrawBar, PetscDrawBarCreate(), PetscDrawBarSetData() 167*0afdd333SBarry Smith 16851fa3d41SBarry Smith @*/ 16951fa3d41SBarry Smith PetscErrorCode PetscDrawBarDraw(PetscDrawBar bar) 17051fa3d41SBarry Smith { 171e118a51fSLisandro Dalcin PetscDraw draw; 17251fa3d41SBarry Smith PetscBool isnull; 17351fa3d41SBarry Smith PetscReal xmin,xmax,ymin,ymax,*values,binLeft,binRight; 17451fa3d41SBarry Smith PetscInt numValues,i,bcolor,color,idx,*perm,nplot; 175e118a51fSLisandro Dalcin PetscMPIInt rank; 17651fa3d41SBarry Smith PetscErrorCode ierr; 17751fa3d41SBarry Smith char **labels; 17851fa3d41SBarry Smith 17951fa3d41SBarry Smith PetscFunctionBegin; 18051fa3d41SBarry Smith PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 1818f69470aSLisandro Dalcin ierr = PetscDrawIsNull(bar->win,&isnull);CHKERRQ(ierr); 1828f69470aSLisandro Dalcin if (isnull) PetscFunctionReturn(0); 183e118a51fSLisandro Dalcin ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)bar),&rank);CHKERRQ(ierr); 18451fa3d41SBarry Smith 1855b399a63SLisandro Dalcin if (bar->numBins < 1) PetscFunctionReturn(0); 1865b399a63SLisandro Dalcin 18751fa3d41SBarry Smith color = bar->color; 18871917b75SLisandro Dalcin if (color == PETSC_DRAW_ROTATE) bcolor = PETSC_DRAW_BLACK+1; 18951fa3d41SBarry Smith else bcolor = color; 19051fa3d41SBarry Smith 19151fa3d41SBarry Smith numValues = bar->numBins; 19251fa3d41SBarry Smith values = bar->values; 19351fa3d41SBarry Smith if (bar->ymin == bar->ymax) { 19451fa3d41SBarry Smith /* user has not set bounds on bars so set them based on the data */ 19551fa3d41SBarry Smith ymin = PETSC_MAX_REAL; 19651fa3d41SBarry Smith ymax = PETSC_MIN_REAL; 19751fa3d41SBarry Smith for (i=0; i<numValues; i++) { 19851fa3d41SBarry Smith ymin = PetscMin(ymin,values[i]); 19951fa3d41SBarry Smith ymax = PetscMax(ymax,values[i]); 20051fa3d41SBarry Smith } 20151fa3d41SBarry Smith } else { 20251fa3d41SBarry Smith ymin = bar->ymin; 20351fa3d41SBarry Smith ymax = bar->ymax; 20451fa3d41SBarry Smith } 20551fa3d41SBarry Smith nplot = numValues; /* number of points to actually plot; if some are lower than requested tolerance */ 20651fa3d41SBarry Smith xmin = 0.0; 207e118a51fSLisandro Dalcin xmax = nplot; 20851fa3d41SBarry Smith labels = bar->labels; 20951fa3d41SBarry Smith 21051fa3d41SBarry Smith if (bar->sort) { 21151fa3d41SBarry Smith ierr = PetscMalloc1(numValues,&perm);CHKERRQ(ierr); 21251fa3d41SBarry Smith for (i=0; i<numValues;i++) perm[i] = i; 21351fa3d41SBarry Smith ierr = PetscSortRealWithPermutation(numValues,values,perm);CHKERRQ(ierr); 21451fa3d41SBarry Smith if (bar->sorttolerance) { 21551fa3d41SBarry Smith for (i=0; i<numValues;i++) { 21651fa3d41SBarry Smith if (values[perm[numValues - i - 1]] < bar->sorttolerance) { 21751fa3d41SBarry Smith nplot = i; 21851fa3d41SBarry Smith break; 21951fa3d41SBarry Smith } 22051fa3d41SBarry Smith } 22151fa3d41SBarry Smith } 22251fa3d41SBarry Smith } 22351fa3d41SBarry Smith 2245b399a63SLisandro Dalcin draw = bar->win; 225e118a51fSLisandro Dalcin ierr = PetscDrawCheckResizedWindow(draw);CHKERRQ(ierr); 2265b399a63SLisandro Dalcin ierr = PetscDrawClear(draw);CHKERRQ(ierr); 227e118a51fSLisandro Dalcin 22851fa3d41SBarry Smith ierr = PetscDrawAxisSetLimits(bar->axis,xmin,xmax,ymin,ymax);CHKERRQ(ierr); 22951fa3d41SBarry Smith ierr = PetscDrawAxisDraw(bar->axis);CHKERRQ(ierr); 23051fa3d41SBarry Smith 2315b399a63SLisandro Dalcin ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr); 232e118a51fSLisandro Dalcin if (!rank) { /* Draw bins */ 23351fa3d41SBarry Smith for (i=0; i<nplot; i++) { 23451fa3d41SBarry Smith idx = (bar->sort ? perm[numValues - i - 1] : i); 23551fa3d41SBarry Smith binLeft = xmin + i; 23651fa3d41SBarry Smith binRight = xmin + i + 1; 23751fa3d41SBarry Smith ierr = PetscDrawRectangle(draw,binLeft,ymin,binRight,values[idx],bcolor,bcolor,bcolor,bcolor);CHKERRQ(ierr); 23851fa3d41SBarry Smith ierr = PetscDrawLine(draw,binLeft,ymin,binLeft,values[idx],PETSC_DRAW_BLACK);CHKERRQ(ierr); 23951fa3d41SBarry Smith ierr = PetscDrawLine(draw,binRight,ymin,binRight,values[idx],PETSC_DRAW_BLACK);CHKERRQ(ierr); 24051fa3d41SBarry Smith ierr = PetscDrawLine(draw,binLeft,values[idx],binRight,values[idx],PETSC_DRAW_BLACK);CHKERRQ(ierr); 24151fa3d41SBarry Smith if (labels) { 24251fa3d41SBarry Smith PetscReal h; 24351fa3d41SBarry Smith ierr = PetscDrawStringGetSize(draw,NULL,&h);CHKERRQ(ierr); 24471917b75SLisandro Dalcin ierr = PetscDrawStringCentered(draw,.5*(binLeft+binRight),ymin - 1.5*h,bcolor,labels[idx]);CHKERRQ(ierr); 24551fa3d41SBarry Smith } 24651fa3d41SBarry Smith if (color == PETSC_DRAW_ROTATE) bcolor++; 24771917b75SLisandro Dalcin if (bcolor > PETSC_DRAW_BASIC_COLORS-1) bcolor = PETSC_DRAW_BLACK+1; 24851fa3d41SBarry Smith } 24951fa3d41SBarry Smith } 2505b399a63SLisandro Dalcin ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr); 251e118a51fSLisandro Dalcin if (bar->sort) {ierr = PetscFree(perm);CHKERRQ(ierr);} 252e118a51fSLisandro Dalcin 2535b399a63SLisandro Dalcin ierr = PetscDrawFlush(draw);CHKERRQ(ierr); 25451fa3d41SBarry Smith ierr = PetscDrawPause(draw);CHKERRQ(ierr); 25551fa3d41SBarry Smith PetscFunctionReturn(0); 25651fa3d41SBarry Smith } 25751fa3d41SBarry Smith 25851fa3d41SBarry Smith #undef __FUNCT__ 25957fd6651SLisandro Dalcin #define __FUNCT__ "PetscDrawBarSave" 26057fd6651SLisandro Dalcin /*@ 26157fd6651SLisandro Dalcin PetscDrawBarSave - Saves a drawn image 26257fd6651SLisandro Dalcin 26357fd6651SLisandro Dalcin Collective on PetscDrawBar 26457fd6651SLisandro Dalcin 26557fd6651SLisandro Dalcin Input Parameters: 26657fd6651SLisandro Dalcin . bar - The bar graph context 26757fd6651SLisandro Dalcin 26857fd6651SLisandro Dalcin Level: intermediate 26957fd6651SLisandro Dalcin 27057fd6651SLisandro Dalcin Concepts: bar graph^saving 27157fd6651SLisandro Dalcin 272*0afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBarGetDraw(), PetscDrawSetSave(), PetscDrawSave(), PetscDrawBarSetData() 27357fd6651SLisandro Dalcin @*/ 27457fd6651SLisandro Dalcin PetscErrorCode PetscDrawBarSave(PetscDrawBar bar) 27557fd6651SLisandro Dalcin { 27657fd6651SLisandro Dalcin PetscErrorCode ierr; 27757fd6651SLisandro Dalcin 27857fd6651SLisandro Dalcin PetscFunctionBegin; 27957fd6651SLisandro Dalcin PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 28057fd6651SLisandro Dalcin ierr = PetscDrawSave(bar->win);CHKERRQ(ierr); 28157fd6651SLisandro Dalcin PetscFunctionReturn(0); 28257fd6651SLisandro Dalcin } 28357fd6651SLisandro Dalcin 28457fd6651SLisandro Dalcin #undef __FUNCT__ 28551fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSetColor" 28651fa3d41SBarry Smith /*@ 28751fa3d41SBarry Smith PetscDrawBarSetColor - Sets the color the bars will be drawn with. 28851fa3d41SBarry Smith 2895b399a63SLisandro Dalcin Logically Collective on PetscDrawBar 29051fa3d41SBarry Smith 29151fa3d41SBarry Smith Input Parameters: 29251fa3d41SBarry Smith + bar - The bar graph context 29351fa3d41SBarry Smith - color - one of the colors defined in petscdraw.h or PETSC_DRAW_ROTATE to make each bar a 29451fa3d41SBarry Smith different color 29551fa3d41SBarry Smith 29651fa3d41SBarry Smith Level: intermediate 29751fa3d41SBarry Smith 298*0afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarSetData(), PetscDrawBarDraw(), PetscDrawBarGetAxis() 299*0afdd333SBarry Smith 30051fa3d41SBarry Smith @*/ 30151fa3d41SBarry Smith PetscErrorCode PetscDrawBarSetColor(PetscDrawBar bar, int color) 30251fa3d41SBarry Smith { 30351fa3d41SBarry Smith PetscFunctionBegin; 30451fa3d41SBarry Smith PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID,1); 30551fa3d41SBarry Smith bar->color = color; 30651fa3d41SBarry Smith PetscFunctionReturn(0); 30751fa3d41SBarry Smith } 30851fa3d41SBarry Smith 30951fa3d41SBarry Smith #undef __FUNCT__ 31051fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSort" 31151fa3d41SBarry Smith /*@ 31251fa3d41SBarry Smith PetscDrawBarSort - Sorts the values before drawing the bar chart 31351fa3d41SBarry Smith 3145b399a63SLisandro Dalcin Logically Collective on PetscDrawBar 31551fa3d41SBarry Smith 31651fa3d41SBarry Smith Input Parameters: 31751fa3d41SBarry Smith + bar - The bar graph context 31851fa3d41SBarry Smith . sort - PETSC_TRUE to sort the values 31951fa3d41SBarry Smith . tolerance - discard values less than tolerance 32051fa3d41SBarry Smith 32151fa3d41SBarry Smith Level: intermediate 32251fa3d41SBarry Smith 32351fa3d41SBarry Smith Concepts: bar graph^setting axis 324*0afdd333SBarry Smith 325*0afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarSetData(), PetscDrawBarSetColor(), PetscDrawBarDraw(), PetscDrawBarGetAxis() 32651fa3d41SBarry Smith @*/ 32751fa3d41SBarry Smith PetscErrorCode PetscDrawBarSort(PetscDrawBar bar, PetscBool sort, PetscReal tolerance) 32851fa3d41SBarry Smith { 32951fa3d41SBarry Smith PetscFunctionBegin; 33051fa3d41SBarry Smith PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 33151fa3d41SBarry Smith bar->sort = sort; 33251fa3d41SBarry Smith bar->sorttolerance = tolerance; 33351fa3d41SBarry Smith PetscFunctionReturn(0); 33451fa3d41SBarry Smith } 33551fa3d41SBarry Smith 33651fa3d41SBarry Smith #undef __FUNCT__ 33751fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSetLimits" 33851fa3d41SBarry Smith /*@ 33951fa3d41SBarry Smith PetscDrawBarSetLimits - Sets the axis limits for a bar graph. If more 34051fa3d41SBarry Smith points are added after this call, the limits will be adjusted to 34151fa3d41SBarry Smith include those additional points. 34251fa3d41SBarry Smith 3435b399a63SLisandro Dalcin Logically Collective on PetscDrawBar 34451fa3d41SBarry Smith 34551fa3d41SBarry Smith Input Parameters: 34651fa3d41SBarry Smith + bar - The bar graph context 34751fa3d41SBarry Smith - y_min,y_max - The limits 34851fa3d41SBarry Smith 34951fa3d41SBarry Smith Level: intermediate 35051fa3d41SBarry Smith 35151fa3d41SBarry Smith Concepts: bar graph^setting axis 352*0afdd333SBarry Smith 353*0afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarGetAxis(), PetscDrawBarSetData(), PetscDrawBarDraw() 35451fa3d41SBarry Smith @*/ 35551fa3d41SBarry Smith PetscErrorCode PetscDrawBarSetLimits(PetscDrawBar bar, PetscReal y_min, PetscReal y_max) 35651fa3d41SBarry Smith { 35751fa3d41SBarry Smith PetscFunctionBegin; 35851fa3d41SBarry Smith PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 35951fa3d41SBarry Smith bar->ymin = y_min; 36051fa3d41SBarry Smith bar->ymax = y_max; 36151fa3d41SBarry Smith PetscFunctionReturn(0); 36251fa3d41SBarry Smith } 36351fa3d41SBarry Smith 36451fa3d41SBarry Smith #undef __FUNCT__ 36551fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarGetAxis" 36651fa3d41SBarry Smith /*@C 36751fa3d41SBarry Smith PetscDrawBarGetAxis - Gets the axis context associated with a bar graph. 36851fa3d41SBarry Smith This is useful if one wants to change some axis property, such as 36951fa3d41SBarry Smith labels, color, etc. The axis context should not be destroyed by the 37051fa3d41SBarry Smith application code. 37151fa3d41SBarry Smith 3725b399a63SLisandro Dalcin Not Collective, PetscDrawAxis is parallel if PetscDrawBar is parallel 37351fa3d41SBarry Smith 37451fa3d41SBarry Smith Input Parameter: 37551fa3d41SBarry Smith . bar - The bar graph context 37651fa3d41SBarry Smith 37751fa3d41SBarry Smith Output Parameter: 37851fa3d41SBarry Smith . axis - The axis context 37951fa3d41SBarry Smith 38051fa3d41SBarry Smith Level: intermediate 38151fa3d41SBarry Smith 382*0afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawAxis, PetscDrawAxisCreate() 38351fa3d41SBarry Smith @*/ 38451fa3d41SBarry Smith PetscErrorCode PetscDrawBarGetAxis(PetscDrawBar bar,PetscDrawAxis *axis) 38551fa3d41SBarry Smith { 38651fa3d41SBarry Smith PetscFunctionBegin; 387e118a51fSLisandro Dalcin PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 38845f3bb6eSLisandro Dalcin PetscValidPointer(axis,2); 38951fa3d41SBarry Smith *axis = bar->axis; 39051fa3d41SBarry Smith PetscFunctionReturn(0); 39151fa3d41SBarry Smith } 39251fa3d41SBarry Smith 39351fa3d41SBarry Smith #undef __FUNCT__ 39451fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarGetDraw" 39551fa3d41SBarry Smith /*@C 39651fa3d41SBarry Smith PetscDrawBarGetDraw - Gets the draw context associated with a bar graph. 39751fa3d41SBarry Smith 39851fa3d41SBarry Smith Not Collective, PetscDraw is parallel if PetscDrawBar is parallel 39951fa3d41SBarry Smith 40051fa3d41SBarry Smith Input Parameter: 40151fa3d41SBarry Smith . bar - The bar graph context 40251fa3d41SBarry Smith 40351fa3d41SBarry Smith Output Parameter: 404e118a51fSLisandro Dalcin . draw - The draw context 40551fa3d41SBarry Smith 40651fa3d41SBarry Smith Level: intermediate 40751fa3d41SBarry Smith 408*0afdd333SBarry Smith .seealso: PetscDrawBarCreate(), PetscDrawBar, PetscDrawBarDraw(), PetscDraw 40951fa3d41SBarry Smith @*/ 410e118a51fSLisandro Dalcin PetscErrorCode PetscDrawBarGetDraw(PetscDrawBar bar,PetscDraw *draw) 41151fa3d41SBarry Smith { 41251fa3d41SBarry Smith PetscFunctionBegin; 41351fa3d41SBarry Smith PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 41445f3bb6eSLisandro Dalcin PetscValidPointer(draw,2); 415e118a51fSLisandro Dalcin *draw = bar->win; 41651fa3d41SBarry Smith PetscFunctionReturn(0); 41751fa3d41SBarry Smith } 41851fa3d41SBarry Smith 41951fa3d41SBarry Smith #undef __FUNCT__ 42051fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSetFromOptions" 42151fa3d41SBarry Smith /*@ 42251fa3d41SBarry Smith PetscDrawBarSetFromOptions - Sets options related to the PetscDrawBar 42351fa3d41SBarry Smith 42451fa3d41SBarry Smith Collective over PetscDrawBar 42551fa3d41SBarry Smith 42651fa3d41SBarry Smith Options Database: 42751fa3d41SBarry Smith . -bar_sort - sort the entries before drawing the bar graph 42851fa3d41SBarry Smith 42951fa3d41SBarry Smith Level: intermediate 43051fa3d41SBarry Smith 43151fa3d41SBarry Smith 432*0afdd333SBarry Smith .seealso: PetscDrawBarDestroy(), PetscDrawBarCreate(), PetscDrawBarSort() 43351fa3d41SBarry Smith @*/ 43451fa3d41SBarry Smith PetscErrorCode PetscDrawBarSetFromOptions(PetscDrawBar bar) 43551fa3d41SBarry Smith { 43651fa3d41SBarry Smith PetscErrorCode ierr; 43751fa3d41SBarry Smith PetscBool set; 43851fa3d41SBarry Smith 43951fa3d41SBarry Smith PetscFunctionBegin; 440e118a51fSLisandro Dalcin PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 441e118a51fSLisandro Dalcin 44271917b75SLisandro Dalcin ierr = PetscOptionsHasName(((PetscObject)bar)->options,((PetscObject)bar)->prefix,"-bar_sort",&set);CHKERRQ(ierr); 44351fa3d41SBarry Smith if (set) { 444e118a51fSLisandro Dalcin PetscReal tol = bar->sorttolerance; 44571917b75SLisandro Dalcin ierr = PetscOptionsGetReal(((PetscObject)bar)->options,((PetscObject)bar)->prefix,"-bar_sort",&tol,NULL);CHKERRQ(ierr); 44651fa3d41SBarry Smith ierr = PetscDrawBarSort(bar,PETSC_TRUE,tol);CHKERRQ(ierr); 44751fa3d41SBarry Smith } 44851fa3d41SBarry Smith PetscFunctionReturn(0); 44951fa3d41SBarry Smith } 45051fa3d41SBarry Smith 451