1*5c6c1daeSBarry Smith #include <../src/sys/classes/draw/utils/axisimpl.h> 2*5c6c1daeSBarry Smith 3*5c6c1daeSBarry Smith PetscClassId PETSC_DRAWAXIS_CLASSID = 0; 4*5c6c1daeSBarry Smith 5*5c6c1daeSBarry Smith #undef __FUNCT__ 6*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawAxisCreate" 7*5c6c1daeSBarry Smith /*@ 8*5c6c1daeSBarry Smith PetscDrawAxisCreate - Generate the axis data structure. 9*5c6c1daeSBarry Smith 10*5c6c1daeSBarry Smith Collective over PetscDraw 11*5c6c1daeSBarry Smith 12*5c6c1daeSBarry Smith Input Parameters: 13*5c6c1daeSBarry Smith . win - PetscDraw object where axis to to be made 14*5c6c1daeSBarry Smith 15*5c6c1daeSBarry Smith Ouput Parameters: 16*5c6c1daeSBarry Smith . axis - the axis datastructure 17*5c6c1daeSBarry Smith 18*5c6c1daeSBarry Smith Level: advanced 19*5c6c1daeSBarry Smith 20*5c6c1daeSBarry Smith @*/ 21*5c6c1daeSBarry Smith PetscErrorCode PetscDrawAxisCreate(PetscDraw draw,PetscDrawAxis *axis) 22*5c6c1daeSBarry Smith { 23*5c6c1daeSBarry Smith PetscDrawAxis ad; 24*5c6c1daeSBarry Smith PetscObject obj = (PetscObject)draw; 25*5c6c1daeSBarry Smith PetscErrorCode ierr; 26*5c6c1daeSBarry Smith PetscBool isnull; 27*5c6c1daeSBarry Smith 28*5c6c1daeSBarry Smith PetscFunctionBegin; 29*5c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 30*5c6c1daeSBarry Smith PetscValidPointer(axis,2); 31*5c6c1daeSBarry Smith ierr = PetscObjectTypeCompare(obj,PETSC_DRAW_NULL,&isnull);CHKERRQ(ierr); 32*5c6c1daeSBarry Smith if (isnull) { 33*5c6c1daeSBarry Smith ierr = PetscDrawOpenNull(((PetscObject)obj)->comm,(PetscDraw*)axis);CHKERRQ(ierr); 34*5c6c1daeSBarry Smith (*axis)->win = draw; 35*5c6c1daeSBarry Smith PetscFunctionReturn(0); 36*5c6c1daeSBarry Smith } 37*5c6c1daeSBarry Smith ierr = PetscHeaderCreate(ad,_p_PetscDrawAxis,int,PETSC_DRAWAXIS_CLASSID,0,"PetscDrawAxis","Draw Axis","Draw",((PetscObject)obj)->comm,PetscDrawAxisDestroy,0);CHKERRQ(ierr); 38*5c6c1daeSBarry Smith ierr = PetscLogObjectParent(draw,ad);CHKERRQ(ierr); 39*5c6c1daeSBarry Smith ad->xticks = PetscADefTicks; 40*5c6c1daeSBarry Smith ad->yticks = PetscADefTicks; 41*5c6c1daeSBarry Smith ad->xlabelstr = PetscADefLabel; 42*5c6c1daeSBarry Smith ad->ylabelstr = PetscADefLabel; 43*5c6c1daeSBarry Smith ad->win = draw; 44*5c6c1daeSBarry Smith ad->ac = PETSC_DRAW_BLACK; 45*5c6c1daeSBarry Smith ad->tc = PETSC_DRAW_BLACK; 46*5c6c1daeSBarry Smith ad->cc = PETSC_DRAW_BLACK; 47*5c6c1daeSBarry Smith ad->xlabel = 0; 48*5c6c1daeSBarry Smith ad->ylabel = 0; 49*5c6c1daeSBarry Smith ad->toplabel = 0; 50*5c6c1daeSBarry Smith 51*5c6c1daeSBarry Smith *axis = ad; 52*5c6c1daeSBarry Smith PetscFunctionReturn(0); 53*5c6c1daeSBarry Smith } 54*5c6c1daeSBarry Smith 55*5c6c1daeSBarry Smith #undef __FUNCT__ 56*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawAxisDestroy" 57*5c6c1daeSBarry Smith /*@ 58*5c6c1daeSBarry Smith PetscDrawAxisDestroy - Frees the space used by an axis structure. 59*5c6c1daeSBarry Smith 60*5c6c1daeSBarry Smith Collective over PetscDrawAxis 61*5c6c1daeSBarry Smith 62*5c6c1daeSBarry Smith Input Parameters: 63*5c6c1daeSBarry Smith . axis - the axis context 64*5c6c1daeSBarry Smith 65*5c6c1daeSBarry Smith Level: advanced 66*5c6c1daeSBarry Smith 67*5c6c1daeSBarry Smith @*/ 68*5c6c1daeSBarry Smith PetscErrorCode PetscDrawAxisDestroy(PetscDrawAxis *axis) 69*5c6c1daeSBarry Smith { 70*5c6c1daeSBarry Smith PetscErrorCode ierr; 71*5c6c1daeSBarry Smith 72*5c6c1daeSBarry Smith PetscFunctionBegin; 73*5c6c1daeSBarry Smith if (!*axis) PetscFunctionReturn(0); 74*5c6c1daeSBarry Smith if (--((PetscObject)(*axis))->refct > 0) PetscFunctionReturn(0); 75*5c6c1daeSBarry Smith 76*5c6c1daeSBarry Smith ierr = PetscFree((*axis)->toplabel);CHKERRQ(ierr); 77*5c6c1daeSBarry Smith ierr = PetscFree((*axis)->xlabel);CHKERRQ(ierr); 78*5c6c1daeSBarry Smith ierr = PetscFree((*axis)->ylabel);CHKERRQ(ierr); 79*5c6c1daeSBarry Smith ierr = PetscHeaderDestroy(axis);CHKERRQ(ierr); 80*5c6c1daeSBarry Smith PetscFunctionReturn(0); 81*5c6c1daeSBarry Smith } 82*5c6c1daeSBarry Smith 83*5c6c1daeSBarry Smith #undef __FUNCT__ 84*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawAxisSetColors" 85*5c6c1daeSBarry Smith /*@ 86*5c6c1daeSBarry Smith PetscDrawAxisSetColors - Sets the colors to be used for the axis, 87*5c6c1daeSBarry Smith tickmarks, and text. 88*5c6c1daeSBarry Smith 89*5c6c1daeSBarry Smith Not Collective (ignored on all processors except processor 0 of PetscDrawAxis) 90*5c6c1daeSBarry Smith 91*5c6c1daeSBarry Smith Input Parameters: 92*5c6c1daeSBarry Smith + axis - the axis 93*5c6c1daeSBarry Smith . ac - the color of the axis lines 94*5c6c1daeSBarry Smith . tc - the color of the tick marks 95*5c6c1daeSBarry Smith - cc - the color of the text strings 96*5c6c1daeSBarry Smith 97*5c6c1daeSBarry Smith Level: advanced 98*5c6c1daeSBarry Smith 99*5c6c1daeSBarry Smith @*/ 100*5c6c1daeSBarry Smith PetscErrorCode PetscDrawAxisSetColors(PetscDrawAxis axis,int ac,int tc,int cc) 101*5c6c1daeSBarry Smith { 102*5c6c1daeSBarry Smith PetscFunctionBegin; 103*5c6c1daeSBarry Smith if (!axis) PetscFunctionReturn(0); 104*5c6c1daeSBarry Smith axis->ac = ac; axis->tc = tc; axis->cc = cc; 105*5c6c1daeSBarry Smith PetscFunctionReturn(0); 106*5c6c1daeSBarry Smith } 107*5c6c1daeSBarry Smith 108*5c6c1daeSBarry Smith #undef __FUNCT__ 109*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawAxisSetLabels" 110*5c6c1daeSBarry Smith /*@C 111*5c6c1daeSBarry Smith PetscDrawAxisSetLabels - Sets the x and y axis labels. 112*5c6c1daeSBarry Smith 113*5c6c1daeSBarry Smith Not Collective (ignored on all processors except processor 0 of PetscDrawAxis) 114*5c6c1daeSBarry Smith 115*5c6c1daeSBarry Smith Input Parameters: 116*5c6c1daeSBarry Smith + axis - the axis 117*5c6c1daeSBarry Smith . top - the label at the top of the image 118*5c6c1daeSBarry Smith - xlabel,ylabel - the labes for the x and y axis 119*5c6c1daeSBarry Smith 120*5c6c1daeSBarry Smith Notes: Must be called before PetscDrawAxisDraw() or PetscDrawLGDraw() 121*5c6c1daeSBarry Smith There should be no newlines in the arguments 122*5c6c1daeSBarry Smith 123*5c6c1daeSBarry Smith Level: advanced 124*5c6c1daeSBarry Smith 125*5c6c1daeSBarry Smith @*/ 126*5c6c1daeSBarry Smith PetscErrorCode PetscDrawAxisSetLabels(PetscDrawAxis axis,const char top[],const char xlabel[],const char ylabel[]) 127*5c6c1daeSBarry Smith { 128*5c6c1daeSBarry Smith PetscErrorCode ierr; 129*5c6c1daeSBarry Smith 130*5c6c1daeSBarry Smith PetscFunctionBegin; 131*5c6c1daeSBarry Smith if (!axis) PetscFunctionReturn(0); 132*5c6c1daeSBarry Smith ierr = PetscFree(axis->xlabel);CHKERRQ(ierr); 133*5c6c1daeSBarry Smith ierr = PetscFree(axis->ylabel);CHKERRQ(ierr); 134*5c6c1daeSBarry Smith ierr = PetscFree(axis->toplabel);CHKERRQ(ierr); 135*5c6c1daeSBarry Smith ierr = PetscStrallocpy(xlabel,&axis->xlabel);CHKERRQ(ierr); 136*5c6c1daeSBarry Smith ierr = PetscStrallocpy(ylabel,&axis->ylabel);CHKERRQ(ierr); 137*5c6c1daeSBarry Smith ierr = PetscStrallocpy(top,&axis->toplabel);CHKERRQ(ierr); 138*5c6c1daeSBarry Smith PetscFunctionReturn(0); 139*5c6c1daeSBarry Smith } 140*5c6c1daeSBarry Smith 141*5c6c1daeSBarry Smith #undef __FUNCT__ 142*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawAxisSetHoldLimits" 143*5c6c1daeSBarry Smith /*@ 144*5c6c1daeSBarry Smith PetscDrawAxisSetHoldLimits - Causes an axis to keep the same limits until this is called 145*5c6c1daeSBarry Smith again 146*5c6c1daeSBarry Smith 147*5c6c1daeSBarry Smith Not Collective (ignored on all processors except processor 0 of PetscDrawAxis) 148*5c6c1daeSBarry Smith 149*5c6c1daeSBarry Smith Input Parameters: 150*5c6c1daeSBarry Smith + axis - the axis 151*5c6c1daeSBarry Smith - hold - PETSC_TRUE - hold current limits, PETSC_FALSE allow limits to be changed 152*5c6c1daeSBarry Smith 153*5c6c1daeSBarry Smith Level: advanced 154*5c6c1daeSBarry Smith 155*5c6c1daeSBarry Smith Notes: 156*5c6c1daeSBarry Smith Once this has been called with PETSC_TRUE the limits will not change if you call 157*5c6c1daeSBarry Smith PetscDrawAxisSetLimits() until you call this with PETSC_FALSE 158*5c6c1daeSBarry Smith 159*5c6c1daeSBarry Smith .seealso: PetscDrawAxisSetLimits() 160*5c6c1daeSBarry Smith 161*5c6c1daeSBarry Smith @*/ 162*5c6c1daeSBarry Smith PetscErrorCode PetscDrawAxisSetHoldLimits(PetscDrawAxis axis,PetscBool hold) 163*5c6c1daeSBarry Smith { 164*5c6c1daeSBarry Smith PetscFunctionBegin; 165*5c6c1daeSBarry Smith if (!axis) PetscFunctionReturn(0); 166*5c6c1daeSBarry Smith axis->hold = hold; 167*5c6c1daeSBarry Smith PetscFunctionReturn(0); 168*5c6c1daeSBarry Smith } 169*5c6c1daeSBarry Smith 170*5c6c1daeSBarry Smith #undef __FUNCT__ 171*5c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawAxisDraw" 172*5c6c1daeSBarry Smith /*@ 173*5c6c1daeSBarry Smith PetscDrawAxisDraw - PetscDraws an axis. 174*5c6c1daeSBarry Smith 175*5c6c1daeSBarry Smith Not Collective (ignored on all processors except processor 0 of PetscDrawAxis) 176*5c6c1daeSBarry Smith 177*5c6c1daeSBarry Smith Input Parameter: 178*5c6c1daeSBarry Smith . axis - Axis structure 179*5c6c1daeSBarry Smith 180*5c6c1daeSBarry Smith Level: advanced 181*5c6c1daeSBarry Smith 182*5c6c1daeSBarry Smith Note: 183*5c6c1daeSBarry Smith This draws the actual axis. The limits etc have already been set. 184*5c6c1daeSBarry Smith By picking special routines for the ticks and labels, special 185*5c6c1daeSBarry Smith effects may be generated. These routines are part of the Axis 186*5c6c1daeSBarry Smith structure (axis). 187*5c6c1daeSBarry Smith @*/ 188*5c6c1daeSBarry Smith PetscErrorCode PetscDrawAxisDraw(PetscDrawAxis axis) 189*5c6c1daeSBarry Smith { 190*5c6c1daeSBarry Smith int i,ntick,numx,numy,ac = axis->ac,tc = axis->tc,cc = axis->cc,rank; 191*5c6c1daeSBarry Smith size_t len; 192*5c6c1daeSBarry Smith PetscReal tickloc[MAXSEGS],sep,h,w,tw,th,xl,xr,yl,yr; 193*5c6c1daeSBarry Smith char *p; 194*5c6c1daeSBarry Smith PetscDraw draw = axis->win; 195*5c6c1daeSBarry Smith PetscErrorCode ierr; 196*5c6c1daeSBarry Smith 197*5c6c1daeSBarry Smith PetscFunctionBegin; 198*5c6c1daeSBarry Smith if (!axis) PetscFunctionReturn(0); 199*5c6c1daeSBarry Smith ierr = MPI_Comm_rank(((PetscObject)axis)->comm,&rank);CHKERRQ(ierr); 200*5c6c1daeSBarry Smith if (rank) PetscFunctionReturn(0); 201*5c6c1daeSBarry Smith 202*5c6c1daeSBarry Smith if (axis->xlow == axis->xhigh) {axis->xlow -= .5; axis->xhigh += .5;} 203*5c6c1daeSBarry Smith if (axis->ylow == axis->yhigh) {axis->ylow -= .5; axis->yhigh += .5;} 204*5c6c1daeSBarry Smith xl = axis->xlow; xr = axis->xhigh; yl = axis->ylow; yr = axis->yhigh; 205*5c6c1daeSBarry Smith ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr); 206*5c6c1daeSBarry Smith ierr = PetscDrawStringGetSize(draw,&tw,&th);CHKERRQ(ierr); 207*5c6c1daeSBarry Smith numx = (int)(.15*(xr-xl)/tw); if (numx > 6) numx = 6; if (numx< 2) numx = 2; 208*5c6c1daeSBarry Smith numy = (int)(.5*(yr-yl)/th); if (numy > 6) numy = 6; if (numy< 2) numy = 2; 209*5c6c1daeSBarry Smith xl -= 8*tw; xr += 2*tw; yl -= 2.5*th; yr += 2*th; 210*5c6c1daeSBarry Smith if (axis->xlabel) yl -= 2*th; 211*5c6c1daeSBarry Smith if (axis->ylabel) xl -= 2*tw; 212*5c6c1daeSBarry Smith ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr); 213*5c6c1daeSBarry Smith ierr = PetscDrawStringGetSize(draw,&tw,&th);CHKERRQ(ierr); 214*5c6c1daeSBarry Smith 215*5c6c1daeSBarry Smith ierr = PetscDrawLine(draw,axis->xlow,axis->ylow,axis->xhigh,axis->ylow,ac);CHKERRQ(ierr); 216*5c6c1daeSBarry Smith ierr = PetscDrawLine(draw,axis->xlow,axis->ylow,axis->xlow,axis->yhigh,ac);CHKERRQ(ierr); 217*5c6c1daeSBarry Smith 218*5c6c1daeSBarry Smith if (axis->toplabel) { 219*5c6c1daeSBarry Smith ierr = PetscStrlen(axis->toplabel,&len);CHKERRQ(ierr); 220*5c6c1daeSBarry Smith w = xl + .5*(xr - xl) - .5*len*tw; 221*5c6c1daeSBarry Smith h = axis->yhigh; 222*5c6c1daeSBarry Smith ierr = PetscDrawString(draw,w,h,cc,axis->toplabel);CHKERRQ(ierr); 223*5c6c1daeSBarry Smith } 224*5c6c1daeSBarry Smith 225*5c6c1daeSBarry Smith /* PetscDraw the ticks and labels */ 226*5c6c1daeSBarry Smith if (axis->xticks) { 227*5c6c1daeSBarry Smith ierr = (*axis->xticks)(axis->xlow,axis->xhigh,numx,&ntick,tickloc,MAXSEGS);CHKERRQ(ierr); 228*5c6c1daeSBarry Smith /* PetscDraw in tick marks */ 229*5c6c1daeSBarry Smith for (i=0; i<ntick; i++) { 230*5c6c1daeSBarry Smith ierr = PetscDrawLine(draw,tickloc[i],axis->ylow-.5*th,tickloc[i],axis->ylow+.5*th,tc);CHKERRQ(ierr); 231*5c6c1daeSBarry Smith } 232*5c6c1daeSBarry Smith /* label ticks */ 233*5c6c1daeSBarry Smith for (i=0; i<ntick; i++) { 234*5c6c1daeSBarry Smith if (axis->xlabelstr) { 235*5c6c1daeSBarry Smith if (i < ntick - 1) sep = tickloc[i+1] - tickloc[i]; 236*5c6c1daeSBarry Smith else if (i > 0) sep = tickloc[i] - tickloc[i-1]; 237*5c6c1daeSBarry Smith else sep = 0.0; 238*5c6c1daeSBarry Smith ierr = (*axis->xlabelstr)(tickloc[i],sep,&p);CHKERRQ(ierr); 239*5c6c1daeSBarry Smith ierr = PetscStrlen(p,&len);CHKERRQ(ierr); 240*5c6c1daeSBarry Smith w = .5*len*tw; 241*5c6c1daeSBarry Smith ierr = PetscDrawString(draw,tickloc[i]-w,axis->ylow-1.2*th,cc,p);CHKERRQ(ierr); 242*5c6c1daeSBarry Smith } 243*5c6c1daeSBarry Smith } 244*5c6c1daeSBarry Smith } 245*5c6c1daeSBarry Smith if (axis->xlabel) { 246*5c6c1daeSBarry Smith ierr = PetscStrlen(axis->xlabel,&len);CHKERRQ(ierr); 247*5c6c1daeSBarry Smith w = xl + .5*(xr - xl) - .5*len*tw; 248*5c6c1daeSBarry Smith h = axis->ylow - 2.5*th; 249*5c6c1daeSBarry Smith ierr = PetscDrawString(draw,w,h,cc,axis->xlabel);CHKERRQ(ierr); 250*5c6c1daeSBarry Smith } 251*5c6c1daeSBarry Smith if (axis->yticks) { 252*5c6c1daeSBarry Smith ierr = (*axis->yticks)(axis->ylow,axis->yhigh,numy,&ntick,tickloc,MAXSEGS);CHKERRQ(ierr); 253*5c6c1daeSBarry Smith /* PetscDraw in tick marks */ 254*5c6c1daeSBarry Smith for (i=0; i<ntick; i++) { 255*5c6c1daeSBarry Smith ierr = PetscDrawLine(draw,axis->xlow -.5*tw,tickloc[i],axis->xlow+.5*tw,tickloc[i],tc);CHKERRQ(ierr); 256*5c6c1daeSBarry Smith } 257*5c6c1daeSBarry Smith /* label ticks */ 258*5c6c1daeSBarry Smith for (i=0; i<ntick; i++) { 259*5c6c1daeSBarry Smith if (axis->ylabelstr) { 260*5c6c1daeSBarry Smith if (i < ntick - 1) sep = tickloc[i+1] - tickloc[i]; 261*5c6c1daeSBarry Smith else if (i > 0) sep = tickloc[i] - tickloc[i-1]; 262*5c6c1daeSBarry Smith else sep = 0.0; 263*5c6c1daeSBarry Smith ierr = (*axis->xlabelstr)(tickloc[i],sep,&p);CHKERRQ(ierr); 264*5c6c1daeSBarry Smith ierr = PetscStrlen(p,&len);CHKERRQ(ierr); 265*5c6c1daeSBarry Smith w = axis->xlow - len * tw - 1.2*tw; 266*5c6c1daeSBarry Smith ierr = PetscDrawString(draw,w,tickloc[i]-.5*th,cc,p);CHKERRQ(ierr); 267*5c6c1daeSBarry Smith } 268*5c6c1daeSBarry Smith } 269*5c6c1daeSBarry Smith } 270*5c6c1daeSBarry Smith if (axis->ylabel) { 271*5c6c1daeSBarry Smith ierr = PetscStrlen(axis->ylabel,&len);CHKERRQ(ierr); 272*5c6c1daeSBarry Smith h = yl + .5*(yr - yl) + .5*len*th; 273*5c6c1daeSBarry Smith w = xl + .5*tw; 274*5c6c1daeSBarry Smith ierr = PetscDrawStringVertical(draw,w,h,cc,axis->ylabel);CHKERRQ(ierr); 275*5c6c1daeSBarry Smith } 276*5c6c1daeSBarry Smith PetscFunctionReturn(0); 277*5c6c1daeSBarry Smith } 278*5c6c1daeSBarry Smith 279*5c6c1daeSBarry Smith #undef __FUNCT__ 280*5c6c1daeSBarry Smith #define __FUNCT__ "PetscStripAllZeros" 281*5c6c1daeSBarry Smith /* 282*5c6c1daeSBarry Smith Removes all zeros but one from .0000 283*5c6c1daeSBarry Smith */ 284*5c6c1daeSBarry Smith PetscErrorCode PetscStripAllZeros(char *buf) 285*5c6c1daeSBarry Smith { 286*5c6c1daeSBarry Smith PetscErrorCode ierr; 287*5c6c1daeSBarry Smith size_t i,n; 288*5c6c1daeSBarry Smith 289*5c6c1daeSBarry Smith PetscFunctionBegin; 290*5c6c1daeSBarry Smith ierr = PetscStrlen(buf,&n);CHKERRQ(ierr); 291*5c6c1daeSBarry Smith if (buf[0] != '.') PetscFunctionReturn(0); 292*5c6c1daeSBarry Smith for (i=1; i<n; i++) { 293*5c6c1daeSBarry Smith if (buf[i] != '0') PetscFunctionReturn(0); 294*5c6c1daeSBarry Smith } 295*5c6c1daeSBarry Smith buf[0] = '0'; 296*5c6c1daeSBarry Smith buf[1] = 0; 297*5c6c1daeSBarry Smith PetscFunctionReturn(0); 298*5c6c1daeSBarry Smith } 299*5c6c1daeSBarry Smith 300*5c6c1daeSBarry Smith #undef __FUNCT__ 301*5c6c1daeSBarry Smith #define __FUNCT__ "PetscStripTrailingZeros" 302*5c6c1daeSBarry Smith /* 303*5c6c1daeSBarry Smith Removes trailing zeros 304*5c6c1daeSBarry Smith */ 305*5c6c1daeSBarry Smith PetscErrorCode PetscStripTrailingZeros(char *buf) 306*5c6c1daeSBarry Smith { 307*5c6c1daeSBarry Smith PetscErrorCode ierr; 308*5c6c1daeSBarry Smith char *found; 309*5c6c1daeSBarry Smith size_t i,n,m = PETSC_MAX_INT; 310*5c6c1daeSBarry Smith 311*5c6c1daeSBarry Smith PetscFunctionBegin; 312*5c6c1daeSBarry Smith /* if there is an e in string DO NOT strip trailing zeros */ 313*5c6c1daeSBarry Smith ierr = PetscStrchr(buf,'e',&found);CHKERRQ(ierr); 314*5c6c1daeSBarry Smith if (found) PetscFunctionReturn(0); 315*5c6c1daeSBarry Smith 316*5c6c1daeSBarry Smith ierr = PetscStrlen(buf,&n);CHKERRQ(ierr); 317*5c6c1daeSBarry Smith /* locate decimal point */ 318*5c6c1daeSBarry Smith for (i=0; i<n; i++) { 319*5c6c1daeSBarry Smith if (buf[i] == '.') {m = i; break;} 320*5c6c1daeSBarry Smith } 321*5c6c1daeSBarry Smith /* if not decimal point then no zeros to remove */ 322*5c6c1daeSBarry Smith if (m == PETSC_MAX_INT) PetscFunctionReturn(0); 323*5c6c1daeSBarry Smith /* start at right end of string removing 0s */ 324*5c6c1daeSBarry Smith for (i=n-1; i>m; i++) { 325*5c6c1daeSBarry Smith if (buf[i] != '0') PetscFunctionReturn(0); 326*5c6c1daeSBarry Smith buf[i] = 0; 327*5c6c1daeSBarry Smith } 328*5c6c1daeSBarry Smith PetscFunctionReturn(0); 329*5c6c1daeSBarry Smith } 330*5c6c1daeSBarry Smith 331*5c6c1daeSBarry Smith #undef __FUNCT__ 332*5c6c1daeSBarry Smith #define __FUNCT__ "PetscStripInitialZero" 333*5c6c1daeSBarry Smith /* 334*5c6c1daeSBarry Smith Removes leading 0 from 0.22 or -0.22 335*5c6c1daeSBarry Smith */ 336*5c6c1daeSBarry Smith PetscErrorCode PetscStripInitialZero(char *buf) 337*5c6c1daeSBarry Smith { 338*5c6c1daeSBarry Smith PetscErrorCode ierr; 339*5c6c1daeSBarry Smith size_t i,n; 340*5c6c1daeSBarry Smith 341*5c6c1daeSBarry Smith PetscFunctionBegin; 342*5c6c1daeSBarry Smith ierr = PetscStrlen(buf,&n);CHKERRQ(ierr); 343*5c6c1daeSBarry Smith if (buf[0] == '0') { 344*5c6c1daeSBarry Smith for (i=0; i<n; i++) { 345*5c6c1daeSBarry Smith buf[i] = buf[i+1]; 346*5c6c1daeSBarry Smith } 347*5c6c1daeSBarry Smith } else if (buf[0] == '-' && buf[1] == '0') { 348*5c6c1daeSBarry Smith for (i=1; i<n; i++) { 349*5c6c1daeSBarry Smith buf[i] = buf[i+1]; 350*5c6c1daeSBarry Smith } 351*5c6c1daeSBarry Smith } 352*5c6c1daeSBarry Smith PetscFunctionReturn(0); 353*5c6c1daeSBarry Smith } 354*5c6c1daeSBarry Smith 355*5c6c1daeSBarry Smith #undef __FUNCT__ 356*5c6c1daeSBarry Smith #define __FUNCT__ "PetscStripZeros" 357*5c6c1daeSBarry Smith /* 358*5c6c1daeSBarry Smith Removes the extraneous zeros in numbers like 1.10000e6 359*5c6c1daeSBarry Smith */ 360*5c6c1daeSBarry Smith PetscErrorCode PetscStripZeros(char *buf) 361*5c6c1daeSBarry Smith { 362*5c6c1daeSBarry Smith PetscErrorCode ierr; 363*5c6c1daeSBarry Smith size_t i,j,n; 364*5c6c1daeSBarry Smith 365*5c6c1daeSBarry Smith PetscFunctionBegin; 366*5c6c1daeSBarry Smith ierr = PetscStrlen(buf,&n);CHKERRQ(ierr); 367*5c6c1daeSBarry Smith if (n<5) PetscFunctionReturn(0); 368*5c6c1daeSBarry Smith for (i=1; i<n-1; i++) { 369*5c6c1daeSBarry Smith if (buf[i] == 'e' && buf[i-1] == '0') { 370*5c6c1daeSBarry Smith for (j=i; j<n+1; j++) buf[j-1] = buf[j]; 371*5c6c1daeSBarry Smith ierr = PetscStripZeros(buf);CHKERRQ(ierr); 372*5c6c1daeSBarry Smith PetscFunctionReturn(0); 373*5c6c1daeSBarry Smith } 374*5c6c1daeSBarry Smith } 375*5c6c1daeSBarry Smith PetscFunctionReturn(0); 376*5c6c1daeSBarry Smith } 377*5c6c1daeSBarry Smith 378*5c6c1daeSBarry Smith #undef __FUNCT__ 379*5c6c1daeSBarry Smith #define __FUNCT__ "PetscStripZerosPlus" 380*5c6c1daeSBarry Smith /* 381*5c6c1daeSBarry Smith Removes the plus in something like 1.1e+2 or 1.1e+02 382*5c6c1daeSBarry Smith */ 383*5c6c1daeSBarry Smith PetscErrorCode PetscStripZerosPlus(char *buf) 384*5c6c1daeSBarry Smith { 385*5c6c1daeSBarry Smith PetscErrorCode ierr; 386*5c6c1daeSBarry Smith size_t i,j,n; 387*5c6c1daeSBarry Smith 388*5c6c1daeSBarry Smith PetscFunctionBegin; 389*5c6c1daeSBarry Smith ierr = PetscStrlen(buf,&n);CHKERRQ(ierr); 390*5c6c1daeSBarry Smith if (n<5) PetscFunctionReturn(0); 391*5c6c1daeSBarry Smith for (i=1; i<n-2; i++) { 392*5c6c1daeSBarry Smith if (buf[i] == '+') { 393*5c6c1daeSBarry Smith if (buf[i+1] == '0') { 394*5c6c1daeSBarry Smith for (j=i+1; j<n; j++) buf[j-1] = buf[j+1]; 395*5c6c1daeSBarry Smith PetscFunctionReturn(0); 396*5c6c1daeSBarry Smith } else { 397*5c6c1daeSBarry Smith for (j=i+1; j<n+1; j++) buf[j-1] = buf[j]; 398*5c6c1daeSBarry Smith PetscFunctionReturn(0); 399*5c6c1daeSBarry Smith } 400*5c6c1daeSBarry Smith } else if (buf[i] == '-') { 401*5c6c1daeSBarry Smith if (buf[i+1] == '0') { 402*5c6c1daeSBarry Smith for (j=i+1; j<n; j++) buf[j] = buf[j+1]; 403*5c6c1daeSBarry Smith PetscFunctionReturn(0); 404*5c6c1daeSBarry Smith } 405*5c6c1daeSBarry Smith } 406*5c6c1daeSBarry Smith } 407*5c6c1daeSBarry Smith PetscFunctionReturn(0); 408*5c6c1daeSBarry Smith } 409*5c6c1daeSBarry Smith 410*5c6c1daeSBarry Smith 411*5c6c1daeSBarry Smith 412*5c6c1daeSBarry Smith 413*5c6c1daeSBarry Smith 414*5c6c1daeSBarry Smith 415*5c6c1daeSBarry Smith 416