xref: /petsc/src/sys/classes/draw/tests/ex6.c (revision 5f80ce2ab25dff0f4601e710601cbbcecf323266)
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;
32*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawGetWindowSize(draw,&w,&h));
33*5f80ce2aSJacob Faibussowitsch   CHKERRMPI(MPI_Comm_size(comm,&size));
34*5f80ce2aSJacob 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;
40*5f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscDrawPixelToCoordinate(draw,i,j,&x,&y));
41c4762a1bSJed Brown       f = function(x,y); color = PetscDrawRealToColor(f,-8,+8);
42*5f80ce2aSJacob 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 
48*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawGetPopup(draw,&popup));
49*5f80ce2aSJacob 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   PetscErrorCode ierr;
59c4762a1bSJed Brown 
60c4762a1bSJed Brown   ctx.function = Peaks;
61c4762a1bSJed Brown   ierr = PetscInitialize(&argc,&argv,NULL,help);if (ierr) return ierr;
62*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetString(NULL,NULL,"-draw_cmap",cmap,sizeof(cmap),NULL));
63*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscSNPrintf(title,sizeof(title),"Colormap: %s",cmap));
64c4762a1bSJed Brown 
65*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawCreate(PETSC_COMM_WORLD,NULL,title,PETSC_DECIDE,PETSC_DECIDE,PETSC_DECIDE,PETSC_DECIDE,&draw));
66*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscObjectSetName((PetscObject)draw,"Peaks"));
67*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawSetFromOptions(draw));
68*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawSetCoordinates(draw,-3,-3,+3,+3));
69*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawZoom(draw,DrawFunction,&ctx));
70*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawSave(draw));
71c4762a1bSJed Brown 
72*5f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscDrawDestroy(&draw));
73c4762a1bSJed Brown   ierr = PetscFinalize();
74c4762a1bSJed Brown   return ierr;
75c4762a1bSJed Brown }
76c4762a1bSJed Brown 
77c4762a1bSJed Brown /*TEST
78c4762a1bSJed Brown 
79c4762a1bSJed Brown       build:
80c4762a1bSJed Brown          requires: x
81c4762a1bSJed Brown 
82c4762a1bSJed Brown       test:
83c4762a1bSJed Brown          args: -draw_cmap hue
84c4762a1bSJed Brown          output_file: output/ex1_1.out
85c4762a1bSJed Brown 
86c4762a1bSJed Brown       test:
87c4762a1bSJed Brown          suffix: 2
88c4762a1bSJed Brown          args: -draw_cmap gray
89c4762a1bSJed Brown          output_file: output/ex1_1.out
90c4762a1bSJed Brown 
91c4762a1bSJed Brown       test:
92c4762a1bSJed Brown          suffix: 3
93c4762a1bSJed Brown          args: -draw_cmap bone
94c4762a1bSJed Brown          output_file: output/ex1_1.out
95c4762a1bSJed Brown 
96c4762a1bSJed Brown       test:
97c4762a1bSJed Brown          suffix: 4
98c4762a1bSJed Brown          args: -draw_cmap jet
99c4762a1bSJed Brown          output_file: output/ex1_1.out
100c4762a1bSJed Brown 
101c4762a1bSJed Brown       test:
102c4762a1bSJed Brown          suffix: 5
103c4762a1bSJed Brown          args: -draw_cmap coolwarm
104c4762a1bSJed Brown          output_file: output/ex1_1.out
105c4762a1bSJed Brown 
106c4762a1bSJed Brown       test:
107c4762a1bSJed Brown          suffix: 6
108c4762a1bSJed Brown          args: -draw_cmap parula
109c4762a1bSJed Brown          output_file: output/ex1_1.out
110c4762a1bSJed Brown 
111c4762a1bSJed Brown       test:
112c4762a1bSJed Brown          suffix: 7
113c4762a1bSJed Brown          args: -draw_cmap viridis
114c4762a1bSJed Brown          output_file: output/ex1_1.out
115c4762a1bSJed Brown 
116c4762a1bSJed Brown       test:
117c4762a1bSJed Brown          suffix: 8
118c4762a1bSJed Brown          args: -draw_cmap plasma
119c4762a1bSJed Brown          output_file: output/ex1_1.out
120c4762a1bSJed Brown 
121c4762a1bSJed Brown TEST*/
122