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 185c6c1daeSBarry Smith Level: advanced 195c6c1daeSBarry Smith 20*0afdd333SBarry Smith .seealso: PetscDrawLGCreate(), PetscDrawLG, PetscDrawSPCreate(), PetscDrawSP, PetscDrawHGCreate(), PetscDrawHG, PetscDrawBarCreate(), PetscDrawBar, PetscDrawLGGetAxis(), PetscDrawSPGetAxis(), 21*0afdd333SBarry Smith PetscDrawHGGetAxis(), PetscDrawBarGetAxis(), PetscDrawAxis, PetscDrawAxisDestroy(), PetscDrawAxisSetColors(), PetscDrawAxisSetLabels(), PetscDrawAxisSetLimits(), PetscDrawAxisGetLimits(), PetscDrawAxisSetHoldLimits(), 22*0afdd333SBarry Smith PetscDrawAxisDraw() 235c6c1daeSBarry Smith @*/ 245c6c1daeSBarry Smith PetscErrorCode PetscDrawAxisCreate(PetscDraw draw,PetscDrawAxis *axis) 255c6c1daeSBarry Smith { 26e118a51fSLisandro Dalcin PetscDrawAxis ad; 27e118a51fSLisandro Dalcin PetscErrorCode ierr; 285c6c1daeSBarry Smith 295c6c1daeSBarry Smith PetscFunctionBegin; 305c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 315c6c1daeSBarry Smith PetscValidPointer(axis,2); 32e118a51fSLisandro Dalcin 3371917b75SLisandro Dalcin ierr = PetscHeaderCreate(ad,PETSC_DRAWAXIS_CLASSID,"DrawAxis","Draw Axis","Draw",PetscObjectComm((PetscObject)draw),PetscDrawAxisDestroy,NULL);CHKERRQ(ierr); 343bb1ff40SBarry Smith ierr = PetscLogObjectParent((PetscObject)draw,(PetscObject)ad);CHKERRQ(ierr); 35a297a907SKarl Rupp 36e118a51fSLisandro Dalcin ierr = PetscObjectReference((PetscObject)draw);CHKERRQ(ierr); 37e118a51fSLisandro Dalcin ad->win = draw; 38e118a51fSLisandro Dalcin 395c6c1daeSBarry Smith ad->xticks = PetscADefTicks; 405c6c1daeSBarry Smith ad->yticks = PetscADefTicks; 415c6c1daeSBarry Smith ad->xlabelstr = PetscADefLabel; 425c6c1daeSBarry Smith ad->ylabelstr = PetscADefLabel; 435c6c1daeSBarry Smith ad->ac = PETSC_DRAW_BLACK; 445c6c1daeSBarry Smith ad->tc = PETSC_DRAW_BLACK; 455c6c1daeSBarry Smith ad->cc = PETSC_DRAW_BLACK; 46e5ab1681SLisandro Dalcin ad->xlabel = NULL; 47e5ab1681SLisandro Dalcin ad->ylabel = NULL; 48e5ab1681SLisandro Dalcin ad->toplabel = NULL; 495c6c1daeSBarry Smith 505c6c1daeSBarry Smith *axis = ad; 515c6c1daeSBarry Smith PetscFunctionReturn(0); 525c6c1daeSBarry Smith } 535c6c1daeSBarry Smith 545c6c1daeSBarry Smith #undef __FUNCT__ 555c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawAxisDestroy" 565c6c1daeSBarry Smith /*@ 575c6c1daeSBarry Smith PetscDrawAxisDestroy - Frees the space used by an axis structure. 585c6c1daeSBarry Smith 595b399a63SLisandro Dalcin Collective on PetscDrawAxis 605c6c1daeSBarry Smith 615c6c1daeSBarry Smith Input Parameters: 625c6c1daeSBarry Smith . axis - the axis context 635c6c1daeSBarry Smith 645c6c1daeSBarry Smith Level: advanced 655c6c1daeSBarry Smith 66*0afdd333SBarry Smith .seealso: PetscDrawAxisCreate(), PetscDrawAxis 675c6c1daeSBarry Smith @*/ 685c6c1daeSBarry Smith PetscErrorCode PetscDrawAxisDestroy(PetscDrawAxis *axis) 695c6c1daeSBarry Smith { 705c6c1daeSBarry Smith PetscErrorCode ierr; 715c6c1daeSBarry Smith 725c6c1daeSBarry Smith PetscFunctionBegin; 735c6c1daeSBarry Smith if (!*axis) PetscFunctionReturn(0); 74e118a51fSLisandro Dalcin PetscValidHeaderSpecific(*axis,PETSC_DRAWAXIS_CLASSID,1); 75e118a51fSLisandro Dalcin if (--((PetscObject)(*axis))->refct > 0) {*axis = NULL; PetscFunctionReturn(0);} 765c6c1daeSBarry Smith 775c6c1daeSBarry Smith ierr = PetscFree((*axis)->toplabel);CHKERRQ(ierr); 785c6c1daeSBarry Smith ierr = PetscFree((*axis)->xlabel);CHKERRQ(ierr); 795c6c1daeSBarry Smith ierr = PetscFree((*axis)->ylabel);CHKERRQ(ierr); 80e118a51fSLisandro Dalcin ierr = PetscDrawDestroy(&(*axis)->win);CHKERRQ(ierr); 815c6c1daeSBarry Smith ierr = PetscHeaderDestroy(axis);CHKERRQ(ierr); 825c6c1daeSBarry Smith PetscFunctionReturn(0); 835c6c1daeSBarry Smith } 845c6c1daeSBarry Smith 855c6c1daeSBarry Smith #undef __FUNCT__ 865c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawAxisSetColors" 875c6c1daeSBarry Smith /*@ 885c6c1daeSBarry Smith PetscDrawAxisSetColors - Sets the colors to be used for the axis, 895c6c1daeSBarry Smith tickmarks, and text. 905c6c1daeSBarry Smith 915b399a63SLisandro Dalcin Logically Collective on PetscDrawAxis 925c6c1daeSBarry Smith 935c6c1daeSBarry Smith Input Parameters: 945c6c1daeSBarry Smith + axis - the axis 955c6c1daeSBarry Smith . ac - the color of the axis lines 965c6c1daeSBarry Smith . tc - the color of the tick marks 975c6c1daeSBarry Smith - cc - the color of the text strings 985c6c1daeSBarry Smith 995c6c1daeSBarry Smith Level: advanced 1005c6c1daeSBarry Smith 101*0afdd333SBarry Smith .seealso: PetscDrawAxisCreate(), PetscDrawAxis, PetscDrawAxisSetLabels(), PetscDrawAxisDraw(), PetscDrawAxisSetLimits() 1025c6c1daeSBarry Smith @*/ 1035c6c1daeSBarry Smith PetscErrorCode PetscDrawAxisSetColors(PetscDrawAxis axis,int ac,int tc,int cc) 1045c6c1daeSBarry Smith { 1055c6c1daeSBarry Smith PetscFunctionBegin; 106e118a51fSLisandro Dalcin PetscValidHeaderSpecific(axis,PETSC_DRAWAXIS_CLASSID,1); 1075b399a63SLisandro Dalcin PetscValidLogicalCollectiveInt(axis,ac,2); 1085b399a63SLisandro Dalcin PetscValidLogicalCollectiveInt(axis,tc,3); 1095b399a63SLisandro Dalcin PetscValidLogicalCollectiveInt(axis,cc,4); 1105c6c1daeSBarry Smith axis->ac = ac; axis->tc = tc; axis->cc = cc; 1115c6c1daeSBarry Smith PetscFunctionReturn(0); 1125c6c1daeSBarry Smith } 1135c6c1daeSBarry Smith 1145c6c1daeSBarry Smith #undef __FUNCT__ 1155c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawAxisSetLabels" 1165c6c1daeSBarry Smith /*@C 1175c6c1daeSBarry Smith PetscDrawAxisSetLabels - Sets the x and y axis labels. 1185c6c1daeSBarry Smith 1195b399a63SLisandro Dalcin Logically Collective on PetscDrawAxis 1205c6c1daeSBarry Smith 1215c6c1daeSBarry Smith Input Parameters: 1225c6c1daeSBarry Smith + axis - the axis 1235c6c1daeSBarry Smith . top - the label at the top of the image 1245c6c1daeSBarry Smith - xlabel,ylabel - the labes for the x and y axis 1255c6c1daeSBarry Smith 1265c6c1daeSBarry Smith Notes: Must be called before PetscDrawAxisDraw() or PetscDrawLGDraw() 1275c6c1daeSBarry Smith There should be no newlines in the arguments 1285c6c1daeSBarry Smith 1295c6c1daeSBarry Smith Level: advanced 1305c6c1daeSBarry Smith 131*0afdd333SBarry Smith .seealso: PetscDrawAxisCreate(), PetscDrawAxis, PetscDrawAxisSetColors(), PetscDrawAxisDraw(), PetscDrawAxisSetLimits() 1325c6c1daeSBarry Smith @*/ 1335c6c1daeSBarry Smith PetscErrorCode PetscDrawAxisSetLabels(PetscDrawAxis axis,const char top[],const char xlabel[],const char ylabel[]) 1345c6c1daeSBarry Smith { 1355c6c1daeSBarry Smith PetscErrorCode ierr; 1365c6c1daeSBarry Smith 1375c6c1daeSBarry Smith PetscFunctionBegin; 138e118a51fSLisandro Dalcin PetscValidHeaderSpecific(axis,PETSC_DRAWAXIS_CLASSID,1); 1395c6c1daeSBarry Smith ierr = PetscFree(axis->xlabel);CHKERRQ(ierr); 1405c6c1daeSBarry Smith ierr = PetscFree(axis->ylabel);CHKERRQ(ierr); 1415c6c1daeSBarry Smith ierr = PetscFree(axis->toplabel);CHKERRQ(ierr); 1425c6c1daeSBarry Smith ierr = PetscStrallocpy(xlabel,&axis->xlabel);CHKERRQ(ierr); 1435c6c1daeSBarry Smith ierr = PetscStrallocpy(ylabel,&axis->ylabel);CHKERRQ(ierr); 1445c6c1daeSBarry Smith ierr = PetscStrallocpy(top,&axis->toplabel);CHKERRQ(ierr); 1455c6c1daeSBarry Smith PetscFunctionReturn(0); 1465c6c1daeSBarry Smith } 1475c6c1daeSBarry Smith 1485c6c1daeSBarry Smith #undef __FUNCT__ 14971917b75SLisandro Dalcin #define __FUNCT__ "PetscDrawAxisSetLimits" 15071917b75SLisandro Dalcin /*@ 15171917b75SLisandro Dalcin PetscDrawAxisSetLimits - Sets the limits (in user coords) of the axis 15271917b75SLisandro Dalcin 15371917b75SLisandro Dalcin Logically Collective on PetscDrawAxis 15471917b75SLisandro Dalcin 15571917b75SLisandro Dalcin Input Parameters: 15671917b75SLisandro Dalcin + axis - the axis 15771917b75SLisandro Dalcin . xmin,xmax - limits in x 15871917b75SLisandro Dalcin - ymin,ymax - limits in y 15971917b75SLisandro Dalcin 16071917b75SLisandro Dalcin Options Database: 16171917b75SLisandro Dalcin . -drawaxis_hold - hold the initial set of axis limits for future plotting 16271917b75SLisandro Dalcin 16371917b75SLisandro Dalcin Level: advanced 16471917b75SLisandro Dalcin 165*0afdd333SBarry Smith .seealso: PetscDrawAxisSetHoldLimits(), PetscDrawAxisGetLimits(), PetscDrawAxisSetLabels(), PetscDrawAxisSetColors() 16671917b75SLisandro Dalcin 16771917b75SLisandro Dalcin @*/ 16871917b75SLisandro Dalcin PetscErrorCode PetscDrawAxisSetLimits(PetscDrawAxis axis,PetscReal xmin,PetscReal xmax,PetscReal ymin,PetscReal ymax) 16971917b75SLisandro Dalcin { 17071917b75SLisandro Dalcin PetscErrorCode ierr; 17171917b75SLisandro Dalcin 17271917b75SLisandro Dalcin PetscFunctionBegin; 17371917b75SLisandro Dalcin PetscValidHeaderSpecific(axis,PETSC_DRAWAXIS_CLASSID,1); 17471917b75SLisandro Dalcin if (axis->hold) PetscFunctionReturn(0); 17571917b75SLisandro Dalcin axis->xlow = xmin; 17671917b75SLisandro Dalcin axis->xhigh= xmax; 17771917b75SLisandro Dalcin axis->ylow = ymin; 17871917b75SLisandro Dalcin axis->yhigh= ymax; 17971917b75SLisandro Dalcin ierr = PetscOptionsHasName(((PetscObject)axis)->options,((PetscObject)axis)->prefix,"-drawaxis_hold",&axis->hold);CHKERRQ(ierr); 18071917b75SLisandro Dalcin PetscFunctionReturn(0); 18171917b75SLisandro Dalcin } 18271917b75SLisandro Dalcin 18371917b75SLisandro Dalcin #undef __FUNCT__ 18471917b75SLisandro Dalcin #define __FUNCT__ "PetscDrawAxisGetLimits" 18571917b75SLisandro Dalcin /*@ 18671917b75SLisandro Dalcin PetscDrawAxisGetLimits - Gets the limits (in user coords) of the axis 18771917b75SLisandro Dalcin 18871917b75SLisandro Dalcin Not Collective 18971917b75SLisandro Dalcin 19071917b75SLisandro Dalcin Input Parameters: 19171917b75SLisandro Dalcin + axis - the axis 19271917b75SLisandro Dalcin . xmin,xmax - limits in x 19371917b75SLisandro Dalcin - ymin,ymax - limits in y 19471917b75SLisandro Dalcin 19571917b75SLisandro Dalcin Level: advanced 19671917b75SLisandro Dalcin 197*0afdd333SBarry Smith .seealso: PetscDrawAxisCreate(), PetscDrawAxis, PetscDrawAxisSetHoldLimits(), PetscDrawAxisSetLimits(), PetscDrawAxisSetLabels(), PetscDrawAxisSetColors() 19871917b75SLisandro Dalcin 19971917b75SLisandro Dalcin @*/ 20071917b75SLisandro Dalcin PetscErrorCode PetscDrawAxisGetLimits(PetscDrawAxis axis,PetscReal *xmin,PetscReal *xmax,PetscReal *ymin,PetscReal *ymax) 20171917b75SLisandro Dalcin { 20271917b75SLisandro Dalcin PetscFunctionBegin; 20371917b75SLisandro Dalcin PetscValidHeaderSpecific(axis,PETSC_DRAWAXIS_CLASSID,1); 20471917b75SLisandro Dalcin *xmin = axis->xlow; 20571917b75SLisandro Dalcin *xmax = axis->xhigh; 20671917b75SLisandro Dalcin *ymin = axis->ylow; 20771917b75SLisandro Dalcin *ymax = axis->yhigh; 20871917b75SLisandro Dalcin PetscFunctionReturn(0); 20971917b75SLisandro Dalcin } 21071917b75SLisandro Dalcin 21171917b75SLisandro Dalcin #undef __FUNCT__ 2125c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawAxisSetHoldLimits" 2135c6c1daeSBarry Smith /*@ 2145c6c1daeSBarry Smith PetscDrawAxisSetHoldLimits - Causes an axis to keep the same limits until this is called 2155c6c1daeSBarry Smith again 2165c6c1daeSBarry Smith 2175b399a63SLisandro Dalcin Logically Collective on PetscDrawAxis 2185c6c1daeSBarry Smith 2195c6c1daeSBarry Smith Input Parameters: 2205c6c1daeSBarry Smith + axis - the axis 2215c6c1daeSBarry Smith - hold - PETSC_TRUE - hold current limits, PETSC_FALSE allow limits to be changed 2225c6c1daeSBarry Smith 2235c6c1daeSBarry Smith Level: advanced 2245c6c1daeSBarry Smith 2255c6c1daeSBarry Smith Notes: 2265c6c1daeSBarry Smith Once this has been called with PETSC_TRUE the limits will not change if you call 2275c6c1daeSBarry Smith PetscDrawAxisSetLimits() until you call this with PETSC_FALSE 2285c6c1daeSBarry Smith 229*0afdd333SBarry Smith .seealso: PetscDrawAxisCreate(), PetscDrawAxis, PetscDrawAxisGetLimits(), PetscDrawAxisSetLimits(), PetscDrawAxisSetLabels(), PetscDrawAxisSetColors() 2305c6c1daeSBarry Smith 2315c6c1daeSBarry Smith @*/ 2325c6c1daeSBarry Smith PetscErrorCode PetscDrawAxisSetHoldLimits(PetscDrawAxis axis,PetscBool hold) 2335c6c1daeSBarry Smith { 2345c6c1daeSBarry Smith PetscFunctionBegin; 235e118a51fSLisandro Dalcin PetscValidHeaderSpecific(axis,PETSC_DRAWAXIS_CLASSID,1); 2365b399a63SLisandro Dalcin PetscValidLogicalCollectiveBool(axis,hold,2); 2375c6c1daeSBarry Smith axis->hold = hold; 2385c6c1daeSBarry Smith PetscFunctionReturn(0); 2395c6c1daeSBarry Smith } 2405c6c1daeSBarry Smith 2415c6c1daeSBarry Smith #undef __FUNCT__ 2425c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawAxisDraw" 2435c6c1daeSBarry Smith /*@ 2445c6c1daeSBarry Smith PetscDrawAxisDraw - PetscDraws an axis. 2455c6c1daeSBarry Smith 2465b399a63SLisandro Dalcin Collective on PetscDrawAxis 2475c6c1daeSBarry Smith 2485c6c1daeSBarry Smith Input Parameter: 2495c6c1daeSBarry Smith . axis - Axis structure 2505c6c1daeSBarry Smith 2515c6c1daeSBarry Smith Level: advanced 2525c6c1daeSBarry Smith 2535c6c1daeSBarry Smith Note: 2545c6c1daeSBarry Smith This draws the actual axis. The limits etc have already been set. 2555c6c1daeSBarry Smith By picking special routines for the ticks and labels, special 2565c6c1daeSBarry Smith effects may be generated. These routines are part of the Axis 2575c6c1daeSBarry Smith structure (axis). 258*0afdd333SBarry Smith 259*0afdd333SBarry Smith .seealso: PetscDrawAxisCreate(), PetscDrawAxis, PetscDrawAxisGetLimits(), PetscDrawAxisSetLimits(), PetscDrawAxisSetLabels(), PetscDrawAxisSetColors() 260*0afdd333SBarry Smith 2615c6c1daeSBarry Smith @*/ 2625c6c1daeSBarry Smith PetscErrorCode PetscDrawAxisDraw(PetscDrawAxis axis) 2635c6c1daeSBarry Smith { 264e118a51fSLisandro Dalcin int i,ntick,numx,numy,ac,tc,cc; 265e118a51fSLisandro Dalcin PetscMPIInt rank; 26671917b75SLisandro Dalcin size_t len,ytlen=0; 26771917b75SLisandro Dalcin PetscReal coors[4],tickloc[MAXSEGS],sep,tw,th; 26871917b75SLisandro Dalcin PetscReal xl,xr,yl,yr,dxl=0,dyl=0,dxr=0,dyr=0; 2695c6c1daeSBarry Smith char *p; 270e118a51fSLisandro Dalcin PetscDraw draw; 271e118a51fSLisandro Dalcin PetscBool isnull; 2725c6c1daeSBarry Smith PetscErrorCode ierr; 2735c6c1daeSBarry Smith 2745c6c1daeSBarry Smith PetscFunctionBegin; 275e118a51fSLisandro Dalcin PetscValidHeaderSpecific(axis,PETSC_DRAWAXIS_CLASSID,1); 2768f69470aSLisandro Dalcin ierr = PetscDrawIsNull(axis->win,&isnull);CHKERRQ(ierr); 277e118a51fSLisandro Dalcin if (isnull) PetscFunctionReturn(0); 278ce94432eSBarry Smith ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)axis),&rank);CHKERRQ(ierr); 2795c6c1daeSBarry Smith 2808f69470aSLisandro Dalcin draw = axis->win; 2815b399a63SLisandro Dalcin 282e118a51fSLisandro Dalcin ac = axis->ac; tc = axis->tc; cc = axis->cc; 2835c6c1daeSBarry Smith if (axis->xlow == axis->xhigh) {axis->xlow -= .5; axis->xhigh += .5;} 2847b8d257dSBarry Smith if (axis->ylow == axis->yhigh) {axis->ylow -= .5; axis->yhigh += .5;} 285e118a51fSLisandro Dalcin 28671917b75SLisandro Dalcin ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr); 28771917b75SLisandro Dalcin if (rank) goto finally; 28871917b75SLisandro Dalcin 28971917b75SLisandro Dalcin /* get cannonical string size */ 29071917b75SLisandro Dalcin ierr = PetscDrawSetCoordinates(draw,0,0,1,1);CHKERRQ(ierr); 2915c6c1daeSBarry Smith ierr = PetscDrawStringGetSize(draw,&tw,&th);CHKERRQ(ierr); 29271917b75SLisandro Dalcin /* lower spacing */ 29371917b75SLisandro Dalcin if (axis->xlabelstr) dyl += 1.5*th; 29471917b75SLisandro Dalcin if (axis->xlabel) dyl += 1.5*th; 29571917b75SLisandro Dalcin /* left spacing */ 29671917b75SLisandro Dalcin if (axis->ylabelstr) dxl += 7.5*tw; 29771917b75SLisandro Dalcin if (axis->ylabel) dxl += 2.0*tw; 29871917b75SLisandro Dalcin /* right and top spacing */ 29971917b75SLisandro Dalcin if (axis->xlabelstr) dxr = 2.5*tw; 30071917b75SLisandro Dalcin if (axis->ylabelstr) dyr = 0.5*th; 30171917b75SLisandro Dalcin if (axis->toplabel) dyr = 1.5*th; 30271917b75SLisandro Dalcin /* extra spacing */ 30371917b75SLisandro Dalcin dxl += 0.7*tw; dxr += 0.5*tw; 30471917b75SLisandro Dalcin dyl += 0.2*th; dyr += 0.2*th; 30571917b75SLisandro Dalcin /* determine coordinates */ 30671917b75SLisandro Dalcin xl = (dxl*axis->xhigh + dxr*axis->xlow - axis->xlow) / (dxl + dxr - 1); 30771917b75SLisandro Dalcin xr = (dxl*axis->xhigh + dxr*axis->xlow - axis->xhigh) / (dxl + dxr - 1); 30871917b75SLisandro Dalcin yl = (dyl*axis->yhigh + dyr*axis->ylow - axis->ylow) / (dyl + dyr - 1); 30971917b75SLisandro Dalcin yr = (dyl*axis->yhigh + dyr*axis->ylow - axis->yhigh) / (dyl + dyr - 1); 3105c6c1daeSBarry Smith ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr); 3115c6c1daeSBarry Smith ierr = PetscDrawStringGetSize(draw,&tw,&th);CHKERRQ(ierr); 3125c6c1daeSBarry Smith 31371917b75SLisandro Dalcin /* PetscDraw the axis lines */ 3145c6c1daeSBarry Smith ierr = PetscDrawLine(draw,axis->xlow,axis->ylow,axis->xhigh,axis->ylow,ac);CHKERRQ(ierr); 3155c6c1daeSBarry Smith ierr = PetscDrawLine(draw,axis->xlow,axis->ylow,axis->xlow,axis->yhigh,ac);CHKERRQ(ierr); 31671917b75SLisandro Dalcin ierr = PetscDrawLine(draw,axis->xlow,axis->yhigh,axis->xhigh,axis->yhigh,ac);CHKERRQ(ierr); 31771917b75SLisandro Dalcin ierr = PetscDrawLine(draw,axis->xhigh,axis->ylow,axis->xhigh,axis->yhigh,ac);CHKERRQ(ierr); 3185c6c1daeSBarry Smith 31971917b75SLisandro Dalcin /* PetscDraw the top label */ 3205c6c1daeSBarry Smith if (axis->toplabel) { 32171917b75SLisandro Dalcin PetscReal x = (axis->xlow + axis->xhigh)/2, y = axis->yhigh + 0.5*th; 32271917b75SLisandro Dalcin ierr = PetscDrawStringCentered(draw,x,y,cc,axis->toplabel);CHKERRQ(ierr); 3235c6c1daeSBarry Smith } 3245c6c1daeSBarry Smith 32571917b75SLisandro Dalcin /* PetscDraw the X ticks and labels */ 3265c6c1daeSBarry Smith if (axis->xticks) { 32771917b75SLisandro Dalcin numx = (int)(.15*(axis->xhigh-axis->xlow)/tw); numx = PetscClipInterval(numx,2,6); 3285c6c1daeSBarry Smith ierr = (*axis->xticks)(axis->xlow,axis->xhigh,numx,&ntick,tickloc,MAXSEGS);CHKERRQ(ierr); 3295c6c1daeSBarry Smith /* PetscDraw in tick marks */ 3305c6c1daeSBarry Smith for (i=0; i<ntick; i++) { 33171917b75SLisandro Dalcin ierr = PetscDrawLine(draw,tickloc[i],axis->ylow,tickloc[i],axis->ylow+.5*th,tc);CHKERRQ(ierr); 33271917b75SLisandro Dalcin ierr = PetscDrawLine(draw,tickloc[i],axis->yhigh,tickloc[i],axis->yhigh-.5*th,tc);CHKERRQ(ierr); 3335c6c1daeSBarry Smith } 3345c6c1daeSBarry Smith /* label ticks */ 3355c6c1daeSBarry Smith if (axis->xlabelstr) { 33671917b75SLisandro Dalcin for (i=0; i<ntick; i++) { 3375c6c1daeSBarry Smith if (i < ntick - 1) sep = tickloc[i+1] - tickloc[i]; 3385c6c1daeSBarry Smith else if (i > 0) sep = tickloc[i] - tickloc[i-1]; 3395c6c1daeSBarry Smith else sep = 0.0; 3405c6c1daeSBarry Smith ierr = (*axis->xlabelstr)(tickloc[i],sep,&p);CHKERRQ(ierr); 34171917b75SLisandro Dalcin ierr = PetscDrawStringCentered(draw,tickloc[i],axis->ylow-1.5*th,cc,p);CHKERRQ(ierr); 3425c6c1daeSBarry Smith } 3435c6c1daeSBarry Smith } 3445c6c1daeSBarry Smith } 3455c6c1daeSBarry Smith if (axis->xlabel) { 34671917b75SLisandro Dalcin PetscReal x = (axis->xlow + axis->xhigh)/2, y = axis->ylow - 1.5*th; 34771917b75SLisandro Dalcin if (axis->xlabelstr) y -= 1.5*th; 34871917b75SLisandro Dalcin ierr = PetscDrawStringCentered(draw,x,y,cc,axis->xlabel);CHKERRQ(ierr); 3495c6c1daeSBarry Smith } 35071917b75SLisandro Dalcin 35171917b75SLisandro Dalcin /* PetscDraw the Y ticks and labels */ 3525c6c1daeSBarry Smith if (axis->yticks) { 35371917b75SLisandro Dalcin numy = (int)(.50*(axis->yhigh-axis->ylow)/th); numy = PetscClipInterval(numy,2,6); 3545c6c1daeSBarry Smith ierr = (*axis->yticks)(axis->ylow,axis->yhigh,numy,&ntick,tickloc,MAXSEGS);CHKERRQ(ierr); 3555c6c1daeSBarry Smith /* PetscDraw in tick marks */ 3565c6c1daeSBarry Smith for (i=0; i<ntick; i++) { 35771917b75SLisandro Dalcin ierr = PetscDrawLine(draw,axis->xlow,tickloc[i],axis->xlow+.5*tw,tickloc[i],tc);CHKERRQ(ierr); 35871917b75SLisandro Dalcin ierr = PetscDrawLine(draw,axis->xhigh,tickloc[i],axis->xhigh-.5*tw,tickloc[i],tc);CHKERRQ(ierr); 3595c6c1daeSBarry Smith } 3605c6c1daeSBarry Smith /* label ticks */ 3615c6c1daeSBarry Smith if (axis->ylabelstr) { 36271917b75SLisandro Dalcin for (i=0; i<ntick; i++) { 3635c6c1daeSBarry Smith if (i < ntick - 1) sep = tickloc[i+1] - tickloc[i]; 3645c6c1daeSBarry Smith else if (i > 0) sep = tickloc[i] - tickloc[i-1]; 3655c6c1daeSBarry Smith else sep = 0.0; 36671917b75SLisandro Dalcin ierr = (*axis->ylabelstr)(tickloc[i],sep,&p);CHKERRQ(ierr); 36771917b75SLisandro Dalcin ierr = PetscStrlen(p,&len);CHKERRQ(ierr); ytlen = PetscMax(ytlen,len); 36871917b75SLisandro Dalcin ierr = PetscDrawString(draw,axis->xlow-(len+.5)*tw,tickloc[i]-.5*th,cc,p);CHKERRQ(ierr); 3695c6c1daeSBarry Smith } 3705c6c1daeSBarry Smith } 3715c6c1daeSBarry Smith } 3725c6c1daeSBarry Smith if (axis->ylabel) { 37371917b75SLisandro Dalcin PetscReal x = axis->xlow - 2.0*tw, y = (axis->ylow + axis->yhigh)/2; 37471917b75SLisandro Dalcin if (axis->ylabelstr) x -= (ytlen+.5)*tw; 3755c6c1daeSBarry Smith ierr = PetscStrlen(axis->ylabel,&len);CHKERRQ(ierr); 37671917b75SLisandro Dalcin ierr = PetscDrawStringVertical(draw,x,y+len*th/2,cc,axis->ylabel);CHKERRQ(ierr); 3775c6c1daeSBarry Smith } 3785b399a63SLisandro Dalcin 3795b399a63SLisandro Dalcin ierr = PetscDrawGetCoordinates(draw,&coors[0],&coors[1],&coors[2],&coors[3]);CHKERRQ(ierr); 3805b399a63SLisandro Dalcin finally: 3815b399a63SLisandro Dalcin ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr); 3825b399a63SLisandro Dalcin ierr = MPI_Bcast(coors,4,MPIU_REAL,0,PetscObjectComm((PetscObject)draw));CHKERRQ(ierr); 3835b399a63SLisandro Dalcin ierr = PetscDrawSetCoordinates(draw,coors[0],coors[1],coors[2],coors[3]);CHKERRQ(ierr); 3845c6c1daeSBarry Smith PetscFunctionReturn(0); 3855c6c1daeSBarry Smith } 3865c6c1daeSBarry Smith 3875c6c1daeSBarry Smith #undef __FUNCT__ 38836c9bc0dSBarry Smith #define __FUNCT__ "PetscStripe0" 38936c9bc0dSBarry Smith /* 39036c9bc0dSBarry Smith Removes all zeros but one from .0000 39136c9bc0dSBarry Smith */ 39236c9bc0dSBarry Smith PetscErrorCode PetscStripe0(char *buf) 39336c9bc0dSBarry Smith { 39436c9bc0dSBarry Smith PetscErrorCode ierr; 39536c9bc0dSBarry Smith size_t n; 39636c9bc0dSBarry Smith PetscBool flg; 39736c9bc0dSBarry Smith char *str; 39836c9bc0dSBarry Smith 39936c9bc0dSBarry Smith PetscFunctionBegin; 40036c9bc0dSBarry Smith ierr = PetscStrlen(buf,&n);CHKERRQ(ierr); 40136c9bc0dSBarry Smith ierr = PetscStrendswith(buf,"e00",&flg);CHKERRQ(ierr); 402a297a907SKarl Rupp if (flg) buf[n-3] = 0; 40336c9bc0dSBarry Smith ierr = PetscStrstr(buf,"e0",&str);CHKERRQ(ierr); 40436c9bc0dSBarry Smith if (str) { 40536c9bc0dSBarry Smith buf[n-2] = buf[n-1]; 40636c9bc0dSBarry Smith buf[n-1] = 0; 40736c9bc0dSBarry Smith } 40836c9bc0dSBarry Smith ierr = PetscStrstr(buf,"e-0",&str);CHKERRQ(ierr); 40936c9bc0dSBarry Smith if (str) { 41036c9bc0dSBarry Smith buf[n-2] = buf[n-1]; 41136c9bc0dSBarry Smith buf[n-1] = 0; 41236c9bc0dSBarry Smith } 41336c9bc0dSBarry Smith PetscFunctionReturn(0); 41436c9bc0dSBarry Smith } 41536c9bc0dSBarry Smith 41636c9bc0dSBarry Smith #undef __FUNCT__ 4175c6c1daeSBarry Smith #define __FUNCT__ "PetscStripAllZeros" 4185c6c1daeSBarry Smith /* 4195c6c1daeSBarry Smith Removes all zeros but one from .0000 4205c6c1daeSBarry Smith */ 4215c6c1daeSBarry Smith PetscErrorCode PetscStripAllZeros(char *buf) 4225c6c1daeSBarry Smith { 4235c6c1daeSBarry Smith PetscErrorCode ierr; 4245c6c1daeSBarry Smith size_t i,n; 4255c6c1daeSBarry Smith 4265c6c1daeSBarry Smith PetscFunctionBegin; 4275c6c1daeSBarry Smith ierr = PetscStrlen(buf,&n);CHKERRQ(ierr); 4285c6c1daeSBarry Smith if (buf[0] != '.') PetscFunctionReturn(0); 4295c6c1daeSBarry Smith for (i=1; i<n; i++) { 4305c6c1daeSBarry Smith if (buf[i] != '0') PetscFunctionReturn(0); 4315c6c1daeSBarry Smith } 4325c6c1daeSBarry Smith buf[0] = '0'; 4335c6c1daeSBarry Smith buf[1] = 0; 4345c6c1daeSBarry Smith PetscFunctionReturn(0); 4355c6c1daeSBarry Smith } 4365c6c1daeSBarry Smith 4375c6c1daeSBarry Smith #undef __FUNCT__ 4385c6c1daeSBarry Smith #define __FUNCT__ "PetscStripTrailingZeros" 4395c6c1daeSBarry Smith /* 4405c6c1daeSBarry Smith Removes trailing zeros 4415c6c1daeSBarry Smith */ 4425c6c1daeSBarry Smith PetscErrorCode PetscStripTrailingZeros(char *buf) 4435c6c1daeSBarry Smith { 4445c6c1daeSBarry Smith PetscErrorCode ierr; 4455c6c1daeSBarry Smith char *found; 4465c6c1daeSBarry Smith size_t i,n,m = PETSC_MAX_INT; 4475c6c1daeSBarry Smith 4485c6c1daeSBarry Smith PetscFunctionBegin; 4495c6c1daeSBarry Smith /* if there is an e in string DO NOT strip trailing zeros */ 4505c6c1daeSBarry Smith ierr = PetscStrchr(buf,'e',&found);CHKERRQ(ierr); 4515c6c1daeSBarry Smith if (found) PetscFunctionReturn(0); 4525c6c1daeSBarry Smith 4535c6c1daeSBarry Smith ierr = PetscStrlen(buf,&n);CHKERRQ(ierr); 4545c6c1daeSBarry Smith /* locate decimal point */ 4555c6c1daeSBarry Smith for (i=0; i<n; i++) { 4565c6c1daeSBarry Smith if (buf[i] == '.') {m = i; break;} 4575c6c1daeSBarry Smith } 4585c6c1daeSBarry Smith /* if not decimal point then no zeros to remove */ 4595c6c1daeSBarry Smith if (m == PETSC_MAX_INT) PetscFunctionReturn(0); 4605c6c1daeSBarry Smith /* start at right end of string removing 0s */ 4615c6c1daeSBarry Smith for (i=n-1; i>m; i++) { 4625c6c1daeSBarry Smith if (buf[i] != '0') PetscFunctionReturn(0); 4635c6c1daeSBarry Smith buf[i] = 0; 4645c6c1daeSBarry Smith } 4655c6c1daeSBarry Smith PetscFunctionReturn(0); 4665c6c1daeSBarry Smith } 4675c6c1daeSBarry Smith 4685c6c1daeSBarry Smith #undef __FUNCT__ 4695c6c1daeSBarry Smith #define __FUNCT__ "PetscStripInitialZero" 4705c6c1daeSBarry Smith /* 4715c6c1daeSBarry Smith Removes leading 0 from 0.22 or -0.22 4725c6c1daeSBarry Smith */ 4735c6c1daeSBarry Smith PetscErrorCode PetscStripInitialZero(char *buf) 4745c6c1daeSBarry Smith { 4755c6c1daeSBarry Smith PetscErrorCode ierr; 4765c6c1daeSBarry Smith size_t i,n; 4775c6c1daeSBarry Smith 4785c6c1daeSBarry Smith PetscFunctionBegin; 4795c6c1daeSBarry Smith ierr = PetscStrlen(buf,&n);CHKERRQ(ierr); 4805c6c1daeSBarry Smith if (buf[0] == '0') { 481a297a907SKarl Rupp for (i=0; i<n; i++) buf[i] = buf[i+1]; 4825c6c1daeSBarry Smith } else if (buf[0] == '-' && buf[1] == '0') { 483a297a907SKarl Rupp for (i=1; i<n; i++) buf[i] = buf[i+1]; 4845c6c1daeSBarry Smith } 4855c6c1daeSBarry Smith PetscFunctionReturn(0); 4865c6c1daeSBarry Smith } 4875c6c1daeSBarry Smith 4885c6c1daeSBarry Smith #undef __FUNCT__ 4895c6c1daeSBarry Smith #define __FUNCT__ "PetscStripZeros" 4905c6c1daeSBarry Smith /* 4915c6c1daeSBarry Smith Removes the extraneous zeros in numbers like 1.10000e6 4925c6c1daeSBarry Smith */ 4935c6c1daeSBarry Smith PetscErrorCode PetscStripZeros(char *buf) 4945c6c1daeSBarry Smith { 4955c6c1daeSBarry Smith PetscErrorCode ierr; 4965c6c1daeSBarry Smith size_t i,j,n; 4975c6c1daeSBarry Smith 4985c6c1daeSBarry Smith PetscFunctionBegin; 4995c6c1daeSBarry Smith ierr = PetscStrlen(buf,&n);CHKERRQ(ierr); 5005c6c1daeSBarry Smith if (n<5) PetscFunctionReturn(0); 5015c6c1daeSBarry Smith for (i=1; i<n-1; i++) { 5025c6c1daeSBarry Smith if (buf[i] == 'e' && buf[i-1] == '0') { 5035c6c1daeSBarry Smith for (j=i; j<n+1; j++) buf[j-1] = buf[j]; 5045c6c1daeSBarry Smith ierr = PetscStripZeros(buf);CHKERRQ(ierr); 5055c6c1daeSBarry Smith PetscFunctionReturn(0); 5065c6c1daeSBarry Smith } 5075c6c1daeSBarry Smith } 5085c6c1daeSBarry Smith PetscFunctionReturn(0); 5095c6c1daeSBarry Smith } 5105c6c1daeSBarry Smith 5115c6c1daeSBarry Smith #undef __FUNCT__ 5125c6c1daeSBarry Smith #define __FUNCT__ "PetscStripZerosPlus" 5135c6c1daeSBarry Smith /* 5145c6c1daeSBarry Smith Removes the plus in something like 1.1e+2 or 1.1e+02 5155c6c1daeSBarry Smith */ 5165c6c1daeSBarry Smith PetscErrorCode PetscStripZerosPlus(char *buf) 5175c6c1daeSBarry Smith { 5185c6c1daeSBarry Smith PetscErrorCode ierr; 5195c6c1daeSBarry Smith size_t i,j,n; 5205c6c1daeSBarry Smith 5215c6c1daeSBarry Smith PetscFunctionBegin; 5225c6c1daeSBarry Smith ierr = PetscStrlen(buf,&n);CHKERRQ(ierr); 5235c6c1daeSBarry Smith if (n<5) PetscFunctionReturn(0); 5245c6c1daeSBarry Smith for (i=1; i<n-2; i++) { 5255c6c1daeSBarry Smith if (buf[i] == '+') { 5265c6c1daeSBarry Smith if (buf[i+1] == '0') { 5275c6c1daeSBarry Smith for (j=i+1; j<n; j++) buf[j-1] = buf[j+1]; 5285c6c1daeSBarry Smith PetscFunctionReturn(0); 5295c6c1daeSBarry Smith } else { 5305c6c1daeSBarry Smith for (j=i+1; j<n+1; j++) buf[j-1] = buf[j]; 5315c6c1daeSBarry Smith PetscFunctionReturn(0); 5325c6c1daeSBarry Smith } 5335c6c1daeSBarry Smith } else if (buf[i] == '-') { 5345c6c1daeSBarry Smith if (buf[i+1] == '0') { 5355c6c1daeSBarry Smith for (j=i+1; j<n; j++) buf[j] = buf[j+1]; 5365c6c1daeSBarry Smith PetscFunctionReturn(0); 5375c6c1daeSBarry Smith } 5385c6c1daeSBarry Smith } 5395c6c1daeSBarry Smith } 5405c6c1daeSBarry Smith PetscFunctionReturn(0); 5415c6c1daeSBarry Smith } 542