xref: /petsc/src/sys/classes/draw/utils/lgc.c (revision 9566063d113dddea24716c546802770db7481bc0)
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;
815f80ce2aSJacob 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*9566063dSJacob Faibussowitsch   PetscCall(PetscDrawIsNull(lg->win,&isnull));
87e118a51fSLisandro Dalcin   if (isnull) PetscFunctionReturn(0);
88*9566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)lg),&rank));
895c6c1daeSBarry Smith 
905b399a63SLisandro Dalcin   draw = lg->win;
91*9566063dSJacob Faibussowitsch   PetscCall(PetscDrawCheckResizedWindow(draw));
92*9566063dSJacob Faibussowitsch   PetscCall(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*9566063dSJacob Faibussowitsch   PetscCall(PetscDrawAxisSetLimits(lg->axis,xmin,xmax,ymin,ymax));
97*9566063dSJacob Faibussowitsch   PetscCall(PetscDrawAxisDraw(lg->axis));
985c6c1daeSBarry Smith 
99*9566063dSJacob Faibussowitsch   ierr = PetscDrawCollectiveBegin(draw);PetscCall(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*9566063dSJacob 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));
107b6fe0379SLisandro Dalcin         if (lg->use_markers) {
108*9566063dSJacob Faibussowitsch           PetscCall(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*9566063dSJacob Faibussowitsch         PetscCall(PetscDrawMarker(draw,sp->x[j*dim+i],sp->y[j*dim+i],PETSC_DRAW_RED));
1175c6c1daeSBarry Smith       }
1185c6c1daeSBarry Smith     }
1195c6c1daeSBarry Smith   }
120*9566063dSJacob Faibussowitsch   ierr = PetscDrawCollectiveEnd(draw);PetscCall(ierr);
1215b399a63SLisandro Dalcin 
122*9566063dSJacob Faibussowitsch   PetscCall(PetscDrawFlush(draw));
123*9566063dSJacob Faibussowitsch   PetscCall(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*9566063dSJacob Faibussowitsch   PetscCall(PetscHeaderCreate(lg,PETSC_DRAWLG_CLASSID,"DrawLG","Line Graph","Draw",PetscObjectComm((PetscObject)draw),PetscDrawLGDestroy,NULL));
159*9566063dSJacob Faibussowitsch   PetscCall(PetscLogObjectParent((PetscObject)draw,(PetscObject)lg));
160*9566063dSJacob Faibussowitsch   PetscCall(PetscDrawLGSetOptionsPrefix(lg,((PetscObject)draw)->prefix));
161e118a51fSLisandro Dalcin 
162*9566063dSJacob Faibussowitsch   PetscCall(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*9566063dSJacob Faibussowitsch   PetscCall(PetscMalloc2(dim*PETSC_DRAW_LG_CHUNK_SIZE,&lg->x,dim*PETSC_DRAW_LG_CHUNK_SIZE,&lg->y));
175*9566063dSJacob Faibussowitsch   PetscCall(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*9566063dSJacob Faibussowitsch   PetscCall(PetscDrawAxisCreate(draw,&lg->axis));
182*9566063dSJacob Faibussowitsch   PetscCall(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*9566063dSJacob Faibussowitsch   PetscCall(PetscFree(lg->colors));
209*9566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(lg->dim,&lg->colors));
210*9566063dSJacob Faibussowitsch   PetscCall(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*9566063dSJacob Faibussowitsch       PetscCall(PetscFree(lg->legend[i]));
2425c6c1daeSBarry Smith     }
243*9566063dSJacob Faibussowitsch     PetscCall(PetscFree(lg->legend));
2445c6c1daeSBarry Smith   }
2455c6c1daeSBarry Smith   if (names) {
246*9566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(lg->dim,&lg->legend));
2475c6c1daeSBarry Smith     for (i=0; i<lg->dim; i++) {
248*9566063dSJacob Faibussowitsch       PetscCall(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*9566063dSJacob Faibussowitsch   PetscCall(PetscFree2(lg->x,lg->y));
3025c6c1daeSBarry Smith   if (lg->legend) {
3035c6c1daeSBarry Smith     for (i=0; i<lg->dim; i++) {
304*9566063dSJacob Faibussowitsch       PetscCall(PetscFree(lg->legend[i]));
3055c6c1daeSBarry Smith     }
306*9566063dSJacob Faibussowitsch     PetscCall(PetscFree(lg->legend));
3075c6c1daeSBarry Smith   }
308*9566063dSJacob Faibussowitsch   PetscCall(PetscFree(lg->colors));
3095c6c1daeSBarry Smith   lg->dim = dim;
310*9566063dSJacob Faibussowitsch   PetscCall(PetscMalloc2(dim*PETSC_DRAW_LG_CHUNK_SIZE,&lg->x,dim*PETSC_DRAW_LG_CHUNK_SIZE,&lg->y));
311*9566063dSJacob Faibussowitsch   PetscCall(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*9566063dSJacob Faibussowitsch       PetscCall(PetscFree((*lg)->legend[i]));
3935c6c1daeSBarry Smith     }
394*9566063dSJacob Faibussowitsch     PetscCall(PetscFree((*lg)->legend));
3955c6c1daeSBarry Smith   }
396*9566063dSJacob Faibussowitsch   PetscCall(PetscFree((*lg)->colors));
397*9566063dSJacob Faibussowitsch   PetscCall(PetscFree2((*lg)->x,(*lg)->y));
398*9566063dSJacob Faibussowitsch   PetscCall(PetscDrawAxisDestroy(&(*lg)->axis));
399*9566063dSJacob Faibussowitsch   PetscCall(PetscDrawDestroy(&(*lg)->win));
400*9566063dSJacob Faibussowitsch   PetscCall(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;
4465f80ce2aSJacob Faibussowitsch   PetscErrorCode ierr;
4475c6c1daeSBarry Smith 
4485c6c1daeSBarry Smith   PetscFunctionBegin;
4495c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
450*9566063dSJacob Faibussowitsch   PetscCall(PetscDrawIsNull(lg->win,&isnull));
4518f69470aSLisandro Dalcin   if (isnull) PetscFunctionReturn(0);
452*9566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)lg),&rank));
4535c6c1daeSBarry Smith 
4545b399a63SLisandro Dalcin   draw = lg->win;
455*9566063dSJacob Faibussowitsch   PetscCall(PetscDrawCheckResizedWindow(draw));
456*9566063dSJacob Faibussowitsch   PetscCall(PetscDrawClear(draw));
457e118a51fSLisandro Dalcin 
458e118a51fSLisandro Dalcin   xmin = lg->xmin; xmax = lg->xmax; ymin = lg->ymin; ymax = lg->ymax;
459*9566063dSJacob Faibussowitsch   PetscCall(PetscDrawAxisSetLimits(lg->axis,xmin,xmax,ymin,ymax));
460*9566063dSJacob Faibussowitsch   PetscCall(PetscDrawAxisDraw(lg->axis));
4615c6c1daeSBarry Smith 
462*9566063dSJacob Faibussowitsch   ierr = PetscDrawCollectiveBegin(draw);PetscCall(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*9566063dSJacob 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));
469*9566063dSJacob Faibussowitsch         if (lg->use_markers) PetscCall(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*9566063dSJacob Faibussowitsch     PetscCall(PetscDrawAxisGetLimits(lg->axis,&xl,&xr,&yl,&yr));
479*9566063dSJacob Faibussowitsch     PetscCall(PetscDrawStringGetSize(draw,&tw,&th));
4805c6c1daeSBarry Smith     for (i=0; i<dim; i++) {
481*9566063dSJacob Faibussowitsch       PetscCall(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*9566063dSJacob Faibussowitsch     PetscCall(PetscDrawLine(draw,xl,yl,xr,yl,PETSC_DRAW_BLACK));
491*9566063dSJacob Faibussowitsch     PetscCall(PetscDrawLine(draw,xr,yl,xr,yr,PETSC_DRAW_BLACK));
492*9566063dSJacob Faibussowitsch     PetscCall(PetscDrawLine(draw,xr,yr,xl,yr,PETSC_DRAW_BLACK));
493*9566063dSJacob Faibussowitsch     PetscCall(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*9566063dSJacob Faibussowitsch       PetscCall(PetscDrawLine(draw,xl + 1*tw,yr - (i + 1)*th,xl + 5*tw,yr - (i + 1)*th,cl));
497*9566063dSJacob Faibussowitsch       PetscCall(PetscDrawString(draw,xl + 6*tw,yr - (i + 1.5)*th,PETSC_DRAW_BLACK,lg->legend[i]));
4985c6c1daeSBarry Smith     }
4995c6c1daeSBarry Smith   }
500*9566063dSJacob Faibussowitsch   ierr = PetscDrawCollectiveEnd(draw);PetscCall(ierr);
5015b399a63SLisandro Dalcin 
502*9566063dSJacob Faibussowitsch   PetscCall(PetscDrawFlush(draw));
503*9566063dSJacob Faibussowitsch   PetscCall(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*9566063dSJacob Faibussowitsch   PetscCall(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*9566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)lg),&viewer));
55334a5a0e3SBarry Smith   }
554*9566063dSJacob Faibussowitsch   PetscCall(PetscObjectPrintClassNamePrefixType((PetscObject)lg,viewer));
5555c6c1daeSBarry Smith   for (i = 0; i < dim; i++) {
556*9566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "Line %" PetscInt_FMT ">\n", i));
5575c6c1daeSBarry Smith     for (j = 0; j < nopts; j++) {
558*9566063dSJacob Faibussowitsch       PetscCall(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*9566063dSJacob Faibussowitsch   PetscCall(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*9566063dSJacob Faibussowitsch   PetscCall(PetscDrawGetMarkerType(lg->win,&markertype));
606*9566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetEnum(((PetscObject)lg)->options,((PetscObject)lg)->prefix,"-lg_marker_type",PetscDrawMarkerTypes,(PetscEnum*)&markertype,&set));
60771917b75SLisandro Dalcin   if (set) {
608*9566063dSJacob Faibussowitsch     PetscCall(PetscDrawLGSetUseMarkers(lg,PETSC_TRUE));
609*9566063dSJacob Faibussowitsch     PetscCall(PetscDrawSetMarkerType(lg->win,markertype));
61071917b75SLisandro Dalcin   }
61171917b75SLisandro Dalcin   usemarkers = lg->use_markers;
612*9566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetBool(((PetscObject)lg)->options,((PetscObject)lg)->prefix,"-lg_use_markers",&usemarkers,&set));
613*9566063dSJacob Faibussowitsch   if (set) PetscCall(PetscDrawLGSetUseMarkers(lg,usemarkers));
614287de1a7SBarry Smith   PetscFunctionReturn(0);
615287de1a7SBarry Smith }
616