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