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 14*9371c9d4SSatish Balay static PetscReal Peaks(PetscReal x, PetscReal y) { 15*9371c9d4SSatish Balay return 3 * Pow(1 - x, 2) * Exp(-Pow(x, 2) - Pow(y + 1, 2)) - 10 * (x / 5 - Pow(x, 3) - Pow(y, 5)) * Exp(-Pow(x, 2) - Pow(y, 2)) - 1. / 3 * Exp(-Pow(x + 1, 2) - Pow(y, 2)); 16c4762a1bSJed Brown } 17c4762a1bSJed Brown 18*9371c9d4SSatish Balay static PetscErrorCode DrawFunction(PetscDraw draw, void *ctx) { 19c4762a1bSJed Brown int i, j, w, h; 20c4762a1bSJed Brown Function function = ((FunctionCtx *)ctx)->function; 21c4762a1bSJed Brown PetscReal min = PETSC_MAX_REAL, max = PETSC_MIN_REAL; 22c4762a1bSJed Brown MPI_Comm comm = PetscObjectComm((PetscObject)draw); 23c4762a1bSJed Brown PetscMPIInt size, rank; 24c4762a1bSJed Brown PetscDraw popup; 25c4762a1bSJed Brown 26c4762a1bSJed Brown PetscFunctionBegin; 279566063dSJacob Faibussowitsch PetscCall(PetscDrawGetWindowSize(draw, &w, &h)); 289566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(comm, &size)); 299566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(comm, &rank)); 30c4762a1bSJed Brown 31d0609cedSBarry Smith PetscDrawCollectiveBegin(draw); 32c4762a1bSJed Brown for (j = rank; j < h; j += size) { 33c4762a1bSJed Brown for (i = 0; i < w; i++) { 34*9371c9d4SSatish Balay PetscReal x, y, f; 35*9371c9d4SSatish Balay int color; 369566063dSJacob Faibussowitsch PetscCall(PetscDrawPixelToCoordinate(draw, i, j, &x, &y)); 37*9371c9d4SSatish Balay f = function(x, y); 38*9371c9d4SSatish Balay color = PetscDrawRealToColor(f, -8, +8); 399566063dSJacob Faibussowitsch PetscCall(PetscDrawPointPixel(draw, i, j, color)); 40*9371c9d4SSatish Balay min = PetscMin(f, min); 41*9371c9d4SSatish Balay max = PetscMax(f, max); 42c4762a1bSJed Brown } 43c4762a1bSJed Brown } 44d0609cedSBarry Smith PetscDrawCollectiveEnd(draw); 45c4762a1bSJed Brown 469566063dSJacob Faibussowitsch PetscCall(PetscDrawGetPopup(draw, &popup)); 479566063dSJacob Faibussowitsch PetscCall(PetscDrawScalePopup(popup, -8, +8)); 48c4762a1bSJed Brown PetscFunctionReturn(0); 49c4762a1bSJed Brown } 50c4762a1bSJed Brown 51*9371c9d4SSatish Balay int main(int argc, char **argv) { 52c4762a1bSJed Brown char title[64], cmap[32] = ""; 53c4762a1bSJed Brown PetscDraw draw; 54c4762a1bSJed Brown FunctionCtx ctx; 55c4762a1bSJed Brown 56c4762a1bSJed Brown ctx.function = Peaks; 57327415f7SBarry Smith PetscFunctionBeginUser; 589566063dSJacob Faibussowitsch PetscCall(PetscInitialize(&argc, &argv, NULL, help)); 599566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetString(NULL, NULL, "-draw_cmap", cmap, sizeof(cmap), NULL)); 609566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(title, sizeof(title), "Colormap: %s", cmap)); 61c4762a1bSJed Brown 629566063dSJacob Faibussowitsch PetscCall(PetscDrawCreate(PETSC_COMM_WORLD, NULL, title, PETSC_DECIDE, PETSC_DECIDE, PETSC_DECIDE, PETSC_DECIDE, &draw)); 639566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)draw, "Peaks")); 649566063dSJacob Faibussowitsch PetscCall(PetscDrawSetFromOptions(draw)); 659566063dSJacob Faibussowitsch PetscCall(PetscDrawSetCoordinates(draw, -3, -3, +3, +3)); 669566063dSJacob Faibussowitsch PetscCall(PetscDrawZoom(draw, DrawFunction, &ctx)); 679566063dSJacob Faibussowitsch PetscCall(PetscDrawSave(draw)); 68c4762a1bSJed Brown 699566063dSJacob Faibussowitsch PetscCall(PetscDrawDestroy(&draw)); 709566063dSJacob Faibussowitsch PetscCall(PetscFinalize()); 71b122ec5aSJacob Faibussowitsch return 0; 72c4762a1bSJed Brown } 73c4762a1bSJed Brown 74c4762a1bSJed Brown /*TEST 75c4762a1bSJed Brown 76c4762a1bSJed Brown build: 77c4762a1bSJed Brown requires: x 78c4762a1bSJed Brown 79c4762a1bSJed Brown test: 80c4762a1bSJed Brown args: -draw_cmap hue 81c4762a1bSJed Brown output_file: output/ex1_1.out 82c4762a1bSJed Brown 83c4762a1bSJed Brown test: 84c4762a1bSJed Brown suffix: 2 85c4762a1bSJed Brown args: -draw_cmap gray 86c4762a1bSJed Brown output_file: output/ex1_1.out 87c4762a1bSJed Brown 88c4762a1bSJed Brown test: 89c4762a1bSJed Brown suffix: 3 90c4762a1bSJed Brown args: -draw_cmap bone 91c4762a1bSJed Brown output_file: output/ex1_1.out 92c4762a1bSJed Brown 93c4762a1bSJed Brown test: 94c4762a1bSJed Brown suffix: 4 95c4762a1bSJed Brown args: -draw_cmap jet 96c4762a1bSJed Brown output_file: output/ex1_1.out 97c4762a1bSJed Brown 98c4762a1bSJed Brown test: 99c4762a1bSJed Brown suffix: 5 100c4762a1bSJed Brown args: -draw_cmap coolwarm 101c4762a1bSJed Brown output_file: output/ex1_1.out 102c4762a1bSJed Brown 103c4762a1bSJed Brown test: 104c4762a1bSJed Brown suffix: 6 105c4762a1bSJed Brown args: -draw_cmap parula 106c4762a1bSJed Brown output_file: output/ex1_1.out 107c4762a1bSJed Brown 108c4762a1bSJed Brown test: 109c4762a1bSJed Brown suffix: 7 110c4762a1bSJed Brown args: -draw_cmap viridis 111c4762a1bSJed Brown output_file: output/ex1_1.out 112c4762a1bSJed Brown 113c4762a1bSJed Brown test: 114c4762a1bSJed Brown suffix: 8 115c4762a1bSJed Brown args: -draw_cmap plasma 116c4762a1bSJed Brown output_file: output/ex1_1.out 117c4762a1bSJed Brown 118c4762a1bSJed Brown TEST*/ 119