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 14d71ae5a4SJacob Faibussowitsch static PetscReal Peaks(PetscReal x, PetscReal y) 15d71ae5a4SJacob Faibussowitsch { 169371c9d4SSatish 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)); 17c4762a1bSJed Brown } 18c4762a1bSJed Brown 19d71ae5a4SJacob Faibussowitsch static PetscErrorCode DrawFunction(PetscDraw draw, void *ctx) 20d71ae5a4SJacob Faibussowitsch { 21c4762a1bSJed Brown int i, j, w, h; 22c4762a1bSJed Brown Function function = ((FunctionCtx *)ctx)->function; 23c4762a1bSJed Brown PetscReal min = PETSC_MAX_REAL, max = PETSC_MIN_REAL; 24c4762a1bSJed Brown MPI_Comm comm = PetscObjectComm((PetscObject)draw); 25c4762a1bSJed Brown PetscMPIInt size, rank; 26c4762a1bSJed Brown PetscDraw popup; 27c4762a1bSJed Brown 28c4762a1bSJed Brown PetscFunctionBegin; 299566063dSJacob Faibussowitsch PetscCall(PetscDrawGetWindowSize(draw, &w, &h)); 309566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(comm, &size)); 319566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(comm, &rank)); 32c4762a1bSJed Brown 33d0609cedSBarry Smith PetscDrawCollectiveBegin(draw); 34c4762a1bSJed Brown for (j = rank; j < h; j += size) { 35c4762a1bSJed Brown for (i = 0; i < w; i++) { 369371c9d4SSatish Balay PetscReal x, y, f; 379371c9d4SSatish Balay int color; 389566063dSJacob Faibussowitsch PetscCall(PetscDrawPixelToCoordinate(draw, i, j, &x, &y)); 399371c9d4SSatish Balay f = function(x, y); 409371c9d4SSatish Balay color = PetscDrawRealToColor(f, -8, +8); 419566063dSJacob Faibussowitsch PetscCall(PetscDrawPointPixel(draw, i, j, color)); 429371c9d4SSatish Balay min = PetscMin(f, min); 439371c9d4SSatish Balay max = PetscMax(f, max); 44c4762a1bSJed Brown } 45c4762a1bSJed Brown } 46d0609cedSBarry Smith PetscDrawCollectiveEnd(draw); 47c4762a1bSJed Brown 489566063dSJacob Faibussowitsch PetscCall(PetscDrawGetPopup(draw, &popup)); 499566063dSJacob Faibussowitsch PetscCall(PetscDrawScalePopup(popup, -8, +8)); 503ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 51c4762a1bSJed Brown } 52c4762a1bSJed Brown 53d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv) 54d71ae5a4SJacob Faibussowitsch { 55c4762a1bSJed Brown char title[64], cmap[32] = ""; 56c4762a1bSJed Brown PetscDraw draw; 57c4762a1bSJed Brown FunctionCtx ctx; 58c4762a1bSJed Brown 59327415f7SBarry Smith PetscFunctionBeginUser; 60*4d86920dSPierre Jolivet ctx.function = Peaks; 619566063dSJacob Faibussowitsch PetscCall(PetscInitialize(&argc, &argv, NULL, help)); 629566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetString(NULL, NULL, "-draw_cmap", cmap, sizeof(cmap), NULL)); 639566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(title, sizeof(title), "Colormap: %s", cmap)); 64c4762a1bSJed Brown 659566063dSJacob Faibussowitsch PetscCall(PetscDrawCreate(PETSC_COMM_WORLD, NULL, title, PETSC_DECIDE, PETSC_DECIDE, PETSC_DECIDE, PETSC_DECIDE, &draw)); 669566063dSJacob Faibussowitsch PetscCall(PetscObjectSetName((PetscObject)draw, "Peaks")); 679566063dSJacob Faibussowitsch PetscCall(PetscDrawSetFromOptions(draw)); 689566063dSJacob Faibussowitsch PetscCall(PetscDrawSetCoordinates(draw, -3, -3, +3, +3)); 699566063dSJacob Faibussowitsch PetscCall(PetscDrawZoom(draw, DrawFunction, &ctx)); 709566063dSJacob Faibussowitsch PetscCall(PetscDrawSave(draw)); 71c4762a1bSJed Brown 729566063dSJacob Faibussowitsch PetscCall(PetscDrawDestroy(&draw)); 739566063dSJacob Faibussowitsch PetscCall(PetscFinalize()); 74b122ec5aSJacob Faibussowitsch return 0; 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