xref: /petsc/src/sys/classes/draw/utils/axisc.c (revision 5c6c1daec53e1d9ab0bec9db5309fd8fc7645b8d)
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