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