xref: /petsc/src/sys/classes/draw/tests/ex6.c (revision b122ec5aa1bd4469eb4e0673542fb7de3f411254)
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   PetscErrorCode ierr;
30c4762a1bSJed Brown 
31c4762a1bSJed Brown   PetscFunctionBegin;
325f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawGetWindowSize(draw,&w,&h));
335f80ce2aSJacob Faibussowitsch   CHKERRMPI(MPI_Comm_size(comm,&size));
345f80ce2aSJacob Faibussowitsch   CHKERRMPI(MPI_Comm_rank(comm,&rank));
35c4762a1bSJed Brown 
36c4762a1bSJed Brown   ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
37c4762a1bSJed Brown   for (j=rank; j<h; j+=size) {
38c4762a1bSJed Brown     for (i=0; i<w; i++) {
39c4762a1bSJed Brown       PetscReal x,y,f; int color;
405f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscDrawPixelToCoordinate(draw,i,j,&x,&y));
41c4762a1bSJed Brown       f = function(x,y); color = PetscDrawRealToColor(f,-8,+8);
425f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscDrawPointPixel(draw,i,j,color));
43c4762a1bSJed Brown       min = PetscMin(f,min); max = PetscMax(f,max);
44c4762a1bSJed Brown     }
45c4762a1bSJed Brown   }
46c4762a1bSJed Brown   ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
47c4762a1bSJed Brown 
485f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawGetPopup(draw,&popup));
495f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawScalePopup(popup,-8,+8));
50c4762a1bSJed Brown   PetscFunctionReturn(0);
51c4762a1bSJed Brown }
52c4762a1bSJed Brown 
53c4762a1bSJed Brown int main(int argc,char **argv)
54c4762a1bSJed Brown {
55c4762a1bSJed Brown   char        title[64],cmap[32] = "";
56c4762a1bSJed Brown   PetscDraw   draw;
57c4762a1bSJed Brown   FunctionCtx ctx;
58c4762a1bSJed Brown 
59c4762a1bSJed Brown   ctx.function = Peaks;
60*b122ec5aSJacob Faibussowitsch   CHKERRQ(PetscInitialize(&argc,&argv,NULL,help));
615f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetString(NULL,NULL,"-draw_cmap",cmap,sizeof(cmap),NULL));
625f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSNPrintf(title,sizeof(title),"Colormap: %s",cmap));
63c4762a1bSJed Brown 
645f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawCreate(PETSC_COMM_WORLD,NULL,title,PETSC_DECIDE,PETSC_DECIDE,PETSC_DECIDE,PETSC_DECIDE,&draw));
655f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectSetName((PetscObject)draw,"Peaks"));
665f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawSetFromOptions(draw));
675f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawSetCoordinates(draw,-3,-3,+3,+3));
685f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawZoom(draw,DrawFunction,&ctx));
695f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawSave(draw));
70c4762a1bSJed Brown 
715f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawDestroy(&draw));
72*b122ec5aSJacob Faibussowitsch   CHKERRQ(PetscFinalize());
73*b122ec5aSJacob Faibussowitsch   return 0;
74c4762a1bSJed Brown }
75c4762a1bSJed Brown 
76c4762a1bSJed Brown /*TEST
77c4762a1bSJed Brown 
78c4762a1bSJed Brown       build:
79c4762a1bSJed Brown          requires: x
80c4762a1bSJed Brown 
81c4762a1bSJed Brown       test:
82c4762a1bSJed Brown          args: -draw_cmap hue
83c4762a1bSJed Brown          output_file: output/ex1_1.out
84c4762a1bSJed Brown 
85c4762a1bSJed Brown       test:
86c4762a1bSJed Brown          suffix: 2
87c4762a1bSJed Brown          args: -draw_cmap gray
88c4762a1bSJed Brown          output_file: output/ex1_1.out
89c4762a1bSJed Brown 
90c4762a1bSJed Brown       test:
91c4762a1bSJed Brown          suffix: 3
92c4762a1bSJed Brown          args: -draw_cmap bone
93c4762a1bSJed Brown          output_file: output/ex1_1.out
94c4762a1bSJed Brown 
95c4762a1bSJed Brown       test:
96c4762a1bSJed Brown          suffix: 4
97c4762a1bSJed Brown          args: -draw_cmap jet
98c4762a1bSJed Brown          output_file: output/ex1_1.out
99c4762a1bSJed Brown 
100c4762a1bSJed Brown       test:
101c4762a1bSJed Brown          suffix: 5
102c4762a1bSJed Brown          args: -draw_cmap coolwarm
103c4762a1bSJed Brown          output_file: output/ex1_1.out
104c4762a1bSJed Brown 
105c4762a1bSJed Brown       test:
106c4762a1bSJed Brown          suffix: 6
107c4762a1bSJed Brown          args: -draw_cmap parula
108c4762a1bSJed Brown          output_file: output/ex1_1.out
109c4762a1bSJed Brown 
110c4762a1bSJed Brown       test:
111c4762a1bSJed Brown          suffix: 7
112c4762a1bSJed Brown          args: -draw_cmap viridis
113c4762a1bSJed Brown          output_file: output/ex1_1.out
114c4762a1bSJed Brown 
115c4762a1bSJed Brown       test:
116c4762a1bSJed Brown          suffix: 8
117c4762a1bSJed Brown          args: -draw_cmap plasma
118c4762a1bSJed Brown          output_file: output/ex1_1.out
119c4762a1bSJed Brown 
120c4762a1bSJed Brown TEST*/
121