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 #undef __FUNCT__ 75c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGGetAxis" 85c6c1daeSBarry Smith /*@ 95c6c1daeSBarry Smith PetscDrawLGGetAxis - Gets the axis context associated with a line graph. 105c6c1daeSBarry Smith This is useful if one wants to change some axis property, such as 115c6c1daeSBarry Smith labels, color, etc. The axis context should not be destroyed by the 125c6c1daeSBarry Smith application code. 135c6c1daeSBarry Smith 145c6c1daeSBarry Smith Not Collective, if PetscDrawLG is parallel then PetscDrawAxis is parallel 155c6c1daeSBarry Smith 165c6c1daeSBarry Smith Input Parameter: 175c6c1daeSBarry Smith . lg - the line graph context 185c6c1daeSBarry Smith 195c6c1daeSBarry Smith Output Parameter: 205c6c1daeSBarry Smith . axis - the axis context 215c6c1daeSBarry Smith 225c6c1daeSBarry Smith Level: advanced 235c6c1daeSBarry Smith 24ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate(), PetscDrawAxis 25ba1e01c4SBarry Smith 265c6c1daeSBarry Smith @*/ 275c6c1daeSBarry Smith PetscErrorCode PetscDrawLGGetAxis(PetscDrawLG lg,PetscDrawAxis *axis) 285c6c1daeSBarry Smith { 295c6c1daeSBarry Smith PetscFunctionBegin; 30e118a51fSLisandro Dalcin PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1); 3145f3bb6eSLisandro Dalcin PetscValidPointer(axis,2); 325c6c1daeSBarry Smith *axis = lg->axis; 335c6c1daeSBarry Smith PetscFunctionReturn(0); 345c6c1daeSBarry Smith } 355c6c1daeSBarry Smith 365c6c1daeSBarry Smith #undef __FUNCT__ 375c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGGetDraw" 385c6c1daeSBarry Smith /*@ 395c6c1daeSBarry Smith PetscDrawLGGetDraw - Gets the draw context associated with a line graph. 405c6c1daeSBarry Smith 415c6c1daeSBarry Smith Not Collective, if PetscDrawLG is parallel then PetscDraw is parallel 425c6c1daeSBarry Smith 435c6c1daeSBarry Smith Input Parameter: 445c6c1daeSBarry Smith . lg - the line graph context 455c6c1daeSBarry Smith 465c6c1daeSBarry Smith Output Parameter: 475c6c1daeSBarry Smith . draw - the draw context 485c6c1daeSBarry Smith 495c6c1daeSBarry Smith Level: intermediate 505c6c1daeSBarry Smith 51ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate(), PetscDraw 525c6c1daeSBarry Smith @*/ 535c6c1daeSBarry Smith PetscErrorCode PetscDrawLGGetDraw(PetscDrawLG lg,PetscDraw *draw) 545c6c1daeSBarry Smith { 555c6c1daeSBarry Smith PetscFunctionBegin; 565c6c1daeSBarry Smith PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1); 5745f3bb6eSLisandro Dalcin PetscValidPointer(draw,2); 585c6c1daeSBarry Smith *draw = lg->win; 595c6c1daeSBarry Smith PetscFunctionReturn(0); 605c6c1daeSBarry Smith } 615c6c1daeSBarry Smith 625c6c1daeSBarry Smith 635c6c1daeSBarry Smith #undef __FUNCT__ 645c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGSPDraw" 655c6c1daeSBarry Smith /*@ 665c6c1daeSBarry Smith PetscDrawLGSPDraw - Redraws a line graph. 675c6c1daeSBarry Smith 685b399a63SLisandro Dalcin Collective on PetscDrawLG 695c6c1daeSBarry Smith 705c6c1daeSBarry Smith Input Parameter: 715c6c1daeSBarry Smith . lg - the line graph context 725c6c1daeSBarry Smith 735c6c1daeSBarry Smith Level: intermediate 745c6c1daeSBarry Smith 755c6c1daeSBarry Smith .seealso: PetscDrawLGDraw(), PetscDrawSPDraw() 765c6c1daeSBarry Smith 775c6c1daeSBarry Smith Developer Notes: This code cheats and uses the fact that the LG and SP structs are the same 785c6c1daeSBarry Smith 795c6c1daeSBarry Smith @*/ 805c6c1daeSBarry Smith PetscErrorCode PetscDrawLGSPDraw(PetscDrawLG lg,PetscDrawSP spin) 815c6c1daeSBarry Smith { 825c6c1daeSBarry Smith PetscDrawLG sp = (PetscDrawLG)spin; 835c6c1daeSBarry Smith PetscReal xmin,xmax,ymin,ymax; 845c6c1daeSBarry Smith PetscErrorCode ierr; 85e118a51fSLisandro Dalcin PetscBool isnull; 86e118a51fSLisandro Dalcin PetscMPIInt rank; 87e118a51fSLisandro Dalcin PetscDraw draw; 885c6c1daeSBarry Smith 895c6c1daeSBarry Smith PetscFunctionBegin; 905c6c1daeSBarry Smith PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1); 915c6c1daeSBarry Smith PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,2); 925b399a63SLisandro Dalcin ierr = PetscDrawIsNull(lg->win,&isnull);CHKERRQ(ierr); 93e118a51fSLisandro Dalcin if (isnull) PetscFunctionReturn(0); 94e118a51fSLisandro Dalcin ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)lg),&rank);CHKERRQ(ierr); 955c6c1daeSBarry Smith 965b399a63SLisandro Dalcin draw = lg->win; 97e118a51fSLisandro Dalcin ierr = PetscDrawCheckResizedWindow(draw);CHKERRQ(ierr); 985b399a63SLisandro Dalcin ierr = PetscDrawClear(draw);CHKERRQ(ierr); 99e118a51fSLisandro Dalcin 100e118a51fSLisandro Dalcin xmin = PetscMin(lg->xmin,sp->xmin); ymin = PetscMin(lg->ymin,sp->ymin); 101e118a51fSLisandro Dalcin xmax = PetscMax(lg->xmax,sp->xmax); ymax = PetscMax(lg->ymax,sp->ymax); 1025c6c1daeSBarry Smith ierr = PetscDrawAxisSetLimits(lg->axis,xmin,xmax,ymin,ymax);CHKERRQ(ierr); 1035c6c1daeSBarry Smith ierr = PetscDrawAxisDraw(lg->axis);CHKERRQ(ierr); 1045c6c1daeSBarry Smith 1055b399a63SLisandro Dalcin ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr); 1065c6c1daeSBarry Smith if (!rank) { 107e118a51fSLisandro Dalcin int i,j,dim,nopts; 1085c6c1daeSBarry Smith dim = lg->dim; 1095c6c1daeSBarry Smith nopts = lg->nopts; 1105c6c1daeSBarry Smith for (i=0; i<dim; i++) { 1115c6c1daeSBarry Smith for (j=1; j<nopts; j++) { 1125c6c1daeSBarry 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); 113b6fe0379SLisandro Dalcin if (lg->use_markers) { 11478e9f83eSLisandro Dalcin ierr = PetscDrawMarker(draw,lg->x[j*dim+i],lg->y[j*dim+i],PETSC_DRAW_RED);CHKERRQ(ierr); 1155c6c1daeSBarry Smith } 1165c6c1daeSBarry Smith } 1175c6c1daeSBarry Smith } 1185c6c1daeSBarry Smith dim = sp->dim; 1195c6c1daeSBarry Smith nopts = sp->nopts; 1205c6c1daeSBarry Smith for (i=0; i<dim; i++) { 1215c6c1daeSBarry Smith for (j=0; j<nopts; j++) { 12278e9f83eSLisandro Dalcin ierr = PetscDrawMarker(draw,sp->x[j*dim+i],sp->y[j*dim+i],PETSC_DRAW_RED);CHKERRQ(ierr); 1235c6c1daeSBarry Smith } 1245c6c1daeSBarry Smith } 1255c6c1daeSBarry Smith } 126e118a51fSLisandro Dalcin ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr); 1275b399a63SLisandro Dalcin 1285b399a63SLisandro Dalcin ierr = PetscDrawFlush(draw);CHKERRQ(ierr); 1295b399a63SLisandro Dalcin ierr = PetscDrawPause(draw);CHKERRQ(ierr); 1305c6c1daeSBarry Smith PetscFunctionReturn(0); 1315c6c1daeSBarry Smith } 1325c6c1daeSBarry Smith 1335c6c1daeSBarry Smith 1345c6c1daeSBarry Smith #undef __FUNCT__ 1355c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGCreate" 1365c6c1daeSBarry Smith /*@ 1375c6c1daeSBarry Smith PetscDrawLGCreate - Creates a line graph data structure. 1385c6c1daeSBarry Smith 1395b399a63SLisandro Dalcin Collective on PetscDraw 1405c6c1daeSBarry Smith 1415c6c1daeSBarry Smith Input Parameters: 1425c6c1daeSBarry Smith + draw - the window where the graph will be made. 1435c6c1daeSBarry Smith - dim - the number of curves which will be drawn 1445c6c1daeSBarry Smith 1455c6c1daeSBarry Smith Output Parameters: 146e118a51fSLisandro Dalcin . outlg - the line graph context 1475c6c1daeSBarry Smith 1485c6c1daeSBarry Smith Level: intermediate 1495c6c1daeSBarry Smith 150*7e25d57eSBarry Smith 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 151*7e25d57eSBarry Smith zeroth MPI process in the communicator. All MPI processes in the communicator must call PetscDrawLGDraw() to display the updated graph. 152*7e25d57eSBarry Smith 1535c6c1daeSBarry Smith Concepts: line graph^creating 1545c6c1daeSBarry Smith 155ba1e01c4SBarry Smith .seealso: PetscDrawLGDestroy(), PetscDrawLGAddPoint(), PetscDrawLGAddCommonPoint(), PetscDrawLGAddPoints(), PetscDrawLGDraw(), PetscDrawLGSave(), 156ba1e01c4SBarry Smith PetscDrawLGView(), PetscDrawLGReset(), PetscDrawLGSetDimension(), PetscDrawLGGetDimension(), PetscDrawLGSetLegend(), PetscDrawLGGetAxis(), 157ba1e01c4SBarry Smith PetscDrawLGGetDraw(), PetscDrawLGSetUseMarkers(), PetscDrawLGSetLimits(), PetscDrawLGSetColors(), PetscDrawLGSetOptionsPrefix(), PetscDrawLGSetFromOptions() 1585c6c1daeSBarry Smith @*/ 159e118a51fSLisandro Dalcin PetscErrorCode PetscDrawLGCreate(PetscDraw draw,PetscInt dim,PetscDrawLG *outlg) 1605c6c1daeSBarry Smith { 1615c6c1daeSBarry Smith PetscDrawLG lg; 162e118a51fSLisandro Dalcin PetscErrorCode ierr; 1635c6c1daeSBarry Smith 1645c6c1daeSBarry Smith PetscFunctionBegin; 1655c6c1daeSBarry Smith PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1); 166e118a51fSLisandro Dalcin PetscValidLogicalCollectiveInt(draw,dim,2); 167e118a51fSLisandro Dalcin PetscValidPointer(outlg,3); 168e118a51fSLisandro Dalcin 16971917b75SLisandro Dalcin ierr = PetscHeaderCreate(lg,PETSC_DRAWLG_CLASSID,"DrawLG","Line Graph","Draw",PetscObjectComm((PetscObject)draw),PetscDrawLGDestroy,NULL);CHKERRQ(ierr); 170e118a51fSLisandro Dalcin ierr = PetscLogObjectParent((PetscObject)draw,(PetscObject)lg);CHKERRQ(ierr); 171c2bac407SLisandro Dalcin ierr = PetscDrawLGSetOptionsPrefix(lg,((PetscObject)draw)->prefix);CHKERRQ(ierr); 172e118a51fSLisandro Dalcin 173e118a51fSLisandro Dalcin ierr = PetscObjectReference((PetscObject)draw);CHKERRQ(ierr); 174e118a51fSLisandro Dalcin lg->win = draw; 175a297a907SKarl Rupp 17669c83917SLisandro Dalcin lg->view = NULL; 17769c83917SLisandro Dalcin lg->destroy = NULL; 1785c6c1daeSBarry Smith lg->nopts = 0; 1795c6c1daeSBarry Smith lg->dim = dim; 1805c6c1daeSBarry Smith lg->xmin = 1.e20; 1815c6c1daeSBarry Smith lg->ymin = 1.e20; 1825c6c1daeSBarry Smith lg->xmax = -1.e20; 1835c6c1daeSBarry Smith lg->ymax = -1.e20; 184a297a907SKarl Rupp 185dcca6d9dSJed Brown ierr = PetscMalloc2(dim*CHUNCKSIZE,&lg->x,dim*CHUNCKSIZE,&lg->y);CHKERRQ(ierr); 1863bb1ff40SBarry Smith ierr = PetscLogObjectMemory((PetscObject)lg,2*dim*CHUNCKSIZE*sizeof(PetscReal));CHKERRQ(ierr); 187a297a907SKarl Rupp 1885c6c1daeSBarry Smith lg->len = dim*CHUNCKSIZE; 1895c6c1daeSBarry Smith lg->loc = 0; 190b6fe0379SLisandro Dalcin lg->use_markers = PETSC_FALSE; 191a297a907SKarl Rupp 1925c6c1daeSBarry Smith ierr = PetscDrawAxisCreate(draw,&lg->axis);CHKERRQ(ierr); 1933bb1ff40SBarry Smith ierr = PetscLogObjectParent((PetscObject)lg,(PetscObject)lg->axis);CHKERRQ(ierr); 194a297a907SKarl Rupp 195e118a51fSLisandro Dalcin *outlg = lg; 1965c6c1daeSBarry Smith PetscFunctionReturn(0); 1975c6c1daeSBarry Smith } 1985c6c1daeSBarry Smith 1995c6c1daeSBarry Smith #undef __FUNCT__ 2005c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGSetColors" 2015c6c1daeSBarry Smith /*@ 2025c6c1daeSBarry Smith PetscDrawLGSetColors - Sets the color of each line graph drawn 2035c6c1daeSBarry Smith 2045b399a63SLisandro Dalcin Logically Collective on PetscDrawLG 2055c6c1daeSBarry Smith 2065c6c1daeSBarry Smith Input Parameter: 2075c6c1daeSBarry Smith + lg - the line graph context. 2085c6c1daeSBarry Smith - colors - the colors 2095c6c1daeSBarry Smith 2105c6c1daeSBarry Smith Level: intermediate 2115c6c1daeSBarry Smith 2125c6c1daeSBarry Smith Concepts: line graph^setting number of lines 2135c6c1daeSBarry Smith 214ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate() 215ba1e01c4SBarry Smith 2165c6c1daeSBarry Smith @*/ 21745f3bb6eSLisandro Dalcin PetscErrorCode PetscDrawLGSetColors(PetscDrawLG lg,const int colors[]) 2185c6c1daeSBarry Smith { 2195c6c1daeSBarry Smith PetscErrorCode ierr; 2205c6c1daeSBarry Smith 2215c6c1daeSBarry Smith PetscFunctionBegin; 2225c6c1daeSBarry Smith PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1); 22345f3bb6eSLisandro Dalcin if (lg->dim) PetscValidIntPointer(colors,2); 224e118a51fSLisandro Dalcin 2255c6c1daeSBarry Smith ierr = PetscFree(lg->colors);CHKERRQ(ierr); 226785e854fSJed Brown ierr = PetscMalloc1(lg->dim,&lg->colors);CHKERRQ(ierr); 2275c6c1daeSBarry Smith ierr = PetscMemcpy(lg->colors,colors,lg->dim*sizeof(int));CHKERRQ(ierr); 2285c6c1daeSBarry Smith PetscFunctionReturn(0); 2295c6c1daeSBarry Smith } 2305c6c1daeSBarry Smith 2315c6c1daeSBarry Smith #undef __FUNCT__ 2325c6c1daeSBarry Smith #undef __FUNCT__ 2335c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGSetLegend" 2345c6c1daeSBarry Smith /*@C 2355c6c1daeSBarry Smith PetscDrawLGSetLegend - sets the names of each curve plotted 2365c6c1daeSBarry Smith 2375b399a63SLisandro Dalcin Logically Collective on PetscDrawLG 2385c6c1daeSBarry Smith 2395c6c1daeSBarry Smith Input Parameter: 2405c6c1daeSBarry Smith + lg - the line graph context. 2415c6c1daeSBarry Smith - names - the names for each curve 2425c6c1daeSBarry Smith 2435c6c1daeSBarry Smith Level: intermediate 2445c6c1daeSBarry Smith 245ba1e01c4SBarry Smith Notes: Call PetscDrawLGGetAxis() and then change properties of the PetscDrawAxis for detailed control of the plot 246ba1e01c4SBarry Smith 2475c6c1daeSBarry Smith Concepts: line graph^setting number of lines 2485c6c1daeSBarry Smith 249ba1e01c4SBarry Smith .seealso: PetscDrawLGGetAxis(), PetscDrawAxis, PetscDrawAxisSetColors(), PetscDrawAxisSetLabels(), PetscDrawAxisSetHoldLimits() 250ba1e01c4SBarry Smith 2515c6c1daeSBarry Smith @*/ 2525c6c1daeSBarry Smith PetscErrorCode PetscDrawLGSetLegend(PetscDrawLG lg,const char *const *names) 2535c6c1daeSBarry Smith { 2545c6c1daeSBarry Smith PetscErrorCode ierr; 2555c6c1daeSBarry Smith PetscInt i; 2565c6c1daeSBarry Smith 2575c6c1daeSBarry Smith PetscFunctionBegin; 2585c6c1daeSBarry Smith PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1); 25945f3bb6eSLisandro Dalcin if (names) PetscValidPointer(names,2); 2605c6c1daeSBarry Smith 2615c6c1daeSBarry Smith if (lg->legend) { 2625c6c1daeSBarry Smith for (i=0; i<lg->dim; i++) { 2635c6c1daeSBarry Smith ierr = PetscFree(lg->legend[i]);CHKERRQ(ierr); 2645c6c1daeSBarry Smith } 2655c6c1daeSBarry Smith ierr = PetscFree(lg->legend);CHKERRQ(ierr); 2665c6c1daeSBarry Smith } 2675c6c1daeSBarry Smith if (names) { 268785e854fSJed Brown ierr = PetscMalloc1(lg->dim,&lg->legend);CHKERRQ(ierr); 2695c6c1daeSBarry Smith for (i=0; i<lg->dim; i++) { 2705c6c1daeSBarry Smith ierr = PetscStrallocpy(names[i],&lg->legend[i]);CHKERRQ(ierr); 2715c6c1daeSBarry Smith } 2725c6c1daeSBarry Smith } 2735c6c1daeSBarry Smith PetscFunctionReturn(0); 2745c6c1daeSBarry Smith } 2755c6c1daeSBarry Smith 2765c6c1daeSBarry Smith #undef __FUNCT__ 2775c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGGetDimension" 2785c6c1daeSBarry Smith /*@ 2795c6c1daeSBarry Smith PetscDrawLGGetDimension - Change the number of lines that are to be drawn. 2805c6c1daeSBarry Smith 2815b399a63SLisandro Dalcin Not Collective 2825c6c1daeSBarry Smith 2835c6c1daeSBarry Smith Input Parameter: 2845c6c1daeSBarry Smith . lg - the line graph context. 2855c6c1daeSBarry Smith 2865c6c1daeSBarry Smith Output Parameter: 2875c6c1daeSBarry Smith . dim - the number of curves. 2885c6c1daeSBarry Smith 2895c6c1daeSBarry Smith Level: intermediate 2905c6c1daeSBarry Smith 2915c6c1daeSBarry Smith Concepts: line graph^setting number of lines 2925c6c1daeSBarry Smith 293ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate(), PetscDrawLGSetDimension() 294ba1e01c4SBarry Smith 2955c6c1daeSBarry Smith @*/ 2965c6c1daeSBarry Smith PetscErrorCode PetscDrawLGGetDimension(PetscDrawLG lg,PetscInt *dim) 2975c6c1daeSBarry Smith { 2985c6c1daeSBarry Smith PetscFunctionBegin; 2995c6c1daeSBarry Smith PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1); 30045f3bb6eSLisandro Dalcin PetscValidIntPointer(dim,2); 3015c6c1daeSBarry Smith *dim = lg->dim; 3025c6c1daeSBarry Smith PetscFunctionReturn(0); 3035c6c1daeSBarry Smith } 3045c6c1daeSBarry Smith 3055c6c1daeSBarry Smith #undef __FUNCT__ 3065c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGSetDimension" 3075c6c1daeSBarry Smith /*@ 3085c6c1daeSBarry Smith PetscDrawLGSetDimension - Change the number of lines that are to be drawn. 3095c6c1daeSBarry Smith 3105b399a63SLisandro Dalcin Logically Collective on PetscDrawLG 3115c6c1daeSBarry Smith 3125c6c1daeSBarry Smith Input Parameter: 3135c6c1daeSBarry Smith + lg - the line graph context. 3145c6c1daeSBarry Smith - dim - the number of curves. 3155c6c1daeSBarry Smith 3165c6c1daeSBarry Smith Level: intermediate 3175c6c1daeSBarry Smith 3185c6c1daeSBarry Smith Concepts: line graph^setting number of lines 3195c6c1daeSBarry Smith 320ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate(), PetscDrawLGGetDimension() 3215c6c1daeSBarry Smith @*/ 3225c6c1daeSBarry Smith PetscErrorCode PetscDrawLGSetDimension(PetscDrawLG lg,PetscInt dim) 3235c6c1daeSBarry Smith { 3245c6c1daeSBarry Smith PetscErrorCode ierr; 3255c6c1daeSBarry Smith PetscInt i; 3265c6c1daeSBarry Smith 3275c6c1daeSBarry Smith PetscFunctionBegin; 3285c6c1daeSBarry Smith PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1); 3295c6c1daeSBarry Smith PetscValidLogicalCollectiveInt(lg,dim,2); 3305c6c1daeSBarry Smith if (lg->dim == dim) PetscFunctionReturn(0); 3315c6c1daeSBarry Smith 3325c6c1daeSBarry Smith ierr = PetscFree2(lg->x,lg->y);CHKERRQ(ierr); 3335c6c1daeSBarry Smith if (lg->legend) { 3345c6c1daeSBarry Smith for (i=0; i<lg->dim; i++) { 3355c6c1daeSBarry Smith ierr = PetscFree(lg->legend[i]);CHKERRQ(ierr); 3365c6c1daeSBarry Smith } 3375c6c1daeSBarry Smith ierr = PetscFree(lg->legend);CHKERRQ(ierr); 3385c6c1daeSBarry Smith } 3395c6c1daeSBarry Smith ierr = PetscFree(lg->colors);CHKERRQ(ierr); 3405c6c1daeSBarry Smith lg->dim = dim; 341dcca6d9dSJed Brown ierr = PetscMalloc2(dim*CHUNCKSIZE,&lg->x,dim*CHUNCKSIZE,&lg->y);CHKERRQ(ierr); 3423bb1ff40SBarry Smith ierr = PetscLogObjectMemory((PetscObject)lg,2*dim*CHUNCKSIZE*sizeof(PetscReal));CHKERRQ(ierr); 3435c6c1daeSBarry Smith lg->len = dim*CHUNCKSIZE; 3445c6c1daeSBarry Smith PetscFunctionReturn(0); 3455c6c1daeSBarry Smith } 3465c6c1daeSBarry Smith 34771917b75SLisandro Dalcin 34871917b75SLisandro Dalcin #undef __FUNCT__ 34971917b75SLisandro Dalcin #define __FUNCT__ "PetscDrawLGSetLimits" 35071917b75SLisandro Dalcin /*@ 35171917b75SLisandro Dalcin PetscDrawLGSetLimits - Sets the axis limits for a line graph. If more 35271917b75SLisandro Dalcin points are added after this call, the limits will be adjusted to 35371917b75SLisandro Dalcin include those additional points. 35471917b75SLisandro Dalcin 35571917b75SLisandro Dalcin Logically Collective on PetscDrawLG 35671917b75SLisandro Dalcin 35771917b75SLisandro Dalcin Input Parameters: 35871917b75SLisandro Dalcin + xlg - the line graph context 35971917b75SLisandro Dalcin - x_min,x_max,y_min,y_max - the limits 36071917b75SLisandro Dalcin 36171917b75SLisandro Dalcin Level: intermediate 36271917b75SLisandro Dalcin 36371917b75SLisandro Dalcin Concepts: line graph^setting axis 36471917b75SLisandro Dalcin 365ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate() 366ba1e01c4SBarry Smith 36771917b75SLisandro Dalcin @*/ 36871917b75SLisandro Dalcin PetscErrorCode PetscDrawLGSetLimits(PetscDrawLG lg,PetscReal x_min,PetscReal x_max,PetscReal y_min,PetscReal y_max) 36971917b75SLisandro Dalcin { 37071917b75SLisandro Dalcin PetscFunctionBegin; 37171917b75SLisandro Dalcin PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1); 37271917b75SLisandro Dalcin 37371917b75SLisandro Dalcin (lg)->xmin = x_min; 37471917b75SLisandro Dalcin (lg)->xmax = x_max; 37571917b75SLisandro Dalcin (lg)->ymin = y_min; 37671917b75SLisandro Dalcin (lg)->ymax = y_max; 37771917b75SLisandro Dalcin PetscFunctionReturn(0); 37871917b75SLisandro Dalcin } 37971917b75SLisandro Dalcin 3805c6c1daeSBarry Smith #undef __FUNCT__ 3815c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGReset" 3825c6c1daeSBarry Smith /*@ 3835c6c1daeSBarry Smith PetscDrawLGReset - Clears line graph to allow for reuse with new data. 3845c6c1daeSBarry Smith 3855b399a63SLisandro Dalcin Logically Collective on PetscDrawLG 3865c6c1daeSBarry Smith 3875c6c1daeSBarry Smith Input Parameter: 3885c6c1daeSBarry Smith . lg - the line graph context. 3895c6c1daeSBarry Smith 3905c6c1daeSBarry Smith Level: intermediate 3915c6c1daeSBarry Smith 3925c6c1daeSBarry Smith Concepts: line graph^restarting 3935c6c1daeSBarry Smith 394ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate() 395ba1e01c4SBarry Smith 3965c6c1daeSBarry Smith @*/ 3975c6c1daeSBarry Smith PetscErrorCode PetscDrawLGReset(PetscDrawLG lg) 3985c6c1daeSBarry Smith { 3995c6c1daeSBarry Smith PetscFunctionBegin; 4005c6c1daeSBarry Smith PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1); 4015c6c1daeSBarry Smith lg->xmin = 1.e20; 4025c6c1daeSBarry Smith lg->ymin = 1.e20; 4035c6c1daeSBarry Smith lg->xmax = -1.e20; 4045c6c1daeSBarry Smith lg->ymax = -1.e20; 4055c6c1daeSBarry Smith lg->loc = 0; 4065c6c1daeSBarry Smith lg->nopts = 0; 4075c6c1daeSBarry Smith PetscFunctionReturn(0); 4085c6c1daeSBarry Smith } 4095c6c1daeSBarry Smith 4105c6c1daeSBarry Smith #undef __FUNCT__ 4115c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGDestroy" 4125c6c1daeSBarry Smith /*@ 4135c6c1daeSBarry Smith PetscDrawLGDestroy - Frees all space taken up by line graph data structure. 4145c6c1daeSBarry Smith 4155b399a63SLisandro Dalcin Collective on PetscDrawLG 4165c6c1daeSBarry Smith 4175c6c1daeSBarry Smith Input Parameter: 4185c6c1daeSBarry Smith . lg - the line graph context 4195c6c1daeSBarry Smith 4205c6c1daeSBarry Smith Level: intermediate 4215c6c1daeSBarry Smith 4225c6c1daeSBarry Smith .seealso: PetscDrawLGCreate() 4235c6c1daeSBarry Smith @*/ 4245c6c1daeSBarry Smith PetscErrorCode PetscDrawLGDestroy(PetscDrawLG *lg) 4255c6c1daeSBarry Smith { 4265c6c1daeSBarry Smith PetscErrorCode ierr; 4275c6c1daeSBarry Smith PetscInt i; 4285c6c1daeSBarry Smith 4295c6c1daeSBarry Smith PetscFunctionBegin; 4305c6c1daeSBarry Smith if (!*lg) PetscFunctionReturn(0); 431e118a51fSLisandro Dalcin PetscValidHeaderSpecific(*lg,PETSC_DRAWLG_CLASSID,1); 432e118a51fSLisandro Dalcin if (--((PetscObject)(*lg))->refct > 0) {*lg = NULL; PetscFunctionReturn(0);} 4335c6c1daeSBarry Smith 4345c6c1daeSBarry Smith if ((*lg)->legend) { 4355c6c1daeSBarry Smith for (i=0; i<(*lg)->dim; i++) { 4365c6c1daeSBarry Smith ierr = PetscFree((*lg)->legend[i]);CHKERRQ(ierr); 4375c6c1daeSBarry Smith } 4385c6c1daeSBarry Smith ierr = PetscFree((*lg)->legend);CHKERRQ(ierr); 4395c6c1daeSBarry Smith } 4405c6c1daeSBarry Smith ierr = PetscFree((*lg)->colors);CHKERRQ(ierr); 4415c6c1daeSBarry Smith ierr = PetscFree2((*lg)->x,(*lg)->y);CHKERRQ(ierr); 442e118a51fSLisandro Dalcin ierr = PetscDrawAxisDestroy(&(*lg)->axis);CHKERRQ(ierr); 443e118a51fSLisandro Dalcin ierr = PetscDrawDestroy(&(*lg)->win);CHKERRQ(ierr); 4445c6c1daeSBarry Smith ierr = PetscHeaderDestroy(lg);CHKERRQ(ierr); 4455c6c1daeSBarry Smith PetscFunctionReturn(0); 4465c6c1daeSBarry Smith } 4475c6c1daeSBarry Smith #undef __FUNCT__ 448b6fe0379SLisandro Dalcin #define __FUNCT__ "PetscDrawLGSetUseMarkers" 4495c6c1daeSBarry Smith /*@ 450b6fe0379SLisandro Dalcin PetscDrawLGSetUseMarkers - Causes LG to draw a marker for each data-point. 4515c6c1daeSBarry Smith 4525b399a63SLisandro Dalcin Logically Collective on PetscDrawLG 4535c6c1daeSBarry Smith 4545c6c1daeSBarry Smith Input Parameters: 455287de1a7SBarry Smith + lg - the linegraph context 456287de1a7SBarry Smith - flg - should mark each data point 457287de1a7SBarry Smith 458287de1a7SBarry Smith Options Database: 459b6fe0379SLisandro Dalcin . -lg_use_markers <true,false> 4605c6c1daeSBarry Smith 4615c6c1daeSBarry Smith Level: intermediate 4625c6c1daeSBarry Smith 4635c6c1daeSBarry Smith Concepts: line graph^showing points 4645c6c1daeSBarry Smith 465ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate() 466ba1e01c4SBarry Smith 4675c6c1daeSBarry Smith @*/ 468b6fe0379SLisandro Dalcin PetscErrorCode PetscDrawLGSetUseMarkers(PetscDrawLG lg,PetscBool flg) 4695c6c1daeSBarry Smith { 4705c6c1daeSBarry Smith PetscFunctionBegin; 471e118a51fSLisandro Dalcin PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1); 47245f3bb6eSLisandro Dalcin PetscValidLogicalCollectiveBool(lg,flg,2); 473b6fe0379SLisandro Dalcin lg->use_markers = flg; 4745c6c1daeSBarry Smith PetscFunctionReturn(0); 4755c6c1daeSBarry Smith } 4765c6c1daeSBarry Smith 4775c6c1daeSBarry Smith #undef __FUNCT__ 4785c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGDraw" 4795c6c1daeSBarry Smith /*@ 4805c6c1daeSBarry Smith PetscDrawLGDraw - Redraws a line graph. 4815c6c1daeSBarry Smith 4825b399a63SLisandro Dalcin Collective on PetscDrawLG 4835c6c1daeSBarry Smith 4845c6c1daeSBarry Smith Input Parameter: 4855c6c1daeSBarry Smith . lg - the line graph context 4865c6c1daeSBarry Smith 4875c6c1daeSBarry Smith Level: intermediate 4885c6c1daeSBarry Smith 489ba1e01c4SBarry Smith .seealso: PetscDrawSPDraw(), PetscDrawLGSPDraw(), PetscDrawLGReset() 4905c6c1daeSBarry Smith 4915c6c1daeSBarry Smith @*/ 4925c6c1daeSBarry Smith PetscErrorCode PetscDrawLGDraw(PetscDrawLG lg) 4935c6c1daeSBarry Smith { 494e118a51fSLisandro Dalcin PetscReal xmin,xmax,ymin,ymax; 4955c6c1daeSBarry Smith PetscErrorCode ierr; 496e118a51fSLisandro Dalcin PetscMPIInt rank; 497e118a51fSLisandro Dalcin PetscDraw draw; 4985c6c1daeSBarry Smith PetscBool isnull; 4995c6c1daeSBarry Smith 5005c6c1daeSBarry Smith PetscFunctionBegin; 5015c6c1daeSBarry Smith PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1); 5028f69470aSLisandro Dalcin ierr = PetscDrawIsNull(lg->win,&isnull);CHKERRQ(ierr); 5038f69470aSLisandro Dalcin if (isnull) PetscFunctionReturn(0); 504e118a51fSLisandro Dalcin ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)lg),&rank);CHKERRQ(ierr); 5055c6c1daeSBarry Smith 5065b399a63SLisandro Dalcin draw = lg->win; 5075c6c1daeSBarry Smith ierr = PetscDrawCheckResizedWindow(draw);CHKERRQ(ierr); 5085b399a63SLisandro Dalcin ierr = PetscDrawClear(draw);CHKERRQ(ierr); 509e118a51fSLisandro Dalcin 510e118a51fSLisandro Dalcin xmin = lg->xmin; xmax = lg->xmax; ymin = lg->ymin; ymax = lg->ymax; 5115c6c1daeSBarry Smith ierr = PetscDrawAxisSetLimits(lg->axis,xmin,xmax,ymin,ymax);CHKERRQ(ierr); 5125c6c1daeSBarry Smith ierr = PetscDrawAxisDraw(lg->axis);CHKERRQ(ierr); 5135c6c1daeSBarry Smith 5145b399a63SLisandro Dalcin ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr); 5155c6c1daeSBarry Smith if (!rank) { 516e118a51fSLisandro Dalcin int i,j,dim=lg->dim,nopts=lg->nopts,cl; 5175c6c1daeSBarry Smith for (i=0; i<dim; i++) { 5185c6c1daeSBarry Smith for (j=1; j<nopts; j++) { 51971917b75SLisandro Dalcin cl = lg->colors ? lg->colors[i] : (PETSC_DRAW_BLACK + i); 5205c6c1daeSBarry 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); 52171917b75SLisandro Dalcin if (lg->use_markers) {ierr = PetscDrawMarker(draw,lg->x[j*dim+i],lg->y[j*dim+i],cl);CHKERRQ(ierr);} 5225c6c1daeSBarry Smith } 5235c6c1daeSBarry Smith } 5245c6c1daeSBarry Smith } 52556a02f31SLisandro Dalcin if (!rank && lg->legend) { 526e118a51fSLisandro Dalcin int i,dim=lg->dim,cl; 5275c6c1daeSBarry Smith PetscReal xl,yl,xr,yr,tw,th; 52871917b75SLisandro Dalcin size_t slen,len=0; 52971917b75SLisandro Dalcin ierr = PetscDrawAxisGetLimits(lg->axis,&xl,&xr,&yl,&yr);CHKERRQ(ierr); 5305c6c1daeSBarry Smith ierr = PetscDrawStringGetSize(draw,&tw,&th);CHKERRQ(ierr); 5315c6c1daeSBarry Smith for (i=0; i<dim; i++) { 53271917b75SLisandro Dalcin ierr = PetscStrlen(lg->legend[i],&slen);CHKERRQ(ierr); 53371917b75SLisandro Dalcin len = PetscMax(len,slen); 5345c6c1daeSBarry Smith } 53571917b75SLisandro Dalcin xr = xr - 1.5*tw; xl = xr - (len + 7)*tw; 53671917b75SLisandro Dalcin yr = yr - 1.0*th; yl = yr - (dim + 1)*th; 53771917b75SLisandro Dalcin ierr = PetscDrawLine(draw,xl,yl,xr,yl,PETSC_DRAW_BLACK);CHKERRQ(ierr); 53871917b75SLisandro Dalcin ierr = PetscDrawLine(draw,xr,yl,xr,yr,PETSC_DRAW_BLACK);CHKERRQ(ierr); 53971917b75SLisandro Dalcin ierr = PetscDrawLine(draw,xr,yr,xl,yr,PETSC_DRAW_BLACK);CHKERRQ(ierr); 54071917b75SLisandro Dalcin ierr = PetscDrawLine(draw,xl,yr,xl,yl,PETSC_DRAW_BLACK);CHKERRQ(ierr); 5415c6c1daeSBarry Smith for (i=0; i<dim; i++) { 54271917b75SLisandro Dalcin cl = lg->colors ? lg->colors[i] : (PETSC_DRAW_BLACK + i); 54371917b75SLisandro Dalcin ierr = PetscDrawLine(draw,xl + 1*tw,yr - (i + 1)*th,xl + 5*tw,yr - (i + 1)*th,cl);CHKERRQ(ierr); 54471917b75SLisandro Dalcin ierr = PetscDrawString(draw,xl + 6*tw,yr - (i + 1.5)*th,PETSC_DRAW_BLACK,lg->legend[i]);CHKERRQ(ierr); 5455c6c1daeSBarry Smith } 5465c6c1daeSBarry Smith } 547e118a51fSLisandro Dalcin ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr); 5485b399a63SLisandro Dalcin 5495b399a63SLisandro Dalcin ierr = PetscDrawFlush(draw);CHKERRQ(ierr); 550e118a51fSLisandro Dalcin ierr = PetscDrawPause(draw);CHKERRQ(ierr); 5515c6c1daeSBarry Smith PetscFunctionReturn(0); 5525c6c1daeSBarry Smith } 5535c6c1daeSBarry Smith 5545c6c1daeSBarry Smith #undef __FUNCT__ 55557fd6651SLisandro Dalcin #define __FUNCT__ "PetscDrawLGSave" 55657fd6651SLisandro Dalcin /*@ 55757fd6651SLisandro Dalcin PetscDrawLGSave - Saves a drawn image 55857fd6651SLisandro Dalcin 55957fd6651SLisandro Dalcin Collective on PetscDrawLG 56057fd6651SLisandro Dalcin 56157fd6651SLisandro Dalcin Input Parameter: 56257fd6651SLisandro Dalcin . lg - The line graph context 56357fd6651SLisandro Dalcin 56457fd6651SLisandro Dalcin Level: intermediate 56557fd6651SLisandro Dalcin 56657fd6651SLisandro Dalcin Concepts: line graph^saving 56757fd6651SLisandro Dalcin 56857fd6651SLisandro Dalcin .seealso: PetscDrawLGCreate(), PetscDrawLGGetDraw(), PetscDrawSetSave(), PetscDrawSave() 56957fd6651SLisandro Dalcin @*/ 57057fd6651SLisandro Dalcin PetscErrorCode PetscDrawLGSave(PetscDrawLG lg) 57157fd6651SLisandro Dalcin { 57257fd6651SLisandro Dalcin PetscErrorCode ierr; 57357fd6651SLisandro Dalcin 57457fd6651SLisandro Dalcin PetscFunctionBegin; 57557fd6651SLisandro Dalcin PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1); 57657fd6651SLisandro Dalcin ierr = PetscDrawSave(lg->win);CHKERRQ(ierr); 57757fd6651SLisandro Dalcin PetscFunctionReturn(0); 57857fd6651SLisandro Dalcin } 57957fd6651SLisandro Dalcin 58057fd6651SLisandro Dalcin #undef __FUNCT__ 58134a5a0e3SBarry Smith #define __FUNCT__ "PetscDrawLGView" 5825c6c1daeSBarry Smith /*@ 58334a5a0e3SBarry Smith PetscDrawLGView - Prints a line graph. 5845c6c1daeSBarry Smith 5855b399a63SLisandro Dalcin Collective on PetscDrawLG 5865c6c1daeSBarry Smith 5875c6c1daeSBarry Smith Input Parameter: 5885c6c1daeSBarry Smith . lg - the line graph context 5895c6c1daeSBarry Smith 5905c6c1daeSBarry Smith Level: beginner 5915c6c1daeSBarry Smith 592ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate() 593ba1e01c4SBarry Smith 5945c6c1daeSBarry Smith .keywords: draw, line, graph 5955c6c1daeSBarry Smith @*/ 59634a5a0e3SBarry Smith PetscErrorCode PetscDrawLGView(PetscDrawLG lg,PetscViewer viewer) 5975c6c1daeSBarry Smith { 5985c6c1daeSBarry Smith PetscReal xmin=lg->xmin, xmax=lg->xmax, ymin=lg->ymin, ymax=lg->ymax; 59934a5a0e3SBarry Smith PetscInt i, j, dim = lg->dim, nopts = lg->nopts; 60034a5a0e3SBarry Smith PetscErrorCode ierr; 6015c6c1daeSBarry Smith 6025c6c1daeSBarry Smith PetscFunctionBegin; 6035c6c1daeSBarry Smith PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1); 604e118a51fSLisandro Dalcin 6055c6c1daeSBarry Smith if (nopts < 1) PetscFunctionReturn(0); 6065c6c1daeSBarry Smith if (xmin > xmax || ymin > ymax) PetscFunctionReturn(0); 6075c6c1daeSBarry Smith 60834a5a0e3SBarry Smith if (!viewer){ 60934a5a0e3SBarry Smith ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)lg),&viewer);CHKERRQ(ierr); 61034a5a0e3SBarry Smith } 61198c3331eSBarry Smith ierr = PetscObjectPrintClassNamePrefixType((PetscObject)lg,viewer);CHKERRQ(ierr); 6125c6c1daeSBarry Smith for (i = 0; i < dim; i++) { 61334a5a0e3SBarry Smith ierr = PetscViewerASCIIPrintf(viewer, "Line %D>\n", i);CHKERRQ(ierr); 6145c6c1daeSBarry Smith for (j = 0; j < nopts; j++) { 61534a5a0e3SBarry Smith ierr = PetscViewerASCIIPrintf(viewer, " X: %g Y: %g\n", (double)lg->x[j*dim+i], (double)lg->y[j*dim+i]);CHKERRQ(ierr); 6165c6c1daeSBarry Smith } 6175c6c1daeSBarry Smith } 6185c6c1daeSBarry Smith PetscFunctionReturn(0); 6195c6c1daeSBarry Smith } 620287de1a7SBarry Smith 621287de1a7SBarry Smith #undef __FUNCT__ 622c2bac407SLisandro Dalcin #define __FUNCT__ "PetscDrawLGSetOptionsPrefix" 623c2bac407SLisandro Dalcin /*@C 624c2bac407SLisandro Dalcin PetscDrawLGSetOptionsPrefix - Sets the prefix used for searching for all 625c2bac407SLisandro Dalcin PetscDrawLG options in the database. 626c2bac407SLisandro Dalcin 627c2bac407SLisandro Dalcin Logically Collective on PetscDrawLG 628c2bac407SLisandro Dalcin 629c2bac407SLisandro Dalcin Input Parameter: 630c2bac407SLisandro Dalcin + lg - the line graph context 631c2bac407SLisandro Dalcin - prefix - the prefix to prepend to all option names 632c2bac407SLisandro Dalcin 633c2bac407SLisandro Dalcin Level: advanced 634c2bac407SLisandro Dalcin 635c2bac407SLisandro Dalcin .keywords: PetscDrawLG, set, options, prefix, database 636c2bac407SLisandro Dalcin 637ba1e01c4SBarry Smith .seealso: PetscDrawLGSetFromOptions(), PetscDrawLGCreate() 638c2bac407SLisandro Dalcin @*/ 639c2bac407SLisandro Dalcin PetscErrorCode PetscDrawLGSetOptionsPrefix(PetscDrawLG lg,const char prefix[]) 640c2bac407SLisandro Dalcin { 641c2bac407SLisandro Dalcin PetscErrorCode ierr; 642c2bac407SLisandro Dalcin 643c2bac407SLisandro Dalcin PetscFunctionBegin; 644c2bac407SLisandro Dalcin PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1); 645c2bac407SLisandro Dalcin ierr = PetscObjectSetOptionsPrefix((PetscObject)lg,prefix);CHKERRQ(ierr); 646c2bac407SLisandro Dalcin PetscFunctionReturn(0); 647c2bac407SLisandro Dalcin } 648c2bac407SLisandro Dalcin 649c2bac407SLisandro Dalcin #undef __FUNCT__ 650287de1a7SBarry Smith #define __FUNCT__ "PetscDrawLGSetFromOptions" 651287de1a7SBarry Smith /*@ 652287de1a7SBarry Smith PetscDrawLGSetFromOptions - Sets options related to the PetscDrawLG 653287de1a7SBarry Smith 6545b399a63SLisandro Dalcin Collective on PetscDrawLG 655287de1a7SBarry Smith 656287de1a7SBarry Smith Options Database: 657287de1a7SBarry Smith 658287de1a7SBarry Smith Level: intermediate 659287de1a7SBarry Smith 660287de1a7SBarry Smith Concepts: line graph^creating 661287de1a7SBarry Smith 662287de1a7SBarry Smith .seealso: PetscDrawLGDestroy(), PetscDrawLGCreate() 663287de1a7SBarry Smith @*/ 664287de1a7SBarry Smith PetscErrorCode PetscDrawLGSetFromOptions(PetscDrawLG lg) 665287de1a7SBarry Smith { 666287de1a7SBarry Smith PetscErrorCode ierr; 66771917b75SLisandro Dalcin PetscBool usemarkers,set; 66871917b75SLisandro Dalcin PetscDrawMarkerType markertype; 669287de1a7SBarry Smith 670287de1a7SBarry Smith PetscFunctionBegin; 671e118a51fSLisandro Dalcin PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1); 672e118a51fSLisandro Dalcin 67371917b75SLisandro Dalcin ierr = PetscDrawGetMarkerType(lg->win,&markertype);CHKERRQ(ierr); 67471917b75SLisandro Dalcin ierr = PetscOptionsGetEnum(((PetscObject)lg)->options,((PetscObject)lg)->prefix,"-lg_marker_type",PetscDrawMarkerTypes,(PetscEnum*)&markertype,&set);CHKERRQ(ierr); 67571917b75SLisandro Dalcin if (set) { 67671917b75SLisandro Dalcin ierr = PetscDrawLGSetUseMarkers(lg,PETSC_TRUE);CHKERRQ(ierr); 67771917b75SLisandro Dalcin ierr = PetscDrawSetMarkerType(lg->win,markertype);CHKERRQ(ierr); 67871917b75SLisandro Dalcin } 67971917b75SLisandro Dalcin usemarkers = lg->use_markers; 68071917b75SLisandro Dalcin ierr = PetscOptionsGetBool(((PetscObject)lg)->options,((PetscObject)lg)->prefix,"-lg_use_markers",&usemarkers,&set);CHKERRQ(ierr); 68171917b75SLisandro Dalcin if (set) {ierr = PetscDrawLGSetUseMarkers(lg,usemarkers);CHKERRQ(ierr);} 682287de1a7SBarry Smith PetscFunctionReturn(0); 683287de1a7SBarry Smith } 684