xref: /petsc/src/sys/classes/draw/utils/axisc.c (revision 7e25d57eb54699967dd470a5d26171ae4cb7a45d)
1834d085cSJed Brown #include <../src/sys/classes/draw/utils/axisimpl.h>  /*I   "petscdraw.h"  I*/
25c6c1daeSBarry Smith 
35c6c1daeSBarry Smith PetscClassId PETSC_DRAWAXIS_CLASSID = 0;
45c6c1daeSBarry Smith 
55c6c1daeSBarry Smith #undef __FUNCT__
65c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawAxisCreate"
75c6c1daeSBarry Smith /*@
85c6c1daeSBarry Smith    PetscDrawAxisCreate - Generate the axis data structure.
95c6c1daeSBarry Smith 
105b399a63SLisandro Dalcin    Collective on PetscDraw
115c6c1daeSBarry Smith 
125c6c1daeSBarry Smith    Input Parameters:
135c6c1daeSBarry Smith .  win - PetscDraw object where axis to to be made
145c6c1daeSBarry Smith 
155c6c1daeSBarry Smith    Ouput Parameters:
165c6c1daeSBarry Smith .  axis - the axis datastructure
175c6c1daeSBarry Smith 
18*7e25d57eSBarry Smith    Notes: the MPI communicator that owns the underlying draw object owns the PetscDrawAxis object, but calls to set PetscDrawAxis options are ignored by all processes
19*7e25d57eSBarry Smith           except the first MPI process in the communicator
20*7e25d57eSBarry Smith 
215c6c1daeSBarry Smith    Level: advanced
225c6c1daeSBarry Smith 
230afdd333SBarry Smith .seealso: PetscDrawLGCreate(), PetscDrawLG, PetscDrawSPCreate(), PetscDrawSP, PetscDrawHGCreate(), PetscDrawHG, PetscDrawBarCreate(), PetscDrawBar, PetscDrawLGGetAxis(), PetscDrawSPGetAxis(),
240afdd333SBarry Smith           PetscDrawHGGetAxis(), PetscDrawBarGetAxis(), PetscDrawAxis, PetscDrawAxisDestroy(), PetscDrawAxisSetColors(), PetscDrawAxisSetLabels(), PetscDrawAxisSetLimits(), PetscDrawAxisGetLimits(), PetscDrawAxisSetHoldLimits(),
250afdd333SBarry Smith           PetscDrawAxisDraw()
265c6c1daeSBarry Smith @*/
275c6c1daeSBarry Smith PetscErrorCode  PetscDrawAxisCreate(PetscDraw draw,PetscDrawAxis *axis)
285c6c1daeSBarry Smith {
29e118a51fSLisandro Dalcin   PetscDrawAxis  ad;
30e118a51fSLisandro Dalcin   PetscErrorCode ierr;
315c6c1daeSBarry Smith 
325c6c1daeSBarry Smith   PetscFunctionBegin;
335c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
345c6c1daeSBarry Smith   PetscValidPointer(axis,2);
35e118a51fSLisandro Dalcin 
3671917b75SLisandro Dalcin   ierr = PetscHeaderCreate(ad,PETSC_DRAWAXIS_CLASSID,"DrawAxis","Draw Axis","Draw",PetscObjectComm((PetscObject)draw),PetscDrawAxisDestroy,NULL);CHKERRQ(ierr);
373bb1ff40SBarry Smith   ierr = PetscLogObjectParent((PetscObject)draw,(PetscObject)ad);CHKERRQ(ierr);
38a297a907SKarl Rupp 
39e118a51fSLisandro Dalcin   ierr = PetscObjectReference((PetscObject)draw);CHKERRQ(ierr);
40e118a51fSLisandro Dalcin   ad->win = draw;
41e118a51fSLisandro Dalcin 
425c6c1daeSBarry Smith   ad->xticks    = PetscADefTicks;
435c6c1daeSBarry Smith   ad->yticks    = PetscADefTicks;
445c6c1daeSBarry Smith   ad->xlabelstr = PetscADefLabel;
455c6c1daeSBarry Smith   ad->ylabelstr = PetscADefLabel;
465c6c1daeSBarry Smith   ad->ac        = PETSC_DRAW_BLACK;
475c6c1daeSBarry Smith   ad->tc        = PETSC_DRAW_BLACK;
485c6c1daeSBarry Smith   ad->cc        = PETSC_DRAW_BLACK;
49e5ab1681SLisandro Dalcin   ad->xlabel    = NULL;
50e5ab1681SLisandro Dalcin   ad->ylabel    = NULL;
51e5ab1681SLisandro Dalcin   ad->toplabel  = NULL;
525c6c1daeSBarry Smith 
535c6c1daeSBarry Smith   *axis = ad;
545c6c1daeSBarry Smith   PetscFunctionReturn(0);
555c6c1daeSBarry Smith }
565c6c1daeSBarry Smith 
575c6c1daeSBarry Smith #undef __FUNCT__
585c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawAxisDestroy"
595c6c1daeSBarry Smith /*@
605c6c1daeSBarry Smith     PetscDrawAxisDestroy - Frees the space used by an axis structure.
615c6c1daeSBarry Smith 
625b399a63SLisandro Dalcin     Collective on PetscDrawAxis
635c6c1daeSBarry Smith 
645c6c1daeSBarry Smith     Input Parameters:
655c6c1daeSBarry Smith .   axis - the axis context
665c6c1daeSBarry Smith 
675c6c1daeSBarry Smith     Level: advanced
685c6c1daeSBarry Smith 
690afdd333SBarry Smith .seealso: PetscDrawAxisCreate(), PetscDrawAxis
705c6c1daeSBarry Smith @*/
715c6c1daeSBarry Smith PetscErrorCode  PetscDrawAxisDestroy(PetscDrawAxis *axis)
725c6c1daeSBarry Smith {
735c6c1daeSBarry Smith   PetscErrorCode ierr;
745c6c1daeSBarry Smith 
755c6c1daeSBarry Smith   PetscFunctionBegin;
765c6c1daeSBarry Smith   if (!*axis) PetscFunctionReturn(0);
77e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(*axis,PETSC_DRAWAXIS_CLASSID,1);
78e118a51fSLisandro Dalcin   if (--((PetscObject)(*axis))->refct > 0) {*axis = NULL; PetscFunctionReturn(0);}
795c6c1daeSBarry Smith 
805c6c1daeSBarry Smith   ierr = PetscFree((*axis)->toplabel);CHKERRQ(ierr);
815c6c1daeSBarry Smith   ierr = PetscFree((*axis)->xlabel);CHKERRQ(ierr);
825c6c1daeSBarry Smith   ierr = PetscFree((*axis)->ylabel);CHKERRQ(ierr);
83e118a51fSLisandro Dalcin   ierr = PetscDrawDestroy(&(*axis)->win);CHKERRQ(ierr);
845c6c1daeSBarry Smith   ierr = PetscHeaderDestroy(axis);CHKERRQ(ierr);
855c6c1daeSBarry Smith   PetscFunctionReturn(0);
865c6c1daeSBarry Smith }
875c6c1daeSBarry Smith 
885c6c1daeSBarry Smith #undef __FUNCT__
895c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawAxisSetColors"
905c6c1daeSBarry Smith /*@
915c6c1daeSBarry Smith     PetscDrawAxisSetColors -  Sets the colors to be used for the axis,
925c6c1daeSBarry Smith                          tickmarks, and text.
935c6c1daeSBarry Smith 
945b399a63SLisandro Dalcin     Logically Collective on PetscDrawAxis
955c6c1daeSBarry Smith 
965c6c1daeSBarry Smith     Input Parameters:
975c6c1daeSBarry Smith +   axis - the axis
985c6c1daeSBarry Smith .   ac - the color of the axis lines
995c6c1daeSBarry Smith .   tc - the color of the tick marks
1005c6c1daeSBarry Smith -   cc - the color of the text strings
1015c6c1daeSBarry Smith 
1025c6c1daeSBarry Smith     Level: advanced
1035c6c1daeSBarry Smith 
1040afdd333SBarry Smith .seealso: PetscDrawAxisCreate(), PetscDrawAxis, PetscDrawAxisSetLabels(), PetscDrawAxisDraw(), PetscDrawAxisSetLimits()
1055c6c1daeSBarry Smith @*/
1065c6c1daeSBarry Smith PetscErrorCode  PetscDrawAxisSetColors(PetscDrawAxis axis,int ac,int tc,int cc)
1075c6c1daeSBarry Smith {
1085c6c1daeSBarry Smith   PetscFunctionBegin;
109e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(axis,PETSC_DRAWAXIS_CLASSID,1);
1105b399a63SLisandro Dalcin   PetscValidLogicalCollectiveInt(axis,ac,2);
1115b399a63SLisandro Dalcin   PetscValidLogicalCollectiveInt(axis,tc,3);
1125b399a63SLisandro Dalcin   PetscValidLogicalCollectiveInt(axis,cc,4);
1135c6c1daeSBarry Smith   axis->ac = ac; axis->tc = tc; axis->cc = cc;
1145c6c1daeSBarry Smith   PetscFunctionReturn(0);
1155c6c1daeSBarry Smith }
1165c6c1daeSBarry Smith 
1175c6c1daeSBarry Smith #undef __FUNCT__
1185c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawAxisSetLabels"
1195c6c1daeSBarry Smith /*@C
1205c6c1daeSBarry Smith     PetscDrawAxisSetLabels -  Sets the x and y axis labels.
1215c6c1daeSBarry Smith 
1225b399a63SLisandro Dalcin     Logically Collective on PetscDrawAxis
1235c6c1daeSBarry Smith 
1245c6c1daeSBarry Smith     Input Parameters:
1255c6c1daeSBarry Smith +   axis - the axis
1265c6c1daeSBarry Smith .   top - the label at the top of the image
1275c6c1daeSBarry Smith -   xlabel,ylabel - the labes for the x and y axis
1285c6c1daeSBarry Smith 
1295c6c1daeSBarry Smith     Notes: Must be called before PetscDrawAxisDraw() or PetscDrawLGDraw()
1305c6c1daeSBarry Smith            There should be no newlines in the arguments
1315c6c1daeSBarry Smith 
1325c6c1daeSBarry Smith     Level: advanced
1335c6c1daeSBarry Smith 
1340afdd333SBarry Smith .seealso: PetscDrawAxisCreate(), PetscDrawAxis, PetscDrawAxisSetColors(), PetscDrawAxisDraw(), PetscDrawAxisSetLimits()
1355c6c1daeSBarry Smith @*/
1365c6c1daeSBarry Smith PetscErrorCode  PetscDrawAxisSetLabels(PetscDrawAxis axis,const char top[],const char xlabel[],const char ylabel[])
1375c6c1daeSBarry Smith {
1385c6c1daeSBarry Smith   PetscErrorCode ierr;
1395c6c1daeSBarry Smith 
1405c6c1daeSBarry Smith   PetscFunctionBegin;
141e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(axis,PETSC_DRAWAXIS_CLASSID,1);
1425c6c1daeSBarry Smith   ierr = PetscFree(axis->xlabel);CHKERRQ(ierr);
1435c6c1daeSBarry Smith   ierr = PetscFree(axis->ylabel);CHKERRQ(ierr);
1445c6c1daeSBarry Smith   ierr = PetscFree(axis->toplabel);CHKERRQ(ierr);
1455c6c1daeSBarry Smith   ierr = PetscStrallocpy(xlabel,&axis->xlabel);CHKERRQ(ierr);
1465c6c1daeSBarry Smith   ierr = PetscStrallocpy(ylabel,&axis->ylabel);CHKERRQ(ierr);
1475c6c1daeSBarry Smith   ierr = PetscStrallocpy(top,&axis->toplabel);CHKERRQ(ierr);
1485c6c1daeSBarry Smith   PetscFunctionReturn(0);
1495c6c1daeSBarry Smith }
1505c6c1daeSBarry Smith 
1515c6c1daeSBarry Smith #undef __FUNCT__
15271917b75SLisandro Dalcin #define __FUNCT__ "PetscDrawAxisSetLimits"
15371917b75SLisandro Dalcin /*@
15471917b75SLisandro Dalcin     PetscDrawAxisSetLimits -  Sets the limits (in user coords) of the axis
15571917b75SLisandro Dalcin 
15671917b75SLisandro Dalcin     Logically Collective on PetscDrawAxis
15771917b75SLisandro Dalcin 
15871917b75SLisandro Dalcin     Input Parameters:
15971917b75SLisandro Dalcin +   axis - the axis
16071917b75SLisandro Dalcin .   xmin,xmax - limits in x
16171917b75SLisandro Dalcin -   ymin,ymax - limits in y
16271917b75SLisandro Dalcin 
16371917b75SLisandro Dalcin     Options Database:
16471917b75SLisandro Dalcin .   -drawaxis_hold - hold the initial set of axis limits for future plotting
16571917b75SLisandro Dalcin 
16671917b75SLisandro Dalcin     Level: advanced
16771917b75SLisandro Dalcin 
1680afdd333SBarry Smith .seealso:  PetscDrawAxisSetHoldLimits(), PetscDrawAxisGetLimits(), PetscDrawAxisSetLabels(), PetscDrawAxisSetColors()
16971917b75SLisandro Dalcin 
17071917b75SLisandro Dalcin @*/
17171917b75SLisandro Dalcin PetscErrorCode  PetscDrawAxisSetLimits(PetscDrawAxis axis,PetscReal xmin,PetscReal xmax,PetscReal ymin,PetscReal ymax)
17271917b75SLisandro Dalcin {
17371917b75SLisandro Dalcin   PetscErrorCode ierr;
17471917b75SLisandro Dalcin 
17571917b75SLisandro Dalcin   PetscFunctionBegin;
17671917b75SLisandro Dalcin   PetscValidHeaderSpecific(axis,PETSC_DRAWAXIS_CLASSID,1);
17771917b75SLisandro Dalcin   if (axis->hold) PetscFunctionReturn(0);
17871917b75SLisandro Dalcin   axis->xlow = xmin;
17971917b75SLisandro Dalcin   axis->xhigh= xmax;
18071917b75SLisandro Dalcin   axis->ylow = ymin;
18171917b75SLisandro Dalcin   axis->yhigh= ymax;
18271917b75SLisandro Dalcin   ierr = PetscOptionsHasName(((PetscObject)axis)->options,((PetscObject)axis)->prefix,"-drawaxis_hold",&axis->hold);CHKERRQ(ierr);
18371917b75SLisandro Dalcin   PetscFunctionReturn(0);
18471917b75SLisandro Dalcin }
18571917b75SLisandro Dalcin 
18671917b75SLisandro Dalcin #undef __FUNCT__
18771917b75SLisandro Dalcin #define __FUNCT__ "PetscDrawAxisGetLimits"
18871917b75SLisandro Dalcin /*@
18971917b75SLisandro Dalcin     PetscDrawAxisGetLimits -  Gets the limits (in user coords) of the axis
19071917b75SLisandro Dalcin 
19171917b75SLisandro Dalcin     Not Collective
19271917b75SLisandro Dalcin 
19371917b75SLisandro Dalcin     Input Parameters:
19471917b75SLisandro Dalcin +   axis - the axis
19571917b75SLisandro Dalcin .   xmin,xmax - limits in x
19671917b75SLisandro Dalcin -   ymin,ymax - limits in y
19771917b75SLisandro Dalcin 
19871917b75SLisandro Dalcin     Level: advanced
19971917b75SLisandro Dalcin 
2000afdd333SBarry Smith .seealso:  PetscDrawAxisCreate(), PetscDrawAxis, PetscDrawAxisSetHoldLimits(), PetscDrawAxisSetLimits(), PetscDrawAxisSetLabels(), PetscDrawAxisSetColors()
20171917b75SLisandro Dalcin 
20271917b75SLisandro Dalcin @*/
20371917b75SLisandro Dalcin PetscErrorCode  PetscDrawAxisGetLimits(PetscDrawAxis axis,PetscReal *xmin,PetscReal *xmax,PetscReal *ymin,PetscReal *ymax)
20471917b75SLisandro Dalcin {
20571917b75SLisandro Dalcin   PetscFunctionBegin;
20671917b75SLisandro Dalcin   PetscValidHeaderSpecific(axis,PETSC_DRAWAXIS_CLASSID,1);
20771917b75SLisandro Dalcin   *xmin = axis->xlow;
20871917b75SLisandro Dalcin   *xmax = axis->xhigh;
20971917b75SLisandro Dalcin   *ymin = axis->ylow;
21071917b75SLisandro Dalcin   *ymax = axis->yhigh;
21171917b75SLisandro Dalcin   PetscFunctionReturn(0);
21271917b75SLisandro Dalcin }
21371917b75SLisandro Dalcin 
21471917b75SLisandro Dalcin #undef __FUNCT__
2155c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawAxisSetHoldLimits"
2165c6c1daeSBarry Smith /*@
2175c6c1daeSBarry Smith     PetscDrawAxisSetHoldLimits -  Causes an axis to keep the same limits until this is called
2185c6c1daeSBarry Smith         again
2195c6c1daeSBarry Smith 
2205b399a63SLisandro Dalcin     Logically Collective on PetscDrawAxis
2215c6c1daeSBarry Smith 
2225c6c1daeSBarry Smith     Input Parameters:
2235c6c1daeSBarry Smith +   axis - the axis
2245c6c1daeSBarry Smith -   hold - PETSC_TRUE - hold current limits, PETSC_FALSE allow limits to be changed
2255c6c1daeSBarry Smith 
2265c6c1daeSBarry Smith     Level: advanced
2275c6c1daeSBarry Smith 
2285c6c1daeSBarry Smith     Notes:
2295c6c1daeSBarry Smith         Once this has been called with PETSC_TRUE the limits will not change if you call
2305c6c1daeSBarry Smith      PetscDrawAxisSetLimits() until you call this with PETSC_FALSE
2315c6c1daeSBarry Smith 
2320afdd333SBarry Smith .seealso:  PetscDrawAxisCreate(), PetscDrawAxis, PetscDrawAxisGetLimits(), PetscDrawAxisSetLimits(), PetscDrawAxisSetLabels(), PetscDrawAxisSetColors()
2335c6c1daeSBarry Smith 
2345c6c1daeSBarry Smith @*/
2355c6c1daeSBarry Smith PetscErrorCode  PetscDrawAxisSetHoldLimits(PetscDrawAxis axis,PetscBool hold)
2365c6c1daeSBarry Smith {
2375c6c1daeSBarry Smith   PetscFunctionBegin;
238e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(axis,PETSC_DRAWAXIS_CLASSID,1);
2395b399a63SLisandro Dalcin   PetscValidLogicalCollectiveBool(axis,hold,2);
2405c6c1daeSBarry Smith   axis->hold = hold;
2415c6c1daeSBarry Smith   PetscFunctionReturn(0);
2425c6c1daeSBarry Smith }
2435c6c1daeSBarry Smith 
2445c6c1daeSBarry Smith #undef __FUNCT__
2455c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawAxisDraw"
2465c6c1daeSBarry Smith /*@
2475c6c1daeSBarry Smith     PetscDrawAxisDraw - PetscDraws an axis.
2485c6c1daeSBarry Smith 
2495b399a63SLisandro Dalcin     Collective on PetscDrawAxis
2505c6c1daeSBarry Smith 
2515c6c1daeSBarry Smith     Input Parameter:
2525c6c1daeSBarry Smith .   axis - Axis structure
2535c6c1daeSBarry Smith 
2545c6c1daeSBarry Smith     Level: advanced
2555c6c1daeSBarry Smith 
2565c6c1daeSBarry Smith     Note:
2575c6c1daeSBarry Smith     This draws the actual axis.  The limits etc have already been set.
2585c6c1daeSBarry Smith     By picking special routines for the ticks and labels, special
2595c6c1daeSBarry Smith     effects may be generated.  These routines are part of the Axis
2605c6c1daeSBarry Smith     structure (axis).
2610afdd333SBarry Smith 
2620afdd333SBarry Smith .seealso:  PetscDrawAxisCreate(), PetscDrawAxis, PetscDrawAxisGetLimits(), PetscDrawAxisSetLimits(), PetscDrawAxisSetLabels(), PetscDrawAxisSetColors()
2630afdd333SBarry Smith 
2645c6c1daeSBarry Smith @*/
2655c6c1daeSBarry Smith PetscErrorCode  PetscDrawAxisDraw(PetscDrawAxis axis)
2665c6c1daeSBarry Smith {
267e118a51fSLisandro Dalcin   int            i,ntick,numx,numy,ac,tc,cc;
268e118a51fSLisandro Dalcin   PetscMPIInt    rank;
26971917b75SLisandro Dalcin   size_t         len,ytlen=0;
27071917b75SLisandro Dalcin   PetscReal      coors[4],tickloc[MAXSEGS],sep,tw,th;
27171917b75SLisandro Dalcin   PetscReal      xl,xr,yl,yr,dxl=0,dyl=0,dxr=0,dyr=0;
2725c6c1daeSBarry Smith   char           *p;
273e118a51fSLisandro Dalcin   PetscDraw      draw;
274e118a51fSLisandro Dalcin   PetscBool      isnull;
2755c6c1daeSBarry Smith   PetscErrorCode ierr;
2765c6c1daeSBarry Smith 
2775c6c1daeSBarry Smith   PetscFunctionBegin;
278e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(axis,PETSC_DRAWAXIS_CLASSID,1);
2798f69470aSLisandro Dalcin   ierr = PetscDrawIsNull(axis->win,&isnull);CHKERRQ(ierr);
280e118a51fSLisandro Dalcin   if (isnull) PetscFunctionReturn(0);
281ce94432eSBarry Smith   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)axis),&rank);CHKERRQ(ierr);
2825c6c1daeSBarry Smith 
2838f69470aSLisandro Dalcin   draw = axis->win;
2845b399a63SLisandro Dalcin 
285e118a51fSLisandro Dalcin   ac = axis->ac; tc = axis->tc; cc = axis->cc;
2865c6c1daeSBarry Smith   if (axis->xlow == axis->xhigh) {axis->xlow -= .5; axis->xhigh += .5;}
2877b8d257dSBarry Smith   if (axis->ylow == axis->yhigh) {axis->ylow -= .5; axis->yhigh += .5;}
288e118a51fSLisandro Dalcin 
28971917b75SLisandro Dalcin   ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
29071917b75SLisandro Dalcin   if (rank) goto finally;
29171917b75SLisandro Dalcin 
29271917b75SLisandro Dalcin   /* get cannonical string size */
29371917b75SLisandro Dalcin   ierr = PetscDrawSetCoordinates(draw,0,0,1,1);CHKERRQ(ierr);
2945c6c1daeSBarry Smith   ierr = PetscDrawStringGetSize(draw,&tw,&th);CHKERRQ(ierr);
29571917b75SLisandro Dalcin   /* lower spacing */
29671917b75SLisandro Dalcin   if (axis->xlabelstr) dyl += 1.5*th;
29771917b75SLisandro Dalcin   if (axis->xlabel)    dyl += 1.5*th;
29871917b75SLisandro Dalcin   /* left spacing */
29971917b75SLisandro Dalcin   if (axis->ylabelstr) dxl += 7.5*tw;
30071917b75SLisandro Dalcin   if (axis->ylabel)    dxl += 2.0*tw;
30171917b75SLisandro Dalcin   /* right and top spacing */
30271917b75SLisandro Dalcin   if (axis->xlabelstr) dxr = 2.5*tw;
30371917b75SLisandro Dalcin   if (axis->ylabelstr) dyr = 0.5*th;
30471917b75SLisandro Dalcin   if (axis->toplabel)  dyr = 1.5*th;
30571917b75SLisandro Dalcin   /* extra spacing */
30671917b75SLisandro Dalcin   dxl += 0.7*tw; dxr += 0.5*tw;
30771917b75SLisandro Dalcin   dyl += 0.2*th; dyr += 0.2*th;
30871917b75SLisandro Dalcin   /* determine coordinates */
30971917b75SLisandro Dalcin   xl = (dxl*axis->xhigh + dxr*axis->xlow - axis->xlow)  / (dxl + dxr - 1);
31071917b75SLisandro Dalcin   xr = (dxl*axis->xhigh + dxr*axis->xlow - axis->xhigh) / (dxl + dxr - 1);
31171917b75SLisandro Dalcin   yl = (dyl*axis->yhigh + dyr*axis->ylow - axis->ylow)  / (dyl + dyr - 1);
31271917b75SLisandro Dalcin   yr = (dyl*axis->yhigh + dyr*axis->ylow - axis->yhigh) / (dyl + dyr - 1);
3135c6c1daeSBarry Smith   ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr);
3145c6c1daeSBarry Smith   ierr = PetscDrawStringGetSize(draw,&tw,&th);CHKERRQ(ierr);
3155c6c1daeSBarry Smith 
31671917b75SLisandro Dalcin   /* PetscDraw the axis lines */
3175c6c1daeSBarry Smith   ierr = PetscDrawLine(draw,axis->xlow,axis->ylow,axis->xhigh,axis->ylow,ac);CHKERRQ(ierr);
3185c6c1daeSBarry Smith   ierr = PetscDrawLine(draw,axis->xlow,axis->ylow,axis->xlow,axis->yhigh,ac);CHKERRQ(ierr);
31971917b75SLisandro Dalcin   ierr = PetscDrawLine(draw,axis->xlow,axis->yhigh,axis->xhigh,axis->yhigh,ac);CHKERRQ(ierr);
32071917b75SLisandro Dalcin   ierr = PetscDrawLine(draw,axis->xhigh,axis->ylow,axis->xhigh,axis->yhigh,ac);CHKERRQ(ierr);
3215c6c1daeSBarry Smith 
32271917b75SLisandro Dalcin   /* PetscDraw the top label */
3235c6c1daeSBarry Smith   if (axis->toplabel) {
32471917b75SLisandro Dalcin     PetscReal x = (axis->xlow + axis->xhigh)/2, y = axis->yhigh + 0.5*th;
32571917b75SLisandro Dalcin     ierr = PetscDrawStringCentered(draw,x,y,cc,axis->toplabel);CHKERRQ(ierr);
3265c6c1daeSBarry Smith   }
3275c6c1daeSBarry Smith 
32871917b75SLisandro Dalcin   /* PetscDraw the X ticks and labels */
3295c6c1daeSBarry Smith   if (axis->xticks) {
33071917b75SLisandro Dalcin     numx = (int)(.15*(axis->xhigh-axis->xlow)/tw); numx = PetscClipInterval(numx,2,6);
3315c6c1daeSBarry Smith     ierr = (*axis->xticks)(axis->xlow,axis->xhigh,numx,&ntick,tickloc,MAXSEGS);CHKERRQ(ierr);
3325c6c1daeSBarry Smith     /* PetscDraw in tick marks */
3335c6c1daeSBarry Smith     for (i=0; i<ntick; i++) {
33471917b75SLisandro Dalcin       ierr = PetscDrawLine(draw,tickloc[i],axis->ylow,tickloc[i],axis->ylow+.5*th,tc);CHKERRQ(ierr);
33571917b75SLisandro Dalcin       ierr = PetscDrawLine(draw,tickloc[i],axis->yhigh,tickloc[i],axis->yhigh-.5*th,tc);CHKERRQ(ierr);
3365c6c1daeSBarry Smith     }
3375c6c1daeSBarry Smith     /* label ticks */
3385c6c1daeSBarry Smith     if (axis->xlabelstr) {
33971917b75SLisandro Dalcin       for (i=0; i<ntick; i++) {
3405c6c1daeSBarry Smith         if (i < ntick - 1) sep = tickloc[i+1] - tickloc[i];
3415c6c1daeSBarry Smith         else if (i > 0)    sep = tickloc[i]   - tickloc[i-1];
3425c6c1daeSBarry Smith         else               sep = 0.0;
3435c6c1daeSBarry Smith         ierr = (*axis->xlabelstr)(tickloc[i],sep,&p);CHKERRQ(ierr);
34471917b75SLisandro Dalcin         ierr = PetscDrawStringCentered(draw,tickloc[i],axis->ylow-1.5*th,cc,p);CHKERRQ(ierr);
3455c6c1daeSBarry Smith       }
3465c6c1daeSBarry Smith     }
3475c6c1daeSBarry Smith   }
3485c6c1daeSBarry Smith   if (axis->xlabel) {
34971917b75SLisandro Dalcin     PetscReal x = (axis->xlow + axis->xhigh)/2, y = axis->ylow - 1.5*th;
35071917b75SLisandro Dalcin     if (axis->xlabelstr) y -= 1.5*th;
35171917b75SLisandro Dalcin     ierr = PetscDrawStringCentered(draw,x,y,cc,axis->xlabel);CHKERRQ(ierr);
3525c6c1daeSBarry Smith   }
35371917b75SLisandro Dalcin 
35471917b75SLisandro Dalcin   /* PetscDraw the Y ticks and labels */
3555c6c1daeSBarry Smith   if (axis->yticks) {
35671917b75SLisandro Dalcin     numy = (int)(.50*(axis->yhigh-axis->ylow)/th); numy = PetscClipInterval(numy,2,6);
3575c6c1daeSBarry Smith     ierr = (*axis->yticks)(axis->ylow,axis->yhigh,numy,&ntick,tickloc,MAXSEGS);CHKERRQ(ierr);
3585c6c1daeSBarry Smith     /* PetscDraw in tick marks */
3595c6c1daeSBarry Smith     for (i=0; i<ntick; i++) {
36071917b75SLisandro Dalcin       ierr = PetscDrawLine(draw,axis->xlow,tickloc[i],axis->xlow+.5*tw,tickloc[i],tc);CHKERRQ(ierr);
36171917b75SLisandro Dalcin       ierr = PetscDrawLine(draw,axis->xhigh,tickloc[i],axis->xhigh-.5*tw,tickloc[i],tc);CHKERRQ(ierr);
3625c6c1daeSBarry Smith     }
3635c6c1daeSBarry Smith     /* label ticks */
3645c6c1daeSBarry Smith     if (axis->ylabelstr) {
36571917b75SLisandro Dalcin       for (i=0; i<ntick; i++) {
3665c6c1daeSBarry Smith         if (i < ntick - 1) sep = tickloc[i+1] - tickloc[i];
3675c6c1daeSBarry Smith         else if (i > 0)    sep = tickloc[i]   - tickloc[i-1];
3685c6c1daeSBarry Smith         else               sep = 0.0;
36971917b75SLisandro Dalcin         ierr = (*axis->ylabelstr)(tickloc[i],sep,&p);CHKERRQ(ierr);
37071917b75SLisandro Dalcin         ierr = PetscStrlen(p,&len);CHKERRQ(ierr); ytlen = PetscMax(ytlen,len);
37171917b75SLisandro Dalcin         ierr = PetscDrawString(draw,axis->xlow-(len+.5)*tw,tickloc[i]-.5*th,cc,p);CHKERRQ(ierr);
3725c6c1daeSBarry Smith       }
3735c6c1daeSBarry Smith     }
3745c6c1daeSBarry Smith   }
3755c6c1daeSBarry Smith   if (axis->ylabel) {
37671917b75SLisandro Dalcin     PetscReal x = axis->xlow - 2.0*tw, y = (axis->ylow + axis->yhigh)/2;
37771917b75SLisandro Dalcin     if (axis->ylabelstr) x -= (ytlen+.5)*tw;
3785c6c1daeSBarry Smith     ierr = PetscStrlen(axis->ylabel,&len);CHKERRQ(ierr);
37971917b75SLisandro Dalcin     ierr = PetscDrawStringVertical(draw,x,y+len*th/2,cc,axis->ylabel);CHKERRQ(ierr);
3805c6c1daeSBarry Smith   }
3815b399a63SLisandro Dalcin 
3825b399a63SLisandro Dalcin   ierr = PetscDrawGetCoordinates(draw,&coors[0],&coors[1],&coors[2],&coors[3]);CHKERRQ(ierr);
3835b399a63SLisandro Dalcin finally:
3845b399a63SLisandro Dalcin   ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
3855b399a63SLisandro Dalcin   ierr = MPI_Bcast(coors,4,MPIU_REAL,0,PetscObjectComm((PetscObject)draw));CHKERRQ(ierr);
3865b399a63SLisandro Dalcin   ierr = PetscDrawSetCoordinates(draw,coors[0],coors[1],coors[2],coors[3]);CHKERRQ(ierr);
3875c6c1daeSBarry Smith   PetscFunctionReturn(0);
3885c6c1daeSBarry Smith }
3895c6c1daeSBarry Smith 
3905c6c1daeSBarry Smith #undef __FUNCT__
39136c9bc0dSBarry Smith #define __FUNCT__ "PetscStripe0"
39236c9bc0dSBarry Smith /*
39336c9bc0dSBarry Smith     Removes all zeros but one from .0000
39436c9bc0dSBarry Smith */
39536c9bc0dSBarry Smith PetscErrorCode PetscStripe0(char *buf)
39636c9bc0dSBarry Smith {
39736c9bc0dSBarry Smith   PetscErrorCode ierr;
39836c9bc0dSBarry Smith   size_t         n;
39936c9bc0dSBarry Smith   PetscBool      flg;
40036c9bc0dSBarry Smith   char           *str;
40136c9bc0dSBarry Smith 
40236c9bc0dSBarry Smith   PetscFunctionBegin;
40336c9bc0dSBarry Smith   ierr = PetscStrlen(buf,&n);CHKERRQ(ierr);
40436c9bc0dSBarry Smith   ierr = PetscStrendswith(buf,"e00",&flg);CHKERRQ(ierr);
405a297a907SKarl Rupp   if (flg) buf[n-3] = 0;
40636c9bc0dSBarry Smith   ierr = PetscStrstr(buf,"e0",&str);CHKERRQ(ierr);
40736c9bc0dSBarry Smith   if (str) {
40836c9bc0dSBarry Smith     buf[n-2] = buf[n-1];
40936c9bc0dSBarry Smith     buf[n-1] = 0;
41036c9bc0dSBarry Smith   }
41136c9bc0dSBarry Smith   ierr = PetscStrstr(buf,"e-0",&str);CHKERRQ(ierr);
41236c9bc0dSBarry Smith   if (str) {
41336c9bc0dSBarry Smith     buf[n-2] = buf[n-1];
41436c9bc0dSBarry Smith     buf[n-1] = 0;
41536c9bc0dSBarry Smith   }
41636c9bc0dSBarry Smith   PetscFunctionReturn(0);
41736c9bc0dSBarry Smith }
41836c9bc0dSBarry Smith 
41936c9bc0dSBarry Smith #undef __FUNCT__
4205c6c1daeSBarry Smith #define __FUNCT__ "PetscStripAllZeros"
4215c6c1daeSBarry Smith /*
4225c6c1daeSBarry Smith     Removes all zeros but one from .0000
4235c6c1daeSBarry Smith */
4245c6c1daeSBarry Smith PetscErrorCode PetscStripAllZeros(char *buf)
4255c6c1daeSBarry Smith {
4265c6c1daeSBarry Smith   PetscErrorCode ierr;
4275c6c1daeSBarry Smith   size_t         i,n;
4285c6c1daeSBarry Smith 
4295c6c1daeSBarry Smith   PetscFunctionBegin;
4305c6c1daeSBarry Smith   ierr = PetscStrlen(buf,&n);CHKERRQ(ierr);
4315c6c1daeSBarry Smith   if (buf[0] != '.') PetscFunctionReturn(0);
4325c6c1daeSBarry Smith   for (i=1; i<n; i++) {
4335c6c1daeSBarry Smith     if (buf[i] != '0') PetscFunctionReturn(0);
4345c6c1daeSBarry Smith   }
4355c6c1daeSBarry Smith   buf[0] = '0';
4365c6c1daeSBarry Smith   buf[1] = 0;
4375c6c1daeSBarry Smith   PetscFunctionReturn(0);
4385c6c1daeSBarry Smith }
4395c6c1daeSBarry Smith 
4405c6c1daeSBarry Smith #undef __FUNCT__
4415c6c1daeSBarry Smith #define __FUNCT__ "PetscStripTrailingZeros"
4425c6c1daeSBarry Smith /*
4435c6c1daeSBarry Smith     Removes trailing zeros
4445c6c1daeSBarry Smith */
4455c6c1daeSBarry Smith PetscErrorCode PetscStripTrailingZeros(char *buf)
4465c6c1daeSBarry Smith {
4475c6c1daeSBarry Smith   PetscErrorCode ierr;
4485c6c1daeSBarry Smith   char           *found;
4495c6c1daeSBarry Smith   size_t         i,n,m = PETSC_MAX_INT;
4505c6c1daeSBarry Smith 
4515c6c1daeSBarry Smith   PetscFunctionBegin;
4525c6c1daeSBarry Smith   /* if there is an e in string DO NOT strip trailing zeros */
4535c6c1daeSBarry Smith   ierr = PetscStrchr(buf,'e',&found);CHKERRQ(ierr);
4545c6c1daeSBarry Smith   if (found) PetscFunctionReturn(0);
4555c6c1daeSBarry Smith 
4565c6c1daeSBarry Smith   ierr = PetscStrlen(buf,&n);CHKERRQ(ierr);
4575c6c1daeSBarry Smith   /* locate decimal point */
4585c6c1daeSBarry Smith   for (i=0; i<n; i++) {
4595c6c1daeSBarry Smith     if (buf[i] == '.') {m = i; break;}
4605c6c1daeSBarry Smith   }
4615c6c1daeSBarry Smith   /* if not decimal point then no zeros to remove */
4625c6c1daeSBarry Smith   if (m == PETSC_MAX_INT) PetscFunctionReturn(0);
4635c6c1daeSBarry Smith   /* start at right end of string removing 0s */
4645c6c1daeSBarry Smith   for (i=n-1; i>m; i++) {
4655c6c1daeSBarry Smith     if (buf[i] != '0') PetscFunctionReturn(0);
4665c6c1daeSBarry Smith     buf[i] = 0;
4675c6c1daeSBarry Smith   }
4685c6c1daeSBarry Smith   PetscFunctionReturn(0);
4695c6c1daeSBarry Smith }
4705c6c1daeSBarry Smith 
4715c6c1daeSBarry Smith #undef __FUNCT__
4725c6c1daeSBarry Smith #define __FUNCT__ "PetscStripInitialZero"
4735c6c1daeSBarry Smith /*
4745c6c1daeSBarry Smith     Removes leading 0 from 0.22 or -0.22
4755c6c1daeSBarry Smith */
4765c6c1daeSBarry Smith PetscErrorCode PetscStripInitialZero(char *buf)
4775c6c1daeSBarry Smith {
4785c6c1daeSBarry Smith   PetscErrorCode ierr;
4795c6c1daeSBarry Smith   size_t         i,n;
4805c6c1daeSBarry Smith 
4815c6c1daeSBarry Smith   PetscFunctionBegin;
4825c6c1daeSBarry Smith   ierr = PetscStrlen(buf,&n);CHKERRQ(ierr);
4835c6c1daeSBarry Smith   if (buf[0] == '0') {
484a297a907SKarl Rupp     for (i=0; i<n; i++) buf[i] = buf[i+1];
4855c6c1daeSBarry Smith   } else if (buf[0] == '-' && buf[1] == '0') {
486a297a907SKarl Rupp     for (i=1; i<n; i++) buf[i] = buf[i+1];
4875c6c1daeSBarry Smith   }
4885c6c1daeSBarry Smith   PetscFunctionReturn(0);
4895c6c1daeSBarry Smith }
4905c6c1daeSBarry Smith 
4915c6c1daeSBarry Smith #undef __FUNCT__
4925c6c1daeSBarry Smith #define __FUNCT__ "PetscStripZeros"
4935c6c1daeSBarry Smith /*
4945c6c1daeSBarry Smith      Removes the extraneous zeros in numbers like 1.10000e6
4955c6c1daeSBarry Smith */
4965c6c1daeSBarry Smith PetscErrorCode PetscStripZeros(char *buf)
4975c6c1daeSBarry Smith {
4985c6c1daeSBarry Smith   PetscErrorCode ierr;
4995c6c1daeSBarry Smith   size_t         i,j,n;
5005c6c1daeSBarry Smith 
5015c6c1daeSBarry Smith   PetscFunctionBegin;
5025c6c1daeSBarry Smith   ierr = PetscStrlen(buf,&n);CHKERRQ(ierr);
5035c6c1daeSBarry Smith   if (n<5) PetscFunctionReturn(0);
5045c6c1daeSBarry Smith   for (i=1; i<n-1; i++) {
5055c6c1daeSBarry Smith     if (buf[i] == 'e' && buf[i-1] == '0') {
5065c6c1daeSBarry Smith       for (j=i; j<n+1; j++) buf[j-1] = buf[j];
5075c6c1daeSBarry Smith       ierr = PetscStripZeros(buf);CHKERRQ(ierr);
5085c6c1daeSBarry Smith       PetscFunctionReturn(0);
5095c6c1daeSBarry Smith     }
5105c6c1daeSBarry Smith   }
5115c6c1daeSBarry Smith   PetscFunctionReturn(0);
5125c6c1daeSBarry Smith }
5135c6c1daeSBarry Smith 
5145c6c1daeSBarry Smith #undef __FUNCT__
5155c6c1daeSBarry Smith #define __FUNCT__ "PetscStripZerosPlus"
5165c6c1daeSBarry Smith /*
5175c6c1daeSBarry Smith       Removes the plus in something like 1.1e+2 or 1.1e+02
5185c6c1daeSBarry Smith */
5195c6c1daeSBarry Smith PetscErrorCode PetscStripZerosPlus(char *buf)
5205c6c1daeSBarry Smith {
5215c6c1daeSBarry Smith   PetscErrorCode ierr;
5225c6c1daeSBarry Smith   size_t         i,j,n;
5235c6c1daeSBarry Smith 
5245c6c1daeSBarry Smith   PetscFunctionBegin;
5255c6c1daeSBarry Smith   ierr = PetscStrlen(buf,&n);CHKERRQ(ierr);
5265c6c1daeSBarry Smith   if (n<5) PetscFunctionReturn(0);
5275c6c1daeSBarry Smith   for (i=1; i<n-2; i++) {
5285c6c1daeSBarry Smith     if (buf[i] == '+') {
5295c6c1daeSBarry Smith       if (buf[i+1] == '0') {
5305c6c1daeSBarry Smith         for (j=i+1; j<n; j++) buf[j-1] = buf[j+1];
5315c6c1daeSBarry Smith         PetscFunctionReturn(0);
5325c6c1daeSBarry Smith       } else {
5335c6c1daeSBarry Smith         for (j=i+1; j<n+1; j++) buf[j-1] = buf[j];
5345c6c1daeSBarry Smith         PetscFunctionReturn(0);
5355c6c1daeSBarry Smith       }
5365c6c1daeSBarry Smith     } else if (buf[i] == '-') {
5375c6c1daeSBarry Smith       if (buf[i+1] == '0') {
5385c6c1daeSBarry Smith         for (j=i+1; j<n; j++) buf[j] = buf[j+1];
5395c6c1daeSBarry Smith         PetscFunctionReturn(0);
5405c6c1daeSBarry Smith       }
5415c6c1daeSBarry Smith     }
5425c6c1daeSBarry Smith   }
5435c6c1daeSBarry Smith   PetscFunctionReturn(0);
5445c6c1daeSBarry Smith }
545