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 PetscBool isnull; 5351fa3d41SBarry Smith PetscErrorCode ierr; 5451fa3d41SBarry Smith 5551fa3d41SBarry Smith PetscFunctionBegin; 5651fa3d41SBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 5773107ff1SLisandro Dalcin PetscValidPointer(bar,2); 58e118a51fSLisandro Dalcin 59e118a51fSLisandro Dalcin ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr); 60e118a51fSLisandro Dalcin if (isnull) {*bar = NULL; PetscFunctionReturn(0);} 61e118a51fSLisandro Dalcin 6273107ff1SLisandro Dalcin ierr = PetscHeaderCreate(h, PETSC_DRAWBAR_CLASSID, "PetscDrawBar", "Bar Graph", "Draw", PetscObjectComm((PetscObject)draw), PetscDrawBarDestroy, NULL);CHKERRQ(ierr); 63e118a51fSLisandro Dalcin ierr = PetscLogObjectParent((PetscObject)draw,(PetscObject)h);CHKERRQ(ierr); 64e118a51fSLisandro Dalcin 65e118a51fSLisandro Dalcin ierr = PetscObjectReference((PetscObject)draw);CHKERRQ(ierr); 66e118a51fSLisandro Dalcin h->win = draw; 6751fa3d41SBarry Smith 6851fa3d41SBarry Smith h->view = NULL; 6951fa3d41SBarry Smith h->destroy = NULL; 7051fa3d41SBarry Smith h->color = PETSC_DRAW_GREEN; 7151fa3d41SBarry Smith h->ymin = 0.; /* if user has not set these then they are determined from the data */ 7251fa3d41SBarry Smith h->ymax = 0.; 7351fa3d41SBarry Smith h->numBins = 0; 7451fa3d41SBarry Smith 7551fa3d41SBarry Smith ierr = PetscDrawAxisCreate(draw,&h->axis);CHKERRQ(ierr); 76e118a51fSLisandro Dalcin if (h->axis) h->axis->xticks = NULL; 77e118a51fSLisandro Dalcin 7851fa3d41SBarry Smith *bar = h; 7951fa3d41SBarry Smith PetscFunctionReturn(0); 8051fa3d41SBarry Smith } 8151fa3d41SBarry Smith 8251fa3d41SBarry Smith #undef __FUNCT__ 8351fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSetData" 8451fa3d41SBarry Smith /*@C 8551fa3d41SBarry Smith PetscDrawBarSetData 8651fa3d41SBarry Smith 8751fa3d41SBarry Smith Not Collective (ignored except on processor 0 of PetscDrawBar) 8851fa3d41SBarry Smith 8951fa3d41SBarry Smith Input Parameter: 9051fa3d41SBarry Smith + bar - The bar graph context. 9151fa3d41SBarry Smith . bins - number of items 9251fa3d41SBarry Smith . values - values of each item 9351fa3d41SBarry Smith - labels - optional label for each bar, NULL terminated array of strings 9451fa3d41SBarry Smith 9551fa3d41SBarry Smith Level: intermediate 9651fa3d41SBarry Smith 9751fa3d41SBarry Smith 9851fa3d41SBarry Smith @*/ 9951fa3d41SBarry Smith PetscErrorCode PetscDrawBarSetData(PetscDrawBar bar, PetscInt bins,const PetscReal data[],const char *const *labels) 10051fa3d41SBarry Smith { 10151fa3d41SBarry Smith PetscErrorCode ierr; 10251fa3d41SBarry Smith 10351fa3d41SBarry Smith PetscFunctionBegin; 104e118a51fSLisandro Dalcin if (!bar) PetscFunctionReturn(0); 10551fa3d41SBarry Smith PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 106e118a51fSLisandro Dalcin 10751fa3d41SBarry Smith if (bar->numBins != bins) { 10851fa3d41SBarry Smith ierr = PetscFree(bar->values);CHKERRQ(ierr); 10951fa3d41SBarry Smith ierr = PetscMalloc1(bins, &bar->values);CHKERRQ(ierr); 11051fa3d41SBarry Smith bar->numBins = bins; 11151fa3d41SBarry Smith } 11251fa3d41SBarry Smith ierr = PetscMemcpy(bar->values,data,bins*sizeof(PetscReal));CHKERRQ(ierr); 11351fa3d41SBarry Smith bar->numBins = bins; 11451fa3d41SBarry Smith if (labels) { 11551fa3d41SBarry Smith ierr = PetscStrArrayallocpy(labels,&bar->labels);CHKERRQ(ierr); 11651fa3d41SBarry Smith } 11751fa3d41SBarry Smith PetscFunctionReturn(0); 11851fa3d41SBarry Smith } 11951fa3d41SBarry Smith 12051fa3d41SBarry Smith #undef __FUNCT__ 12151fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarDestroy" 12251fa3d41SBarry Smith /*@C 12351fa3d41SBarry Smith PetscDrawBarDestroy - Frees all space taken up by bar graph data structure. 12451fa3d41SBarry Smith 12551fa3d41SBarry Smith Collective over PetscDrawBar 12651fa3d41SBarry Smith 12751fa3d41SBarry Smith Input Parameter: 12851fa3d41SBarry Smith . bar - The bar graph context 12951fa3d41SBarry Smith 13051fa3d41SBarry Smith Level: intermediate 13151fa3d41SBarry Smith 13251fa3d41SBarry Smith .seealso: PetscDrawBarCreate() 13351fa3d41SBarry Smith @*/ 13451fa3d41SBarry Smith PetscErrorCode PetscDrawBarDestroy(PetscDrawBar *bar) 13551fa3d41SBarry Smith { 13651fa3d41SBarry Smith PetscErrorCode ierr; 13751fa3d41SBarry Smith 13851fa3d41SBarry Smith PetscFunctionBegin; 13951fa3d41SBarry Smith if (!*bar) PetscFunctionReturn(0); 140e118a51fSLisandro Dalcin PetscValidHeaderSpecific(*bar,PETSC_DRAWBAR_CLASSID,1); 14151fa3d41SBarry Smith if (--((PetscObject)(*bar))->refct > 0) PetscFunctionReturn(0); 142e118a51fSLisandro Dalcin 14351fa3d41SBarry Smith ierr = PetscFree((*bar)->values);CHKERRQ(ierr); 14451fa3d41SBarry Smith ierr = PetscStrArrayDestroy(&(*bar)->labels);CHKERRQ(ierr); 145e118a51fSLisandro Dalcin ierr = PetscDrawAxisDestroy(&(*bar)->axis);CHKERRQ(ierr); 146e118a51fSLisandro Dalcin ierr = PetscDrawDestroy(&(*bar)->win);CHKERRQ(ierr); 14751fa3d41SBarry Smith ierr = PetscHeaderDestroy(bar);CHKERRQ(ierr); 14851fa3d41SBarry Smith PetscFunctionReturn(0); 14951fa3d41SBarry Smith } 15051fa3d41SBarry Smith 15151fa3d41SBarry Smith #undef __FUNCT__ 15251fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarDraw" 15351fa3d41SBarry Smith /*@ 15451fa3d41SBarry Smith PetscDrawBarDraw - Redraws a bar graph. 15551fa3d41SBarry Smith 156e118a51fSLisandro Dalcin Collective, but ignored by all processors except processor 0 in PetscDrawBar 15751fa3d41SBarry Smith 15851fa3d41SBarry Smith Input Parameter: 15951fa3d41SBarry Smith . bar - The bar graph context 16051fa3d41SBarry Smith 16151fa3d41SBarry Smith Level: intermediate 16251fa3d41SBarry Smith 16351fa3d41SBarry Smith @*/ 16451fa3d41SBarry Smith PetscErrorCode PetscDrawBarDraw(PetscDrawBar bar) 16551fa3d41SBarry Smith { 166e118a51fSLisandro Dalcin PetscDraw draw; 16751fa3d41SBarry Smith PetscBool isnull; 16851fa3d41SBarry Smith PetscReal xmin,xmax,ymin,ymax,*values,binLeft,binRight; 16951fa3d41SBarry Smith PetscInt numValues,i,bcolor,color,idx,*perm,nplot; 170e118a51fSLisandro Dalcin PetscMPIInt rank; 17151fa3d41SBarry Smith PetscErrorCode ierr; 17251fa3d41SBarry Smith char **labels; 17351fa3d41SBarry Smith 17451fa3d41SBarry Smith PetscFunctionBegin; 175e118a51fSLisandro Dalcin if (!bar) PetscFunctionReturn(0); 17651fa3d41SBarry Smith PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 177*8f69470aSLisandro Dalcin ierr = PetscDrawIsNull(bar->win,&isnull);CHKERRQ(ierr); 178*8f69470aSLisandro Dalcin if (isnull) PetscFunctionReturn(0); 179e118a51fSLisandro Dalcin 180e118a51fSLisandro Dalcin draw = bar->win; 18151fa3d41SBarry Smith if (bar->numBins < 1) PetscFunctionReturn(0); 182e118a51fSLisandro Dalcin ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)bar),&rank);CHKERRQ(ierr); 18351fa3d41SBarry Smith 18451fa3d41SBarry Smith color = bar->color; 18551fa3d41SBarry Smith if (color == PETSC_DRAW_ROTATE) bcolor = 2; 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 221e118a51fSLisandro Dalcin ierr = PetscDrawCheckResizedWindow(draw);CHKERRQ(ierr); 222e118a51fSLisandro Dalcin ierr = PetscDrawSynchronizedClear(draw);CHKERRQ(ierr); 223e118a51fSLisandro Dalcin ierr = PetscDrawCollectiveBegin(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 228e118a51fSLisandro Dalcin if (!rank) { /* Draw bins */ 22951fa3d41SBarry Smith for (i=0; i<nplot; i++) { 23051fa3d41SBarry Smith idx = (bar->sort ? perm[numValues - i - 1] : i); 23151fa3d41SBarry Smith binLeft = xmin + i; 23251fa3d41SBarry Smith binRight = xmin + i + 1; 23351fa3d41SBarry Smith ierr = PetscDrawRectangle(draw,binLeft,ymin,binRight,values[idx],bcolor,bcolor,bcolor,bcolor);CHKERRQ(ierr); 23451fa3d41SBarry Smith ierr = PetscDrawLine(draw,binLeft,ymin,binLeft,values[idx],PETSC_DRAW_BLACK);CHKERRQ(ierr); 23551fa3d41SBarry Smith ierr = PetscDrawLine(draw,binRight,ymin,binRight,values[idx],PETSC_DRAW_BLACK);CHKERRQ(ierr); 23651fa3d41SBarry Smith ierr = PetscDrawLine(draw,binLeft,values[idx],binRight,values[idx],PETSC_DRAW_BLACK);CHKERRQ(ierr); 23751fa3d41SBarry Smith if (labels) { 23851fa3d41SBarry Smith PetscReal h; 23951fa3d41SBarry Smith ierr = PetscDrawStringGetSize(draw,NULL,&h);CHKERRQ(ierr); 24051fa3d41SBarry Smith ierr = PetscDrawStringCentered(draw,.5*(binLeft+binRight),ymin - 1.2*h,bcolor,labels[idx]);CHKERRQ(ierr); 24151fa3d41SBarry Smith } 24251fa3d41SBarry Smith if (color == PETSC_DRAW_ROTATE) bcolor++; 243e118a51fSLisandro Dalcin if (bcolor > PETSC_DRAW_BASIC_COLORS-1) bcolor = 2; 24451fa3d41SBarry Smith } 24551fa3d41SBarry Smith } 246e118a51fSLisandro Dalcin if (bar->sort) {ierr = PetscFree(perm);CHKERRQ(ierr);} 247e118a51fSLisandro Dalcin 248e118a51fSLisandro Dalcin ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr); 24951fa3d41SBarry Smith ierr = PetscDrawSynchronizedFlush(draw);CHKERRQ(ierr); 25051fa3d41SBarry Smith ierr = PetscDrawPause(draw);CHKERRQ(ierr); 25151fa3d41SBarry Smith PetscFunctionReturn(0); 25251fa3d41SBarry Smith } 25351fa3d41SBarry Smith 25451fa3d41SBarry Smith #undef __FUNCT__ 25551fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSetColor" 25651fa3d41SBarry Smith /*@ 25751fa3d41SBarry Smith PetscDrawBarSetColor - Sets the color the bars will be drawn with. 25851fa3d41SBarry Smith 25951fa3d41SBarry Smith Not Collective (ignored except on processor 0 of PetscDrawBar) 26051fa3d41SBarry Smith 26151fa3d41SBarry Smith Input Parameters: 26251fa3d41SBarry Smith + bar - The bar graph context 26351fa3d41SBarry Smith - color - one of the colors defined in petscdraw.h or PETSC_DRAW_ROTATE to make each bar a 26451fa3d41SBarry Smith different color 26551fa3d41SBarry Smith 26651fa3d41SBarry Smith Level: intermediate 26751fa3d41SBarry Smith 26851fa3d41SBarry Smith @*/ 26951fa3d41SBarry Smith PetscErrorCode PetscDrawBarSetColor(PetscDrawBar bar, int color) 27051fa3d41SBarry Smith { 27151fa3d41SBarry Smith PetscFunctionBegin; 272e118a51fSLisandro Dalcin if (!bar) PetscFunctionReturn(0); 27351fa3d41SBarry Smith PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID,1); 27451fa3d41SBarry Smith bar->color = color; 27551fa3d41SBarry Smith PetscFunctionReturn(0); 27651fa3d41SBarry Smith } 27751fa3d41SBarry Smith 27851fa3d41SBarry Smith #undef __FUNCT__ 27951fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSort" 28051fa3d41SBarry Smith /*@ 28151fa3d41SBarry Smith PetscDrawBarSort - Sorts the values before drawing the bar chart 28251fa3d41SBarry Smith 28351fa3d41SBarry Smith Not Collective (ignored except on processor 0 of PetscDrawBar) 28451fa3d41SBarry Smith 28551fa3d41SBarry Smith Input Parameters: 28651fa3d41SBarry Smith + bar - The bar graph context 28751fa3d41SBarry Smith . sort - PETSC_TRUE to sort the values 28851fa3d41SBarry Smith . tolerance - discard values less than tolerance 28951fa3d41SBarry Smith 29051fa3d41SBarry Smith Level: intermediate 29151fa3d41SBarry Smith 29251fa3d41SBarry Smith Concepts: bar graph^setting axis 29351fa3d41SBarry Smith @*/ 29451fa3d41SBarry Smith PetscErrorCode PetscDrawBarSort(PetscDrawBar bar, PetscBool sort, PetscReal tolerance) 29551fa3d41SBarry Smith { 29651fa3d41SBarry Smith PetscFunctionBegin; 297e118a51fSLisandro Dalcin if (!bar) PetscFunctionReturn(0); 29851fa3d41SBarry Smith PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 29951fa3d41SBarry Smith bar->sort = sort; 30051fa3d41SBarry Smith bar->sorttolerance = tolerance; 30151fa3d41SBarry Smith PetscFunctionReturn(0); 30251fa3d41SBarry Smith } 30351fa3d41SBarry Smith 30451fa3d41SBarry Smith #undef __FUNCT__ 30551fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSetLimits" 30651fa3d41SBarry Smith /*@ 30751fa3d41SBarry Smith PetscDrawBarSetLimits - Sets the axis limits for a bar graph. If more 30851fa3d41SBarry Smith points are added after this call, the limits will be adjusted to 30951fa3d41SBarry Smith include those additional points. 31051fa3d41SBarry Smith 31151fa3d41SBarry Smith Not Collective (ignored except on processor 0 of PetscDrawBar) 31251fa3d41SBarry Smith 31351fa3d41SBarry Smith Input Parameters: 31451fa3d41SBarry Smith + bar - The bar graph context 31551fa3d41SBarry Smith - y_min,y_max - The limits 31651fa3d41SBarry Smith 31751fa3d41SBarry Smith Level: intermediate 31851fa3d41SBarry Smith 31951fa3d41SBarry Smith Concepts: bar graph^setting axis 32051fa3d41SBarry Smith @*/ 32151fa3d41SBarry Smith PetscErrorCode PetscDrawBarSetLimits(PetscDrawBar bar, PetscReal y_min, PetscReal y_max) 32251fa3d41SBarry Smith { 32351fa3d41SBarry Smith PetscFunctionBegin; 324e118a51fSLisandro Dalcin if (!bar) PetscFunctionReturn(0); 32551fa3d41SBarry Smith PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 32651fa3d41SBarry Smith bar->ymin = y_min; 32751fa3d41SBarry Smith bar->ymax = y_max; 32851fa3d41SBarry Smith PetscFunctionReturn(0); 32951fa3d41SBarry Smith } 33051fa3d41SBarry Smith 33151fa3d41SBarry Smith #undef __FUNCT__ 33251fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarGetAxis" 33351fa3d41SBarry Smith /*@C 33451fa3d41SBarry Smith PetscDrawBarGetAxis - Gets the axis context associated with a bar graph. 33551fa3d41SBarry Smith This is useful if one wants to change some axis property, such as 33651fa3d41SBarry Smith labels, color, etc. The axis context should not be destroyed by the 33751fa3d41SBarry Smith application code. 33851fa3d41SBarry Smith 33951fa3d41SBarry Smith Not Collective (ignored except on processor 0 of PetscDrawBar) 34051fa3d41SBarry Smith 34151fa3d41SBarry Smith Input Parameter: 34251fa3d41SBarry Smith . bar - The bar graph context 34351fa3d41SBarry Smith 34451fa3d41SBarry Smith Output Parameter: 34551fa3d41SBarry Smith . axis - The axis context 34651fa3d41SBarry Smith 34751fa3d41SBarry Smith Level: intermediate 34851fa3d41SBarry Smith 34951fa3d41SBarry Smith @*/ 35051fa3d41SBarry Smith PetscErrorCode PetscDrawBarGetAxis(PetscDrawBar bar, PetscDrawAxis *axis) 35151fa3d41SBarry Smith { 35251fa3d41SBarry Smith PetscFunctionBegin; 35351fa3d41SBarry Smith PetscValidPointer(axis,2); 354e118a51fSLisandro Dalcin if (!bar) {*axis = NULL; PetscFunctionReturn(0);} 355e118a51fSLisandro Dalcin PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 35651fa3d41SBarry Smith *axis = bar->axis; 35751fa3d41SBarry Smith PetscFunctionReturn(0); 35851fa3d41SBarry Smith } 35951fa3d41SBarry Smith 36051fa3d41SBarry Smith #undef __FUNCT__ 36151fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarGetDraw" 36251fa3d41SBarry Smith /*@C 36351fa3d41SBarry Smith PetscDrawBarGetDraw - Gets the draw context associated with a bar graph. 36451fa3d41SBarry Smith 36551fa3d41SBarry Smith Not Collective, PetscDraw is parallel if PetscDrawBar is parallel 36651fa3d41SBarry Smith 36751fa3d41SBarry Smith Input Parameter: 36851fa3d41SBarry Smith . bar - The bar graph context 36951fa3d41SBarry Smith 37051fa3d41SBarry Smith Output Parameter: 371e118a51fSLisandro Dalcin . draw - The draw context 37251fa3d41SBarry Smith 37351fa3d41SBarry Smith Level: intermediate 37451fa3d41SBarry Smith 37551fa3d41SBarry Smith @*/ 376e118a51fSLisandro Dalcin PetscErrorCode PetscDrawBarGetDraw(PetscDrawBar bar, PetscDraw *draw) 37751fa3d41SBarry Smith { 37851fa3d41SBarry Smith PetscFunctionBegin; 379e118a51fSLisandro Dalcin PetscValidPointer(draw,2); 380e118a51fSLisandro Dalcin if (!bar) {*draw = NULL; PetscFunctionReturn(0);} 38151fa3d41SBarry Smith PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 382e118a51fSLisandro Dalcin *draw = bar->win; 38351fa3d41SBarry Smith PetscFunctionReturn(0); 38451fa3d41SBarry Smith } 38551fa3d41SBarry Smith 38651fa3d41SBarry Smith #undef __FUNCT__ 38751fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSetFromOptions" 38851fa3d41SBarry Smith /*@ 38951fa3d41SBarry Smith PetscDrawBarSetFromOptions - Sets options related to the PetscDrawBar 39051fa3d41SBarry Smith 39151fa3d41SBarry Smith Collective over PetscDrawBar 39251fa3d41SBarry Smith 39351fa3d41SBarry Smith Options Database: 39451fa3d41SBarry Smith . -bar_sort - sort the entries before drawing the bar graph 39551fa3d41SBarry Smith 39651fa3d41SBarry Smith Level: intermediate 39751fa3d41SBarry Smith 39851fa3d41SBarry Smith 39951fa3d41SBarry Smith .seealso: PetscDrawBarDestroy(), PetscDrawBarCreate() 40051fa3d41SBarry Smith @*/ 40151fa3d41SBarry Smith PetscErrorCode PetscDrawBarSetFromOptions(PetscDrawBar bar) 40251fa3d41SBarry Smith { 40351fa3d41SBarry Smith PetscErrorCode ierr; 40451fa3d41SBarry Smith PetscBool set; 40551fa3d41SBarry Smith 40651fa3d41SBarry Smith PetscFunctionBegin; 407e118a51fSLisandro Dalcin if (!bar) PetscFunctionReturn(0); 408e118a51fSLisandro Dalcin PetscValidHeaderSpecific(bar,PETSC_DRAWBAR_CLASSID,1); 409e118a51fSLisandro Dalcin 410c5929fdfSBarry Smith ierr = PetscOptionsHasName(((PetscObject)bar)->options,NULL,"-bar_sort",&set);CHKERRQ(ierr); 41151fa3d41SBarry Smith if (set) { 412e118a51fSLisandro Dalcin PetscReal tol = bar->sorttolerance; 413c5929fdfSBarry Smith ierr = PetscOptionsGetReal(((PetscObject)bar)->options,NULL,"-bar_sort",&tol,NULL);CHKERRQ(ierr); 41451fa3d41SBarry Smith ierr = PetscDrawBarSort(bar,PETSC_TRUE,tol);CHKERRQ(ierr); 41551fa3d41SBarry Smith } 41651fa3d41SBarry Smith PetscFunctionReturn(0); 41751fa3d41SBarry Smith } 41851fa3d41SBarry Smith 419