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