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 @*/
PetscDrawTriangle(PetscDraw draw,PetscReal x1,PetscReal y_1,PetscReal x2,PetscReal y2,PetscReal x3,PetscReal y3,int c1,int c2,int c3)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 @*/
PetscDrawScalePopup(PetscDraw popup,PetscReal min,PetscReal max)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
PetscDrawTensorContour_Zoom(PetscDraw win,void * dctx)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 @*/
PetscDrawTensorContour(PetscDraw draw,int m,int n,const PetscReal xi[],const PetscReal yi[],PetscReal v[])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 @*/
PetscDrawTensorContourPatch(PetscDraw draw,int m,int n,PetscReal * x,PetscReal * y,PetscReal min,PetscReal max,PetscReal * v)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