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 4251fa3d41SBarry Smith Level: intermediate 4351fa3d41SBarry Smith 4451fa3d41SBarry Smith Concepts: bar graph^creating 4551fa3d41SBarry Smith 4651fa3d41SBarry Smith .seealso: PetscDrawBarDestroy() 4751fa3d41SBarry Smith 4851fa3d41SBarry Smith @*/ 4951fa3d41SBarry Smith PetscErrorCode PetscDrawBarCreate(PetscDraw draw,PetscDrawBar *bar) 5051fa3d41SBarry Smith { 5151fa3d41SBarry Smith PetscDrawBar h; 5251fa3d41SBarry Smith PetscErrorCode ierr; 5351fa3d41SBarry Smith 5451fa3d41SBarry Smith PetscFunctionBegin; 5551fa3d41SBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 5673107ff1SLisandro Dalcin PetscValidPointer(bar,2); 57e118a51fSLisandro Dalcin 58*71917b75SLisandro Dalcin ierr = PetscHeaderCreate(h,PETSC_DRAWBAR_CLASSID,"DrawBar","Bar Graph","Draw",PetscObjectComm((PetscObject)draw),PetscDrawBarDestroy,NULL);CHKERRQ(ierr); 59e118a51fSLisandro Dalcin ierr = PetscLogObjectParent((PetscObject)draw,(PetscObject)h);CHKERRQ(ierr); 60e118a51fSLisandro Dalcin 61e118a51fSLisandro Dalcin ierr = PetscObjectReference((PetscObject)draw);CHKERRQ(ierr); 62e118a51fSLisandro Dalcin h->win = draw; 6351fa3d41SBarry Smith 6451fa3d41SBarry Smith h->view = NULL; 6551fa3d41SBarry Smith h->destroy = NULL; 6651fa3d41SBarry Smith h->color = PETSC_DRAW_GREEN; 6751fa3d41SBarry Smith h->ymin = 0.; /* if user has not set these then they are determined from the data */ 6851fa3d41SBarry Smith h->ymax = 0.; 6951fa3d41SBarry Smith h->numBins = 0; 7051fa3d41SBarry Smith 7151fa3d41SBarry Smith ierr = PetscDrawAxisCreate(draw,&h->axis);CHKERRQ(ierr); 7245f3bb6eSLisandro Dalcin h->axis->xticks = NULL; 73e118a51fSLisandro Dalcin 7451fa3d41SBarry Smith *bar = h; 7551fa3d41SBarry Smith PetscFunctionReturn(0); 7651fa3d41SBarry Smith } 7751fa3d41SBarry Smith 7851fa3d41SBarry Smith #undef __FUNCT__ 7951fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSetData" 8051fa3d41SBarry Smith /*@C 8151fa3d41SBarry Smith PetscDrawBarSetData 8251fa3d41SBarry Smith 835b399a63SLisandro Dalcin Logically Collective on PetscDrawBar 8451fa3d41SBarry Smith 8551fa3d41SBarry Smith Input Parameter: 8651fa3d41SBarry Smith + bar - The bar graph context. 8751fa3d41SBarry Smith . bins - number of items 8851fa3d41SBarry Smith . values - values of each item 8951fa3d41SBarry Smith - labels - optional label for each bar, NULL terminated array of strings 9051fa3d41SBarry Smith 9151fa3d41SBarry Smith Level: intermediate 9251fa3d41SBarry Smith 9351fa3d41SBarry Smith 9451fa3d41SBarry Smith @*/ 9551fa3d41SBarry Smith PetscErrorCode PetscDrawBarSetData(PetscDrawBar bar,PetscInt bins,const PetscReal data[],const char *const *labels) 9651fa3d41SBarry Smith { 9751fa3d41SBarry Smith PetscErrorCode ierr; 9851fa3d41SBarry Smith 9951fa3d41SBarry Smith PetscFunctionBegin; 10051fa3d41SBarry Smith PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 101e118a51fSLisandro Dalcin 10251fa3d41SBarry Smith if (bar->numBins != bins) { 10351fa3d41SBarry Smith ierr = PetscFree(bar->values);CHKERRQ(ierr); 10451fa3d41SBarry Smith ierr = PetscMalloc1(bins, &bar->values);CHKERRQ(ierr); 10551fa3d41SBarry Smith bar->numBins = bins; 10651fa3d41SBarry Smith } 10751fa3d41SBarry Smith ierr = PetscMemcpy(bar->values,data,bins*sizeof(PetscReal));CHKERRQ(ierr); 10851fa3d41SBarry Smith bar->numBins = bins; 10951fa3d41SBarry Smith if (labels) { 11051fa3d41SBarry Smith ierr = PetscStrArrayallocpy(labels,&bar->labels);CHKERRQ(ierr); 11151fa3d41SBarry Smith } 11251fa3d41SBarry Smith PetscFunctionReturn(0); 11351fa3d41SBarry Smith } 11451fa3d41SBarry Smith 11551fa3d41SBarry Smith #undef __FUNCT__ 11651fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarDestroy" 11751fa3d41SBarry Smith /*@C 11851fa3d41SBarry Smith PetscDrawBarDestroy - Frees all space taken up by bar graph data structure. 11951fa3d41SBarry Smith 12051fa3d41SBarry Smith Collective over PetscDrawBar 12151fa3d41SBarry Smith 12251fa3d41SBarry Smith Input Parameter: 12351fa3d41SBarry Smith . bar - The bar graph context 12451fa3d41SBarry Smith 12551fa3d41SBarry Smith Level: intermediate 12651fa3d41SBarry Smith 12751fa3d41SBarry Smith .seealso: PetscDrawBarCreate() 12851fa3d41SBarry Smith @*/ 12951fa3d41SBarry Smith PetscErrorCode PetscDrawBarDestroy(PetscDrawBar *bar) 13051fa3d41SBarry Smith { 13151fa3d41SBarry Smith PetscErrorCode ierr; 13251fa3d41SBarry Smith 13351fa3d41SBarry Smith PetscFunctionBegin; 13451fa3d41SBarry Smith if (!*bar) PetscFunctionReturn(0); 135e118a51fSLisandro Dalcin PetscValidHeaderSpecific(*bar,PETSC_DRAWBAR_CLASSID,1); 13651fa3d41SBarry Smith if (--((PetscObject)(*bar))->refct > 0) PetscFunctionReturn(0); 137e118a51fSLisandro Dalcin 13851fa3d41SBarry Smith ierr = PetscFree((*bar)->values);CHKERRQ(ierr); 13951fa3d41SBarry Smith ierr = PetscStrArrayDestroy(&(*bar)->labels);CHKERRQ(ierr); 140e118a51fSLisandro Dalcin ierr = PetscDrawAxisDestroy(&(*bar)->axis);CHKERRQ(ierr); 141e118a51fSLisandro Dalcin ierr = PetscDrawDestroy(&(*bar)->win);CHKERRQ(ierr); 14251fa3d41SBarry Smith ierr = PetscHeaderDestroy(bar);CHKERRQ(ierr); 14351fa3d41SBarry Smith PetscFunctionReturn(0); 14451fa3d41SBarry Smith } 14551fa3d41SBarry Smith 14651fa3d41SBarry Smith #undef __FUNCT__ 14751fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarDraw" 14851fa3d41SBarry Smith /*@ 14951fa3d41SBarry Smith PetscDrawBarDraw - Redraws a bar graph. 15051fa3d41SBarry Smith 1515b399a63SLisandro Dalcin Collective on PetscDrawBar 15251fa3d41SBarry Smith 15351fa3d41SBarry Smith Input Parameter: 15451fa3d41SBarry Smith . bar - The bar graph context 15551fa3d41SBarry Smith 15651fa3d41SBarry Smith Level: intermediate 15751fa3d41SBarry Smith 15851fa3d41SBarry Smith @*/ 15951fa3d41SBarry Smith PetscErrorCode PetscDrawBarDraw(PetscDrawBar bar) 16051fa3d41SBarry Smith { 161e118a51fSLisandro Dalcin PetscDraw draw; 16251fa3d41SBarry Smith PetscBool isnull; 16351fa3d41SBarry Smith PetscReal xmin,xmax,ymin,ymax,*values,binLeft,binRight; 16451fa3d41SBarry Smith PetscInt numValues,i,bcolor,color,idx,*perm,nplot; 165e118a51fSLisandro Dalcin PetscMPIInt rank; 16651fa3d41SBarry Smith PetscErrorCode ierr; 16751fa3d41SBarry Smith char **labels; 16851fa3d41SBarry Smith 16951fa3d41SBarry Smith PetscFunctionBegin; 17051fa3d41SBarry Smith PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 1718f69470aSLisandro Dalcin ierr = PetscDrawIsNull(bar->win,&isnull);CHKERRQ(ierr); 1728f69470aSLisandro Dalcin if (isnull) PetscFunctionReturn(0); 173e118a51fSLisandro Dalcin ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)bar),&rank);CHKERRQ(ierr); 17451fa3d41SBarry Smith 1755b399a63SLisandro Dalcin if (bar->numBins < 1) PetscFunctionReturn(0); 1765b399a63SLisandro Dalcin 17751fa3d41SBarry Smith color = bar->color; 178*71917b75SLisandro Dalcin if (color == PETSC_DRAW_ROTATE) bcolor = PETSC_DRAW_BLACK+1; 17951fa3d41SBarry Smith else bcolor = color; 18051fa3d41SBarry Smith 18151fa3d41SBarry Smith numValues = bar->numBins; 18251fa3d41SBarry Smith values = bar->values; 18351fa3d41SBarry Smith if (bar->ymin == bar->ymax) { 18451fa3d41SBarry Smith /* user has not set bounds on bars so set them based on the data */ 18551fa3d41SBarry Smith ymin = PETSC_MAX_REAL; 18651fa3d41SBarry Smith ymax = PETSC_MIN_REAL; 18751fa3d41SBarry Smith for (i=0; i<numValues; i++) { 18851fa3d41SBarry Smith ymin = PetscMin(ymin,values[i]); 18951fa3d41SBarry Smith ymax = PetscMax(ymax,values[i]); 19051fa3d41SBarry Smith } 19151fa3d41SBarry Smith } else { 19251fa3d41SBarry Smith ymin = bar->ymin; 19351fa3d41SBarry Smith ymax = bar->ymax; 19451fa3d41SBarry Smith } 19551fa3d41SBarry Smith nplot = numValues; /* number of points to actually plot; if some are lower than requested tolerance */ 19651fa3d41SBarry Smith xmin = 0.0; 197e118a51fSLisandro Dalcin xmax = nplot; 19851fa3d41SBarry Smith labels = bar->labels; 19951fa3d41SBarry Smith 20051fa3d41SBarry Smith if (bar->sort) { 20151fa3d41SBarry Smith ierr = PetscMalloc1(numValues,&perm);CHKERRQ(ierr); 20251fa3d41SBarry Smith for (i=0; i<numValues;i++) perm[i] = i; 20351fa3d41SBarry Smith ierr = PetscSortRealWithPermutation(numValues,values,perm);CHKERRQ(ierr); 20451fa3d41SBarry Smith if (bar->sorttolerance) { 20551fa3d41SBarry Smith for (i=0; i<numValues;i++) { 20651fa3d41SBarry Smith if (values[perm[numValues - i - 1]] < bar->sorttolerance) { 20751fa3d41SBarry Smith nplot = i; 20851fa3d41SBarry Smith break; 20951fa3d41SBarry Smith } 21051fa3d41SBarry Smith } 21151fa3d41SBarry Smith } 21251fa3d41SBarry Smith } 21351fa3d41SBarry Smith 2145b399a63SLisandro Dalcin draw = bar->win; 215e118a51fSLisandro Dalcin ierr = PetscDrawCheckResizedWindow(draw);CHKERRQ(ierr); 2165b399a63SLisandro Dalcin ierr = PetscDrawClear(draw);CHKERRQ(ierr); 217e118a51fSLisandro Dalcin 21851fa3d41SBarry Smith ierr = PetscDrawAxisSetLimits(bar->axis,xmin,xmax,ymin,ymax);CHKERRQ(ierr); 21951fa3d41SBarry Smith ierr = PetscDrawAxisDraw(bar->axis);CHKERRQ(ierr); 22051fa3d41SBarry Smith 2215b399a63SLisandro Dalcin ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr); 222e118a51fSLisandro Dalcin if (!rank) { /* Draw bins */ 22351fa3d41SBarry Smith for (i=0; i<nplot; i++) { 22451fa3d41SBarry Smith idx = (bar->sort ? perm[numValues - i - 1] : i); 22551fa3d41SBarry Smith binLeft = xmin + i; 22651fa3d41SBarry Smith binRight = xmin + i + 1; 22751fa3d41SBarry Smith ierr = PetscDrawRectangle(draw,binLeft,ymin,binRight,values[idx],bcolor,bcolor,bcolor,bcolor);CHKERRQ(ierr); 22851fa3d41SBarry Smith ierr = PetscDrawLine(draw,binLeft,ymin,binLeft,values[idx],PETSC_DRAW_BLACK);CHKERRQ(ierr); 22951fa3d41SBarry Smith ierr = PetscDrawLine(draw,binRight,ymin,binRight,values[idx],PETSC_DRAW_BLACK);CHKERRQ(ierr); 23051fa3d41SBarry Smith ierr = PetscDrawLine(draw,binLeft,values[idx],binRight,values[idx],PETSC_DRAW_BLACK);CHKERRQ(ierr); 23151fa3d41SBarry Smith if (labels) { 23251fa3d41SBarry Smith PetscReal h; 23351fa3d41SBarry Smith ierr = PetscDrawStringGetSize(draw,NULL,&h);CHKERRQ(ierr); 234*71917b75SLisandro Dalcin ierr = PetscDrawStringCentered(draw,.5*(binLeft+binRight),ymin - 1.5*h,bcolor,labels[idx]);CHKERRQ(ierr); 23551fa3d41SBarry Smith } 23651fa3d41SBarry Smith if (color == PETSC_DRAW_ROTATE) bcolor++; 237*71917b75SLisandro Dalcin if (bcolor > PETSC_DRAW_BASIC_COLORS-1) bcolor = PETSC_DRAW_BLACK+1; 23851fa3d41SBarry Smith } 23951fa3d41SBarry Smith } 2405b399a63SLisandro Dalcin ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr); 241e118a51fSLisandro Dalcin if (bar->sort) {ierr = PetscFree(perm);CHKERRQ(ierr);} 242e118a51fSLisandro Dalcin 2435b399a63SLisandro Dalcin ierr = PetscDrawFlush(draw);CHKERRQ(ierr); 24451fa3d41SBarry Smith ierr = PetscDrawPause(draw);CHKERRQ(ierr); 24551fa3d41SBarry Smith PetscFunctionReturn(0); 24651fa3d41SBarry Smith } 24751fa3d41SBarry Smith 24851fa3d41SBarry Smith #undef __FUNCT__ 24957fd6651SLisandro Dalcin #define __FUNCT__ "PetscDrawBarSave" 25057fd6651SLisandro Dalcin /*@ 25157fd6651SLisandro Dalcin PetscDrawBarSave - Saves a drawn image 25257fd6651SLisandro Dalcin 25357fd6651SLisandro Dalcin Collective on PetscDrawBar 25457fd6651SLisandro Dalcin 25557fd6651SLisandro Dalcin Input Parameters: 25657fd6651SLisandro Dalcin . bar - The bar graph context 25757fd6651SLisandro Dalcin 25857fd6651SLisandro Dalcin Level: intermediate 25957fd6651SLisandro Dalcin 26057fd6651SLisandro Dalcin Concepts: bar graph^saving 26157fd6651SLisandro Dalcin 26257fd6651SLisandro Dalcin .seealso: PetscDrawBarCreate(), PetscDrawBarGetDraw(), PetscDrawSetSave(), PetscDrawSave() 26357fd6651SLisandro Dalcin @*/ 26457fd6651SLisandro Dalcin PetscErrorCode PetscDrawBarSave(PetscDrawBar bar) 26557fd6651SLisandro Dalcin { 26657fd6651SLisandro Dalcin PetscErrorCode ierr; 26757fd6651SLisandro Dalcin 26857fd6651SLisandro Dalcin PetscFunctionBegin; 26957fd6651SLisandro Dalcin PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 27057fd6651SLisandro Dalcin ierr = PetscDrawSave(bar->win);CHKERRQ(ierr); 27157fd6651SLisandro Dalcin PetscFunctionReturn(0); 27257fd6651SLisandro Dalcin } 27357fd6651SLisandro Dalcin 27457fd6651SLisandro Dalcin #undef __FUNCT__ 27551fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSetColor" 27651fa3d41SBarry Smith /*@ 27751fa3d41SBarry Smith PetscDrawBarSetColor - Sets the color the bars will be drawn with. 27851fa3d41SBarry Smith 2795b399a63SLisandro Dalcin Logically Collective on PetscDrawBar 28051fa3d41SBarry Smith 28151fa3d41SBarry Smith Input Parameters: 28251fa3d41SBarry Smith + bar - The bar graph context 28351fa3d41SBarry Smith - color - one of the colors defined in petscdraw.h or PETSC_DRAW_ROTATE to make each bar a 28451fa3d41SBarry Smith different color 28551fa3d41SBarry Smith 28651fa3d41SBarry Smith Level: intermediate 28751fa3d41SBarry Smith 28851fa3d41SBarry Smith @*/ 28951fa3d41SBarry Smith PetscErrorCode PetscDrawBarSetColor(PetscDrawBar bar, int color) 29051fa3d41SBarry Smith { 29151fa3d41SBarry Smith PetscFunctionBegin; 29251fa3d41SBarry Smith PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID,1); 29351fa3d41SBarry Smith bar->color = color; 29451fa3d41SBarry Smith PetscFunctionReturn(0); 29551fa3d41SBarry Smith } 29651fa3d41SBarry Smith 29751fa3d41SBarry Smith #undef __FUNCT__ 29851fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSort" 29951fa3d41SBarry Smith /*@ 30051fa3d41SBarry Smith PetscDrawBarSort - Sorts the values before drawing the bar chart 30151fa3d41SBarry Smith 3025b399a63SLisandro Dalcin Logically Collective on PetscDrawBar 30351fa3d41SBarry Smith 30451fa3d41SBarry Smith Input Parameters: 30551fa3d41SBarry Smith + bar - The bar graph context 30651fa3d41SBarry Smith . sort - PETSC_TRUE to sort the values 30751fa3d41SBarry Smith . tolerance - discard values less than tolerance 30851fa3d41SBarry Smith 30951fa3d41SBarry Smith Level: intermediate 31051fa3d41SBarry Smith 31151fa3d41SBarry Smith Concepts: bar graph^setting axis 31251fa3d41SBarry Smith @*/ 31351fa3d41SBarry Smith PetscErrorCode PetscDrawBarSort(PetscDrawBar bar, PetscBool sort, PetscReal tolerance) 31451fa3d41SBarry Smith { 31551fa3d41SBarry Smith PetscFunctionBegin; 31651fa3d41SBarry Smith PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 31751fa3d41SBarry Smith bar->sort = sort; 31851fa3d41SBarry Smith bar->sorttolerance = tolerance; 31951fa3d41SBarry Smith PetscFunctionReturn(0); 32051fa3d41SBarry Smith } 32151fa3d41SBarry Smith 32251fa3d41SBarry Smith #undef __FUNCT__ 32351fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSetLimits" 32451fa3d41SBarry Smith /*@ 32551fa3d41SBarry Smith PetscDrawBarSetLimits - Sets the axis limits for a bar graph. If more 32651fa3d41SBarry Smith points are added after this call, the limits will be adjusted to 32751fa3d41SBarry Smith include those additional points. 32851fa3d41SBarry Smith 3295b399a63SLisandro Dalcin Logically Collective on PetscDrawBar 33051fa3d41SBarry Smith 33151fa3d41SBarry Smith Input Parameters: 33251fa3d41SBarry Smith + bar - The bar graph context 33351fa3d41SBarry Smith - y_min,y_max - The limits 33451fa3d41SBarry Smith 33551fa3d41SBarry Smith Level: intermediate 33651fa3d41SBarry Smith 33751fa3d41SBarry Smith Concepts: bar graph^setting axis 33851fa3d41SBarry Smith @*/ 33951fa3d41SBarry Smith PetscErrorCode PetscDrawBarSetLimits(PetscDrawBar bar, PetscReal y_min, PetscReal y_max) 34051fa3d41SBarry Smith { 34151fa3d41SBarry Smith PetscFunctionBegin; 34251fa3d41SBarry Smith PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 34351fa3d41SBarry Smith bar->ymin = y_min; 34451fa3d41SBarry Smith bar->ymax = y_max; 34551fa3d41SBarry Smith PetscFunctionReturn(0); 34651fa3d41SBarry Smith } 34751fa3d41SBarry Smith 34851fa3d41SBarry Smith #undef __FUNCT__ 34951fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarGetAxis" 35051fa3d41SBarry Smith /*@C 35151fa3d41SBarry Smith PetscDrawBarGetAxis - Gets the axis context associated with a bar graph. 35251fa3d41SBarry Smith This is useful if one wants to change some axis property, such as 35351fa3d41SBarry Smith labels, color, etc. The axis context should not be destroyed by the 35451fa3d41SBarry Smith application code. 35551fa3d41SBarry Smith 3565b399a63SLisandro Dalcin Not Collective, PetscDrawAxis is parallel if PetscDrawBar is parallel 35751fa3d41SBarry Smith 35851fa3d41SBarry Smith Input Parameter: 35951fa3d41SBarry Smith . bar - The bar graph context 36051fa3d41SBarry Smith 36151fa3d41SBarry Smith Output Parameter: 36251fa3d41SBarry Smith . axis - The axis context 36351fa3d41SBarry Smith 36451fa3d41SBarry Smith Level: intermediate 36551fa3d41SBarry Smith 36651fa3d41SBarry Smith @*/ 36751fa3d41SBarry Smith PetscErrorCode PetscDrawBarGetAxis(PetscDrawBar bar,PetscDrawAxis *axis) 36851fa3d41SBarry Smith { 36951fa3d41SBarry Smith PetscFunctionBegin; 370e118a51fSLisandro Dalcin PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 37145f3bb6eSLisandro Dalcin PetscValidPointer(axis,2); 37251fa3d41SBarry Smith *axis = bar->axis; 37351fa3d41SBarry Smith PetscFunctionReturn(0); 37451fa3d41SBarry Smith } 37551fa3d41SBarry Smith 37651fa3d41SBarry Smith #undef __FUNCT__ 37751fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarGetDraw" 37851fa3d41SBarry Smith /*@C 37951fa3d41SBarry Smith PetscDrawBarGetDraw - Gets the draw context associated with a bar graph. 38051fa3d41SBarry Smith 38151fa3d41SBarry Smith Not Collective, PetscDraw is parallel if PetscDrawBar is parallel 38251fa3d41SBarry Smith 38351fa3d41SBarry Smith Input Parameter: 38451fa3d41SBarry Smith . bar - The bar graph context 38551fa3d41SBarry Smith 38651fa3d41SBarry Smith Output Parameter: 387e118a51fSLisandro Dalcin . draw - The draw context 38851fa3d41SBarry Smith 38951fa3d41SBarry Smith Level: intermediate 39051fa3d41SBarry Smith 39151fa3d41SBarry Smith @*/ 392e118a51fSLisandro Dalcin PetscErrorCode PetscDrawBarGetDraw(PetscDrawBar bar,PetscDraw *draw) 39351fa3d41SBarry Smith { 39451fa3d41SBarry Smith PetscFunctionBegin; 39551fa3d41SBarry Smith PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 39645f3bb6eSLisandro Dalcin PetscValidPointer(draw,2); 397e118a51fSLisandro Dalcin *draw = bar->win; 39851fa3d41SBarry Smith PetscFunctionReturn(0); 39951fa3d41SBarry Smith } 40051fa3d41SBarry Smith 40151fa3d41SBarry Smith #undef __FUNCT__ 40251fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSetFromOptions" 40351fa3d41SBarry Smith /*@ 40451fa3d41SBarry Smith PetscDrawBarSetFromOptions - Sets options related to the PetscDrawBar 40551fa3d41SBarry Smith 40651fa3d41SBarry Smith Collective over PetscDrawBar 40751fa3d41SBarry Smith 40851fa3d41SBarry Smith Options Database: 40951fa3d41SBarry Smith . -bar_sort - sort the entries before drawing the bar graph 41051fa3d41SBarry Smith 41151fa3d41SBarry Smith Level: intermediate 41251fa3d41SBarry Smith 41351fa3d41SBarry Smith 41451fa3d41SBarry Smith .seealso: PetscDrawBarDestroy(), PetscDrawBarCreate() 41551fa3d41SBarry Smith @*/ 41651fa3d41SBarry Smith PetscErrorCode PetscDrawBarSetFromOptions(PetscDrawBar bar) 41751fa3d41SBarry Smith { 41851fa3d41SBarry Smith PetscErrorCode ierr; 41951fa3d41SBarry Smith PetscBool set; 42051fa3d41SBarry Smith 42151fa3d41SBarry Smith PetscFunctionBegin; 422e118a51fSLisandro Dalcin PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 423e118a51fSLisandro Dalcin 424*71917b75SLisandro Dalcin ierr = PetscOptionsHasName(((PetscObject)bar)->options,((PetscObject)bar)->prefix,"-bar_sort",&set);CHKERRQ(ierr); 42551fa3d41SBarry Smith if (set) { 426e118a51fSLisandro Dalcin PetscReal tol = bar->sorttolerance; 427*71917b75SLisandro Dalcin ierr = PetscOptionsGetReal(((PetscObject)bar)->options,((PetscObject)bar)->prefix,"-bar_sort",&tol,NULL);CHKERRQ(ierr); 42851fa3d41SBarry Smith ierr = PetscDrawBarSort(bar,PETSC_TRUE,tol);CHKERRQ(ierr); 42951fa3d41SBarry Smith } 43051fa3d41SBarry Smith PetscFunctionReturn(0); 43151fa3d41SBarry Smith } 43251fa3d41SBarry Smith 433