Actual source code: potentials.c
1: static char help[] = "Plots the various potentials used in the examples.\n";
3: #include <petscdmda.h>
4: #include <petscts.h>
5: #include <petscdraw.h>
7: int main(int argc, char **argv)
8: {
9: PetscDrawLG lg;
10: PetscInt Mx = 100, i;
11: PetscReal x, hx = .1 / Mx, pause, xx[3], yy[3];
12: PetscDraw draw;
13: const char *const legend[] = {"(1 - u^2)^2", "1 - u^2", "-(1 - u)log(1 - u)"};
14: PetscDrawAxis axis;
15: PetscDrawViewPorts *ports;
17: PetscFunctionBegin;
18: PetscFunctionBeginUser;
19: PetscCall(PetscInitialize(&argc, &argv, 0, help));
20: PetscCall(PetscViewerDrawResize(PETSC_VIEWER_DRAW_(PETSC_COMM_WORLD), 1200, 800));
21: PetscCall(PetscViewerDrawGetDrawLG(PETSC_VIEWER_DRAW_(PETSC_COMM_WORLD), 0, &lg));
22: PetscCall(PetscDrawLGGetDraw(lg, &draw));
23: PetscCall(PetscDrawCheckResizedWindow(draw));
24: PetscCall(PetscDrawViewPortsCreateRect(draw, 1, 2, &ports));
25: PetscCall(PetscDrawLGGetAxis(lg, &axis));
26: PetscCall(PetscDrawLGReset(lg));
28: /*
29: Plot the energies
30: */
31: PetscCall(PetscDrawLGSetDimension(lg, 3));
32: PetscCall(PetscDrawViewPortsSet(ports, 1));
33: x = .9;
34: for (i = 0; i < Mx; i++) {
35: xx[0] = xx[1] = xx[2] = x;
36: yy[0] = (1. - x * x) * (1. - x * x);
37: yy[1] = (1. - x * x);
38: yy[2] = -(1. - x) * PetscLogReal(1. - x);
39: PetscCall(PetscDrawLGAddPoint(lg, xx, yy));
40: x += hx;
41: }
42: PetscCall(PetscDrawGetPause(draw, &pause));
43: PetscCall(PetscDrawSetPause(draw, 0.0));
44: PetscCall(PetscDrawAxisSetLabels(axis, "Energy", "", ""));
45: PetscCall(PetscDrawLGSetLegend(lg, legend));
46: PetscCall(PetscDrawLGDraw(lg));
48: /*
49: Plot the forces
50: */
51: PetscCall(PetscDrawViewPortsSet(ports, 0));
52: PetscCall(PetscDrawLGReset(lg));
53: x = .9;
54: for (i = 0; i < Mx; i++) {
55: xx[0] = xx[1] = xx[2] = x;
56: yy[0] = x * x * x - x;
57: yy[1] = -x;
58: yy[2] = 1.0 + PetscLogReal(1. - x);
59: PetscCall(PetscDrawLGAddPoint(lg, xx, yy));
60: x += hx;
61: }
62: PetscCall(PetscDrawAxisSetLabels(axis, "Derivative", "", ""));
63: PetscCall(PetscDrawLGSetLegend(lg, NULL));
64: PetscCall(PetscDrawLGDraw(lg));
66: PetscCall(PetscDrawSetPause(draw, pause));
67: PetscCall(PetscDrawPause(draw));
68: PetscCall(PetscDrawViewPortsDestroy(ports));
69: PetscCall(PetscFinalize());
70: return 0;
71: }
73: /*TEST
75: test:
76: requires: x
78: TEST*/