1af0996ceSBarry Smith #include <petsc/private/drawimpl.h> /*I "petscdraw.h" I*/ 25c6c1daeSBarry Smith 35c6c1daeSBarry Smith /*@ 4811af0c4SBarry Smith PetscDrawTriangle - draws a triangle onto a drawable. 55c6c1daeSBarry Smith 65c6c1daeSBarry Smith Not Collective 75c6c1daeSBarry Smith 85c6c1daeSBarry Smith Input Parameters: 95c6c1daeSBarry Smith + draw - the drawing context 102fe279fdSBarry Smith . x1 - coordinate of the first vertex 11aec76313SJacob Faibussowitsch . y_1 - coordinate of the first vertex 122fe279fdSBarry Smith . x2 - coordinate of the second vertex 132fe279fdSBarry Smith . y2 - coordinate of the second vertex 142fe279fdSBarry Smith . x3 - coordinate of the third vertex 152fe279fdSBarry Smith . y3 - coordinate of the third vertex 162fe279fdSBarry Smith . c1 - color of the first vertex 172fe279fdSBarry Smith . c2 - color of the second vertex 182fe279fdSBarry Smith - c3 - color of the third vertext 195c6c1daeSBarry Smith 205c6c1daeSBarry Smith Level: beginner 215c6c1daeSBarry Smith 22811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawLine()`, `PetscDrawRectangle()`, `PetscDrawEllipse()`, `PetscDrawMarker()`, `PetscDrawPoint()`, `PetscDrawArrow()` 235c6c1daeSBarry Smith @*/ 24d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawTriangle(PetscDraw draw, PetscReal x1, PetscReal y_1, PetscReal x2, PetscReal y2, PetscReal x3, PetscReal y3, int c1, int c2, int c3) 25d71ae5a4SJacob Faibussowitsch { 265c6c1daeSBarry Smith PetscFunctionBegin; 275c6c1daeSBarry Smith PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 28dbbe0bcdSBarry Smith PetscUseTypeMethod(draw, triangle, x1, y_1, x2, y2, x3, y3, c1, c2, c3); 293ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 305c6c1daeSBarry Smith } 315c6c1daeSBarry Smith 325c6c1daeSBarry Smith /*@ 33ba1e01c4SBarry Smith PetscDrawScalePopup - draws a contour scale window. 345c6c1daeSBarry Smith 35c3339decSBarry Smith Collective 365c6c1daeSBarry Smith 375c6c1daeSBarry Smith Input Parameters: 38811af0c4SBarry Smith + popup - the window (often a window obtained via `PetscDrawGetPopup()` 395c6c1daeSBarry Smith . min - minimum value being plotted 405c6c1daeSBarry Smith - max - maximum value being plotted 415c6c1daeSBarry Smith 425c6c1daeSBarry Smith Level: intermediate 435c6c1daeSBarry Smith 44811af0c4SBarry Smith Note: 4595452b02SPatrick Sanan All processors that share the draw MUST call this routine 465c6c1daeSBarry Smith 47811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawGetPopup()`, `PetscDrawTensorContour()` 485c6c1daeSBarry Smith @*/ 49d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawScalePopup(PetscDraw popup, PetscReal min, PetscReal max) 50d71ae5a4SJacob Faibussowitsch { 515b399a63SLisandro Dalcin PetscBool isnull; 5248db01dbSLisandro Dalcin PetscReal xl = 0.0, yl = 0.0, xr = 1.0, yr = 1.0; 53e118a51fSLisandro Dalcin PetscMPIInt rank; 54b05fc000SLisandro Dalcin int i; 555c6c1daeSBarry Smith char string[32]; 565c6c1daeSBarry Smith 575c6c1daeSBarry Smith PetscFunctionBegin; 583ba16761SJacob Faibussowitsch if (!popup) PetscFunctionReturn(PETSC_SUCCESS); 595b399a63SLisandro Dalcin PetscValidHeaderSpecific(popup, PETSC_DRAW_CLASSID, 1); 609566063dSJacob Faibussowitsch PetscCall(PetscDrawIsNull(popup, &isnull)); 613ba16761SJacob Faibussowitsch if (isnull) PetscFunctionReturn(PETSC_SUCCESS); 629566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_rank(PetscObjectComm((PetscObject)popup), &rank)); 635b399a63SLisandro Dalcin 649566063dSJacob Faibussowitsch PetscCall(PetscDrawCheckResizedWindow(popup)); 659566063dSJacob Faibussowitsch PetscCall(PetscDrawClear(popup)); 669566063dSJacob Faibussowitsch PetscCall(PetscDrawSetTitle(popup, "Contour Scale")); 679566063dSJacob Faibussowitsch PetscCall(PetscDrawSetCoordinates(popup, xl, yl, xr, yr)); 68d0609cedSBarry Smith PetscDrawCollectiveBegin(popup); 69dd400576SPatrick Sanan if (rank == 0) { 705c6c1daeSBarry Smith for (i = 0; i < 10; i++) { 71b05fc000SLisandro Dalcin int c = PetscDrawRealToColor((PetscReal)i / 9, 0, 1); 729566063dSJacob Faibussowitsch PetscCall(PetscDrawRectangle(popup, xl, yl, xr, yr, c, c, c, c)); 7348db01dbSLisandro Dalcin yl += 0.1; 745c6c1daeSBarry Smith } 755c6c1daeSBarry Smith for (i = 0; i < 10; i++) { 766497c311SBarry Smith PetscReal value = min + ((PetscReal)i) * (max - min) / 9; 775c6c1daeSBarry Smith /* look for a value that should be zero, but is not due to round-off */ 785c6c1daeSBarry Smith if (PetscAbsReal(value) < 1.e-10 && max - min > 1.e-6) value = 0.0; 799566063dSJacob Faibussowitsch PetscCall(PetscSNPrintf(string, sizeof(string), "%18.16e", (double)value)); 809566063dSJacob Faibussowitsch PetscCall(PetscDrawString(popup, 0.2, 0.02 + i / 10.0, PETSC_DRAW_BLACK, string)); 815c6c1daeSBarry Smith } 82e118a51fSLisandro Dalcin } 83d0609cedSBarry Smith PetscDrawCollectiveEnd(popup); 849566063dSJacob Faibussowitsch PetscCall(PetscDrawFlush(popup)); 859566063dSJacob Faibussowitsch PetscCall(PetscDrawSave(popup)); 863ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 875c6c1daeSBarry Smith } 885c6c1daeSBarry Smith 895c6c1daeSBarry Smith typedef struct { 905c6c1daeSBarry Smith int m, n; 915c6c1daeSBarry Smith PetscReal *x, *y, min, max, *v; 925c6c1daeSBarry Smith PetscBool showgrid; 935c6c1daeSBarry Smith } ZoomCtx; 945c6c1daeSBarry Smith 95d71ae5a4SJacob Faibussowitsch static PetscErrorCode PetscDrawTensorContour_Zoom(PetscDraw win, void *dctx) 96d71ae5a4SJacob Faibussowitsch { 975c6c1daeSBarry Smith int i; 985c6c1daeSBarry Smith ZoomCtx *ctx = (ZoomCtx *)dctx; 995c6c1daeSBarry Smith 1005c6c1daeSBarry Smith PetscFunctionBegin; 1019566063dSJacob Faibussowitsch PetscCall(PetscDrawTensorContourPatch(win, ctx->m, ctx->n, ctx->x, ctx->y, ctx->min, ctx->max, ctx->v)); 1025c6c1daeSBarry Smith if (ctx->showgrid) { 10348a46eb9SPierre Jolivet for (i = 0; i < ctx->m; i++) PetscCall(PetscDrawLine(win, ctx->x[i], ctx->y[0], ctx->x[i], ctx->y[ctx->n - 1], PETSC_DRAW_BLACK)); 10448a46eb9SPierre Jolivet for (i = 0; i < ctx->n; i++) PetscCall(PetscDrawLine(win, ctx->x[0], ctx->y[i], ctx->x[ctx->m - 1], ctx->y[i], PETSC_DRAW_BLACK)); 1055c6c1daeSBarry Smith } 1063ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1075c6c1daeSBarry Smith } 1085c6c1daeSBarry Smith 109cc4c1da9SBarry Smith /*@ 110811af0c4SBarry Smith PetscDrawTensorContour - draws a contour plot for a two-dimensional array 1115c6c1daeSBarry Smith 1128f14a041SBarry Smith Collective, but `draw` must be sequential 1135c6c1daeSBarry Smith 1145c6c1daeSBarry Smith Input Parameters: 1158f69470aSLisandro Dalcin + draw - the draw context 11610450e9eSJacob Faibussowitsch . m - the number of local mesh points in the x direction 11710450e9eSJacob Faibussowitsch . n - the number of local mesh points in the y direction 1182fe279fdSBarry Smith . xi - the locations of the global mesh points in the horizontal direction (optional, use `NULL` to indicate uniform spacing on [0,1]) 1192fe279fdSBarry Smith . yi - the locations of the global mesh points in the vertical direction (optional, use `NULL` to indicate uniform spacing on [0,1]) 120aec76313SJacob Faibussowitsch - v - the values 1215c6c1daeSBarry Smith 1225c6c1daeSBarry Smith Options Database Keys: 1235c6c1daeSBarry Smith + -draw_x_shared_colormap - Indicates use of private colormap 124811af0c4SBarry Smith - -draw_contour_grid - draws grid contour 1255c6c1daeSBarry Smith 1265c6c1daeSBarry Smith Level: intermediate 1275c6c1daeSBarry Smith 128811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawTensorContourPatch()`, `PetscDrawScalePopup()` 1295c6c1daeSBarry Smith @*/ 130*9c9354e5SBarry Smith PetscErrorCode PetscDrawTensorContour(PetscDraw draw, int m, int n, const PetscReal xi[], const PetscReal yi[], PetscReal v[]) 131d71ae5a4SJacob Faibussowitsch { 1325c6c1daeSBarry Smith int N = m * n; 1335c6c1daeSBarry Smith PetscBool isnull; 1345c6c1daeSBarry Smith PetscDraw popup; 1355c6c1daeSBarry Smith int xin = 1, yin = 1, i; 1365c6c1daeSBarry Smith PetscMPIInt size; 1375c6c1daeSBarry Smith PetscReal h; 1385c6c1daeSBarry Smith ZoomCtx ctx; 1395c6c1daeSBarry Smith 1405c6c1daeSBarry Smith PetscFunctionBegin; 1418f69470aSLisandro Dalcin PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 1429566063dSJacob Faibussowitsch PetscCall(PetscDrawIsNull(draw, &isnull)); 1433ba16761SJacob Faibussowitsch if (isnull) PetscFunctionReturn(PETSC_SUCCESS); 1449566063dSJacob Faibussowitsch PetscCallMPI(MPI_Comm_size(PetscObjectComm((PetscObject)draw), &size)); 14508401ef6SPierre Jolivet PetscCheck(size <= 1, PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "May only be used with single processor PetscDraw"); 14608401ef6SPierre Jolivet PetscCheck(N > 0, PETSC_COMM_SELF, PETSC_ERR_ARG_OUTOFRANGE, "n %d and m %d must be positive", m, n); 1475c6c1daeSBarry Smith 1485c6c1daeSBarry Smith ctx.v = v; 1495c6c1daeSBarry Smith ctx.m = m; 1505c6c1daeSBarry Smith ctx.n = n; 1515c6c1daeSBarry Smith ctx.max = ctx.min = v[0]; 1525c6c1daeSBarry Smith for (i = 0; i < N; i++) { 1535c6c1daeSBarry Smith if (ctx.max < ctx.v[i]) ctx.max = ctx.v[i]; 1545c6c1daeSBarry Smith if (ctx.min > ctx.v[i]) ctx.min = ctx.v[i]; 1555c6c1daeSBarry Smith } 1569371c9d4SSatish Balay if (ctx.max - ctx.min < 1.e-7) { 1579371c9d4SSatish Balay ctx.min -= 5.e-8; 1589371c9d4SSatish Balay ctx.max += 5.e-8; 1599371c9d4SSatish Balay } 1605c6c1daeSBarry Smith 1615c6c1daeSBarry Smith /* PetscDraw the scale window */ 1629566063dSJacob Faibussowitsch PetscCall(PetscDrawGetPopup(draw, &popup)); 1639566063dSJacob Faibussowitsch PetscCall(PetscDrawScalePopup(popup, ctx.min, ctx.max)); 1645c6c1daeSBarry Smith 1655c6c1daeSBarry Smith ctx.showgrid = PETSC_FALSE; 1669566063dSJacob Faibussowitsch PetscCall(PetscOptionsGetBool(((PetscObject)draw)->options, NULL, "-draw_contour_grid", &ctx.showgrid, NULL)); 1675c6c1daeSBarry Smith 1685c6c1daeSBarry Smith /* fill up x and y coordinates */ 1695c6c1daeSBarry Smith if (!xi) { 1705c6c1daeSBarry Smith xin = 0; 1719566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(ctx.m, &ctx.x)); 1725c6c1daeSBarry Smith h = 1.0 / (ctx.m - 1); 1735c6c1daeSBarry Smith ctx.x[0] = 0.0; 1745c6c1daeSBarry Smith for (i = 1; i < ctx.m; i++) ctx.x[i] = ctx.x[i - 1] + h; 175a297a907SKarl Rupp } else ctx.x = (PetscReal *)xi; 176a297a907SKarl Rupp 1775c6c1daeSBarry Smith if (!yi) { 1785c6c1daeSBarry Smith yin = 0; 1799566063dSJacob Faibussowitsch PetscCall(PetscMalloc1(ctx.n, &ctx.y)); 1805c6c1daeSBarry Smith h = 1.0 / (ctx.n - 1); 1815c6c1daeSBarry Smith ctx.y[0] = 0.0; 1825c6c1daeSBarry Smith for (i = 1; i < ctx.n; i++) ctx.y[i] = ctx.y[i - 1] + h; 183a297a907SKarl Rupp } else ctx.y = (PetscReal *)yi; 1845c6c1daeSBarry Smith 1859566063dSJacob Faibussowitsch PetscCall(PetscDrawZoom(draw, PetscDrawTensorContour_Zoom, &ctx)); 1865c6c1daeSBarry Smith 1879566063dSJacob Faibussowitsch if (!xin) PetscCall(PetscFree(ctx.x)); 1889566063dSJacob Faibussowitsch if (!yin) PetscCall(PetscFree(ctx.y)); 1893ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 1905c6c1daeSBarry Smith } 1915c6c1daeSBarry Smith 1925c6c1daeSBarry Smith /*@ 193811af0c4SBarry Smith PetscDrawTensorContourPatch - draws a rectangular patch of a contour plot 1945c6c1daeSBarry Smith for a two-dimensional array. 1955c6c1daeSBarry Smith 1965c6c1daeSBarry Smith Not Collective 1975c6c1daeSBarry Smith 1985c6c1daeSBarry Smith Input Parameters: 199b05fc000SLisandro Dalcin + draw - the draw context 20010450e9eSJacob Faibussowitsch . m - the number of local mesh points in the x direction 20110450e9eSJacob Faibussowitsch . n - the number of local mesh points in the y direction 202aaa8cc7dSPierre Jolivet . x - the horizontal locations of the local mesh points 2032fe279fdSBarry Smith . y - the vertical locations of the local mesh points 2042fe279fdSBarry Smith . min - the minimum value in the entire contour 2052fe279fdSBarry Smith . max - the maximum value in the entire contour 2065c6c1daeSBarry Smith - v - the data 2075c6c1daeSBarry Smith 2082fe279fdSBarry Smith Options Database Key: 2095c6c1daeSBarry Smith . -draw_x_shared_colormap - Activates private colormap 2105c6c1daeSBarry Smith 2115c6c1daeSBarry Smith Level: advanced 2125c6c1daeSBarry Smith 2135c6c1daeSBarry Smith Note: 2145c6c1daeSBarry Smith This is a lower level support routine, usually the user will call 215811af0c4SBarry Smith `PetscDrawTensorContour()`. 2165c6c1daeSBarry Smith 217811af0c4SBarry Smith .seealso: `PetscDraw`, `PetscDrawTensorContour()` 2185c6c1daeSBarry Smith @*/ 219d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscDrawTensorContourPatch(PetscDraw draw, int m, int n, PetscReal *x, PetscReal *y, PetscReal min, PetscReal max, PetscReal *v) 220d71ae5a4SJacob Faibussowitsch { 2215c6c1daeSBarry Smith int c1, c2, c3, c4, i, j; 222b05fc000SLisandro Dalcin PetscReal x1, x2, x3, x4, y_1, y2, y3, y4; 2235c6c1daeSBarry Smith 2245c6c1daeSBarry Smith PetscFunctionBegin; 2258f69470aSLisandro Dalcin PetscValidHeaderSpecific(draw, PETSC_DRAW_CLASSID, 1); 2265c6c1daeSBarry Smith /* PetscDraw the contour plot patch */ 2275c6c1daeSBarry Smith for (j = 0; j < n - 1; j++) { 2285c6c1daeSBarry Smith for (i = 0; i < m - 1; i++) { 2299371c9d4SSatish Balay x1 = x[i]; 2309371c9d4SSatish Balay y_1 = y[j]; 2319371c9d4SSatish Balay c1 = PetscDrawRealToColor(v[i + j * m], min, max); 2329371c9d4SSatish Balay x2 = x[i + 1]; 2339371c9d4SSatish Balay y2 = y_1; 2349371c9d4SSatish Balay c2 = PetscDrawRealToColor(v[i + j * m + 1], min, max); 2359371c9d4SSatish Balay x3 = x2; 2369371c9d4SSatish Balay y3 = y[j + 1]; 2379371c9d4SSatish Balay c3 = PetscDrawRealToColor(v[i + j * m + 1 + m], min, max); 2389371c9d4SSatish Balay x4 = x1; 2399371c9d4SSatish Balay y4 = y3; 2409371c9d4SSatish Balay c4 = PetscDrawRealToColor(v[i + j * m + m], min, max); 241a297a907SKarl Rupp 2429566063dSJacob Faibussowitsch PetscCall(PetscDrawTriangle(draw, x1, y_1, x2, y2, x3, y3, c1, c2, c3)); 2439566063dSJacob Faibussowitsch PetscCall(PetscDrawTriangle(draw, x1, y_1, x3, y3, x4, y4, c1, c3, c4)); 2445c6c1daeSBarry Smith } 2455c6c1daeSBarry Smith } 2463ba16761SJacob Faibussowitsch PetscFunctionReturn(PETSC_SUCCESS); 2475c6c1daeSBarry Smith } 248