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