15c6c1daeSBarry Smith 25ccc9f3cSMatthew G Knepley #include <petscviewer.h> 3999739cfSJacob Faibussowitsch #include <petsc/private/drawimpl.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; 78e118a51fSLisandro Dalcin PetscBool isnull; 79e118a51fSLisandro Dalcin PetscMPIInt rank; 80e118a51fSLisandro Dalcin PetscDraw draw; 81*5f80ce2aSJacob Faibussowitsch PetscErrorCode ierr; 825c6c1daeSBarry Smith 835c6c1daeSBarry Smith PetscFunctionBegin; 845c6c1daeSBarry Smith PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1); 85064a246eSJacob Faibussowitsch PetscValidHeaderSpecific(sp,PETSC_DRAWLG_CLASSID,2); 86*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawIsNull(lg->win,&isnull)); 87e118a51fSLisandro Dalcin if (isnull) PetscFunctionReturn(0); 88*5f80ce2aSJacob Faibussowitsch CHKERRMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)lg),&rank)); 895c6c1daeSBarry Smith 905b399a63SLisandro Dalcin draw = lg->win; 91*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawCheckResizedWindow(draw)); 92*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawClear(draw)); 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); 96*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawAxisSetLimits(lg->axis,xmin,xmax,ymin,ymax)); 97*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawAxisDraw(lg->axis)); 985c6c1daeSBarry Smith 995b399a63SLisandro Dalcin ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr); 100dd400576SPatrick Sanan if (rank == 0) { 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++) { 106*5f80ce2aSJacob Faibussowitsch CHKERRQ(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)); 107b6fe0379SLisandro Dalcin if (lg->use_markers) { 108*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawMarker(draw,lg->x[j*dim+i],lg->y[j*dim+i],PETSC_DRAW_RED)); 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++) { 116*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawMarker(draw,sp->x[j*dim+i],sp->y[j*dim+i],PETSC_DRAW_RED)); 1175c6c1daeSBarry Smith } 1185c6c1daeSBarry Smith } 1195c6c1daeSBarry Smith } 120e118a51fSLisandro Dalcin ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr); 1215b399a63SLisandro Dalcin 122*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawFlush(draw)); 123*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawPause(draw)); 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; 1525c6c1daeSBarry Smith 1535c6c1daeSBarry Smith PetscFunctionBegin; 1545c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 155e118a51fSLisandro Dalcin PetscValidLogicalCollectiveInt(draw,dim,2); 156e118a51fSLisandro Dalcin PetscValidPointer(outlg,3); 157e118a51fSLisandro Dalcin 158*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscHeaderCreate(lg,PETSC_DRAWLG_CLASSID,"DrawLG","Line Graph","Draw",PetscObjectComm((PetscObject)draw),PetscDrawLGDestroy,NULL)); 159*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscLogObjectParent((PetscObject)draw,(PetscObject)lg)); 160*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawLGSetOptionsPrefix(lg,((PetscObject)draw)->prefix)); 161e118a51fSLisandro Dalcin 162*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectReference((PetscObject)draw)); 163e118a51fSLisandro Dalcin lg->win = draw; 164a297a907SKarl Rupp 16569c83917SLisandro Dalcin lg->view = NULL; 16669c83917SLisandro Dalcin lg->destroy = NULL; 1675c6c1daeSBarry Smith lg->nopts = 0; 1685c6c1daeSBarry Smith lg->dim = dim; 1695c6c1daeSBarry Smith lg->xmin = 1.e20; 1705c6c1daeSBarry Smith lg->ymin = 1.e20; 1715c6c1daeSBarry Smith lg->xmax = -1.e20; 1725c6c1daeSBarry Smith lg->ymax = -1.e20; 173a297a907SKarl Rupp 174*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscMalloc2(dim*PETSC_DRAW_LG_CHUNK_SIZE,&lg->x,dim*PETSC_DRAW_LG_CHUNK_SIZE,&lg->y)); 175*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscLogObjectMemory((PetscObject)lg,2*dim*PETSC_DRAW_LG_CHUNK_SIZE*sizeof(PetscReal))); 176a297a907SKarl Rupp 177999739cfSJacob Faibussowitsch lg->len = dim*PETSC_DRAW_LG_CHUNK_SIZE; 1785c6c1daeSBarry Smith lg->loc = 0; 179b6fe0379SLisandro Dalcin lg->use_markers = PETSC_FALSE; 180a297a907SKarl Rupp 181*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawAxisCreate(draw,&lg->axis)); 182*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscLogObjectParent((PetscObject)lg,(PetscObject)lg->axis)); 183a297a907SKarl Rupp 184e118a51fSLisandro Dalcin *outlg = lg; 1855c6c1daeSBarry Smith PetscFunctionReturn(0); 1865c6c1daeSBarry Smith } 1875c6c1daeSBarry Smith 1885c6c1daeSBarry Smith /*@ 1895c6c1daeSBarry Smith PetscDrawLGSetColors - Sets the color of each line graph drawn 1905c6c1daeSBarry Smith 1915b399a63SLisandro Dalcin Logically Collective on PetscDrawLG 1925c6c1daeSBarry Smith 193d8d19677SJose E. Roman Input Parameters: 1945c6c1daeSBarry Smith + lg - the line graph context. 1955c6c1daeSBarry Smith - colors - the colors 1965c6c1daeSBarry Smith 1975c6c1daeSBarry Smith Level: intermediate 1985c6c1daeSBarry Smith 199ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate() 200ba1e01c4SBarry Smith 2015c6c1daeSBarry Smith @*/ 20245f3bb6eSLisandro Dalcin PetscErrorCode PetscDrawLGSetColors(PetscDrawLG lg,const int colors[]) 2035c6c1daeSBarry Smith { 2045c6c1daeSBarry Smith PetscFunctionBegin; 2055c6c1daeSBarry Smith PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1); 20645f3bb6eSLisandro Dalcin if (lg->dim) PetscValidIntPointer(colors,2); 207e118a51fSLisandro Dalcin 208*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree(lg->colors)); 209*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscMalloc1(lg->dim,&lg->colors)); 210*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscArraycpy(lg->colors,colors,lg->dim)); 2115c6c1daeSBarry Smith PetscFunctionReturn(0); 2125c6c1daeSBarry Smith } 2135c6c1daeSBarry Smith 2145c6c1daeSBarry Smith /*@C 2155c6c1daeSBarry Smith PetscDrawLGSetLegend - sets the names of each curve plotted 2165c6c1daeSBarry Smith 2175b399a63SLisandro Dalcin Logically Collective on PetscDrawLG 2185c6c1daeSBarry Smith 219d8d19677SJose E. Roman Input Parameters: 2205c6c1daeSBarry Smith + lg - the line graph context. 2215c6c1daeSBarry Smith - names - the names for each curve 2225c6c1daeSBarry Smith 2235c6c1daeSBarry Smith Level: intermediate 2245c6c1daeSBarry Smith 22595452b02SPatrick Sanan Notes: 22695452b02SPatrick Sanan Call PetscDrawLGGetAxis() and then change properties of the PetscDrawAxis for detailed control of the plot 227ba1e01c4SBarry Smith 228ba1e01c4SBarry Smith .seealso: PetscDrawLGGetAxis(), PetscDrawAxis, PetscDrawAxisSetColors(), PetscDrawAxisSetLabels(), PetscDrawAxisSetHoldLimits() 229ba1e01c4SBarry Smith 2305c6c1daeSBarry Smith @*/ 2315c6c1daeSBarry Smith PetscErrorCode PetscDrawLGSetLegend(PetscDrawLG lg,const char *const *names) 2325c6c1daeSBarry Smith { 2335c6c1daeSBarry Smith PetscInt i; 2345c6c1daeSBarry Smith 2355c6c1daeSBarry Smith PetscFunctionBegin; 2365c6c1daeSBarry Smith PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1); 23745f3bb6eSLisandro Dalcin if (names) PetscValidPointer(names,2); 2385c6c1daeSBarry Smith 2395c6c1daeSBarry Smith if (lg->legend) { 2405c6c1daeSBarry Smith for (i=0; i<lg->dim; i++) { 241*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree(lg->legend[i])); 2425c6c1daeSBarry Smith } 243*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree(lg->legend)); 2445c6c1daeSBarry Smith } 2455c6c1daeSBarry Smith if (names) { 246*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscMalloc1(lg->dim,&lg->legend)); 2475c6c1daeSBarry Smith for (i=0; i<lg->dim; i++) { 248*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrallocpy(names[i],&lg->legend[i])); 2495c6c1daeSBarry Smith } 2505c6c1daeSBarry Smith } 2515c6c1daeSBarry Smith PetscFunctionReturn(0); 2525c6c1daeSBarry Smith } 2535c6c1daeSBarry Smith 2545c6c1daeSBarry Smith /*@ 2555c6c1daeSBarry Smith PetscDrawLGGetDimension - Change the number of lines that are to be drawn. 2565c6c1daeSBarry Smith 2575b399a63SLisandro Dalcin Not Collective 2585c6c1daeSBarry Smith 2595c6c1daeSBarry Smith Input Parameter: 2605c6c1daeSBarry Smith . lg - the line graph context. 2615c6c1daeSBarry Smith 2625c6c1daeSBarry Smith Output Parameter: 2635c6c1daeSBarry Smith . dim - the number of curves. 2645c6c1daeSBarry Smith 2655c6c1daeSBarry Smith Level: intermediate 2665c6c1daeSBarry Smith 267ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate(), PetscDrawLGSetDimension() 268ba1e01c4SBarry Smith 2695c6c1daeSBarry Smith @*/ 2705c6c1daeSBarry Smith PetscErrorCode PetscDrawLGGetDimension(PetscDrawLG lg,PetscInt *dim) 2715c6c1daeSBarry Smith { 2725c6c1daeSBarry Smith PetscFunctionBegin; 2735c6c1daeSBarry Smith PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1); 27445f3bb6eSLisandro Dalcin PetscValidIntPointer(dim,2); 2755c6c1daeSBarry Smith *dim = lg->dim; 2765c6c1daeSBarry Smith PetscFunctionReturn(0); 2775c6c1daeSBarry Smith } 2785c6c1daeSBarry Smith 2795c6c1daeSBarry Smith /*@ 2805c6c1daeSBarry Smith PetscDrawLGSetDimension - Change the number of lines that are to be drawn. 2815c6c1daeSBarry Smith 2825b399a63SLisandro Dalcin Logically Collective on PetscDrawLG 2835c6c1daeSBarry Smith 284d8d19677SJose E. Roman Input Parameters: 2855c6c1daeSBarry Smith + lg - the line graph context. 2865c6c1daeSBarry Smith - dim - the number of curves. 2875c6c1daeSBarry Smith 2885c6c1daeSBarry Smith Level: intermediate 2895c6c1daeSBarry Smith 290ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate(), PetscDrawLGGetDimension() 2915c6c1daeSBarry Smith @*/ 2925c6c1daeSBarry Smith PetscErrorCode PetscDrawLGSetDimension(PetscDrawLG lg,PetscInt dim) 2935c6c1daeSBarry Smith { 2945c6c1daeSBarry Smith PetscInt i; 2955c6c1daeSBarry Smith 2965c6c1daeSBarry Smith PetscFunctionBegin; 2975c6c1daeSBarry Smith PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1); 2985c6c1daeSBarry Smith PetscValidLogicalCollectiveInt(lg,dim,2); 2995c6c1daeSBarry Smith if (lg->dim == dim) PetscFunctionReturn(0); 3005c6c1daeSBarry Smith 301*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree2(lg->x,lg->y)); 3025c6c1daeSBarry Smith if (lg->legend) { 3035c6c1daeSBarry Smith for (i=0; i<lg->dim; i++) { 304*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree(lg->legend[i])); 3055c6c1daeSBarry Smith } 306*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree(lg->legend)); 3075c6c1daeSBarry Smith } 308*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree(lg->colors)); 3095c6c1daeSBarry Smith lg->dim = dim; 310*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscMalloc2(dim*PETSC_DRAW_LG_CHUNK_SIZE,&lg->x,dim*PETSC_DRAW_LG_CHUNK_SIZE,&lg->y)); 311*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscLogObjectMemory((PetscObject)lg,2*dim*PETSC_DRAW_LG_CHUNK_SIZE*sizeof(PetscReal))); 312999739cfSJacob Faibussowitsch lg->len = dim*PETSC_DRAW_LG_CHUNK_SIZE; 3135c6c1daeSBarry Smith PetscFunctionReturn(0); 3145c6c1daeSBarry Smith } 3155c6c1daeSBarry Smith 31671917b75SLisandro Dalcin /*@ 31771917b75SLisandro Dalcin PetscDrawLGSetLimits - Sets the axis limits for a line graph. If more 31871917b75SLisandro Dalcin points are added after this call, the limits will be adjusted to 31971917b75SLisandro Dalcin include those additional points. 32071917b75SLisandro Dalcin 32171917b75SLisandro Dalcin Logically Collective on PetscDrawLG 32271917b75SLisandro Dalcin 32371917b75SLisandro Dalcin Input Parameters: 32471917b75SLisandro Dalcin + xlg - the line graph context 32571917b75SLisandro Dalcin - x_min,x_max,y_min,y_max - the limits 32671917b75SLisandro Dalcin 32771917b75SLisandro Dalcin Level: intermediate 32871917b75SLisandro Dalcin 329ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate() 330ba1e01c4SBarry Smith 33171917b75SLisandro Dalcin @*/ 33271917b75SLisandro Dalcin PetscErrorCode PetscDrawLGSetLimits(PetscDrawLG lg,PetscReal x_min,PetscReal x_max,PetscReal y_min,PetscReal y_max) 33371917b75SLisandro Dalcin { 33471917b75SLisandro Dalcin PetscFunctionBegin; 33571917b75SLisandro Dalcin PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1); 33671917b75SLisandro Dalcin 33771917b75SLisandro Dalcin (lg)->xmin = x_min; 33871917b75SLisandro Dalcin (lg)->xmax = x_max; 33971917b75SLisandro Dalcin (lg)->ymin = y_min; 34071917b75SLisandro Dalcin (lg)->ymax = y_max; 34171917b75SLisandro Dalcin PetscFunctionReturn(0); 34271917b75SLisandro Dalcin } 34371917b75SLisandro Dalcin 3445c6c1daeSBarry Smith /*@ 3455c6c1daeSBarry Smith PetscDrawLGReset - Clears line graph to allow for reuse with new data. 3465c6c1daeSBarry Smith 3475b399a63SLisandro Dalcin Logically Collective on PetscDrawLG 3485c6c1daeSBarry Smith 3495c6c1daeSBarry Smith Input Parameter: 3505c6c1daeSBarry Smith . lg - the line graph context. 3515c6c1daeSBarry Smith 3525c6c1daeSBarry Smith Level: intermediate 3535c6c1daeSBarry Smith 354ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate() 3555c6c1daeSBarry Smith @*/ 3565c6c1daeSBarry Smith PetscErrorCode PetscDrawLGReset(PetscDrawLG lg) 3575c6c1daeSBarry Smith { 3585c6c1daeSBarry Smith PetscFunctionBegin; 3595c6c1daeSBarry Smith PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1); 3605c6c1daeSBarry Smith lg->xmin = 1.e20; 3615c6c1daeSBarry Smith lg->ymin = 1.e20; 3625c6c1daeSBarry Smith lg->xmax = -1.e20; 3635c6c1daeSBarry Smith lg->ymax = -1.e20; 3645c6c1daeSBarry Smith lg->loc = 0; 3655c6c1daeSBarry Smith lg->nopts = 0; 3665c6c1daeSBarry Smith PetscFunctionReturn(0); 3675c6c1daeSBarry Smith } 3685c6c1daeSBarry Smith 3695c6c1daeSBarry Smith /*@ 3705c6c1daeSBarry Smith PetscDrawLGDestroy - Frees all space taken up by line graph data structure. 3715c6c1daeSBarry Smith 3725b399a63SLisandro Dalcin Collective on PetscDrawLG 3735c6c1daeSBarry Smith 3745c6c1daeSBarry Smith Input Parameter: 3755c6c1daeSBarry Smith . lg - the line graph context 3765c6c1daeSBarry Smith 3775c6c1daeSBarry Smith Level: intermediate 3785c6c1daeSBarry Smith 3795c6c1daeSBarry Smith .seealso: PetscDrawLGCreate() 3805c6c1daeSBarry Smith @*/ 3815c6c1daeSBarry Smith PetscErrorCode PetscDrawLGDestroy(PetscDrawLG *lg) 3825c6c1daeSBarry Smith { 3835c6c1daeSBarry Smith PetscInt i; 3845c6c1daeSBarry Smith 3855c6c1daeSBarry Smith PetscFunctionBegin; 3865c6c1daeSBarry Smith if (!*lg) PetscFunctionReturn(0); 387e118a51fSLisandro Dalcin PetscValidHeaderSpecific(*lg,PETSC_DRAWLG_CLASSID,1); 388e118a51fSLisandro Dalcin if (--((PetscObject)(*lg))->refct > 0) {*lg = NULL; PetscFunctionReturn(0);} 3895c6c1daeSBarry Smith 3905c6c1daeSBarry Smith if ((*lg)->legend) { 3915c6c1daeSBarry Smith for (i=0; i<(*lg)->dim; i++) { 392*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree((*lg)->legend[i])); 3935c6c1daeSBarry Smith } 394*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree((*lg)->legend)); 3955c6c1daeSBarry Smith } 396*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree((*lg)->colors)); 397*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree2((*lg)->x,(*lg)->y)); 398*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawAxisDestroy(&(*lg)->axis)); 399*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawDestroy(&(*lg)->win)); 400*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscHeaderDestroy(lg)); 4015c6c1daeSBarry Smith PetscFunctionReturn(0); 4025c6c1daeSBarry Smith } 4035c6c1daeSBarry Smith /*@ 404b6fe0379SLisandro Dalcin PetscDrawLGSetUseMarkers - Causes LG to draw a marker for each data-point. 4055c6c1daeSBarry Smith 4065b399a63SLisandro Dalcin Logically Collective on PetscDrawLG 4075c6c1daeSBarry Smith 4085c6c1daeSBarry Smith Input Parameters: 409287de1a7SBarry Smith + lg - the linegraph context 410287de1a7SBarry Smith - flg - should mark each data point 411287de1a7SBarry Smith 412287de1a7SBarry Smith Options Database: 41310699b91SBarry Smith . -lg_use_markers <true,false> - true means the graphPetscDrawLG draws a marker for each point 4145c6c1daeSBarry Smith 4155c6c1daeSBarry Smith Level: intermediate 4165c6c1daeSBarry Smith 417ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate() 4185c6c1daeSBarry Smith @*/ 419b6fe0379SLisandro Dalcin PetscErrorCode PetscDrawLGSetUseMarkers(PetscDrawLG lg,PetscBool flg) 4205c6c1daeSBarry Smith { 4215c6c1daeSBarry Smith PetscFunctionBegin; 422e118a51fSLisandro Dalcin PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1); 42345f3bb6eSLisandro Dalcin PetscValidLogicalCollectiveBool(lg,flg,2); 424b6fe0379SLisandro Dalcin lg->use_markers = flg; 4255c6c1daeSBarry Smith PetscFunctionReturn(0); 4265c6c1daeSBarry Smith } 4275c6c1daeSBarry Smith 4285c6c1daeSBarry Smith /*@ 4295c6c1daeSBarry Smith PetscDrawLGDraw - Redraws a line graph. 4305c6c1daeSBarry Smith 4315b399a63SLisandro Dalcin Collective on PetscDrawLG 4325c6c1daeSBarry Smith 4335c6c1daeSBarry Smith Input Parameter: 4345c6c1daeSBarry Smith . lg - the line graph context 4355c6c1daeSBarry Smith 4365c6c1daeSBarry Smith Level: intermediate 4375c6c1daeSBarry Smith 438ba1e01c4SBarry Smith .seealso: PetscDrawSPDraw(), PetscDrawLGSPDraw(), PetscDrawLGReset() 4395c6c1daeSBarry Smith @*/ 4405c6c1daeSBarry Smith PetscErrorCode PetscDrawLGDraw(PetscDrawLG lg) 4415c6c1daeSBarry Smith { 442e118a51fSLisandro Dalcin PetscReal xmin,xmax,ymin,ymax; 443e118a51fSLisandro Dalcin PetscMPIInt rank; 444e118a51fSLisandro Dalcin PetscDraw draw; 4455c6c1daeSBarry Smith PetscBool isnull; 446*5f80ce2aSJacob Faibussowitsch PetscErrorCode ierr; 4475c6c1daeSBarry Smith 4485c6c1daeSBarry Smith PetscFunctionBegin; 4495c6c1daeSBarry Smith PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1); 450*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawIsNull(lg->win,&isnull)); 4518f69470aSLisandro Dalcin if (isnull) PetscFunctionReturn(0); 452*5f80ce2aSJacob Faibussowitsch CHKERRMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)lg),&rank)); 4535c6c1daeSBarry Smith 4545b399a63SLisandro Dalcin draw = lg->win; 455*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawCheckResizedWindow(draw)); 456*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawClear(draw)); 457e118a51fSLisandro Dalcin 458e118a51fSLisandro Dalcin xmin = lg->xmin; xmax = lg->xmax; ymin = lg->ymin; ymax = lg->ymax; 459*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawAxisSetLimits(lg->axis,xmin,xmax,ymin,ymax)); 460*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawAxisDraw(lg->axis)); 4615c6c1daeSBarry Smith 4625b399a63SLisandro Dalcin ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr); 463dd400576SPatrick Sanan if (rank == 0) { 464e118a51fSLisandro Dalcin int i,j,dim=lg->dim,nopts=lg->nopts,cl; 4655c6c1daeSBarry Smith for (i=0; i<dim; i++) { 4665c6c1daeSBarry Smith for (j=1; j<nopts; j++) { 4670ed3bfb6SBarry Smith cl = lg->colors ? lg->colors[i] : ((PETSC_DRAW_BLACK + i) % PETSC_DRAW_MAXCOLOR); 468*5f80ce2aSJacob Faibussowitsch CHKERRQ(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)); 469*5f80ce2aSJacob Faibussowitsch if (lg->use_markers) CHKERRQ(PetscDrawMarker(draw,lg->x[j*dim+i],lg->y[j*dim+i],cl)); 4705c6c1daeSBarry Smith } 4715c6c1daeSBarry Smith } 4725c6c1daeSBarry Smith } 473dd400576SPatrick Sanan if (rank == 0 && lg->legend) { 474088d793eSMatthew G. Knepley PetscBool right = PETSC_FALSE; 475e118a51fSLisandro Dalcin int i,dim=lg->dim,cl; 4765c6c1daeSBarry Smith PetscReal xl,yl,xr,yr,tw,th; 47771917b75SLisandro Dalcin size_t slen,len=0; 478*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawAxisGetLimits(lg->axis,&xl,&xr,&yl,&yr)); 479*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawStringGetSize(draw,&tw,&th)); 4805c6c1daeSBarry Smith for (i=0; i<dim; i++) { 481*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrlen(lg->legend[i],&slen)); 48271917b75SLisandro Dalcin len = PetscMax(len,slen); 4835c6c1daeSBarry Smith } 484088d793eSMatthew G. Knepley if (right) { 48571917b75SLisandro Dalcin xr = xr - 1.5*tw; xl = xr - (len + 7)*tw; 486088d793eSMatthew G. Knepley } else { 487088d793eSMatthew G. Knepley xl = xl + 1.5*tw; xr = xl + (len + 7)*tw; 488088d793eSMatthew G. Knepley } 48971917b75SLisandro Dalcin yr = yr - 1.0*th; yl = yr - (dim + 1)*th; 490*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawLine(draw,xl,yl,xr,yl,PETSC_DRAW_BLACK)); 491*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawLine(draw,xr,yl,xr,yr,PETSC_DRAW_BLACK)); 492*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawLine(draw,xr,yr,xl,yr,PETSC_DRAW_BLACK)); 493*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawLine(draw,xl,yr,xl,yl,PETSC_DRAW_BLACK)); 4945c6c1daeSBarry Smith for (i=0; i<dim; i++) { 49571917b75SLisandro Dalcin cl = lg->colors ? lg->colors[i] : (PETSC_DRAW_BLACK + i); 496*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawLine(draw,xl + 1*tw,yr - (i + 1)*th,xl + 5*tw,yr - (i + 1)*th,cl)); 497*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawString(draw,xl + 6*tw,yr - (i + 1.5)*th,PETSC_DRAW_BLACK,lg->legend[i])); 4985c6c1daeSBarry Smith } 4995c6c1daeSBarry Smith } 500e118a51fSLisandro Dalcin ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr); 5015b399a63SLisandro Dalcin 502*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawFlush(draw)); 503*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawPause(draw)); 5045c6c1daeSBarry Smith PetscFunctionReturn(0); 5055c6c1daeSBarry Smith } 5065c6c1daeSBarry Smith 50757fd6651SLisandro Dalcin /*@ 50857fd6651SLisandro Dalcin PetscDrawLGSave - Saves a drawn image 50957fd6651SLisandro Dalcin 51057fd6651SLisandro Dalcin Collective on PetscDrawLG 51157fd6651SLisandro Dalcin 51257fd6651SLisandro Dalcin Input Parameter: 51357fd6651SLisandro Dalcin . lg - The line graph context 51457fd6651SLisandro Dalcin 51557fd6651SLisandro Dalcin Level: intermediate 51657fd6651SLisandro Dalcin 51757fd6651SLisandro Dalcin .seealso: PetscDrawLGCreate(), PetscDrawLGGetDraw(), PetscDrawSetSave(), PetscDrawSave() 51857fd6651SLisandro Dalcin @*/ 51957fd6651SLisandro Dalcin PetscErrorCode PetscDrawLGSave(PetscDrawLG lg) 52057fd6651SLisandro Dalcin { 52157fd6651SLisandro Dalcin PetscFunctionBegin; 52257fd6651SLisandro Dalcin PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1); 523*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawSave(lg->win)); 52457fd6651SLisandro Dalcin PetscFunctionReturn(0); 52557fd6651SLisandro Dalcin } 52657fd6651SLisandro Dalcin 5275c6c1daeSBarry Smith /*@ 52834a5a0e3SBarry Smith PetscDrawLGView - Prints a line graph. 5295c6c1daeSBarry Smith 5305b399a63SLisandro Dalcin Collective on PetscDrawLG 5315c6c1daeSBarry Smith 5325c6c1daeSBarry Smith Input Parameter: 5335c6c1daeSBarry Smith . lg - the line graph context 5345c6c1daeSBarry Smith 5355c6c1daeSBarry Smith Level: beginner 5365c6c1daeSBarry Smith 537ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate() 538ba1e01c4SBarry Smith 5395c6c1daeSBarry Smith @*/ 54034a5a0e3SBarry Smith PetscErrorCode PetscDrawLGView(PetscDrawLG lg,PetscViewer viewer) 5415c6c1daeSBarry Smith { 5425c6c1daeSBarry Smith PetscReal xmin=lg->xmin, xmax=lg->xmax, ymin=lg->ymin, ymax=lg->ymax; 54334a5a0e3SBarry Smith PetscInt i, j, dim = lg->dim, nopts = lg->nopts; 5445c6c1daeSBarry Smith 5455c6c1daeSBarry Smith PetscFunctionBegin; 5465c6c1daeSBarry Smith PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1); 547e118a51fSLisandro Dalcin 5485c6c1daeSBarry Smith if (nopts < 1) PetscFunctionReturn(0); 5495c6c1daeSBarry Smith if (xmin > xmax || ymin > ymax) PetscFunctionReturn(0); 5505c6c1daeSBarry Smith 55134a5a0e3SBarry Smith if (!viewer) { 552*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)lg),&viewer)); 55334a5a0e3SBarry Smith } 554*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectPrintClassNamePrefixType((PetscObject)lg,viewer)); 5555c6c1daeSBarry Smith for (i = 0; i < dim; i++) { 556*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer, "Line %" PetscInt_FMT ">\n", i)); 5575c6c1daeSBarry Smith for (j = 0; j < nopts; j++) { 558*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscViewerASCIIPrintf(viewer, " X: %g Y: %g\n", (double)lg->x[j*dim+i], (double)lg->y[j*dim+i])); 5595c6c1daeSBarry Smith } 5605c6c1daeSBarry Smith } 5615c6c1daeSBarry Smith PetscFunctionReturn(0); 5625c6c1daeSBarry Smith } 563287de1a7SBarry Smith 564c2bac407SLisandro Dalcin /*@C 565c2bac407SLisandro Dalcin PetscDrawLGSetOptionsPrefix - Sets the prefix used for searching for all 566c2bac407SLisandro Dalcin PetscDrawLG options in the database. 567c2bac407SLisandro Dalcin 568c2bac407SLisandro Dalcin Logically Collective on PetscDrawLG 569c2bac407SLisandro Dalcin 570d8d19677SJose E. Roman Input Parameters: 571c2bac407SLisandro Dalcin + lg - the line graph context 572c2bac407SLisandro Dalcin - prefix - the prefix to prepend to all option names 573c2bac407SLisandro Dalcin 574c2bac407SLisandro Dalcin Level: advanced 575c2bac407SLisandro Dalcin 576ba1e01c4SBarry Smith .seealso: PetscDrawLGSetFromOptions(), PetscDrawLGCreate() 577c2bac407SLisandro Dalcin @*/ 578c2bac407SLisandro Dalcin PetscErrorCode PetscDrawLGSetOptionsPrefix(PetscDrawLG lg,const char prefix[]) 579c2bac407SLisandro Dalcin { 580c2bac407SLisandro Dalcin PetscFunctionBegin; 581c2bac407SLisandro Dalcin PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1); 582*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectSetOptionsPrefix((PetscObject)lg,prefix)); 583c2bac407SLisandro Dalcin PetscFunctionReturn(0); 584c2bac407SLisandro Dalcin } 585c2bac407SLisandro Dalcin 586287de1a7SBarry Smith /*@ 587287de1a7SBarry Smith PetscDrawLGSetFromOptions - Sets options related to the PetscDrawLG 588287de1a7SBarry Smith 5895b399a63SLisandro Dalcin Collective on PetscDrawLG 590287de1a7SBarry Smith 591287de1a7SBarry Smith Options Database: 592287de1a7SBarry Smith 593287de1a7SBarry Smith Level: intermediate 594287de1a7SBarry Smith 595287de1a7SBarry Smith .seealso: PetscDrawLGDestroy(), PetscDrawLGCreate() 596287de1a7SBarry Smith @*/ 597287de1a7SBarry Smith PetscErrorCode PetscDrawLGSetFromOptions(PetscDrawLG lg) 598287de1a7SBarry Smith { 59971917b75SLisandro Dalcin PetscBool usemarkers,set; 60071917b75SLisandro Dalcin PetscDrawMarkerType markertype; 601287de1a7SBarry Smith 602287de1a7SBarry Smith PetscFunctionBegin; 603e118a51fSLisandro Dalcin PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1); 604e118a51fSLisandro Dalcin 605*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawGetMarkerType(lg->win,&markertype)); 606*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetEnum(((PetscObject)lg)->options,((PetscObject)lg)->prefix,"-lg_marker_type",PetscDrawMarkerTypes,(PetscEnum*)&markertype,&set)); 60771917b75SLisandro Dalcin if (set) { 608*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawLGSetUseMarkers(lg,PETSC_TRUE)); 609*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscDrawSetMarkerType(lg->win,markertype)); 61071917b75SLisandro Dalcin } 61171917b75SLisandro Dalcin usemarkers = lg->use_markers; 612*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscOptionsGetBool(((PetscObject)lg)->options,((PetscObject)lg)->prefix,"-lg_use_markers",&usemarkers,&set)); 613*5f80ce2aSJacob Faibussowitsch if (set) CHKERRQ(PetscDrawLGSetUseMarkers(lg,usemarkers)); 614287de1a7SBarry Smith PetscFunctionReturn(0); 615287de1a7SBarry Smith } 616