15c6c1daeSBarry Smith 25ccc9f3cSMatthew G Knepley #include <petscviewer.h> 3e118a51fSLisandro Dalcin #include <../src/sys/classes/draw/utils/lgimpl.h> /*I "petscdraw.h" I*/ 45c6c1daeSBarry Smith PetscClassId PETSC_DRAWLG_CLASSID = 0; 55c6c1daeSBarry Smith 65c6c1daeSBarry Smith /*@ 75c6c1daeSBarry Smith PetscDrawLGGetAxis - Gets the axis context associated with a line graph. 85c6c1daeSBarry Smith This is useful if one wants to change some axis property, such as 95c6c1daeSBarry Smith labels, color, etc. The axis context should not be destroyed by the 105c6c1daeSBarry Smith application code. 115c6c1daeSBarry Smith 125c6c1daeSBarry Smith Not Collective, if PetscDrawLG is parallel then PetscDrawAxis is parallel 135c6c1daeSBarry Smith 145c6c1daeSBarry Smith Input Parameter: 155c6c1daeSBarry Smith . lg - the line graph context 165c6c1daeSBarry Smith 175c6c1daeSBarry Smith Output Parameter: 185c6c1daeSBarry Smith . axis - the axis context 195c6c1daeSBarry Smith 205c6c1daeSBarry Smith Level: advanced 215c6c1daeSBarry Smith 22ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate(), PetscDrawAxis 23ba1e01c4SBarry Smith 245c6c1daeSBarry Smith @*/ 255c6c1daeSBarry Smith PetscErrorCode PetscDrawLGGetAxis(PetscDrawLG lg,PetscDrawAxis *axis) 265c6c1daeSBarry Smith { 275c6c1daeSBarry Smith PetscFunctionBegin; 28e118a51fSLisandro Dalcin PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1); 2945f3bb6eSLisandro Dalcin PetscValidPointer(axis,2); 305c6c1daeSBarry Smith *axis = lg->axis; 315c6c1daeSBarry Smith PetscFunctionReturn(0); 325c6c1daeSBarry Smith } 335c6c1daeSBarry Smith 345c6c1daeSBarry Smith /*@ 355c6c1daeSBarry Smith PetscDrawLGGetDraw - Gets the draw context associated with a line graph. 365c6c1daeSBarry Smith 375c6c1daeSBarry Smith Not Collective, if PetscDrawLG is parallel then PetscDraw is parallel 385c6c1daeSBarry Smith 395c6c1daeSBarry Smith Input Parameter: 405c6c1daeSBarry Smith . lg - the line graph context 415c6c1daeSBarry Smith 425c6c1daeSBarry Smith Output Parameter: 435c6c1daeSBarry Smith . draw - the draw context 445c6c1daeSBarry Smith 455c6c1daeSBarry Smith Level: intermediate 465c6c1daeSBarry Smith 47ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate(), PetscDraw 485c6c1daeSBarry Smith @*/ 495c6c1daeSBarry Smith PetscErrorCode PetscDrawLGGetDraw(PetscDrawLG lg,PetscDraw *draw) 505c6c1daeSBarry Smith { 515c6c1daeSBarry Smith PetscFunctionBegin; 525c6c1daeSBarry Smith PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1); 5345f3bb6eSLisandro Dalcin PetscValidPointer(draw,2); 545c6c1daeSBarry Smith *draw = lg->win; 555c6c1daeSBarry Smith PetscFunctionReturn(0); 565c6c1daeSBarry Smith } 575c6c1daeSBarry Smith 585c6c1daeSBarry Smith /*@ 595c6c1daeSBarry Smith PetscDrawLGSPDraw - Redraws a line graph. 605c6c1daeSBarry Smith 615b399a63SLisandro Dalcin Collective on PetscDrawLG 625c6c1daeSBarry Smith 635c6c1daeSBarry Smith Input Parameter: 645c6c1daeSBarry Smith . lg - the line graph context 655c6c1daeSBarry Smith 665c6c1daeSBarry Smith Level: intermediate 675c6c1daeSBarry Smith 685c6c1daeSBarry Smith .seealso: PetscDrawLGDraw(), PetscDrawSPDraw() 695c6c1daeSBarry Smith 7095452b02SPatrick Sanan Developer Notes: 7195452b02SPatrick Sanan This code cheats and uses the fact that the LG and SP structs are the same 725c6c1daeSBarry Smith 735c6c1daeSBarry Smith @*/ 745c6c1daeSBarry Smith PetscErrorCode PetscDrawLGSPDraw(PetscDrawLG lg,PetscDrawSP spin) 755c6c1daeSBarry Smith { 765c6c1daeSBarry Smith PetscDrawLG sp = (PetscDrawLG)spin; 775c6c1daeSBarry Smith PetscReal xmin,xmax,ymin,ymax; 785c6c1daeSBarry Smith PetscErrorCode ierr; 79e118a51fSLisandro Dalcin PetscBool isnull; 80e118a51fSLisandro Dalcin PetscMPIInt rank; 81e118a51fSLisandro Dalcin PetscDraw draw; 825c6c1daeSBarry Smith 835c6c1daeSBarry Smith PetscFunctionBegin; 845c6c1daeSBarry Smith PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1); 85064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(sp,PETSC_DRAWLG_CLASSID,2); 865b399a63SLisandro Dalcin ierr = PetscDrawIsNull(lg->win,&isnull);CHKERRQ(ierr); 87e118a51fSLisandro Dalcin if (isnull) PetscFunctionReturn(0); 88ffc4695bSBarry Smith ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)lg),&rank);CHKERRMPI(ierr); 895c6c1daeSBarry Smith 905b399a63SLisandro Dalcin draw = lg->win; 91e118a51fSLisandro Dalcin ierr = PetscDrawCheckResizedWindow(draw);CHKERRQ(ierr); 925b399a63SLisandro Dalcin ierr = PetscDrawClear(draw);CHKERRQ(ierr); 93e118a51fSLisandro Dalcin 94e118a51fSLisandro Dalcin xmin = PetscMin(lg->xmin,sp->xmin); ymin = PetscMin(lg->ymin,sp->ymin); 95e118a51fSLisandro Dalcin xmax = PetscMax(lg->xmax,sp->xmax); ymax = PetscMax(lg->ymax,sp->ymax); 965c6c1daeSBarry Smith ierr = PetscDrawAxisSetLimits(lg->axis,xmin,xmax,ymin,ymax);CHKERRQ(ierr); 975c6c1daeSBarry Smith ierr = PetscDrawAxisDraw(lg->axis);CHKERRQ(ierr); 985c6c1daeSBarry Smith 995b399a63SLisandro Dalcin ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr); 1005c6c1daeSBarry Smith if (!rank) { 101e118a51fSLisandro Dalcin int i,j,dim,nopts; 1025c6c1daeSBarry Smith dim = lg->dim; 1035c6c1daeSBarry Smith nopts = lg->nopts; 1045c6c1daeSBarry Smith for (i=0; i<dim; i++) { 1055c6c1daeSBarry Smith for (j=1; j<nopts; j++) { 1065c6c1daeSBarry Smith ierr = PetscDrawLine(draw,lg->x[(j-1)*dim+i],lg->y[(j-1)*dim+i],lg->x[j*dim+i],lg->y[j*dim+i],PETSC_DRAW_BLACK+i);CHKERRQ(ierr); 107b6fe0379SLisandro Dalcin if (lg->use_markers) { 10878e9f83eSLisandro Dalcin ierr = PetscDrawMarker(draw,lg->x[j*dim+i],lg->y[j*dim+i],PETSC_DRAW_RED);CHKERRQ(ierr); 1095c6c1daeSBarry Smith } 1105c6c1daeSBarry Smith } 1115c6c1daeSBarry Smith } 1125c6c1daeSBarry Smith dim = sp->dim; 1135c6c1daeSBarry Smith nopts = sp->nopts; 1145c6c1daeSBarry Smith for (i=0; i<dim; i++) { 1155c6c1daeSBarry Smith for (j=0; j<nopts; j++) { 11678e9f83eSLisandro Dalcin ierr = PetscDrawMarker(draw,sp->x[j*dim+i],sp->y[j*dim+i],PETSC_DRAW_RED);CHKERRQ(ierr); 1175c6c1daeSBarry Smith } 1185c6c1daeSBarry Smith } 1195c6c1daeSBarry Smith } 120e118a51fSLisandro Dalcin ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr); 1215b399a63SLisandro Dalcin 1225b399a63SLisandro Dalcin ierr = PetscDrawFlush(draw);CHKERRQ(ierr); 1235b399a63SLisandro Dalcin ierr = PetscDrawPause(draw);CHKERRQ(ierr); 1245c6c1daeSBarry Smith PetscFunctionReturn(0); 1255c6c1daeSBarry Smith } 1265c6c1daeSBarry Smith 1275c6c1daeSBarry Smith /*@ 1285c6c1daeSBarry Smith PetscDrawLGCreate - Creates a line graph data structure. 1295c6c1daeSBarry Smith 1305b399a63SLisandro Dalcin Collective on PetscDraw 1315c6c1daeSBarry Smith 1325c6c1daeSBarry Smith Input Parameters: 1335c6c1daeSBarry Smith + draw - the window where the graph will be made. 1345c6c1daeSBarry Smith - dim - the number of curves which will be drawn 1355c6c1daeSBarry Smith 1365c6c1daeSBarry Smith Output Parameters: 137e118a51fSLisandro Dalcin . outlg - the line graph context 1385c6c1daeSBarry Smith 1395c6c1daeSBarry Smith Level: intermediate 1405c6c1daeSBarry Smith 14195452b02SPatrick Sanan Notes: 14295452b02SPatrick Sanan 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 1437e25d57eSBarry Smith zeroth MPI process in the communicator. All MPI processes in the communicator must call PetscDrawLGDraw() to display the updated graph. 1447e25d57eSBarry Smith 145ba1e01c4SBarry Smith .seealso: PetscDrawLGDestroy(), PetscDrawLGAddPoint(), PetscDrawLGAddCommonPoint(), PetscDrawLGAddPoints(), PetscDrawLGDraw(), PetscDrawLGSave(), 146ba1e01c4SBarry Smith PetscDrawLGView(), PetscDrawLGReset(), PetscDrawLGSetDimension(), PetscDrawLGGetDimension(), PetscDrawLGSetLegend(), PetscDrawLGGetAxis(), 147ba1e01c4SBarry Smith PetscDrawLGGetDraw(), PetscDrawLGSetUseMarkers(), PetscDrawLGSetLimits(), PetscDrawLGSetColors(), PetscDrawLGSetOptionsPrefix(), PetscDrawLGSetFromOptions() 1485c6c1daeSBarry Smith @*/ 149e118a51fSLisandro Dalcin PetscErrorCode PetscDrawLGCreate(PetscDraw draw,PetscInt dim,PetscDrawLG *outlg) 1505c6c1daeSBarry Smith { 1515c6c1daeSBarry Smith PetscDrawLG lg; 152e118a51fSLisandro Dalcin PetscErrorCode ierr; 1535c6c1daeSBarry Smith 1545c6c1daeSBarry Smith PetscFunctionBegin; 1555c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 156e118a51fSLisandro Dalcin PetscValidLogicalCollectiveInt(draw,dim,2); 157e118a51fSLisandro Dalcin PetscValidPointer(outlg,3); 158e118a51fSLisandro Dalcin 15971917b75SLisandro Dalcin ierr = PetscHeaderCreate(lg,PETSC_DRAWLG_CLASSID,"DrawLG","Line Graph","Draw",PetscObjectComm((PetscObject)draw),PetscDrawLGDestroy,NULL);CHKERRQ(ierr); 160e118a51fSLisandro Dalcin ierr = PetscLogObjectParent((PetscObject)draw,(PetscObject)lg);CHKERRQ(ierr); 161c2bac407SLisandro Dalcin ierr = PetscDrawLGSetOptionsPrefix(lg,((PetscObject)draw)->prefix);CHKERRQ(ierr); 162e118a51fSLisandro Dalcin 163e118a51fSLisandro Dalcin ierr = PetscObjectReference((PetscObject)draw);CHKERRQ(ierr); 164e118a51fSLisandro Dalcin lg->win = draw; 165a297a907SKarl Rupp 16669c83917SLisandro Dalcin lg->view = NULL; 16769c83917SLisandro Dalcin lg->destroy = NULL; 1685c6c1daeSBarry Smith lg->nopts = 0; 1695c6c1daeSBarry Smith lg->dim = dim; 1705c6c1daeSBarry Smith lg->xmin = 1.e20; 1715c6c1daeSBarry Smith lg->ymin = 1.e20; 1725c6c1daeSBarry Smith lg->xmax = -1.e20; 1735c6c1daeSBarry Smith lg->ymax = -1.e20; 174a297a907SKarl Rupp 175dcca6d9dSJed Brown ierr = PetscMalloc2(dim*CHUNCKSIZE,&lg->x,dim*CHUNCKSIZE,&lg->y);CHKERRQ(ierr); 1763bb1ff40SBarry Smith ierr = PetscLogObjectMemory((PetscObject)lg,2*dim*CHUNCKSIZE*sizeof(PetscReal));CHKERRQ(ierr); 177a297a907SKarl Rupp 1785c6c1daeSBarry Smith lg->len = dim*CHUNCKSIZE; 1795c6c1daeSBarry Smith lg->loc = 0; 180b6fe0379SLisandro Dalcin lg->use_markers = PETSC_FALSE; 181a297a907SKarl Rupp 1825c6c1daeSBarry Smith ierr = PetscDrawAxisCreate(draw,&lg->axis);CHKERRQ(ierr); 1833bb1ff40SBarry Smith ierr = PetscLogObjectParent((PetscObject)lg,(PetscObject)lg->axis);CHKERRQ(ierr); 184a297a907SKarl Rupp 185e118a51fSLisandro Dalcin *outlg = lg; 1865c6c1daeSBarry Smith PetscFunctionReturn(0); 1875c6c1daeSBarry Smith } 1885c6c1daeSBarry Smith 1895c6c1daeSBarry Smith /*@ 1905c6c1daeSBarry Smith PetscDrawLGSetColors - Sets the color of each line graph drawn 1915c6c1daeSBarry Smith 1925b399a63SLisandro Dalcin Logically Collective on PetscDrawLG 1935c6c1daeSBarry Smith 194*d8d19677SJose E. Roman Input Parameters: 1955c6c1daeSBarry Smith + lg - the line graph context. 1965c6c1daeSBarry Smith - colors - the colors 1975c6c1daeSBarry Smith 1985c6c1daeSBarry Smith Level: intermediate 1995c6c1daeSBarry Smith 200ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate() 201ba1e01c4SBarry Smith 2025c6c1daeSBarry Smith @*/ 20345f3bb6eSLisandro Dalcin PetscErrorCode PetscDrawLGSetColors(PetscDrawLG lg,const int colors[]) 2045c6c1daeSBarry Smith { 2055c6c1daeSBarry Smith PetscErrorCode ierr; 2065c6c1daeSBarry Smith 2075c6c1daeSBarry Smith PetscFunctionBegin; 2085c6c1daeSBarry Smith PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1); 20945f3bb6eSLisandro Dalcin if (lg->dim) PetscValidIntPointer(colors,2); 210e118a51fSLisandro Dalcin 2115c6c1daeSBarry Smith ierr = PetscFree(lg->colors);CHKERRQ(ierr); 212785e854fSJed Brown ierr = PetscMalloc1(lg->dim,&lg->colors);CHKERRQ(ierr); 213580bdb30SBarry Smith ierr = PetscArraycpy(lg->colors,colors,lg->dim);CHKERRQ(ierr); 2145c6c1daeSBarry Smith PetscFunctionReturn(0); 2155c6c1daeSBarry Smith } 2165c6c1daeSBarry Smith 2175c6c1daeSBarry Smith /*@C 2185c6c1daeSBarry Smith PetscDrawLGSetLegend - sets the names of each curve plotted 2195c6c1daeSBarry Smith 2205b399a63SLisandro Dalcin Logically Collective on PetscDrawLG 2215c6c1daeSBarry Smith 222*d8d19677SJose E. Roman Input Parameters: 2235c6c1daeSBarry Smith + lg - the line graph context. 2245c6c1daeSBarry Smith - names - the names for each curve 2255c6c1daeSBarry Smith 2265c6c1daeSBarry Smith Level: intermediate 2275c6c1daeSBarry Smith 22895452b02SPatrick Sanan Notes: 22995452b02SPatrick Sanan Call PetscDrawLGGetAxis() and then change properties of the PetscDrawAxis for detailed control of the plot 230ba1e01c4SBarry Smith 231ba1e01c4SBarry Smith .seealso: PetscDrawLGGetAxis(), PetscDrawAxis, PetscDrawAxisSetColors(), PetscDrawAxisSetLabels(), PetscDrawAxisSetHoldLimits() 232ba1e01c4SBarry Smith 2335c6c1daeSBarry Smith @*/ 2345c6c1daeSBarry Smith PetscErrorCode PetscDrawLGSetLegend(PetscDrawLG lg,const char *const *names) 2355c6c1daeSBarry Smith { 2365c6c1daeSBarry Smith PetscErrorCode ierr; 2375c6c1daeSBarry Smith PetscInt i; 2385c6c1daeSBarry Smith 2395c6c1daeSBarry Smith PetscFunctionBegin; 2405c6c1daeSBarry Smith PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1); 24145f3bb6eSLisandro Dalcin if (names) PetscValidPointer(names,2); 2425c6c1daeSBarry Smith 2435c6c1daeSBarry Smith if (lg->legend) { 2445c6c1daeSBarry Smith for (i=0; i<lg->dim; i++) { 2455c6c1daeSBarry Smith ierr = PetscFree(lg->legend[i]);CHKERRQ(ierr); 2465c6c1daeSBarry Smith } 2475c6c1daeSBarry Smith ierr = PetscFree(lg->legend);CHKERRQ(ierr); 2485c6c1daeSBarry Smith } 2495c6c1daeSBarry Smith if (names) { 250785e854fSJed Brown ierr = PetscMalloc1(lg->dim,&lg->legend);CHKERRQ(ierr); 2515c6c1daeSBarry Smith for (i=0; i<lg->dim; i++) { 2525c6c1daeSBarry Smith ierr = PetscStrallocpy(names[i],&lg->legend[i]);CHKERRQ(ierr); 2535c6c1daeSBarry Smith } 2545c6c1daeSBarry Smith } 2555c6c1daeSBarry Smith PetscFunctionReturn(0); 2565c6c1daeSBarry Smith } 2575c6c1daeSBarry Smith 2585c6c1daeSBarry Smith /*@ 2595c6c1daeSBarry Smith PetscDrawLGGetDimension - Change the number of lines that are to be drawn. 2605c6c1daeSBarry Smith 2615b399a63SLisandro Dalcin Not Collective 2625c6c1daeSBarry Smith 2635c6c1daeSBarry Smith Input Parameter: 2645c6c1daeSBarry Smith . lg - the line graph context. 2655c6c1daeSBarry Smith 2665c6c1daeSBarry Smith Output Parameter: 2675c6c1daeSBarry Smith . dim - the number of curves. 2685c6c1daeSBarry Smith 2695c6c1daeSBarry Smith Level: intermediate 2705c6c1daeSBarry Smith 271ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate(), PetscDrawLGSetDimension() 272ba1e01c4SBarry Smith 2735c6c1daeSBarry Smith @*/ 2745c6c1daeSBarry Smith PetscErrorCode PetscDrawLGGetDimension(PetscDrawLG lg,PetscInt *dim) 2755c6c1daeSBarry Smith { 2765c6c1daeSBarry Smith PetscFunctionBegin; 2775c6c1daeSBarry Smith PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1); 27845f3bb6eSLisandro Dalcin PetscValidIntPointer(dim,2); 2795c6c1daeSBarry Smith *dim = lg->dim; 2805c6c1daeSBarry Smith PetscFunctionReturn(0); 2815c6c1daeSBarry Smith } 2825c6c1daeSBarry Smith 2835c6c1daeSBarry Smith /*@ 2845c6c1daeSBarry Smith PetscDrawLGSetDimension - Change the number of lines that are to be drawn. 2855c6c1daeSBarry Smith 2865b399a63SLisandro Dalcin Logically Collective on PetscDrawLG 2875c6c1daeSBarry Smith 288*d8d19677SJose E. Roman Input Parameters: 2895c6c1daeSBarry Smith + lg - the line graph context. 2905c6c1daeSBarry Smith - dim - the number of curves. 2915c6c1daeSBarry Smith 2925c6c1daeSBarry Smith Level: intermediate 2935c6c1daeSBarry Smith 294ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate(), PetscDrawLGGetDimension() 2955c6c1daeSBarry Smith @*/ 2965c6c1daeSBarry Smith PetscErrorCode PetscDrawLGSetDimension(PetscDrawLG lg,PetscInt dim) 2975c6c1daeSBarry Smith { 2985c6c1daeSBarry Smith PetscErrorCode ierr; 2995c6c1daeSBarry Smith PetscInt i; 3005c6c1daeSBarry Smith 3015c6c1daeSBarry Smith PetscFunctionBegin; 3025c6c1daeSBarry Smith PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1); 3035c6c1daeSBarry Smith PetscValidLogicalCollectiveInt(lg,dim,2); 3045c6c1daeSBarry Smith if (lg->dim == dim) PetscFunctionReturn(0); 3055c6c1daeSBarry Smith 3065c6c1daeSBarry Smith ierr = PetscFree2(lg->x,lg->y);CHKERRQ(ierr); 3075c6c1daeSBarry Smith if (lg->legend) { 3085c6c1daeSBarry Smith for (i=0; i<lg->dim; i++) { 3095c6c1daeSBarry Smith ierr = PetscFree(lg->legend[i]);CHKERRQ(ierr); 3105c6c1daeSBarry Smith } 3115c6c1daeSBarry Smith ierr = PetscFree(lg->legend);CHKERRQ(ierr); 3125c6c1daeSBarry Smith } 3135c6c1daeSBarry Smith ierr = PetscFree(lg->colors);CHKERRQ(ierr); 3145c6c1daeSBarry Smith lg->dim = dim; 315dcca6d9dSJed Brown ierr = PetscMalloc2(dim*CHUNCKSIZE,&lg->x,dim*CHUNCKSIZE,&lg->y);CHKERRQ(ierr); 3163bb1ff40SBarry Smith ierr = PetscLogObjectMemory((PetscObject)lg,2*dim*CHUNCKSIZE*sizeof(PetscReal));CHKERRQ(ierr); 3175c6c1daeSBarry Smith lg->len = dim*CHUNCKSIZE; 3185c6c1daeSBarry Smith PetscFunctionReturn(0); 3195c6c1daeSBarry Smith } 3205c6c1daeSBarry Smith 32171917b75SLisandro Dalcin /*@ 32271917b75SLisandro Dalcin PetscDrawLGSetLimits - Sets the axis limits for a line graph. If more 32371917b75SLisandro Dalcin points are added after this call, the limits will be adjusted to 32471917b75SLisandro Dalcin include those additional points. 32571917b75SLisandro Dalcin 32671917b75SLisandro Dalcin Logically Collective on PetscDrawLG 32771917b75SLisandro Dalcin 32871917b75SLisandro Dalcin Input Parameters: 32971917b75SLisandro Dalcin + xlg - the line graph context 33071917b75SLisandro Dalcin - x_min,x_max,y_min,y_max - the limits 33171917b75SLisandro Dalcin 33271917b75SLisandro Dalcin Level: intermediate 33371917b75SLisandro Dalcin 334ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate() 335ba1e01c4SBarry Smith 33671917b75SLisandro Dalcin @*/ 33771917b75SLisandro Dalcin PetscErrorCode PetscDrawLGSetLimits(PetscDrawLG lg,PetscReal x_min,PetscReal x_max,PetscReal y_min,PetscReal y_max) 33871917b75SLisandro Dalcin { 33971917b75SLisandro Dalcin PetscFunctionBegin; 34071917b75SLisandro Dalcin PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1); 34171917b75SLisandro Dalcin 34271917b75SLisandro Dalcin (lg)->xmin = x_min; 34371917b75SLisandro Dalcin (lg)->xmax = x_max; 34471917b75SLisandro Dalcin (lg)->ymin = y_min; 34571917b75SLisandro Dalcin (lg)->ymax = y_max; 34671917b75SLisandro Dalcin PetscFunctionReturn(0); 34771917b75SLisandro Dalcin } 34871917b75SLisandro Dalcin 3495c6c1daeSBarry Smith /*@ 3505c6c1daeSBarry Smith PetscDrawLGReset - Clears line graph to allow for reuse with new data. 3515c6c1daeSBarry Smith 3525b399a63SLisandro Dalcin Logically Collective on PetscDrawLG 3535c6c1daeSBarry Smith 3545c6c1daeSBarry Smith Input Parameter: 3555c6c1daeSBarry Smith . lg - the line graph context. 3565c6c1daeSBarry Smith 3575c6c1daeSBarry Smith Level: intermediate 3585c6c1daeSBarry Smith 359ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate() 3605c6c1daeSBarry Smith @*/ 3615c6c1daeSBarry Smith PetscErrorCode PetscDrawLGReset(PetscDrawLG lg) 3625c6c1daeSBarry Smith { 3635c6c1daeSBarry Smith PetscFunctionBegin; 3645c6c1daeSBarry Smith PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1); 3655c6c1daeSBarry Smith lg->xmin = 1.e20; 3665c6c1daeSBarry Smith lg->ymin = 1.e20; 3675c6c1daeSBarry Smith lg->xmax = -1.e20; 3685c6c1daeSBarry Smith lg->ymax = -1.e20; 3695c6c1daeSBarry Smith lg->loc = 0; 3705c6c1daeSBarry Smith lg->nopts = 0; 3715c6c1daeSBarry Smith PetscFunctionReturn(0); 3725c6c1daeSBarry Smith } 3735c6c1daeSBarry Smith 3745c6c1daeSBarry Smith /*@ 3755c6c1daeSBarry Smith PetscDrawLGDestroy - Frees all space taken up by line graph data structure. 3765c6c1daeSBarry Smith 3775b399a63SLisandro Dalcin Collective on PetscDrawLG 3785c6c1daeSBarry Smith 3795c6c1daeSBarry Smith Input Parameter: 3805c6c1daeSBarry Smith . lg - the line graph context 3815c6c1daeSBarry Smith 3825c6c1daeSBarry Smith Level: intermediate 3835c6c1daeSBarry Smith 3845c6c1daeSBarry Smith .seealso: PetscDrawLGCreate() 3855c6c1daeSBarry Smith @*/ 3865c6c1daeSBarry Smith PetscErrorCode PetscDrawLGDestroy(PetscDrawLG *lg) 3875c6c1daeSBarry Smith { 3885c6c1daeSBarry Smith PetscErrorCode ierr; 3895c6c1daeSBarry Smith PetscInt i; 3905c6c1daeSBarry Smith 3915c6c1daeSBarry Smith PetscFunctionBegin; 3925c6c1daeSBarry Smith if (!*lg) PetscFunctionReturn(0); 393e118a51fSLisandro Dalcin PetscValidHeaderSpecific(*lg,PETSC_DRAWLG_CLASSID,1); 394e118a51fSLisandro Dalcin if (--((PetscObject)(*lg))->refct > 0) {*lg = NULL; PetscFunctionReturn(0);} 3955c6c1daeSBarry Smith 3965c6c1daeSBarry Smith if ((*lg)->legend) { 3975c6c1daeSBarry Smith for (i=0; i<(*lg)->dim; i++) { 3985c6c1daeSBarry Smith ierr = PetscFree((*lg)->legend[i]);CHKERRQ(ierr); 3995c6c1daeSBarry Smith } 4005c6c1daeSBarry Smith ierr = PetscFree((*lg)->legend);CHKERRQ(ierr); 4015c6c1daeSBarry Smith } 4025c6c1daeSBarry Smith ierr = PetscFree((*lg)->colors);CHKERRQ(ierr); 4035c6c1daeSBarry Smith ierr = PetscFree2((*lg)->x,(*lg)->y);CHKERRQ(ierr); 404e118a51fSLisandro Dalcin ierr = PetscDrawAxisDestroy(&(*lg)->axis);CHKERRQ(ierr); 405e118a51fSLisandro Dalcin ierr = PetscDrawDestroy(&(*lg)->win);CHKERRQ(ierr); 4065c6c1daeSBarry Smith ierr = PetscHeaderDestroy(lg);CHKERRQ(ierr); 4075c6c1daeSBarry Smith PetscFunctionReturn(0); 4085c6c1daeSBarry Smith } 4095c6c1daeSBarry Smith /*@ 410b6fe0379SLisandro Dalcin PetscDrawLGSetUseMarkers - Causes LG to draw a marker for each data-point. 4115c6c1daeSBarry Smith 4125b399a63SLisandro Dalcin Logically Collective on PetscDrawLG 4135c6c1daeSBarry Smith 4145c6c1daeSBarry Smith Input Parameters: 415287de1a7SBarry Smith + lg - the linegraph context 416287de1a7SBarry Smith - flg - should mark each data point 417287de1a7SBarry Smith 418287de1a7SBarry Smith Options Database: 41910699b91SBarry Smith . -lg_use_markers <true,false> - true means the graphPetscDrawLG draws a marker for each point 4205c6c1daeSBarry Smith 4215c6c1daeSBarry Smith Level: intermediate 4225c6c1daeSBarry Smith 423ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate() 4245c6c1daeSBarry Smith @*/ 425b6fe0379SLisandro Dalcin PetscErrorCode PetscDrawLGSetUseMarkers(PetscDrawLG lg,PetscBool flg) 4265c6c1daeSBarry Smith { 4275c6c1daeSBarry Smith PetscFunctionBegin; 428e118a51fSLisandro Dalcin PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1); 42945f3bb6eSLisandro Dalcin PetscValidLogicalCollectiveBool(lg,flg,2); 430b6fe0379SLisandro Dalcin lg->use_markers = flg; 4315c6c1daeSBarry Smith PetscFunctionReturn(0); 4325c6c1daeSBarry Smith } 4335c6c1daeSBarry Smith 4345c6c1daeSBarry Smith /*@ 4355c6c1daeSBarry Smith PetscDrawLGDraw - Redraws a line graph. 4365c6c1daeSBarry Smith 4375b399a63SLisandro Dalcin Collective on PetscDrawLG 4385c6c1daeSBarry Smith 4395c6c1daeSBarry Smith Input Parameter: 4405c6c1daeSBarry Smith . lg - the line graph context 4415c6c1daeSBarry Smith 4425c6c1daeSBarry Smith Level: intermediate 4435c6c1daeSBarry Smith 444ba1e01c4SBarry Smith .seealso: PetscDrawSPDraw(), PetscDrawLGSPDraw(), PetscDrawLGReset() 4455c6c1daeSBarry Smith @*/ 4465c6c1daeSBarry Smith PetscErrorCode PetscDrawLGDraw(PetscDrawLG lg) 4475c6c1daeSBarry Smith { 448e118a51fSLisandro Dalcin PetscReal xmin,xmax,ymin,ymax; 4495c6c1daeSBarry Smith PetscErrorCode ierr; 450e118a51fSLisandro Dalcin PetscMPIInt rank; 451e118a51fSLisandro Dalcin PetscDraw draw; 4525c6c1daeSBarry Smith PetscBool isnull; 4535c6c1daeSBarry Smith 4545c6c1daeSBarry Smith PetscFunctionBegin; 4555c6c1daeSBarry Smith PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1); 4568f69470aSLisandro Dalcin ierr = PetscDrawIsNull(lg->win,&isnull);CHKERRQ(ierr); 4578f69470aSLisandro Dalcin if (isnull) PetscFunctionReturn(0); 458ffc4695bSBarry Smith ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)lg),&rank);CHKERRMPI(ierr); 4595c6c1daeSBarry Smith 4605b399a63SLisandro Dalcin draw = lg->win; 4615c6c1daeSBarry Smith ierr = PetscDrawCheckResizedWindow(draw);CHKERRQ(ierr); 4625b399a63SLisandro Dalcin ierr = PetscDrawClear(draw);CHKERRQ(ierr); 463e118a51fSLisandro Dalcin 464e118a51fSLisandro Dalcin xmin = lg->xmin; xmax = lg->xmax; ymin = lg->ymin; ymax = lg->ymax; 4655c6c1daeSBarry Smith ierr = PetscDrawAxisSetLimits(lg->axis,xmin,xmax,ymin,ymax);CHKERRQ(ierr); 4665c6c1daeSBarry Smith ierr = PetscDrawAxisDraw(lg->axis);CHKERRQ(ierr); 4675c6c1daeSBarry Smith 4685b399a63SLisandro Dalcin ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr); 4695c6c1daeSBarry Smith if (!rank) { 470e118a51fSLisandro Dalcin int i,j,dim=lg->dim,nopts=lg->nopts,cl; 4715c6c1daeSBarry Smith for (i=0; i<dim; i++) { 4725c6c1daeSBarry Smith for (j=1; j<nopts; j++) { 4730ed3bfb6SBarry Smith cl = lg->colors ? lg->colors[i] : ((PETSC_DRAW_BLACK + i) % PETSC_DRAW_MAXCOLOR); 4745c6c1daeSBarry Smith ierr = PetscDrawLine(draw,lg->x[(j-1)*dim+i],lg->y[(j-1)*dim+i],lg->x[j*dim+i],lg->y[j*dim+i],cl);CHKERRQ(ierr); 47571917b75SLisandro Dalcin if (lg->use_markers) {ierr = PetscDrawMarker(draw,lg->x[j*dim+i],lg->y[j*dim+i],cl);CHKERRQ(ierr);} 4765c6c1daeSBarry Smith } 4775c6c1daeSBarry Smith } 4785c6c1daeSBarry Smith } 47956a02f31SLisandro Dalcin if (!rank && lg->legend) { 480e118a51fSLisandro Dalcin int i,dim=lg->dim,cl; 4815c6c1daeSBarry Smith PetscReal xl,yl,xr,yr,tw,th; 48271917b75SLisandro Dalcin size_t slen,len=0; 48371917b75SLisandro Dalcin ierr = PetscDrawAxisGetLimits(lg->axis,&xl,&xr,&yl,&yr);CHKERRQ(ierr); 4845c6c1daeSBarry Smith ierr = PetscDrawStringGetSize(draw,&tw,&th);CHKERRQ(ierr); 4855c6c1daeSBarry Smith for (i=0; i<dim; i++) { 48671917b75SLisandro Dalcin ierr = PetscStrlen(lg->legend[i],&slen);CHKERRQ(ierr); 48771917b75SLisandro Dalcin len = PetscMax(len,slen); 4885c6c1daeSBarry Smith } 48971917b75SLisandro Dalcin xr = xr - 1.5*tw; xl = xr - (len + 7)*tw; 49071917b75SLisandro Dalcin yr = yr - 1.0*th; yl = yr - (dim + 1)*th; 49171917b75SLisandro Dalcin ierr = PetscDrawLine(draw,xl,yl,xr,yl,PETSC_DRAW_BLACK);CHKERRQ(ierr); 49271917b75SLisandro Dalcin ierr = PetscDrawLine(draw,xr,yl,xr,yr,PETSC_DRAW_BLACK);CHKERRQ(ierr); 49371917b75SLisandro Dalcin ierr = PetscDrawLine(draw,xr,yr,xl,yr,PETSC_DRAW_BLACK);CHKERRQ(ierr); 49471917b75SLisandro Dalcin ierr = PetscDrawLine(draw,xl,yr,xl,yl,PETSC_DRAW_BLACK);CHKERRQ(ierr); 4955c6c1daeSBarry Smith for (i=0; i<dim; i++) { 49671917b75SLisandro Dalcin cl = lg->colors ? lg->colors[i] : (PETSC_DRAW_BLACK + i); 49771917b75SLisandro Dalcin ierr = PetscDrawLine(draw,xl + 1*tw,yr - (i + 1)*th,xl + 5*tw,yr - (i + 1)*th,cl);CHKERRQ(ierr); 49871917b75SLisandro Dalcin ierr = PetscDrawString(draw,xl + 6*tw,yr - (i + 1.5)*th,PETSC_DRAW_BLACK,lg->legend[i]);CHKERRQ(ierr); 4995c6c1daeSBarry Smith } 5005c6c1daeSBarry Smith } 501e118a51fSLisandro Dalcin ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr); 5025b399a63SLisandro Dalcin 5035b399a63SLisandro Dalcin ierr = PetscDrawFlush(draw);CHKERRQ(ierr); 504e118a51fSLisandro Dalcin ierr = PetscDrawPause(draw);CHKERRQ(ierr); 5055c6c1daeSBarry Smith PetscFunctionReturn(0); 5065c6c1daeSBarry Smith } 5075c6c1daeSBarry Smith 50857fd6651SLisandro Dalcin /*@ 50957fd6651SLisandro Dalcin PetscDrawLGSave - Saves a drawn image 51057fd6651SLisandro Dalcin 51157fd6651SLisandro Dalcin Collective on PetscDrawLG 51257fd6651SLisandro Dalcin 51357fd6651SLisandro Dalcin Input Parameter: 51457fd6651SLisandro Dalcin . lg - The line graph context 51557fd6651SLisandro Dalcin 51657fd6651SLisandro Dalcin Level: intermediate 51757fd6651SLisandro Dalcin 51857fd6651SLisandro Dalcin .seealso: PetscDrawLGCreate(), PetscDrawLGGetDraw(), PetscDrawSetSave(), PetscDrawSave() 51957fd6651SLisandro Dalcin @*/ 52057fd6651SLisandro Dalcin PetscErrorCode PetscDrawLGSave(PetscDrawLG lg) 52157fd6651SLisandro Dalcin { 52257fd6651SLisandro Dalcin PetscErrorCode ierr; 52357fd6651SLisandro Dalcin 52457fd6651SLisandro Dalcin PetscFunctionBegin; 52557fd6651SLisandro Dalcin PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1); 52657fd6651SLisandro Dalcin ierr = PetscDrawSave(lg->win);CHKERRQ(ierr); 52757fd6651SLisandro Dalcin PetscFunctionReturn(0); 52857fd6651SLisandro Dalcin } 52957fd6651SLisandro Dalcin 5305c6c1daeSBarry Smith /*@ 53134a5a0e3SBarry Smith PetscDrawLGView - Prints a line graph. 5325c6c1daeSBarry Smith 5335b399a63SLisandro Dalcin Collective on PetscDrawLG 5345c6c1daeSBarry Smith 5355c6c1daeSBarry Smith Input Parameter: 5365c6c1daeSBarry Smith . lg - the line graph context 5375c6c1daeSBarry Smith 5385c6c1daeSBarry Smith Level: beginner 5395c6c1daeSBarry Smith 540ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate() 541ba1e01c4SBarry Smith 5425c6c1daeSBarry Smith @*/ 54334a5a0e3SBarry Smith PetscErrorCode PetscDrawLGView(PetscDrawLG lg,PetscViewer viewer) 5445c6c1daeSBarry Smith { 5455c6c1daeSBarry Smith PetscReal xmin=lg->xmin, xmax=lg->xmax, ymin=lg->ymin, ymax=lg->ymax; 54634a5a0e3SBarry Smith PetscInt i, j, dim = lg->dim, nopts = lg->nopts; 54734a5a0e3SBarry Smith PetscErrorCode ierr; 5485c6c1daeSBarry Smith 5495c6c1daeSBarry Smith PetscFunctionBegin; 5505c6c1daeSBarry Smith PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1); 551e118a51fSLisandro Dalcin 5525c6c1daeSBarry Smith if (nopts < 1) PetscFunctionReturn(0); 5535c6c1daeSBarry Smith if (xmin > xmax || ymin > ymax) PetscFunctionReturn(0); 5545c6c1daeSBarry Smith 55534a5a0e3SBarry Smith if (!viewer) { 55634a5a0e3SBarry Smith ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)lg),&viewer);CHKERRQ(ierr); 55734a5a0e3SBarry Smith } 55898c3331eSBarry Smith ierr = PetscObjectPrintClassNamePrefixType((PetscObject)lg,viewer);CHKERRQ(ierr); 5595c6c1daeSBarry Smith for (i = 0; i < dim; i++) { 56034a5a0e3SBarry Smith ierr = PetscViewerASCIIPrintf(viewer, "Line %D>\n", i);CHKERRQ(ierr); 5615c6c1daeSBarry Smith for (j = 0; j < nopts; j++) { 56234a5a0e3SBarry Smith ierr = PetscViewerASCIIPrintf(viewer, " X: %g Y: %g\n", (double)lg->x[j*dim+i], (double)lg->y[j*dim+i]);CHKERRQ(ierr); 5635c6c1daeSBarry Smith } 5645c6c1daeSBarry Smith } 5655c6c1daeSBarry Smith PetscFunctionReturn(0); 5665c6c1daeSBarry Smith } 567287de1a7SBarry Smith 568c2bac407SLisandro Dalcin /*@C 569c2bac407SLisandro Dalcin PetscDrawLGSetOptionsPrefix - Sets the prefix used for searching for all 570c2bac407SLisandro Dalcin PetscDrawLG options in the database. 571c2bac407SLisandro Dalcin 572c2bac407SLisandro Dalcin Logically Collective on PetscDrawLG 573c2bac407SLisandro Dalcin 574*d8d19677SJose E. Roman Input Parameters: 575c2bac407SLisandro Dalcin + lg - the line graph context 576c2bac407SLisandro Dalcin - prefix - the prefix to prepend to all option names 577c2bac407SLisandro Dalcin 578c2bac407SLisandro Dalcin Level: advanced 579c2bac407SLisandro Dalcin 580ba1e01c4SBarry Smith .seealso: PetscDrawLGSetFromOptions(), PetscDrawLGCreate() 581c2bac407SLisandro Dalcin @*/ 582c2bac407SLisandro Dalcin PetscErrorCode PetscDrawLGSetOptionsPrefix(PetscDrawLG lg,const char prefix[]) 583c2bac407SLisandro Dalcin { 584c2bac407SLisandro Dalcin PetscErrorCode ierr; 585c2bac407SLisandro Dalcin 586c2bac407SLisandro Dalcin PetscFunctionBegin; 587c2bac407SLisandro Dalcin PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1); 588c2bac407SLisandro Dalcin ierr = PetscObjectSetOptionsPrefix((PetscObject)lg,prefix);CHKERRQ(ierr); 589c2bac407SLisandro Dalcin PetscFunctionReturn(0); 590c2bac407SLisandro Dalcin } 591c2bac407SLisandro Dalcin 592287de1a7SBarry Smith /*@ 593287de1a7SBarry Smith PetscDrawLGSetFromOptions - Sets options related to the PetscDrawLG 594287de1a7SBarry Smith 5955b399a63SLisandro Dalcin Collective on PetscDrawLG 596287de1a7SBarry Smith 597287de1a7SBarry Smith Options Database: 598287de1a7SBarry Smith 599287de1a7SBarry Smith Level: intermediate 600287de1a7SBarry Smith 601287de1a7SBarry Smith .seealso: PetscDrawLGDestroy(), PetscDrawLGCreate() 602287de1a7SBarry Smith @*/ 603287de1a7SBarry Smith PetscErrorCode PetscDrawLGSetFromOptions(PetscDrawLG lg) 604287de1a7SBarry Smith { 605287de1a7SBarry Smith PetscErrorCode ierr; 60671917b75SLisandro Dalcin PetscBool usemarkers,set; 60771917b75SLisandro Dalcin PetscDrawMarkerType markertype; 608287de1a7SBarry Smith 609287de1a7SBarry Smith PetscFunctionBegin; 610e118a51fSLisandro Dalcin PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1); 611e118a51fSLisandro Dalcin 61271917b75SLisandro Dalcin ierr = PetscDrawGetMarkerType(lg->win,&markertype);CHKERRQ(ierr); 61371917b75SLisandro Dalcin ierr = PetscOptionsGetEnum(((PetscObject)lg)->options,((PetscObject)lg)->prefix,"-lg_marker_type",PetscDrawMarkerTypes,(PetscEnum*)&markertype,&set);CHKERRQ(ierr); 61471917b75SLisandro Dalcin if (set) { 61571917b75SLisandro Dalcin ierr = PetscDrawLGSetUseMarkers(lg,PETSC_TRUE);CHKERRQ(ierr); 61671917b75SLisandro Dalcin ierr = PetscDrawSetMarkerType(lg->win,markertype);CHKERRQ(ierr); 61771917b75SLisandro Dalcin } 61871917b75SLisandro Dalcin usemarkers = lg->use_markers; 61971917b75SLisandro Dalcin ierr = PetscOptionsGetBool(((PetscObject)lg)->options,((PetscObject)lg)->prefix,"-lg_use_markers",&usemarkers,&set);CHKERRQ(ierr); 62071917b75SLisandro Dalcin if (set) {ierr = PetscDrawLGSetUseMarkers(lg,usemarkers);CHKERRQ(ierr);} 621287de1a7SBarry Smith PetscFunctionReturn(0); 622287de1a7SBarry Smith } 623