/*@C PetscViewerDrawGetDrawAxis - Returns PetscDrawAxis object from PetscViewer object. This PetscDrawAxis object may then be used to perform graphics using PetscDrawAxisXXX() commands. Collective on PetscViewer Input Parameter: + viewer - the PetscViewer (created with PetscViewerDrawOpen() - windownumber - indicates which subwindow (usually 0) Ouput Parameter: . drawaxis - the draw axis object Level: advanced Concepts: line graph^accessing context .seealso: PetscViewerDrawGetDraw(), PetscViewerDrawGetLG(), PetscViewerDrawOpen() @*/ PetscErrorCode PetscViewerDrawGetDrawAxis(PetscViewer viewer,PetscInt windownumber,PetscDrawAxis *drawaxis) { PetscErrorCode ierr; PetscBool isdraw; PetscViewer_Draw *vdraw; PetscFunctionBegin; PetscValidHeaderSpecific(viewer,PETSC_VIEWER_CLASSID,1); PetscValidLogicalCollectiveInt(viewer,windownumber,2); PetscValidPointer(drawaxis,3); ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr); if (!isdraw) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Must be draw type PetscViewer"); if (windownumber < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Window number cannot be negative"); vdraw = (PetscViewer_Draw*)viewer->data; if (windownumber+vdraw->draw_base >= vdraw->draw_max || !vdraw->draw[windownumber+vdraw->draw_base]) { ierr = PetscViewerDrawGetDraw(viewer,windownumber,NULL);CHKERRQ(ierr); } if (!vdraw->drawaxis[windownumber+vdraw->draw_base]) { ierr = PetscDrawAxisCreate(vdraw->draw[windownumber+vdraw->draw_base],&vdraw->drawaxis[windownumber+vdraw->draw_base]);CHKERRQ(ierr); ierr = PetscLogObjectParent((PetscObject)viewer,(PetscObject)vdraw->drawaxis[windownumber+vdraw->draw_base]);CHKERRQ(ierr); } *drawaxis = vdraw->drawaxis[windownumber+vdraw->draw_base]; PetscFunctionReturn(0); }
/*@ PetscDrawLGCreate - Creates a line graph data structure. Collective over PetscDraw Input Parameters: + draw - the window where the graph will be made. - dim - the number of curves which will be drawn Output Parameters: . outctx - the line graph context Level: intermediate Concepts: line graph^creating .seealso: PetscDrawLGDestroy() @*/ PetscErrorCode PetscDrawLGCreate(PetscDraw draw,PetscInt dim,PetscDrawLG *outctx) { PetscErrorCode ierr; PetscBool isnull; PetscObject obj = (PetscObject)draw; PetscDrawLG lg; PetscFunctionBegin; PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); PetscValidPointer(outctx,2); ierr = PetscObjectTypeCompare(obj,PETSC_DRAW_NULL,&isnull);CHKERRQ(ierr); if (isnull) { ierr = PetscDrawOpenNull(((PetscObject)obj)->comm,(PetscDraw*)outctx);CHKERRQ(ierr); PetscFunctionReturn(0); } ierr = PetscHeaderCreate(lg,_p_PetscDrawLG,int,PETSC_DRAWLG_CLASSID,0,"PetscDrawLG","Line graph","Draw",((PetscObject)obj)->comm,PetscDrawLGDestroy,0);CHKERRQ(ierr); lg->view = 0; lg->destroy = 0; lg->nopts = 0; lg->win = draw; lg->dim = dim; lg->xmin = 1.e20; lg->ymin = 1.e20; lg->xmax = -1.e20; lg->ymax = -1.e20; ierr = PetscMalloc2(dim*CHUNCKSIZE,PetscReal,&lg->x,dim*CHUNCKSIZE,PetscReal,&lg->y);CHKERRQ(ierr); ierr = PetscLogObjectMemory(lg,2*dim*CHUNCKSIZE*sizeof(PetscReal));CHKERRQ(ierr); lg->len = dim*CHUNCKSIZE; lg->loc = 0; lg->use_dots= PETSC_FALSE; ierr = PetscDrawAxisCreate(draw,&lg->axis);CHKERRQ(ierr); ierr = PetscLogObjectParent(lg,lg->axis);CHKERRQ(ierr); *outctx = lg; PetscFunctionReturn(0); }
/*@C PetscDrawBarCreate - Creates a bar graph data structure. Collective over PetscDraw Input Parameters: . draw - The window where the graph will be made Output Parameters: . bar - The bar graph context Notes: Call PetscDrawBarSetData() to provide the bins to be plotted and then PetscDrawBarDraw() to display the new plot The difference between a bar chart, PetscDrawBar, and a histogram, PetscDrawHG, is explained here http://stattrek.com/statistics/charts/histogram.aspx?Tutorial=AP The MPI communicator that owns the PetscDraw owns this PetscDrawBar, but the calls to set options and add data are ignored on all processes except the zeroth MPI process in the communicator. All MPI processes in the communicator must call PetscDrawBarDraw() to display the updated graph. Level: intermediate Concepts: bar graph^creating .seealso: PetscDrawLGCreate(), PetscDrawLG, PetscDrawSPCreate(), PetscDrawSP, PetscDrawHGCreate(), PetscDrawHG, PetscDrawBarDestroy(), PetscDrawBarSetData(), PetscDrawBar, PetscDrawBarDraw(), PetscDrawBarSave(), PetscDrawBarSetColor(), PetscDrawBarSort(), PetscDrawBarSetLimits(), PetscDrawBarGetAxis(), PetscDrawAxis, PetscDrawBarGetDraw(), PetscDrawBarSetFromOptions() @*/ PetscErrorCode PetscDrawBarCreate(PetscDraw draw,PetscDrawBar *bar) { PetscDrawBar h; PetscErrorCode ierr; PetscFunctionBegin; PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); PetscValidPointer(bar,2); ierr = PetscHeaderCreate(h,PETSC_DRAWBAR_CLASSID,"DrawBar","Bar Graph","Draw",PetscObjectComm((PetscObject)draw),PetscDrawBarDestroy,NULL);CHKERRQ(ierr); ierr = PetscLogObjectParent((PetscObject)draw,(PetscObject)h);CHKERRQ(ierr); ierr = PetscObjectReference((PetscObject)draw);CHKERRQ(ierr); h->win = draw; h->view = NULL; h->destroy = NULL; h->color = PETSC_DRAW_GREEN; h->ymin = 0.; /* if user has not set these then they are determined from the data */ h->ymax = 0.; h->numBins = 0; ierr = PetscDrawAxisCreate(draw,&h->axis);CHKERRQ(ierr); h->axis->xticks = NULL; *bar = h; PetscFunctionReturn(0); }
/*@C PetscViewerDrawGetDrawAxis - Returns PetscDrawAxis object from PetscViewer object. This PetscDrawAxis object may then be used to perform graphics using PetscDrawAxisXXX() commands. Not Collective (but PetscDrawAxis object will be parallel if PetscViewer is) Input Parameter: + viewer - the PetscViewer (created with PetscViewerDrawOpen() - windownumber - indicates which subwindow (usually 0) Ouput Parameter: . drawaxis - the draw axis object Level: advanced Concepts: line graph^accessing context .seealso: PetscViewerDrawGetDraw(), PetscViewerDrawGetLG(), PetscViewerDrawOpen() @*/ PetscErrorCode PETSC_DLLEXPORT PetscViewerDrawGetDrawAxis(PetscViewer viewer,PetscInt windownumber,PetscDrawAxis *drawaxis) { PetscErrorCode ierr; PetscTruth isdraw; PetscViewer_Draw *vdraw = (PetscViewer_Draw*)viewer->data;; PetscFunctionBegin; PetscValidHeaderSpecific(viewer,PETSC_VIEWER_COOKIE,1); PetscValidPointer(drawaxis,3); ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_DRAW,&isdraw);CHKERRQ(ierr); if (!isdraw) { SETERRQ(PETSC_ERR_ARG_WRONG,"Must be draw type PetscViewer"); } if (windownumber < 0) { SETERRQ(PETSC_ERR_ARG_OUTOFRANGE,"Window number cannot be negative"); } if (windownumber+vdraw->draw_base >= vdraw->draw_max || !vdraw->draw[windownumber+vdraw->draw_base]) { ierr = PetscViewerDrawGetDraw(viewer,windownumber,PETSC_NULL);CHKERRQ(ierr); } if (!vdraw->drawaxis[windownumber+vdraw->draw_base]) { ierr = PetscDrawAxisCreate(vdraw->draw[windownumber+vdraw->draw_base],&vdraw->drawaxis[windownumber+vdraw->draw_base]);CHKERRQ(ierr); ierr = PetscLogObjectParent(viewer,vdraw->drawaxis[windownumber+vdraw->draw_base]);CHKERRQ(ierr); } *drawaxis = vdraw->drawaxis[windownumber+vdraw->draw_base]; PetscFunctionReturn(0); }
/* collective on KSP */ PetscErrorCode KSPPlotEigenContours_Private(KSP ksp,PetscInt neig,const PetscReal *r,const PetscReal *c) { PetscErrorCode ierr; PetscReal xmin,xmax,ymin,ymax,*xloc,*yloc,*value,px0,py0,rscale,iscale; PetscInt M,N,i,j; PetscMPIInt rank; PetscViewer viewer; PetscDraw draw; PetscDrawAxis drawaxis; PetscFunctionBegin; ierr = MPI_Comm_rank(((PetscObject)ksp)->comm,&rank);CHKERRQ(ierr); if (rank) PetscFunctionReturn(0); M = 80; N = 80; xmin = r[0]; xmax = r[0]; ymin = c[0]; ymax = c[0]; for (i=1; i<neig; i++) { xmin = PetscMin(xmin,r[i]); xmax = PetscMax(xmax,r[i]); ymin = PetscMin(ymin,c[i]); ymax = PetscMax(ymax,c[i]); } ierr = PetscMalloc3(M,PetscReal,&xloc,N,PetscReal,&yloc,M*N,PetscReal,&value);CHKERRQ(ierr); for (i=0; i<M; i++) xloc[i] = xmin - 0.1*(xmax-xmin) + 1.2*(xmax-xmin)*i/(M-1); for (i=0; i<N; i++) yloc[i] = ymin - 0.1*(ymax-ymin) + 1.2*(ymax-ymin)*i/(N-1); ierr = PolyEval(neig,r,c,0,0,&px0,&py0);CHKERRQ(ierr); rscale = px0/(PetscSqr(px0)+PetscSqr(py0)); iscale = -py0/(PetscSqr(px0)+PetscSqr(py0)); for (j=0; j<N; j++) { for (i=0; i<M; i++) { PetscReal px,py,tx,ty,tmod; ierr = PolyEval(neig,r,c,xloc[i],yloc[j],&px,&py);CHKERRQ(ierr); tx = px*rscale - py*iscale; ty = py*rscale + px*iscale; tmod = PetscSqr(tx) + PetscSqr(ty); /* modulus of the complex polynomial */ if (tmod > 1) tmod = 1.0; if (tmod > 0.5 && tmod < 1) tmod = 0.5; if (tmod > 0.2 && tmod < 0.5) tmod = 0.2; if (tmod > 0.05 && tmod < 0.2) tmod = 0.05; if (tmod < 1e-3) tmod = 1e-3; value[i+j*M] = PetscLogScalar(tmod) / PetscLogScalar(10.0); } } ierr = PetscViewerDrawOpen(PETSC_COMM_SELF,0,"Iteratively Computed Eigen-contours",PETSC_DECIDE,PETSC_DECIDE,450,450,&viewer);CHKERRQ(ierr); ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr); ierr = PetscDrawTensorContour(draw,M,N,PETSC_NULL,PETSC_NULL,value);CHKERRQ(ierr); if (0) { ierr = PetscDrawAxisCreate(draw,&drawaxis);CHKERRQ(ierr); ierr = PetscDrawAxisSetLimits(drawaxis,xmin,xmax,ymin,ymax);CHKERRQ(ierr); ierr = PetscDrawAxisSetLabels(drawaxis,"Eigen-counters","real","imag");CHKERRQ(ierr); ierr = PetscDrawAxisDraw(drawaxis);CHKERRQ(ierr); ierr = PetscDrawAxisDestroy(&drawaxis);CHKERRQ(ierr); } ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr); ierr = PetscFree3(xloc,yloc,value);CHKERRQ(ierr); PetscFunctionReturn(0); }
/*@C PetscDrawHGCreate - Creates a histogram data structure. Collective over PetscDraw Input Parameters: + draw - The window where the graph will be made - bins - The number of bins to use Output Parameters: . hist - The histogram context Level: intermediate Concepts: histogram^creating .seealso: PetscDrawHGDestroy() @*/ PetscErrorCode PetscDrawHGCreate(PetscDraw draw, int bins, PetscDrawHG *hist) { PetscBool isnull; PetscDrawHG h; PetscErrorCode ierr; PetscFunctionBegin; PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID,1); PetscValidLogicalCollectiveInt(draw,bins,2); PetscValidPointer(hist,3); ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr); if (isnull) {*hist = NULL; PetscFunctionReturn(0);} ierr = PetscHeaderCreate(h, PETSC_DRAWHG_CLASSID, "PetscDrawHG", "Histogram", "Draw", PetscObjectComm((PetscObject)draw), PetscDrawHGDestroy, NULL);CHKERRQ(ierr); ierr = PetscLogObjectParent((PetscObject)draw,(PetscObject)h);CHKERRQ(ierr); ierr = PetscObjectReference((PetscObject)draw);CHKERRQ(ierr); h->win = draw; h->view = NULL; h->destroy = NULL; h->color = PETSC_DRAW_GREEN; h->xmin = PETSC_MAX_REAL; h->xmax = PETSC_MIN_REAL; h->ymin = 0.; h->ymax = 1.; h->numBins = bins; h->maxBins = bins; ierr = PetscMalloc1(h->maxBins,&h->bins);CHKERRQ(ierr); h->numValues = 0; h->maxValues = CHUNKSIZE; h->calcStats = PETSC_FALSE; h->integerBins = PETSC_FALSE; ierr = PetscMalloc1(h->maxValues,&h->values);CHKERRQ(ierr); ierr = PetscLogObjectMemory((PetscObject)h,(h->maxBins + h->maxValues)*sizeof(PetscReal));CHKERRQ(ierr); ierr = PetscDrawAxisCreate(draw,&h->axis);CHKERRQ(ierr); ierr = PetscLogObjectParent((PetscObject)h,(PetscObject)h->axis);CHKERRQ(ierr); *hist = h; PetscFunctionReturn(0); }
/*@ PetscDrawLGCreate - Creates a line graph data structure. Collective on PetscDraw Input Parameters: + draw - the window where the graph will be made. - dim - the number of curves which will be drawn Output Parameters: . outlg - the line graph context Level: intermediate Notes: The MPI communicator that owns the PetscDraw owns this PetscDrawLG, but the calls to set options and add points are ignored on all processes except the zeroth MPI process in the communicator. All MPI processes in the communicator must call PetscDrawLGDraw() to display the updated graph. Concepts: line graph^creating .seealso: PetscDrawLGDestroy(), PetscDrawLGAddPoint(), PetscDrawLGAddCommonPoint(), PetscDrawLGAddPoints(), PetscDrawLGDraw(), PetscDrawLGSave(), PetscDrawLGView(), PetscDrawLGReset(), PetscDrawLGSetDimension(), PetscDrawLGGetDimension(), PetscDrawLGSetLegend(), PetscDrawLGGetAxis(), PetscDrawLGGetDraw(), PetscDrawLGSetUseMarkers(), PetscDrawLGSetLimits(), PetscDrawLGSetColors(), PetscDrawLGSetOptionsPrefix(), PetscDrawLGSetFromOptions() @*/ PetscErrorCode PetscDrawLGCreate(PetscDraw draw,PetscInt dim,PetscDrawLG *outlg) { PetscDrawLG lg; PetscErrorCode ierr; PetscFunctionBegin; PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); PetscValidLogicalCollectiveInt(draw,dim,2); PetscValidPointer(outlg,3); ierr = PetscHeaderCreate(lg,PETSC_DRAWLG_CLASSID,"DrawLG","Line Graph","Draw",PetscObjectComm((PetscObject)draw),PetscDrawLGDestroy,NULL);CHKERRQ(ierr); ierr = PetscLogObjectParent((PetscObject)draw,(PetscObject)lg);CHKERRQ(ierr); ierr = PetscDrawLGSetOptionsPrefix(lg,((PetscObject)draw)->prefix);CHKERRQ(ierr); ierr = PetscObjectReference((PetscObject)draw);CHKERRQ(ierr); lg->win = draw; lg->view = NULL; lg->destroy = NULL; lg->nopts = 0; lg->dim = dim; lg->xmin = 1.e20; lg->ymin = 1.e20; lg->xmax = -1.e20; lg->ymax = -1.e20; ierr = PetscMalloc2(dim*CHUNCKSIZE,&lg->x,dim*CHUNCKSIZE,&lg->y);CHKERRQ(ierr); ierr = PetscLogObjectMemory((PetscObject)lg,2*dim*CHUNCKSIZE*sizeof(PetscReal));CHKERRQ(ierr); lg->len = dim*CHUNCKSIZE; lg->loc = 0; lg->use_markers = PETSC_FALSE; ierr = PetscDrawAxisCreate(draw,&lg->axis);CHKERRQ(ierr); ierr = PetscLogObjectParent((PetscObject)lg,(PetscObject)lg->axis);CHKERRQ(ierr); *outlg = lg; PetscFunctionReturn(0); }
void PETSC_STDCALL petscdrawaxiscreate_(PetscDraw draw,PetscDrawAxis *axis, int *__ierr ){ *__ierr = PetscDrawAxisCreate( (PetscDraw)PetscToPointer((draw) ),axis); }