xref: /petsc/src/sys/classes/draw/tests/ex6.c (revision 6a5217c03994f2d95bb2e6dbd8bed42381aeb015)
1 static char help[] = "Demonstrates named colormaps\n";
2 
3 #include <petscsys.h>
4 #include <petscdraw.h>
5 
6 typedef PetscReal (*Function)(PetscReal,PetscReal);
7 
8 typedef struct {
9   Function function;
10 } FunctionCtx;
11 
12 #define Exp PetscExpReal
13 #define Pow PetscPowReal
14 static PetscReal Peaks(PetscReal x,PetscReal y)
15 {
16   return 3 * Pow(1-x,2) * Exp(-Pow(x,2) - Pow(y+1,2))
17        - 10 * (x/5 - Pow(x,3) - Pow(y,5)) * Exp(-Pow(x,2) - Pow(y,2))
18        - 1./3 * Exp(-Pow(x+1,2) - Pow(y,2));
19 }
20 
21 static PetscErrorCode DrawFunction(PetscDraw draw,void *ctx)
22 {
23   int            i,j,w,h;
24   Function       function = ((FunctionCtx*)ctx)->function;
25   PetscReal      min = PETSC_MAX_REAL, max = PETSC_MIN_REAL;
26   MPI_Comm       comm = PetscObjectComm((PetscObject)draw);
27   PetscMPIInt    size,rank;
28   PetscDraw      popup;
29   PetscErrorCode ierr;
30 
31   PetscFunctionBegin;
32   PetscCall(PetscDrawGetWindowSize(draw,&w,&h));
33   PetscCallMPI(MPI_Comm_size(comm,&size));
34   PetscCallMPI(MPI_Comm_rank(comm,&rank));
35 
36   ierr = PetscDrawCollectiveBegin(draw);PetscCall(ierr);
37   for (j=rank; j<h; j+=size) {
38     for (i=0; i<w; i++) {
39       PetscReal x,y,f; int color;
40       PetscCall(PetscDrawPixelToCoordinate(draw,i,j,&x,&y));
41       f = function(x,y); color = PetscDrawRealToColor(f,-8,+8);
42       PetscCall(PetscDrawPointPixel(draw,i,j,color));
43       min = PetscMin(f,min); max = PetscMax(f,max);
44     }
45   }
46   ierr = PetscDrawCollectiveEnd(draw);PetscCall(ierr);
47 
48   PetscCall(PetscDrawGetPopup(draw,&popup));
49   PetscCall(PetscDrawScalePopup(popup,-8,+8));
50   PetscFunctionReturn(0);
51 }
52 
53 int main(int argc,char **argv)
54 {
55   char        title[64],cmap[32] = "";
56   PetscDraw   draw;
57   FunctionCtx ctx;
58 
59   ctx.function = Peaks;
60   PetscCall(PetscInitialize(&argc,&argv,NULL,help));
61   PetscCall(PetscOptionsGetString(NULL,NULL,"-draw_cmap",cmap,sizeof(cmap),NULL));
62   PetscCall(PetscSNPrintf(title,sizeof(title),"Colormap: %s",cmap));
63 
64   PetscCall(PetscDrawCreate(PETSC_COMM_WORLD,NULL,title,PETSC_DECIDE,PETSC_DECIDE,PETSC_DECIDE,PETSC_DECIDE,&draw));
65   PetscCall(PetscObjectSetName((PetscObject)draw,"Peaks"));
66   PetscCall(PetscDrawSetFromOptions(draw));
67   PetscCall(PetscDrawSetCoordinates(draw,-3,-3,+3,+3));
68   PetscCall(PetscDrawZoom(draw,DrawFunction,&ctx));
69   PetscCall(PetscDrawSave(draw));
70 
71   PetscCall(PetscDrawDestroy(&draw));
72   PetscCall(PetscFinalize());
73   return 0;
74 }
75 
76 /*TEST
77 
78       build:
79          requires: x
80 
81       test:
82          args: -draw_cmap hue
83          output_file: output/ex1_1.out
84 
85       test:
86          suffix: 2
87          args: -draw_cmap gray
88          output_file: output/ex1_1.out
89 
90       test:
91          suffix: 3
92          args: -draw_cmap bone
93          output_file: output/ex1_1.out
94 
95       test:
96          suffix: 4
97          args: -draw_cmap jet
98          output_file: output/ex1_1.out
99 
100       test:
101          suffix: 5
102          args: -draw_cmap coolwarm
103          output_file: output/ex1_1.out
104 
105       test:
106          suffix: 6
107          args: -draw_cmap parula
108          output_file: output/ex1_1.out
109 
110       test:
111          suffix: 7
112          args: -draw_cmap viridis
113          output_file: output/ex1_1.out
114 
115       test:
116          suffix: 8
117          args: -draw_cmap plasma
118          output_file: output/ex1_1.out
119 
120 TEST*/
121