1*51fa3d41SBarry Smith 2*51fa3d41SBarry Smith /* 3*51fa3d41SBarry Smith Contains the data structure for plotting a bargraph in a window with an axis. 4*51fa3d41SBarry Smith */ 5*51fa3d41SBarry Smith #include <petscdraw.h> /*I "petscdraw.h" I*/ 6*51fa3d41SBarry Smith #include <petsc-private/petscimpl.h> /*I "petscsys.h" I*/ 7*51fa3d41SBarry Smith #include <petscviewer.h> /*I "petscviewer.h" I*/ 8*51fa3d41SBarry Smith #include <../src/sys/classes/draw/utils/axisimpl.h> /* so we can directly modify axis xticks */ 9*51fa3d41SBarry Smith 10*51fa3d41SBarry Smith PetscClassId PETSC_DRAWBAR_CLASSID = 0; 11*51fa3d41SBarry Smith 12*51fa3d41SBarry Smith struct _p_PetscDrawBar { 13*51fa3d41SBarry Smith PETSCHEADER(int); 14*51fa3d41SBarry Smith PetscErrorCode (*destroy)(PetscDrawSP); 15*51fa3d41SBarry Smith PetscErrorCode (*view)(PetscDrawSP,PetscViewer); 16*51fa3d41SBarry Smith PetscDraw win; 17*51fa3d41SBarry Smith PetscDrawAxis axis; 18*51fa3d41SBarry Smith PetscReal ymin,ymax; 19*51fa3d41SBarry Smith int numBins; 20*51fa3d41SBarry Smith PetscReal *values; 21*51fa3d41SBarry Smith int color; 22*51fa3d41SBarry Smith char **labels; 23*51fa3d41SBarry Smith PetscBool sort; 24*51fa3d41SBarry Smith PetscReal sorttolerance; 25*51fa3d41SBarry Smith }; 26*51fa3d41SBarry Smith 27*51fa3d41SBarry Smith #define CHUNKSIZE 100 28*51fa3d41SBarry Smith 29*51fa3d41SBarry Smith #undef __FUNCT__ 30*51fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarCreate" 31*51fa3d41SBarry Smith /*@C 32*51fa3d41SBarry Smith PetscDrawBarCreate - Creates a bar graph data structure. 33*51fa3d41SBarry Smith 34*51fa3d41SBarry Smith Collective over PetscDraw 35*51fa3d41SBarry Smith 36*51fa3d41SBarry Smith Input Parameters: 37*51fa3d41SBarry Smith . draw - The window where the graph will be made 38*51fa3d41SBarry Smith 39*51fa3d41SBarry Smith Output Parameters: 40*51fa3d41SBarry Smith . bar - The bar graph context 41*51fa3d41SBarry Smith 42*51fa3d41SBarry Smith Level: intermediate 43*51fa3d41SBarry Smith 44*51fa3d41SBarry Smith Concepts: bar graph^creating 45*51fa3d41SBarry Smith 46*51fa3d41SBarry Smith .seealso: PetscDrawBarDestroy() 47*51fa3d41SBarry Smith 48*51fa3d41SBarry Smith @*/ 49*51fa3d41SBarry Smith PetscErrorCode PetscDrawBarCreate(PetscDraw draw, PetscDrawBar *bar) 50*51fa3d41SBarry Smith { 51*51fa3d41SBarry Smith PetscDrawBar h; 52*51fa3d41SBarry Smith MPI_Comm comm; 53*51fa3d41SBarry Smith PetscBool isnull; 54*51fa3d41SBarry Smith PetscErrorCode ierr; 55*51fa3d41SBarry Smith 56*51fa3d41SBarry Smith PetscFunctionBegin; 57*51fa3d41SBarry Smith PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID,1); 58*51fa3d41SBarry Smith PetscValidPointer(bar,3); 59*51fa3d41SBarry Smith ierr = PetscObjectGetComm((PetscObject) draw, &comm);CHKERRQ(ierr); 60*51fa3d41SBarry Smith ierr = PetscHeaderCreate(h, _p_PetscDrawBar, int, PETSC_DRAWBAR_CLASSID, "PetscDrawBar", "Bar Graph", "Draw", comm, PetscDrawBarDestroy, NULL);CHKERRQ(ierr); 61*51fa3d41SBarry Smith 62*51fa3d41SBarry Smith h->view = NULL; 63*51fa3d41SBarry Smith h->destroy = NULL; 64*51fa3d41SBarry Smith h->win = draw; 65*51fa3d41SBarry Smith 66*51fa3d41SBarry Smith ierr = PetscObjectReference((PetscObject) draw);CHKERRQ(ierr); 67*51fa3d41SBarry Smith 68*51fa3d41SBarry Smith h->color = PETSC_DRAW_GREEN; 69*51fa3d41SBarry Smith h->ymin = 0.; /* if user has not set these then they are determined from the data */ 70*51fa3d41SBarry Smith h->ymax = 0.; 71*51fa3d41SBarry Smith h->numBins = 0; 72*51fa3d41SBarry Smith 73*51fa3d41SBarry Smith ierr = PetscObjectTypeCompare((PetscObject) draw, PETSC_DRAW_NULL, &isnull);CHKERRQ(ierr); 74*51fa3d41SBarry Smith if (!isnull) { 75*51fa3d41SBarry Smith ierr = PetscDrawAxisCreate(draw, &h->axis);CHKERRQ(ierr); 76*51fa3d41SBarry Smith ierr = PetscLogObjectParent((PetscObject)h, (PetscObject)h->axis);CHKERRQ(ierr); 77*51fa3d41SBarry Smith h->axis->xticks = NULL; 78*51fa3d41SBarry Smith } else h->axis = NULL; 79*51fa3d41SBarry Smith *bar = h; 80*51fa3d41SBarry Smith PetscFunctionReturn(0); 81*51fa3d41SBarry Smith } 82*51fa3d41SBarry Smith 83*51fa3d41SBarry Smith #undef __FUNCT__ 84*51fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSetData" 85*51fa3d41SBarry Smith /*@C 86*51fa3d41SBarry Smith PetscDrawBarSetData 87*51fa3d41SBarry Smith 88*51fa3d41SBarry Smith Not Collective (ignored except on processor 0 of PetscDrawBar) 89*51fa3d41SBarry Smith 90*51fa3d41SBarry Smith Input Parameter: 91*51fa3d41SBarry Smith + bar - The bar graph context. 92*51fa3d41SBarry Smith . bins - number of items 93*51fa3d41SBarry Smith . values - values of each item 94*51fa3d41SBarry Smith - labels - optional label for each bar, NULL terminated array of strings 95*51fa3d41SBarry Smith 96*51fa3d41SBarry Smith Level: intermediate 97*51fa3d41SBarry Smith 98*51fa3d41SBarry Smith 99*51fa3d41SBarry Smith @*/ 100*51fa3d41SBarry Smith PetscErrorCode PetscDrawBarSetData(PetscDrawBar bar, PetscInt bins,const PetscReal data[],const char *const *labels) 101*51fa3d41SBarry Smith { 102*51fa3d41SBarry Smith PetscErrorCode ierr; 103*51fa3d41SBarry Smith 104*51fa3d41SBarry Smith PetscFunctionBegin; 105*51fa3d41SBarry Smith PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID,1); 106*51fa3d41SBarry Smith if (bar->numBins != bins) { 107*51fa3d41SBarry Smith ierr = PetscFree(bar->values);CHKERRQ(ierr); 108*51fa3d41SBarry Smith ierr = PetscMalloc1(bins, &bar->values);CHKERRQ(ierr); 109*51fa3d41SBarry Smith bar->numBins = bins; 110*51fa3d41SBarry Smith } 111*51fa3d41SBarry Smith ierr = PetscMemcpy(bar->values,data,bins*sizeof(PetscReal));CHKERRQ(ierr); 112*51fa3d41SBarry Smith bar->numBins = bins; 113*51fa3d41SBarry Smith if (labels) { 114*51fa3d41SBarry Smith ierr = PetscStrArrayallocpy(labels,&bar->labels);CHKERRQ(ierr); 115*51fa3d41SBarry Smith } 116*51fa3d41SBarry Smith PetscFunctionReturn(0); 117*51fa3d41SBarry Smith } 118*51fa3d41SBarry Smith 119*51fa3d41SBarry Smith #undef __FUNCT__ 120*51fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarDestroy" 121*51fa3d41SBarry Smith /*@C 122*51fa3d41SBarry Smith PetscDrawBarDestroy - Frees all space taken up by bar graph data structure. 123*51fa3d41SBarry Smith 124*51fa3d41SBarry Smith Collective over PetscDrawBar 125*51fa3d41SBarry Smith 126*51fa3d41SBarry Smith Input Parameter: 127*51fa3d41SBarry Smith . bar - The bar graph context 128*51fa3d41SBarry Smith 129*51fa3d41SBarry Smith Level: intermediate 130*51fa3d41SBarry Smith 131*51fa3d41SBarry Smith .seealso: PetscDrawBarCreate() 132*51fa3d41SBarry Smith @*/ 133*51fa3d41SBarry Smith PetscErrorCode PetscDrawBarDestroy(PetscDrawBar *bar) 134*51fa3d41SBarry Smith { 135*51fa3d41SBarry Smith PetscErrorCode ierr; 136*51fa3d41SBarry Smith 137*51fa3d41SBarry Smith PetscFunctionBegin; 138*51fa3d41SBarry Smith if (!*bar) PetscFunctionReturn(0); 139*51fa3d41SBarry Smith PetscValidHeader(*bar,1); 140*51fa3d41SBarry Smith 141*51fa3d41SBarry Smith if (--((PetscObject)(*bar))->refct > 0) PetscFunctionReturn(0); 142*51fa3d41SBarry Smith ierr = PetscDrawAxisDestroy(&(*bar)->axis);CHKERRQ(ierr); 143*51fa3d41SBarry Smith ierr = PetscDrawDestroy(&(*bar)->win);CHKERRQ(ierr); 144*51fa3d41SBarry Smith ierr = PetscFree((*bar)->values);CHKERRQ(ierr); 145*51fa3d41SBarry Smith ierr = PetscStrArrayDestroy(&(*bar)->labels);CHKERRQ(ierr); 146*51fa3d41SBarry Smith ierr = PetscHeaderDestroy(bar);CHKERRQ(ierr); 147*51fa3d41SBarry Smith PetscFunctionReturn(0); 148*51fa3d41SBarry Smith } 149*51fa3d41SBarry Smith 150*51fa3d41SBarry Smith #undef __FUNCT__ 151*51fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarDraw" 152*51fa3d41SBarry Smith /*@ 153*51fa3d41SBarry Smith PetscDrawBarDraw - Redraws a bar graph. 154*51fa3d41SBarry Smith 155*51fa3d41SBarry Smith Not Collective (ignored except on processor 0 of PetscDrawBar) 156*51fa3d41SBarry Smith 157*51fa3d41SBarry Smith Input Parameter: 158*51fa3d41SBarry Smith . bar - The bar graph context 159*51fa3d41SBarry Smith 160*51fa3d41SBarry Smith Level: intermediate 161*51fa3d41SBarry Smith 162*51fa3d41SBarry Smith @*/ 163*51fa3d41SBarry Smith PetscErrorCode PetscDrawBarDraw(PetscDrawBar bar) 164*51fa3d41SBarry Smith { 165*51fa3d41SBarry Smith PetscDraw draw = bar->win; 166*51fa3d41SBarry Smith PetscBool isnull; 167*51fa3d41SBarry Smith PetscReal xmin,xmax,ymin,ymax,*values,binLeft,binRight; 168*51fa3d41SBarry Smith PetscInt numValues,i,bcolor,color,idx,*perm,nplot; 169*51fa3d41SBarry Smith PetscErrorCode ierr; 170*51fa3d41SBarry Smith char **labels; 171*51fa3d41SBarry Smith 172*51fa3d41SBarry Smith PetscFunctionBegin; 173*51fa3d41SBarry Smith PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID,1); 174*51fa3d41SBarry Smith ierr = PetscObjectTypeCompare((PetscObject) draw, PETSC_DRAW_NULL, &isnull);CHKERRQ(ierr); 175*51fa3d41SBarry Smith if (isnull) PetscFunctionReturn(0); 176*51fa3d41SBarry Smith if (bar->numBins < 1) PetscFunctionReturn(0); 177*51fa3d41SBarry Smith 178*51fa3d41SBarry Smith color = bar->color; 179*51fa3d41SBarry Smith if (color == PETSC_DRAW_ROTATE) bcolor = 2; 180*51fa3d41SBarry Smith else bcolor = color; 181*51fa3d41SBarry Smith 182*51fa3d41SBarry Smith numValues = bar->numBins; 183*51fa3d41SBarry Smith values = bar->values; 184*51fa3d41SBarry Smith if (bar->ymin == bar->ymax) { 185*51fa3d41SBarry Smith /* user has not set bounds on bars so set them based on the data */ 186*51fa3d41SBarry Smith ymin = PETSC_MAX_REAL; 187*51fa3d41SBarry Smith ymax = PETSC_MIN_REAL; 188*51fa3d41SBarry Smith for (i=0; i<numValues; i++) { 189*51fa3d41SBarry Smith ymin = PetscMin(ymin,values[i]); 190*51fa3d41SBarry Smith ymax = PetscMax(ymax,values[i]); 191*51fa3d41SBarry Smith } 192*51fa3d41SBarry Smith } else { 193*51fa3d41SBarry Smith ymin = bar->ymin; 194*51fa3d41SBarry Smith ymax = bar->ymax; 195*51fa3d41SBarry Smith } 196*51fa3d41SBarry Smith nplot = numValues; /* number of points to actually plot; if some are lower than requested tolerance */ 197*51fa3d41SBarry Smith xmin = 0.0; 198*51fa3d41SBarry Smith labels = bar->labels; 199*51fa3d41SBarry Smith 200*51fa3d41SBarry Smith if (bar->sort) { 201*51fa3d41SBarry Smith ierr = PetscMalloc1(numValues,&perm);CHKERRQ(ierr); 202*51fa3d41SBarry Smith for (i=0; i<numValues;i++) perm[i] = i; 203*51fa3d41SBarry Smith ierr = PetscSortRealWithPermutation(numValues,values,perm);CHKERRQ(ierr); 204*51fa3d41SBarry Smith if (bar->sorttolerance) { 205*51fa3d41SBarry Smith for (i=0; i<numValues;i++) { 206*51fa3d41SBarry Smith if (values[perm[numValues - i - 1]] < bar->sorttolerance) { 207*51fa3d41SBarry Smith nplot = i; 208*51fa3d41SBarry Smith break; 209*51fa3d41SBarry Smith } 210*51fa3d41SBarry Smith } 211*51fa3d41SBarry Smith } 212*51fa3d41SBarry Smith } 213*51fa3d41SBarry Smith 214*51fa3d41SBarry Smith xmax = nplot; 215*51fa3d41SBarry Smith ierr = PetscDrawAxisSetLimits(bar->axis, xmin, xmax, ymin, ymax);CHKERRQ(ierr); 216*51fa3d41SBarry Smith ierr = PetscDrawClear(draw);CHKERRQ(ierr); 217*51fa3d41SBarry Smith ierr = PetscDrawAxisDraw(bar->axis);CHKERRQ(ierr); 218*51fa3d41SBarry Smith 219*51fa3d41SBarry Smith /* Draw bins */ 220*51fa3d41SBarry Smith for (i = 0; i < nplot; i++) { 221*51fa3d41SBarry Smith idx = (bar->sort ? perm[numValues - i - 1] : i); 222*51fa3d41SBarry Smith binLeft = xmin + i; 223*51fa3d41SBarry Smith binRight = xmin + i + 1; 224*51fa3d41SBarry Smith ierr = PetscDrawRectangle(draw,binLeft,ymin,binRight,values[idx],bcolor,bcolor,bcolor,bcolor);CHKERRQ(ierr); 225*51fa3d41SBarry Smith ierr = PetscDrawLine(draw,binLeft,ymin,binLeft,values[idx],PETSC_DRAW_BLACK);CHKERRQ(ierr); 226*51fa3d41SBarry Smith ierr = PetscDrawLine(draw,binRight,ymin,binRight,values[idx],PETSC_DRAW_BLACK);CHKERRQ(ierr); 227*51fa3d41SBarry Smith ierr = PetscDrawLine(draw,binLeft,values[idx],binRight,values[idx],PETSC_DRAW_BLACK);CHKERRQ(ierr); 228*51fa3d41SBarry Smith if (labels) { 229*51fa3d41SBarry Smith PetscReal h; 230*51fa3d41SBarry Smith ierr = PetscDrawStringGetSize(draw,NULL,&h);CHKERRQ(ierr); 231*51fa3d41SBarry Smith ierr = PetscDrawStringCentered(draw,.5*(binLeft+binRight),ymin - 1.2*h,bcolor,labels[idx]);CHKERRQ(ierr); 232*51fa3d41SBarry Smith } 233*51fa3d41SBarry Smith if (color == PETSC_DRAW_ROTATE) bcolor++; 234*51fa3d41SBarry Smith if (bcolor > 31) bcolor = 2; 235*51fa3d41SBarry Smith } 236*51fa3d41SBarry Smith if (bar->sort) { 237*51fa3d41SBarry Smith ierr = PetscFree(perm);CHKERRQ(ierr); 238*51fa3d41SBarry Smith } 239*51fa3d41SBarry Smith ierr = PetscDrawSynchronizedFlush(draw);CHKERRQ(ierr); 240*51fa3d41SBarry Smith ierr = PetscDrawPause(draw);CHKERRQ(ierr); 241*51fa3d41SBarry Smith PetscFunctionReturn(0); 242*51fa3d41SBarry Smith } 243*51fa3d41SBarry Smith 244*51fa3d41SBarry Smith #undef __FUNCT__ 245*51fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSetColor" 246*51fa3d41SBarry Smith /*@ 247*51fa3d41SBarry Smith PetscDrawBarSetColor - Sets the color the bars will be drawn with. 248*51fa3d41SBarry Smith 249*51fa3d41SBarry Smith Not Collective (ignored except on processor 0 of PetscDrawBar) 250*51fa3d41SBarry Smith 251*51fa3d41SBarry Smith Input Parameters: 252*51fa3d41SBarry Smith + bar - The bar graph context 253*51fa3d41SBarry Smith - color - one of the colors defined in petscdraw.h or PETSC_DRAW_ROTATE to make each bar a 254*51fa3d41SBarry Smith different color 255*51fa3d41SBarry Smith 256*51fa3d41SBarry Smith Level: intermediate 257*51fa3d41SBarry Smith 258*51fa3d41SBarry Smith @*/ 259*51fa3d41SBarry Smith PetscErrorCode PetscDrawBarSetColor(PetscDrawBar bar, int color) 260*51fa3d41SBarry Smith { 261*51fa3d41SBarry Smith PetscFunctionBegin; 262*51fa3d41SBarry Smith PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID,1); 263*51fa3d41SBarry Smith bar->color = color; 264*51fa3d41SBarry Smith PetscFunctionReturn(0); 265*51fa3d41SBarry Smith } 266*51fa3d41SBarry Smith 267*51fa3d41SBarry Smith #undef __FUNCT__ 268*51fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSort" 269*51fa3d41SBarry Smith /*@ 270*51fa3d41SBarry Smith PetscDrawBarSort - Sorts the values before drawing the bar chart 271*51fa3d41SBarry Smith 272*51fa3d41SBarry Smith Not Collective (ignored except on processor 0 of PetscDrawBar) 273*51fa3d41SBarry Smith 274*51fa3d41SBarry Smith Input Parameters: 275*51fa3d41SBarry Smith + bar - The bar graph context 276*51fa3d41SBarry Smith . sort - PETSC_TRUE to sort the values 277*51fa3d41SBarry Smith . tolerance - discard values less than tolerance 278*51fa3d41SBarry Smith 279*51fa3d41SBarry Smith Level: intermediate 280*51fa3d41SBarry Smith 281*51fa3d41SBarry Smith Concepts: bar graph^setting axis 282*51fa3d41SBarry Smith @*/ 283*51fa3d41SBarry Smith PetscErrorCode PetscDrawBarSort(PetscDrawBar bar, PetscBool sort, PetscReal tolerance) 284*51fa3d41SBarry Smith { 285*51fa3d41SBarry Smith PetscFunctionBegin; 286*51fa3d41SBarry Smith PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID,1); 287*51fa3d41SBarry Smith bar->sort = sort; 288*51fa3d41SBarry Smith bar->sorttolerance = tolerance; 289*51fa3d41SBarry Smith PetscFunctionReturn(0); 290*51fa3d41SBarry Smith } 291*51fa3d41SBarry Smith 292*51fa3d41SBarry Smith #undef __FUNCT__ 293*51fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSetLimits" 294*51fa3d41SBarry Smith /*@ 295*51fa3d41SBarry Smith PetscDrawBarSetLimits - Sets the axis limits for a bar graph. If more 296*51fa3d41SBarry Smith points are added after this call, the limits will be adjusted to 297*51fa3d41SBarry Smith include those additional points. 298*51fa3d41SBarry Smith 299*51fa3d41SBarry Smith Not Collective (ignored except on processor 0 of PetscDrawBar) 300*51fa3d41SBarry Smith 301*51fa3d41SBarry Smith Input Parameters: 302*51fa3d41SBarry Smith + bar - The bar graph context 303*51fa3d41SBarry Smith - y_min,y_max - The limits 304*51fa3d41SBarry Smith 305*51fa3d41SBarry Smith Level: intermediate 306*51fa3d41SBarry Smith 307*51fa3d41SBarry Smith Concepts: bar graph^setting axis 308*51fa3d41SBarry Smith @*/ 309*51fa3d41SBarry Smith PetscErrorCode PetscDrawBarSetLimits(PetscDrawBar bar, PetscReal y_min, PetscReal y_max) 310*51fa3d41SBarry Smith { 311*51fa3d41SBarry Smith PetscFunctionBegin; 312*51fa3d41SBarry Smith PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID,1); 313*51fa3d41SBarry Smith bar->ymin = y_min; 314*51fa3d41SBarry Smith bar->ymax = y_max; 315*51fa3d41SBarry Smith PetscFunctionReturn(0); 316*51fa3d41SBarry Smith } 317*51fa3d41SBarry Smith 318*51fa3d41SBarry Smith #undef __FUNCT__ 319*51fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarGetAxis" 320*51fa3d41SBarry Smith /*@C 321*51fa3d41SBarry Smith PetscDrawBarGetAxis - Gets the axis context associated with a bar graph. 322*51fa3d41SBarry Smith This is useful if one wants to change some axis property, such as 323*51fa3d41SBarry Smith labels, color, etc. The axis context should not be destroyed by the 324*51fa3d41SBarry Smith application code. 325*51fa3d41SBarry Smith 326*51fa3d41SBarry Smith Not Collective (ignored except on processor 0 of PetscDrawBar) 327*51fa3d41SBarry Smith 328*51fa3d41SBarry Smith Input Parameter: 329*51fa3d41SBarry Smith . bar - The bar graph context 330*51fa3d41SBarry Smith 331*51fa3d41SBarry Smith Output Parameter: 332*51fa3d41SBarry Smith . axis - The axis context 333*51fa3d41SBarry Smith 334*51fa3d41SBarry Smith Level: intermediate 335*51fa3d41SBarry Smith 336*51fa3d41SBarry Smith @*/ 337*51fa3d41SBarry Smith PetscErrorCode PetscDrawBarGetAxis(PetscDrawBar bar, PetscDrawAxis *axis) 338*51fa3d41SBarry Smith { 339*51fa3d41SBarry Smith PetscFunctionBegin; 340*51fa3d41SBarry Smith PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID,1); 341*51fa3d41SBarry Smith PetscValidPointer(axis,2); 342*51fa3d41SBarry Smith *axis = bar->axis; 343*51fa3d41SBarry Smith PetscFunctionReturn(0); 344*51fa3d41SBarry Smith } 345*51fa3d41SBarry Smith 346*51fa3d41SBarry Smith #undef __FUNCT__ 347*51fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarGetDraw" 348*51fa3d41SBarry Smith /*@C 349*51fa3d41SBarry Smith PetscDrawBarGetDraw - Gets the draw context associated with a bar graph. 350*51fa3d41SBarry Smith 351*51fa3d41SBarry Smith Not Collective, PetscDraw is parallel if PetscDrawBar is parallel 352*51fa3d41SBarry Smith 353*51fa3d41SBarry Smith Input Parameter: 354*51fa3d41SBarry Smith . bar - The bar graph context 355*51fa3d41SBarry Smith 356*51fa3d41SBarry Smith Output Parameter: 357*51fa3d41SBarry Smith . win - The draw context 358*51fa3d41SBarry Smith 359*51fa3d41SBarry Smith Level: intermediate 360*51fa3d41SBarry Smith 361*51fa3d41SBarry Smith @*/ 362*51fa3d41SBarry Smith PetscErrorCode PetscDrawBarGetDraw(PetscDrawBar bar, PetscDraw *win) 363*51fa3d41SBarry Smith { 364*51fa3d41SBarry Smith PetscFunctionBegin; 365*51fa3d41SBarry Smith PetscValidHeaderSpecific(bar, PETSC_DRAWBAR_CLASSID,1); 366*51fa3d41SBarry Smith PetscValidPointer(win,2); 367*51fa3d41SBarry Smith *win = bar->win; 368*51fa3d41SBarry Smith PetscFunctionReturn(0); 369*51fa3d41SBarry Smith } 370*51fa3d41SBarry Smith 371*51fa3d41SBarry Smith #undef __FUNCT__ 372*51fa3d41SBarry Smith #define __FUNCT__ "PetscDrawBarSetFromOptions" 373*51fa3d41SBarry Smith /*@ 374*51fa3d41SBarry Smith PetscDrawBarSetFromOptions - Sets options related to the PetscDrawBar 375*51fa3d41SBarry Smith 376*51fa3d41SBarry Smith Collective over PetscDrawBar 377*51fa3d41SBarry Smith 378*51fa3d41SBarry Smith Options Database: 379*51fa3d41SBarry Smith . -bar_sort - sort the entries before drawing the bar graph 380*51fa3d41SBarry Smith 381*51fa3d41SBarry Smith Level: intermediate 382*51fa3d41SBarry Smith 383*51fa3d41SBarry Smith 384*51fa3d41SBarry Smith .seealso: PetscDrawBarDestroy(), PetscDrawBarCreate() 385*51fa3d41SBarry Smith @*/ 386*51fa3d41SBarry Smith PetscErrorCode PetscDrawBarSetFromOptions(PetscDrawBar bar) 387*51fa3d41SBarry Smith { 388*51fa3d41SBarry Smith PetscErrorCode ierr; 389*51fa3d41SBarry Smith PetscBool set; 390*51fa3d41SBarry Smith PetscReal tol = bar->sorttolerance; 391*51fa3d41SBarry Smith 392*51fa3d41SBarry Smith PetscFunctionBegin; 393*51fa3d41SBarry Smith ierr = PetscOptionsHasName(NULL,"-bar_sort",&set);CHKERRQ(ierr); 394*51fa3d41SBarry Smith if (set) { 395*51fa3d41SBarry Smith ierr = PetscOptionsGetReal(NULL,"-bar_sort",&tol,NULL);CHKERRQ(ierr); 396*51fa3d41SBarry Smith ierr = PetscDrawBarSort(bar,PETSC_TRUE,tol);CHKERRQ(ierr); 397*51fa3d41SBarry Smith } 398*51fa3d41SBarry Smith PetscFunctionReturn(0); 399*51fa3d41SBarry Smith } 400*51fa3d41SBarry Smith 401