xref: /petsc/src/sys/classes/draw/utils/lgc.c (revision 45f3bb6e2ab689450ec389543af70463a1ef8274)
15c6c1daeSBarry Smith 
25ccc9f3cSMatthew G Knepley #include <petscviewer.h>
3e118a51fSLisandro Dalcin #include <../src/sys/classes/draw/utils/lgimpl.h>  /*I   "petscdraw.h"  I*/
45c6c1daeSBarry Smith PetscClassId PETSC_DRAWLG_CLASSID = 0;
55c6c1daeSBarry Smith 
65c6c1daeSBarry Smith #undef __FUNCT__
75c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGGetAxis"
85c6c1daeSBarry Smith /*@
95c6c1daeSBarry Smith    PetscDrawLGGetAxis - Gets the axis context associated with a line graph.
105c6c1daeSBarry Smith    This is useful if one wants to change some axis property, such as
115c6c1daeSBarry Smith    labels, color, etc. The axis context should not be destroyed by the
125c6c1daeSBarry Smith    application code.
135c6c1daeSBarry Smith 
145c6c1daeSBarry Smith    Not Collective, if PetscDrawLG is parallel then PetscDrawAxis is parallel
155c6c1daeSBarry Smith 
165c6c1daeSBarry Smith    Input Parameter:
175c6c1daeSBarry Smith .  lg - the line graph context
185c6c1daeSBarry Smith 
195c6c1daeSBarry Smith    Output Parameter:
205c6c1daeSBarry Smith .  axis - the axis context
215c6c1daeSBarry Smith 
225c6c1daeSBarry Smith    Level: advanced
235c6c1daeSBarry Smith 
245c6c1daeSBarry Smith @*/
255c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGGetAxis(PetscDrawLG lg,PetscDrawAxis *axis)
265c6c1daeSBarry Smith {
275c6c1daeSBarry Smith   PetscFunctionBegin;
28e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
29*45f3bb6eSLisandro Dalcin   PetscValidPointer(axis,2);
305c6c1daeSBarry Smith   *axis = lg->axis;
315c6c1daeSBarry Smith   PetscFunctionReturn(0);
325c6c1daeSBarry Smith }
335c6c1daeSBarry Smith 
345c6c1daeSBarry Smith #undef __FUNCT__
355c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGGetDraw"
365c6c1daeSBarry Smith /*@
375c6c1daeSBarry Smith    PetscDrawLGGetDraw - Gets the draw context associated with a line graph.
385c6c1daeSBarry Smith 
395c6c1daeSBarry Smith    Not Collective, if PetscDrawLG is parallel then PetscDraw is parallel
405c6c1daeSBarry Smith 
415c6c1daeSBarry Smith    Input Parameter:
425c6c1daeSBarry Smith .  lg - the line graph context
435c6c1daeSBarry Smith 
445c6c1daeSBarry Smith    Output Parameter:
455c6c1daeSBarry Smith .  draw - the draw context
465c6c1daeSBarry Smith 
475c6c1daeSBarry Smith    Level: intermediate
485c6c1daeSBarry Smith 
495c6c1daeSBarry Smith @*/
505c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGGetDraw(PetscDrawLG lg,PetscDraw *draw)
515c6c1daeSBarry Smith {
525c6c1daeSBarry Smith   PetscFunctionBegin;
535c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
54*45f3bb6eSLisandro Dalcin   PetscValidPointer(draw,2);
555c6c1daeSBarry Smith   *draw = lg->win;
565c6c1daeSBarry Smith   PetscFunctionReturn(0);
575c6c1daeSBarry Smith }
585c6c1daeSBarry Smith 
595c6c1daeSBarry Smith 
605c6c1daeSBarry Smith #undef __FUNCT__
615c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGSPDraw"
625c6c1daeSBarry Smith /*@
635c6c1daeSBarry Smith    PetscDrawLGSPDraw - Redraws a line graph.
645c6c1daeSBarry Smith 
655b399a63SLisandro Dalcin    Collective on PetscDrawLG
665c6c1daeSBarry Smith 
675c6c1daeSBarry Smith    Input Parameter:
685c6c1daeSBarry Smith .  lg - the line graph context
695c6c1daeSBarry Smith 
705c6c1daeSBarry Smith    Level: intermediate
715c6c1daeSBarry Smith 
725c6c1daeSBarry Smith .seealso: PetscDrawLGDraw(), PetscDrawSPDraw()
735c6c1daeSBarry Smith 
745c6c1daeSBarry Smith    Developer Notes: This code cheats and uses the fact that the LG and SP structs are the same
755c6c1daeSBarry Smith 
765c6c1daeSBarry Smith @*/
775c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGSPDraw(PetscDrawLG lg,PetscDrawSP spin)
785c6c1daeSBarry Smith {
795c6c1daeSBarry Smith   PetscDrawLG    sp = (PetscDrawLG)spin;
805c6c1daeSBarry Smith   PetscReal      xmin,xmax,ymin,ymax;
815c6c1daeSBarry Smith   PetscErrorCode ierr;
82e118a51fSLisandro Dalcin   PetscBool      isnull;
83e118a51fSLisandro Dalcin   PetscMPIInt    rank;
84e118a51fSLisandro Dalcin   PetscDraw      draw;
855c6c1daeSBarry Smith 
865c6c1daeSBarry Smith   PetscFunctionBegin;
875c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
885c6c1daeSBarry Smith   PetscValidHeaderSpecific(sp,PETSC_DRAWSP_CLASSID,2);
895b399a63SLisandro Dalcin   ierr = PetscDrawIsNull(lg->win,&isnull);CHKERRQ(ierr);
90e118a51fSLisandro Dalcin   if (isnull) PetscFunctionReturn(0);
91e118a51fSLisandro Dalcin   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)lg),&rank);CHKERRQ(ierr);
925c6c1daeSBarry Smith 
935b399a63SLisandro Dalcin   draw = lg->win;
94e118a51fSLisandro Dalcin   ierr = PetscDrawCheckResizedWindow(draw);CHKERRQ(ierr);
955b399a63SLisandro Dalcin   ierr = PetscDrawClear(draw);CHKERRQ(ierr);
96e118a51fSLisandro Dalcin 
97e118a51fSLisandro Dalcin   xmin = PetscMin(lg->xmin,sp->xmin); ymin = PetscMin(lg->ymin,sp->ymin);
98e118a51fSLisandro Dalcin   xmax = PetscMax(lg->xmax,sp->xmax); ymax = PetscMax(lg->ymax,sp->ymax);
995c6c1daeSBarry Smith   ierr = PetscDrawAxisSetLimits(lg->axis,xmin,xmax,ymin,ymax);CHKERRQ(ierr);
1005c6c1daeSBarry Smith   ierr = PetscDrawAxisDraw(lg->axis);CHKERRQ(ierr);
1015c6c1daeSBarry Smith 
1025b399a63SLisandro Dalcin   ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
1035c6c1daeSBarry Smith   if (!rank) {
104e118a51fSLisandro Dalcin     int i,j,dim,nopts;
1055c6c1daeSBarry Smith     dim   = lg->dim;
1065c6c1daeSBarry Smith     nopts = lg->nopts;
1075c6c1daeSBarry Smith     for (i=0; i<dim; i++) {
1085c6c1daeSBarry Smith       for (j=1; j<nopts; j++) {
1095c6c1daeSBarry 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);
110b6fe0379SLisandro Dalcin         if (lg->use_markers) {
11178e9f83eSLisandro Dalcin           ierr = PetscDrawMarker(draw,lg->x[j*dim+i],lg->y[j*dim+i],PETSC_DRAW_RED);CHKERRQ(ierr);
1125c6c1daeSBarry Smith         }
1135c6c1daeSBarry Smith       }
1145c6c1daeSBarry Smith     }
1155c6c1daeSBarry Smith     dim   = sp->dim;
1165c6c1daeSBarry Smith     nopts = sp->nopts;
1175c6c1daeSBarry Smith     for (i=0; i<dim; i++) {
1185c6c1daeSBarry Smith       for (j=0; j<nopts; j++) {
11978e9f83eSLisandro Dalcin         ierr = PetscDrawMarker(draw,sp->x[j*dim+i],sp->y[j*dim+i],PETSC_DRAW_RED);CHKERRQ(ierr);
1205c6c1daeSBarry Smith       }
1215c6c1daeSBarry Smith     }
1225c6c1daeSBarry Smith   }
123e118a51fSLisandro Dalcin   ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
1245b399a63SLisandro Dalcin 
1255b399a63SLisandro Dalcin   ierr = PetscDrawFlush(draw);CHKERRQ(ierr);
1265b399a63SLisandro Dalcin   ierr = PetscDrawPause(draw);CHKERRQ(ierr);
1275c6c1daeSBarry Smith   PetscFunctionReturn(0);
1285c6c1daeSBarry Smith }
1295c6c1daeSBarry Smith 
1305c6c1daeSBarry Smith 
1315c6c1daeSBarry Smith #undef __FUNCT__
1325c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGCreate"
1335c6c1daeSBarry Smith /*@
1345c6c1daeSBarry Smith     PetscDrawLGCreate - Creates a line graph data structure.
1355c6c1daeSBarry Smith 
1365b399a63SLisandro Dalcin     Collective on PetscDraw
1375c6c1daeSBarry Smith 
1385c6c1daeSBarry Smith     Input Parameters:
1395c6c1daeSBarry Smith +   draw - the window where the graph will be made.
1405c6c1daeSBarry Smith -   dim - the number of curves which will be drawn
1415c6c1daeSBarry Smith 
1425c6c1daeSBarry Smith     Output Parameters:
143e118a51fSLisandro Dalcin .   outlg - the line graph context
1445c6c1daeSBarry Smith 
1455c6c1daeSBarry Smith     Level: intermediate
1465c6c1daeSBarry Smith 
1475c6c1daeSBarry Smith     Concepts: line graph^creating
1485c6c1daeSBarry Smith 
1495c6c1daeSBarry Smith .seealso:  PetscDrawLGDestroy()
1505c6c1daeSBarry Smith @*/
151e118a51fSLisandro Dalcin PetscErrorCode  PetscDrawLGCreate(PetscDraw draw,PetscInt dim,PetscDrawLG *outlg)
1525c6c1daeSBarry Smith {
1535c6c1daeSBarry Smith   PetscDrawLG    lg;
154e118a51fSLisandro Dalcin   PetscErrorCode ierr;
1555c6c1daeSBarry Smith 
1565c6c1daeSBarry Smith   PetscFunctionBegin;
1575c6c1daeSBarry Smith   PetscValidHeaderSpecific(draw,PETSC_DRAW_CLASSID,1);
158e118a51fSLisandro Dalcin   PetscValidLogicalCollectiveInt(draw,dim,2);
159e118a51fSLisandro Dalcin   PetscValidPointer(outlg,3);
160e118a51fSLisandro Dalcin 
161*45f3bb6eSLisandro Dalcin   ierr = PetscHeaderCreate(lg,PETSC_DRAWLG_CLASSID,"PetscDrawLG","Line Graph","Draw",PetscObjectComm((PetscObject)draw),PetscDrawLGDestroy,NULL);CHKERRQ(ierr);
162e118a51fSLisandro Dalcin   ierr = PetscLogObjectParent((PetscObject)draw,(PetscObject)lg);CHKERRQ(ierr);
163c2bac407SLisandro Dalcin   ierr = PetscDrawLGSetOptionsPrefix(lg,((PetscObject)draw)->prefix);CHKERRQ(ierr);
164e118a51fSLisandro Dalcin 
165e118a51fSLisandro Dalcin   ierr = PetscObjectReference((PetscObject)draw);CHKERRQ(ierr);
166e118a51fSLisandro Dalcin   lg->win = draw;
167a297a907SKarl Rupp 
16869c83917SLisandro Dalcin   lg->view    = NULL;
16969c83917SLisandro Dalcin   lg->destroy = NULL;
1705c6c1daeSBarry Smith   lg->nopts   = 0;
1715c6c1daeSBarry Smith   lg->dim     = dim;
1725c6c1daeSBarry Smith   lg->xmin    = 1.e20;
1735c6c1daeSBarry Smith   lg->ymin    = 1.e20;
1745c6c1daeSBarry Smith   lg->xmax    = -1.e20;
1755c6c1daeSBarry Smith   lg->ymax    = -1.e20;
176a297a907SKarl Rupp 
177dcca6d9dSJed Brown   ierr = PetscMalloc2(dim*CHUNCKSIZE,&lg->x,dim*CHUNCKSIZE,&lg->y);CHKERRQ(ierr);
1783bb1ff40SBarry Smith   ierr = PetscLogObjectMemory((PetscObject)lg,2*dim*CHUNCKSIZE*sizeof(PetscReal));CHKERRQ(ierr);
179a297a907SKarl Rupp 
1805c6c1daeSBarry Smith   lg->len         = dim*CHUNCKSIZE;
1815c6c1daeSBarry Smith   lg->loc         = 0;
182b6fe0379SLisandro Dalcin   lg->use_markers = PETSC_FALSE;
183a297a907SKarl Rupp 
1845c6c1daeSBarry Smith   ierr = PetscDrawAxisCreate(draw,&lg->axis);CHKERRQ(ierr);
1853bb1ff40SBarry Smith   ierr = PetscLogObjectParent((PetscObject)lg,(PetscObject)lg->axis);CHKERRQ(ierr);
186a297a907SKarl Rupp 
187e118a51fSLisandro Dalcin   *outlg = lg;
1885c6c1daeSBarry Smith   PetscFunctionReturn(0);
1895c6c1daeSBarry Smith }
1905c6c1daeSBarry Smith 
1915c6c1daeSBarry Smith #undef __FUNCT__
1925c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGSetColors"
1935c6c1daeSBarry Smith /*@
1945c6c1daeSBarry Smith    PetscDrawLGSetColors - Sets the color of each line graph drawn
1955c6c1daeSBarry Smith 
1965b399a63SLisandro Dalcin    Logically Collective on PetscDrawLG
1975c6c1daeSBarry Smith 
1985c6c1daeSBarry Smith    Input Parameter:
1995c6c1daeSBarry Smith +  lg - the line graph context.
2005c6c1daeSBarry Smith -  colors - the colors
2015c6c1daeSBarry Smith 
2025c6c1daeSBarry Smith    Level: intermediate
2035c6c1daeSBarry Smith 
2045c6c1daeSBarry Smith    Concepts: line graph^setting number of lines
2055c6c1daeSBarry Smith 
2065c6c1daeSBarry Smith @*/
207*45f3bb6eSLisandro Dalcin PetscErrorCode  PetscDrawLGSetColors(PetscDrawLG lg,const int colors[])
2085c6c1daeSBarry Smith {
2095c6c1daeSBarry Smith   PetscErrorCode ierr;
2105c6c1daeSBarry Smith 
2115c6c1daeSBarry Smith   PetscFunctionBegin;
2125c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
213*45f3bb6eSLisandro Dalcin   if (lg->dim) PetscValidIntPointer(colors,2);
214e118a51fSLisandro Dalcin 
2155c6c1daeSBarry Smith   ierr = PetscFree(lg->colors);CHKERRQ(ierr);
216785e854fSJed Brown   ierr = PetscMalloc1(lg->dim,&lg->colors);CHKERRQ(ierr);
2175c6c1daeSBarry Smith   ierr = PetscMemcpy(lg->colors,colors,lg->dim*sizeof(int));CHKERRQ(ierr);
2185c6c1daeSBarry Smith   PetscFunctionReturn(0);
2195c6c1daeSBarry Smith }
2205c6c1daeSBarry Smith 
2215c6c1daeSBarry Smith #undef __FUNCT__
2225c6c1daeSBarry Smith #undef __FUNCT__
2235c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGSetLegend"
2245c6c1daeSBarry Smith /*@C
2255c6c1daeSBarry Smith    PetscDrawLGSetLegend - sets the names of each curve plotted
2265c6c1daeSBarry Smith 
2275b399a63SLisandro Dalcin    Logically Collective on PetscDrawLG
2285c6c1daeSBarry Smith 
2295c6c1daeSBarry Smith    Input Parameter:
2305c6c1daeSBarry Smith +  lg - the line graph context.
2315c6c1daeSBarry Smith -  names - the names for each curve
2325c6c1daeSBarry Smith 
2335c6c1daeSBarry Smith    Level: intermediate
2345c6c1daeSBarry Smith 
2355c6c1daeSBarry Smith    Concepts: line graph^setting number of lines
2365c6c1daeSBarry Smith 
2375c6c1daeSBarry Smith @*/
2385c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGSetLegend(PetscDrawLG lg,const char *const *names)
2395c6c1daeSBarry Smith {
2405c6c1daeSBarry Smith   PetscErrorCode ierr;
2415c6c1daeSBarry Smith   PetscInt       i;
2425c6c1daeSBarry Smith 
2435c6c1daeSBarry Smith   PetscFunctionBegin;
2445c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
245*45f3bb6eSLisandro Dalcin   if (names) PetscValidPointer(names,2);
2465c6c1daeSBarry Smith 
2475c6c1daeSBarry Smith   if (lg->legend) {
2485c6c1daeSBarry Smith     for (i=0; i<lg->dim; i++) {
2495c6c1daeSBarry Smith       ierr = PetscFree(lg->legend[i]);CHKERRQ(ierr);
2505c6c1daeSBarry Smith     }
2515c6c1daeSBarry Smith     ierr = PetscFree(lg->legend);CHKERRQ(ierr);
2525c6c1daeSBarry Smith   }
2535c6c1daeSBarry Smith   if (names) {
254785e854fSJed Brown     ierr = PetscMalloc1(lg->dim,&lg->legend);CHKERRQ(ierr);
2555c6c1daeSBarry Smith     for (i=0; i<lg->dim; i++) {
2565c6c1daeSBarry Smith       ierr = PetscStrallocpy(names[i],&lg->legend[i]);CHKERRQ(ierr);
2575c6c1daeSBarry Smith     }
2585c6c1daeSBarry Smith   }
2595c6c1daeSBarry Smith   PetscFunctionReturn(0);
2605c6c1daeSBarry Smith }
2615c6c1daeSBarry Smith 
2625c6c1daeSBarry Smith #undef __FUNCT__
2635c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGGetDimension"
2645c6c1daeSBarry Smith /*@
2655c6c1daeSBarry Smith    PetscDrawLGGetDimension - Change the number of lines that are to be drawn.
2665c6c1daeSBarry Smith 
2675b399a63SLisandro Dalcin    Not Collective
2685c6c1daeSBarry Smith 
2695c6c1daeSBarry Smith    Input Parameter:
2705c6c1daeSBarry Smith .  lg - the line graph context.
2715c6c1daeSBarry Smith 
2725c6c1daeSBarry Smith    Output Parameter:
2735c6c1daeSBarry Smith .  dim - the number of curves.
2745c6c1daeSBarry Smith 
2755c6c1daeSBarry Smith    Level: intermediate
2765c6c1daeSBarry Smith 
2775c6c1daeSBarry Smith    Concepts: line graph^setting number of lines
2785c6c1daeSBarry Smith 
2795c6c1daeSBarry Smith @*/
2805c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGGetDimension(PetscDrawLG lg,PetscInt *dim)
2815c6c1daeSBarry Smith {
2825c6c1daeSBarry Smith   PetscFunctionBegin;
2835c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
284*45f3bb6eSLisandro Dalcin   PetscValidIntPointer(dim,2);
2855c6c1daeSBarry Smith   *dim = lg->dim;
2865c6c1daeSBarry Smith   PetscFunctionReturn(0);
2875c6c1daeSBarry Smith }
2885c6c1daeSBarry Smith 
2895c6c1daeSBarry Smith #undef __FUNCT__
2905c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGSetDimension"
2915c6c1daeSBarry Smith /*@
2925c6c1daeSBarry Smith    PetscDrawLGSetDimension - Change the number of lines that are to be drawn.
2935c6c1daeSBarry Smith 
2945b399a63SLisandro Dalcin    Logically Collective on PetscDrawLG
2955c6c1daeSBarry Smith 
2965c6c1daeSBarry Smith    Input Parameter:
2975c6c1daeSBarry Smith +  lg - the line graph context.
2985c6c1daeSBarry Smith -  dim - the number of curves.
2995c6c1daeSBarry Smith 
3005c6c1daeSBarry Smith    Level: intermediate
3015c6c1daeSBarry Smith 
3025c6c1daeSBarry Smith    Concepts: line graph^setting number of lines
3035c6c1daeSBarry Smith 
3045c6c1daeSBarry Smith @*/
3055c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGSetDimension(PetscDrawLG lg,PetscInt dim)
3065c6c1daeSBarry Smith {
3075c6c1daeSBarry Smith   PetscErrorCode ierr;
3085c6c1daeSBarry Smith   PetscInt       i;
3095c6c1daeSBarry Smith 
3105c6c1daeSBarry Smith   PetscFunctionBegin;
3115c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
3125c6c1daeSBarry Smith   PetscValidLogicalCollectiveInt(lg,dim,2);
3135c6c1daeSBarry Smith   if (lg->dim == dim) PetscFunctionReturn(0);
3145c6c1daeSBarry Smith 
3155c6c1daeSBarry Smith   ierr = PetscFree2(lg->x,lg->y);CHKERRQ(ierr);
3165c6c1daeSBarry Smith   if (lg->legend) {
3175c6c1daeSBarry Smith     for (i=0; i<lg->dim; i++) {
3185c6c1daeSBarry Smith       ierr = PetscFree(lg->legend[i]);CHKERRQ(ierr);
3195c6c1daeSBarry Smith     }
3205c6c1daeSBarry Smith     ierr = PetscFree(lg->legend);CHKERRQ(ierr);
3215c6c1daeSBarry Smith   }
3225c6c1daeSBarry Smith   ierr    = PetscFree(lg->colors);CHKERRQ(ierr);
3235c6c1daeSBarry Smith   lg->dim = dim;
324dcca6d9dSJed Brown   ierr    = PetscMalloc2(dim*CHUNCKSIZE,&lg->x,dim*CHUNCKSIZE,&lg->y);CHKERRQ(ierr);
3253bb1ff40SBarry Smith   ierr    = PetscLogObjectMemory((PetscObject)lg,2*dim*CHUNCKSIZE*sizeof(PetscReal));CHKERRQ(ierr);
3265c6c1daeSBarry Smith   lg->len = dim*CHUNCKSIZE;
3275c6c1daeSBarry Smith   PetscFunctionReturn(0);
3285c6c1daeSBarry Smith }
3295c6c1daeSBarry Smith 
3305c6c1daeSBarry Smith #undef __FUNCT__
3315c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGReset"
3325c6c1daeSBarry Smith /*@
3335c6c1daeSBarry Smith    PetscDrawLGReset - Clears line graph to allow for reuse with new data.
3345c6c1daeSBarry Smith 
3355b399a63SLisandro Dalcin    Logically Collective on PetscDrawLG
3365c6c1daeSBarry Smith 
3375c6c1daeSBarry Smith    Input Parameter:
3385c6c1daeSBarry Smith .  lg - the line graph context.
3395c6c1daeSBarry Smith 
3405c6c1daeSBarry Smith    Level: intermediate
3415c6c1daeSBarry Smith 
3425c6c1daeSBarry Smith    Concepts: line graph^restarting
3435c6c1daeSBarry Smith 
3445c6c1daeSBarry Smith @*/
3455c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGReset(PetscDrawLG lg)
3465c6c1daeSBarry Smith {
3475c6c1daeSBarry Smith   PetscFunctionBegin;
3485c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
3495c6c1daeSBarry Smith   lg->xmin  = 1.e20;
3505c6c1daeSBarry Smith   lg->ymin  = 1.e20;
3515c6c1daeSBarry Smith   lg->xmax  = -1.e20;
3525c6c1daeSBarry Smith   lg->ymax  = -1.e20;
3535c6c1daeSBarry Smith   lg->loc   = 0;
3545c6c1daeSBarry Smith   lg->nopts = 0;
3555c6c1daeSBarry Smith   PetscFunctionReturn(0);
3565c6c1daeSBarry Smith }
3575c6c1daeSBarry Smith 
3585c6c1daeSBarry Smith #undef __FUNCT__
3595c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGDestroy"
3605c6c1daeSBarry Smith /*@
3615c6c1daeSBarry Smith    PetscDrawLGDestroy - Frees all space taken up by line graph data structure.
3625c6c1daeSBarry Smith 
3635b399a63SLisandro Dalcin    Collective on PetscDrawLG
3645c6c1daeSBarry Smith 
3655c6c1daeSBarry Smith    Input Parameter:
3665c6c1daeSBarry Smith .  lg - the line graph context
3675c6c1daeSBarry Smith 
3685c6c1daeSBarry Smith    Level: intermediate
3695c6c1daeSBarry Smith 
3705c6c1daeSBarry Smith .seealso:  PetscDrawLGCreate()
3715c6c1daeSBarry Smith @*/
3725c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGDestroy(PetscDrawLG *lg)
3735c6c1daeSBarry Smith {
3745c6c1daeSBarry Smith   PetscErrorCode ierr;
3755c6c1daeSBarry Smith   PetscInt       i;
3765c6c1daeSBarry Smith 
3775c6c1daeSBarry Smith   PetscFunctionBegin;
3785c6c1daeSBarry Smith   if (!*lg) PetscFunctionReturn(0);
379e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(*lg,PETSC_DRAWLG_CLASSID,1);
380e118a51fSLisandro Dalcin   if (--((PetscObject)(*lg))->refct > 0) {*lg = NULL; PetscFunctionReturn(0);}
3815c6c1daeSBarry Smith 
3825c6c1daeSBarry Smith   if ((*lg)->legend) {
3835c6c1daeSBarry Smith     for (i=0; i<(*lg)->dim; i++) {
3845c6c1daeSBarry Smith       ierr = PetscFree((*lg)->legend[i]);CHKERRQ(ierr);
3855c6c1daeSBarry Smith     }
3865c6c1daeSBarry Smith     ierr = PetscFree((*lg)->legend);CHKERRQ(ierr);
3875c6c1daeSBarry Smith   }
3885c6c1daeSBarry Smith   ierr = PetscFree((*lg)->colors);CHKERRQ(ierr);
3895c6c1daeSBarry Smith   ierr = PetscFree2((*lg)->x,(*lg)->y);CHKERRQ(ierr);
390e118a51fSLisandro Dalcin   ierr = PetscDrawAxisDestroy(&(*lg)->axis);CHKERRQ(ierr);
391e118a51fSLisandro Dalcin   ierr = PetscDrawDestroy(&(*lg)->win);CHKERRQ(ierr);
3925c6c1daeSBarry Smith   ierr = PetscHeaderDestroy(lg);CHKERRQ(ierr);
3935c6c1daeSBarry Smith   PetscFunctionReturn(0);
3945c6c1daeSBarry Smith }
3955c6c1daeSBarry Smith #undef __FUNCT__
396b6fe0379SLisandro Dalcin #define __FUNCT__ "PetscDrawLGSetUseMarkers"
3975c6c1daeSBarry Smith /*@
398b6fe0379SLisandro Dalcin    PetscDrawLGSetUseMarkers - Causes LG to draw a marker for each data-point.
3995c6c1daeSBarry Smith 
4005b399a63SLisandro Dalcin    Logically Collective on PetscDrawLG
4015c6c1daeSBarry Smith 
4025c6c1daeSBarry Smith    Input Parameters:
403287de1a7SBarry Smith +  lg - the linegraph context
404287de1a7SBarry Smith -  flg - should mark each data point
405287de1a7SBarry Smith 
406287de1a7SBarry Smith    Options Database:
407b6fe0379SLisandro Dalcin .  -lg_use_markers  <true,false>
4085c6c1daeSBarry Smith 
4095c6c1daeSBarry Smith    Level: intermediate
4105c6c1daeSBarry Smith 
4115c6c1daeSBarry Smith    Concepts: line graph^showing points
4125c6c1daeSBarry Smith 
4135c6c1daeSBarry Smith @*/
414b6fe0379SLisandro Dalcin PetscErrorCode  PetscDrawLGSetUseMarkers(PetscDrawLG lg,PetscBool flg)
4155c6c1daeSBarry Smith {
4165c6c1daeSBarry Smith   PetscFunctionBegin;
417e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
418*45f3bb6eSLisandro Dalcin   PetscValidLogicalCollectiveBool(lg,flg,2);
419b6fe0379SLisandro Dalcin   lg->use_markers = flg;
4205c6c1daeSBarry Smith   PetscFunctionReturn(0);
4215c6c1daeSBarry Smith }
4225c6c1daeSBarry Smith 
4235c6c1daeSBarry Smith #undef __FUNCT__
4245c6c1daeSBarry Smith #define __FUNCT__ "PetscDrawLGDraw"
4255c6c1daeSBarry Smith /*@
4265c6c1daeSBarry Smith    PetscDrawLGDraw - Redraws a line graph.
4275c6c1daeSBarry Smith 
4285b399a63SLisandro Dalcin    Collective on PetscDrawLG
4295c6c1daeSBarry Smith 
4305c6c1daeSBarry Smith    Input Parameter:
4315c6c1daeSBarry Smith .  lg - the line graph context
4325c6c1daeSBarry Smith 
4335c6c1daeSBarry Smith    Level: intermediate
4345c6c1daeSBarry Smith 
4355c6c1daeSBarry Smith .seealso: PetscDrawSPDraw(), PetscDrawLGSPDraw()
4365c6c1daeSBarry Smith 
4375c6c1daeSBarry Smith @*/
4385c6c1daeSBarry Smith PetscErrorCode  PetscDrawLGDraw(PetscDrawLG lg)
4395c6c1daeSBarry Smith {
440e118a51fSLisandro Dalcin   PetscReal      xmin,xmax,ymin,ymax;
4415c6c1daeSBarry Smith   PetscErrorCode ierr;
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);
4488f69470aSLisandro Dalcin   ierr = PetscDrawIsNull(lg->win,&isnull);CHKERRQ(ierr);
4498f69470aSLisandro Dalcin   if (isnull) PetscFunctionReturn(0);
450e118a51fSLisandro Dalcin   ierr = MPI_Comm_rank(PetscObjectComm((PetscObject)lg),&rank);CHKERRQ(ierr);
4515c6c1daeSBarry Smith 
4525b399a63SLisandro Dalcin   draw = lg->win;
4535c6c1daeSBarry Smith   ierr = PetscDrawCheckResizedWindow(draw);CHKERRQ(ierr);
4545b399a63SLisandro Dalcin   ierr = PetscDrawClear(draw);CHKERRQ(ierr);
455e118a51fSLisandro Dalcin 
456e118a51fSLisandro Dalcin   xmin = lg->xmin; xmax = lg->xmax; ymin = lg->ymin; ymax = lg->ymax;
4575c6c1daeSBarry Smith   ierr = PetscDrawAxisSetLimits(lg->axis,xmin,xmax,ymin,ymax);CHKERRQ(ierr);
4585c6c1daeSBarry Smith   ierr = PetscDrawAxisDraw(lg->axis);CHKERRQ(ierr);
4595c6c1daeSBarry Smith 
4605b399a63SLisandro Dalcin   ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
4615c6c1daeSBarry Smith   if (!rank) {
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++) {
4655c6c1daeSBarry Smith         if (lg->colors) cl = lg->colors[i];
4665c6c1daeSBarry Smith         else cl = PETSC_DRAW_BLACK+i;
4675c6c1daeSBarry 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);
468b6fe0379SLisandro Dalcin         if (lg->use_markers) {
46978e9f83eSLisandro Dalcin           ierr = PetscDrawMarker(draw,lg->x[j*dim+i],lg->y[j*dim+i],cl);CHKERRQ(ierr);
4705c6c1daeSBarry Smith         }
4715c6c1daeSBarry Smith       }
4725c6c1daeSBarry Smith     }
4735c6c1daeSBarry Smith   }
47456a02f31SLisandro Dalcin   if (!rank && lg->legend) {
475e118a51fSLisandro Dalcin     int       i,dim=lg->dim,cl;
4765c6c1daeSBarry Smith     PetscReal xl,yl,xr,yr,tw,th;
4775c6c1daeSBarry Smith     size_t    len,mlen = 0;
4785c6c1daeSBarry Smith     ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr);
4795c6c1daeSBarry Smith     ierr = PetscDrawStringGetSize(draw,&tw,&th);CHKERRQ(ierr);
4805c6c1daeSBarry Smith     for (i=0; i<dim; i++) {
4815c6c1daeSBarry Smith       ierr = PetscStrlen(lg->legend[i],&len);CHKERRQ(ierr);
4825c6c1daeSBarry Smith       mlen = PetscMax(mlen,len);
4835c6c1daeSBarry Smith     }
4845c6c1daeSBarry Smith     ierr = PetscDrawLine(draw,xr - (mlen + 8)*tw,yr - 3*th,xr - 2*tw,yr - 3*th,PETSC_DRAW_BLACK);CHKERRQ(ierr);
4855c6c1daeSBarry Smith     ierr = PetscDrawLine(draw,xr - (mlen + 8)*tw,yr - 3*th,xr - (mlen + 8)*tw,yr - (4+lg->dim)*th,PETSC_DRAW_BLACK);CHKERRQ(ierr);
4865c6c1daeSBarry Smith     for  (i=0; i<dim; i++) {
4875c6c1daeSBarry Smith       cl   = (lg->colors ? lg->colors[i] : i + 1);
4885c6c1daeSBarry Smith       ierr = PetscDrawLine(draw,xr - (mlen + 6.7)*tw,yr - (4 + i)*th,xr - (mlen + 3.2)*tw,yr - (4 + i)*th,cl);CHKERRQ(ierr);
4895c6c1daeSBarry Smith       ierr = PetscDrawString(draw,xr - (mlen + 3)*tw,yr - (4.5 + i)*th,PETSC_DRAW_BLACK,lg->legend[i]);CHKERRQ(ierr);
4905c6c1daeSBarry Smith     }
4915c6c1daeSBarry Smith     ierr = PetscDrawLine(draw,xr - 2*tw,yr - 3*th,xr - 2*tw,yr - (4+lg->dim)*th,PETSC_DRAW_BLACK);CHKERRQ(ierr);
4925c6c1daeSBarry Smith     ierr = PetscDrawLine(draw,xr - (mlen + 8)*tw,yr - (4+lg->dim)*th,xr - 2*tw,yr - (4+lg->dim)*th,PETSC_DRAW_BLACK);CHKERRQ(ierr);
4935c6c1daeSBarry Smith   }
494e118a51fSLisandro Dalcin   ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
4955b399a63SLisandro Dalcin 
4965b399a63SLisandro Dalcin   ierr = PetscDrawFlush(draw);CHKERRQ(ierr);
497e118a51fSLisandro Dalcin   ierr = PetscDrawPause(draw);CHKERRQ(ierr);
4985c6c1daeSBarry Smith   PetscFunctionReturn(0);
4995c6c1daeSBarry Smith }
5005c6c1daeSBarry Smith 
5015c6c1daeSBarry Smith #undef __FUNCT__
50257fd6651SLisandro Dalcin #define __FUNCT__ "PetscDrawLGSave"
50357fd6651SLisandro Dalcin /*@
50457fd6651SLisandro Dalcin   PetscDrawLGSave - Saves a drawn image
50557fd6651SLisandro Dalcin 
50657fd6651SLisandro Dalcin   Collective on PetscDrawLG
50757fd6651SLisandro Dalcin 
50857fd6651SLisandro Dalcin   Input Parameter:
50957fd6651SLisandro Dalcin . lg - The line graph context
51057fd6651SLisandro Dalcin 
51157fd6651SLisandro Dalcin   Level: intermediate
51257fd6651SLisandro Dalcin 
51357fd6651SLisandro Dalcin   Concepts: line graph^saving
51457fd6651SLisandro Dalcin 
51557fd6651SLisandro Dalcin .seealso:  PetscDrawLGCreate(), PetscDrawLGGetDraw(), PetscDrawSetSave(), PetscDrawSave()
51657fd6651SLisandro Dalcin @*/
51757fd6651SLisandro Dalcin PetscErrorCode  PetscDrawLGSave(PetscDrawLG lg)
51857fd6651SLisandro Dalcin {
51957fd6651SLisandro Dalcin   PetscErrorCode ierr;
52057fd6651SLisandro Dalcin 
52157fd6651SLisandro Dalcin   PetscFunctionBegin;
52257fd6651SLisandro Dalcin   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
52357fd6651SLisandro Dalcin   ierr = PetscDrawSave(lg->win);CHKERRQ(ierr);
52457fd6651SLisandro Dalcin   PetscFunctionReturn(0);
52557fd6651SLisandro Dalcin }
52657fd6651SLisandro Dalcin 
52757fd6651SLisandro Dalcin #undef __FUNCT__
52834a5a0e3SBarry Smith #define __FUNCT__ "PetscDrawLGView"
5295c6c1daeSBarry Smith /*@
53034a5a0e3SBarry Smith   PetscDrawLGView - Prints a line graph.
5315c6c1daeSBarry Smith 
5325b399a63SLisandro Dalcin   Collective on PetscDrawLG
5335c6c1daeSBarry Smith 
5345c6c1daeSBarry Smith   Input Parameter:
5355c6c1daeSBarry Smith . lg - the line graph context
5365c6c1daeSBarry Smith 
5375c6c1daeSBarry Smith   Level: beginner
5385c6c1daeSBarry Smith 
5395c6c1daeSBarry Smith .keywords:  draw, line, graph
5405c6c1daeSBarry Smith @*/
54134a5a0e3SBarry Smith PetscErrorCode  PetscDrawLGView(PetscDrawLG lg,PetscViewer viewer)
5425c6c1daeSBarry Smith {
5435c6c1daeSBarry Smith   PetscReal      xmin=lg->xmin, xmax=lg->xmax, ymin=lg->ymin, ymax=lg->ymax;
54434a5a0e3SBarry Smith   PetscInt       i, j, dim = lg->dim, nopts = lg->nopts;
54534a5a0e3SBarry Smith   PetscErrorCode ierr;
5465c6c1daeSBarry Smith 
5475c6c1daeSBarry Smith   PetscFunctionBegin;
5485c6c1daeSBarry Smith   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
549e118a51fSLisandro Dalcin 
5505c6c1daeSBarry Smith   if (nopts < 1)                  PetscFunctionReturn(0);
5515c6c1daeSBarry Smith   if (xmin > xmax || ymin > ymax) PetscFunctionReturn(0);
5525c6c1daeSBarry Smith 
55334a5a0e3SBarry Smith   if (!viewer){
55434a5a0e3SBarry Smith     ierr = PetscViewerASCIIGetStdout(PetscObjectComm((PetscObject)lg),&viewer);CHKERRQ(ierr);
55534a5a0e3SBarry Smith   }
55698c3331eSBarry Smith   ierr = PetscObjectPrintClassNamePrefixType((PetscObject)lg,viewer);CHKERRQ(ierr);
5575c6c1daeSBarry Smith   for (i = 0; i < dim; i++) {
55834a5a0e3SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer, "Line %D>\n", i);CHKERRQ(ierr);
5595c6c1daeSBarry Smith     for (j = 0; j < nopts; j++) {
56034a5a0e3SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer, "  X: %g Y: %g\n", (double)lg->x[j*dim+i], (double)lg->y[j*dim+i]);CHKERRQ(ierr);
5615c6c1daeSBarry Smith     }
5625c6c1daeSBarry Smith   }
5635c6c1daeSBarry Smith   PetscFunctionReturn(0);
5645c6c1daeSBarry Smith }
565287de1a7SBarry Smith 
566287de1a7SBarry Smith #undef __FUNCT__
567c2bac407SLisandro Dalcin #define __FUNCT__ "PetscDrawLGSetOptionsPrefix"
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 
574c2bac407SLisandro Dalcin    Input Parameter:
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 
580c2bac407SLisandro Dalcin .keywords: PetscDrawLG, set, options, prefix, database
581c2bac407SLisandro Dalcin 
582c2bac407SLisandro Dalcin .seealso: PetscDrawLGSetFromOptions()
583c2bac407SLisandro Dalcin @*/
584c2bac407SLisandro Dalcin PetscErrorCode  PetscDrawLGSetOptionsPrefix(PetscDrawLG lg,const char prefix[])
585c2bac407SLisandro Dalcin {
586c2bac407SLisandro Dalcin   PetscErrorCode ierr;
587c2bac407SLisandro Dalcin 
588c2bac407SLisandro Dalcin   PetscFunctionBegin;
589c2bac407SLisandro Dalcin   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
590c2bac407SLisandro Dalcin   ierr = PetscObjectSetOptionsPrefix((PetscObject)lg,prefix);CHKERRQ(ierr);
591c2bac407SLisandro Dalcin   PetscFunctionReturn(0);
592c2bac407SLisandro Dalcin }
593c2bac407SLisandro Dalcin 
594c2bac407SLisandro Dalcin #undef __FUNCT__
595287de1a7SBarry Smith #define __FUNCT__ "PetscDrawLGSetFromOptions"
596287de1a7SBarry Smith /*@
597287de1a7SBarry Smith     PetscDrawLGSetFromOptions - Sets options related to the PetscDrawLG
598287de1a7SBarry Smith 
5995b399a63SLisandro Dalcin     Collective on PetscDrawLG
600287de1a7SBarry Smith 
601287de1a7SBarry Smith     Options Database:
602287de1a7SBarry Smith 
603287de1a7SBarry Smith     Level: intermediate
604287de1a7SBarry Smith 
605287de1a7SBarry Smith     Concepts: line graph^creating
606287de1a7SBarry Smith 
607287de1a7SBarry Smith .seealso:  PetscDrawLGDestroy(), PetscDrawLGCreate()
608287de1a7SBarry Smith @*/
609287de1a7SBarry Smith PetscErrorCode  PetscDrawLGSetFromOptions(PetscDrawLG lg)
610287de1a7SBarry Smith {
611287de1a7SBarry Smith   PetscErrorCode ierr;
612b6fe0379SLisandro Dalcin   PetscBool      flg=PETSC_FALSE, set;
613287de1a7SBarry Smith 
614287de1a7SBarry Smith   PetscFunctionBegin;
615e118a51fSLisandro Dalcin   PetscValidHeaderSpecific(lg,PETSC_DRAWLG_CLASSID,1);
616e118a51fSLisandro Dalcin 
617c5929fdfSBarry Smith   ierr = PetscOptionsGetBool(((PetscObject)lg)->options,NULL,"-lg_use_markers",&flg,&set);CHKERRQ(ierr);
618b6fe0379SLisandro Dalcin   if (set) {ierr = PetscDrawLGSetUseMarkers(lg,flg);CHKERRQ(ierr);}
619287de1a7SBarry Smith   PetscFunctionReturn(0);
620287de1a7SBarry Smith }
621