xref: /petsc/src/snes/tutorials/ex12.c (revision 6ba0327bbc760a57bc28d7ab3ebe0cd1b8afc6ee)
1c4762a1bSJed Brown static char help[] = "Poisson Problem in 2d and 3d with simplicial finite elements.\n\
2c4762a1bSJed Brown We solve the Poisson problem in a rectangular\n\
3c4762a1bSJed Brown domain, using a parallel unstructured mesh (DMPLEX) to discretize it.\n\
4c4762a1bSJed Brown This example supports discretized auxiliary fields (conductivity) as well as\n\
5c4762a1bSJed Brown multilevel nonlinear solvers.\n\n\n";
6c4762a1bSJed Brown 
7c4762a1bSJed Brown /*
8c4762a1bSJed Brown A visualization of the adaptation can be accomplished using:
9c4762a1bSJed Brown 
10c4762a1bSJed Brown   -dm_adapt_view hdf5:$PWD/adapt.h5 -sol_adapt_view hdf5:$PWD/adapt.h5::append -dm_adapt_pre_view hdf5:$PWD/orig.h5 -sol_adapt_pre_view hdf5:$PWD/orig.h5::append
11c4762a1bSJed Brown 
12c4762a1bSJed Brown Information on refinement:
13c4762a1bSJed Brown 
14c20d7725SJed Brown    -info :~sys,vec,is,mat,ksp,snes,ts
15c4762a1bSJed Brown */
16c4762a1bSJed Brown 
17c4762a1bSJed Brown #include <petscdmplex.h>
18c4762a1bSJed Brown #include <petscdmadaptor.h>
19c4762a1bSJed Brown #include <petscsnes.h>
20c4762a1bSJed Brown #include <petscds.h>
21c4762a1bSJed Brown #include <petscviewerhdf5.h>
22c4762a1bSJed Brown 
23c4762a1bSJed Brown typedef enum {NEUMANN, DIRICHLET, NONE} BCType;
24c4762a1bSJed Brown typedef enum {RUN_FULL, RUN_EXACT, RUN_TEST, RUN_PERF} RunType;
25d6837840SMatthew G. Knepley typedef enum {COEFF_NONE, COEFF_ANALYTIC, COEFF_FIELD, COEFF_NONLINEAR, COEFF_CIRCLE, COEFF_CROSS, COEFF_CHECKERBOARD_0, COEFF_CHECKERBOARD_1} CoeffType;
26c4762a1bSJed Brown 
27c4762a1bSJed Brown typedef struct {
28c4762a1bSJed Brown   PetscInt       debug;             /* The debugging level */
29c4762a1bSJed Brown   RunType        runType;           /* Whether to run tests, or solve the full problem */
30c4762a1bSJed Brown   PetscBool      jacobianMF;        /* Whether to calculate the Jacobian action on the fly */
31c4762a1bSJed Brown   PetscLogEvent  createMeshEvent;
32c4762a1bSJed Brown   PetscBool      showInitial, showSolution, restart, quiet, nonzInit;
33c4762a1bSJed Brown   /* Domain and mesh definition */
34c4762a1bSJed Brown   PetscInt       dim;               /* The topological mesh dimension */
35c4762a1bSJed Brown   DMBoundaryType periodicity[3];    /* The domain periodicity */
36c4762a1bSJed Brown   PetscInt       cells[3];          /* The initial domain division */
37c4762a1bSJed Brown   char           filename[2048];    /* The optional mesh file */
38c4762a1bSJed Brown   PetscBool      interpolate;       /* Generate intermediate mesh elements */
39c4762a1bSJed Brown   PetscReal      refinementLimit;   /* The largest allowable cell volume */
40c4762a1bSJed Brown   PetscBool      viewHierarchy;     /* Whether to view the hierarchy */
41c4762a1bSJed Brown   PetscBool      simplex;           /* Simplicial mesh */
42c4762a1bSJed Brown   /* Problem definition */
43c4762a1bSJed Brown   BCType         bcType;
44c4762a1bSJed Brown   CoeffType      variableCoefficient;
45c4762a1bSJed Brown   PetscErrorCode (**exactFuncs)(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt Nc, PetscScalar *u, void *ctx);
46c4762a1bSJed Brown   PetscBool      fieldBC;
47c4762a1bSJed Brown   void           (**exactFields)(PetscInt, PetscInt, PetscInt,
48c4762a1bSJed Brown                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
49c4762a1bSJed Brown                                  const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[],
50c4762a1bSJed Brown                                  PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]);
51c4762a1bSJed Brown   PetscBool      bdIntegral;        /* Compute the integral of the solution on the boundary */
52d6837840SMatthew G. Knepley   /* Reproducing tests from SISC 40(3), pp. A1473-A1493, 2018 */
53d6837840SMatthew G. Knepley   PetscInt       div;               /* Number of divisions */
54d6837840SMatthew G. Knepley   PetscInt       k;                 /* Parameter for checkerboard coefficient */
55d6837840SMatthew G. Knepley   PetscInt      *kgrid;             /* Random parameter grid */
56c4762a1bSJed Brown   /* Solver */
57c4762a1bSJed Brown   PC             pcmg;              /* This is needed for error monitoring */
58c4762a1bSJed Brown   PetscBool      checkksp;          /* Whether to check the KSPSolve for runType == RUN_TEST */
59c4762a1bSJed Brown } AppCtx;
60c4762a1bSJed Brown 
61c4762a1bSJed Brown static PetscErrorCode zero(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt Nc, PetscScalar *u, void *ctx)
62c4762a1bSJed Brown {
63c4762a1bSJed Brown   u[0] = 0.0;
64c4762a1bSJed Brown   return 0;
65c4762a1bSJed Brown }
66c4762a1bSJed Brown 
67c4762a1bSJed Brown static PetscErrorCode ecks(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt Nc, PetscScalar *u, void *ctx)
68c4762a1bSJed Brown {
69c4762a1bSJed Brown   u[0] = x[0];
70c4762a1bSJed Brown   return 0;
71c4762a1bSJed Brown }
72c4762a1bSJed Brown 
73c4762a1bSJed Brown /*
74c4762a1bSJed Brown   In 2D for Dirichlet conditions, we use exact solution:
75c4762a1bSJed Brown 
76c4762a1bSJed Brown     u = x^2 + y^2
77c4762a1bSJed Brown     f = 4
78c4762a1bSJed Brown 
79c4762a1bSJed Brown   so that
80c4762a1bSJed Brown 
81c4762a1bSJed Brown     -\Delta u + f = -4 + 4 = 0
82c4762a1bSJed Brown 
83c4762a1bSJed Brown   For Neumann conditions, we have
84c4762a1bSJed Brown 
85c4762a1bSJed Brown     -\nabla u \cdot -\hat y |_{y=0} =  (2y)|_{y=0} =  0 (bottom)
86c4762a1bSJed Brown     -\nabla u \cdot  \hat y |_{y=1} = -(2y)|_{y=1} = -2 (top)
87c4762a1bSJed Brown     -\nabla u \cdot -\hat x |_{x=0} =  (2x)|_{x=0} =  0 (left)
88c4762a1bSJed Brown     -\nabla u \cdot  \hat x |_{x=1} = -(2x)|_{x=1} = -2 (right)
89c4762a1bSJed Brown 
90c4762a1bSJed Brown   Which we can express as
91c4762a1bSJed Brown 
92c4762a1bSJed Brown     \nabla u \cdot  \hat n|_\Gamma = {2 x, 2 y} \cdot \hat n = 2 (x + y)
93c4762a1bSJed Brown 
94c4762a1bSJed Brown   The boundary integral of this solution is (assuming we are not orienting the edges)
95c4762a1bSJed Brown 
96c4762a1bSJed Brown     \int^1_0 x^2 dx + \int^1_0 (1 + y^2) dy + \int^1_0 (x^2 + 1) dx + \int^1_0 y^2 dy = 1/3 + 4/3 + 4/3 + 1/3 = 3 1/3
97c4762a1bSJed Brown */
98c4762a1bSJed Brown static PetscErrorCode quadratic_u_2d(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt Nc, PetscScalar *u, void *ctx)
99c4762a1bSJed Brown {
100c4762a1bSJed Brown   *u = x[0]*x[0] + x[1]*x[1];
101c4762a1bSJed Brown   return 0;
102c4762a1bSJed Brown }
103c4762a1bSJed Brown 
104c4762a1bSJed Brown static void quadratic_u_field_2d(PetscInt dim, PetscInt Nf, PetscInt NfAux,
105c4762a1bSJed Brown                                  const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[],
106c4762a1bSJed Brown                                  const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[],
107c4762a1bSJed Brown                                  PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar uexact[])
108c4762a1bSJed Brown {
109c4762a1bSJed Brown   uexact[0] = a[0];
110c4762a1bSJed Brown }
111c4762a1bSJed Brown 
112c4762a1bSJed Brown static PetscErrorCode circle_u_2d(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt Nc, PetscScalar *u, void *ctx)
113c4762a1bSJed Brown {
114c4762a1bSJed Brown   const PetscReal alpha   = 500.;
115c4762a1bSJed Brown   const PetscReal radius2 = PetscSqr(0.15);
116c4762a1bSJed Brown   const PetscReal r2      = PetscSqr(x[0] - 0.5) + PetscSqr(x[1] - 0.5);
117c4762a1bSJed Brown   const PetscReal xi      = alpha*(radius2 - r2);
118c4762a1bSJed Brown 
119c4762a1bSJed Brown   *u = PetscTanhScalar(xi) + 1.0;
120c4762a1bSJed Brown   return 0;
121c4762a1bSJed Brown }
122c4762a1bSJed Brown 
123c4762a1bSJed Brown static PetscErrorCode cross_u_2d(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt Nc, PetscScalar *u, void *ctx)
124c4762a1bSJed Brown {
125c4762a1bSJed Brown   const PetscReal alpha = 50*4;
126c4762a1bSJed Brown   const PetscReal xy    = (x[0]-0.5)*(x[1]-0.5);
127c4762a1bSJed Brown 
128c4762a1bSJed Brown   *u = PetscSinReal(alpha*xy) * (alpha*PetscAbsReal(xy) < 2*PETSC_PI ? 1 : 0.01);
129c4762a1bSJed Brown   return 0;
130c4762a1bSJed Brown }
131c4762a1bSJed Brown 
132c4762a1bSJed Brown static void f0_u(PetscInt dim, PetscInt Nf, PetscInt NfAux,
133c4762a1bSJed Brown                  const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[],
134c4762a1bSJed Brown                  const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[],
135c4762a1bSJed Brown                  PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f0[])
136c4762a1bSJed Brown {
137c4762a1bSJed Brown   f0[0] = 4.0;
138c4762a1bSJed Brown }
139c4762a1bSJed Brown 
140c4762a1bSJed Brown static void f0_circle_u(PetscInt dim, PetscInt Nf, PetscInt NfAux,
141c4762a1bSJed Brown                         const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[],
142c4762a1bSJed Brown                         const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[],
143c4762a1bSJed Brown                         PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f0[])
144c4762a1bSJed Brown {
145c4762a1bSJed Brown   const PetscReal alpha   = 500.;
146c4762a1bSJed Brown   const PetscReal radius2 = PetscSqr(0.15);
147c4762a1bSJed Brown   const PetscReal r2      = PetscSqr(x[0] - 0.5) + PetscSqr(x[1] - 0.5);
148c4762a1bSJed Brown   const PetscReal xi      = alpha*(radius2 - r2);
149c4762a1bSJed Brown 
150c4762a1bSJed Brown   f0[0] = (-4.0*alpha - 8.0*PetscSqr(alpha)*r2*PetscTanhReal(xi)) * PetscSqr(1.0/PetscCoshReal(xi));
151c4762a1bSJed Brown }
152c4762a1bSJed Brown 
153c4762a1bSJed Brown static void f0_cross_u(PetscInt dim, PetscInt Nf, PetscInt NfAux,
154c4762a1bSJed Brown                        const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[],
155c4762a1bSJed Brown                        const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[],
156c4762a1bSJed Brown                        PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f0[])
157c4762a1bSJed Brown {
158c4762a1bSJed Brown   const PetscReal alpha = 50*4;
159c4762a1bSJed Brown   const PetscReal xy    = (x[0]-0.5)*(x[1]-0.5);
160c4762a1bSJed Brown 
161c4762a1bSJed Brown   f0[0] = PetscSinReal(alpha*xy) * (alpha*PetscAbsReal(xy) < 2*PETSC_PI ? 1 : 0.01);
162c4762a1bSJed Brown }
163c4762a1bSJed Brown 
164d6837840SMatthew G. Knepley static void f0_checkerboard_0_u(PetscInt dim, PetscInt Nf, PetscInt NfAux,
165d6837840SMatthew G. Knepley                                 const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[],
166d6837840SMatthew G. Knepley                                 const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[],
167d6837840SMatthew G. Knepley                                 PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f0[])
168d6837840SMatthew G. Knepley {
169d6837840SMatthew G. Knepley   f0[0] = -20.0*PetscExpReal(-(PetscSqr(x[0] - 0.5) + PetscSqr(x[1] - 0.5)));
170d6837840SMatthew G. Knepley }
171d6837840SMatthew G. Knepley 
172c4762a1bSJed Brown static void f0_bd_u(PetscInt dim, PetscInt Nf, PetscInt NfAux,
173c4762a1bSJed Brown                     const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[],
174c4762a1bSJed Brown                     const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[],
175c4762a1bSJed Brown                     PetscReal t, const PetscReal x[], const PetscReal n[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f0[])
176c4762a1bSJed Brown {
177c4762a1bSJed Brown   PetscInt d;
178c4762a1bSJed Brown   for (d = 0, f0[0] = 0.0; d < dim; ++d) f0[0] += -n[d]*2.0*x[d];
179c4762a1bSJed Brown }
180c4762a1bSJed Brown 
181c4762a1bSJed Brown static void f1_bd_zero(PetscInt dim, PetscInt Nf, PetscInt NfAux,
182c4762a1bSJed Brown                        const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[],
183c4762a1bSJed Brown                        const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[],
184c4762a1bSJed Brown                        PetscReal t, const PetscReal x[], const PetscReal n[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f1[])
185c4762a1bSJed Brown {
186c4762a1bSJed Brown   PetscInt comp;
187c4762a1bSJed Brown   for (comp = 0; comp < dim; ++comp) f1[comp] = 0.0;
188c4762a1bSJed Brown }
189c4762a1bSJed Brown 
190c4762a1bSJed Brown /* gradU[comp*dim+d] = {u_x, u_y} or {u_x, u_y, u_z} */
191c4762a1bSJed Brown static void f1_u(PetscInt dim, PetscInt Nf, PetscInt NfAux,
192c4762a1bSJed Brown                  const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[],
193c4762a1bSJed Brown                  const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[],
194c4762a1bSJed Brown                  PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f1[])
195c4762a1bSJed Brown {
196c4762a1bSJed Brown   PetscInt d;
197c4762a1bSJed Brown   for (d = 0; d < dim; ++d) f1[d] = u_x[d];
198c4762a1bSJed Brown }
199c4762a1bSJed Brown 
200c4762a1bSJed Brown /* < \nabla v, \nabla u + {\nabla u}^T >
201c4762a1bSJed Brown    This just gives \nabla u, give the perdiagonal for the transpose */
202c4762a1bSJed Brown static void g3_uu(PetscInt dim, PetscInt Nf, PetscInt NfAux,
203c4762a1bSJed Brown                   const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[],
204c4762a1bSJed Brown                   const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[],
205c4762a1bSJed Brown                   PetscReal t, PetscReal u_tShift, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar g3[])
206c4762a1bSJed Brown {
207c4762a1bSJed Brown   PetscInt d;
208c4762a1bSJed Brown   for (d = 0; d < dim; ++d) g3[d*dim+d] = 1.0;
209c4762a1bSJed Brown }
210c4762a1bSJed Brown 
211c4762a1bSJed Brown /*
212c4762a1bSJed Brown   In 2D for x periodicity and y Dirichlet conditions, we use exact solution:
213c4762a1bSJed Brown 
214c4762a1bSJed Brown     u = sin(2 pi x)
215c4762a1bSJed Brown     f = -4 pi^2 sin(2 pi x)
216c4762a1bSJed Brown 
217c4762a1bSJed Brown   so that
218c4762a1bSJed Brown 
219c4762a1bSJed Brown     -\Delta u + f = 4 pi^2 sin(2 pi x) - 4 pi^2 sin(2 pi x) = 0
220c4762a1bSJed Brown */
221c4762a1bSJed Brown static PetscErrorCode xtrig_u_2d(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt Nc, PetscScalar *u, void *ctx)
222c4762a1bSJed Brown {
223c4762a1bSJed Brown   *u = PetscSinReal(2.0*PETSC_PI*x[0]);
224c4762a1bSJed Brown   return 0;
225c4762a1bSJed Brown }
226c4762a1bSJed Brown 
227c4762a1bSJed Brown static void f0_xtrig_u(PetscInt dim, PetscInt Nf, PetscInt NfAux,
228c4762a1bSJed Brown                        const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[],
229c4762a1bSJed Brown                        const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[],
230c4762a1bSJed Brown                        PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f0[])
231c4762a1bSJed Brown {
232c4762a1bSJed Brown   f0[0] = -4.0*PetscSqr(PETSC_PI)*PetscSinReal(2.0*PETSC_PI*x[0]);
233c4762a1bSJed Brown }
234c4762a1bSJed Brown 
235c4762a1bSJed Brown /*
236c4762a1bSJed Brown   In 2D for x-y periodicity, we use exact solution:
237c4762a1bSJed Brown 
238c4762a1bSJed Brown     u = sin(2 pi x) sin(2 pi y)
239c4762a1bSJed Brown     f = -8 pi^2 sin(2 pi x)
240c4762a1bSJed Brown 
241c4762a1bSJed Brown   so that
242c4762a1bSJed Brown 
243c4762a1bSJed Brown     -\Delta u + f = 4 pi^2 sin(2 pi x) sin(2 pi y) + 4 pi^2 sin(2 pi x) sin(2 pi y) - 8 pi^2 sin(2 pi x) = 0
244c4762a1bSJed Brown */
245c4762a1bSJed Brown static PetscErrorCode xytrig_u_2d(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt Nc, PetscScalar *u, void *ctx)
246c4762a1bSJed Brown {
247c4762a1bSJed Brown   *u = PetscSinReal(2.0*PETSC_PI*x[0])*PetscSinReal(2.0*PETSC_PI*x[1]);
248c4762a1bSJed Brown   return 0;
249c4762a1bSJed Brown }
250c4762a1bSJed Brown 
251c4762a1bSJed Brown static void f0_xytrig_u(PetscInt dim, PetscInt Nf, PetscInt NfAux,
252c4762a1bSJed Brown                         const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[],
253c4762a1bSJed Brown                         const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[],
254c4762a1bSJed Brown                         PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f0[])
255c4762a1bSJed Brown {
256c4762a1bSJed Brown   f0[0] = -8.0*PetscSqr(PETSC_PI)*PetscSinReal(2.0*PETSC_PI*x[0]);
257c4762a1bSJed Brown }
258c4762a1bSJed Brown 
259c4762a1bSJed Brown /*
260c4762a1bSJed Brown   In 2D for Dirichlet conditions with a variable coefficient, we use exact solution:
261c4762a1bSJed Brown 
262c4762a1bSJed Brown     u  = x^2 + y^2
263c4762a1bSJed Brown     f  = 6 (x + y)
264c4762a1bSJed Brown     nu = (x + y)
265c4762a1bSJed Brown 
266c4762a1bSJed Brown   so that
267c4762a1bSJed Brown 
268c4762a1bSJed Brown     -\div \nu \grad u + f = -6 (x + y) + 6 (x + y) = 0
269c4762a1bSJed Brown */
270c4762a1bSJed Brown static PetscErrorCode nu_2d(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt Nc, PetscScalar *u, void *ctx)
271c4762a1bSJed Brown {
272c4762a1bSJed Brown   *u = x[0] + x[1];
273c4762a1bSJed Brown   return 0;
274c4762a1bSJed Brown }
275c4762a1bSJed Brown 
276d6837840SMatthew G. Knepley static PetscErrorCode checkerboardCoeff(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt Nc, PetscScalar *u, void *ctx)
277d6837840SMatthew G. Knepley {
278d6837840SMatthew G. Knepley   AppCtx  *user = (AppCtx *) ctx;
279d6837840SMatthew G. Knepley   PetscInt div  = user->div;
280d6837840SMatthew G. Knepley   PetscInt k    = user->k;
281d6837840SMatthew G. Knepley   PetscInt mask = 0, ind = 0, d;
282d6837840SMatthew G. Knepley 
283d6837840SMatthew G. Knepley   PetscFunctionBeginUser;
284d6837840SMatthew G. Knepley   for (d = 0; d < dim; ++d) mask = (mask + (PetscInt) (x[d]*div)) % 2;
285d6837840SMatthew G. Knepley   if (user->kgrid) {
286d6837840SMatthew G. Knepley     for (d = 0; d < dim; ++d) {
287d6837840SMatthew G. Knepley       if (d > 0) ind *= dim;
288d6837840SMatthew G. Knepley       ind += (PetscInt) (x[d]*div);
289d6837840SMatthew G. Knepley     }
290d6837840SMatthew G. Knepley     k = user->kgrid[ind];
291d6837840SMatthew G. Knepley   }
292d6837840SMatthew G. Knepley   u[0] = mask ? 1.0 : PetscPowRealInt(10.0, -k);
293d6837840SMatthew G. Knepley   PetscFunctionReturn(0);
294d6837840SMatthew G. Knepley }
295d6837840SMatthew G. Knepley 
296c4762a1bSJed Brown void f0_analytic_u(PetscInt dim, PetscInt Nf, PetscInt NfAux,
297c4762a1bSJed Brown                    const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[],
298c4762a1bSJed Brown                    const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[],
299c4762a1bSJed Brown                    PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f0[])
300c4762a1bSJed Brown {
301c4762a1bSJed Brown   f0[0] = 6.0*(x[0] + x[1]);
302c4762a1bSJed Brown }
303c4762a1bSJed Brown 
304c4762a1bSJed Brown /* gradU[comp*dim+d] = {u_x, u_y} or {u_x, u_y, u_z} */
305c4762a1bSJed Brown void f1_analytic_u(PetscInt dim, PetscInt Nf, PetscInt NfAux,
306c4762a1bSJed Brown                    const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[],
307c4762a1bSJed Brown                    const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[],
308c4762a1bSJed Brown                    PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f1[])
309c4762a1bSJed Brown {
310c4762a1bSJed Brown   PetscInt d;
311c4762a1bSJed Brown   for (d = 0; d < dim; ++d) f1[d] = (x[0] + x[1])*u_x[d];
312c4762a1bSJed Brown }
313c4762a1bSJed Brown 
314c4762a1bSJed Brown void f1_field_u(PetscInt dim, PetscInt Nf, PetscInt NfAux,
315c4762a1bSJed Brown                 const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[],
316c4762a1bSJed Brown                 const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[],
317c4762a1bSJed Brown                 PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f1[])
318c4762a1bSJed Brown {
319c4762a1bSJed Brown   PetscInt d;
320c4762a1bSJed Brown   for (d = 0; d < dim; ++d) f1[d] = a[0]*u_x[d];
321c4762a1bSJed Brown }
322c4762a1bSJed Brown 
323c4762a1bSJed Brown /* < \nabla v, \nabla u + {\nabla u}^T >
324c4762a1bSJed Brown    This just gives \nabla u, give the perdiagonal for the transpose */
325c4762a1bSJed Brown void g3_analytic_uu(PetscInt dim, PetscInt Nf, PetscInt NfAux,
326c4762a1bSJed Brown                     const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[],
327c4762a1bSJed Brown                     const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[],
328c4762a1bSJed Brown                     PetscReal t, PetscReal u_tShift, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar g3[])
329c4762a1bSJed Brown {
330c4762a1bSJed Brown   PetscInt d;
331c4762a1bSJed Brown   for (d = 0; d < dim; ++d) g3[d*dim+d] = x[0] + x[1];
332c4762a1bSJed Brown }
333c4762a1bSJed Brown 
334c4762a1bSJed Brown void g3_field_uu(PetscInt dim, PetscInt Nf, PetscInt NfAux,
335c4762a1bSJed Brown                  const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[],
336c4762a1bSJed Brown                  const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[],
337c4762a1bSJed Brown                  PetscReal t, PetscReal u_tShift, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar g3[])
338c4762a1bSJed Brown {
339c4762a1bSJed Brown   PetscInt d;
340c4762a1bSJed Brown   for (d = 0; d < dim; ++d) g3[d*dim+d] = a[0];
341c4762a1bSJed Brown }
342c4762a1bSJed Brown 
343c4762a1bSJed Brown /*
344c4762a1bSJed Brown   In 2D for Dirichlet conditions with a nonlinear coefficient (p-Laplacian with p = 4), we use exact solution:
345c4762a1bSJed Brown 
346c4762a1bSJed Brown     u  = x^2 + y^2
347c4762a1bSJed Brown     f  = 16 (x^2 + y^2)
348c4762a1bSJed Brown     nu = 1/2 |grad u|^2
349c4762a1bSJed Brown 
350c4762a1bSJed Brown   so that
351c4762a1bSJed Brown 
352c4762a1bSJed Brown     -\div \nu \grad u + f = -16 (x^2 + y^2) + 16 (x^2 + y^2) = 0
353c4762a1bSJed Brown */
354c4762a1bSJed Brown void f0_analytic_nonlinear_u(PetscInt dim, PetscInt Nf, PetscInt NfAux,
355c4762a1bSJed Brown                              const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[],
356c4762a1bSJed Brown                              const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[],
357c4762a1bSJed Brown                              PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f0[])
358c4762a1bSJed Brown {
359c4762a1bSJed Brown   f0[0] = 16.0*(x[0]*x[0] + x[1]*x[1]);
360c4762a1bSJed Brown }
361c4762a1bSJed Brown 
362c4762a1bSJed Brown /* gradU[comp*dim+d] = {u_x, u_y} or {u_x, u_y, u_z} */
363c4762a1bSJed Brown void f1_analytic_nonlinear_u(PetscInt dim, PetscInt Nf, PetscInt NfAux,
364c4762a1bSJed Brown                              const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[],
365c4762a1bSJed Brown                              const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[],
366c4762a1bSJed Brown                              PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f1[])
367c4762a1bSJed Brown {
368c4762a1bSJed Brown   PetscScalar nu = 0.0;
369c4762a1bSJed Brown   PetscInt    d;
370c4762a1bSJed Brown   for (d = 0; d < dim; ++d) nu += u_x[d]*u_x[d];
371c4762a1bSJed Brown   for (d = 0; d < dim; ++d) f1[d] = 0.5*nu*u_x[d];
372c4762a1bSJed Brown }
373c4762a1bSJed Brown 
374c4762a1bSJed Brown /*
375c4762a1bSJed Brown   grad (u + eps w) - grad u = eps grad w
376c4762a1bSJed Brown 
377c4762a1bSJed Brown   1/2 |grad (u + eps w)|^2 grad (u + eps w) - 1/2 |grad u|^2 grad u
378c4762a1bSJed Brown = 1/2 (|grad u|^2 + 2 eps <grad u,grad w>) (grad u + eps grad w) - 1/2 |grad u|^2 grad u
379c4762a1bSJed Brown = 1/2 (eps |grad u|^2 grad w + 2 eps <grad u,grad w> grad u)
380c4762a1bSJed Brown = eps (1/2 |grad u|^2 grad w + grad u <grad u,grad w>)
381c4762a1bSJed Brown */
382c4762a1bSJed Brown void g3_analytic_nonlinear_uu(PetscInt dim, PetscInt Nf, PetscInt NfAux,
383c4762a1bSJed Brown                               const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[],
384c4762a1bSJed Brown                               const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[],
385c4762a1bSJed Brown                               PetscReal t, PetscReal u_tShift, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar g3[])
386c4762a1bSJed Brown {
387c4762a1bSJed Brown   PetscScalar nu = 0.0;
388c4762a1bSJed Brown   PetscInt    d, e;
389c4762a1bSJed Brown   for (d = 0; d < dim; ++d) nu += u_x[d]*u_x[d];
390c4762a1bSJed Brown   for (d = 0; d < dim; ++d) {
391c4762a1bSJed Brown     g3[d*dim+d] = 0.5*nu;
392c4762a1bSJed Brown     for (e = 0; e < dim; ++e) {
393c4762a1bSJed Brown       g3[d*dim+e] += u_x[d]*u_x[e];
394c4762a1bSJed Brown     }
395c4762a1bSJed Brown   }
396c4762a1bSJed Brown }
397c4762a1bSJed Brown 
398c4762a1bSJed Brown /*
399c4762a1bSJed Brown   In 3D for Dirichlet conditions we use exact solution:
400c4762a1bSJed Brown 
401c4762a1bSJed Brown     u = 2/3 (x^2 + y^2 + z^2)
402c4762a1bSJed Brown     f = 4
403c4762a1bSJed Brown 
404c4762a1bSJed Brown   so that
405c4762a1bSJed Brown 
406c4762a1bSJed Brown     -\Delta u + f = -2/3 * 6 + 4 = 0
407c4762a1bSJed Brown 
408c4762a1bSJed Brown   For Neumann conditions, we have
409c4762a1bSJed Brown 
410c4762a1bSJed Brown     -\nabla u \cdot -\hat z |_{z=0} =  (2z)|_{z=0} =  0 (bottom)
411c4762a1bSJed Brown     -\nabla u \cdot  \hat z |_{z=1} = -(2z)|_{z=1} = -2 (top)
412c4762a1bSJed Brown     -\nabla u \cdot -\hat y |_{y=0} =  (2y)|_{y=0} =  0 (front)
413c4762a1bSJed Brown     -\nabla u \cdot  \hat y |_{y=1} = -(2y)|_{y=1} = -2 (back)
414c4762a1bSJed Brown     -\nabla u \cdot -\hat x |_{x=0} =  (2x)|_{x=0} =  0 (left)
415c4762a1bSJed Brown     -\nabla u \cdot  \hat x |_{x=1} = -(2x)|_{x=1} = -2 (right)
416c4762a1bSJed Brown 
417c4762a1bSJed Brown   Which we can express as
418c4762a1bSJed Brown 
419c4762a1bSJed Brown     \nabla u \cdot  \hat n|_\Gamma = {2 x, 2 y, 2z} \cdot \hat n = 2 (x + y + z)
420c4762a1bSJed Brown */
421c4762a1bSJed Brown static PetscErrorCode quadratic_u_3d(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt Nc, PetscScalar *u, void *ctx)
422c4762a1bSJed Brown {
423c4762a1bSJed Brown   *u = 2.0*(x[0]*x[0] + x[1]*x[1] + x[2]*x[2])/3.0;
424c4762a1bSJed Brown   return 0;
425c4762a1bSJed Brown }
426c4762a1bSJed Brown 
427c4762a1bSJed Brown static void quadratic_u_field_3d(PetscInt dim, PetscInt Nf, PetscInt NfAux,
428c4762a1bSJed Brown                                  const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[],
429c4762a1bSJed Brown                                  const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[],
430c4762a1bSJed Brown                                  PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar uexact[])
431c4762a1bSJed Brown {
432c4762a1bSJed Brown   uexact[0] = a[0];
433c4762a1bSJed Brown }
434c4762a1bSJed Brown 
435c4762a1bSJed Brown static void bd_integral_2d(PetscInt dim, PetscInt Nf, PetscInt NfAux,
436c4762a1bSJed Brown                            const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[],
437c4762a1bSJed Brown                            const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[],
438c4762a1bSJed Brown                            PetscReal t, const PetscReal x[], const PetscReal n[], PetscInt numConstants, const PetscScalar constants[], PetscScalar *uint)
439c4762a1bSJed Brown {
440c4762a1bSJed Brown   uint[0] = u[0];
441c4762a1bSJed Brown }
442c4762a1bSJed Brown 
443c4762a1bSJed Brown static PetscErrorCode ProcessOptions(MPI_Comm comm, AppCtx *options)
444c4762a1bSJed Brown {
445c4762a1bSJed Brown   const char    *bcTypes[3]  = {"neumann", "dirichlet", "none"};
446c4762a1bSJed Brown   const char    *runTypes[4] = {"full", "exact", "test", "perf"};
447d6837840SMatthew G. Knepley   const char    *coeffTypes[8] = {"none", "analytic", "field", "nonlinear", "circle", "cross", "checkerboard_0", "checkerboard_1"};
448c4762a1bSJed Brown   PetscInt       bd, bc, run, coeff, n;
449d6837840SMatthew G. Knepley   PetscBool      rand = PETSC_FALSE, flg;
450c4762a1bSJed Brown   PetscErrorCode ierr;
451c4762a1bSJed Brown 
452c4762a1bSJed Brown   PetscFunctionBeginUser;
453c4762a1bSJed Brown   options->debug               = 0;
454c4762a1bSJed Brown   options->runType             = RUN_FULL;
455c4762a1bSJed Brown   options->dim                 = 2;
456c4762a1bSJed Brown   options->periodicity[0]      = DM_BOUNDARY_NONE;
457c4762a1bSJed Brown   options->periodicity[1]      = DM_BOUNDARY_NONE;
458c4762a1bSJed Brown   options->periodicity[2]      = DM_BOUNDARY_NONE;
459c4762a1bSJed Brown   options->cells[0]            = 2;
460c4762a1bSJed Brown   options->cells[1]            = 2;
461c4762a1bSJed Brown   options->cells[2]            = 2;
462c4762a1bSJed Brown   options->filename[0]         = '\0';
463c4762a1bSJed Brown   options->interpolate         = PETSC_TRUE;
464c4762a1bSJed Brown   options->refinementLimit     = 0.0;
465c4762a1bSJed Brown   options->bcType              = DIRICHLET;
466c4762a1bSJed Brown   options->variableCoefficient = COEFF_NONE;
467c4762a1bSJed Brown   options->fieldBC             = PETSC_FALSE;
468c4762a1bSJed Brown   options->jacobianMF          = PETSC_FALSE;
469c4762a1bSJed Brown   options->showInitial         = PETSC_FALSE;
470c4762a1bSJed Brown   options->showSolution        = PETSC_FALSE;
471c4762a1bSJed Brown   options->restart             = PETSC_FALSE;
472c4762a1bSJed Brown   options->viewHierarchy       = PETSC_FALSE;
473c4762a1bSJed Brown   options->simplex             = PETSC_TRUE;
474c4762a1bSJed Brown   options->quiet               = PETSC_FALSE;
475c4762a1bSJed Brown   options->nonzInit            = PETSC_FALSE;
476c4762a1bSJed Brown   options->bdIntegral          = PETSC_FALSE;
477c4762a1bSJed Brown   options->checkksp            = PETSC_FALSE;
478d6837840SMatthew G. Knepley   options->div                 = 4;
479d6837840SMatthew G. Knepley   options->k                   = 1;
480d6837840SMatthew G. Knepley   options->kgrid               = NULL;
481c4762a1bSJed Brown 
482c4762a1bSJed Brown   ierr = PetscOptionsBegin(comm, "", "Poisson Problem Options", "DMPLEX");CHKERRQ(ierr);
483c4762a1bSJed Brown   ierr = PetscOptionsInt("-debug", "The debugging level", "ex12.c", options->debug, &options->debug, NULL);CHKERRQ(ierr);
484c4762a1bSJed Brown   run  = options->runType;
485c4762a1bSJed Brown   ierr = PetscOptionsEList("-run_type", "The run type", "ex12.c", runTypes, 4, runTypes[options->runType], &run, NULL);CHKERRQ(ierr);
486c4762a1bSJed Brown 
487c4762a1bSJed Brown   options->runType = (RunType) run;
488c4762a1bSJed Brown 
489c4762a1bSJed Brown   ierr = PetscOptionsInt("-dim", "The topological mesh dimension", "ex12.c", options->dim, &options->dim, NULL);CHKERRQ(ierr);
490c4762a1bSJed Brown   bd = options->periodicity[0];
491c4762a1bSJed Brown   ierr = PetscOptionsEList("-x_periodicity", "The x-boundary periodicity", "ex12.c", DMBoundaryTypes, 5, DMBoundaryTypes[options->periodicity[0]], &bd, NULL);CHKERRQ(ierr);
492c4762a1bSJed Brown   options->periodicity[0] = (DMBoundaryType) bd;
493c4762a1bSJed Brown   bd = options->periodicity[1];
494c4762a1bSJed Brown   ierr = PetscOptionsEList("-y_periodicity", "The y-boundary periodicity", "ex12.c", DMBoundaryTypes, 5, DMBoundaryTypes[options->periodicity[1]], &bd, NULL);CHKERRQ(ierr);
495c4762a1bSJed Brown   options->periodicity[1] = (DMBoundaryType) bd;
496c4762a1bSJed Brown   bd = options->periodicity[2];
497c4762a1bSJed Brown   ierr = PetscOptionsEList("-z_periodicity", "The z-boundary periodicity", "ex12.c", DMBoundaryTypes, 5, DMBoundaryTypes[options->periodicity[2]], &bd, NULL);CHKERRQ(ierr);
498c4762a1bSJed Brown   options->periodicity[2] = (DMBoundaryType) bd;
499c4762a1bSJed Brown   n = 3;
500c4762a1bSJed Brown   ierr = PetscOptionsIntArray("-cells", "The initial mesh division", "ex12.c", options->cells, &n, NULL);CHKERRQ(ierr);
501c4762a1bSJed Brown   ierr = PetscOptionsString("-f", "Mesh filename to read", "ex12.c", options->filename, options->filename, sizeof(options->filename), &flg);CHKERRQ(ierr);
502c4762a1bSJed Brown   ierr = PetscOptionsBool("-interpolate", "Generate intermediate mesh elements", "ex12.c", options->interpolate, &options->interpolate, NULL);CHKERRQ(ierr);
503c4762a1bSJed Brown   ierr = PetscOptionsReal("-refinement_limit", "The largest allowable cell volume", "ex12.c", options->refinementLimit, &options->refinementLimit, NULL);CHKERRQ(ierr);
504c4762a1bSJed Brown   bc   = options->bcType;
505c4762a1bSJed Brown   ierr = PetscOptionsEList("-bc_type","Type of boundary condition","ex12.c",bcTypes,3,bcTypes[options->bcType],&bc,NULL);CHKERRQ(ierr);
506c4762a1bSJed Brown   options->bcType = (BCType) bc;
507c4762a1bSJed Brown   coeff = options->variableCoefficient;
508d6837840SMatthew G. Knepley   ierr = PetscOptionsEList("-variable_coefficient","Type of variable coefficent","ex12.c",coeffTypes,8,coeffTypes[options->variableCoefficient],&coeff,NULL);CHKERRQ(ierr);
509c4762a1bSJed Brown   options->variableCoefficient = (CoeffType) coeff;
510c4762a1bSJed Brown 
511c4762a1bSJed Brown   ierr = PetscOptionsBool("-field_bc", "Use a field representation for the BC", "ex12.c", options->fieldBC, &options->fieldBC, NULL);CHKERRQ(ierr);
512c4762a1bSJed Brown   ierr = PetscOptionsBool("-jacobian_mf", "Calculate the action of the Jacobian on the fly", "ex12.c", options->jacobianMF, &options->jacobianMF, NULL);CHKERRQ(ierr);
513c4762a1bSJed Brown   ierr = PetscOptionsBool("-show_initial", "Output the initial guess for verification", "ex12.c", options->showInitial, &options->showInitial, NULL);CHKERRQ(ierr);
514c4762a1bSJed Brown   ierr = PetscOptionsBool("-show_solution", "Output the solution for verification", "ex12.c", options->showSolution, &options->showSolution, NULL);CHKERRQ(ierr);
515c4762a1bSJed Brown   ierr = PetscOptionsBool("-restart", "Read in the mesh and solution from a file", "ex12.c", options->restart, &options->restart, NULL);CHKERRQ(ierr);
516c4762a1bSJed Brown   ierr = PetscOptionsBool("-dm_view_hierarchy", "View the coarsened hierarchy", "ex12.c", options->viewHierarchy, &options->viewHierarchy, NULL);CHKERRQ(ierr);
517c4762a1bSJed Brown   ierr = PetscOptionsBool("-simplex", "Simplicial (true) or tensor (false) mesh", "ex12.c", options->simplex, &options->simplex, NULL);CHKERRQ(ierr);
518c4762a1bSJed Brown   ierr = PetscOptionsBool("-quiet", "Don't print any vecs", "ex12.c", options->quiet, &options->quiet, NULL);CHKERRQ(ierr);
5192d4ee042Sprj-   ierr = PetscOptionsBool("-nonzero_initial_guess", "nonzero initial guess", "ex12.c", options->nonzInit, &options->nonzInit, NULL);CHKERRQ(ierr);
520c4762a1bSJed Brown   ierr = PetscOptionsBool("-bd_integral", "Compute the integral of the solution on the boundary", "ex12.c", options->bdIntegral, &options->bdIntegral, NULL);CHKERRQ(ierr);
521c4762a1bSJed Brown   if (options->runType == RUN_TEST) {
522c4762a1bSJed Brown     ierr = PetscOptionsBool("-run_test_check_ksp", "Check solution of KSP", "ex12.c", options->checkksp, &options->checkksp, NULL);CHKERRQ(ierr);
523c4762a1bSJed Brown   }
524d6837840SMatthew G. Knepley   ierr = PetscOptionsInt("-div", "The number of division for the checkerboard coefficient", "ex12.c", options->div, &options->div, NULL);CHKERRQ(ierr);
525d6837840SMatthew G. Knepley   ierr = PetscOptionsInt("-k", "The exponent for the checkerboard coefficient", "ex12.c", options->k, &options->k, NULL);CHKERRQ(ierr);
526d6837840SMatthew G. Knepley   ierr = PetscOptionsBool("-k_random", "Assign random k values to checkerboard", "ex12.c", rand, &rand, NULL);CHKERRQ(ierr);
527c4762a1bSJed Brown   ierr = PetscOptionsEnd();
528c4762a1bSJed Brown   ierr = PetscLogEventRegister("CreateMesh", DM_CLASSID, &options->createMeshEvent);CHKERRQ(ierr);
529d6837840SMatthew G. Knepley 
530d6837840SMatthew G. Knepley   if (rand) {
531d6837840SMatthew G. Knepley     PetscRandom r;
532d6837840SMatthew G. Knepley     PetscReal   val;
533d6837840SMatthew G. Knepley     PetscInt    N = PetscPowInt(options->div, options->dim), i;
534d6837840SMatthew G. Knepley 
535d6837840SMatthew G. Knepley     ierr = PetscMalloc1(N, &options->kgrid);CHKERRQ(ierr);
536d6837840SMatthew G. Knepley     ierr = PetscRandomCreate(PETSC_COMM_SELF, &r);CHKERRQ(ierr);
537d6837840SMatthew G. Knepley     ierr = PetscRandomSetFromOptions(r);CHKERRQ(ierr);
538d6837840SMatthew G. Knepley     ierr = PetscRandomSetInterval(r, 0.0, options->k);CHKERRQ(ierr);
539d6837840SMatthew G. Knepley     ierr = PetscRandomSetSeed(r, 1973);CHKERRQ(ierr);
540d6837840SMatthew G. Knepley     ierr = PetscRandomSeed(r);CHKERRQ(ierr);
541d6837840SMatthew G. Knepley     for (i = 0; i < N; ++i) {
542d6837840SMatthew G. Knepley       ierr = PetscRandomGetValueReal(r, &val);CHKERRQ(ierr);
543d6837840SMatthew G. Knepley       options->kgrid[i] = 1 + (PetscInt) val;
544d6837840SMatthew G. Knepley     }
545d6837840SMatthew G. Knepley     ierr = PetscRandomDestroy(&r);CHKERRQ(ierr);
546d6837840SMatthew G. Knepley   }
547c4762a1bSJed Brown   PetscFunctionReturn(0);
548c4762a1bSJed Brown }
549c4762a1bSJed Brown 
550c4762a1bSJed Brown static PetscErrorCode CreateBCLabel(DM dm, const char name[])
551c4762a1bSJed Brown {
552408cafa0SMatthew G. Knepley   DM             plex;
553c4762a1bSJed Brown   DMLabel        label;
554c4762a1bSJed Brown   PetscErrorCode ierr;
555c4762a1bSJed Brown 
556c4762a1bSJed Brown   PetscFunctionBeginUser;
557c4762a1bSJed Brown   ierr = DMCreateLabel(dm, name);CHKERRQ(ierr);
558c4762a1bSJed Brown   ierr = DMGetLabel(dm, name, &label);CHKERRQ(ierr);
559408cafa0SMatthew G. Knepley   ierr = DMConvert(dm, DMPLEX, &plex);CHKERRQ(ierr);
560408cafa0SMatthew G. Knepley   ierr = DMPlexMarkBoundaryFaces(plex, 1, label);CHKERRQ(ierr);
561408cafa0SMatthew G. Knepley   ierr = DMDestroy(&plex);CHKERRQ(ierr);
562c4762a1bSJed Brown   PetscFunctionReturn(0);
563c4762a1bSJed Brown }
564c4762a1bSJed Brown 
565c4762a1bSJed Brown static PetscErrorCode CreateMesh(MPI_Comm comm, AppCtx *user, DM *dm)
566c4762a1bSJed Brown {
567c4762a1bSJed Brown   PetscInt       dim             = user->dim;
568c4762a1bSJed Brown   const char    *filename        = user->filename;
569c4762a1bSJed Brown   PetscBool      interpolate     = user->interpolate;
570c4762a1bSJed Brown   PetscReal      refinementLimit = user->refinementLimit;
571c4762a1bSJed Brown   size_t         len;
572c4762a1bSJed Brown   PetscErrorCode ierr;
573c4762a1bSJed Brown 
574c4762a1bSJed Brown   PetscFunctionBeginUser;
575c4762a1bSJed Brown   ierr = PetscLogEventBegin(user->createMeshEvent,0,0,0,0);CHKERRQ(ierr);
576c4762a1bSJed Brown   ierr = PetscStrlen(filename, &len);CHKERRQ(ierr);
577c4762a1bSJed Brown   if (!len) {
578c4762a1bSJed Brown     PetscInt d;
579c4762a1bSJed Brown 
580c4762a1bSJed Brown     if (user->periodicity[0] || user->periodicity[1] || user->periodicity[2]) for (d = 0; d < dim; ++d) user->cells[d] = PetscMax(user->cells[d], 3);
581c4762a1bSJed Brown     ierr = DMPlexCreateBoxMesh(comm, dim, user->simplex, user->cells, NULL, NULL, user->periodicity, interpolate, dm);CHKERRQ(ierr);
582c4762a1bSJed Brown     ierr = PetscObjectSetName((PetscObject) *dm, "Mesh");CHKERRQ(ierr);
583c4762a1bSJed Brown   } else {
584c4762a1bSJed Brown     ierr = DMPlexCreateFromFile(comm, filename, interpolate, dm);CHKERRQ(ierr);
585c4762a1bSJed Brown     ierr = DMPlexSetRefinementUniform(*dm, PETSC_FALSE);CHKERRQ(ierr);
586c4762a1bSJed Brown   }
587c4762a1bSJed Brown   {
588c4762a1bSJed Brown     PetscPartitioner part;
589c4762a1bSJed Brown     DM               refinedMesh     = NULL;
590c4762a1bSJed Brown     DM               distributedMesh = NULL;
591c4762a1bSJed Brown 
592c4762a1bSJed Brown     /* Refine mesh using a volume constraint */
593c4762a1bSJed Brown     if (refinementLimit > 0.0) {
594c4762a1bSJed Brown       ierr = DMPlexSetRefinementLimit(*dm, refinementLimit);CHKERRQ(ierr);
595c4762a1bSJed Brown       ierr = DMRefine(*dm, comm, &refinedMesh);CHKERRQ(ierr);
596c4762a1bSJed Brown       if (refinedMesh) {
597c4762a1bSJed Brown         const char *name;
598c4762a1bSJed Brown 
599c4762a1bSJed Brown         ierr = PetscObjectGetName((PetscObject) *dm,         &name);CHKERRQ(ierr);
600c4762a1bSJed Brown         ierr = PetscObjectSetName((PetscObject) refinedMesh,  name);CHKERRQ(ierr);
601c4762a1bSJed Brown         ierr = DMDestroy(dm);CHKERRQ(ierr);
602c4762a1bSJed Brown         *dm  = refinedMesh;
603c4762a1bSJed Brown       }
604c4762a1bSJed Brown     }
605c4762a1bSJed Brown     /* Distribute mesh over processes */
606c4762a1bSJed Brown     ierr = DMPlexGetPartitioner(*dm,&part);CHKERRQ(ierr);
607c4762a1bSJed Brown     ierr = PetscPartitionerSetFromOptions(part);CHKERRQ(ierr);
608c4762a1bSJed Brown     ierr = DMPlexDistribute(*dm, 0, NULL, &distributedMesh);CHKERRQ(ierr);
609c4762a1bSJed Brown     if (distributedMesh) {
610c4762a1bSJed Brown       ierr = DMDestroy(dm);CHKERRQ(ierr);
611c4762a1bSJed Brown       *dm  = distributedMesh;
612c4762a1bSJed Brown     }
613c4762a1bSJed Brown   }
614c4762a1bSJed Brown   if (interpolate) {
615c4762a1bSJed Brown     if (user->bcType == NEUMANN) {
616c4762a1bSJed Brown       DMLabel   label;
617c4762a1bSJed Brown 
618c4762a1bSJed Brown       ierr = DMCreateLabel(*dm, "boundary");CHKERRQ(ierr);
619c4762a1bSJed Brown       ierr = DMGetLabel(*dm, "boundary", &label);CHKERRQ(ierr);
620c4762a1bSJed Brown       ierr = DMPlexMarkBoundaryFaces(*dm, 1, label);CHKERRQ(ierr);
621c4762a1bSJed Brown     } else if (user->bcType == DIRICHLET) {
622c4762a1bSJed Brown       PetscBool hasLabel;
623c4762a1bSJed Brown 
624c4762a1bSJed Brown       ierr = DMHasLabel(*dm,"marker",&hasLabel);CHKERRQ(ierr);
625c4762a1bSJed Brown       if (!hasLabel) {ierr = CreateBCLabel(*dm, "marker");CHKERRQ(ierr);}
626c4762a1bSJed Brown     }
627c4762a1bSJed Brown   }
628c4762a1bSJed Brown   {
629c4762a1bSJed Brown     char      convType[256];
630c4762a1bSJed Brown     PetscBool flg;
631c4762a1bSJed Brown 
632c4762a1bSJed Brown     ierr = PetscOptionsBegin(comm, "", "Mesh conversion options", "DMPLEX");CHKERRQ(ierr);
633c4762a1bSJed Brown     ierr = PetscOptionsFList("-dm_plex_convert_type","Convert DMPlex to another format","ex12",DMList,DMPLEX,convType,256,&flg);CHKERRQ(ierr);
634c4762a1bSJed Brown     ierr = PetscOptionsEnd();
635c4762a1bSJed Brown     if (flg) {
636c4762a1bSJed Brown       DM dmConv;
637c4762a1bSJed Brown 
638c4762a1bSJed Brown       ierr = DMConvert(*dm,convType,&dmConv);CHKERRQ(ierr);
639c4762a1bSJed Brown       if (dmConv) {
640c4762a1bSJed Brown         ierr = DMDestroy(dm);CHKERRQ(ierr);
641c4762a1bSJed Brown         *dm  = dmConv;
642c4762a1bSJed Brown       }
643c4762a1bSJed Brown     }
644c4762a1bSJed Brown   }
645c4762a1bSJed Brown   ierr = DMLocalizeCoordinates(*dm);CHKERRQ(ierr); /* needed for periodic */
646c4762a1bSJed Brown   ierr = DMSetFromOptions(*dm);CHKERRQ(ierr);
647c4762a1bSJed Brown   ierr = DMViewFromOptions(*dm, NULL, "-dm_view");CHKERRQ(ierr);
648c4762a1bSJed Brown   if (user->viewHierarchy) {
649c4762a1bSJed Brown     DM       cdm = *dm;
650c4762a1bSJed Brown     PetscInt i   = 0;
651c4762a1bSJed Brown     char     buf[256];
652c4762a1bSJed Brown 
653c4762a1bSJed Brown     while (cdm) {
654c4762a1bSJed Brown       ierr = DMSetUp(cdm);CHKERRQ(ierr);
655c4762a1bSJed Brown       ierr = DMGetCoarseDM(cdm, &cdm);CHKERRQ(ierr);
656c4762a1bSJed Brown       ++i;
657c4762a1bSJed Brown     }
658c4762a1bSJed Brown     cdm = *dm;
659c4762a1bSJed Brown     while (cdm) {
660c4762a1bSJed Brown       PetscViewer       viewer;
661c4762a1bSJed Brown       PetscBool   isHDF5, isVTK;
662c4762a1bSJed Brown 
663c4762a1bSJed Brown       --i;
664c4762a1bSJed Brown       ierr = PetscViewerCreate(comm,&viewer);CHKERRQ(ierr);
665c4762a1bSJed Brown       ierr = PetscViewerSetType(viewer,PETSCVIEWERHDF5);CHKERRQ(ierr);
666c4762a1bSJed Brown       ierr = PetscViewerSetOptionsPrefix(viewer,"hierarchy_");CHKERRQ(ierr);
667c4762a1bSJed Brown       ierr = PetscViewerSetFromOptions(viewer);CHKERRQ(ierr);
668c4762a1bSJed Brown       ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERHDF5,&isHDF5);CHKERRQ(ierr);
669c4762a1bSJed Brown       ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERVTK,&isVTK);CHKERRQ(ierr);
670c4762a1bSJed Brown       if (isHDF5) {
671c4762a1bSJed Brown         ierr = PetscSNPrintf(buf, 256, "ex12-%d.h5", i);CHKERRQ(ierr);
672c4762a1bSJed Brown       } else if (isVTK) {
673c4762a1bSJed Brown         ierr = PetscSNPrintf(buf, 256, "ex12-%d.vtu", i);CHKERRQ(ierr);
674c4762a1bSJed Brown         ierr = PetscViewerPushFormat(viewer,PETSC_VIEWER_VTK_VTU);CHKERRQ(ierr);
675c4762a1bSJed Brown       } else {
676c4762a1bSJed Brown         ierr = PetscSNPrintf(buf, 256, "ex12-%d", i);CHKERRQ(ierr);
677c4762a1bSJed Brown       }
678c4762a1bSJed Brown       ierr = PetscViewerFileSetMode(viewer,FILE_MODE_WRITE);CHKERRQ(ierr);
679c4762a1bSJed Brown       ierr = PetscViewerFileSetName(viewer,buf);CHKERRQ(ierr);
680c4762a1bSJed Brown       ierr = DMView(cdm, viewer);CHKERRQ(ierr);
681c4762a1bSJed Brown       ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
682c4762a1bSJed Brown       ierr = DMGetCoarseDM(cdm, &cdm);CHKERRQ(ierr);
683c4762a1bSJed Brown     }
684c4762a1bSJed Brown   }
685c4762a1bSJed Brown   ierr = PetscLogEventEnd(user->createMeshEvent,0,0,0,0);CHKERRQ(ierr);
686c4762a1bSJed Brown   PetscFunctionReturn(0);
687c4762a1bSJed Brown }
688c4762a1bSJed Brown 
689c4762a1bSJed Brown static PetscErrorCode SetupProblem(DM dm, AppCtx *user)
690c4762a1bSJed Brown {
691c4762a1bSJed Brown   PetscDS        prob;
692c4762a1bSJed Brown   const PetscInt id = 1;
693c4762a1bSJed Brown   PetscErrorCode ierr;
694c4762a1bSJed Brown 
695c4762a1bSJed Brown   PetscFunctionBeginUser;
696c4762a1bSJed Brown   ierr = DMGetDS(dm, &prob);CHKERRQ(ierr);
697c4762a1bSJed Brown   switch (user->variableCoefficient) {
698c4762a1bSJed Brown   case COEFF_NONE:
699c4762a1bSJed Brown     if (user->periodicity[0]) {
700c4762a1bSJed Brown       if (user->periodicity[1]) {
701c4762a1bSJed Brown         ierr = PetscDSSetResidual(prob, 0, f0_xytrig_u, f1_u);CHKERRQ(ierr);
702c4762a1bSJed Brown         ierr = PetscDSSetJacobian(prob, 0, 0, NULL, NULL, NULL, g3_uu);CHKERRQ(ierr);
703c4762a1bSJed Brown       } else {
704c4762a1bSJed Brown         ierr = PetscDSSetResidual(prob, 0, f0_xtrig_u,  f1_u);CHKERRQ(ierr);
705c4762a1bSJed Brown         ierr = PetscDSSetJacobian(prob, 0, 0, NULL, NULL, NULL, g3_uu);CHKERRQ(ierr);
706c4762a1bSJed Brown       }
707c4762a1bSJed Brown     } else {
708c4762a1bSJed Brown       ierr = PetscDSSetResidual(prob, 0, f0_u, f1_u);CHKERRQ(ierr);
709c4762a1bSJed Brown       ierr = PetscDSSetJacobian(prob, 0, 0, NULL, NULL, NULL, g3_uu);CHKERRQ(ierr);
710c4762a1bSJed Brown     }
711c4762a1bSJed Brown     break;
712c4762a1bSJed Brown   case COEFF_ANALYTIC:
713c4762a1bSJed Brown     ierr = PetscDSSetResidual(prob, 0, f0_analytic_u, f1_analytic_u);CHKERRQ(ierr);
714c4762a1bSJed Brown     ierr = PetscDSSetJacobian(prob, 0, 0, NULL, NULL, NULL, g3_analytic_uu);CHKERRQ(ierr);
715c4762a1bSJed Brown     break;
716c4762a1bSJed Brown   case COEFF_FIELD:
717c4762a1bSJed Brown     ierr = PetscDSSetResidual(prob, 0, f0_analytic_u, f1_field_u);CHKERRQ(ierr);
718c4762a1bSJed Brown     ierr = PetscDSSetJacobian(prob, 0, 0, NULL, NULL, NULL, g3_field_uu);CHKERRQ(ierr);
719c4762a1bSJed Brown     break;
720c4762a1bSJed Brown   case COEFF_NONLINEAR:
721c4762a1bSJed Brown     ierr = PetscDSSetResidual(prob, 0, f0_analytic_nonlinear_u, f1_analytic_nonlinear_u);CHKERRQ(ierr);
722c4762a1bSJed Brown     ierr = PetscDSSetJacobian(prob, 0, 0, NULL, NULL, NULL, g3_analytic_nonlinear_uu);CHKERRQ(ierr);
723c4762a1bSJed Brown     break;
724c4762a1bSJed Brown   case COEFF_CIRCLE:
725c4762a1bSJed Brown     ierr = PetscDSSetResidual(prob, 0, f0_circle_u, f1_u);CHKERRQ(ierr);
726c4762a1bSJed Brown     ierr = PetscDSSetJacobian(prob, 0, 0, NULL, NULL, NULL, g3_uu);CHKERRQ(ierr);
727c4762a1bSJed Brown     break;
728c4762a1bSJed Brown   case COEFF_CROSS:
729c4762a1bSJed Brown     ierr = PetscDSSetResidual(prob, 0, f0_cross_u, f1_u);CHKERRQ(ierr);
730c4762a1bSJed Brown     ierr = PetscDSSetJacobian(prob, 0, 0, NULL, NULL, NULL, g3_uu);CHKERRQ(ierr);
731c4762a1bSJed Brown     break;
732d6837840SMatthew G. Knepley   case COEFF_CHECKERBOARD_0:
733d6837840SMatthew G. Knepley     ierr = PetscDSSetResidual(prob, 0, f0_checkerboard_0_u, f1_field_u);CHKERRQ(ierr);
734d6837840SMatthew G. Knepley     ierr = PetscDSSetJacobian(prob, 0, 0, NULL, NULL, NULL, g3_field_uu);CHKERRQ(ierr);
735d6837840SMatthew G. Knepley     break;
736c4762a1bSJed Brown   default: SETERRQ1(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Invalid variable coefficient type %d", user->variableCoefficient);
737c4762a1bSJed Brown   }
738c4762a1bSJed Brown   switch (user->dim) {
739c4762a1bSJed Brown   case 2:
740c4762a1bSJed Brown     switch (user->variableCoefficient) {
741c4762a1bSJed Brown     case COEFF_CIRCLE:
742c4762a1bSJed Brown       user->exactFuncs[0]  = circle_u_2d;break;
743c4762a1bSJed Brown     case COEFF_CROSS:
744c4762a1bSJed Brown       user->exactFuncs[0]  = cross_u_2d;break;
745d6837840SMatthew G. Knepley     case COEFF_CHECKERBOARD_0:
746d6837840SMatthew G. Knepley       user->exactFuncs[0]  = zero;break;
747c4762a1bSJed Brown     default:
748c4762a1bSJed Brown       if (user->periodicity[0]) {
749c4762a1bSJed Brown         if (user->periodicity[1]) {
750c4762a1bSJed Brown           user->exactFuncs[0] = xytrig_u_2d;
751c4762a1bSJed Brown         } else {
752c4762a1bSJed Brown           user->exactFuncs[0] = xtrig_u_2d;
753c4762a1bSJed Brown         }
754c4762a1bSJed Brown       } else {
755c4762a1bSJed Brown         user->exactFuncs[0]  = quadratic_u_2d;
756c4762a1bSJed Brown         user->exactFields[0] = quadratic_u_field_2d;
757c4762a1bSJed Brown       }
758c4762a1bSJed Brown     }
759c4762a1bSJed Brown     if (user->bcType == NEUMANN) {ierr = PetscDSSetBdResidual(prob, 0, f0_bd_u, f1_bd_zero);CHKERRQ(ierr);}
760c4762a1bSJed Brown     break;
761c4762a1bSJed Brown   case 3:
762c4762a1bSJed Brown     user->exactFuncs[0]  = quadratic_u_3d;
763c4762a1bSJed Brown     user->exactFields[0] = quadratic_u_field_3d;
764c4762a1bSJed Brown     if (user->bcType == NEUMANN) {ierr = PetscDSSetBdResidual(prob, 0, f0_bd_u, f1_bd_zero);CHKERRQ(ierr);}
765c4762a1bSJed Brown     break;
766c4762a1bSJed Brown   default:
767c4762a1bSJed Brown     SETERRQ1(PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE, "Invalid dimension %d", user->dim);
768c4762a1bSJed Brown   }
769d6837840SMatthew G. Knepley   /* Setup constants */
770d6837840SMatthew G. Knepley   switch (user->variableCoefficient) {
771d6837840SMatthew G. Knepley   case COEFF_CHECKERBOARD_0:
772d6837840SMatthew G. Knepley   {
773d6837840SMatthew G. Knepley     PetscScalar constants[2];
774d6837840SMatthew G. Knepley 
775d6837840SMatthew G. Knepley     constants[0] = user->div;
776d6837840SMatthew G. Knepley     constants[1] = user->k;
777d6837840SMatthew G. Knepley     ierr = PetscDSSetConstants(prob, 2, constants);CHKERRQ(ierr);
778d6837840SMatthew G. Knepley   }
779d6837840SMatthew G. Knepley   break;
780d6837840SMatthew G. Knepley   default: break;
781d6837840SMatthew G. Knepley   }
782408cafa0SMatthew G. Knepley   ierr = PetscDSSetExactSolution(prob, 0, user->exactFuncs[0], user);CHKERRQ(ierr);
783d6837840SMatthew G. Knepley   /* Setup Boundary Conditions */
784c4762a1bSJed Brown   if (user->bcType != NONE) {
785408cafa0SMatthew G. Knepley     ierr = DMAddBoundary(dm, user->bcType == DIRICHLET ? (user->fieldBC ? DM_BC_ESSENTIAL_FIELD : DM_BC_ESSENTIAL) : DM_BC_NATURAL,
786c4762a1bSJed Brown                          "wall", user->bcType == DIRICHLET ? "marker" : "boundary", 0, 0, NULL,
78756cf3b9cSMatthew G. Knepley                          user->fieldBC ? (void (*)(void)) user->exactFields[0] : (void (*)(void)) user->exactFuncs[0], NULL, 1, &id, user);CHKERRQ(ierr);
788c4762a1bSJed Brown   }
789c4762a1bSJed Brown   PetscFunctionReturn(0);
790c4762a1bSJed Brown }
791c4762a1bSJed Brown 
792c4762a1bSJed Brown static PetscErrorCode SetupMaterial(DM dm, DM dmAux, AppCtx *user)
793c4762a1bSJed Brown {
794c4762a1bSJed Brown   PetscErrorCode (*matFuncs[1])(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt Nc, PetscScalar u[], void *ctx) = {nu_2d};
795d6837840SMatthew G. Knepley   void            *ctx[1];
796c4762a1bSJed Brown   Vec              nu;
797c4762a1bSJed Brown   PetscErrorCode   ierr;
798c4762a1bSJed Brown 
799c4762a1bSJed Brown   PetscFunctionBegin;
800d6837840SMatthew G. Knepley   ctx[0] = user;
801d6837840SMatthew G. Knepley   if (user->variableCoefficient == COEFF_CHECKERBOARD_0) {matFuncs[0] = checkerboardCoeff;}
802c4762a1bSJed Brown   ierr = DMCreateLocalVector(dmAux, &nu);CHKERRQ(ierr);
803d6837840SMatthew G. Knepley   ierr = PetscObjectSetName((PetscObject) nu, "Coefficient");CHKERRQ(ierr);
804d6837840SMatthew G. Knepley   ierr = DMProjectFunctionLocal(dmAux, 0.0, matFuncs, ctx, INSERT_ALL_VALUES, nu);CHKERRQ(ierr);
805c4762a1bSJed Brown   ierr = PetscObjectCompose((PetscObject) dm, "A", (PetscObject) nu);CHKERRQ(ierr);
806c4762a1bSJed Brown   ierr = VecDestroy(&nu);CHKERRQ(ierr);
807c4762a1bSJed Brown   PetscFunctionReturn(0);
808c4762a1bSJed Brown }
809c4762a1bSJed Brown 
810c4762a1bSJed Brown static PetscErrorCode SetupBC(DM dm, DM dmAux, AppCtx *user)
811c4762a1bSJed Brown {
812c4762a1bSJed Brown   PetscErrorCode (*bcFuncs[1])(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt Nc, PetscScalar u[], void *ctx);
813c4762a1bSJed Brown   Vec            uexact;
814c4762a1bSJed Brown   PetscInt       dim;
815c4762a1bSJed Brown   PetscErrorCode ierr;
816c4762a1bSJed Brown 
817c4762a1bSJed Brown   PetscFunctionBegin;
818c4762a1bSJed Brown   ierr = DMGetDimension(dm, &dim);CHKERRQ(ierr);
819c4762a1bSJed Brown   if (dim == 2) bcFuncs[0] = quadratic_u_2d;
820c4762a1bSJed Brown   else          bcFuncs[0] = quadratic_u_3d;
821c4762a1bSJed Brown   ierr = DMCreateLocalVector(dmAux, &uexact);CHKERRQ(ierr);
822c4762a1bSJed Brown   ierr = DMProjectFunctionLocal(dmAux, 0.0, bcFuncs, NULL, INSERT_ALL_VALUES, uexact);CHKERRQ(ierr);
823c4762a1bSJed Brown   ierr = PetscObjectCompose((PetscObject) dm, "A", (PetscObject) uexact);CHKERRQ(ierr);
824c4762a1bSJed Brown   ierr = VecDestroy(&uexact);CHKERRQ(ierr);
825c4762a1bSJed Brown   PetscFunctionReturn(0);
826c4762a1bSJed Brown }
827c4762a1bSJed Brown 
828c4762a1bSJed Brown static PetscErrorCode SetupAuxDM(DM dm, PetscFE feAux, AppCtx *user)
829c4762a1bSJed Brown {
830c4762a1bSJed Brown   DM             dmAux, coordDM;
831c4762a1bSJed Brown   PetscErrorCode ierr;
832c4762a1bSJed Brown 
833c4762a1bSJed Brown   PetscFunctionBegin;
834c4762a1bSJed Brown   /* MUST call DMGetCoordinateDM() in order to get p4est setup if present */
835c4762a1bSJed Brown   ierr = DMGetCoordinateDM(dm, &coordDM);CHKERRQ(ierr);
836c4762a1bSJed Brown   if (!feAux) PetscFunctionReturn(0);
837c4762a1bSJed Brown   ierr = DMClone(dm, &dmAux);CHKERRQ(ierr);
838c4762a1bSJed Brown   ierr = PetscObjectCompose((PetscObject) dm, "dmAux", (PetscObject) dmAux);CHKERRQ(ierr);
839c4762a1bSJed Brown   ierr = DMSetCoordinateDM(dmAux, coordDM);CHKERRQ(ierr);
840c4762a1bSJed Brown   ierr = DMSetField(dmAux, 0, NULL, (PetscObject) feAux);CHKERRQ(ierr);
841c4762a1bSJed Brown   ierr = DMCreateDS(dmAux);CHKERRQ(ierr);
842c4762a1bSJed Brown   if (user->fieldBC) {ierr = SetupBC(dm, dmAux, user);CHKERRQ(ierr);}
843c4762a1bSJed Brown   else               {ierr = SetupMaterial(dm, dmAux, user);CHKERRQ(ierr);}
844c4762a1bSJed Brown   ierr = DMDestroy(&dmAux);CHKERRQ(ierr);
845c4762a1bSJed Brown   PetscFunctionReturn(0);
846c4762a1bSJed Brown }
847c4762a1bSJed Brown 
848c4762a1bSJed Brown static PetscErrorCode SetupDiscretization(DM dm, AppCtx *user)
849c4762a1bSJed Brown {
850c4762a1bSJed Brown   DM             cdm = dm;
851c4762a1bSJed Brown   const PetscInt dim = user->dim;
852c4762a1bSJed Brown   PetscFE        fe, feAux = NULL;
853c4762a1bSJed Brown   PetscBool      simplex   = user->simplex;
854c4762a1bSJed Brown   MPI_Comm       comm;
855c4762a1bSJed Brown   PetscErrorCode ierr;
856c4762a1bSJed Brown 
857c4762a1bSJed Brown   PetscFunctionBeginUser;
858c4762a1bSJed Brown   /* Create finite element for each field and auxiliary field */
859c4762a1bSJed Brown   ierr = PetscObjectGetComm((PetscObject) dm, &comm);CHKERRQ(ierr);
860c4762a1bSJed Brown   ierr = PetscFECreateDefault(comm, dim, 1, simplex, NULL, -1, &fe);CHKERRQ(ierr);
861c4762a1bSJed Brown   ierr = PetscObjectSetName((PetscObject) fe, "potential");CHKERRQ(ierr);
862d6837840SMatthew G. Knepley   if (user->variableCoefficient == COEFF_FIELD || user->variableCoefficient == COEFF_CHECKERBOARD_0) {
863c4762a1bSJed Brown     ierr = PetscFECreateDefault(comm, dim, 1, simplex, "mat_", -1, &feAux);CHKERRQ(ierr);
864d6837840SMatthew G. Knepley     ierr = PetscObjectSetName((PetscObject) feAux, "coefficient");CHKERRQ(ierr);
865c4762a1bSJed Brown     ierr = PetscFECopyQuadrature(fe, feAux);CHKERRQ(ierr);
866c4762a1bSJed Brown   } else if (user->fieldBC) {
867c4762a1bSJed Brown     ierr = PetscFECreateDefault(comm, dim, 1, simplex, "bc_", -1, &feAux);CHKERRQ(ierr);
868c4762a1bSJed Brown     ierr = PetscFECopyQuadrature(fe, feAux);CHKERRQ(ierr);
869c4762a1bSJed Brown   }
870c4762a1bSJed Brown   /* Set discretization and boundary conditions for each mesh */
871c4762a1bSJed Brown   ierr = DMSetField(dm, 0, NULL, (PetscObject) fe);CHKERRQ(ierr);
872c4762a1bSJed Brown   ierr = DMCreateDS(dm);CHKERRQ(ierr);
873c4762a1bSJed Brown   ierr = SetupProblem(dm, user);CHKERRQ(ierr);
874c4762a1bSJed Brown   while (cdm) {
875c4762a1bSJed Brown     ierr = SetupAuxDM(cdm, feAux, user);CHKERRQ(ierr);
876c4762a1bSJed Brown     if (user->bcType == DIRICHLET && user->interpolate) {
877c4762a1bSJed Brown       PetscBool hasLabel;
878c4762a1bSJed Brown 
879c4762a1bSJed Brown       ierr = DMHasLabel(cdm, "marker", &hasLabel);CHKERRQ(ierr);
880c4762a1bSJed Brown       if (!hasLabel) {ierr = CreateBCLabel(cdm, "marker");CHKERRQ(ierr);}
881c4762a1bSJed Brown     }
882408cafa0SMatthew G. Knepley     ierr = DMCopyDisc(dm, cdm);CHKERRQ(ierr);
883c4762a1bSJed Brown     ierr = DMGetCoarseDM(cdm, &cdm);CHKERRQ(ierr);
884c4762a1bSJed Brown   }
885c4762a1bSJed Brown   ierr = PetscFEDestroy(&fe);CHKERRQ(ierr);
886c4762a1bSJed Brown   ierr = PetscFEDestroy(&feAux);CHKERRQ(ierr);
887c4762a1bSJed Brown   PetscFunctionReturn(0);
888c4762a1bSJed Brown }
889c4762a1bSJed Brown 
890c4762a1bSJed Brown #include "petsc/private/petscimpl.h"
891c4762a1bSJed Brown 
892c4762a1bSJed Brown /*@C
893c4762a1bSJed Brown   KSPMonitorError - Outputs the error at each iteration of an iterative solver.
894c4762a1bSJed Brown 
895c4762a1bSJed Brown   Collective on KSP
896c4762a1bSJed Brown 
897c4762a1bSJed Brown   Input Parameters:
898c4762a1bSJed Brown + ksp   - the KSP
899c4762a1bSJed Brown . its   - iteration number
900c4762a1bSJed Brown . rnorm - 2-norm, preconditioned residual value (may be estimated).
901c4762a1bSJed Brown - ctx   - monitor context
902c4762a1bSJed Brown 
903c4762a1bSJed Brown   Level: intermediate
904c4762a1bSJed Brown 
905c4762a1bSJed Brown .seealso: KSPMonitorSet(), KSPMonitorTrueResidualNorm(), KSPMonitorDefault()
906c4762a1bSJed Brown @*/
907c4762a1bSJed Brown static PetscErrorCode KSPMonitorError(KSP ksp, PetscInt its, PetscReal rnorm, void *ctx)
908c4762a1bSJed Brown {
909c4762a1bSJed Brown   AppCtx        *user = (AppCtx *) ctx;
910c4762a1bSJed Brown   DM             dm;
911c4762a1bSJed Brown   Vec            du = NULL, r;
912c4762a1bSJed Brown   PetscInt       level = 0;
913c4762a1bSJed Brown   PetscBool      hasLevel;
914c4762a1bSJed Brown #if defined(PETSC_HAVE_HDF5)
915c4762a1bSJed Brown   PetscViewer    viewer;
916c4762a1bSJed Brown   char           buf[256];
917c4762a1bSJed Brown #endif
918c4762a1bSJed Brown   PetscErrorCode ierr;
919c4762a1bSJed Brown 
920c4762a1bSJed Brown   PetscFunctionBegin;
921c4762a1bSJed Brown   ierr = KSPGetDM(ksp, &dm);CHKERRQ(ierr);
922c4762a1bSJed Brown   /* Calculate solution */
923c4762a1bSJed Brown   {
924c4762a1bSJed Brown     PC        pc = user->pcmg; /* The MG PC */
925c4762a1bSJed Brown     DM        fdm = NULL,  cdm = NULL;
926c4762a1bSJed Brown     KSP       fksp, cksp;
927c4762a1bSJed Brown     Vec       fu,   cu = NULL;
928c4762a1bSJed Brown     PetscInt  levels, l;
929c4762a1bSJed Brown 
930c4762a1bSJed Brown     ierr = KSPBuildSolution(ksp, NULL, &du);CHKERRQ(ierr);
931c4762a1bSJed Brown     ierr = PetscObjectComposedDataGetInt((PetscObject) ksp, PetscMGLevelId, level, hasLevel);CHKERRQ(ierr);
932c4762a1bSJed Brown     ierr = PCMGGetLevels(pc, &levels);CHKERRQ(ierr);
933c4762a1bSJed Brown     ierr = PCMGGetSmoother(pc, levels-1, &fksp);CHKERRQ(ierr);
934c4762a1bSJed Brown     ierr = KSPBuildSolution(fksp, NULL, &fu);CHKERRQ(ierr);
935c4762a1bSJed Brown     for (l = levels-1; l > level; --l) {
936c4762a1bSJed Brown       Mat R;
937c4762a1bSJed Brown       Vec s;
938c4762a1bSJed Brown 
939c4762a1bSJed Brown       ierr = PCMGGetSmoother(pc, l-1, &cksp);CHKERRQ(ierr);
940c4762a1bSJed Brown       ierr = KSPGetDM(cksp, &cdm);CHKERRQ(ierr);
941c4762a1bSJed Brown       ierr = DMGetGlobalVector(cdm, &cu);CHKERRQ(ierr);
942c4762a1bSJed Brown       ierr = PCMGGetRestriction(pc, l, &R);CHKERRQ(ierr);
943c4762a1bSJed Brown       ierr = PCMGGetRScale(pc, l, &s);CHKERRQ(ierr);
944c4762a1bSJed Brown       ierr = MatRestrict(R, fu, cu);CHKERRQ(ierr);
945c4762a1bSJed Brown       ierr = VecPointwiseMult(cu, cu, s);CHKERRQ(ierr);
946c4762a1bSJed Brown       if (l < levels-1) {ierr = DMRestoreGlobalVector(fdm, &fu);CHKERRQ(ierr);}
947c4762a1bSJed Brown       fdm  = cdm;
948c4762a1bSJed Brown       fu   = cu;
949c4762a1bSJed Brown     }
950c4762a1bSJed Brown     if (levels-1 > level) {
951c4762a1bSJed Brown       ierr = VecAXPY(du, 1.0, cu);CHKERRQ(ierr);
952c4762a1bSJed Brown       ierr = DMRestoreGlobalVector(cdm, &cu);CHKERRQ(ierr);
953c4762a1bSJed Brown     }
954c4762a1bSJed Brown   }
955c4762a1bSJed Brown   /* Calculate error */
956c4762a1bSJed Brown   ierr = DMGetGlobalVector(dm, &r);CHKERRQ(ierr);
957c4762a1bSJed Brown   ierr = DMProjectFunction(dm, 0.0, user->exactFuncs, NULL, INSERT_ALL_VALUES, r);CHKERRQ(ierr);
958c4762a1bSJed Brown   ierr = VecAXPY(r,-1.0,du);CHKERRQ(ierr);
959c4762a1bSJed Brown   ierr = PetscObjectSetName((PetscObject) r, "solution error");CHKERRQ(ierr);
960c4762a1bSJed Brown   /* View error */
961c4762a1bSJed Brown #if defined(PETSC_HAVE_HDF5)
962c4762a1bSJed Brown   ierr = PetscSNPrintf(buf, 256, "ex12-%D.h5", level);CHKERRQ(ierr);
963c4762a1bSJed Brown   ierr = PetscViewerHDF5Open(PETSC_COMM_WORLD, buf, FILE_MODE_APPEND, &viewer);CHKERRQ(ierr);
964c4762a1bSJed Brown   ierr = VecView(r, viewer);CHKERRQ(ierr);
965c4762a1bSJed Brown   ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
966c4762a1bSJed Brown #endif
967c4762a1bSJed Brown   ierr = DMRestoreGlobalVector(dm, &r);CHKERRQ(ierr);
968c4762a1bSJed Brown   PetscFunctionReturn(0);
969c4762a1bSJed Brown }
970c4762a1bSJed Brown 
971c4762a1bSJed Brown /*@C
972c4762a1bSJed Brown   SNESMonitorError - Outputs the error at each iteration of an iterative solver.
973c4762a1bSJed Brown 
974c4762a1bSJed Brown   Collective on SNES
975c4762a1bSJed Brown 
976c4762a1bSJed Brown   Input Parameters:
977c4762a1bSJed Brown + snes  - the SNES
978c4762a1bSJed Brown . its   - iteration number
979c4762a1bSJed Brown . rnorm - 2-norm of residual
980c4762a1bSJed Brown - ctx   - user context
981c4762a1bSJed Brown 
982c4762a1bSJed Brown   Level: intermediate
983c4762a1bSJed Brown 
984c4762a1bSJed Brown .seealso: SNESMonitorDefault(), SNESMonitorSet(), SNESMonitorSolution()
985c4762a1bSJed Brown @*/
986c4762a1bSJed Brown static PetscErrorCode SNESMonitorError(SNES snes, PetscInt its, PetscReal rnorm, void *ctx)
987c4762a1bSJed Brown {
988c4762a1bSJed Brown   AppCtx        *user = (AppCtx *) ctx;
989c4762a1bSJed Brown   DM             dm;
990c4762a1bSJed Brown   Vec            u, r;
991c4762a1bSJed Brown   PetscInt       level = -1;
992c4762a1bSJed Brown   PetscBool      hasLevel;
993c4762a1bSJed Brown #if defined(PETSC_HAVE_HDF5)
994c4762a1bSJed Brown   PetscViewer    viewer;
995c4762a1bSJed Brown #endif
996c4762a1bSJed Brown   char           buf[256];
997c4762a1bSJed Brown   PetscErrorCode ierr;
998c4762a1bSJed Brown 
999c4762a1bSJed Brown   PetscFunctionBegin;
1000c4762a1bSJed Brown   ierr = SNESGetDM(snes, &dm);CHKERRQ(ierr);
1001c4762a1bSJed Brown   /* Calculate error */
1002c4762a1bSJed Brown   ierr = SNESGetSolution(snes, &u);CHKERRQ(ierr);
1003c4762a1bSJed Brown   ierr = DMGetGlobalVector(dm, &r);CHKERRQ(ierr);
1004c4762a1bSJed Brown   ierr = PetscObjectSetName((PetscObject) r, "solution error");CHKERRQ(ierr);
1005c4762a1bSJed Brown   ierr = DMProjectFunction(dm, 0.0, user->exactFuncs, NULL, INSERT_ALL_VALUES, r);CHKERRQ(ierr);
1006c4762a1bSJed Brown   ierr = VecAXPY(r, -1.0, u);CHKERRQ(ierr);
1007c4762a1bSJed Brown   /* View error */
1008c4762a1bSJed Brown   ierr = PetscObjectComposedDataGetInt((PetscObject) snes, PetscMGLevelId, level, hasLevel);CHKERRQ(ierr);
1009c4762a1bSJed Brown   ierr = PetscSNPrintf(buf, 256, "ex12-%D.h5", level);CHKERRQ(ierr);
1010c4762a1bSJed Brown #if defined(PETSC_HAVE_HDF5)
1011c4762a1bSJed Brown   ierr = PetscViewerHDF5Open(PETSC_COMM_WORLD, buf, FILE_MODE_APPEND, &viewer);CHKERRQ(ierr);
1012c4762a1bSJed Brown   ierr = VecView(r, viewer);CHKERRQ(ierr);
1013c4762a1bSJed Brown   ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
1014c4762a1bSJed Brown   /* Cleanup */
1015c4762a1bSJed Brown   ierr = DMRestoreGlobalVector(dm, &r);CHKERRQ(ierr);
1016c4762a1bSJed Brown   PetscFunctionReturn(0);
1017c4762a1bSJed Brown #else
1018c4762a1bSJed Brown   SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_SUP,"You need to configure with --download-hdf5");
1019c4762a1bSJed Brown #endif
1020c4762a1bSJed Brown }
1021c4762a1bSJed Brown 
1022c4762a1bSJed Brown int main(int argc, char **argv)
1023c4762a1bSJed Brown {
1024c4762a1bSJed Brown   DM             dm;          /* Problem specification */
1025c4762a1bSJed Brown   SNES           snes;        /* nonlinear solver */
1026c4762a1bSJed Brown   Vec            u;           /* solution vector */
1027c4762a1bSJed Brown   Mat            A,J;         /* Jacobian matrix */
1028c4762a1bSJed Brown   MatNullSpace   nullSpace;   /* May be necessary for Neumann conditions */
1029c4762a1bSJed Brown   AppCtx         user;        /* user-defined work context */
1030c4762a1bSJed Brown   JacActionCtx   userJ;       /* context for Jacobian MF action */
1031c4762a1bSJed Brown   PetscReal      error = 0.0; /* L_2 error in the solution */
1032c4762a1bSJed Brown   PetscBool      isFAS;
1033c4762a1bSJed Brown   PetscErrorCode ierr;
1034c4762a1bSJed Brown 
1035c4762a1bSJed Brown   ierr = PetscInitialize(&argc, &argv, NULL,help);if (ierr) return ierr;
1036c4762a1bSJed Brown   ierr = ProcessOptions(PETSC_COMM_WORLD, &user);CHKERRQ(ierr);
1037c4762a1bSJed Brown   ierr = SNESCreate(PETSC_COMM_WORLD, &snes);CHKERRQ(ierr);
1038c4762a1bSJed Brown   ierr = CreateMesh(PETSC_COMM_WORLD, &user, &dm);CHKERRQ(ierr);
1039c4762a1bSJed Brown   ierr = SNESSetDM(snes, dm);CHKERRQ(ierr);
1040c4762a1bSJed Brown   ierr = DMSetApplicationContext(dm, &user);CHKERRQ(ierr);
1041c4762a1bSJed Brown 
1042c4762a1bSJed Brown   ierr = PetscMalloc2(1, &user.exactFuncs, 1, &user.exactFields);CHKERRQ(ierr);
1043c4762a1bSJed Brown   ierr = SetupDiscretization(dm, &user);CHKERRQ(ierr);
1044c4762a1bSJed Brown 
1045c4762a1bSJed Brown   ierr = DMCreateGlobalVector(dm, &u);CHKERRQ(ierr);
1046c4762a1bSJed Brown   ierr = PetscObjectSetName((PetscObject) u, "potential");CHKERRQ(ierr);
1047c4762a1bSJed Brown 
1048c4762a1bSJed Brown   ierr = DMCreateMatrix(dm, &J);CHKERRQ(ierr);
1049c4762a1bSJed Brown   if (user.jacobianMF) {
1050c4762a1bSJed Brown     PetscInt M, m, N, n;
1051c4762a1bSJed Brown 
1052c4762a1bSJed Brown     ierr = MatGetSize(J, &M, &N);CHKERRQ(ierr);
1053c4762a1bSJed Brown     ierr = MatGetLocalSize(J, &m, &n);CHKERRQ(ierr);
1054c4762a1bSJed Brown     ierr = MatCreate(PETSC_COMM_WORLD, &A);CHKERRQ(ierr);
1055c4762a1bSJed Brown     ierr = MatSetSizes(A, m, n, M, N);CHKERRQ(ierr);
1056c4762a1bSJed Brown     ierr = MatSetType(A, MATSHELL);CHKERRQ(ierr);
1057c4762a1bSJed Brown     ierr = MatSetUp(A);CHKERRQ(ierr);
1058c4762a1bSJed Brown #if 0
1059c4762a1bSJed Brown     ierr = MatShellSetOperation(A, MATOP_MULT, (void (*)(void))FormJacobianAction);CHKERRQ(ierr);
1060c4762a1bSJed Brown #endif
1061c4762a1bSJed Brown 
1062c4762a1bSJed Brown     userJ.dm   = dm;
1063c4762a1bSJed Brown     userJ.J    = J;
1064c4762a1bSJed Brown     userJ.user = &user;
1065c4762a1bSJed Brown 
1066c4762a1bSJed Brown     ierr = DMCreateLocalVector(dm, &userJ.u);CHKERRQ(ierr);
1067c4762a1bSJed Brown     if (user.fieldBC) {ierr = DMProjectFieldLocal(dm, 0.0, userJ.u, user.exactFields, INSERT_BC_VALUES, userJ.u);CHKERRQ(ierr);}
1068c4762a1bSJed Brown     else              {ierr = DMProjectFunctionLocal(dm, 0.0, user.exactFuncs, NULL, INSERT_BC_VALUES, userJ.u);CHKERRQ(ierr);}
1069c4762a1bSJed Brown     ierr = MatShellSetContext(A, &userJ);CHKERRQ(ierr);
1070c4762a1bSJed Brown   } else {
1071c4762a1bSJed Brown     A = J;
1072c4762a1bSJed Brown   }
1073c4762a1bSJed Brown 
1074c4762a1bSJed Brown   nullSpace = NULL;
1075c4762a1bSJed Brown   if (user.bcType != DIRICHLET) {
1076c4762a1bSJed Brown     ierr = MatNullSpaceCreate(PetscObjectComm((PetscObject) dm), PETSC_TRUE, 0, NULL, &nullSpace);CHKERRQ(ierr);
1077c4762a1bSJed Brown     ierr = MatSetNullSpace(A, nullSpace);CHKERRQ(ierr);
1078c4762a1bSJed Brown   }
1079c4762a1bSJed Brown 
1080c4762a1bSJed Brown   ierr = DMPlexSetSNESLocalFEM(dm,&user,&user,&user);CHKERRQ(ierr);
1081c4762a1bSJed Brown   ierr = SNESSetJacobian(snes, A, J, NULL, NULL);CHKERRQ(ierr);
1082c4762a1bSJed Brown 
1083c4762a1bSJed Brown   ierr = SNESSetFromOptions(snes);CHKERRQ(ierr);
1084c4762a1bSJed Brown 
1085c4762a1bSJed Brown   if (user.fieldBC) {ierr = DMProjectField(dm, 0.0, u, user.exactFields, INSERT_ALL_VALUES, u);CHKERRQ(ierr);}
1086c4762a1bSJed Brown   else              {ierr = DMProjectFunction(dm, 0.0, user.exactFuncs, NULL, INSERT_ALL_VALUES, u);CHKERRQ(ierr);}
1087c4762a1bSJed Brown   if (user.restart) {
1088c4762a1bSJed Brown #if defined(PETSC_HAVE_HDF5)
1089c4762a1bSJed Brown     PetscViewer viewer;
1090c4762a1bSJed Brown 
1091c4762a1bSJed Brown     ierr = PetscViewerCreate(PETSC_COMM_WORLD, &viewer);CHKERRQ(ierr);
1092c4762a1bSJed Brown     ierr = PetscViewerSetType(viewer, PETSCVIEWERHDF5);CHKERRQ(ierr);
1093c4762a1bSJed Brown     ierr = PetscViewerFileSetMode(viewer, FILE_MODE_READ);CHKERRQ(ierr);
1094c4762a1bSJed Brown     ierr = PetscViewerFileSetName(viewer, user.filename);CHKERRQ(ierr);
1095c4762a1bSJed Brown     ierr = PetscViewerHDF5PushGroup(viewer, "/fields");CHKERRQ(ierr);
1096c4762a1bSJed Brown     ierr = VecLoad(u, viewer);CHKERRQ(ierr);
1097c4762a1bSJed Brown     ierr = PetscViewerHDF5PopGroup(viewer);CHKERRQ(ierr);
1098c4762a1bSJed Brown     ierr = PetscViewerDestroy(&viewer);CHKERRQ(ierr);
1099c4762a1bSJed Brown #endif
1100c4762a1bSJed Brown   }
1101c4762a1bSJed Brown   if (user.showInitial) {
1102c4762a1bSJed Brown     Vec lv;
1103c4762a1bSJed Brown     ierr = DMGetLocalVector(dm, &lv);CHKERRQ(ierr);
1104c4762a1bSJed Brown     ierr = DMGlobalToLocalBegin(dm, u, INSERT_VALUES, lv);CHKERRQ(ierr);
1105c4762a1bSJed Brown     ierr = DMGlobalToLocalEnd(dm, u, INSERT_VALUES, lv);CHKERRQ(ierr);
1106c4762a1bSJed Brown     ierr = DMPrintLocalVec(dm, "Local function", 1.0e-10, lv);CHKERRQ(ierr);
1107c4762a1bSJed Brown     ierr = DMRestoreLocalVector(dm, &lv);CHKERRQ(ierr);
1108c4762a1bSJed Brown   }
1109c4762a1bSJed Brown   if (user.viewHierarchy) {
1110c4762a1bSJed Brown     SNES      lsnes;
1111c4762a1bSJed Brown     KSP       ksp;
1112c4762a1bSJed Brown     PC        pc;
1113c4762a1bSJed Brown     PetscInt  numLevels, l;
1114c4762a1bSJed Brown     PetscBool isMG;
1115c4762a1bSJed Brown 
1116c4762a1bSJed Brown     ierr = PetscObjectTypeCompare((PetscObject) snes, SNESFAS, &isFAS);CHKERRQ(ierr);
1117c4762a1bSJed Brown     if (isFAS) {
1118c4762a1bSJed Brown       ierr = SNESFASGetLevels(snes, &numLevels);CHKERRQ(ierr);
1119c4762a1bSJed Brown       for (l = 0; l < numLevels; ++l) {
1120c4762a1bSJed Brown         ierr = SNESFASGetCycleSNES(snes, l, &lsnes);CHKERRQ(ierr);
1121c4762a1bSJed Brown         ierr = SNESMonitorSet(lsnes, SNESMonitorError, &user, NULL);CHKERRQ(ierr);
1122c4762a1bSJed Brown       }
1123c4762a1bSJed Brown     } else {
1124c4762a1bSJed Brown       ierr = SNESGetKSP(snes, &ksp);CHKERRQ(ierr);
1125c4762a1bSJed Brown       ierr = KSPGetPC(ksp, &pc);CHKERRQ(ierr);
1126c4762a1bSJed Brown       ierr = PetscObjectTypeCompare((PetscObject) pc, PCMG, &isMG);CHKERRQ(ierr);
1127c4762a1bSJed Brown       if (isMG) {
1128c4762a1bSJed Brown         user.pcmg = pc;
1129c4762a1bSJed Brown         ierr = PCMGGetLevels(pc, &numLevels);CHKERRQ(ierr);
1130c4762a1bSJed Brown         for (l = 0; l < numLevels; ++l) {
1131c4762a1bSJed Brown           ierr = PCMGGetSmootherDown(pc, l, &ksp);CHKERRQ(ierr);
1132c4762a1bSJed Brown           ierr = KSPMonitorSet(ksp, KSPMonitorError, &user, NULL);CHKERRQ(ierr);
1133c4762a1bSJed Brown         }
1134c4762a1bSJed Brown       }
1135c4762a1bSJed Brown     }
1136c4762a1bSJed Brown   }
1137c4762a1bSJed Brown   if (user.runType == RUN_FULL || user.runType == RUN_EXACT) {
1138c4762a1bSJed Brown     PetscErrorCode (*initialGuess[1])(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt Nc, PetscScalar u[], void *ctx) = {zero};
1139c4762a1bSJed Brown 
1140c4762a1bSJed Brown     if (user.nonzInit) initialGuess[0] = ecks;
1141c4762a1bSJed Brown     if (user.runType == RUN_FULL) {
1142c4762a1bSJed Brown       ierr = DMProjectFunction(dm, 0.0, initialGuess, NULL, INSERT_VALUES, u);CHKERRQ(ierr);
1143c4762a1bSJed Brown     }
1144c4762a1bSJed Brown     if (user.debug) {
1145c4762a1bSJed Brown       ierr = PetscPrintf(PETSC_COMM_WORLD, "Initial guess\n");CHKERRQ(ierr);
1146c4762a1bSJed Brown       ierr = VecView(u, PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
1147c4762a1bSJed Brown     }
1148c4762a1bSJed Brown     ierr = VecViewFromOptions(u, NULL, "-guess_vec_view");CHKERRQ(ierr);
1149c4762a1bSJed Brown     ierr = SNESSolve(snes, NULL, u);CHKERRQ(ierr);
1150c4762a1bSJed Brown     ierr = SNESGetSolution(snes, &u);CHKERRQ(ierr);
1151c4762a1bSJed Brown     ierr = SNESGetDM(snes, &dm);CHKERRQ(ierr);
1152c4762a1bSJed Brown 
1153c4762a1bSJed Brown     if (user.showSolution) {
1154c4762a1bSJed Brown       ierr = PetscPrintf(PETSC_COMM_WORLD, "Solution\n");CHKERRQ(ierr);
1155c4762a1bSJed Brown       ierr = VecChop(u, 3.0e-9);CHKERRQ(ierr);
1156c4762a1bSJed Brown       ierr = VecView(u, PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);
1157c4762a1bSJed Brown     }
1158c4762a1bSJed Brown   } else if (user.runType == RUN_PERF) {
1159c4762a1bSJed Brown     Vec       r;
1160c4762a1bSJed Brown     PetscReal res = 0.0;
1161c4762a1bSJed Brown 
1162c4762a1bSJed Brown     ierr = SNESGetFunction(snes, &r, NULL, NULL);CHKERRQ(ierr);
1163c4762a1bSJed Brown     ierr = SNESComputeFunction(snes, u, r);CHKERRQ(ierr);
1164c4762a1bSJed Brown     ierr = PetscPrintf(PETSC_COMM_WORLD, "Initial Residual\n");CHKERRQ(ierr);
1165c4762a1bSJed Brown     ierr = VecChop(r, 1.0e-10);CHKERRQ(ierr);
1166c4762a1bSJed Brown     ierr = VecNorm(r, NORM_2, &res);CHKERRQ(ierr);
1167c4762a1bSJed Brown     ierr = PetscPrintf(PETSC_COMM_WORLD, "L_2 Residual: %g\n", (double)res);CHKERRQ(ierr);
1168c4762a1bSJed Brown   } else {
1169c4762a1bSJed Brown     Vec       r;
1170c4762a1bSJed Brown     PetscReal res = 0.0, tol = 1.0e-11;
1171c4762a1bSJed Brown 
1172c4762a1bSJed Brown     /* Check discretization error */
1173c4762a1bSJed Brown     ierr = SNESGetFunction(snes, &r, NULL, NULL);CHKERRQ(ierr);
1174c4762a1bSJed Brown     ierr = PetscPrintf(PETSC_COMM_WORLD, "Initial guess\n");CHKERRQ(ierr);
1175c4762a1bSJed Brown     if (!user.quiet) {ierr = VecView(u, PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);}
1176c4762a1bSJed Brown     ierr = DMComputeL2Diff(dm, 0.0, user.exactFuncs, NULL, u, &error);CHKERRQ(ierr);
1177c4762a1bSJed Brown     if (error < tol) {ierr = PetscPrintf(PETSC_COMM_WORLD, "L_2 Error: < %2.1e\n", (double)tol);CHKERRQ(ierr);}
1178c4762a1bSJed Brown     else             {ierr = PetscPrintf(PETSC_COMM_WORLD, "L_2 Error: %g\n", (double)error);CHKERRQ(ierr);}
1179c4762a1bSJed Brown     /* Check residual */
1180c4762a1bSJed Brown     ierr = SNESComputeFunction(snes, u, r);CHKERRQ(ierr);
1181c4762a1bSJed Brown     ierr = PetscPrintf(PETSC_COMM_WORLD, "Initial Residual\n");CHKERRQ(ierr);
1182c4762a1bSJed Brown     ierr = VecChop(r, 1.0e-10);CHKERRQ(ierr);
1183c4762a1bSJed Brown     if (!user.quiet) {ierr = VecView(r, PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);}
1184c4762a1bSJed Brown     ierr = VecNorm(r, NORM_2, &res);CHKERRQ(ierr);
1185c4762a1bSJed Brown     ierr = PetscPrintf(PETSC_COMM_WORLD, "L_2 Residual: %g\n", (double)res);CHKERRQ(ierr);
1186c4762a1bSJed Brown     /* Check Jacobian */
1187c4762a1bSJed Brown     {
1188c4762a1bSJed Brown       Vec b;
1189c4762a1bSJed Brown 
1190c4762a1bSJed Brown       ierr = SNESComputeJacobian(snes, u, A, A);CHKERRQ(ierr);
1191c4762a1bSJed Brown       ierr = VecDuplicate(u, &b);CHKERRQ(ierr);
1192c4762a1bSJed Brown       ierr = VecSet(r, 0.0);CHKERRQ(ierr);
1193c4762a1bSJed Brown       ierr = SNESComputeFunction(snes, r, b);CHKERRQ(ierr);
1194c4762a1bSJed Brown       ierr = MatMult(A, u, r);CHKERRQ(ierr);
1195c4762a1bSJed Brown       ierr = VecAXPY(r, 1.0, b);CHKERRQ(ierr);
1196c4762a1bSJed Brown       ierr = PetscPrintf(PETSC_COMM_WORLD, "Au - b = Au + F(0)\n");CHKERRQ(ierr);
1197c4762a1bSJed Brown       ierr = VecChop(r, 1.0e-10);CHKERRQ(ierr);
1198c4762a1bSJed Brown       if (!user.quiet) {ierr = VecView(r, PETSC_VIEWER_STDOUT_WORLD);CHKERRQ(ierr);}
1199c4762a1bSJed Brown       ierr = VecNorm(r, NORM_2, &res);CHKERRQ(ierr);
1200c4762a1bSJed Brown       ierr = PetscPrintf(PETSC_COMM_WORLD, "Linear L_2 Residual: %g\n", (double)res);CHKERRQ(ierr);
1201c4762a1bSJed Brown       /* check solver */
1202c4762a1bSJed Brown       if (user.checkksp) {
1203c4762a1bSJed Brown         KSP ksp;
1204c4762a1bSJed Brown 
1205c4762a1bSJed Brown         if (nullSpace) {
1206c4762a1bSJed Brown           ierr = MatNullSpaceRemove(nullSpace, u);CHKERRQ(ierr);
1207c4762a1bSJed Brown         }
1208c4762a1bSJed Brown         ierr = SNESComputeJacobian(snes, u, A, J);CHKERRQ(ierr);
1209c4762a1bSJed Brown         ierr = MatMult(A, u, b);CHKERRQ(ierr);
1210c4762a1bSJed Brown         ierr = SNESGetKSP(snes, &ksp);CHKERRQ(ierr);
1211c4762a1bSJed Brown         ierr = KSPSetOperators(ksp, A, J);CHKERRQ(ierr);
1212c4762a1bSJed Brown         ierr = KSPSolve(ksp, b, r);CHKERRQ(ierr);
1213c4762a1bSJed Brown         ierr = VecAXPY(r, -1.0, u);CHKERRQ(ierr);
1214c4762a1bSJed Brown         ierr = VecNorm(r, NORM_2, &res);CHKERRQ(ierr);
1215c4762a1bSJed Brown         ierr = PetscPrintf(PETSC_COMM_WORLD, "KSP Error: %g\n", (double)res);CHKERRQ(ierr);
1216c4762a1bSJed Brown       }
1217c4762a1bSJed Brown       ierr = VecDestroy(&b);CHKERRQ(ierr);
1218c4762a1bSJed Brown     }
1219c4762a1bSJed Brown   }
1220c4762a1bSJed Brown   ierr = VecViewFromOptions(u, NULL, "-vec_view");CHKERRQ(ierr);
1221d6837840SMatthew G. Knepley   {
1222d6837840SMatthew G. Knepley     Vec nu;
1223d6837840SMatthew G. Knepley 
1224d6837840SMatthew G. Knepley     ierr = PetscObjectQuery((PetscObject) dm, "A", (PetscObject *) &nu);CHKERRQ(ierr);
1225d6837840SMatthew G. Knepley     if (nu) {ierr = VecViewFromOptions(nu, NULL, "-coeff_view");CHKERRQ(ierr);}
1226d6837840SMatthew G. Knepley   }
1227c4762a1bSJed Brown 
1228c4762a1bSJed Brown   if (user.bdIntegral) {
1229c4762a1bSJed Brown     DMLabel   label;
1230c4762a1bSJed Brown     PetscInt  id = 1;
1231c4762a1bSJed Brown     PetscScalar bdInt = 0.0;
1232c4762a1bSJed Brown     PetscReal   exact = 3.3333333333;
1233c4762a1bSJed Brown 
1234c4762a1bSJed Brown     ierr = DMGetLabel(dm, "marker", &label);CHKERRQ(ierr);
1235c4762a1bSJed Brown     ierr = DMPlexComputeBdIntegral(dm, u, label, 1, &id, bd_integral_2d, &bdInt, NULL);CHKERRQ(ierr);
1236c4762a1bSJed Brown     ierr = PetscPrintf(PETSC_COMM_WORLD, "Solution boundary integral: %.4g\n", (double) PetscAbsScalar(bdInt));CHKERRQ(ierr);
1237c4762a1bSJed Brown     if (PetscAbsReal(PetscAbsScalar(bdInt) - exact) > PETSC_SQRT_MACHINE_EPSILON) SETERRQ2(PETSC_COMM_WORLD, PETSC_ERR_PLIB, "Invalid boundary integral %g != %g", (double) PetscAbsScalar(bdInt), (double)exact);
1238c4762a1bSJed Brown   }
1239c4762a1bSJed Brown 
1240c4762a1bSJed Brown   ierr = MatNullSpaceDestroy(&nullSpace);CHKERRQ(ierr);
1241c4762a1bSJed Brown   if (user.jacobianMF) {ierr = VecDestroy(&userJ.u);CHKERRQ(ierr);}
1242c4762a1bSJed Brown   if (A != J) {ierr = MatDestroy(&A);CHKERRQ(ierr);}
1243c4762a1bSJed Brown   ierr = MatDestroy(&J);CHKERRQ(ierr);
1244c4762a1bSJed Brown   ierr = VecDestroy(&u);CHKERRQ(ierr);
1245c4762a1bSJed Brown   ierr = SNESDestroy(&snes);CHKERRQ(ierr);
1246c4762a1bSJed Brown   ierr = DMDestroy(&dm);CHKERRQ(ierr);
1247c4762a1bSJed Brown   ierr = PetscFree2(user.exactFuncs, user.exactFields);CHKERRQ(ierr);
1248d6837840SMatthew G. Knepley   ierr = PetscFree(user.kgrid);CHKERRQ(ierr);
1249c4762a1bSJed Brown   ierr = PetscFinalize();
1250c4762a1bSJed Brown   return ierr;
1251c4762a1bSJed Brown }
1252c4762a1bSJed Brown 
1253c4762a1bSJed Brown /*TEST
1254c4762a1bSJed Brown   # 2D serial P1 test 0-4
1255c4762a1bSJed Brown   test:
1256c4762a1bSJed Brown     suffix: 2d_p1_0
1257c4762a1bSJed Brown     requires: triangle
1258c4762a1bSJed Brown     args: -run_type test -refinement_limit 0.0    -bc_type dirichlet -interpolate 0 -petscspace_degree 1 -show_initial -dm_plex_print_fem 1
1259c4762a1bSJed Brown 
1260c4762a1bSJed Brown   test:
1261c4762a1bSJed Brown     suffix: 2d_p1_1
1262c4762a1bSJed Brown     requires: triangle
1263c4762a1bSJed Brown     args: -run_type test -refinement_limit 0.0    -bc_type dirichlet -interpolate 1 -petscspace_degree 1 -show_initial -dm_plex_print_fem 1
1264c4762a1bSJed Brown 
1265c4762a1bSJed Brown   test:
1266c4762a1bSJed Brown     suffix: 2d_p1_2
1267c4762a1bSJed Brown     requires: triangle
1268c4762a1bSJed Brown     args: -run_type test -refinement_limit 0.0625 -bc_type dirichlet -interpolate 1 -petscspace_degree 1 -show_initial -dm_plex_print_fem 1
1269c4762a1bSJed Brown 
1270c4762a1bSJed Brown   test:
1271c4762a1bSJed Brown     suffix: 2d_p1_neumann_0
1272c4762a1bSJed Brown     requires: triangle
1273c4762a1bSJed Brown     args: -run_type test -refinement_limit 0.0    -bc_type neumann   -interpolate 1 -petscspace_degree 1 -show_initial -dm_plex_print_fem 1 -dm_view ascii::ascii_info_detail
1274c4762a1bSJed Brown 
1275c4762a1bSJed Brown   test:
1276c4762a1bSJed Brown     suffix: 2d_p1_neumann_1
1277c4762a1bSJed Brown     requires: triangle
1278c4762a1bSJed Brown     args: -run_type test -refinement_limit 0.0625 -bc_type neumann   -interpolate 1 -petscspace_degree 1 -show_initial -dm_plex_print_fem 1
1279c4762a1bSJed Brown 
1280c4762a1bSJed Brown   # 2D serial P2 test 5-8
1281c4762a1bSJed Brown   test:
1282c4762a1bSJed Brown     suffix: 2d_p2_0
1283c4762a1bSJed Brown     requires: triangle
1284c4762a1bSJed Brown     args: -run_type test -refinement_limit 0.0    -bc_type dirichlet -interpolate 1 -petscspace_degree 2 -show_initial -dm_plex_print_fem 1
1285c4762a1bSJed Brown 
1286c4762a1bSJed Brown   test:
1287c4762a1bSJed Brown     suffix: 2d_p2_1
1288c4762a1bSJed Brown     requires: triangle
1289c4762a1bSJed Brown     args: -run_type test -refinement_limit 0.0625 -bc_type dirichlet -interpolate 1 -petscspace_degree 2 -show_initial -dm_plex_print_fem 1
1290c4762a1bSJed Brown 
1291c4762a1bSJed Brown   test:
1292c4762a1bSJed Brown     suffix: 2d_p2_neumann_0
1293c4762a1bSJed Brown     requires: triangle
1294c4762a1bSJed Brown     args: -run_type test -refinement_limit 0.0    -bc_type neumann   -interpolate 1 -petscspace_degree 2 -show_initial -dm_plex_print_fem 1 -dm_view ascii::ascii_info_detail
1295c4762a1bSJed Brown 
1296c4762a1bSJed Brown   test:
1297c4762a1bSJed Brown     suffix: 2d_p2_neumann_1
1298c4762a1bSJed Brown     requires: triangle
1299c4762a1bSJed Brown     args: -run_type test -refinement_limit 0.0625 -bc_type neumann   -interpolate 1 -petscspace_degree 2 -show_initial -dm_plex_print_fem 1 -dm_view ascii::ascii_info_detail
1300c4762a1bSJed Brown 
1301c4762a1bSJed Brown   test:
1302c4762a1bSJed Brown     suffix: bd_int_0
1303c4762a1bSJed Brown     requires: triangle
1304c4762a1bSJed Brown     args: -run_type test -bc_type dirichlet -interpolate 1 -petscspace_degree 2 -bd_integral -dm_view -quiet
1305c4762a1bSJed Brown 
1306c4762a1bSJed Brown   test:
1307c4762a1bSJed Brown     suffix: bd_int_1
1308c4762a1bSJed Brown     requires: triangle
1309c4762a1bSJed Brown     args: -run_type test -dm_refine 2 -bc_type dirichlet -interpolate 1 -petscspace_degree 2 -bd_integral -dm_view -quiet
1310c4762a1bSJed Brown 
1311c4762a1bSJed Brown   # 3D serial P1 test 9-12
1312c4762a1bSJed Brown   test:
1313c4762a1bSJed Brown     suffix: 3d_p1_0
1314c4762a1bSJed Brown     requires: ctetgen
1315c4762a1bSJed Brown     args: -run_type test -dim 3 -refinement_limit 0.0    -bc_type dirichlet -interpolate 0 -petscspace_degree 1 -show_initial -dm_plex_print_fem 1 -dm_view -cells 1,1,1
1316c4762a1bSJed Brown 
1317c4762a1bSJed Brown   test:
1318c4762a1bSJed Brown     suffix: 3d_p1_1
1319c4762a1bSJed Brown     requires: ctetgen
1320c4762a1bSJed Brown     args: -run_type test -dim 3 -refinement_limit 0.0    -bc_type dirichlet -interpolate 1 -petscspace_degree 1 -show_initial -dm_plex_print_fem 1 -dm_view -cells 1,1,1
1321c4762a1bSJed Brown 
1322c4762a1bSJed Brown   test:
1323c4762a1bSJed Brown     suffix: 3d_p1_2
1324c4762a1bSJed Brown     requires: ctetgen
1325c4762a1bSJed Brown     args: -run_type test -dim 3 -refinement_limit 0.0125 -bc_type dirichlet -interpolate 1 -petscspace_degree 1 -show_initial -dm_plex_print_fem 1 -dm_view -cells 1,1,1
1326c4762a1bSJed Brown 
1327c4762a1bSJed Brown   test:
1328c4762a1bSJed Brown     suffix: 3d_p1_neumann_0
1329c4762a1bSJed Brown     requires: ctetgen
1330c4762a1bSJed Brown     args: -run_type test -dim 3 -bc_type neumann   -interpolate 1 -petscspace_degree 1 -snes_fd -show_initial -dm_plex_print_fem 1 -dm_view -cells 1,1,1
1331c4762a1bSJed Brown 
1332c4762a1bSJed Brown   # Analytic variable coefficient 13-20
1333c4762a1bSJed Brown   test:
1334c4762a1bSJed Brown     suffix: 13
1335c4762a1bSJed Brown     requires: triangle
1336c4762a1bSJed Brown     args: -run_type test -refinement_limit 0.0    -variable_coefficient analytic -interpolate 1 -petscspace_degree 1 -show_initial -dm_plex_print_fem 1
1337c4762a1bSJed Brown   test:
1338c4762a1bSJed Brown     suffix: 14
1339c4762a1bSJed Brown     requires: triangle
1340c4762a1bSJed Brown     args: -run_type test -refinement_limit 0.0625 -variable_coefficient analytic -interpolate 1 -petscspace_degree 1 -show_initial -dm_plex_print_fem 1
1341c4762a1bSJed Brown   test:
1342c4762a1bSJed Brown     suffix: 15
1343c4762a1bSJed Brown     requires: triangle
1344c4762a1bSJed Brown     args: -run_type test -refinement_limit 0.0    -variable_coefficient analytic -interpolate 1 -petscspace_degree 2 -show_initial -dm_plex_print_fem 1
1345c4762a1bSJed Brown   test:
1346c4762a1bSJed Brown     suffix: 16
1347c4762a1bSJed Brown     requires: triangle
1348c4762a1bSJed Brown     args: -run_type test -refinement_limit 0.0625 -variable_coefficient analytic -interpolate 1 -petscspace_degree 2 -show_initial -dm_plex_print_fem 1
1349c4762a1bSJed Brown   test:
1350c4762a1bSJed Brown     suffix: 17
1351c4762a1bSJed Brown     requires: ctetgen
1352c4762a1bSJed Brown     args: -run_type test -dim 3 -refinement_limit 0.0    -variable_coefficient analytic -interpolate 1 -petscspace_degree 1 -show_initial -dm_plex_print_fem 1 -cells 1,1,1
1353c4762a1bSJed Brown 
1354c4762a1bSJed Brown   test:
1355c4762a1bSJed Brown     suffix: 18
1356c4762a1bSJed Brown     requires: ctetgen
1357c4762a1bSJed Brown     args: -run_type test -dim 3 -refinement_limit 0.0125 -variable_coefficient analytic -interpolate 1 -petscspace_degree 1 -show_initial -dm_plex_print_fem 1 -cells 1,1,1
1358c4762a1bSJed Brown 
1359c4762a1bSJed Brown   test:
1360c4762a1bSJed Brown     suffix: 19
1361c4762a1bSJed Brown     requires: ctetgen
1362c4762a1bSJed Brown     args: -run_type test -dim 3 -refinement_limit 0.0    -variable_coefficient analytic -interpolate 1 -petscspace_degree 2 -show_initial -dm_plex_print_fem 1 -cells 1,1,1
1363c4762a1bSJed Brown 
1364c4762a1bSJed Brown   test:
1365c4762a1bSJed Brown     suffix: 20
1366c4762a1bSJed Brown     requires: ctetgen
1367c4762a1bSJed Brown     args: -run_type test -dim 3 -refinement_limit 0.0125 -variable_coefficient analytic -interpolate 1 -petscspace_degree 2 -show_initial -dm_plex_print_fem 1 -cells 1,1,1
1368c4762a1bSJed Brown 
1369c4762a1bSJed Brown   # P1 variable coefficient 21-28
1370c4762a1bSJed Brown   test:
1371c4762a1bSJed Brown     suffix: 21
1372c4762a1bSJed Brown     requires: triangle
1373c4762a1bSJed Brown     args: -run_type test -refinement_limit 0.0    -variable_coefficient field    -interpolate 1 -petscspace_degree 1 -mat_petscspace_degree 1 -show_initial -dm_plex_print_fem 1
1374c4762a1bSJed Brown 
1375c4762a1bSJed Brown   test:
1376c4762a1bSJed Brown     suffix: 22
1377c4762a1bSJed Brown     requires: triangle
1378c4762a1bSJed Brown     args: -run_type test -refinement_limit 0.0625 -variable_coefficient field    -interpolate 1 -petscspace_degree 1 -mat_petscspace_degree 1 -show_initial -dm_plex_print_fem 1
1379c4762a1bSJed Brown 
1380c4762a1bSJed Brown   test:
1381c4762a1bSJed Brown     suffix: 23
1382c4762a1bSJed Brown     requires: triangle
1383c4762a1bSJed Brown     args: -run_type test -refinement_limit 0.0    -variable_coefficient field    -interpolate 1 -petscspace_degree 2 -mat_petscspace_degree 1 -show_initial -dm_plex_print_fem 1
1384c4762a1bSJed Brown 
1385c4762a1bSJed Brown   test:
1386c4762a1bSJed Brown     suffix: 24
1387c4762a1bSJed Brown     requires: triangle
1388c4762a1bSJed Brown     args: -run_type test -refinement_limit 0.0625 -variable_coefficient field    -interpolate 1 -petscspace_degree 2 -mat_petscspace_degree 1 -show_initial -dm_plex_print_fem 1
1389c4762a1bSJed Brown 
1390c4762a1bSJed Brown   test:
1391c4762a1bSJed Brown     suffix: 25
1392c4762a1bSJed Brown     requires: ctetgen
1393c4762a1bSJed Brown     args: -run_type test -dim 3 -refinement_limit 0.0    -variable_coefficient field    -interpolate 1 -petscspace_degree 1 -mat_petscspace_degree 1 -show_initial -dm_plex_print_fem 1 -cells 1,1,1
1394c4762a1bSJed Brown 
1395c4762a1bSJed Brown   test:
1396c4762a1bSJed Brown     suffix: 26
1397c4762a1bSJed Brown     requires: ctetgen
1398c4762a1bSJed Brown     args: -run_type test -dim 3 -refinement_limit 0.0125 -variable_coefficient field    -interpolate 1 -petscspace_degree 1 -mat_petscspace_degree 1 -show_initial -dm_plex_print_fem 1 -cells 1,1,1
1399c4762a1bSJed Brown 
1400c4762a1bSJed Brown   test:
1401c4762a1bSJed Brown     suffix: 27
1402c4762a1bSJed Brown     requires: ctetgen
1403c4762a1bSJed Brown     args: -run_type test -dim 3 -refinement_limit 0.0    -variable_coefficient field    -interpolate 1 -petscspace_degree 2 -mat_petscspace_degree 1 -show_initial -dm_plex_print_fem 1 -cells 1,1,1
1404c4762a1bSJed Brown 
1405c4762a1bSJed Brown   test:
1406c4762a1bSJed Brown     suffix: 28
1407c4762a1bSJed Brown     requires: ctetgen
1408c4762a1bSJed Brown     args: -run_type test -dim 3 -refinement_limit 0.0125 -variable_coefficient field    -interpolate 1 -petscspace_degree 2 -mat_petscspace_degree 1 -show_initial -dm_plex_print_fem 1 -cells 1,1,1
1409c4762a1bSJed Brown 
1410c4762a1bSJed Brown   # P0 variable coefficient 29-36
1411c4762a1bSJed Brown   test:
1412c4762a1bSJed Brown     suffix: 29
1413c4762a1bSJed Brown     requires: triangle
1414c4762a1bSJed Brown     args: -run_type test -refinement_limit 0.0    -variable_coefficient field    -interpolate 1 -petscspace_degree 1 -show_initial -dm_plex_print_fem 1
1415c4762a1bSJed Brown 
1416c4762a1bSJed Brown   test:
1417c4762a1bSJed Brown     suffix: 30
1418c4762a1bSJed Brown     requires: triangle
1419c4762a1bSJed Brown     args: -run_type test -refinement_limit 0.0625 -variable_coefficient field    -interpolate 1 -petscspace_degree 1 -show_initial -dm_plex_print_fem 1
1420c4762a1bSJed Brown 
1421c4762a1bSJed Brown   test:
1422c4762a1bSJed Brown     suffix: 31
1423c4762a1bSJed Brown     requires: triangle
1424c4762a1bSJed Brown     args: -run_type test -refinement_limit 0.0    -variable_coefficient field    -interpolate 1 -petscspace_degree 2 -show_initial -dm_plex_print_fem 1
1425c4762a1bSJed Brown 
1426c4762a1bSJed Brown   test:
1427c4762a1bSJed Brown     requires: triangle
1428c4762a1bSJed Brown     suffix: 32
1429c4762a1bSJed Brown     args: -run_type test -refinement_limit 0.0625 -variable_coefficient field    -interpolate 1 -petscspace_degree 2 -show_initial -dm_plex_print_fem 1
1430c4762a1bSJed Brown 
1431c4762a1bSJed Brown   test:
1432c4762a1bSJed Brown     requires: ctetgen
1433c4762a1bSJed Brown     suffix: 33
1434c4762a1bSJed Brown     args: -run_type test -dim 3 -refinement_limit 0.0    -variable_coefficient field    -interpolate 1 -petscspace_degree 1 -show_initial -dm_plex_print_fem 1 -cells 1,1,1
1435c4762a1bSJed Brown 
1436c4762a1bSJed Brown   test:
1437c4762a1bSJed Brown     suffix: 34
1438c4762a1bSJed Brown     requires: ctetgen
1439c4762a1bSJed Brown     args: -run_type test -dim 3 -refinement_limit 0.0125 -variable_coefficient field    -interpolate 1 -petscspace_degree 1 -show_initial -dm_plex_print_fem 1 -cells 1,1,1
1440c4762a1bSJed Brown 
1441c4762a1bSJed Brown   test:
1442c4762a1bSJed Brown     suffix: 35
1443c4762a1bSJed Brown     requires: ctetgen
1444c4762a1bSJed Brown     args: -run_type test -dim 3 -refinement_limit 0.0    -variable_coefficient field    -interpolate 1 -petscspace_degree 2 -show_initial -dm_plex_print_fem 1 -cells 1,1,1
1445c4762a1bSJed Brown 
1446c4762a1bSJed Brown   test:
1447c4762a1bSJed Brown     suffix: 36
1448c4762a1bSJed Brown     requires: ctetgen
1449c4762a1bSJed Brown     args: -run_type test -dim 3 -refinement_limit 0.0125 -variable_coefficient field    -interpolate 1 -petscspace_degree 2 -show_initial -dm_plex_print_fem 1 -cells 1,1,1
1450c4762a1bSJed Brown 
1451c4762a1bSJed Brown   # Full solve 39-44
1452c4762a1bSJed Brown   test:
1453c4762a1bSJed Brown     suffix: 39
1454c4762a1bSJed Brown     requires: triangle !single
1455c4762a1bSJed Brown     args: -run_type full -refinement_limit 0.015625 -interpolate 1 -petscspace_degree 2 -pc_type gamg -ksp_rtol 1.0e-10 -ksp_monitor_short -ksp_converged_reason -snes_monitor_short -snes_converged_reason ::ascii_info_detail
1456c4762a1bSJed Brown   test:
1457c4762a1bSJed Brown     suffix: 40
1458c4762a1bSJed Brown     requires: triangle !single
1459c4762a1bSJed Brown     args: -run_type full -refinement_limit 0.015625 -variable_coefficient nonlinear -interpolate 1 -petscspace_degree 2 -pc_type svd -ksp_rtol 1.0e-10 -snes_monitor_short -snes_converged_reason ::ascii_info_detail
1460c4762a1bSJed Brown   test:
1461c4762a1bSJed Brown     suffix: 41
1462c4762a1bSJed Brown     requires: triangle !single
1463c4762a1bSJed Brown     args: -run_type full -refinement_limit 0.03125 -variable_coefficient nonlinear -interpolate 1 -petscspace_degree 1 -snes_type fas -snes_fas_levels 2 -fas_coarse_pc_type svd -fas_coarse_ksp_rtol 1.0e-10 -fas_coarse_snes_monitor_short -snes_monitor_short -fas_coarse_snes_linesearch_type basic -snes_converged_reason ::ascii_info_detail -dm_refine_hierarchy 1 -snes_view -fas_levels_1_snes_type newtonls -fas_levels_1_pc_type svd -fas_levels_1_ksp_rtol 1.0e-10 -fas_levels_1_snes_monitor_short
1464c4762a1bSJed Brown   test:
1465c4762a1bSJed Brown     suffix: 42
1466c4762a1bSJed Brown     requires: triangle !single
1467c4762a1bSJed Brown     args: -run_type full -refinement_limit 0.0625 -variable_coefficient nonlinear -interpolate 1 -petscspace_degree 1 -snes_type fas -snes_fas_levels 3 -fas_coarse_pc_type svd -fas_coarse_ksp_rtol 1.0e-10 -fas_coarse_snes_monitor_short -snes_monitor_short -fas_coarse_snes_linesearch_type basic -snes_converged_reason ::ascii_info_detail -dm_refine_hierarchy 2 -dm_plex_print_fem 0 -snes_view -fas_levels_1_snes_type newtonls -fas_levels_1_pc_type svd -fas_levels_1_ksp_rtol 1.0e-10 -fas_levels_1_snes_monitor_short -fas_levels_2_snes_type newtonls -fas_levels_2_pc_type svd -fas_levels_2_ksp_rtol 1.0e-10 -fas_levels_2_snes_atol 1.0e-11 -fas_levels_2_snes_monitor_short
1468c4762a1bSJed Brown   test:
1469c4762a1bSJed Brown     suffix: 43
1470c4762a1bSJed Brown     requires: triangle !single
1471c4762a1bSJed Brown     nsize: 2
1472c4762a1bSJed Brown     args: -run_type full -refinement_limit 0.03125 -variable_coefficient nonlinear -interpolate 1 -petscspace_degree 1 -snes_type fas -snes_fas_levels 2 -fas_coarse_pc_type svd -fas_coarse_ksp_rtol 1.0e-10 -fas_coarse_snes_monitor_short -snes_monitor_short -fas_coarse_snes_linesearch_type basic -snes_converged_reason ::ascii_info_detail -dm_refine_hierarchy 1 -snes_view -fas_levels_1_snes_type newtonls -fas_levels_1_pc_type svd -fas_levels_1_ksp_rtol 1.0e-10 -fas_levels_1_snes_monitor_short
1473c4762a1bSJed Brown 
1474c4762a1bSJed Brown   test:
1475c4762a1bSJed Brown     suffix: 44
1476c4762a1bSJed Brown     requires: triangle !single
1477c4762a1bSJed Brown     nsize: 2
1478c4762a1bSJed Brown     args: -run_type full -refinement_limit 0.0625 -variable_coefficient nonlinear -interpolate 1 -petscspace_degree 1 -snes_type fas -snes_fas_levels 3 -fas_coarse_pc_type svd -fas_coarse_ksp_rtol 1.0e-10 -fas_coarse_snes_monitor_short -snes_monitor_short  -fas_coarse_snes_linesearch_type basic -snes_converged_reason ::ascii_info_detail -dm_refine_hierarchy 2 -dm_plex_print_fem 0 -snes_view -fas_levels_1_snes_type newtonls -fas_levels_1_pc_type svd -fas_levels_1_ksp_rtol 1.0e-10 -fas_levels_1_snes_monitor_short -fas_levels_2_snes_type newtonls -fas_levels_2_pc_type svd -fas_levels_2_ksp_rtol 1.0e-10 -fas_levels_2_snes_atol 1.0e-11 -fas_levels_2_snes_monitor_short
1479c4762a1bSJed Brown 
1480c4762a1bSJed Brown   # These tests use a loose tolerance just to exercise the PtAP operations for MATIS and multiple PCBDDC setup calls inside PCMG
1481c4762a1bSJed Brown   testset:
1482c4762a1bSJed Brown     requires: triangle !single
1483c4762a1bSJed Brown     nsize: 3
1484c4762a1bSJed Brown     args: -interpolate -run_type full -petscspace_degree 1 -dm_mat_type is -pc_type mg -pc_mg_levels 2 -mg_coarse_pc_type bddc -pc_mg_galerkin pmat -ksp_rtol 1.0e-2 -snes_converged_reason -dm_refine_hierarchy 2 -snes_max_it 4
1485c4762a1bSJed Brown     test:
1486c4762a1bSJed Brown       suffix: gmg_bddc
1487c4762a1bSJed Brown       filter: sed -e "s/CONVERGED_FNORM_RELATIVE iterations 3/CONVERGED_FNORM_RELATIVE iterations 4/g"
1488c4762a1bSJed Brown       args: -mg_levels_pc_type jacobi
1489c4762a1bSJed Brown     test:
1490c4762a1bSJed Brown       filter: sed -e "s/iterations [0-4]/iterations 4/g"
1491c4762a1bSJed Brown       suffix: gmg_bddc_lev
1492c4762a1bSJed Brown       args: -mg_levels_pc_type bddc
1493c4762a1bSJed Brown 
1494c4762a1bSJed Brown   # Restarting
1495c4762a1bSJed Brown   testset:
1496c4762a1bSJed Brown     suffix: restart
1497c4762a1bSJed Brown     requires: hdf5 triangle !complex
1498c4762a1bSJed Brown     args: -run_type test -refinement_limit 0.0    -bc_type dirichlet -interpolate 1 -petscspace_degree 1
1499c4762a1bSJed Brown     test:
1500c4762a1bSJed Brown       args: -dm_view hdf5:sol.h5 -vec_view hdf5:sol.h5::append
1501c4762a1bSJed Brown     test:
1502c4762a1bSJed Brown       args: -f sol.h5 -restart
1503c4762a1bSJed Brown 
1504c4762a1bSJed Brown   # Periodicity
1505c4762a1bSJed Brown   test:
1506c4762a1bSJed Brown     suffix: periodic_0
1507c4762a1bSJed Brown     requires: triangle
1508c4762a1bSJed Brown     args: -run_type full -refinement_limit 0.0    -bc_type dirichlet -interpolate 1 -petscspace_degree 1 -snes_converged_reason ::ascii_info_detail
1509c4762a1bSJed Brown 
1510c4762a1bSJed Brown   test:
1511c4762a1bSJed Brown     requires: !complex
1512c4762a1bSJed Brown     suffix: periodic_1
1513c4762a1bSJed Brown     args: -quiet -run_type test -simplex 0 -x_periodicity periodic -y_periodicity periodic -vec_view vtk:test.vtu:vtk_vtu -interpolate 1 -petscspace_degree 1 -dm_refine 1
1514c4762a1bSJed Brown 
1515c4762a1bSJed Brown   # 2D serial P1 test with field bc
1516c4762a1bSJed Brown   test:
1517c4762a1bSJed Brown     suffix: field_bc_2d_p1_0
1518c4762a1bSJed Brown     requires: triangle
1519c4762a1bSJed Brown     args: -run_type test              -interpolate 1 -bc_type dirichlet -field_bc -petscspace_degree 1 -bc_petscspace_degree 2 -show_initial -dm_plex_print_fem 1
1520c4762a1bSJed Brown 
1521c4762a1bSJed Brown   test:
1522c4762a1bSJed Brown     suffix: field_bc_2d_p1_1
1523c4762a1bSJed Brown     requires: triangle
1524c4762a1bSJed Brown     args: -run_type test -dm_refine 1 -interpolate 1 -bc_type dirichlet -field_bc -petscspace_degree 1 -bc_petscspace_degree 2 -show_initial -dm_plex_print_fem 1
1525c4762a1bSJed Brown 
1526c4762a1bSJed Brown   test:
1527c4762a1bSJed Brown     suffix: field_bc_2d_p1_neumann_0
1528c4762a1bSJed Brown     requires: triangle
1529c4762a1bSJed Brown     args: -run_type test              -interpolate 1 -bc_type neumann   -field_bc -petscspace_degree 1 -bc_petscspace_degree 2 -show_initial -dm_plex_print_fem 1
1530c4762a1bSJed Brown 
1531c4762a1bSJed Brown   test:
1532c4762a1bSJed Brown     suffix: field_bc_2d_p1_neumann_1
1533c4762a1bSJed Brown     requires: triangle
1534c4762a1bSJed Brown     args: -run_type test -dm_refine 1 -interpolate 1 -bc_type neumann   -field_bc -petscspace_degree 1 -bc_petscspace_degree 2 -show_initial -dm_plex_print_fem 1
1535c4762a1bSJed Brown 
1536c4762a1bSJed Brown   # 3D serial P1 test with field bc
1537c4762a1bSJed Brown   test:
1538c4762a1bSJed Brown     suffix: field_bc_3d_p1_0
1539c4762a1bSJed Brown     requires: ctetgen
1540c4762a1bSJed Brown     args: -run_type test -dim 3              -interpolate 1 -bc_type dirichlet -field_bc -petscspace_degree 1 -bc_petscspace_degree 2 -show_initial -dm_plex_print_fem 1 -cells 1,1,1
1541c4762a1bSJed Brown 
1542c4762a1bSJed Brown   test:
1543c4762a1bSJed Brown     suffix: field_bc_3d_p1_1
1544c4762a1bSJed Brown     requires: ctetgen
1545c4762a1bSJed Brown     args: -run_type test -dim 3 -dm_refine 1 -interpolate 1 -bc_type dirichlet -field_bc -petscspace_degree 1 -bc_petscspace_degree 2 -show_initial -dm_plex_print_fem 1 -cells 1,1,1
1546c4762a1bSJed Brown 
1547c4762a1bSJed Brown   test:
1548c4762a1bSJed Brown     suffix: field_bc_3d_p1_neumann_0
1549c4762a1bSJed Brown     requires: ctetgen
1550c4762a1bSJed Brown     args: -run_type test -dim 3              -interpolate 1 -bc_type neumann   -field_bc -petscspace_degree 1 -bc_petscspace_degree 2 -show_initial -dm_plex_print_fem 1 -cells 1,1,1
1551c4762a1bSJed Brown 
1552c4762a1bSJed Brown   test:
1553c4762a1bSJed Brown     suffix: field_bc_3d_p1_neumann_1
1554c4762a1bSJed Brown     requires: ctetgen
1555c4762a1bSJed Brown     args: -run_type test -dim 3 -dm_refine 1 -interpolate 1 -bc_type neumann   -field_bc -petscspace_degree 1 -bc_petscspace_degree 2 -show_initial -dm_plex_print_fem 1 -cells 1,1,1
1556c4762a1bSJed Brown 
1557c4762a1bSJed Brown   # 2D serial P2 test with field bc
1558c4762a1bSJed Brown   test:
1559c4762a1bSJed Brown     suffix: field_bc_2d_p2_0
1560c4762a1bSJed Brown     requires: triangle
1561c4762a1bSJed Brown     args: -run_type test              -interpolate 1 -bc_type dirichlet -field_bc -petscspace_degree 2 -bc_petscspace_degree 2 -show_initial -dm_plex_print_fem 1
1562c4762a1bSJed Brown 
1563c4762a1bSJed Brown   test:
1564c4762a1bSJed Brown     suffix: field_bc_2d_p2_1
1565c4762a1bSJed Brown     requires: triangle
1566c4762a1bSJed Brown     args: -run_type test -dm_refine 1 -interpolate 1 -bc_type dirichlet -field_bc -petscspace_degree 2 -bc_petscspace_degree 2 -show_initial -dm_plex_print_fem 1
1567c4762a1bSJed Brown 
1568c4762a1bSJed Brown   test:
1569c4762a1bSJed Brown     suffix: field_bc_2d_p2_neumann_0
1570c4762a1bSJed Brown     requires: triangle
1571c4762a1bSJed Brown     args: -run_type test              -interpolate 1 -bc_type neumann   -field_bc -petscspace_degree 2 -bc_petscspace_degree 2 -show_initial -dm_plex_print_fem 1
1572c4762a1bSJed Brown 
1573c4762a1bSJed Brown   test:
1574c4762a1bSJed Brown     suffix: field_bc_2d_p2_neumann_1
1575c4762a1bSJed Brown     requires: triangle
1576c4762a1bSJed Brown     args: -run_type test -dm_refine 1 -interpolate 1 -bc_type neumann   -field_bc -petscspace_degree 2 -bc_petscspace_degree 2 -show_initial -dm_plex_print_fem 1
1577c4762a1bSJed Brown 
1578c4762a1bSJed Brown   # 3D serial P2 test with field bc
1579c4762a1bSJed Brown   test:
1580c4762a1bSJed Brown     suffix: field_bc_3d_p2_0
1581c4762a1bSJed Brown     requires: ctetgen
1582c4762a1bSJed Brown     args: -run_type test -dim 3              -interpolate 1 -bc_type dirichlet -field_bc -petscspace_degree 2 -bc_petscspace_degree 2 -show_initial -dm_plex_print_fem 1 -cells 1,1,1
1583c4762a1bSJed Brown 
1584c4762a1bSJed Brown   test:
1585c4762a1bSJed Brown     suffix: field_bc_3d_p2_1
1586c4762a1bSJed Brown     requires: ctetgen
1587c4762a1bSJed Brown     args: -run_type test -dim 3 -dm_refine 1 -interpolate 1 -bc_type dirichlet -field_bc -petscspace_degree 2 -bc_petscspace_degree 2 -show_initial -dm_plex_print_fem 1 -cells 1,1,1
1588c4762a1bSJed Brown 
1589c4762a1bSJed Brown   test:
1590c4762a1bSJed Brown     suffix: field_bc_3d_p2_neumann_0
1591c4762a1bSJed Brown     requires: ctetgen
1592c4762a1bSJed Brown     args: -run_type test -dim 3              -interpolate 1 -bc_type neumann   -field_bc -petscspace_degree 2 -bc_petscspace_degree 2 -show_initial -dm_plex_print_fem 1 -cells 1,1,1
1593c4762a1bSJed Brown 
1594c4762a1bSJed Brown   test:
1595c4762a1bSJed Brown     suffix: field_bc_3d_p2_neumann_1
1596c4762a1bSJed Brown     requires: ctetgen
1597c4762a1bSJed Brown     args: -run_type test -dim 3 -dm_refine 1 -interpolate 1 -bc_type neumann   -field_bc -petscspace_degree 2 -bc_petscspace_degree 2 -show_initial -dm_plex_print_fem 1 -cells 1,1,1
1598c4762a1bSJed Brown 
1599c4762a1bSJed Brown   # Full solve simplex: Convergence
1600c4762a1bSJed Brown   test:
16010fdc7489SMatthew Knepley     suffix: 3d_p1_conv
1602c4762a1bSJed Brown     requires: ctetgen
16030fdc7489SMatthew Knepley     args: -run_type full -dim 3 -cells 1,1,1 -dm_refine 1 -bc_type dirichlet -interpolate 1 -petscspace_degree 1 \
16040fdc7489SMatthew Knepley       -snes_convergence_estimate -convest_num_refine 1 -pc_type lu
1605c4762a1bSJed Brown 
1606c4762a1bSJed Brown   # Full solve simplex: PCBDDC
1607c4762a1bSJed Brown   test:
1608c4762a1bSJed Brown     suffix: tri_bddc
1609c4762a1bSJed Brown     requires: triangle !single
1610c4762a1bSJed Brown     nsize: 5
1611c4762a1bSJed Brown     args: -run_type full -petscpartitioner_type simple -dm_refine 2 -bc_type dirichlet -interpolate 1 -petscspace_degree 1 -ksp_type gmres -ksp_gmres_restart 100 -ksp_rtol 1.0e-9 -dm_mat_type is -pc_type bddc -snes_monitor_short -ksp_monitor_short -snes_converged_reason ::ascii_info_detail -ksp_converged_reason -snes_view -show_solution 0
1612c4762a1bSJed Brown 
1613c4762a1bSJed Brown   # Full solve simplex: PCBDDC
1614c4762a1bSJed Brown   test:
1615c4762a1bSJed Brown     suffix: tri_parmetis_bddc
1616c4762a1bSJed Brown     requires: triangle !single parmetis
1617c4762a1bSJed Brown     nsize: 4
1618c4762a1bSJed Brown     args: -run_type full -petscpartitioner_type parmetis -dm_refine 2 -bc_type dirichlet -interpolate 1 -petscspace_degree 1 -ksp_type gmres -ksp_gmres_restart 100 -ksp_rtol 1.0e-9 -dm_mat_type is -pc_type bddc -snes_monitor_short -ksp_monitor_short -snes_converged_reason ::ascii_info_detail -ksp_converged_reason -snes_view -show_solution 0
1619c4762a1bSJed Brown 
1620c4762a1bSJed Brown   testset:
1621c4762a1bSJed Brown     args: -run_type full -petscpartitioner_type simple -dm_refine 2 -bc_type dirichlet -interpolate 1 -petscspace_degree 2 -dm_mat_type is -pc_type bddc -ksp_type gmres -snes_monitor_short -ksp_monitor_short -snes_view -simplex 0 -petscspace_poly_tensor -pc_bddc_corner_selection -cells 3,3 -ksp_rtol 1.e-9 -pc_bddc_use_edges 0
1622c4762a1bSJed Brown     nsize: 5
1623c4762a1bSJed Brown     output_file: output/ex12_quad_bddc.out
1624c4762a1bSJed Brown     filter: sed -e "s/aijcusparse/aij/g" -e "s/aijviennacl/aij/g" -e "s/factorization: cusparse/factorization: petsc/g"
1625c4762a1bSJed Brown     test:
1626c4762a1bSJed Brown       requires: !single
1627c4762a1bSJed Brown       suffix: quad_bddc
1628c4762a1bSJed Brown     test:
1629c4762a1bSJed Brown       requires: !single cuda
1630c4762a1bSJed Brown       suffix: quad_bddc_cuda
1631c4762a1bSJed Brown       args: -matis_localmat_type aijcusparse -pc_bddc_dirichlet_pc_factor_mat_solver_type cusparse -pc_bddc_neumann_pc_factor_mat_solver_type cusparse
1632c4762a1bSJed Brown     test:
1633c4762a1bSJed Brown       requires: !single viennacl
1634c4762a1bSJed Brown       suffix: quad_bddc_viennacl
1635c4762a1bSJed Brown       args: -matis_localmat_type aijviennacl
1636c4762a1bSJed Brown 
1637c4762a1bSJed Brown   # Full solve simplex: ASM
1638c4762a1bSJed Brown   test:
1639c4762a1bSJed Brown     suffix: tri_q2q1_asm_lu
1640c4762a1bSJed Brown     requires: triangle !single
1641c4762a1bSJed Brown     args: -run_type full -dm_refine 3 -bc_type dirichlet -interpolate 1 -petscspace_degree 1 -ksp_type gmres -ksp_gmres_restart 100 -ksp_rtol 1.0e-9 -pc_type asm -pc_asm_type restrict -pc_asm_blocks 4 -sub_pc_type lu -snes_monitor_short -ksp_monitor_short -snes_converged_reason ::ascii_info_detail -ksp_converged_reason -snes_view -show_solution 0
1642c4762a1bSJed Brown 
1643c4762a1bSJed Brown   test:
1644c4762a1bSJed Brown     suffix: tri_q2q1_msm_lu
1645c4762a1bSJed Brown     requires: triangle !single
1646c4762a1bSJed Brown     args: -run_type full -dm_refine 3 -bc_type dirichlet -interpolate 1 -petscspace_degree 1 -ksp_type gmres -ksp_gmres_restart 100 -ksp_rtol 1.0e-9 -pc_type asm -pc_asm_type restrict -pc_asm_local_type multiplicative -pc_asm_blocks 4 -sub_pc_type lu -snes_monitor_short -ksp_monitor_short -snes_converged_reason ::ascii_info_detail -ksp_converged_reason -snes_view -show_solution 0
1647c4762a1bSJed Brown 
1648c4762a1bSJed Brown   test:
1649c4762a1bSJed Brown     suffix: tri_q2q1_asm_sor
1650c4762a1bSJed Brown     requires: triangle !single
1651c4762a1bSJed Brown     args: -run_type full -dm_refine 3 -bc_type dirichlet -interpolate 1 -petscspace_degree 1 -ksp_type gmres -ksp_gmres_restart 100 -ksp_rtol 1.0e-9 -pc_type asm -pc_asm_type restrict -pc_asm_blocks 4 -sub_pc_type sor -snes_monitor_short -ksp_monitor_short -snes_converged_reason ::ascii_info_detail -ksp_converged_reason -snes_view -show_solution 0
1652c4762a1bSJed Brown 
1653c4762a1bSJed Brown   test:
1654c4762a1bSJed Brown     suffix: tri_q2q1_msm_sor
1655c4762a1bSJed Brown     requires: triangle !single
1656c4762a1bSJed Brown     args: -run_type full -dm_refine 3 -bc_type dirichlet -interpolate 1 -petscspace_degree 1 -ksp_type gmres -ksp_gmres_restart 100 -ksp_rtol 1.0e-9 -pc_type asm -pc_asm_type restrict -pc_asm_local_type multiplicative -pc_asm_blocks 4 -sub_pc_type sor -snes_monitor_short -ksp_monitor_short -snes_converged_reason ::ascii_info_detail -ksp_converged_reason -snes_view -show_solution 0
1657c4762a1bSJed Brown 
1658c4762a1bSJed Brown   # Full solve simplex: FAS
1659c4762a1bSJed Brown   test:
1660c4762a1bSJed Brown     suffix: fas_newton_0
1661c4762a1bSJed Brown     requires: triangle !single
1662c4762a1bSJed Brown     args: -run_type full -variable_coefficient nonlinear -interpolate 1 -petscspace_degree 1 -snes_type fas -snes_fas_levels 2 -fas_coarse_pc_type svd -fas_coarse_ksp_rtol 1.0e-10 -fas_coarse_snes_monitor_short -snes_monitor_short -fas_coarse_snes_linesearch_type basic -snes_converged_reason ::ascii_info_detail -dm_refine_hierarchy 1 -snes_view -fas_levels_1_snes_type newtonls -fas_levels_1_pc_type svd -fas_levels_1_ksp_rtol 1.0e-10 -fas_levels_1_snes_monitor_short
1663c4762a1bSJed Brown 
1664c4762a1bSJed Brown   test:
1665c4762a1bSJed Brown     suffix: fas_newton_1
1666c4762a1bSJed Brown     requires: triangle !single
1667c4762a1bSJed Brown     args: -run_type full -dm_refine_hierarchy 3 -interpolate 1 -petscspace_degree 1 -snes_type fas -snes_fas_levels 3 -fas_coarse_pc_type lu -fas_coarse_snes_monitor_short -snes_monitor_short -fas_coarse_snes_linesearch_type basic -snes_converged_reason ::ascii_info_detail -snes_view -fas_levels_snes_type newtonls -fas_levels_snes_linesearch_type basic -fas_levels_ksp_rtol 1.0e-10 -fas_levels_snes_monitor_short
1668c4ef839dSSatish Balay     filter: sed -e "s/total number of linear solver iterations=14/total number of linear solver iterations=15/g"
1669c4762a1bSJed Brown 
1670c4762a1bSJed Brown   test:
1671c4762a1bSJed Brown     suffix: fas_ngs_0
1672c4762a1bSJed Brown     requires: triangle !single
1673c4762a1bSJed Brown     args: -run_type full -variable_coefficient nonlinear -interpolate 1 -petscspace_degree 1 -snes_type fas -snes_fas_levels 2 -fas_coarse_pc_type svd -fas_coarse_ksp_rtol 1.0e-10 -fas_coarse_snes_monitor_short -snes_monitor_short -fas_coarse_snes_linesearch_type basic -snes_converged_reason ::ascii_info_detail -dm_refine_hierarchy 1 -snes_view -fas_levels_1_snes_type ngs -fas_levels_1_snes_monitor_short
1674c4762a1bSJed Brown 
1675c4762a1bSJed Brown   test:
1676c4762a1bSJed Brown     suffix: fas_newton_coarse_0
1677c4762a1bSJed Brown     requires: pragmatic triangle
1678c4762a1bSJed Brown     TODO: broken
1679c4762a1bSJed Brown     args: -run_type full -dm_refine 2 -dm_plex_hash_location -variable_coefficient nonlinear -interpolate 1 -petscspace_degree 1 -snes_type fas -snes_fas_levels 2 -pc_type svd -ksp_rtol 1.0e-10 -fas_coarse_pc_type svd -fas_coarse_ksp_rtol 1.0e-10 -fas_coarse_snes_monitor_short -snes_monitor_short -fas_coarse_snes_linesearch_type basic -snes_converged_reason ::ascii_info_detail -dm_coarsen_hierarchy 1 -snes_view -fas_levels_1_snes_type newtonls -fas_levels_1_pc_type svd -fas_levels_1_ksp_rtol 1.0e-10 -fas_levels_1_snes_monitor_short
1680c4762a1bSJed Brown 
1681c4762a1bSJed Brown   test:
1682c4762a1bSJed Brown     suffix: mg_newton_coarse_0
1683c4762a1bSJed Brown     requires: triangle pragmatic
1684c4762a1bSJed Brown     TODO: broken
1685c4762a1bSJed Brown     args: -run_type full -dm_refine 3 -interpolate 1 -petscspace_degree 1 -snes_monitor_short -ksp_monitor_true_residual -snes_converged_reason ::ascii_info_detail -dm_coarsen_hierarchy 3 -dm_plex_hash_location -snes_view -dm_view -ksp_type richardson -pc_type mg  -pc_mg_levels 4 -snes_atol 1.0e-8 -ksp_atol 1.0e-8 -snes_rtol 0.0 -ksp_rtol 0.0 -ksp_norm_type unpreconditioned -mg_levels_ksp_type gmres -mg_levels_pc_type ilu -mg_levels_ksp_max_it 10
1686c4762a1bSJed Brown 
1687c4762a1bSJed Brown   test:
1688c4762a1bSJed Brown     suffix: mg_newton_coarse_1
1689c4762a1bSJed Brown     requires: triangle pragmatic
1690c4762a1bSJed Brown     TODO: broken
1691c4762a1bSJed Brown     args: -run_type full -dm_refine 5 -interpolate 1 -petscspace_degree 1 -dm_coarsen_hierarchy 5 -dm_plex_hash_location -dm_plex_separate_marker -dm_plex_coarsen_bd_label marker -dm_plex_remesh_bd -ksp_type richardson -ksp_rtol 1.0e-12 -pc_type mg -pc_mg_levels 3 -mg_levels_ksp_max_it 2 -snes_converged_reason ::ascii_info_detail -snes_monitor -ksp_monitor_true_residual -mg_levels_ksp_monitor_true_residual -dm_view -ksp_view
1692c4762a1bSJed Brown 
1693c4762a1bSJed Brown   test:
1694c4762a1bSJed Brown     suffix: mg_newton_coarse_2
1695c4762a1bSJed Brown     requires: triangle pragmatic
1696c4762a1bSJed Brown     TODO: broken
1697c4762a1bSJed Brown     args: -run_type full -dm_refine 5 -interpolate 1 -petscspace_degree 1 -dm_coarsen_hierarchy 5 -dm_plex_hash_location -dm_plex_separate_marker -dm_plex_remesh_bd -ksp_type richardson -ksp_rtol 1.0e-12 -pc_type mg -pc_mg_levels 3 -mg_levels_ksp_max_it 2 -snes_converged_reason ::ascii_info_detail -snes_monitor -ksp_monitor_true_residual -mg_levels_ksp_monitor_true_residual -dm_view -ksp_view
1698c4762a1bSJed Brown 
1699c4762a1bSJed Brown   # Full solve tensor
1700c4762a1bSJed Brown   test:
1701c4762a1bSJed Brown     suffix: tensor_plex_2d
1702c4762a1bSJed Brown     args: -run_type test -refinement_limit 0.0 -simplex 0 -interpolate -bc_type dirichlet -petscspace_degree 1 -dm_refine_hierarchy 2 -cells 2,2
1703c4762a1bSJed Brown 
1704c4762a1bSJed Brown   test:
1705c4762a1bSJed Brown     suffix: tensor_p4est_2d
1706c4762a1bSJed Brown     requires: p4est
1707c4762a1bSJed Brown     args: -run_type test -refinement_limit 0.0 -simplex 0 -interpolate -bc_type dirichlet -petscspace_degree 1 -dm_forest_initial_refinement 2 -dm_forest_minimum_refinement 0 -dm_plex_convert_type p4est -cells 2,2
1708c4762a1bSJed Brown 
1709c4762a1bSJed Brown   test:
1710c4762a1bSJed Brown     suffix: tensor_plex_3d
1711c4762a1bSJed Brown     args: -run_type test -refinement_limit 0.0 -simplex 0 -interpolate -bc_type dirichlet -petscspace_degree 1 -dim 3 -dm_refine_hierarchy 1 -cells 2,2,2
1712c4762a1bSJed Brown 
1713c4762a1bSJed Brown   test:
1714c4762a1bSJed Brown     suffix: tensor_p4est_3d
1715c4762a1bSJed Brown     requires: p4est
1716c4762a1bSJed Brown     args: -run_type test -refinement_limit 0.0 -simplex 0 -interpolate -bc_type dirichlet -petscspace_degree 1 -dm_forest_initial_refinement 1 -dm_forest_minimum_refinement 0 -dim 3 -dm_plex_convert_type p8est -cells 2,2,2
1717c4762a1bSJed Brown 
1718c4762a1bSJed Brown   test:
1719c4762a1bSJed Brown     suffix: p4est_test_q2_conformal_serial
1720c4762a1bSJed Brown     requires: p4est
1721c4762a1bSJed Brown     args: -run_type test -interpolate 1 -petscspace_degree 2 -simplex 0 -dm_plex_convert_type p4est -dm_forest_minimum_refinement 0 -dm_forest_initial_refinement 2 -cells 2,2
1722c4762a1bSJed Brown 
1723c4762a1bSJed Brown   test:
1724c4762a1bSJed Brown     suffix: p4est_test_q2_conformal_parallel
1725c4762a1bSJed Brown     requires: p4est
1726c4762a1bSJed Brown     nsize: 7
1727c4762a1bSJed Brown     args: -run_type test -interpolate 1 -petscspace_degree 2 -simplex 0 -dm_plex_convert_type p4est -dm_forest_minimum_refinement 0 -dm_forest_initial_refinement 2 -petscpartitioner_type simple -cells 2,2
1728c4762a1bSJed Brown 
1729c4762a1bSJed Brown   test:
1730c4762a1bSJed Brown     suffix: p4est_test_q2_conformal_parallel_parmetis
1731c4762a1bSJed Brown     requires: parmetis p4est
1732c4762a1bSJed Brown     nsize: 4
1733c4762a1bSJed Brown     args: -run_type test -interpolate 1 -petscspace_degree 2 -simplex 0 -dm_plex_convert_type p4est -dm_forest_minimum_refinement 0 -dm_forest_initial_refinement 2 -petscpartitioner_type parmetis -cells 2,2
1734c4762a1bSJed Brown 
1735c4762a1bSJed Brown   test:
1736c4762a1bSJed Brown     suffix: p4est_test_q2_nonconformal_serial
1737c4762a1bSJed Brown     requires: p4est
1738c4762a1bSJed Brown     filter: grep -v "CG or CGNE: variant"
1739c4762a1bSJed Brown     args: -run_type test -interpolate 1 -petscspace_degree 2 -simplex 0 -dm_plex_convert_type p4est -dm_forest_minimum_refinement 0 -dm_forest_initial_refinement 2 -dm_forest_maximum_refinement 4 -dm_p4est_refine_pattern hash -cells 2,2
1740c4762a1bSJed Brown 
1741c4762a1bSJed Brown   test:
1742c4762a1bSJed Brown     suffix: p4est_test_q2_nonconformal_parallel
1743c4762a1bSJed Brown     requires: p4est
1744c4762a1bSJed Brown     filter: grep -v "CG or CGNE: variant"
1745c4762a1bSJed Brown     nsize: 7
1746c4762a1bSJed Brown     args: -run_type test -interpolate 1 -petscspace_degree 2 -simplex 0 -dm_plex_convert_type p4est -dm_forest_minimum_refinement 0 -dm_forest_initial_refinement 2 -dm_forest_maximum_refinement 4 -dm_p4est_refine_pattern hash -petscpartitioner_type simple -cells 2,2
1747c4762a1bSJed Brown 
1748c4762a1bSJed Brown   test:
1749c4762a1bSJed Brown     suffix: p4est_test_q2_nonconformal_parallel_parmetis
1750c4762a1bSJed Brown     requires: parmetis p4est
1751c4762a1bSJed Brown     nsize: 4
1752c4762a1bSJed Brown     args: -run_type test -interpolate 1 -petscspace_degree 2 -simplex 0 -dm_plex_convert_type p4est -dm_forest_minimum_refinement 0 -dm_forest_initial_refinement 2 -dm_forest_maximum_refinement 4 -dm_p4est_refine_pattern hash -petscpartitioner_type parmetis -cells 2,2
1753c4762a1bSJed Brown 
1754c4762a1bSJed Brown   test:
1755c4762a1bSJed Brown     suffix: p4est_exact_q2_conformal_serial
1756c4762a1bSJed Brown     requires: p4est !single !complex !__float128
1757c4762a1bSJed Brown     args: -run_type exact -interpolate 1 -petscspace_degree 2 -fas_levels_snes_atol 1.e-10 -snes_max_it 1 -snes_type fas -snes_fas_levels 3 -fas_coarse_pc_type none -fas_coarse_ksp_type preonly -fas_coarse_snes_monitor_short -snes_monitor_short -fas_coarse_snes_linesearch_type basic -snes_converged_reason ::ascii_info_detail -snes_view -fas_levels_snes_type newtonls -fas_levels_pc_type none -fas_levels_ksp_type preonly -fas_levels_snes_monitor_short -simplex 0 -dm_plex_convert_type p4est -dm_forest_minimum_refinement 0 -dm_forest_initial_refinement 2 -cells 2,2
1758c4762a1bSJed Brown 
1759c4762a1bSJed Brown   test:
1760c4762a1bSJed Brown     suffix: p4est_exact_q2_conformal_parallel
1761c4762a1bSJed Brown     requires: p4est !single !complex !__float128
1762c4762a1bSJed Brown     nsize: 4
1763c4762a1bSJed Brown     args: -run_type exact -interpolate 1 -petscspace_degree 2 -fas_levels_snes_atol 1.e-10 -snes_max_it 1 -snes_type fas -snes_fas_levels 3 -fas_coarse_pc_type none -fas_coarse_ksp_type preonly -fas_coarse_snes_monitor_short -snes_monitor_short -fas_coarse_snes_linesearch_type basic -snes_converged_reason ::ascii_info_detail -snes_view -fas_levels_snes_type newtonls -fas_levels_pc_type none -fas_levels_ksp_type preonly -fas_levels_snes_monitor_short -simplex 0 -dm_plex_convert_type p4est -dm_forest_minimum_refinement 0 -dm_forest_initial_refinement 2 -cells 2,2
1764c4762a1bSJed Brown 
1765c4762a1bSJed Brown   test:
1766c4762a1bSJed Brown     suffix: p4est_exact_q2_conformal_parallel_parmetis
1767c4762a1bSJed Brown     requires: parmetis p4est !single
1768c4762a1bSJed Brown     nsize: 4
1769c4762a1bSJed Brown     args: -run_type exact -interpolate 1 -petscspace_degree 2 -fas_levels_snes_atol 1.e-10 -snes_max_it 1 -snes_type fas -snes_fas_levels 3 -fas_coarse_pc_type none -fas_coarse_ksp_type preonly -fas_coarse_snes_monitor_short -snes_monitor_short -fas_coarse_snes_linesearch_type basic -snes_converged_reason ::ascii_info_detail -snes_view -fas_levels_snes_type newtonls -fas_levels_pc_type none -fas_levels_ksp_type preonly -fas_levels_snes_monitor_short -simplex 0 -dm_plex_convert_type p4est -dm_forest_minimum_refinement 0 -dm_forest_initial_refinement 2 -petscpartitioner_type parmetis  -cells 2,2
1770c4762a1bSJed Brown 
1771c4762a1bSJed Brown   test:
1772c4762a1bSJed Brown     suffix: p4est_exact_q2_nonconformal_serial
1773c4762a1bSJed Brown     requires: p4est
1774c4762a1bSJed Brown     args: -run_type exact -interpolate 1 -petscspace_degree 2 -fas_levels_snes_atol 1.e-10 -snes_max_it 1 -snes_type fas -snes_fas_levels 3 -fas_coarse_pc_type none -fas_coarse_ksp_type preonly -fas_coarse_snes_monitor_short -snes_monitor_short -fas_coarse_snes_linesearch_type basic -snes_converged_reason ::ascii_info_detail -snes_view -fas_levels_snes_type newtonls -fas_levels_pc_type none -fas_levels_ksp_type preonly -fas_levels_snes_monitor_short -simplex 0 -dm_plex_convert_type p4est -dm_forest_minimum_refinement 0 -dm_forest_initial_refinement 2 -dm_forest_maximum_refinement 4 -dm_p4est_refine_pattern hash -cells 2,2
1775c4762a1bSJed Brown 
1776c4762a1bSJed Brown   test:
1777c4762a1bSJed Brown     suffix: p4est_exact_q2_nonconformal_parallel
1778c4762a1bSJed Brown     requires: p4est
1779c4762a1bSJed Brown     nsize: 7
1780c4762a1bSJed Brown     args: -run_type exact -interpolate 1 -petscspace_degree 2 -fas_levels_snes_atol 1.e-10 -snes_max_it 1 -snes_type fas -snes_fas_levels 3 -fas_coarse_pc_type none -fas_coarse_ksp_type preonly -fas_coarse_snes_monitor_short -snes_monitor_short -fas_coarse_snes_linesearch_type basic -snes_converged_reason ::ascii_info_detail -snes_view -fas_levels_snes_type newtonls -fas_levels_pc_type none -fas_levels_ksp_type preonly -fas_levels_snes_monitor_short -simplex 0 -dm_plex_convert_type p4est -dm_forest_minimum_refinement 0 -dm_forest_initial_refinement 2 -dm_forest_maximum_refinement 4 -dm_p4est_refine_pattern hash -petscpartitioner_type simple -cells 2,2
1781c4762a1bSJed Brown 
1782c4762a1bSJed Brown   test:
1783c4762a1bSJed Brown     suffix: p4est_exact_q2_nonconformal_parallel_parmetis
1784c4762a1bSJed Brown     requires: parmetis p4est
1785c4762a1bSJed Brown     nsize: 4
1786c4762a1bSJed Brown     args: -run_type exact -interpolate 1 -petscspace_degree 2 -fas_levels_snes_atol 1.e-10 -snes_max_it 1 -snes_type fas -snes_fas_levels 3 -fas_coarse_pc_type none -fas_coarse_ksp_type preonly -fas_coarse_snes_monitor_short -snes_monitor_short -fas_coarse_snes_linesearch_type basic -snes_converged_reason ::ascii_info_detail -snes_view -fas_levels_snes_type newtonls -fas_levels_pc_type none -fas_levels_ksp_type preonly -fas_levels_snes_monitor_short -simplex 0 -dm_plex_convert_type p4est -dm_forest_minimum_refinement 0 -dm_forest_initial_refinement 2 -dm_forest_maximum_refinement 4 -dm_p4est_refine_pattern hash -petscpartitioner_type parmetis -cells 2,2
1787c4762a1bSJed Brown 
1788c4762a1bSJed Brown   test:
1789c4762a1bSJed Brown     suffix: p4est_full_q2_nonconformal_serial
1790c4762a1bSJed Brown     requires: p4est !single
1791c4762a1bSJed Brown     filter: grep -v "variant HERMITIAN"
1792c4762a1bSJed Brown     args: -run_type full -interpolate 1 -petscspace_degree 2 -snes_max_it 20 -snes_type fas -snes_fas_levels 3 -fas_coarse_pc_type jacobi -fas_coarse_ksp_type cg -fas_coarse_snes_monitor_short -snes_monitor_short -fas_coarse_snes_linesearch_type basic -snes_converged_reason ::ascii_info_detail -snes_view -fas_levels_snes_type newtonls -fas_levels_pc_type jacobi -fas_levels_ksp_type cg -fas_levels_snes_monitor_short -simplex 0 -dm_plex_convert_type p4est -dm_forest_minimum_refinement 0 -dm_forest_initial_refinement 2 -dm_forest_maximum_refinement 4 -dm_p4est_refine_pattern hash -cells 2,2
1793c4762a1bSJed Brown 
1794c4762a1bSJed Brown   test:
1795c4762a1bSJed Brown     suffix: p4est_full_q2_nonconformal_parallel
1796c4762a1bSJed Brown     requires: p4est !single
1797c4762a1bSJed Brown     filter: grep -v "variant HERMITIAN"
1798c4762a1bSJed Brown     nsize: 7
1799c4762a1bSJed Brown     args: -run_type full -interpolate 1 -petscspace_degree 2 -snes_max_it 20 -snes_type fas -snes_fas_levels 3 -fas_coarse_pc_type jacobi -fas_coarse_ksp_type cg -fas_coarse_snes_monitor_short -snes_monitor_short -fas_coarse_snes_linesearch_type basic -snes_converged_reason ::ascii_info_detail -snes_view -fas_levels_snes_type newtonls -fas_levels_pc_type jacobi -fas_levels_ksp_type cg -fas_levels_snes_monitor_short -simplex 0 -dm_plex_convert_type p4est -dm_forest_minimum_refinement 0 -dm_forest_initial_refinement 2 -dm_forest_maximum_refinement 4 -dm_p4est_refine_pattern hash -petscpartitioner_type simple -cells 2,2
1800c4762a1bSJed Brown 
1801c4762a1bSJed Brown   test:
1802c4762a1bSJed Brown     suffix: p4est_full_q2_nonconformal_parallel_bddcfas
1803c4762a1bSJed Brown     requires: p4est !single
1804c4762a1bSJed Brown     filter: grep -v "variant HERMITIAN"
1805c4762a1bSJed Brown     nsize: 7
1806c4762a1bSJed Brown     args: -run_type full -interpolate 1 -petscspace_degree 2 -snes_max_it 20 -snes_type fas -snes_fas_levels 3 -dm_mat_type is -fas_coarse_pc_type bddc -fas_coarse_ksp_type cg -fas_coarse_snes_monitor_short -snes_monitor_short -fas_coarse_snes_linesearch_type basic -snes_converged_reason ::ascii_info_detail -snes_view -fas_levels_snes_type newtonls -fas_levels_pc_type bddc -fas_levels_ksp_type cg -fas_levels_snes_monitor_short -simplex 0 -dm_plex_convert_type p4est -dm_forest_minimum_refinement 0 -dm_forest_initial_refinement 2 -dm_forest_maximum_refinement 4 -dm_p4est_refine_pattern hash -petscpartitioner_type simple -cells 2,2
1807c4762a1bSJed Brown 
1808c4762a1bSJed Brown   test:
1809c4762a1bSJed Brown     suffix: p4est_full_q2_nonconformal_parallel_bddc
1810c4762a1bSJed Brown     requires: p4est !single
1811c4762a1bSJed Brown     filter: grep -v "variant HERMITIAN"
1812c4762a1bSJed Brown     nsize: 7
1813c4762a1bSJed Brown     args: -run_type full -interpolate 1 -petscspace_degree 2 -snes_max_it 20 -snes_type newtonls -dm_mat_type is -pc_type bddc -ksp_type cg -snes_monitor_short -snes_linesearch_type basic -snes_converged_reason ::ascii_info_detail -snes_view -simplex 0 -dm_plex_convert_type p4est -dm_forest_minimum_refinement 0 -dm_forest_initial_refinement 2 -dm_forest_maximum_refinement 4 -dm_p4est_refine_pattern hash -petscpartitioner_type simple -cells 2,2
1814c4762a1bSJed Brown 
1815c4762a1bSJed Brown   test:
1816c4762a1bSJed Brown     TODO: broken
1817c4762a1bSJed Brown     suffix: p4est_fas_q2_conformal_serial
1818c4762a1bSJed Brown     requires: p4est !complex !__float128
1819c4762a1bSJed Brown     args: -run_type full -variable_coefficient nonlinear -interpolate 1 -petscspace_degree 2 -snes_max_it 20 -snes_type fas -snes_fas_levels 3 -pc_type jacobi -ksp_type gmres -fas_coarse_pc_type svd -fas_coarse_ksp_type gmres -fas_coarse_snes_monitor_short -snes_monitor_short -fas_coarse_snes_linesearch_type basic -snes_converged_reason ::ascii_info_detail -snes_view -fas_levels_snes_type newtonls -fas_levels_pc_type svd -fas_levels_ksp_type gmres -fas_levels_snes_monitor_short -simplex 0 -dm_refine_hierarchy 3 -cells 2,2
1820c4762a1bSJed Brown 
1821c4762a1bSJed Brown   test:
1822c4762a1bSJed Brown     TODO: broken
1823c4762a1bSJed Brown     suffix: p4est_fas_q2_nonconformal_serial
1824c4762a1bSJed Brown     requires: p4est
1825c4762a1bSJed Brown     args: -run_type full -variable_coefficient nonlinear -interpolate 1 -petscspace_degree 2 -snes_max_it 20 -snes_type fas -snes_fas_levels 3 -pc_type jacobi -ksp_type gmres -fas_coarse_pc_type jacobi -fas_coarse_ksp_type gmres -fas_coarse_ksp_monitor_true_residual -fas_coarse_snes_monitor_short -snes_monitor_short -fas_coarse_snes_linesearch_type basic -snes_converged_reason ::ascii_info_detail -snes_view -fas_levels_snes_type newtonls -fas_levels_pc_type jacobi -fas_levels_ksp_type gmres -fas_levels_snes_monitor_short -simplex 0 -dm_plex_convert_type p4est -dm_forest_minimum_refinement 0 -dm_forest_initial_refinement 2 -dm_forest_maximum_refinement 4 -dm_p4est_refine_pattern hash -cells 2,2
1826c4762a1bSJed Brown 
1827c4762a1bSJed Brown   test:
1828c4762a1bSJed Brown     suffix: fas_newton_0_p4est
1829c4762a1bSJed Brown     requires: p4est !single !__float128
1830c4762a1bSJed Brown     args: -run_type full -variable_coefficient nonlinear -interpolate 1 -petscspace_degree 1 -snes_type fas -snes_fas_levels 2 -fas_coarse_pc_type svd -fas_coarse_ksp_rtol 1.0e-10 -fas_coarse_snes_monitor_short -snes_monitor_short -fas_coarse_snes_linesearch_type basic -snes_converged_reason ::ascii_info_detail -snes_view -fas_levels_1_snes_type newtonls -fas_levels_1_pc_type svd -fas_levels_1_ksp_rtol 1.0e-10 -fas_levels_1_snes_monitor_short -simplex 0 -dm_plex_convert_type p4est -dm_forest_minimum_refinement 0 -dm_forest_initial_refinement 2 -dm_forest_maximum_refinement 4 -dm_p4est_refine_pattern hash -cells 2,2
1831c4762a1bSJed Brown 
1832c4762a1bSJed Brown   # Full solve simplicial AMR
1833c4762a1bSJed Brown   test:
1834c4762a1bSJed Brown     suffix: tri_p1_adapt_0
1835c4762a1bSJed Brown     requires: pragmatic
1836c4762a1bSJed Brown     TODO: broken
1837c4762a1bSJed Brown     args: -run_type exact -dim 2 -dm_refine 5 -bc_type dirichlet -interpolate 1 -petscspace_degree 1 -variable_coefficient circle -snes_converged_reason ::ascii_info_detail -pc_type lu -adaptor_refinement_factor 1.0 -dm_view -dm_adapt_view -snes_adapt_initial 1
1838c4762a1bSJed Brown 
1839c4762a1bSJed Brown   test:
1840c4762a1bSJed Brown     suffix: tri_p1_adapt_1
1841c4762a1bSJed Brown     requires: pragmatic
1842c4762a1bSJed Brown     TODO: broken
1843c4762a1bSJed Brown     args: -run_type exact -dim 2 -dm_refine 5 -bc_type dirichlet -interpolate 1 -petscspace_degree 1 -variable_coefficient circle -snes_converged_reason ::ascii_info_detail -pc_type lu -adaptor_refinement_factor 1.0 -dm_view -dm_adapt_iter_view -dm_adapt_view -snes_adapt_sequence 2
1844c4762a1bSJed Brown 
1845c4762a1bSJed Brown   test:
1846c4762a1bSJed Brown     suffix: tri_p1_adapt_analytic_0
1847c4762a1bSJed Brown     requires: pragmatic
1848c4762a1bSJed Brown     TODO: broken
1849c4762a1bSJed Brown     args: -run_type exact -dim 2 -dm_refine 3 -bc_type dirichlet -interpolate 1 -petscspace_degree 1 -variable_coefficient cross -snes_adapt_initial 4 -adaptor_target_num 500 -adaptor_monitor -dm_view -dm_adapt_iter_view
1850c4762a1bSJed Brown 
1851c4762a1bSJed Brown   # Full solve tensor AMR
1852c4762a1bSJed Brown   test:
1853c4762a1bSJed Brown     suffix: quad_q1_adapt_0
1854c4762a1bSJed Brown     requires: p4est
1855c4762a1bSJed Brown     args: -run_type exact -dim 2 -simplex 0 -dm_plex_convert_type p4est -bc_type dirichlet -interpolate 1 -petscspace_degree 1 -variable_coefficient circle -snes_converged_reason ::ascii_info_detail -pc_type lu -dm_forest_initial_refinement 4   -snes_adapt_initial 1 -dm_view
1856c4762a1bSJed Brown     filter: grep -v DM_
1857c4762a1bSJed Brown 
1858c4762a1bSJed Brown   test:
1859c4762a1bSJed Brown     suffix: amr_0
1860c4762a1bSJed Brown     nsize: 5
1861c4762a1bSJed Brown     args: -run_type test -petscpartitioner_type simple -refinement_limit 0.0 -simplex 0 -interpolate -bc_type dirichlet -petscspace_degree 1 -dm_refine 1 -cells 2,2
1862c4762a1bSJed Brown 
1863c4762a1bSJed Brown   test:
1864c4762a1bSJed Brown     suffix: amr_1
1865c4762a1bSJed Brown     requires: p4est !complex
1866c4762a1bSJed Brown     args: -run_type test -refinement_limit 0.0 -simplex 0 -interpolate -bc_type dirichlet -petscspace_degree 1 -dm_plex_convert_type p4est -dm_p4est_refine_pattern center -dm_forest_maximum_refinement 5 -dm_view vtk:amr.vtu:vtk_vtu -vec_view vtk:amr.vtu:vtk_vtu:append -cells 2,2
1867c4762a1bSJed Brown 
1868c4762a1bSJed Brown   test:
1869c4762a1bSJed Brown     suffix: p4est_solve_bddc
1870c4762a1bSJed Brown     requires: p4est !complex
1871c4762a1bSJed Brown     args: -run_type full -variable_coefficient nonlinear -nonzero_initial_guess 1 -interpolate 1 -petscspace_degree 2 -snes_max_it 20 -snes_type newtonls -dm_mat_type is -pc_type bddc -ksp_type cg -snes_monitor_short -ksp_monitor -snes_linesearch_type bt -snes_converged_reason -snes_view -simplex 0 -petscspace_poly_tensor -dm_plex_convert_type p4est -dm_forest_minimum_refinement 0 -dm_forest_initial_refinement 2 -dm_forest_maximum_refinement 4 -dm_p4est_refine_pattern hash -petscpartitioner_type simple -pc_bddc_detect_disconnected
1872c4762a1bSJed Brown     nsize: 4
1873c4762a1bSJed Brown 
1874c4762a1bSJed Brown   test:
1875c4762a1bSJed Brown     suffix: p4est_solve_fas
1876c4762a1bSJed Brown     requires: p4est
1877c4762a1bSJed Brown     args: -run_type full -variable_coefficient nonlinear -nonzero_initial_guess 1 -interpolate 1 -petscspace_degree 2 -snes_max_it 10 -snes_type fas -snes_linesearch_type bt -snes_fas_levels 3 -fas_coarse_snes_type newtonls -fas_coarse_snes_linesearch_type basic -fas_coarse_ksp_type cg -fas_coarse_pc_type jacobi -fas_coarse_snes_monitor_short -fas_levels_snes_max_it 4 -fas_levels_snes_type newtonls -fas_levels_snes_linesearch_type bt -fas_levels_ksp_type cg -fas_levels_pc_type jacobi -fas_levels_snes_monitor_short -fas_levels_cycle_snes_linesearch_type bt -snes_monitor_short -snes_converged_reason -snes_view -simplex 0 -petscspace_poly_tensor -dm_plex_convert_type p4est -dm_forest_minimum_refinement 0 -dm_forest_initial_refinement 2 -dm_forest_maximum_refinement 4 -dm_p4est_refine_pattern hash
1878c4762a1bSJed Brown     nsize: 4
1879c4762a1bSJed Brown     TODO: identical machine two runs produce slightly different solver trackers
1880c4762a1bSJed Brown 
1881c4762a1bSJed Brown   test:
1882c4762a1bSJed Brown     suffix: p4est_convergence_test_1
1883c4762a1bSJed Brown     requires: p4est
1884c4762a1bSJed Brown     args:  -quiet -run_type test -interpolate 1 -petscspace_degree 1 -simplex 0 -petscspace_poly_tensor -dm_plex_convert_type p4est -dm_forest_minimum_refinement 2 -dm_forest_initial_refinement 2 -dm_forest_maximum_refinement 4 -dm_p4est_refine_pattern hash
1885c4762a1bSJed Brown     nsize: 4
1886c4762a1bSJed Brown 
1887c4762a1bSJed Brown   test:
1888c4762a1bSJed Brown     suffix: p4est_convergence_test_2
1889c4762a1bSJed Brown     requires: p4est
1890c4762a1bSJed Brown     args: -quiet -run_type test -interpolate 1 -petscspace_degree 1 -simplex 0 -petscspace_poly_tensor -dm_plex_convert_type p4est -dm_forest_minimum_refinement 3 -dm_forest_initial_refinement 3 -dm_forest_maximum_refinement 5 -dm_p4est_refine_pattern hash
1891c4762a1bSJed Brown 
1892c4762a1bSJed Brown   test:
1893c4762a1bSJed Brown     suffix: p4est_convergence_test_3
1894c4762a1bSJed Brown     requires: p4est
1895c4762a1bSJed Brown     args: -quiet -run_type test -interpolate 1 -petscspace_degree 1 -simplex 0 -petscspace_poly_tensor -dm_plex_convert_type p4est -dm_forest_minimum_refinement 4 -dm_forest_initial_refinement 4 -dm_forest_maximum_refinement 6 -dm_p4est_refine_pattern hash
1896c4762a1bSJed Brown 
1897c4762a1bSJed Brown   test:
1898c4762a1bSJed Brown     suffix: p4est_convergence_test_4
1899c4762a1bSJed Brown     requires: p4est
1900c4762a1bSJed Brown     args: -quiet -run_type test -interpolate 1 -petscspace_degree 1 -simplex 0 -petscspace_poly_tensor -dm_plex_convert_type p4est -dm_forest_minimum_refinement 5 -dm_forest_initial_refinement 5 -dm_forest_maximum_refinement 7 -dm_p4est_refine_pattern hash
1901c4762a1bSJed Brown     timeoutfactor: 5
1902c4762a1bSJed Brown 
1903c4762a1bSJed Brown   # Serial tests with GLVis visualization
1904c4762a1bSJed Brown   test:
1905c4762a1bSJed Brown     suffix: glvis_2d_tet_p1
1906c4762a1bSJed Brown     args: -quiet -run_type test -interpolate 1 -bc_type dirichlet -petscspace_degree 1 -vec_view glvis: -f ${wPETSC_DIR}/share/petsc/datafiles/meshes/square_periodic.msh -dm_plex_gmsh_periodic 0
1907c4762a1bSJed Brown   test:
1908c4762a1bSJed Brown     suffix: glvis_2d_tet_p2
1909c4762a1bSJed Brown     args: -quiet -run_type test -interpolate 1 -bc_type dirichlet -petscspace_degree 2 -vec_view glvis: -f ${wPETSC_DIR}/share/petsc/datafiles/meshes/square_periodic.msh -dm_plex_gmsh_periodic 0
1910c4762a1bSJed Brown   test:
1911c4762a1bSJed Brown     suffix: glvis_2d_hex_p1
1912c4762a1bSJed Brown     args: -quiet -run_type test -interpolate 1 -bc_type dirichlet -petscspace_degree 1 -vec_view glvis: -simplex 0 -dm_refine 1
1913c4762a1bSJed Brown   test:
1914c4762a1bSJed Brown     suffix: glvis_2d_hex_p2
1915c4762a1bSJed Brown     args: -quiet -run_type test -interpolate 1 -bc_type dirichlet -petscspace_degree 2 -vec_view glvis: -simplex 0 -dm_refine 1
1916c4762a1bSJed Brown   test:
1917c4762a1bSJed Brown     suffix: glvis_2d_hex_p2_p4est
1918c4762a1bSJed Brown     requires: p4est
1919c4762a1bSJed Brown     args: -quiet -run_type test -interpolate 1 -bc_type dirichlet -petscspace_degree 2 -vec_view glvis: -simplex 0 -dm_plex_convert_type p4est -dm_forest_minimum_refinement 0 -dm_forest_initial_refinement 1 -dm_forest_maximum_refinement 4 -dm_p4est_refine_pattern hash -cells 2,2 -viewer_glvis_dm_plex_enable_ncmesh
1920c4762a1bSJed Brown   test:
1921c4762a1bSJed Brown     suffix: glvis_2d_tet_p0
1922c4762a1bSJed Brown     args: -run_type exact  -interpolate 1 -guess_vec_view glvis: -nonzero_initial_guess 1 -f ${wPETSC_DIR}/share/petsc/datafiles/meshes/square_periodic.msh -petscspace_degree 0
1923c4762a1bSJed Brown   test:
1924c4762a1bSJed Brown     suffix: glvis_2d_hex_p0
1925c4762a1bSJed Brown     args: -run_type exact  -interpolate 1 -guess_vec_view glvis: -nonzero_initial_guess 1 -cells 5,7  -simplex 0 -petscspace_degree 0
1926c4762a1bSJed Brown 
1927c4762a1bSJed Brown   # PCHPDDM tests
1928c4762a1bSJed Brown   testset:
1929c4762a1bSJed Brown     nsize: 4
1930c4762a1bSJed Brown     requires: hpddm slepc !single
1931c4762a1bSJed Brown     args: -run_type test -run_test_check_ksp -quiet -petscspace_degree 1 -interpolate 1 -petscpartitioner_type simple -bc_type none -simplex 0 -pc_type hpddm -pc_hpddm_levels_1_sub_pc_type lu -pc_hpddm_levels_1_eps_nev 2 -pc_hpddm_coarse_p 1 -pc_hpddm_coarse_pc_type svd -ksp_rtol 1.e-10 -pc_hpddm_levels_1_st_pc_factor_shift_type INBLOCKS -ksp_converged_reason
1932c4762a1bSJed Brown     test:
1933c4762a1bSJed Brown       suffix: quad_singular_hpddm
1934c4762a1bSJed Brown       args: -cells 6,7
1935c4762a1bSJed Brown     test:
1936c4762a1bSJed Brown       requires: p4est
1937c4762a1bSJed Brown       suffix: p4est_singular_2d_hpddm
1938c4762a1bSJed Brown       args: -dm_plex_convert_type p4est -dm_forest_minimum_refinement 1 -dm_forest_initial_refinement 3 -dm_forest_maximum_refinement 3
1939c4762a1bSJed Brown     test:
1940c4762a1bSJed Brown       requires: p4est
1941c4762a1bSJed Brown       suffix: p4est_nc_singular_2d_hpddm
1942c4762a1bSJed Brown       args: -dm_plex_convert_type p4est -dm_forest_minimum_refinement 1 -dm_forest_initial_refinement 1 -dm_forest_maximum_refinement 3 -dm_p4est_refine_pattern hash
1943c4762a1bSJed Brown   testset:
1944c4762a1bSJed Brown     nsize: 4
1945c4762a1bSJed Brown     requires: hpddm slepc triangle !single
1946c4762a1bSJed Brown     args: -run_type full -petscpartitioner_type simple -dm_refine 2 -bc_type dirichlet -interpolate 1 -petscspace_degree 2 -ksp_type gmres -ksp_gmres_restart 100 -pc_type hpddm -snes_monitor_short -ksp_monitor_short -snes_converged_reason ::ascii_info_detail -ksp_converged_reason -snes_view -show_solution 0 -pc_type hpddm -pc_hpddm_levels_1_sub_pc_type lu -pc_hpddm_levels_1_eps_nev 4 -pc_hpddm_coarse_p 2 -pc_hpddm_coarse_pc_type redundant -ksp_rtol 1.e-1
1947c4762a1bSJed Brown     test:
1948c4762a1bSJed Brown       args: -pc_hpddm_coarse_mat_type baij -options_left no
1949c4762a1bSJed Brown       suffix: tri_hpddm_reuse_baij
1950c4762a1bSJed Brown     test:
1951c4762a1bSJed Brown       requires: !complex
1952c4762a1bSJed Brown       suffix: tri_hpddm_reuse
1953c4762a1bSJed Brown   testset:
1954c4762a1bSJed Brown     nsize: 4
1955c4762a1bSJed Brown     requires: hpddm slepc !single
1956c4762a1bSJed Brown     args: -run_type full -petscpartitioner_type simple -cells 7,5 -dm_refine 2 -simplex 0 -bc_type dirichlet -interpolate 1 -petscspace_degree 2 -ksp_type gmres -ksp_gmres_restart 100 -pc_type hpddm -snes_monitor_short -ksp_monitor_short -snes_converged_reason ::ascii_info_detail -ksp_converged_reason -snes_view -show_solution 0 -pc_type hpddm -pc_hpddm_levels_1_sub_pc_type lu -pc_hpddm_levels_1_eps_nev 4 -pc_hpddm_coarse_p 2 -pc_hpddm_coarse_pc_type redundant -ksp_rtol 1.e-1
1957c4762a1bSJed Brown     test:
1958c4762a1bSJed Brown       args: -pc_hpddm_coarse_mat_type baij -options_left no
1959c4762a1bSJed Brown       suffix: quad_hpddm_reuse_baij
1960c4762a1bSJed Brown     test:
1961c4762a1bSJed Brown       requires: !complex
1962c4762a1bSJed Brown       suffix: quad_hpddm_reuse
1963c4762a1bSJed Brown   testset:
1964c4762a1bSJed Brown     nsize: 4
1965c4762a1bSJed Brown     requires: hpddm slepc !single
1966c4762a1bSJed Brown     args: -run_type full -petscpartitioner_type simple -cells 7,5 -dm_refine 2 -simplex 0 -bc_type dirichlet -interpolate 1 -petscspace_degree 1 -ksp_type gmres -ksp_gmres_restart 100 -pc_type hpddm -snes_monitor_short -ksp_monitor_short -snes_converged_reason ::ascii_info_detail -ksp_converged_reason -snes_view -show_solution 0 -pc_type hpddm -pc_hpddm_levels_1_sub_pc_type lu -pc_hpddm_levels_1_eps_threshold 0.1 -pc_hpddm_coarse_p 2 -pc_hpddm_coarse_pc_type redundant -ksp_rtol 1.e-1
1967c4762a1bSJed Brown     test:
1968c4762a1bSJed Brown       args: -pc_hpddm_coarse_mat_type baij -options_left no
1969c4762a1bSJed Brown       suffix: quad_hpddm_reuse_threshold_baij
1970c4762a1bSJed Brown     test:
1971c4762a1bSJed Brown       requires: !complex
1972c4762a1bSJed Brown       suffix: quad_hpddm_reuse_threshold
1973c4762a1bSJed Brown   testset:
1974c4762a1bSJed Brown     nsize: 4
1975c4762a1bSJed Brown     requires: hpddm slepc parmetis !single
1976117ef88eSStefano Zampini     filter: sed -e "s/linear solver iterations=17/linear solver iterations=16/g"
1977117ef88eSStefano Zampini     args: -run_type full -petscpartitioner_type parmetis -dm_refine 3 -bc_type dirichlet -interpolate 1 -petscspace_degree 1 -ksp_type gmres -ksp_gmres_restart 100 -pc_type hpddm -snes_monitor_short -snes_converged_reason ::ascii_info_detail -snes_view -show_solution 0 -pc_type hpddm -pc_hpddm_levels_1_sub_pc_type icc -pc_hpddm_levels_1_eps_nev 20 -pc_hpddm_coarse_p 2 -pc_hpddm_coarse_pc_type redundant -ksp_rtol 1.e-10 -f ${PETSC_DIR}/share/petsc/datafiles/meshes/square_periodic.msh -pc_hpddm_levels_1_sub_pc_factor_levels 3 -variable_coefficient circle -dm_plex_gmsh_periodic 0
1978c4762a1bSJed Brown     test:
1979c4762a1bSJed Brown       args: -pc_hpddm_coarse_mat_type baij -options_left no
1980*6ba0327bSPierre Jolivet       filter: grep -v "      total: nonzeros=" | grep -v "      rows=" | sed -e "s/total number of linear solver iterations=1[5-7]/total number of linear solver iterations=16/g"
1981c4762a1bSJed Brown       suffix: tri_parmetis_hpddm_baij
1982c4762a1bSJed Brown     test:
1983*6ba0327bSPierre Jolivet       filter: grep -v "      total: nonzeros=" | grep -v "      rows=" | sed -e "s/total number of linear solver iterations=1[5-7]/total number of linear solver iterations=16/g"
1984c4762a1bSJed Brown       requires: !complex
1985c4762a1bSJed Brown       suffix: tri_parmetis_hpddm
1986d6837840SMatthew G. Knepley 
1987d6837840SMatthew G. Knepley   # 2D serial P1 tests for adaptive MG
1988d6837840SMatthew G. Knepley   test:
1989d6837840SMatthew G. Knepley     suffix: 2d_p1_adaptmg_0
1990d6837840SMatthew G. Knepley     requires: triangle bamg
1991d6837840SMatthew G. Knepley     args: -dm_refine_hierarchy 3 -cells 4,4 -interpolate -bc_type dirichlet -petscspace_degree 1 \
1992d6837840SMatthew G. Knepley           -variable_coefficient checkerboard_0 -mat_petscspace_degree 0 -div 16 -k 3 \
1993d6837840SMatthew G. Knepley           -snes_max_it 1 -ksp_converged_reason \
1994d6837840SMatthew G. Knepley           -ksp_rtol 1e-8 -pc_type mg
1995d6837840SMatthew G. Knepley   # -ksp_monitor_true_residual -ksp_converged_reason -mg_levels_ksp_monitor_true_residual -pc_mg_mesp_monitor -dm_adapt_interp_view_fine draw -dm_adapt_interp_view_coarse draw -draw_pause 1
1996d6837840SMatthew G. Knepley   test:
1997d6837840SMatthew G. Knepley     suffix: 2d_p1_adaptmg_1
1998d6837840SMatthew G. Knepley     requires: triangle bamg
1999d6837840SMatthew G. Knepley     args: -dm_refine_hierarchy 3 -cells 4,4 -interpolate -bc_type dirichlet -petscspace_degree 1 \
2000d6837840SMatthew G. Knepley           -variable_coefficient checkerboard_0 -mat_petscspace_degree 0 -div 16 -k 3 \
2001d6837840SMatthew G. Knepley           -snes_max_it 1 -ksp_converged_reason \
2002d6837840SMatthew G. Knepley           -ksp_rtol 1e-8 -pc_type mg -pc_mg_galerkin -pc_mg_adapt_interp -pc_mg_adapt_interp_coarse_space eigenvector -pc_mg_adapt_interp_n 1 \
2003d6837840SMatthew G. Knepley             -pc_mg_mesp_ksp_type richardson -pc_mg_mesp_ksp_richardson_self_scale -pc_mg_mesp_ksp_max_it 100 -pc_mg_mesp_pc_type none
2004d6837840SMatthew G. Knepley 
2005c4762a1bSJed Brown TEST*/
2006