xref: /petsc/src/sys/classes/draw/utils/lgc.c (revision d0609ced746bc51b019815ca91d747429db24893)
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;
815c6c1daeSBarry Smith 
825c6c1daeSBarry Smith   PetscFunctionBegin;
835c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
84064a246eSJacob Faibussowitsch   PetscValidHeaderSpecific(sp,PETSC_DRAWLG_CLASSID,2);
859566063dSJacob Faibussowitsch   PetscCall(PetscDrawIsNull(lg->win,&isnull));
86e118a51fSLisandro Dalcin   if (isnull) PetscFunctionReturn(0);
879566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)lg),&rank));
885c6c1daeSBarry Smith 
895b399a63SLisandro Dalcin   draw = lg->win;
909566063dSJacob Faibussowitsch   PetscCall(PetscDrawCheckResizedWindow(draw));
919566063dSJacob Faibussowitsch   PetscCall(PetscDrawClear(draw));
92e118a51fSLisandro Dalcin 
93e118a51fSLisandro Dalcin   xmin = PetscMin(lg->xmin,sp->xmin); ymin = PetscMin(lg->ymin,sp->ymin);
94e118a51fSLisandro Dalcin   xmax = PetscMax(lg->xmax,sp->xmax); ymax = PetscMax(lg->ymax,sp->ymax);
959566063dSJacob Faibussowitsch   PetscCall(PetscDrawAxisSetLimits(lg->axis,xmin,xmax,ymin,ymax));
969566063dSJacob Faibussowitsch   PetscCall(PetscDrawAxisDraw(lg->axis));
975c6c1daeSBarry Smith 
98*d0609cedSBarry Smith   PetscDrawCollectiveBegin(draw);
99dd400576SPatrick Sanan   if (rank == 0) {
100e118a51fSLisandro Dalcin     int i,j,dim,nopts;
1015c6c1daeSBarry Smith     dim   = lg->dim;
1025c6c1daeSBarry Smith     nopts = lg->nopts;
1035c6c1daeSBarry Smith     for (i=0; i<dim; i++) {
1045c6c1daeSBarry Smith       for (j=1; j<nopts; j++) {
1059566063dSJacob Faibussowitsch         PetscCall(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));
106b6fe0379SLisandro Dalcin         if (lg->use_markers) {
1079566063dSJacob Faibussowitsch           PetscCall(PetscDrawMarker(draw,lg->x[j*dim+i],lg->y[j*dim+i],PETSC_DRAW_RED));
1085c6c1daeSBarry Smith         }
1095c6c1daeSBarry Smith       }
1105c6c1daeSBarry Smith     }
1115c6c1daeSBarry Smith     dim   = sp->dim;
1125c6c1daeSBarry Smith     nopts = sp->nopts;
1135c6c1daeSBarry Smith     for (i=0; i<dim; i++) {
1145c6c1daeSBarry Smith       for (j=0; j<nopts; j++) {
1159566063dSJacob Faibussowitsch         PetscCall(PetscDrawMarker(draw,sp->x[j*dim+i],sp->y[j*dim+i],PETSC_DRAW_RED));
1165c6c1daeSBarry Smith       }
1175c6c1daeSBarry Smith     }
1185c6c1daeSBarry Smith   }
119*d0609cedSBarry Smith   PetscDrawCollectiveEnd(draw);
1205b399a63SLisandro Dalcin 
1219566063dSJacob Faibussowitsch   PetscCall(PetscDrawFlush(draw));
1229566063dSJacob Faibussowitsch   PetscCall(PetscDrawPause(draw));
1235c6c1daeSBarry Smith   PetscFunctionReturn(0);
1245c6c1daeSBarry Smith }
1255c6c1daeSBarry Smith 
1265c6c1daeSBarry Smith /*@
1275c6c1daeSBarry Smith     PetscDrawLGCreate - Creates a line graph data structure.
1285c6c1daeSBarry Smith 
1295b399a63SLisandro Dalcin     Collective on PetscDraw
1305c6c1daeSBarry Smith 
1315c6c1daeSBarry Smith     Input Parameters:
1325c6c1daeSBarry Smith +   draw - the window where the graph will be made.
1335c6c1daeSBarry Smith -   dim - the number of curves which will be drawn
1345c6c1daeSBarry Smith 
1355c6c1daeSBarry Smith     Output Parameters:
136e118a51fSLisandro Dalcin .   outlg - the line graph context
1375c6c1daeSBarry Smith 
1385c6c1daeSBarry Smith     Level: intermediate
1395c6c1daeSBarry Smith 
14095452b02SPatrick Sanan     Notes:
14195452b02SPatrick 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
1427e25d57eSBarry Smith            zeroth MPI process in the communicator. All MPI processes in the communicator must call PetscDrawLGDraw() to display the updated graph.
1437e25d57eSBarry Smith 
144ba1e01c4SBarry Smith .seealso:  PetscDrawLGDestroy(), PetscDrawLGAddPoint(), PetscDrawLGAddCommonPoint(), PetscDrawLGAddPoints(), PetscDrawLGDraw(), PetscDrawLGSave(),
145ba1e01c4SBarry Smith            PetscDrawLGView(), PetscDrawLGReset(), PetscDrawLGSetDimension(), PetscDrawLGGetDimension(), PetscDrawLGSetLegend(), PetscDrawLGGetAxis(),
146ba1e01c4SBarry Smith            PetscDrawLGGetDraw(), PetscDrawLGSetUseMarkers(), PetscDrawLGSetLimits(), PetscDrawLGSetColors(), PetscDrawLGSetOptionsPrefix(), PetscDrawLGSetFromOptions()
1475c6c1daeSBarry Smith @*/
148e118a51fSLisandro Dalcin PetscErrorCode  PetscDrawLGCreate(PetscDraw draw,PetscInt dim,PetscDrawLG *outlg)
1495c6c1daeSBarry Smith {
1505c6c1daeSBarry Smith   PetscDrawLG    lg;
1515c6c1daeSBarry Smith 
1525c6c1daeSBarry Smith   PetscFunctionBegin;
1535c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
154e118a51fSLisandro Dalcin   PetscValidLogicalCollectiveInt(draw,dim,2);
155e118a51fSLisandro Dalcin   PetscValidPointer(outlg,3);
156e118a51fSLisandro Dalcin 
1579566063dSJacob Faibussowitsch   PetscCall(PetscHeaderCreate(lg,PETSC_DRAWLG_CLASSID,"DrawLG","Line Graph","Draw",PetscObjectComm((PetscObject)draw),PetscDrawLGDestroy,NULL));
1589566063dSJacob Faibussowitsch   PetscCall(PetscLogObjectParent((PetscObject)draw,(PetscObject)lg));
1599566063dSJacob Faibussowitsch   PetscCall(PetscDrawLGSetOptionsPrefix(lg,((PetscObject)draw)->prefix));
160e118a51fSLisandro Dalcin 
1619566063dSJacob Faibussowitsch   PetscCall(PetscObjectReference((PetscObject)draw));
162e118a51fSLisandro Dalcin   lg->win = draw;
163a297a907SKarl Rupp 
16469c83917SLisandro Dalcin   lg->view    = NULL;
16569c83917SLisandro Dalcin   lg->destroy = NULL;
1665c6c1daeSBarry Smith   lg->nopts   = 0;
1675c6c1daeSBarry Smith   lg->dim     = dim;
1685c6c1daeSBarry Smith   lg->xmin    = 1.e20;
1695c6c1daeSBarry Smith   lg->ymin    = 1.e20;
1705c6c1daeSBarry Smith   lg->xmax    = -1.e20;
1715c6c1daeSBarry Smith   lg->ymax    = -1.e20;
172a297a907SKarl Rupp 
1739566063dSJacob Faibussowitsch   PetscCall(PetscMalloc2(dim*PETSC_DRAW_LG_CHUNK_SIZE,&lg->x,dim*PETSC_DRAW_LG_CHUNK_SIZE,&lg->y));
1749566063dSJacob Faibussowitsch   PetscCall(PetscLogObjectMemory((PetscObject)lg,2*dim*PETSC_DRAW_LG_CHUNK_SIZE*sizeof(PetscReal)));
175a297a907SKarl Rupp 
176999739cfSJacob Faibussowitsch   lg->len         = dim*PETSC_DRAW_LG_CHUNK_SIZE;
1775c6c1daeSBarry Smith   lg->loc         = 0;
178b6fe0379SLisandro Dalcin   lg->use_markers = PETSC_FALSE;
179a297a907SKarl Rupp 
1809566063dSJacob Faibussowitsch   PetscCall(PetscDrawAxisCreate(draw,&lg->axis));
1819566063dSJacob Faibussowitsch   PetscCall(PetscLogObjectParent((PetscObject)lg,(PetscObject)lg->axis));
182a297a907SKarl Rupp 
183e118a51fSLisandro Dalcin   *outlg = lg;
1845c6c1daeSBarry Smith   PetscFunctionReturn(0);
1855c6c1daeSBarry Smith }
1865c6c1daeSBarry Smith 
1875c6c1daeSBarry Smith /*@
1885c6c1daeSBarry Smith    PetscDrawLGSetColors - Sets the color of each line graph drawn
1895c6c1daeSBarry Smith 
1905b399a63SLisandro Dalcin    Logically Collective on PetscDrawLG
1915c6c1daeSBarry Smith 
192d8d19677SJose E. Roman    Input Parameters:
1935c6c1daeSBarry Smith +  lg - the line graph context.
1945c6c1daeSBarry Smith -  colors - the colors
1955c6c1daeSBarry Smith 
1965c6c1daeSBarry Smith    Level: intermediate
1975c6c1daeSBarry Smith 
198ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate()
199ba1e01c4SBarry Smith 
2005c6c1daeSBarry Smith @*/
20145f3bb6eSLisandro Dalcin PetscErrorCode  PetscDrawLGSetColors(PetscDrawLG lg,const int colors[])
2025c6c1daeSBarry Smith {
2035c6c1daeSBarry Smith   PetscFunctionBegin;
2045c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
20545f3bb6eSLisandro Dalcin   if (lg->dim) PetscValidIntPointer(colors,2);
206e118a51fSLisandro Dalcin 
2079566063dSJacob Faibussowitsch   PetscCall(PetscFree(lg->colors));
2089566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(lg->dim,&lg->colors));
2099566063dSJacob Faibussowitsch   PetscCall(PetscArraycpy(lg->colors,colors,lg->dim));
2105c6c1daeSBarry Smith   PetscFunctionReturn(0);
2115c6c1daeSBarry Smith }
2125c6c1daeSBarry Smith 
2135c6c1daeSBarry Smith /*@C
2145c6c1daeSBarry Smith    PetscDrawLGSetLegend - sets the names of each curve plotted
2155c6c1daeSBarry Smith 
2165b399a63SLisandro Dalcin    Logically Collective on PetscDrawLG
2175c6c1daeSBarry Smith 
218d8d19677SJose E. Roman    Input Parameters:
2195c6c1daeSBarry Smith +  lg - the line graph context.
2205c6c1daeSBarry Smith -  names - the names for each curve
2215c6c1daeSBarry Smith 
2225c6c1daeSBarry Smith    Level: intermediate
2235c6c1daeSBarry Smith 
22495452b02SPatrick Sanan    Notes:
22595452b02SPatrick Sanan     Call PetscDrawLGGetAxis() and then change properties of the PetscDrawAxis for detailed control of the plot
226ba1e01c4SBarry Smith 
227ba1e01c4SBarry Smith .seealso: PetscDrawLGGetAxis(), PetscDrawAxis, PetscDrawAxisSetColors(), PetscDrawAxisSetLabels(), PetscDrawAxisSetHoldLimits()
228ba1e01c4SBarry Smith 
2295c6c1daeSBarry Smith @*/
2305c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGSetLegend(PetscDrawLG lg,const char *const *names)
2315c6c1daeSBarry Smith {
2325c6c1daeSBarry Smith   PetscInt       i;
2335c6c1daeSBarry Smith 
2345c6c1daeSBarry Smith   PetscFunctionBegin;
2355c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
23645f3bb6eSLisandro Dalcin   if (names) PetscValidPointer(names,2);
2375c6c1daeSBarry Smith 
2385c6c1daeSBarry Smith   if (lg->legend) {
2395c6c1daeSBarry Smith     for (i=0; i<lg->dim; i++) {
2409566063dSJacob Faibussowitsch       PetscCall(PetscFree(lg->legend[i]));
2415c6c1daeSBarry Smith     }
2429566063dSJacob Faibussowitsch     PetscCall(PetscFree(lg->legend));
2435c6c1daeSBarry Smith   }
2445c6c1daeSBarry Smith   if (names) {
2459566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(lg->dim,&lg->legend));
2465c6c1daeSBarry Smith     for (i=0; i<lg->dim; i++) {
2479566063dSJacob Faibussowitsch       PetscCall(PetscStrallocpy(names[i],&lg->legend[i]));
2485c6c1daeSBarry Smith     }
2495c6c1daeSBarry Smith   }
2505c6c1daeSBarry Smith   PetscFunctionReturn(0);
2515c6c1daeSBarry Smith }
2525c6c1daeSBarry Smith 
2535c6c1daeSBarry Smith /*@
2545c6c1daeSBarry Smith    PetscDrawLGGetDimension - Change the number of lines that are to be drawn.
2555c6c1daeSBarry Smith 
2565b399a63SLisandro Dalcin    Not Collective
2575c6c1daeSBarry Smith 
2585c6c1daeSBarry Smith    Input Parameter:
2595c6c1daeSBarry Smith .  lg - the line graph context.
2605c6c1daeSBarry Smith 
2615c6c1daeSBarry Smith    Output Parameter:
2625c6c1daeSBarry Smith .  dim - the number of curves.
2635c6c1daeSBarry Smith 
2645c6c1daeSBarry Smith    Level: intermediate
2655c6c1daeSBarry Smith 
266ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate(), PetscDrawLGSetDimension()
267ba1e01c4SBarry Smith 
2685c6c1daeSBarry Smith @*/
2695c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGGetDimension(PetscDrawLG lg,PetscInt *dim)
2705c6c1daeSBarry Smith {
2715c6c1daeSBarry Smith   PetscFunctionBegin;
2725c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
27345f3bb6eSLisandro Dalcin   PetscValidIntPointer(dim,2);
2745c6c1daeSBarry Smith   *dim = lg->dim;
2755c6c1daeSBarry Smith   PetscFunctionReturn(0);
2765c6c1daeSBarry Smith }
2775c6c1daeSBarry Smith 
2785c6c1daeSBarry Smith /*@
2795c6c1daeSBarry Smith    PetscDrawLGSetDimension - Change the number of lines that are to be drawn.
2805c6c1daeSBarry Smith 
2815b399a63SLisandro Dalcin    Logically Collective on PetscDrawLG
2825c6c1daeSBarry Smith 
283d8d19677SJose E. Roman    Input Parameters:
2845c6c1daeSBarry Smith +  lg - the line graph context.
2855c6c1daeSBarry Smith -  dim - the number of curves.
2865c6c1daeSBarry Smith 
2875c6c1daeSBarry Smith    Level: intermediate
2885c6c1daeSBarry Smith 
289ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate(), PetscDrawLGGetDimension()
2905c6c1daeSBarry Smith @*/
2915c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGSetDimension(PetscDrawLG lg,PetscInt dim)
2925c6c1daeSBarry Smith {
2935c6c1daeSBarry Smith   PetscInt       i;
2945c6c1daeSBarry Smith 
2955c6c1daeSBarry Smith   PetscFunctionBegin;
2965c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
2975c6c1daeSBarry Smith   PetscValidLogicalCollectiveInt(lg,dim,2);
2985c6c1daeSBarry Smith   if (lg->dim == dim) PetscFunctionReturn(0);
2995c6c1daeSBarry Smith 
3009566063dSJacob Faibussowitsch   PetscCall(PetscFree2(lg->x,lg->y));
3015c6c1daeSBarry Smith   if (lg->legend) {
3025c6c1daeSBarry Smith     for (i=0; i<lg->dim; i++) {
3039566063dSJacob Faibussowitsch       PetscCall(PetscFree(lg->legend[i]));
3045c6c1daeSBarry Smith     }
3059566063dSJacob Faibussowitsch     PetscCall(PetscFree(lg->legend));
3065c6c1daeSBarry Smith   }
3079566063dSJacob Faibussowitsch   PetscCall(PetscFree(lg->colors));
3085c6c1daeSBarry Smith   lg->dim = dim;
3099566063dSJacob Faibussowitsch   PetscCall(PetscMalloc2(dim*PETSC_DRAW_LG_CHUNK_SIZE,&lg->x,dim*PETSC_DRAW_LG_CHUNK_SIZE,&lg->y));
3109566063dSJacob Faibussowitsch   PetscCall(PetscLogObjectMemory((PetscObject)lg,2*dim*PETSC_DRAW_LG_CHUNK_SIZE*sizeof(PetscReal)));
311999739cfSJacob Faibussowitsch   lg->len = dim*PETSC_DRAW_LG_CHUNK_SIZE;
3125c6c1daeSBarry Smith   PetscFunctionReturn(0);
3135c6c1daeSBarry Smith }
3145c6c1daeSBarry Smith 
31571917b75SLisandro Dalcin /*@
31671917b75SLisandro Dalcin    PetscDrawLGSetLimits - Sets the axis limits for a line graph. If more
31771917b75SLisandro Dalcin    points are added after this call, the limits will be adjusted to
31871917b75SLisandro Dalcin    include those additional points.
31971917b75SLisandro Dalcin 
32071917b75SLisandro Dalcin    Logically Collective on PetscDrawLG
32171917b75SLisandro Dalcin 
32271917b75SLisandro Dalcin    Input Parameters:
32371917b75SLisandro Dalcin +  xlg - the line graph context
32471917b75SLisandro Dalcin -  x_min,x_max,y_min,y_max - the limits
32571917b75SLisandro Dalcin 
32671917b75SLisandro Dalcin    Level: intermediate
32771917b75SLisandro Dalcin 
328ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate()
329ba1e01c4SBarry Smith 
33071917b75SLisandro Dalcin @*/
33171917b75SLisandro Dalcin PetscErrorCode  PetscDrawLGSetLimits(PetscDrawLG lg,PetscReal x_min,PetscReal x_max,PetscReal y_min,PetscReal y_max)
33271917b75SLisandro Dalcin {
33371917b75SLisandro Dalcin   PetscFunctionBegin;
33471917b75SLisandro Dalcin   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
33571917b75SLisandro Dalcin 
33671917b75SLisandro Dalcin   (lg)->xmin = x_min;
33771917b75SLisandro Dalcin   (lg)->xmax = x_max;
33871917b75SLisandro Dalcin   (lg)->ymin = y_min;
33971917b75SLisandro Dalcin   (lg)->ymax = y_max;
34071917b75SLisandro Dalcin   PetscFunctionReturn(0);
34171917b75SLisandro Dalcin }
34271917b75SLisandro Dalcin 
3435c6c1daeSBarry Smith /*@
3445c6c1daeSBarry Smith    PetscDrawLGReset - Clears line graph to allow for reuse with new data.
3455c6c1daeSBarry Smith 
3465b399a63SLisandro Dalcin    Logically Collective on PetscDrawLG
3475c6c1daeSBarry Smith 
3485c6c1daeSBarry Smith    Input Parameter:
3495c6c1daeSBarry Smith .  lg - the line graph context.
3505c6c1daeSBarry Smith 
3515c6c1daeSBarry Smith    Level: intermediate
3525c6c1daeSBarry Smith 
353ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate()
3545c6c1daeSBarry Smith @*/
3555c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGReset(PetscDrawLG lg)
3565c6c1daeSBarry Smith {
3575c6c1daeSBarry Smith   PetscFunctionBegin;
3585c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
3595c6c1daeSBarry Smith   lg->xmin  = 1.e20;
3605c6c1daeSBarry Smith   lg->ymin  = 1.e20;
3615c6c1daeSBarry Smith   lg->xmax  = -1.e20;
3625c6c1daeSBarry Smith   lg->ymax  = -1.e20;
3635c6c1daeSBarry Smith   lg->loc   = 0;
3645c6c1daeSBarry Smith   lg->nopts = 0;
3655c6c1daeSBarry Smith   PetscFunctionReturn(0);
3665c6c1daeSBarry Smith }
3675c6c1daeSBarry Smith 
3685c6c1daeSBarry Smith /*@
3695c6c1daeSBarry Smith    PetscDrawLGDestroy - Frees all space taken up by line graph data structure.
3705c6c1daeSBarry Smith 
3715b399a63SLisandro Dalcin    Collective on PetscDrawLG
3725c6c1daeSBarry Smith 
3735c6c1daeSBarry Smith    Input Parameter:
3745c6c1daeSBarry Smith .  lg - the line graph context
3755c6c1daeSBarry Smith 
3765c6c1daeSBarry Smith    Level: intermediate
3775c6c1daeSBarry Smith 
3785c6c1daeSBarry Smith .seealso:  PetscDrawLGCreate()
3795c6c1daeSBarry Smith @*/
3805c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGDestroy(PetscDrawLG *lg)
3815c6c1daeSBarry Smith {
3825c6c1daeSBarry Smith   PetscInt       i;
3835c6c1daeSBarry Smith 
3845c6c1daeSBarry Smith   PetscFunctionBegin;
3855c6c1daeSBarry Smith   if (!*lg) PetscFunctionReturn(0);
386e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(*lg,PETSC_DRAWLG_CLASSID,1);
387e118a51fSLisandro Dalcin   if (--((PetscObject)(*lg))->refct > 0) {*lg = NULL; PetscFunctionReturn(0);}
3885c6c1daeSBarry Smith 
3895c6c1daeSBarry Smith   if ((*lg)->legend) {
3905c6c1daeSBarry Smith     for (i=0; i<(*lg)->dim; i++) {
3919566063dSJacob Faibussowitsch       PetscCall(PetscFree((*lg)->legend[i]));
3925c6c1daeSBarry Smith     }
3939566063dSJacob Faibussowitsch     PetscCall(PetscFree((*lg)->legend));
3945c6c1daeSBarry Smith   }
3959566063dSJacob Faibussowitsch   PetscCall(PetscFree((*lg)->colors));
3969566063dSJacob Faibussowitsch   PetscCall(PetscFree2((*lg)->x,(*lg)->y));
3979566063dSJacob Faibussowitsch   PetscCall(PetscDrawAxisDestroy(&(*lg)->axis));
3989566063dSJacob Faibussowitsch   PetscCall(PetscDrawDestroy(&(*lg)->win));
3999566063dSJacob Faibussowitsch   PetscCall(PetscHeaderDestroy(lg));
4005c6c1daeSBarry Smith   PetscFunctionReturn(0);
4015c6c1daeSBarry Smith }
4025c6c1daeSBarry Smith /*@
403b6fe0379SLisandro Dalcin    PetscDrawLGSetUseMarkers - Causes LG to draw a marker for each data-point.
4045c6c1daeSBarry Smith 
4055b399a63SLisandro Dalcin    Logically Collective on PetscDrawLG
4065c6c1daeSBarry Smith 
4075c6c1daeSBarry Smith    Input Parameters:
408287de1a7SBarry Smith +  lg - the linegraph context
409287de1a7SBarry Smith -  flg - should mark each data point
410287de1a7SBarry Smith 
411287de1a7SBarry Smith    Options Database:
41210699b91SBarry Smith .  -lg_use_markers  <true,false> - true means the graphPetscDrawLG draws a marker for each point
4135c6c1daeSBarry Smith 
4145c6c1daeSBarry Smith    Level: intermediate
4155c6c1daeSBarry Smith 
416ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate()
4175c6c1daeSBarry Smith @*/
418b6fe0379SLisandro Dalcin PetscErrorCode  PetscDrawLGSetUseMarkers(PetscDrawLG lg,PetscBool flg)
4195c6c1daeSBarry Smith {
4205c6c1daeSBarry Smith   PetscFunctionBegin;
421e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
42245f3bb6eSLisandro Dalcin   PetscValidLogicalCollectiveBool(lg,flg,2);
423b6fe0379SLisandro Dalcin   lg->use_markers = flg;
4245c6c1daeSBarry Smith   PetscFunctionReturn(0);
4255c6c1daeSBarry Smith }
4265c6c1daeSBarry Smith 
4275c6c1daeSBarry Smith /*@
4285c6c1daeSBarry Smith    PetscDrawLGDraw - Redraws a line graph.
4295c6c1daeSBarry Smith 
4305b399a63SLisandro Dalcin    Collective on PetscDrawLG
4315c6c1daeSBarry Smith 
4325c6c1daeSBarry Smith    Input Parameter:
4335c6c1daeSBarry Smith .  lg - the line graph context
4345c6c1daeSBarry Smith 
4355c6c1daeSBarry Smith    Level: intermediate
4365c6c1daeSBarry Smith 
437ba1e01c4SBarry Smith .seealso: PetscDrawSPDraw(), PetscDrawLGSPDraw(), PetscDrawLGReset()
4385c6c1daeSBarry Smith @*/
4395c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGDraw(PetscDrawLG lg)
4405c6c1daeSBarry Smith {
441e118a51fSLisandro Dalcin   PetscReal      xmin,xmax,ymin,ymax;
442e118a51fSLisandro Dalcin   PetscMPIInt    rank;
443e118a51fSLisandro Dalcin   PetscDraw      draw;
4445c6c1daeSBarry Smith   PetscBool      isnull;
4455c6c1daeSBarry Smith 
4465c6c1daeSBarry Smith   PetscFunctionBegin;
4475c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
4489566063dSJacob Faibussowitsch   PetscCall(PetscDrawIsNull(lg->win,&isnull));
4498f69470aSLisandro Dalcin   if (isnull) PetscFunctionReturn(0);
4509566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)lg),&rank));
4515c6c1daeSBarry Smith 
4525b399a63SLisandro Dalcin   draw = lg->win;
4539566063dSJacob Faibussowitsch   PetscCall(PetscDrawCheckResizedWindow(draw));
4549566063dSJacob Faibussowitsch   PetscCall(PetscDrawClear(draw));
455e118a51fSLisandro Dalcin 
456e118a51fSLisandro Dalcin   xmin = lg->xmin; xmax = lg->xmax; ymin = lg->ymin; ymax = lg->ymax;
4579566063dSJacob Faibussowitsch   PetscCall(PetscDrawAxisSetLimits(lg->axis,xmin,xmax,ymin,ymax));
4589566063dSJacob Faibussowitsch   PetscCall(PetscDrawAxisDraw(lg->axis));
4595c6c1daeSBarry Smith 
460*d0609cedSBarry Smith   PetscDrawCollectiveBegin(draw);
461dd400576SPatrick Sanan   if (rank == 0) {
462e118a51fSLisandro Dalcin     int i,j,dim=lg->dim,nopts=lg->nopts,cl;
4635c6c1daeSBarry Smith     for (i=0; i<dim; i++) {
4645c6c1daeSBarry Smith       for (j=1; j<nopts; j++) {
4650ed3bfb6SBarry Smith         cl   = lg->colors ? lg->colors[i] : ((PETSC_DRAW_BLACK + i) % PETSC_DRAW_MAXCOLOR);
4669566063dSJacob Faibussowitsch         PetscCall(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));
4679566063dSJacob Faibussowitsch         if (lg->use_markers) PetscCall(PetscDrawMarker(draw,lg->x[j*dim+i],lg->y[j*dim+i],cl));
4685c6c1daeSBarry Smith       }
4695c6c1daeSBarry Smith     }
4705c6c1daeSBarry Smith   }
471dd400576SPatrick Sanan   if (rank == 0 && lg->legend) {
472088d793eSMatthew G. Knepley     PetscBool right = PETSC_FALSE;
473e118a51fSLisandro Dalcin     int       i,dim=lg->dim,cl;
4745c6c1daeSBarry Smith     PetscReal xl,yl,xr,yr,tw,th;
47571917b75SLisandro Dalcin     size_t    slen,len=0;
4769566063dSJacob Faibussowitsch     PetscCall(PetscDrawAxisGetLimits(lg->axis,&xl,&xr,&yl,&yr));
4779566063dSJacob Faibussowitsch     PetscCall(PetscDrawStringGetSize(draw,&tw,&th));
4785c6c1daeSBarry Smith     for (i=0; i<dim; i++) {
4799566063dSJacob Faibussowitsch       PetscCall(PetscStrlen(lg->legend[i],&slen));
48071917b75SLisandro Dalcin       len = PetscMax(len,slen);
4815c6c1daeSBarry Smith     }
482088d793eSMatthew G. Knepley     if (right) {
48371917b75SLisandro Dalcin       xr = xr - 1.5*tw; xl = xr - (len + 7)*tw;
484088d793eSMatthew G. Knepley     } else {
485088d793eSMatthew G. Knepley       xl = xl + 1.5*tw; xr = xl + (len + 7)*tw;
486088d793eSMatthew G. Knepley     }
48771917b75SLisandro Dalcin     yr = yr - 1.0*th; yl = yr - (dim + 1)*th;
4889566063dSJacob Faibussowitsch     PetscCall(PetscDrawLine(draw,xl,yl,xr,yl,PETSC_DRAW_BLACK));
4899566063dSJacob Faibussowitsch     PetscCall(PetscDrawLine(draw,xr,yl,xr,yr,PETSC_DRAW_BLACK));
4909566063dSJacob Faibussowitsch     PetscCall(PetscDrawLine(draw,xr,yr,xl,yr,PETSC_DRAW_BLACK));
4919566063dSJacob Faibussowitsch     PetscCall(PetscDrawLine(draw,xl,yr,xl,yl,PETSC_DRAW_BLACK));
4925c6c1daeSBarry Smith     for  (i=0; i<dim; i++) {
49371917b75SLisandro Dalcin       cl   = lg->colors ? lg->colors[i] : (PETSC_DRAW_BLACK + i);
4949566063dSJacob Faibussowitsch       PetscCall(PetscDrawLine(draw,xl + 1*tw,yr - (i + 1)*th,xl + 5*tw,yr - (i + 1)*th,cl));
4959566063dSJacob Faibussowitsch       PetscCall(PetscDrawString(draw,xl + 6*tw,yr - (i + 1.5)*th,PETSC_DRAW_BLACK,lg->legend[i]));
4965c6c1daeSBarry Smith     }
4975c6c1daeSBarry Smith   }
498*d0609cedSBarry Smith   PetscDrawCollectiveEnd(draw);
4995b399a63SLisandro Dalcin 
5009566063dSJacob Faibussowitsch   PetscCall(PetscDrawFlush(draw));
5019566063dSJacob Faibussowitsch   PetscCall(PetscDrawPause(draw));
5025c6c1daeSBarry Smith   PetscFunctionReturn(0);
5035c6c1daeSBarry Smith }
5045c6c1daeSBarry Smith 
50557fd6651SLisandro Dalcin /*@
50657fd6651SLisandro Dalcin   PetscDrawLGSave - Saves a drawn image
50757fd6651SLisandro Dalcin 
50857fd6651SLisandro Dalcin   Collective on PetscDrawLG
50957fd6651SLisandro Dalcin 
51057fd6651SLisandro Dalcin   Input Parameter:
51157fd6651SLisandro Dalcin . lg - The line graph context
51257fd6651SLisandro Dalcin 
51357fd6651SLisandro Dalcin   Level: intermediate
51457fd6651SLisandro Dalcin 
51557fd6651SLisandro Dalcin .seealso:  PetscDrawLGCreate(), PetscDrawLGGetDraw(), PetscDrawSetSave(), PetscDrawSave()
51657fd6651SLisandro Dalcin @*/
51757fd6651SLisandro Dalcin PetscErrorCode  PetscDrawLGSave(PetscDrawLG lg)
51857fd6651SLisandro Dalcin {
51957fd6651SLisandro Dalcin   PetscFunctionBegin;
52057fd6651SLisandro Dalcin   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
5219566063dSJacob Faibussowitsch   PetscCall(PetscDrawSave(lg->win));
52257fd6651SLisandro Dalcin   PetscFunctionReturn(0);
52357fd6651SLisandro Dalcin }
52457fd6651SLisandro Dalcin 
5255c6c1daeSBarry Smith /*@
52634a5a0e3SBarry Smith   PetscDrawLGView - Prints a line graph.
5275c6c1daeSBarry Smith 
5285b399a63SLisandro Dalcin   Collective on PetscDrawLG
5295c6c1daeSBarry Smith 
5305c6c1daeSBarry Smith   Input Parameter:
5315c6c1daeSBarry Smith . lg - the line graph context
5325c6c1daeSBarry Smith 
5335c6c1daeSBarry Smith   Level: beginner
5345c6c1daeSBarry Smith 
535ba1e01c4SBarry Smith .seealso: PetscDrawLGCreate()
536ba1e01c4SBarry Smith 
5375c6c1daeSBarry Smith @*/
53834a5a0e3SBarry Smith PetscErrorCode  PetscDrawLGView(PetscDrawLG lg,PetscViewer viewer)
5395c6c1daeSBarry Smith {
5405c6c1daeSBarry Smith   PetscReal      xmin=lg->xmin, xmax=lg->xmax, ymin=lg->ymin, ymax=lg->ymax;
54134a5a0e3SBarry Smith   PetscInt       i, j, dim = lg->dim, nopts = lg->nopts;
5425c6c1daeSBarry Smith 
5435c6c1daeSBarry Smith   PetscFunctionBegin;
5445c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
545e118a51fSLisandro Dalcin 
5465c6c1daeSBarry Smith   if (nopts < 1)                  PetscFunctionReturn(0);
5475c6c1daeSBarry Smith   if (xmin > xmax || ymin > ymax) PetscFunctionReturn(0);
5485c6c1daeSBarry Smith 
54934a5a0e3SBarry Smith   if (!viewer) {
5509566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)lg),&viewer));
55134a5a0e3SBarry Smith   }
5529566063dSJacob Faibussowitsch   PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)lg,viewer));
5535c6c1daeSBarry Smith   for (i = 0; i < dim; i++) {
5549566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "Line %" PetscInt_FMT ">\n", i));
5555c6c1daeSBarry Smith     for (j = 0; j < nopts; j++) {
5569566063dSJacob Faibussowitsch       PetscCall(PetscViewerASCIIPrintf(viewer, "  X: %g Y: %g\n", (double)lg->x[j*dim+i], (double)lg->y[j*dim+i]));
5575c6c1daeSBarry Smith     }
5585c6c1daeSBarry Smith   }
5595c6c1daeSBarry Smith   PetscFunctionReturn(0);
5605c6c1daeSBarry Smith }
561287de1a7SBarry Smith 
562c2bac407SLisandro Dalcin /*@C
563c2bac407SLisandro Dalcin    PetscDrawLGSetOptionsPrefix - Sets the prefix used for searching for all
564c2bac407SLisandro Dalcin    PetscDrawLG options in the database.
565c2bac407SLisandro Dalcin 
566c2bac407SLisandro Dalcin    Logically Collective on PetscDrawLG
567c2bac407SLisandro Dalcin 
568d8d19677SJose E. Roman    Input Parameters:
569c2bac407SLisandro Dalcin +  lg - the line graph context
570c2bac407SLisandro Dalcin -  prefix - the prefix to prepend to all option names
571c2bac407SLisandro Dalcin 
572c2bac407SLisandro Dalcin    Level: advanced
573c2bac407SLisandro Dalcin 
574ba1e01c4SBarry Smith .seealso: PetscDrawLGSetFromOptions(), PetscDrawLGCreate()
575c2bac407SLisandro Dalcin @*/
576c2bac407SLisandro Dalcin PetscErrorCode  PetscDrawLGSetOptionsPrefix(PetscDrawLG lg,const char prefix[])
577c2bac407SLisandro Dalcin {
578c2bac407SLisandro Dalcin   PetscFunctionBegin;
579c2bac407SLisandro Dalcin   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
5809566063dSJacob Faibussowitsch   PetscCall(PetscObjectSetOptionsPrefix((PetscObject)lg,prefix));
581c2bac407SLisandro Dalcin   PetscFunctionReturn(0);
582c2bac407SLisandro Dalcin }
583c2bac407SLisandro Dalcin 
584287de1a7SBarry Smith /*@
585287de1a7SBarry Smith     PetscDrawLGSetFromOptions - Sets options related to the PetscDrawLG
586287de1a7SBarry Smith 
5875b399a63SLisandro Dalcin     Collective on PetscDrawLG
588287de1a7SBarry Smith 
589287de1a7SBarry Smith     Options Database:
590287de1a7SBarry Smith 
591287de1a7SBarry Smith     Level: intermediate
592287de1a7SBarry Smith 
593287de1a7SBarry Smith .seealso:  PetscDrawLGDestroy(), PetscDrawLGCreate()
594287de1a7SBarry Smith @*/
595287de1a7SBarry Smith PetscErrorCode  PetscDrawLGSetFromOptions(PetscDrawLG lg)
596287de1a7SBarry Smith {
59771917b75SLisandro Dalcin   PetscBool           usemarkers,set;
59871917b75SLisandro Dalcin   PetscDrawMarkerType markertype;
599287de1a7SBarry Smith 
600287de1a7SBarry Smith   PetscFunctionBegin;
601e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
602e118a51fSLisandro Dalcin 
6039566063dSJacob Faibussowitsch   PetscCall(PetscDrawGetMarkerType(lg->win,&markertype));
6049566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetEnum(((PetscObject)lg)->options,((PetscObject)lg)->prefix,"-lg_marker_type",PetscDrawMarkerTypes,(PetscEnum*)&markertype,&set));
60571917b75SLisandro Dalcin   if (set) {
6069566063dSJacob Faibussowitsch     PetscCall(PetscDrawLGSetUseMarkers(lg,PETSC_TRUE));
6079566063dSJacob Faibussowitsch     PetscCall(PetscDrawSetMarkerType(lg->win,markertype));
60871917b75SLisandro Dalcin   }
60971917b75SLisandro Dalcin   usemarkers = lg->use_markers;
6109566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetBool(((PetscObject)lg)->options,((PetscObject)lg)->prefix,"-lg_use_markers",&usemarkers,&set));
6119566063dSJacob Faibussowitsch   if (set) PetscCall(PetscDrawLGSetUseMarkers(lg,usemarkers));
612287de1a7SBarry Smith   PetscFunctionReturn(0);
613287de1a7SBarry Smith }
614