xref: /petsc/src/snes/tutorials/ex12.c (revision 48a46eb9bd028bec07ec0f396b1a3abb43f14558)
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 
239371c9d4SSatish Balay typedef enum {
249371c9d4SSatish Balay   NEUMANN,
259371c9d4SSatish Balay   DIRICHLET,
269371c9d4SSatish Balay   NONE
279371c9d4SSatish Balay } BCType;
289371c9d4SSatish Balay typedef enum {
299371c9d4SSatish Balay   RUN_FULL,
309371c9d4SSatish Balay   RUN_EXACT,
319371c9d4SSatish Balay   RUN_TEST,
329371c9d4SSatish Balay   RUN_PERF
339371c9d4SSatish Balay } RunType;
349371c9d4SSatish Balay typedef enum {
359371c9d4SSatish Balay   COEFF_NONE,
369371c9d4SSatish Balay   COEFF_ANALYTIC,
379371c9d4SSatish Balay   COEFF_FIELD,
389371c9d4SSatish Balay   COEFF_NONLINEAR,
399371c9d4SSatish Balay   COEFF_BALL,
409371c9d4SSatish Balay   COEFF_CROSS,
419371c9d4SSatish Balay   COEFF_CHECKERBOARD_0,
429371c9d4SSatish Balay   COEFF_CHECKERBOARD_1
439371c9d4SSatish Balay } CoeffType;
44c4762a1bSJed Brown 
45c4762a1bSJed Brown typedef struct {
46c4762a1bSJed Brown   RunType   runType;    /* Whether to run tests, or solve the full problem */
47c4762a1bSJed Brown   PetscBool jacobianMF; /* Whether to calculate the Jacobian action on the fly */
48c4762a1bSJed Brown   PetscBool showInitial, showSolution, restart, quiet, nonzInit;
49c4762a1bSJed Brown   /* Problem definition */
50c4762a1bSJed Brown   BCType    bcType;
51c4762a1bSJed Brown   CoeffType variableCoefficient;
52c4762a1bSJed Brown   PetscErrorCode (**exactFuncs)(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt Nc, PetscScalar *u, void *ctx);
53c4762a1bSJed Brown   PetscBool fieldBC;
549371c9d4SSatish Balay   void (**exactFields)(PetscInt, PetscInt, PetscInt, const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], const PetscInt[], const PetscInt[], const PetscScalar[], const PetscScalar[], const PetscScalar[], PetscReal, const PetscReal[], PetscInt, const PetscScalar[], PetscScalar[]);
55c4762a1bSJed Brown   PetscBool bdIntegral; /* Compute the integral of the solution on the boundary */
56d6837840SMatthew G. Knepley   /* Reproducing tests from SISC 40(3), pp. A1473-A1493, 2018 */
57d6837840SMatthew G. Knepley   PetscInt  div;   /* Number of divisions */
58d6837840SMatthew G. Knepley   PetscInt  k;     /* Parameter for checkerboard coefficient */
59d6837840SMatthew G. Knepley   PetscInt *kgrid; /* Random parameter grid */
6030602db0SMatthew G. Knepley   PetscBool rand;  /* Make random assignments */
61c4762a1bSJed Brown   /* Solver */
62c4762a1bSJed Brown   PC        pcmg;     /* This is needed for error monitoring */
63c4762a1bSJed Brown   PetscBool checkksp; /* Whether to check the KSPSolve for runType == RUN_TEST */
64c4762a1bSJed Brown } AppCtx;
65c4762a1bSJed Brown 
669371c9d4SSatish Balay static PetscErrorCode zero(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt Nc, PetscScalar *u, void *ctx) {
67c4762a1bSJed Brown   u[0] = 0.0;
68c4762a1bSJed Brown   return 0;
69c4762a1bSJed Brown }
70c4762a1bSJed Brown 
719371c9d4SSatish Balay static PetscErrorCode ecks(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt Nc, PetscScalar *u, void *ctx) {
72c4762a1bSJed Brown   u[0] = x[0];
73c4762a1bSJed Brown   return 0;
74c4762a1bSJed Brown }
75c4762a1bSJed Brown 
76c4762a1bSJed Brown /*
77c4762a1bSJed Brown   In 2D for Dirichlet conditions, we use exact solution:
78c4762a1bSJed Brown 
79c4762a1bSJed Brown     u = x^2 + y^2
80c4762a1bSJed Brown     f = 4
81c4762a1bSJed Brown 
82c4762a1bSJed Brown   so that
83c4762a1bSJed Brown 
84c4762a1bSJed Brown     -\Delta u + f = -4 + 4 = 0
85c4762a1bSJed Brown 
86c4762a1bSJed Brown   For Neumann conditions, we have
87c4762a1bSJed Brown 
88c4762a1bSJed Brown     -\nabla u \cdot -\hat y |_{y=0} =  (2y)|_{y=0} =  0 (bottom)
89c4762a1bSJed Brown     -\nabla u \cdot  \hat y |_{y=1} = -(2y)|_{y=1} = -2 (top)
90c4762a1bSJed Brown     -\nabla u \cdot -\hat x |_{x=0} =  (2x)|_{x=0} =  0 (left)
91c4762a1bSJed Brown     -\nabla u \cdot  \hat x |_{x=1} = -(2x)|_{x=1} = -2 (right)
92c4762a1bSJed Brown 
93c4762a1bSJed Brown   Which we can express as
94c4762a1bSJed Brown 
95c4762a1bSJed Brown     \nabla u \cdot  \hat n|_\Gamma = {2 x, 2 y} \cdot \hat n = 2 (x + y)
96c4762a1bSJed Brown 
97c4762a1bSJed Brown   The boundary integral of this solution is (assuming we are not orienting the edges)
98c4762a1bSJed Brown 
99c4762a1bSJed 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
100c4762a1bSJed Brown */
1019371c9d4SSatish Balay static PetscErrorCode quadratic_u_2d(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt Nc, PetscScalar *u, void *ctx) {
102c4762a1bSJed Brown   *u = x[0] * x[0] + x[1] * x[1];
103c4762a1bSJed Brown   return 0;
104c4762a1bSJed Brown }
105c4762a1bSJed Brown 
1069371c9d4SSatish Balay static void quadratic_u_field_2d(PetscInt dim, PetscInt Nf, PetscInt NfAux, const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar uexact[]) {
107c4762a1bSJed Brown   uexact[0] = a[0];
108c4762a1bSJed Brown }
109c4762a1bSJed Brown 
1109371c9d4SSatish Balay static PetscErrorCode ball_u_2d(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt Nc, PetscScalar *u, void *ctx) {
111c4762a1bSJed Brown   const PetscReal alpha   = 500.;
112c4762a1bSJed Brown   const PetscReal radius2 = PetscSqr(0.15);
113c4762a1bSJed Brown   const PetscReal r2      = PetscSqr(x[0] - 0.5) + PetscSqr(x[1] - 0.5);
114c4762a1bSJed Brown   const PetscReal xi      = alpha * (radius2 - r2);
115c4762a1bSJed Brown 
116c4762a1bSJed Brown   *u = PetscTanhScalar(xi) + 1.0;
117c4762a1bSJed Brown   return 0;
118c4762a1bSJed Brown }
119c4762a1bSJed Brown 
1209371c9d4SSatish Balay static PetscErrorCode cross_u_2d(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt Nc, PetscScalar *u, void *ctx) {
121c4762a1bSJed Brown   const PetscReal alpha = 50 * 4;
122c4762a1bSJed Brown   const PetscReal xy    = (x[0] - 0.5) * (x[1] - 0.5);
123c4762a1bSJed Brown 
124c4762a1bSJed Brown   *u = PetscSinReal(alpha * xy) * (alpha * PetscAbsReal(xy) < 2 * PETSC_PI ? 1 : 0.01);
125c4762a1bSJed Brown   return 0;
126c4762a1bSJed Brown }
127c4762a1bSJed Brown 
1289371c9d4SSatish Balay static void f0_u(PetscInt dim, PetscInt Nf, PetscInt NfAux, const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f0[]) {
129c4762a1bSJed Brown   f0[0] = 4.0;
130c4762a1bSJed Brown }
131c4762a1bSJed Brown 
1329371c9d4SSatish Balay static void f0_ball_u(PetscInt dim, PetscInt Nf, PetscInt NfAux, const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f0[]) {
1338d1b37daSJoe Wallwork   PetscInt        d;
1348d1b37daSJoe Wallwork   const PetscReal alpha = 500., radius2 = PetscSqr(0.15);
1358d1b37daSJoe Wallwork   PetscReal       r2, xi;
136c4762a1bSJed Brown 
1378d1b37daSJoe Wallwork   for (d = 0, r2 = 0.0; d < dim; ++d) r2 += PetscSqr(x[d] - 0.5);
1388d1b37daSJoe Wallwork   xi    = alpha * (radius2 - r2);
1398d1b37daSJoe Wallwork   f0[0] = (-2.0 * dim * alpha - 8.0 * PetscSqr(alpha) * r2 * PetscTanhReal(xi)) * PetscSqr(1.0 / PetscCoshReal(xi));
140c4762a1bSJed Brown }
141c4762a1bSJed Brown 
1429371c9d4SSatish Balay static void f0_cross_u_2d(PetscInt dim, PetscInt Nf, PetscInt NfAux, const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f0[]) {
143c4762a1bSJed Brown   const PetscReal alpha = 50 * 4;
144c4762a1bSJed Brown   const PetscReal xy    = (x[0] - 0.5) * (x[1] - 0.5);
145c4762a1bSJed Brown 
146c4762a1bSJed Brown   f0[0] = PetscSinReal(alpha * xy) * (alpha * PetscAbsReal(xy) < 2 * PETSC_PI ? 1 : 0.01);
147c4762a1bSJed Brown }
148c4762a1bSJed Brown 
1499371c9d4SSatish Balay static void f0_checkerboard_0_u(PetscInt dim, PetscInt Nf, PetscInt NfAux, const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f0[]) {
150d6837840SMatthew G. Knepley   f0[0] = -20.0 * PetscExpReal(-(PetscSqr(x[0] - 0.5) + PetscSqr(x[1] - 0.5)));
151d6837840SMatthew G. Knepley }
152d6837840SMatthew G. Knepley 
1539371c9d4SSatish Balay static void f0_bd_u(PetscInt dim, PetscInt Nf, PetscInt NfAux, const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], PetscReal t, const PetscReal x[], const PetscReal n[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f0[]) {
154c4762a1bSJed Brown   PetscInt d;
155c4762a1bSJed Brown   for (d = 0, f0[0] = 0.0; d < dim; ++d) f0[0] += -n[d] * 2.0 * x[d];
156c4762a1bSJed Brown }
157c4762a1bSJed Brown 
158c4762a1bSJed Brown /* gradU[comp*dim+d] = {u_x, u_y} or {u_x, u_y, u_z} */
1599371c9d4SSatish Balay static void f1_u(PetscInt dim, PetscInt Nf, PetscInt NfAux, const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f1[]) {
160c4762a1bSJed Brown   PetscInt d;
161c4762a1bSJed Brown   for (d = 0; d < dim; ++d) f1[d] = u_x[d];
162c4762a1bSJed Brown }
163c4762a1bSJed Brown 
164c4762a1bSJed Brown /* < \nabla v, \nabla u + {\nabla u}^T >
165c4762a1bSJed Brown    This just gives \nabla u, give the perdiagonal for the transpose */
1669371c9d4SSatish Balay static void g3_uu(PetscInt dim, PetscInt Nf, PetscInt NfAux, const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], PetscReal t, PetscReal u_tShift, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar g3[]) {
167c4762a1bSJed Brown   PetscInt d;
168c4762a1bSJed Brown   for (d = 0; d < dim; ++d) g3[d * dim + d] = 1.0;
169c4762a1bSJed Brown }
170c4762a1bSJed Brown 
171c4762a1bSJed Brown /*
172c4762a1bSJed Brown   In 2D for x periodicity and y Dirichlet conditions, we use exact solution:
173c4762a1bSJed Brown 
174c4762a1bSJed Brown     u = sin(2 pi x)
175c4762a1bSJed Brown     f = -4 pi^2 sin(2 pi x)
176c4762a1bSJed Brown 
177c4762a1bSJed Brown   so that
178c4762a1bSJed Brown 
179c4762a1bSJed Brown     -\Delta u + f = 4 pi^2 sin(2 pi x) - 4 pi^2 sin(2 pi x) = 0
180c4762a1bSJed Brown */
1819371c9d4SSatish Balay static PetscErrorCode xtrig_u_2d(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt Nc, PetscScalar *u, void *ctx) {
182c4762a1bSJed Brown   *u = PetscSinReal(2.0 * PETSC_PI * x[0]);
183c4762a1bSJed Brown   return 0;
184c4762a1bSJed Brown }
185c4762a1bSJed Brown 
1869371c9d4SSatish Balay static void f0_xtrig_u(PetscInt dim, PetscInt Nf, PetscInt NfAux, const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f0[]) {
187c4762a1bSJed Brown   f0[0] = -4.0 * PetscSqr(PETSC_PI) * PetscSinReal(2.0 * PETSC_PI * x[0]);
188c4762a1bSJed Brown }
189c4762a1bSJed Brown 
190c4762a1bSJed Brown /*
191c4762a1bSJed Brown   In 2D for x-y periodicity, we use exact solution:
192c4762a1bSJed Brown 
193c4762a1bSJed Brown     u = sin(2 pi x) sin(2 pi y)
194c4762a1bSJed Brown     f = -8 pi^2 sin(2 pi x)
195c4762a1bSJed Brown 
196c4762a1bSJed Brown   so that
197c4762a1bSJed Brown 
198c4762a1bSJed 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
199c4762a1bSJed Brown */
2009371c9d4SSatish Balay static PetscErrorCode xytrig_u_2d(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt Nc, PetscScalar *u, void *ctx) {
201c4762a1bSJed Brown   *u = PetscSinReal(2.0 * PETSC_PI * x[0]) * PetscSinReal(2.0 * PETSC_PI * x[1]);
202c4762a1bSJed Brown   return 0;
203c4762a1bSJed Brown }
204c4762a1bSJed Brown 
2059371c9d4SSatish Balay static void f0_xytrig_u(PetscInt dim, PetscInt Nf, PetscInt NfAux, const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f0[]) {
206c4762a1bSJed Brown   f0[0] = -8.0 * PetscSqr(PETSC_PI) * PetscSinReal(2.0 * PETSC_PI * x[0]);
207c4762a1bSJed Brown }
208c4762a1bSJed Brown 
209c4762a1bSJed Brown /*
210c4762a1bSJed Brown   In 2D for Dirichlet conditions with a variable coefficient, we use exact solution:
211c4762a1bSJed Brown 
212c4762a1bSJed Brown     u  = x^2 + y^2
213c4762a1bSJed Brown     f  = 6 (x + y)
214c4762a1bSJed Brown     nu = (x + y)
215c4762a1bSJed Brown 
216c4762a1bSJed Brown   so that
217c4762a1bSJed Brown 
218c4762a1bSJed Brown     -\div \nu \grad u + f = -6 (x + y) + 6 (x + y) = 0
219c4762a1bSJed Brown */
2209371c9d4SSatish Balay static PetscErrorCode nu_2d(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt Nc, PetscScalar *u, void *ctx) {
221c4762a1bSJed Brown   *u = x[0] + x[1];
222c4762a1bSJed Brown   return 0;
223c4762a1bSJed Brown }
224c4762a1bSJed Brown 
2259371c9d4SSatish Balay static PetscErrorCode checkerboardCoeff(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt Nc, PetscScalar *u, void *ctx) {
226d6837840SMatthew G. Knepley   AppCtx  *user = (AppCtx *)ctx;
227d6837840SMatthew G. Knepley   PetscInt div  = user->div;
228d6837840SMatthew G. Knepley   PetscInt k    = user->k;
229d6837840SMatthew G. Knepley   PetscInt mask = 0, ind = 0, d;
230d6837840SMatthew G. Knepley 
231d6837840SMatthew G. Knepley   PetscFunctionBeginUser;
232d6837840SMatthew G. Knepley   for (d = 0; d < dim; ++d) mask = (mask + (PetscInt)(x[d] * div)) % 2;
233d6837840SMatthew G. Knepley   if (user->kgrid) {
234d6837840SMatthew G. Knepley     for (d = 0; d < dim; ++d) {
235d6837840SMatthew G. Knepley       if (d > 0) ind *= dim;
236d6837840SMatthew G. Knepley       ind += (PetscInt)(x[d] * div);
237d6837840SMatthew G. Knepley     }
238d6837840SMatthew G. Knepley     k = user->kgrid[ind];
239d6837840SMatthew G. Knepley   }
240d6837840SMatthew G. Knepley   u[0] = mask ? 1.0 : PetscPowRealInt(10.0, -k);
241d6837840SMatthew G. Knepley   PetscFunctionReturn(0);
242d6837840SMatthew G. Knepley }
243d6837840SMatthew G. Knepley 
2449371c9d4SSatish Balay void f0_analytic_u(PetscInt dim, PetscInt Nf, PetscInt NfAux, const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f0[]) {
245c4762a1bSJed Brown   f0[0] = 6.0 * (x[0] + x[1]);
246c4762a1bSJed Brown }
247c4762a1bSJed Brown 
248c4762a1bSJed Brown /* gradU[comp*dim+d] = {u_x, u_y} or {u_x, u_y, u_z} */
2499371c9d4SSatish Balay void f1_analytic_u(PetscInt dim, PetscInt Nf, PetscInt NfAux, const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f1[]) {
250c4762a1bSJed Brown   PetscInt d;
251c4762a1bSJed Brown   for (d = 0; d < dim; ++d) f1[d] = (x[0] + x[1]) * u_x[d];
252c4762a1bSJed Brown }
253c4762a1bSJed Brown 
2549371c9d4SSatish Balay void f1_field_u(PetscInt dim, PetscInt Nf, PetscInt NfAux, const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f1[]) {
255c4762a1bSJed Brown   PetscInt d;
256c4762a1bSJed Brown   for (d = 0; d < dim; ++d) f1[d] = a[0] * u_x[d];
257c4762a1bSJed Brown }
258c4762a1bSJed Brown 
259c4762a1bSJed Brown /* < \nabla v, \nabla u + {\nabla u}^T >
260c4762a1bSJed Brown    This just gives \nabla u, give the perdiagonal for the transpose */
2619371c9d4SSatish Balay void g3_analytic_uu(PetscInt dim, PetscInt Nf, PetscInt NfAux, const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], PetscReal t, PetscReal u_tShift, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar g3[]) {
262c4762a1bSJed Brown   PetscInt d;
263c4762a1bSJed Brown   for (d = 0; d < dim; ++d) g3[d * dim + d] = x[0] + x[1];
264c4762a1bSJed Brown }
265c4762a1bSJed Brown 
2669371c9d4SSatish Balay void g3_field_uu(PetscInt dim, PetscInt Nf, PetscInt NfAux, const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], PetscReal t, PetscReal u_tShift, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar g3[]) {
267c4762a1bSJed Brown   PetscInt d;
268c4762a1bSJed Brown   for (d = 0; d < dim; ++d) g3[d * dim + d] = a[0];
269c4762a1bSJed Brown }
270c4762a1bSJed Brown 
271c4762a1bSJed Brown /*
272c4762a1bSJed Brown   In 2D for Dirichlet conditions with a nonlinear coefficient (p-Laplacian with p = 4), we use exact solution:
273c4762a1bSJed Brown 
274c4762a1bSJed Brown     u  = x^2 + y^2
275c4762a1bSJed Brown     f  = 16 (x^2 + y^2)
276c4762a1bSJed Brown     nu = 1/2 |grad u|^2
277c4762a1bSJed Brown 
278c4762a1bSJed Brown   so that
279c4762a1bSJed Brown 
280c4762a1bSJed Brown     -\div \nu \grad u + f = -16 (x^2 + y^2) + 16 (x^2 + y^2) = 0
281c4762a1bSJed Brown */
2829371c9d4SSatish Balay void f0_analytic_nonlinear_u(PetscInt dim, PetscInt Nf, PetscInt NfAux, const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f0[]) {
283c4762a1bSJed Brown   f0[0] = 16.0 * (x[0] * x[0] + x[1] * x[1]);
284c4762a1bSJed Brown }
285c4762a1bSJed Brown 
286c4762a1bSJed Brown /* gradU[comp*dim+d] = {u_x, u_y} or {u_x, u_y, u_z} */
2879371c9d4SSatish Balay void f1_analytic_nonlinear_u(PetscInt dim, PetscInt Nf, PetscInt NfAux, const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f1[]) {
288c4762a1bSJed Brown   PetscScalar nu = 0.0;
289c4762a1bSJed Brown   PetscInt    d;
290c4762a1bSJed Brown   for (d = 0; d < dim; ++d) nu += u_x[d] * u_x[d];
291c4762a1bSJed Brown   for (d = 0; d < dim; ++d) f1[d] = 0.5 * nu * u_x[d];
292c4762a1bSJed Brown }
293c4762a1bSJed Brown 
294c4762a1bSJed Brown /*
295c4762a1bSJed Brown   grad (u + eps w) - grad u = eps grad w
296c4762a1bSJed Brown 
297c4762a1bSJed Brown   1/2 |grad (u + eps w)|^2 grad (u + eps w) - 1/2 |grad u|^2 grad u
298c4762a1bSJed Brown = 1/2 (|grad u|^2 + 2 eps <grad u,grad w>) (grad u + eps grad w) - 1/2 |grad u|^2 grad u
299c4762a1bSJed Brown = 1/2 (eps |grad u|^2 grad w + 2 eps <grad u,grad w> grad u)
300c4762a1bSJed Brown = eps (1/2 |grad u|^2 grad w + grad u <grad u,grad w>)
301c4762a1bSJed Brown */
3029371c9d4SSatish Balay void g3_analytic_nonlinear_uu(PetscInt dim, PetscInt Nf, PetscInt NfAux, const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], PetscReal t, PetscReal u_tShift, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar g3[]) {
303c4762a1bSJed Brown   PetscScalar nu = 0.0;
304c4762a1bSJed Brown   PetscInt    d, e;
305c4762a1bSJed Brown   for (d = 0; d < dim; ++d) nu += u_x[d] * u_x[d];
306c4762a1bSJed Brown   for (d = 0; d < dim; ++d) {
307c4762a1bSJed Brown     g3[d * dim + d] = 0.5 * nu;
3089371c9d4SSatish Balay     for (e = 0; e < dim; ++e) { g3[d * dim + e] += u_x[d] * u_x[e]; }
309c4762a1bSJed Brown   }
310c4762a1bSJed Brown }
311c4762a1bSJed Brown 
312c4762a1bSJed Brown /*
313c4762a1bSJed Brown   In 3D for Dirichlet conditions we use exact solution:
314c4762a1bSJed Brown 
315c4762a1bSJed Brown     u = 2/3 (x^2 + y^2 + z^2)
316c4762a1bSJed Brown     f = 4
317c4762a1bSJed Brown 
318c4762a1bSJed Brown   so that
319c4762a1bSJed Brown 
320c4762a1bSJed Brown     -\Delta u + f = -2/3 * 6 + 4 = 0
321c4762a1bSJed Brown 
322c4762a1bSJed Brown   For Neumann conditions, we have
323c4762a1bSJed Brown 
324c4762a1bSJed Brown     -\nabla u \cdot -\hat z |_{z=0} =  (2z)|_{z=0} =  0 (bottom)
325c4762a1bSJed Brown     -\nabla u \cdot  \hat z |_{z=1} = -(2z)|_{z=1} = -2 (top)
326c4762a1bSJed Brown     -\nabla u \cdot -\hat y |_{y=0} =  (2y)|_{y=0} =  0 (front)
327c4762a1bSJed Brown     -\nabla u \cdot  \hat y |_{y=1} = -(2y)|_{y=1} = -2 (back)
328c4762a1bSJed Brown     -\nabla u \cdot -\hat x |_{x=0} =  (2x)|_{x=0} =  0 (left)
329c4762a1bSJed Brown     -\nabla u \cdot  \hat x |_{x=1} = -(2x)|_{x=1} = -2 (right)
330c4762a1bSJed Brown 
331c4762a1bSJed Brown   Which we can express as
332c4762a1bSJed Brown 
333c4762a1bSJed Brown     \nabla u \cdot  \hat n|_\Gamma = {2 x, 2 y, 2z} \cdot \hat n = 2 (x + y + z)
334c4762a1bSJed Brown */
3359371c9d4SSatish Balay static PetscErrorCode quadratic_u_3d(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt Nc, PetscScalar *u, void *ctx) {
336c4762a1bSJed Brown   *u = 2.0 * (x[0] * x[0] + x[1] * x[1] + x[2] * x[2]) / 3.0;
337c4762a1bSJed Brown   return 0;
338c4762a1bSJed Brown }
339c4762a1bSJed Brown 
3409371c9d4SSatish Balay static PetscErrorCode ball_u_3d(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt Nc, PetscScalar *u, void *ctx) {
3418d1b37daSJoe Wallwork   const PetscReal alpha   = 500.;
3428d1b37daSJoe Wallwork   const PetscReal radius2 = PetscSqr(0.15);
3438d1b37daSJoe Wallwork   const PetscReal r2      = PetscSqr(x[0] - 0.5) + PetscSqr(x[1] - 0.5) + PetscSqr(x[2] - 0.5);
3448d1b37daSJoe Wallwork   const PetscReal xi      = alpha * (radius2 - r2);
3458d1b37daSJoe Wallwork 
3468d1b37daSJoe Wallwork   *u = PetscTanhScalar(xi) + 1.0;
3478d1b37daSJoe Wallwork   return 0;
3488d1b37daSJoe Wallwork }
3498d1b37daSJoe Wallwork 
3509371c9d4SSatish Balay static void quadratic_u_field_3d(PetscInt dim, PetscInt Nf, PetscInt NfAux, const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar uexact[]) {
351c4762a1bSJed Brown   uexact[0] = a[0];
352c4762a1bSJed Brown }
353c4762a1bSJed Brown 
3549371c9d4SSatish Balay static PetscErrorCode cross_u_3d(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt Nc, PetscScalar *u, void *ctx) {
3558d1b37daSJoe Wallwork   const PetscReal alpha = 50 * 4;
3568d1b37daSJoe Wallwork   const PetscReal xyz   = (x[0] - 0.5) * (x[1] - 0.5) * (x[2] - 0.5);
3578d1b37daSJoe Wallwork 
3588d1b37daSJoe Wallwork   *u = PetscSinReal(alpha * xyz) * (alpha * PetscAbsReal(xyz) < 2 * PETSC_PI ? (alpha * PetscAbsReal(xyz) > -2 * PETSC_PI ? 1.0 : 0.01) : 0.01);
3598d1b37daSJoe Wallwork   return 0;
3608d1b37daSJoe Wallwork }
3618d1b37daSJoe Wallwork 
3629371c9d4SSatish Balay static void f0_cross_u_3d(PetscInt dim, PetscInt Nf, PetscInt NfAux, const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], PetscReal t, const PetscReal x[], PetscInt numConstants, const PetscScalar constants[], PetscScalar f0[]) {
3638d1b37daSJoe Wallwork   const PetscReal alpha = 50 * 4;
3648d1b37daSJoe Wallwork   const PetscReal xyz   = (x[0] - 0.5) * (x[1] - 0.5) * (x[2] - 0.5);
3658d1b37daSJoe Wallwork 
3668d1b37daSJoe Wallwork   f0[0] = PetscSinReal(alpha * xyz) * (alpha * PetscAbsReal(xyz) < 2 * PETSC_PI ? (alpha * PetscAbsReal(xyz) > -2 * PETSC_PI ? 1.0 : 0.01) : 0.01);
3678d1b37daSJoe Wallwork }
3688d1b37daSJoe Wallwork 
3699371c9d4SSatish Balay static void bd_integral_2d(PetscInt dim, PetscInt Nf, PetscInt NfAux, const PetscInt uOff[], const PetscInt uOff_x[], const PetscScalar u[], const PetscScalar u_t[], const PetscScalar u_x[], const PetscInt aOff[], const PetscInt aOff_x[], const PetscScalar a[], const PetscScalar a_t[], const PetscScalar a_x[], PetscReal t, const PetscReal x[], const PetscReal n[], PetscInt numConstants, const PetscScalar constants[], PetscScalar *uint) {
370c4762a1bSJed Brown   uint[0] = u[0];
371c4762a1bSJed Brown }
372c4762a1bSJed Brown 
3739371c9d4SSatish Balay static PetscErrorCode ProcessOptions(MPI_Comm comm, AppCtx *options) {
374c4762a1bSJed Brown   const char *bcTypes[3]    = {"neumann", "dirichlet", "none"};
375c4762a1bSJed Brown   const char *runTypes[4]   = {"full", "exact", "test", "perf"};
3768d1b37daSJoe Wallwork   const char *coeffTypes[8] = {"none", "analytic", "field", "nonlinear", "ball", "cross", "checkerboard_0", "checkerboard_1"};
37730602db0SMatthew G. Knepley   PetscInt    bc, run, coeff;
378c4762a1bSJed Brown 
379c4762a1bSJed Brown   PetscFunctionBeginUser;
380c4762a1bSJed Brown   options->runType             = RUN_FULL;
381c4762a1bSJed Brown   options->bcType              = DIRICHLET;
382c4762a1bSJed Brown   options->variableCoefficient = COEFF_NONE;
383c4762a1bSJed Brown   options->fieldBC             = PETSC_FALSE;
384c4762a1bSJed Brown   options->jacobianMF          = PETSC_FALSE;
385c4762a1bSJed Brown   options->showInitial         = PETSC_FALSE;
386c4762a1bSJed Brown   options->showSolution        = PETSC_FALSE;
387c4762a1bSJed Brown   options->restart             = PETSC_FALSE;
388c4762a1bSJed Brown   options->quiet               = PETSC_FALSE;
389c4762a1bSJed Brown   options->nonzInit            = PETSC_FALSE;
390c4762a1bSJed Brown   options->bdIntegral          = PETSC_FALSE;
391c4762a1bSJed Brown   options->checkksp            = PETSC_FALSE;
392d6837840SMatthew G. Knepley   options->div                 = 4;
393d6837840SMatthew G. Knepley   options->k                   = 1;
394d6837840SMatthew G. Knepley   options->kgrid               = NULL;
39530602db0SMatthew G. Knepley   options->rand                = PETSC_FALSE;
396c4762a1bSJed Brown 
397d0609cedSBarry Smith   PetscOptionsBegin(comm, "", "Poisson Problem Options", "DMPLEX");
398c4762a1bSJed Brown   run = options->runType;
3999566063dSJacob Faibussowitsch   PetscCall(PetscOptionsEList("-run_type", "The run type", "ex12.c", runTypes, 4, runTypes[options->runType], &run, NULL));
400c4762a1bSJed Brown   options->runType = (RunType)run;
401c4762a1bSJed Brown   bc               = options->bcType;
4029566063dSJacob Faibussowitsch   PetscCall(PetscOptionsEList("-bc_type", "Type of boundary condition", "ex12.c", bcTypes, 3, bcTypes[options->bcType], &bc, NULL));
403c4762a1bSJed Brown   options->bcType = (BCType)bc;
404c4762a1bSJed Brown   coeff           = options->variableCoefficient;
4059566063dSJacob Faibussowitsch   PetscCall(PetscOptionsEList("-variable_coefficient", "Type of variable coefficent", "ex12.c", coeffTypes, 8, coeffTypes[options->variableCoefficient], &coeff, NULL));
406c4762a1bSJed Brown   options->variableCoefficient = (CoeffType)coeff;
407c4762a1bSJed Brown 
4089566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-field_bc", "Use a field representation for the BC", "ex12.c", options->fieldBC, &options->fieldBC, NULL));
4099566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-jacobian_mf", "Calculate the action of the Jacobian on the fly", "ex12.c", options->jacobianMF, &options->jacobianMF, NULL));
4109566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-show_initial", "Output the initial guess for verification", "ex12.c", options->showInitial, &options->showInitial, NULL));
4119566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-show_solution", "Output the solution for verification", "ex12.c", options->showSolution, &options->showSolution, NULL));
4129566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-restart", "Read in the mesh and solution from a file", "ex12.c", options->restart, &options->restart, NULL));
4139566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-quiet", "Don't print any vecs", "ex12.c", options->quiet, &options->quiet, NULL));
4149566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-nonzero_initial_guess", "nonzero initial guess", "ex12.c", options->nonzInit, &options->nonzInit, NULL));
4159566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-bd_integral", "Compute the integral of the solution on the boundary", "ex12.c", options->bdIntegral, &options->bdIntegral, NULL));
416*48a46eb9SPierre Jolivet   if (options->runType == RUN_TEST) PetscCall(PetscOptionsBool("-run_test_check_ksp", "Check solution of KSP", "ex12.c", options->checkksp, &options->checkksp, NULL));
4179566063dSJacob Faibussowitsch   PetscCall(PetscOptionsInt("-div", "The number of division for the checkerboard coefficient", "ex12.c", options->div, &options->div, NULL));
4189566063dSJacob Faibussowitsch   PetscCall(PetscOptionsInt("-k", "The exponent for the checkerboard coefficient", "ex12.c", options->k, &options->k, NULL));
4199566063dSJacob Faibussowitsch   PetscCall(PetscOptionsBool("-k_random", "Assign random k values to checkerboard", "ex12.c", options->rand, &options->rand, NULL));
420d0609cedSBarry Smith   PetscOptionsEnd();
421c4762a1bSJed Brown   PetscFunctionReturn(0);
422c4762a1bSJed Brown }
423c4762a1bSJed Brown 
4249371c9d4SSatish Balay static PetscErrorCode CreateBCLabel(DM dm, const char name[]) {
425408cafa0SMatthew G. Knepley   DM      plex;
426c4762a1bSJed Brown   DMLabel label;
427c4762a1bSJed Brown 
428c4762a1bSJed Brown   PetscFunctionBeginUser;
4299566063dSJacob Faibussowitsch   PetscCall(DMCreateLabel(dm, name));
4309566063dSJacob Faibussowitsch   PetscCall(DMGetLabel(dm, name, &label));
4319566063dSJacob Faibussowitsch   PetscCall(DMConvert(dm, DMPLEX, &plex));
4329566063dSJacob Faibussowitsch   PetscCall(DMPlexMarkBoundaryFaces(plex, 1, label));
4339566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&plex));
434c4762a1bSJed Brown   PetscFunctionReturn(0);
435c4762a1bSJed Brown }
436c4762a1bSJed Brown 
4379371c9d4SSatish Balay static PetscErrorCode CreateMesh(MPI_Comm comm, AppCtx *user, DM *dm) {
438c4762a1bSJed Brown   PetscFunctionBeginUser;
4399566063dSJacob Faibussowitsch   PetscCall(DMCreate(comm, dm));
4409566063dSJacob Faibussowitsch   PetscCall(DMSetType(*dm, DMPLEX));
4419566063dSJacob Faibussowitsch   PetscCall(DMSetFromOptions(*dm));
442c4762a1bSJed Brown   {
443c4762a1bSJed Brown     char      convType[256];
444c4762a1bSJed Brown     PetscBool flg;
445c4762a1bSJed Brown 
446d0609cedSBarry Smith     PetscOptionsBegin(comm, "", "Mesh conversion options", "DMPLEX");
4479566063dSJacob Faibussowitsch     PetscCall(PetscOptionsFList("-dm_plex_convert_type", "Convert DMPlex to another format", "ex12", DMList, DMPLEX, convType, 256, &flg));
448d0609cedSBarry Smith     PetscOptionsEnd();
449c4762a1bSJed Brown     if (flg) {
450c4762a1bSJed Brown       DM dmConv;
451c4762a1bSJed Brown 
4529566063dSJacob Faibussowitsch       PetscCall(DMConvert(*dm, convType, &dmConv));
453c4762a1bSJed Brown       if (dmConv) {
4549566063dSJacob Faibussowitsch         PetscCall(DMDestroy(dm));
455c4762a1bSJed Brown         *dm = dmConv;
456c4762a1bSJed Brown       }
4579566063dSJacob Faibussowitsch       PetscCall(DMSetFromOptions(*dm));
4589566063dSJacob Faibussowitsch       PetscCall(DMSetUp(*dm));
45930602db0SMatthew G. Knepley     }
46030602db0SMatthew G. Knepley   }
4619566063dSJacob Faibussowitsch   PetscCall(DMViewFromOptions(*dm, NULL, "-dm_view"));
46230602db0SMatthew G. Knepley   if (user->rand) {
46330602db0SMatthew G. Knepley     PetscRandom r;
46430602db0SMatthew G. Knepley     PetscReal   val;
46530602db0SMatthew G. Knepley     PetscInt    dim, N, i;
466c4762a1bSJed Brown 
4679566063dSJacob Faibussowitsch     PetscCall(DMGetDimension(*dm, &dim));
46830602db0SMatthew G. Knepley     N = PetscPowInt(user->div, dim);
4699566063dSJacob Faibussowitsch     PetscCall(PetscMalloc1(N, &user->kgrid));
4709566063dSJacob Faibussowitsch     PetscCall(PetscRandomCreate(PETSC_COMM_SELF, &r));
4719566063dSJacob Faibussowitsch     PetscCall(PetscRandomSetFromOptions(r));
4729566063dSJacob Faibussowitsch     PetscCall(PetscRandomSetInterval(r, 0.0, user->k));
4739566063dSJacob Faibussowitsch     PetscCall(PetscRandomSetSeed(r, 1973));
4749566063dSJacob Faibussowitsch     PetscCall(PetscRandomSeed(r));
47530602db0SMatthew G. Knepley     for (i = 0; i < N; ++i) {
4769566063dSJacob Faibussowitsch       PetscCall(PetscRandomGetValueReal(r, &val));
47730602db0SMatthew G. Knepley       user->kgrid[i] = 1 + (PetscInt)val;
478c4762a1bSJed Brown     }
4799566063dSJacob Faibussowitsch     PetscCall(PetscRandomDestroy(&r));
480c4762a1bSJed Brown   }
481c4762a1bSJed Brown   PetscFunctionReturn(0);
482c4762a1bSJed Brown }
483c4762a1bSJed Brown 
4849371c9d4SSatish Balay static PetscErrorCode SetupProblem(DM dm, AppCtx *user) {
48545480ffeSMatthew G. Knepley   PetscDS          ds;
48645480ffeSMatthew G. Knepley   DMLabel          label;
48745480ffeSMatthew G. Knepley   PetscWeakForm    wf;
4888fb5bd83SMatthew G. Knepley   const PetscReal *L;
489c4762a1bSJed Brown   const PetscInt   id = 1;
49030602db0SMatthew G. Knepley   PetscInt         bd, dim;
491c4762a1bSJed Brown 
492c4762a1bSJed Brown   PetscFunctionBeginUser;
4939566063dSJacob Faibussowitsch   PetscCall(DMGetDS(dm, &ds));
4949566063dSJacob Faibussowitsch   PetscCall(DMGetDimension(dm, &dim));
4954fb89dddSMatthew G. Knepley   PetscCall(DMGetPeriodicity(dm, NULL, NULL, &L));
496c4762a1bSJed Brown   switch (user->variableCoefficient) {
497c4762a1bSJed Brown   case COEFF_NONE:
4988fb5bd83SMatthew G. Knepley     if (L && L[0]) {
4998fb5bd83SMatthew G. Knepley       if (L && L[1]) {
5009566063dSJacob Faibussowitsch         PetscCall(PetscDSSetResidual(ds, 0, f0_xytrig_u, f1_u));
5019566063dSJacob Faibussowitsch         PetscCall(PetscDSSetJacobian(ds, 0, 0, NULL, NULL, NULL, g3_uu));
502c4762a1bSJed Brown       } else {
5039566063dSJacob Faibussowitsch         PetscCall(PetscDSSetResidual(ds, 0, f0_xtrig_u, f1_u));
5049566063dSJacob Faibussowitsch         PetscCall(PetscDSSetJacobian(ds, 0, 0, NULL, NULL, NULL, g3_uu));
505c4762a1bSJed Brown       }
506c4762a1bSJed Brown     } else {
5079566063dSJacob Faibussowitsch       PetscCall(PetscDSSetResidual(ds, 0, f0_u, f1_u));
5089566063dSJacob Faibussowitsch       PetscCall(PetscDSSetJacobian(ds, 0, 0, NULL, NULL, NULL, g3_uu));
509c4762a1bSJed Brown     }
510c4762a1bSJed Brown     break;
511c4762a1bSJed Brown   case COEFF_ANALYTIC:
5129566063dSJacob Faibussowitsch     PetscCall(PetscDSSetResidual(ds, 0, f0_analytic_u, f1_analytic_u));
5139566063dSJacob Faibussowitsch     PetscCall(PetscDSSetJacobian(ds, 0, 0, NULL, NULL, NULL, g3_analytic_uu));
514c4762a1bSJed Brown     break;
515c4762a1bSJed Brown   case COEFF_FIELD:
5169566063dSJacob Faibussowitsch     PetscCall(PetscDSSetResidual(ds, 0, f0_analytic_u, f1_field_u));
5179566063dSJacob Faibussowitsch     PetscCall(PetscDSSetJacobian(ds, 0, 0, NULL, NULL, NULL, g3_field_uu));
518c4762a1bSJed Brown     break;
519c4762a1bSJed Brown   case COEFF_NONLINEAR:
5209566063dSJacob Faibussowitsch     PetscCall(PetscDSSetResidual(ds, 0, f0_analytic_nonlinear_u, f1_analytic_nonlinear_u));
5219566063dSJacob Faibussowitsch     PetscCall(PetscDSSetJacobian(ds, 0, 0, NULL, NULL, NULL, g3_analytic_nonlinear_uu));
522c4762a1bSJed Brown     break;
5238d1b37daSJoe Wallwork   case COEFF_BALL:
5249566063dSJacob Faibussowitsch     PetscCall(PetscDSSetResidual(ds, 0, f0_ball_u, f1_u));
5259566063dSJacob Faibussowitsch     PetscCall(PetscDSSetJacobian(ds, 0, 0, NULL, NULL, NULL, g3_uu));
526c4762a1bSJed Brown     break;
527c4762a1bSJed Brown   case COEFF_CROSS:
5288d1b37daSJoe Wallwork     switch (dim) {
5299371c9d4SSatish Balay     case 2: PetscCall(PetscDSSetResidual(ds, 0, f0_cross_u_2d, f1_u)); break;
5309371c9d4SSatish Balay     case 3: PetscCall(PetscDSSetResidual(ds, 0, f0_cross_u_3d, f1_u)); break;
5319371c9d4SSatish Balay     default: SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE, "Invalid dimension %" PetscInt_FMT, dim);
5328d1b37daSJoe Wallwork     }
5339566063dSJacob Faibussowitsch     PetscCall(PetscDSSetJacobian(ds, 0, 0, NULL, NULL, NULL, g3_uu));
534c4762a1bSJed Brown     break;
535d6837840SMatthew G. Knepley   case COEFF_CHECKERBOARD_0:
5369566063dSJacob Faibussowitsch     PetscCall(PetscDSSetResidual(ds, 0, f0_checkerboard_0_u, f1_field_u));
5379566063dSJacob Faibussowitsch     PetscCall(PetscDSSetJacobian(ds, 0, 0, NULL, NULL, NULL, g3_field_uu));
538d6837840SMatthew G. Knepley     break;
53998921bdaSJacob Faibussowitsch   default: SETERRQ(PETSC_COMM_SELF, PETSC_ERR_ARG_WRONG, "Invalid variable coefficient type %d", user->variableCoefficient);
540c4762a1bSJed Brown   }
54130602db0SMatthew G. Knepley   switch (dim) {
542c4762a1bSJed Brown   case 2:
543c4762a1bSJed Brown     switch (user->variableCoefficient) {
5449371c9d4SSatish Balay     case COEFF_BALL: user->exactFuncs[0] = ball_u_2d; break;
5459371c9d4SSatish Balay     case COEFF_CROSS: user->exactFuncs[0] = cross_u_2d; break;
5469371c9d4SSatish Balay     case COEFF_CHECKERBOARD_0: user->exactFuncs[0] = zero; break;
547c4762a1bSJed Brown     default:
5488fb5bd83SMatthew G. Knepley       if (L && L[0]) {
5498fb5bd83SMatthew G. Knepley         if (L && L[1]) {
550c4762a1bSJed Brown           user->exactFuncs[0] = xytrig_u_2d;
551c4762a1bSJed Brown         } else {
552c4762a1bSJed Brown           user->exactFuncs[0] = xtrig_u_2d;
553c4762a1bSJed Brown         }
554c4762a1bSJed Brown       } else {
555c4762a1bSJed Brown         user->exactFuncs[0]  = quadratic_u_2d;
556c4762a1bSJed Brown         user->exactFields[0] = quadratic_u_field_2d;
557c4762a1bSJed Brown       }
558c4762a1bSJed Brown     }
55945480ffeSMatthew G. Knepley     if (user->bcType == NEUMANN) {
5609566063dSJacob Faibussowitsch       PetscCall(DMGetLabel(dm, "boundary", &label));
5619566063dSJacob Faibussowitsch       PetscCall(DMAddBoundary(dm, DM_BC_NATURAL, "wall", label, 1, &id, 0, 0, NULL, NULL, NULL, user, &bd));
5629566063dSJacob Faibussowitsch       PetscCall(PetscDSGetBoundary(ds, bd, &wf, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL));
5639566063dSJacob Faibussowitsch       PetscCall(PetscWeakFormSetIndexBdResidual(wf, label, id, 0, 0, 0, f0_bd_u, 0, NULL));
56445480ffeSMatthew G. Knepley     }
565c4762a1bSJed Brown     break;
566c4762a1bSJed Brown   case 3:
5678d1b37daSJoe Wallwork     switch (user->variableCoefficient) {
5689371c9d4SSatish Balay     case COEFF_BALL: user->exactFuncs[0] = ball_u_3d; break;
5699371c9d4SSatish Balay     case COEFF_CROSS: user->exactFuncs[0] = cross_u_3d; break;
5709371c9d4SSatish Balay     default: user->exactFuncs[0] = quadratic_u_3d; user->exactFields[0] = quadratic_u_field_3d;
5718d1b37daSJoe Wallwork     }
57245480ffeSMatthew G. Knepley     if (user->bcType == NEUMANN) {
5739566063dSJacob Faibussowitsch       PetscCall(DMGetLabel(dm, "boundary", &label));
5749566063dSJacob Faibussowitsch       PetscCall(DMAddBoundary(dm, DM_BC_NATURAL, "wall", label, 1, &id, 0, 0, NULL, NULL, NULL, user, &bd));
5759566063dSJacob Faibussowitsch       PetscCall(PetscDSGetBoundary(ds, bd, &wf, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL));
5769566063dSJacob Faibussowitsch       PetscCall(PetscWeakFormSetIndexBdResidual(wf, label, id, 0, 0, 0, f0_bd_u, 0, NULL));
57745480ffeSMatthew G. Knepley     }
578c4762a1bSJed Brown     break;
5799371c9d4SSatish Balay   default: SETERRQ(PETSC_COMM_WORLD, PETSC_ERR_ARG_OUTOFRANGE, "Invalid dimension %" PetscInt_FMT, dim);
580c4762a1bSJed Brown   }
581d6837840SMatthew G. Knepley   /* Setup constants */
582d6837840SMatthew G. Knepley   switch (user->variableCoefficient) {
5839371c9d4SSatish Balay   case COEFF_CHECKERBOARD_0: {
584d6837840SMatthew G. Knepley     PetscScalar constants[2];
585d6837840SMatthew G. Knepley 
586d6837840SMatthew G. Knepley     constants[0] = user->div;
587d6837840SMatthew G. Knepley     constants[1] = user->k;
5889566063dSJacob Faibussowitsch     PetscCall(PetscDSSetConstants(ds, 2, constants));
5899371c9d4SSatish Balay   } break;
590d6837840SMatthew G. Knepley   default: break;
591d6837840SMatthew G. Knepley   }
5929566063dSJacob Faibussowitsch   PetscCall(PetscDSSetExactSolution(ds, 0, user->exactFuncs[0], user));
593d6837840SMatthew G. Knepley   /* Setup Boundary Conditions */
59445480ffeSMatthew G. Knepley   if (user->bcType == DIRICHLET) {
5959566063dSJacob Faibussowitsch     PetscCall(DMGetLabel(dm, "marker", &label));
59645480ffeSMatthew G. Knepley     if (!label) {
59745480ffeSMatthew G. Knepley       /* Right now, p4est cannot create labels immediately */
5989566063dSJacob Faibussowitsch       PetscCall(PetscDSAddBoundaryByName(ds, user->fieldBC ? DM_BC_ESSENTIAL_FIELD : DM_BC_ESSENTIAL, "wall", "marker", 1, &id, 0, 0, NULL, user->fieldBC ? (void (*)(void))user->exactFields[0] : (void (*)(void))user->exactFuncs[0], NULL, user, NULL));
59945480ffeSMatthew G. Knepley     } else {
6009566063dSJacob Faibussowitsch       PetscCall(DMAddBoundary(dm, user->fieldBC ? DM_BC_ESSENTIAL_FIELD : DM_BC_ESSENTIAL, "wall", label, 1, &id, 0, 0, NULL, user->fieldBC ? (void (*)(void))user->exactFields[0] : (void (*)(void))user->exactFuncs[0], NULL, user, NULL));
60145480ffeSMatthew G. Knepley     }
602c4762a1bSJed Brown   }
603c4762a1bSJed Brown   PetscFunctionReturn(0);
604c4762a1bSJed Brown }
605c4762a1bSJed Brown 
6069371c9d4SSatish Balay static PetscErrorCode SetupMaterial(DM dm, DM dmAux, AppCtx *user) {
607c4762a1bSJed Brown   PetscErrorCode (*matFuncs[1])(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt Nc, PetscScalar u[], void *ctx) = {nu_2d};
608d6837840SMatthew G. Knepley   void *ctx[1];
609c4762a1bSJed Brown   Vec   nu;
610c4762a1bSJed Brown 
611c4762a1bSJed Brown   PetscFunctionBegin;
612d6837840SMatthew G. Knepley   ctx[0] = user;
613d6837840SMatthew G. Knepley   if (user->variableCoefficient == COEFF_CHECKERBOARD_0) { matFuncs[0] = checkerboardCoeff; }
6149566063dSJacob Faibussowitsch   PetscCall(DMCreateLocalVector(dmAux, &nu));
6159566063dSJacob Faibussowitsch   PetscCall(PetscObjectSetName((PetscObject)nu, "Coefficient"));
6169566063dSJacob Faibussowitsch   PetscCall(DMProjectFunctionLocal(dmAux, 0.0, matFuncs, ctx, INSERT_ALL_VALUES, nu));
6179566063dSJacob Faibussowitsch   PetscCall(DMSetAuxiliaryVec(dm, NULL, 0, 0, nu));
6189566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&nu));
619c4762a1bSJed Brown   PetscFunctionReturn(0);
620c4762a1bSJed Brown }
621c4762a1bSJed Brown 
6229371c9d4SSatish Balay static PetscErrorCode SetupBC(DM dm, DM dmAux, AppCtx *user) {
623c4762a1bSJed Brown   PetscErrorCode (*bcFuncs[1])(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt Nc, PetscScalar u[], void *ctx);
624c4762a1bSJed Brown   Vec      uexact;
625c4762a1bSJed Brown   PetscInt dim;
626c4762a1bSJed Brown 
627c4762a1bSJed Brown   PetscFunctionBegin;
6289566063dSJacob Faibussowitsch   PetscCall(DMGetDimension(dm, &dim));
629c4762a1bSJed Brown   if (dim == 2) bcFuncs[0] = quadratic_u_2d;
630c4762a1bSJed Brown   else bcFuncs[0] = quadratic_u_3d;
6319566063dSJacob Faibussowitsch   PetscCall(DMCreateLocalVector(dmAux, &uexact));
6329566063dSJacob Faibussowitsch   PetscCall(DMProjectFunctionLocal(dmAux, 0.0, bcFuncs, NULL, INSERT_ALL_VALUES, uexact));
6339566063dSJacob Faibussowitsch   PetscCall(DMSetAuxiliaryVec(dm, NULL, 0, 0, uexact));
6349566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&uexact));
635c4762a1bSJed Brown   PetscFunctionReturn(0);
636c4762a1bSJed Brown }
637c4762a1bSJed Brown 
6389371c9d4SSatish Balay static PetscErrorCode SetupAuxDM(DM dm, PetscFE feAux, AppCtx *user) {
639c4762a1bSJed Brown   DM dmAux, coordDM;
640c4762a1bSJed Brown 
641c4762a1bSJed Brown   PetscFunctionBegin;
642c4762a1bSJed Brown   /* MUST call DMGetCoordinateDM() in order to get p4est setup if present */
6439566063dSJacob Faibussowitsch   PetscCall(DMGetCoordinateDM(dm, &coordDM));
644c4762a1bSJed Brown   if (!feAux) PetscFunctionReturn(0);
6459566063dSJacob Faibussowitsch   PetscCall(DMClone(dm, &dmAux));
6469566063dSJacob Faibussowitsch   PetscCall(DMSetCoordinateDM(dmAux, coordDM));
6479566063dSJacob Faibussowitsch   PetscCall(DMSetField(dmAux, 0, NULL, (PetscObject)feAux));
6489566063dSJacob Faibussowitsch   PetscCall(DMCreateDS(dmAux));
6499566063dSJacob Faibussowitsch   if (user->fieldBC) PetscCall(SetupBC(dm, dmAux, user));
6509566063dSJacob Faibussowitsch   else PetscCall(SetupMaterial(dm, dmAux, user));
6519566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&dmAux));
652c4762a1bSJed Brown   PetscFunctionReturn(0);
653c4762a1bSJed Brown }
654c4762a1bSJed Brown 
6559371c9d4SSatish Balay static PetscErrorCode SetupDiscretization(DM dm, AppCtx *user) {
65630602db0SMatthew G. Knepley   DM        plex, cdm = dm;
657c4762a1bSJed Brown   PetscFE   fe, feAux = NULL;
65830602db0SMatthew G. Knepley   PetscBool simplex;
65930602db0SMatthew G. Knepley   PetscInt  dim;
660c4762a1bSJed Brown   MPI_Comm  comm;
661c4762a1bSJed Brown 
662c4762a1bSJed Brown   PetscFunctionBeginUser;
6639566063dSJacob Faibussowitsch   PetscCall(DMGetDimension(dm, &dim));
6649566063dSJacob Faibussowitsch   PetscCall(DMConvert(dm, DMPLEX, &plex));
6659566063dSJacob Faibussowitsch   PetscCall(DMPlexIsSimplex(plex, &simplex));
6669566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&plex));
6679566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetComm((PetscObject)dm, &comm));
6689566063dSJacob Faibussowitsch   PetscCall(PetscFECreateDefault(PETSC_COMM_SELF, dim, 1, simplex, NULL, -1, &fe));
6699566063dSJacob Faibussowitsch   PetscCall(PetscObjectSetName((PetscObject)fe, "potential"));
670d6837840SMatthew G. Knepley   if (user->variableCoefficient == COEFF_FIELD || user->variableCoefficient == COEFF_CHECKERBOARD_0) {
6719566063dSJacob Faibussowitsch     PetscCall(PetscFECreateDefault(PETSC_COMM_SELF, dim, 1, simplex, "mat_", -1, &feAux));
6729566063dSJacob Faibussowitsch     PetscCall(PetscObjectSetName((PetscObject)feAux, "coefficient"));
6739566063dSJacob Faibussowitsch     PetscCall(PetscFECopyQuadrature(fe, feAux));
674c4762a1bSJed Brown   } else if (user->fieldBC) {
6759566063dSJacob Faibussowitsch     PetscCall(PetscFECreateDefault(PETSC_COMM_SELF, dim, 1, simplex, "bc_", -1, &feAux));
6769566063dSJacob Faibussowitsch     PetscCall(PetscFECopyQuadrature(fe, feAux));
677c4762a1bSJed Brown   }
678c4762a1bSJed Brown   /* Set discretization and boundary conditions for each mesh */
6799566063dSJacob Faibussowitsch   PetscCall(DMSetField(dm, 0, NULL, (PetscObject)fe));
6809566063dSJacob Faibussowitsch   PetscCall(DMCreateDS(dm));
6819566063dSJacob Faibussowitsch   PetscCall(SetupProblem(dm, user));
682c4762a1bSJed Brown   while (cdm) {
6839566063dSJacob Faibussowitsch     PetscCall(SetupAuxDM(cdm, feAux, user));
68430602db0SMatthew G. Knepley     if (user->bcType == DIRICHLET) {
685c4762a1bSJed Brown       PetscBool hasLabel;
686c4762a1bSJed Brown 
6879566063dSJacob Faibussowitsch       PetscCall(DMHasLabel(cdm, "marker", &hasLabel));
6889566063dSJacob Faibussowitsch       if (!hasLabel) PetscCall(CreateBCLabel(cdm, "marker"));
689c4762a1bSJed Brown     }
6909566063dSJacob Faibussowitsch     PetscCall(DMCopyDisc(dm, cdm));
6919566063dSJacob Faibussowitsch     PetscCall(DMGetCoarseDM(cdm, &cdm));
692c4762a1bSJed Brown   }
6939566063dSJacob Faibussowitsch   PetscCall(PetscFEDestroy(&fe));
6949566063dSJacob Faibussowitsch   PetscCall(PetscFEDestroy(&feAux));
695c4762a1bSJed Brown   PetscFunctionReturn(0);
696c4762a1bSJed Brown }
697c4762a1bSJed Brown 
6989371c9d4SSatish Balay int main(int argc, char **argv) {
699c4762a1bSJed Brown   DM           dm;          /* Problem specification */
700c4762a1bSJed Brown   SNES         snes;        /* nonlinear solver */
701c4762a1bSJed Brown   Vec          u;           /* solution vector */
702c4762a1bSJed Brown   Mat          A, J;        /* Jacobian matrix */
703c4762a1bSJed Brown   MatNullSpace nullSpace;   /* May be necessary for Neumann conditions */
704c4762a1bSJed Brown   AppCtx       user;        /* user-defined work context */
705c4762a1bSJed Brown   JacActionCtx userJ;       /* context for Jacobian MF action */
706c4762a1bSJed Brown   PetscReal    error = 0.0; /* L_2 error in the solution */
707c4762a1bSJed Brown 
708327415f7SBarry Smith   PetscFunctionBeginUser;
7099566063dSJacob Faibussowitsch   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
7109566063dSJacob Faibussowitsch   PetscCall(ProcessOptions(PETSC_COMM_WORLD, &user));
7119566063dSJacob Faibussowitsch   PetscCall(SNESCreate(PETSC_COMM_WORLD, &snes));
7129566063dSJacob Faibussowitsch   PetscCall(CreateMesh(PETSC_COMM_WORLD, &user, &dm));
7139566063dSJacob Faibussowitsch   PetscCall(SNESSetDM(snes, dm));
7149566063dSJacob Faibussowitsch   PetscCall(DMSetApplicationContext(dm, &user));
715c4762a1bSJed Brown 
7169566063dSJacob Faibussowitsch   PetscCall(PetscMalloc2(1, &user.exactFuncs, 1, &user.exactFields));
7179566063dSJacob Faibussowitsch   PetscCall(SetupDiscretization(dm, &user));
718c4762a1bSJed Brown 
7199566063dSJacob Faibussowitsch   PetscCall(DMCreateGlobalVector(dm, &u));
7209566063dSJacob Faibussowitsch   PetscCall(PetscObjectSetName((PetscObject)u, "potential"));
721c4762a1bSJed Brown 
7229566063dSJacob Faibussowitsch   PetscCall(DMCreateMatrix(dm, &J));
723c4762a1bSJed Brown   if (user.jacobianMF) {
724c4762a1bSJed Brown     PetscInt M, m, N, n;
725c4762a1bSJed Brown 
7269566063dSJacob Faibussowitsch     PetscCall(MatGetSize(J, &M, &N));
7279566063dSJacob Faibussowitsch     PetscCall(MatGetLocalSize(J, &m, &n));
7289566063dSJacob Faibussowitsch     PetscCall(MatCreate(PETSC_COMM_WORLD, &A));
7299566063dSJacob Faibussowitsch     PetscCall(MatSetSizes(A, m, n, M, N));
7309566063dSJacob Faibussowitsch     PetscCall(MatSetType(A, MATSHELL));
7319566063dSJacob Faibussowitsch     PetscCall(MatSetUp(A));
732c4762a1bSJed Brown #if 0
7339566063dSJacob Faibussowitsch     PetscCall(MatShellSetOperation(A, MATOP_MULT, (void (*)(void))FormJacobianAction));
734c4762a1bSJed Brown #endif
735c4762a1bSJed Brown 
736c4762a1bSJed Brown     userJ.dm   = dm;
737c4762a1bSJed Brown     userJ.J    = J;
738c4762a1bSJed Brown     userJ.user = &user;
739c4762a1bSJed Brown 
7409566063dSJacob Faibussowitsch     PetscCall(DMCreateLocalVector(dm, &userJ.u));
7419566063dSJacob Faibussowitsch     if (user.fieldBC) PetscCall(DMProjectFieldLocal(dm, 0.0, userJ.u, user.exactFields, INSERT_BC_VALUES, userJ.u));
7429566063dSJacob Faibussowitsch     else PetscCall(DMProjectFunctionLocal(dm, 0.0, user.exactFuncs, NULL, INSERT_BC_VALUES, userJ.u));
7439566063dSJacob Faibussowitsch     PetscCall(MatShellSetContext(A, &userJ));
744c4762a1bSJed Brown   } else {
745c4762a1bSJed Brown     A = J;
746c4762a1bSJed Brown   }
747c4762a1bSJed Brown 
748c4762a1bSJed Brown   nullSpace = NULL;
749c4762a1bSJed Brown   if (user.bcType != DIRICHLET) {
7509566063dSJacob Faibussowitsch     PetscCall(MatNullSpaceCreate(PetscObjectComm((PetscObject)dm), PETSC_TRUE, 0, NULL, &nullSpace));
7519566063dSJacob Faibussowitsch     PetscCall(MatSetNullSpace(A, nullSpace));
752c4762a1bSJed Brown   }
753c4762a1bSJed Brown 
7549566063dSJacob Faibussowitsch   PetscCall(DMPlexSetSNESLocalFEM(dm, &user, &user, &user));
7559566063dSJacob Faibussowitsch   PetscCall(SNESSetJacobian(snes, A, J, NULL, NULL));
756c4762a1bSJed Brown 
7579566063dSJacob Faibussowitsch   PetscCall(SNESSetFromOptions(snes));
758c4762a1bSJed Brown 
7599566063dSJacob Faibussowitsch   if (user.fieldBC) PetscCall(DMProjectField(dm, 0.0, u, user.exactFields, INSERT_ALL_VALUES, u));
7609566063dSJacob Faibussowitsch   else PetscCall(DMProjectFunction(dm, 0.0, user.exactFuncs, NULL, INSERT_ALL_VALUES, u));
761c4762a1bSJed Brown   if (user.restart) {
762c4762a1bSJed Brown #if defined(PETSC_HAVE_HDF5)
763c4762a1bSJed Brown     PetscViewer viewer;
76430602db0SMatthew G. Knepley     char        filename[PETSC_MAX_PATH_LEN];
765c4762a1bSJed Brown 
7669566063dSJacob Faibussowitsch     PetscCall(PetscOptionsGetString(NULL, NULL, "-dm_plex_filename", filename, sizeof(filename), NULL));
7679566063dSJacob Faibussowitsch     PetscCall(PetscViewerCreate(PETSC_COMM_WORLD, &viewer));
7689566063dSJacob Faibussowitsch     PetscCall(PetscViewerSetType(viewer, PETSCVIEWERHDF5));
7699566063dSJacob Faibussowitsch     PetscCall(PetscViewerFileSetMode(viewer, FILE_MODE_READ));
7709566063dSJacob Faibussowitsch     PetscCall(PetscViewerFileSetName(viewer, filename));
7719566063dSJacob Faibussowitsch     PetscCall(PetscViewerHDF5PushGroup(viewer, "/fields"));
7729566063dSJacob Faibussowitsch     PetscCall(VecLoad(u, viewer));
7739566063dSJacob Faibussowitsch     PetscCall(PetscViewerHDF5PopGroup(viewer));
7749566063dSJacob Faibussowitsch     PetscCall(PetscViewerDestroy(&viewer));
775c4762a1bSJed Brown #endif
776c4762a1bSJed Brown   }
777c4762a1bSJed Brown   if (user.showInitial) {
778c4762a1bSJed Brown     Vec lv;
7799566063dSJacob Faibussowitsch     PetscCall(DMGetLocalVector(dm, &lv));
7809566063dSJacob Faibussowitsch     PetscCall(DMGlobalToLocalBegin(dm, u, INSERT_VALUES, lv));
7819566063dSJacob Faibussowitsch     PetscCall(DMGlobalToLocalEnd(dm, u, INSERT_VALUES, lv));
7829566063dSJacob Faibussowitsch     PetscCall(DMPrintLocalVec(dm, "Local function", 1.0e-10, lv));
7839566063dSJacob Faibussowitsch     PetscCall(DMRestoreLocalVector(dm, &lv));
784c4762a1bSJed Brown   }
785c4762a1bSJed Brown   if (user.runType == RUN_FULL || user.runType == RUN_EXACT) {
786c4762a1bSJed Brown     PetscErrorCode (*initialGuess[1])(PetscInt dim, PetscReal time, const PetscReal x[], PetscInt Nc, PetscScalar u[], void *ctx) = {zero};
787c4762a1bSJed Brown 
788c4762a1bSJed Brown     if (user.nonzInit) initialGuess[0] = ecks;
789*48a46eb9SPierre Jolivet     if (user.runType == RUN_FULL) PetscCall(DMProjectFunction(dm, 0.0, initialGuess, NULL, INSERT_VALUES, u));
7909566063dSJacob Faibussowitsch     PetscCall(VecViewFromOptions(u, NULL, "-guess_vec_view"));
7919566063dSJacob Faibussowitsch     PetscCall(SNESSolve(snes, NULL, u));
7929566063dSJacob Faibussowitsch     PetscCall(SNESGetSolution(snes, &u));
7939566063dSJacob Faibussowitsch     PetscCall(SNESGetDM(snes, &dm));
794c4762a1bSJed Brown 
795c4762a1bSJed Brown     if (user.showSolution) {
7969566063dSJacob Faibussowitsch       PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Solution\n"));
7979566063dSJacob Faibussowitsch       PetscCall(VecChop(u, 3.0e-9));
7989566063dSJacob Faibussowitsch       PetscCall(VecView(u, PETSC_VIEWER_STDOUT_WORLD));
799c4762a1bSJed Brown     }
800c4762a1bSJed Brown   } else if (user.runType == RUN_PERF) {
801c4762a1bSJed Brown     Vec       r;
802c4762a1bSJed Brown     PetscReal res = 0.0;
803c4762a1bSJed Brown 
8049566063dSJacob Faibussowitsch     PetscCall(SNESGetFunction(snes, &r, NULL, NULL));
8059566063dSJacob Faibussowitsch     PetscCall(SNESComputeFunction(snes, u, r));
8069566063dSJacob Faibussowitsch     PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Initial Residual\n"));
8079566063dSJacob Faibussowitsch     PetscCall(VecChop(r, 1.0e-10));
8089566063dSJacob Faibussowitsch     PetscCall(VecNorm(r, NORM_2, &res));
8099566063dSJacob Faibussowitsch     PetscCall(PetscPrintf(PETSC_COMM_WORLD, "L_2 Residual: %g\n", (double)res));
810c4762a1bSJed Brown   } else {
811c4762a1bSJed Brown     Vec       r;
812c4762a1bSJed Brown     PetscReal res = 0.0, tol = 1.0e-11;
813c4762a1bSJed Brown 
814c4762a1bSJed Brown     /* Check discretization error */
8159566063dSJacob Faibussowitsch     PetscCall(SNESGetFunction(snes, &r, NULL, NULL));
8169566063dSJacob Faibussowitsch     PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Initial guess\n"));
8179566063dSJacob Faibussowitsch     if (!user.quiet) PetscCall(VecView(u, PETSC_VIEWER_STDOUT_WORLD));
8189566063dSJacob Faibussowitsch     PetscCall(DMComputeL2Diff(dm, 0.0, user.exactFuncs, NULL, u, &error));
8199566063dSJacob Faibussowitsch     if (error < tol) PetscCall(PetscPrintf(PETSC_COMM_WORLD, "L_2 Error: < %2.1e\n", (double)tol));
8209566063dSJacob Faibussowitsch     else PetscCall(PetscPrintf(PETSC_COMM_WORLD, "L_2 Error: %g\n", (double)error));
821c4762a1bSJed Brown     /* Check residual */
8229566063dSJacob Faibussowitsch     PetscCall(SNESComputeFunction(snes, u, r));
8239566063dSJacob Faibussowitsch     PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Initial Residual\n"));
8249566063dSJacob Faibussowitsch     PetscCall(VecChop(r, 1.0e-10));
8259566063dSJacob Faibussowitsch     if (!user.quiet) PetscCall(VecView(r, PETSC_VIEWER_STDOUT_WORLD));
8269566063dSJacob Faibussowitsch     PetscCall(VecNorm(r, NORM_2, &res));
8279566063dSJacob Faibussowitsch     PetscCall(PetscPrintf(PETSC_COMM_WORLD, "L_2 Residual: %g\n", (double)res));
828c4762a1bSJed Brown     /* Check Jacobian */
829c4762a1bSJed Brown     {
830c4762a1bSJed Brown       Vec b;
831c4762a1bSJed Brown 
8329566063dSJacob Faibussowitsch       PetscCall(SNESComputeJacobian(snes, u, A, A));
8339566063dSJacob Faibussowitsch       PetscCall(VecDuplicate(u, &b));
8349566063dSJacob Faibussowitsch       PetscCall(VecSet(r, 0.0));
8359566063dSJacob Faibussowitsch       PetscCall(SNESComputeFunction(snes, r, b));
8369566063dSJacob Faibussowitsch       PetscCall(MatMult(A, u, r));
8379566063dSJacob Faibussowitsch       PetscCall(VecAXPY(r, 1.0, b));
8389566063dSJacob Faibussowitsch       PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Au - b = Au + F(0)\n"));
8399566063dSJacob Faibussowitsch       PetscCall(VecChop(r, 1.0e-10));
8409566063dSJacob Faibussowitsch       if (!user.quiet) PetscCall(VecView(r, PETSC_VIEWER_STDOUT_WORLD));
8419566063dSJacob Faibussowitsch       PetscCall(VecNorm(r, NORM_2, &res));
8429566063dSJacob Faibussowitsch       PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Linear L_2 Residual: %g\n", (double)res));
843c4762a1bSJed Brown       /* check solver */
844c4762a1bSJed Brown       if (user.checkksp) {
845c4762a1bSJed Brown         KSP ksp;
846c4762a1bSJed Brown 
8471baa6e33SBarry Smith         if (nullSpace) PetscCall(MatNullSpaceRemove(nullSpace, u));
8489566063dSJacob Faibussowitsch         PetscCall(SNESComputeJacobian(snes, u, A, J));
8499566063dSJacob Faibussowitsch         PetscCall(MatMult(A, u, b));
8509566063dSJacob Faibussowitsch         PetscCall(SNESGetKSP(snes, &ksp));
8519566063dSJacob Faibussowitsch         PetscCall(KSPSetOperators(ksp, A, J));
8529566063dSJacob Faibussowitsch         PetscCall(KSPSolve(ksp, b, r));
8539566063dSJacob Faibussowitsch         PetscCall(VecAXPY(r, -1.0, u));
8549566063dSJacob Faibussowitsch         PetscCall(VecNorm(r, NORM_2, &res));
8559566063dSJacob Faibussowitsch         PetscCall(PetscPrintf(PETSC_COMM_WORLD, "KSP Error: %g\n", (double)res));
856c4762a1bSJed Brown       }
8579566063dSJacob Faibussowitsch       PetscCall(VecDestroy(&b));
858c4762a1bSJed Brown     }
859c4762a1bSJed Brown   }
8609566063dSJacob Faibussowitsch   PetscCall(VecViewFromOptions(u, NULL, "-vec_view"));
861d6837840SMatthew G. Knepley   {
862d6837840SMatthew G. Knepley     Vec nu;
863d6837840SMatthew G. Knepley 
8649566063dSJacob Faibussowitsch     PetscCall(DMGetAuxiliaryVec(dm, NULL, 0, 0, &nu));
8659566063dSJacob Faibussowitsch     if (nu) PetscCall(VecViewFromOptions(nu, NULL, "-coeff_view"));
866d6837840SMatthew G. Knepley   }
867c4762a1bSJed Brown 
868c4762a1bSJed Brown   if (user.bdIntegral) {
869c4762a1bSJed Brown     DMLabel     label;
870c4762a1bSJed Brown     PetscInt    id    = 1;
871c4762a1bSJed Brown     PetscScalar bdInt = 0.0;
872c4762a1bSJed Brown     PetscReal   exact = 3.3333333333;
873c4762a1bSJed Brown 
8749566063dSJacob Faibussowitsch     PetscCall(DMGetLabel(dm, "marker", &label));
8759566063dSJacob Faibussowitsch     PetscCall(DMPlexComputeBdIntegral(dm, u, label, 1, &id, bd_integral_2d, &bdInt, NULL));
8769566063dSJacob Faibussowitsch     PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Solution boundary integral: %.4g\n", (double)PetscAbsScalar(bdInt)));
8770b121fc5SBarry Smith     PetscCheck(PetscAbsReal(PetscAbsScalar(bdInt) - exact) <= PETSC_SQRT_MACHINE_EPSILON, PETSC_COMM_WORLD, PETSC_ERR_PLIB, "Invalid boundary integral %g != %g", (double)PetscAbsScalar(bdInt), (double)exact);
878c4762a1bSJed Brown   }
879c4762a1bSJed Brown 
8809566063dSJacob Faibussowitsch   PetscCall(MatNullSpaceDestroy(&nullSpace));
8819566063dSJacob Faibussowitsch   if (user.jacobianMF) PetscCall(VecDestroy(&userJ.u));
8829566063dSJacob Faibussowitsch   if (A != J) PetscCall(MatDestroy(&A));
8839566063dSJacob Faibussowitsch   PetscCall(MatDestroy(&J));
8849566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&u));
8859566063dSJacob Faibussowitsch   PetscCall(SNESDestroy(&snes));
8869566063dSJacob Faibussowitsch   PetscCall(DMDestroy(&dm));
8879566063dSJacob Faibussowitsch   PetscCall(PetscFree2(user.exactFuncs, user.exactFields));
8889566063dSJacob Faibussowitsch   PetscCall(PetscFree(user.kgrid));
8899566063dSJacob Faibussowitsch   PetscCall(PetscFinalize());
890b122ec5aSJacob Faibussowitsch   return 0;
891c4762a1bSJed Brown }
892c4762a1bSJed Brown 
893c4762a1bSJed Brown /*TEST
894c4762a1bSJed Brown   # 2D serial P1 test 0-4
895c4762a1bSJed Brown   test:
896c4762a1bSJed Brown     suffix: 2d_p1_0
897c4762a1bSJed Brown     requires: triangle
89830602db0SMatthew G. Knepley     args: -run_type test -bc_type dirichlet -dm_plex_interpolate 0 -petscspace_degree 1 -show_initial -dm_plex_print_fem 1
899c4762a1bSJed Brown 
900c4762a1bSJed Brown   test:
901c4762a1bSJed Brown     suffix: 2d_p1_1
902c4762a1bSJed Brown     requires: triangle
90330602db0SMatthew G. Knepley     args: -run_type test -bc_type dirichlet -petscspace_degree 1 -show_initial -dm_plex_print_fem 1
904c4762a1bSJed Brown 
905c4762a1bSJed Brown   test:
906c4762a1bSJed Brown     suffix: 2d_p1_2
907c4762a1bSJed Brown     requires: triangle
90830602db0SMatthew G. Knepley     args: -run_type test -dm_refine_volume_limit_pre 0.0625 -bc_type dirichlet -petscspace_degree 1 -show_initial -dm_plex_print_fem 1
909c4762a1bSJed Brown 
910c4762a1bSJed Brown   test:
911c4762a1bSJed Brown     suffix: 2d_p1_neumann_0
912c4762a1bSJed Brown     requires: triangle
91330602db0SMatthew G. Knepley     args: -dm_coord_space 0 -run_type test -bc_type neumann -dm_plex_boundary_label boundary -petscspace_degree 1 -show_initial -dm_plex_print_fem 1 -dm_view ascii::ascii_info_detail
914c4762a1bSJed Brown 
915c4762a1bSJed Brown   test:
916c4762a1bSJed Brown     suffix: 2d_p1_neumann_1
917c4762a1bSJed Brown     requires: triangle
91830602db0SMatthew G. Knepley     args: -run_type test -dm_refine_volume_limit_pre 0.0625 -bc_type neumann -dm_plex_boundary_label boundary -petscspace_degree 1 -show_initial -dm_plex_print_fem 1
919c4762a1bSJed Brown 
920c4762a1bSJed Brown   # 2D serial P2 test 5-8
921c4762a1bSJed Brown   test:
922c4762a1bSJed Brown     suffix: 2d_p2_0
923c4762a1bSJed Brown     requires: triangle
92430602db0SMatthew G. Knepley     args: -run_type test -bc_type dirichlet -petscspace_degree 2 -show_initial -dm_plex_print_fem 1
925c4762a1bSJed Brown 
926c4762a1bSJed Brown   test:
927c4762a1bSJed Brown     suffix: 2d_p2_1
928c4762a1bSJed Brown     requires: triangle
92930602db0SMatthew G. Knepley     args: -run_type test -dm_refine_volume_limit_pre 0.0625 -bc_type dirichlet -petscspace_degree 2 -show_initial -dm_plex_print_fem 1
930c4762a1bSJed Brown 
931c4762a1bSJed Brown   test:
932c4762a1bSJed Brown     suffix: 2d_p2_neumann_0
933c4762a1bSJed Brown     requires: triangle
93430602db0SMatthew G. Knepley     args: -dm_coord_space 0 -run_type test -bc_type neumann -dm_plex_boundary_label boundary -petscspace_degree 2 -show_initial -dm_plex_print_fem 1 -dm_view ascii::ascii_info_detail
935c4762a1bSJed Brown 
936c4762a1bSJed Brown   test:
937c4762a1bSJed Brown     suffix: 2d_p2_neumann_1
938c4762a1bSJed Brown     requires: triangle
93930602db0SMatthew G. Knepley     args: -dm_coord_space 0 -run_type test -dm_refine_volume_limit_pre 0.0625 -bc_type neumann -dm_plex_boundary_label boundary -petscspace_degree 2 -show_initial -dm_plex_print_fem 1 -dm_view ascii::ascii_info_detail
940c4762a1bSJed Brown 
941c4762a1bSJed Brown   test:
942c4762a1bSJed Brown     suffix: bd_int_0
943c4762a1bSJed Brown     requires: triangle
94430602db0SMatthew G. Knepley     args: -run_type test -bc_type dirichlet -petscspace_degree 2 -bd_integral -dm_view -quiet
945c4762a1bSJed Brown 
946c4762a1bSJed Brown   test:
947c4762a1bSJed Brown     suffix: bd_int_1
948c4762a1bSJed Brown     requires: triangle
94930602db0SMatthew G. Knepley     args: -run_type test -dm_refine 2 -bc_type dirichlet -petscspace_degree 2 -bd_integral -dm_view -quiet
950c4762a1bSJed Brown 
951c4762a1bSJed Brown   # 3D serial P1 test 9-12
952c4762a1bSJed Brown   test:
953c4762a1bSJed Brown     suffix: 3d_p1_0
954c4762a1bSJed Brown     requires: ctetgen
95530602db0SMatthew G. Knepley     args: -run_type test -dm_plex_dim 3 -bc_type dirichlet -dm_plex_interpolate 0 -petscspace_degree 1 -show_initial -dm_plex_print_fem 1 -dm_view
956c4762a1bSJed Brown 
957c4762a1bSJed Brown   test:
958c4762a1bSJed Brown     suffix: 3d_p1_1
959c4762a1bSJed Brown     requires: ctetgen
96030602db0SMatthew G. Knepley     args: -run_type test -dm_plex_dim 3 -bc_type dirichlet -petscspace_degree 1 -show_initial -dm_plex_print_fem 1 -dm_view
961c4762a1bSJed Brown 
962c4762a1bSJed Brown   test:
963c4762a1bSJed Brown     suffix: 3d_p1_2
964c4762a1bSJed Brown     requires: ctetgen
96530602db0SMatthew G. Knepley     args: -run_type test -dm_plex_dim 3 -dm_refine_volume_limit_pre 0.0125 -bc_type dirichlet -petscspace_degree 1 -show_initial -dm_plex_print_fem 1 -dm_view
966c4762a1bSJed Brown 
967c4762a1bSJed Brown   test:
968c4762a1bSJed Brown     suffix: 3d_p1_neumann_0
969c4762a1bSJed Brown     requires: ctetgen
97030602db0SMatthew G. Knepley     args: -run_type test -dm_plex_dim 3 -bc_type neumann -dm_plex_boundary_label boundary -petscspace_degree 1 -snes_fd -show_initial -dm_plex_print_fem 1 -dm_view
971c4762a1bSJed Brown 
972c4762a1bSJed Brown   # Analytic variable coefficient 13-20
973c4762a1bSJed Brown   test:
974c4762a1bSJed Brown     suffix: 13
975c4762a1bSJed Brown     requires: triangle
97630602db0SMatthew G. Knepley     args: -run_type test -variable_coefficient analytic -petscspace_degree 1 -show_initial -dm_plex_print_fem 1
977c4762a1bSJed Brown   test:
978c4762a1bSJed Brown     suffix: 14
979c4762a1bSJed Brown     requires: triangle
98030602db0SMatthew G. Knepley     args: -run_type test -dm_refine_volume_limit_pre 0.0625 -variable_coefficient analytic -petscspace_degree 1 -show_initial -dm_plex_print_fem 1
981c4762a1bSJed Brown   test:
982c4762a1bSJed Brown     suffix: 15
983c4762a1bSJed Brown     requires: triangle
98430602db0SMatthew G. Knepley     args: -run_type test -variable_coefficient analytic -petscspace_degree 2 -show_initial -dm_plex_print_fem 1
985c4762a1bSJed Brown   test:
986c4762a1bSJed Brown     suffix: 16
987c4762a1bSJed Brown     requires: triangle
98830602db0SMatthew G. Knepley     args: -run_type test -dm_refine_volume_limit_pre 0.0625 -variable_coefficient analytic -petscspace_degree 2 -show_initial -dm_plex_print_fem 1
989c4762a1bSJed Brown   test:
990c4762a1bSJed Brown     suffix: 17
991c4762a1bSJed Brown     requires: ctetgen
99230602db0SMatthew G. Knepley     args: -run_type test -dm_plex_dim 3 -variable_coefficient analytic -petscspace_degree 1 -show_initial -dm_plex_print_fem 1
993c4762a1bSJed Brown 
994c4762a1bSJed Brown   test:
995c4762a1bSJed Brown     suffix: 18
996c4762a1bSJed Brown     requires: ctetgen
99730602db0SMatthew G. Knepley     args: -run_type test -dm_plex_dim 3 -dm_refine_volume_limit_pre 0.0125 -variable_coefficient analytic -petscspace_degree 1 -show_initial -dm_plex_print_fem 1
998c4762a1bSJed Brown 
999c4762a1bSJed Brown   test:
1000c4762a1bSJed Brown     suffix: 19
1001c4762a1bSJed Brown     requires: ctetgen
100230602db0SMatthew G. Knepley     args: -run_type test -dm_plex_dim 3 -variable_coefficient analytic -petscspace_degree 2 -show_initial -dm_plex_print_fem 1
1003c4762a1bSJed Brown 
1004c4762a1bSJed Brown   test:
1005c4762a1bSJed Brown     suffix: 20
1006c4762a1bSJed Brown     requires: ctetgen
100730602db0SMatthew G. Knepley     args: -run_type test -dm_plex_dim 3 -dm_refine_volume_limit_pre 0.0125 -variable_coefficient analytic -petscspace_degree 2 -show_initial -dm_plex_print_fem 1
1008c4762a1bSJed Brown 
1009c4762a1bSJed Brown   # P1 variable coefficient 21-28
1010c4762a1bSJed Brown   test:
1011c4762a1bSJed Brown     suffix: 21
1012c4762a1bSJed Brown     requires: triangle
101330602db0SMatthew G. Knepley     args: -run_type test -variable_coefficient field -petscspace_degree 1 -mat_petscspace_degree 1 -show_initial -dm_plex_print_fem 1
1014c4762a1bSJed Brown 
1015c4762a1bSJed Brown   test:
1016c4762a1bSJed Brown     suffix: 22
1017c4762a1bSJed Brown     requires: triangle
101830602db0SMatthew G. Knepley     args: -run_type test -dm_refine_volume_limit_pre 0.0625 -variable_coefficient field -petscspace_degree 1 -mat_petscspace_degree 1 -show_initial -dm_plex_print_fem 1
1019c4762a1bSJed Brown 
1020c4762a1bSJed Brown   test:
1021c4762a1bSJed Brown     suffix: 23
1022c4762a1bSJed Brown     requires: triangle
102330602db0SMatthew G. Knepley     args: -run_type test -variable_coefficient field -petscspace_degree 2 -mat_petscspace_degree 1 -show_initial -dm_plex_print_fem 1
1024c4762a1bSJed Brown 
1025c4762a1bSJed Brown   test:
1026c4762a1bSJed Brown     suffix: 24
1027c4762a1bSJed Brown     requires: triangle
102830602db0SMatthew G. Knepley     args: -run_type test -dm_refine_volume_limit_pre 0.0625 -variable_coefficient field -petscspace_degree 2 -mat_petscspace_degree 1 -show_initial -dm_plex_print_fem 1
1029c4762a1bSJed Brown 
1030c4762a1bSJed Brown   test:
1031c4762a1bSJed Brown     suffix: 25
1032c4762a1bSJed Brown     requires: ctetgen
103330602db0SMatthew G. Knepley     args: -run_type test -dm_plex_dim 3 -variable_coefficient field -petscspace_degree 1 -mat_petscspace_degree 1 -show_initial -dm_plex_print_fem 1
1034c4762a1bSJed Brown 
1035c4762a1bSJed Brown   test:
1036c4762a1bSJed Brown     suffix: 26
1037c4762a1bSJed Brown     requires: ctetgen
103830602db0SMatthew G. Knepley     args: -run_type test -dm_plex_dim 3 -dm_refine_volume_limit_pre 0.0125 -variable_coefficient field -petscspace_degree 1 -mat_petscspace_degree 1 -show_initial -dm_plex_print_fem 1
1039c4762a1bSJed Brown 
1040c4762a1bSJed Brown   test:
1041c4762a1bSJed Brown     suffix: 27
1042c4762a1bSJed Brown     requires: ctetgen
104330602db0SMatthew G. Knepley     args: -run_type test -dm_plex_dim 3 -variable_coefficient field -petscspace_degree 2 -mat_petscspace_degree 1 -show_initial -dm_plex_print_fem 1
1044c4762a1bSJed Brown 
1045c4762a1bSJed Brown   test:
1046c4762a1bSJed Brown     suffix: 28
1047c4762a1bSJed Brown     requires: ctetgen
104830602db0SMatthew G. Knepley     args: -run_type test -dm_plex_dim 3 -dm_refine_volume_limit_pre 0.0125 -variable_coefficient field -petscspace_degree 2 -mat_petscspace_degree 1 -show_initial -dm_plex_print_fem 1
1049c4762a1bSJed Brown 
1050c4762a1bSJed Brown   # P0 variable coefficient 29-36
1051c4762a1bSJed Brown   test:
1052c4762a1bSJed Brown     suffix: 29
1053c4762a1bSJed Brown     requires: triangle
105430602db0SMatthew G. Knepley     args: -run_type test -variable_coefficient field -petscspace_degree 1 -show_initial -dm_plex_print_fem 1
1055c4762a1bSJed Brown 
1056c4762a1bSJed Brown   test:
1057c4762a1bSJed Brown     suffix: 30
1058c4762a1bSJed Brown     requires: triangle
105930602db0SMatthew G. Knepley     args: -run_type test -dm_refine_volume_limit_pre 0.0625 -variable_coefficient field -petscspace_degree 1 -show_initial -dm_plex_print_fem 1
1060c4762a1bSJed Brown 
1061c4762a1bSJed Brown   test:
1062c4762a1bSJed Brown     suffix: 31
1063c4762a1bSJed Brown     requires: triangle
106430602db0SMatthew G. Knepley     args: -run_type test -variable_coefficient field -petscspace_degree 2 -show_initial -dm_plex_print_fem 1
1065c4762a1bSJed Brown 
1066c4762a1bSJed Brown   test:
1067c4762a1bSJed Brown     requires: triangle
1068c4762a1bSJed Brown     suffix: 32
106930602db0SMatthew G. Knepley     args: -run_type test -dm_refine_volume_limit_pre 0.0625 -variable_coefficient field -petscspace_degree 2 -show_initial -dm_plex_print_fem 1
1070c4762a1bSJed Brown 
1071c4762a1bSJed Brown   test:
1072c4762a1bSJed Brown     requires: ctetgen
1073c4762a1bSJed Brown     suffix: 33
107430602db0SMatthew G. Knepley     args: -run_type test -dm_plex_dim 3 -variable_coefficient field -petscspace_degree 1 -show_initial -dm_plex_print_fem 1
1075c4762a1bSJed Brown 
1076c4762a1bSJed Brown   test:
1077c4762a1bSJed Brown     suffix: 34
1078c4762a1bSJed Brown     requires: ctetgen
107930602db0SMatthew G. Knepley     args: -run_type test -dm_plex_dim 3 -dm_refine_volume_limit_pre 0.0125 -variable_coefficient field -petscspace_degree 1 -show_initial -dm_plex_print_fem 1
1080c4762a1bSJed Brown 
1081c4762a1bSJed Brown   test:
1082c4762a1bSJed Brown     suffix: 35
1083c4762a1bSJed Brown     requires: ctetgen
108430602db0SMatthew G. Knepley     args: -run_type test -dm_plex_dim 3 -variable_coefficient field -petscspace_degree 2 -show_initial -dm_plex_print_fem 1
1085c4762a1bSJed Brown 
1086c4762a1bSJed Brown   test:
1087c4762a1bSJed Brown     suffix: 36
1088c4762a1bSJed Brown     requires: ctetgen
108930602db0SMatthew G. Knepley     args: -run_type test -dm_plex_dim 3 -dm_refine_volume_limit_pre 0.0125 -variable_coefficient field -petscspace_degree 2 -show_initial -dm_plex_print_fem 1
1090c4762a1bSJed Brown 
1091c4762a1bSJed Brown   # Full solve 39-44
1092c4762a1bSJed Brown   test:
1093c4762a1bSJed Brown     suffix: 39
1094c4762a1bSJed Brown     requires: triangle !single
1095bae903cbSmarkadams4     args: -run_type full -dm_refine_volume_limit_pre 0.015625 -petscspace_degree 2 -pc_type gamg -pc_gamg_esteig_ksp_type cg -pc_gamg_esteig_ksp_max_it 10 -snes_rtol 1.0e-6 -ksp_rtol 1.0e-7 -ksp_monitor -ksp_converged_reason -snes_monitor_short -snes_converged_reason ::ascii_info_detail
1096c4762a1bSJed Brown   test:
1097c4762a1bSJed Brown     suffix: 40
1098c4762a1bSJed Brown     requires: triangle !single
109930602db0SMatthew G. Knepley     args: -run_type full -dm_refine_volume_limit_pre 0.015625 -variable_coefficient nonlinear -petscspace_degree 2 -pc_type svd -ksp_rtol 1.0e-10 -snes_monitor_short -snes_converged_reason ::ascii_info_detail
1100c4762a1bSJed Brown   test:
1101c4762a1bSJed Brown     suffix: 41
1102c4762a1bSJed Brown     requires: triangle !single
110330602db0SMatthew G. Knepley     args: -run_type full -dm_refine_volume_limit_pre 0.03125 -variable_coefficient nonlinear -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
1104c4762a1bSJed Brown   test:
1105c4762a1bSJed Brown     suffix: 42
1106c4762a1bSJed Brown     requires: triangle !single
110730602db0SMatthew G. Knepley     args: -run_type full -dm_refine_volume_limit_pre 0.0625 -variable_coefficient nonlinear -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 -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
1108c4762a1bSJed Brown   test:
1109c4762a1bSJed Brown     suffix: 43
1110c4762a1bSJed Brown     requires: triangle !single
1111c4762a1bSJed Brown     nsize: 2
1112e600fa54SMatthew G. Knepley     args: -run_type full -dm_refine_volume_limit_pre 0.03125 -variable_coefficient nonlinear -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
1113c4762a1bSJed Brown 
1114c4762a1bSJed Brown   test:
1115c4762a1bSJed Brown     suffix: 44
1116c4762a1bSJed Brown     requires: triangle !single
1117c4762a1bSJed Brown     nsize: 2
1118e600fa54SMatthew G. Knepley     args: -run_type full -dm_refine_volume_limit_pre 0.0625 -variable_coefficient nonlinear -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
1119c4762a1bSJed Brown 
1120c4762a1bSJed Brown   # These tests use a loose tolerance just to exercise the PtAP operations for MATIS and multiple PCBDDC setup calls inside PCMG
1121c4762a1bSJed Brown   testset:
1122c4762a1bSJed Brown     requires: triangle !single
1123c4762a1bSJed Brown     nsize: 3
11242b3cbbdaSStefano Zampini     args: -run_type full -petscspace_degree 1 -dm_mat_type is -pc_type mg -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
1125c4762a1bSJed Brown     test:
1126c4762a1bSJed Brown       suffix: gmg_bddc
1127c4762a1bSJed Brown       filter: sed -e "s/CONVERGED_FNORM_RELATIVE iterations 3/CONVERGED_FNORM_RELATIVE iterations 4/g"
1128c4762a1bSJed Brown       args: -mg_levels_pc_type jacobi
1129c4762a1bSJed Brown     test:
1130c4762a1bSJed Brown       filter: sed -e "s/iterations [0-4]/iterations 4/g"
1131c4762a1bSJed Brown       suffix: gmg_bddc_lev
1132c4762a1bSJed Brown       args: -mg_levels_pc_type bddc
1133c4762a1bSJed Brown 
1134c4762a1bSJed Brown   # Restarting
1135c4762a1bSJed Brown   testset:
1136c4762a1bSJed Brown     suffix: restart
1137c4762a1bSJed Brown     requires: hdf5 triangle !complex
113830602db0SMatthew G. Knepley     args: -run_type test -bc_type dirichlet -petscspace_degree 1
1139c4762a1bSJed Brown     test:
1140c4762a1bSJed Brown       args: -dm_view hdf5:sol.h5 -vec_view hdf5:sol.h5::append
1141c4762a1bSJed Brown     test:
1142cd7e8a5eSksagiyam       args: -dm_plex_filename sol.h5 -dm_plex_name box -restart
1143c4762a1bSJed Brown 
1144c4762a1bSJed Brown   # Periodicity
1145c4762a1bSJed Brown   test:
1146c4762a1bSJed Brown     suffix: periodic_0
1147c4762a1bSJed Brown     requires: triangle
114830602db0SMatthew G. Knepley     args: -run_type full -bc_type dirichlet -petscspace_degree 1 -snes_converged_reason ::ascii_info_detail
1149c4762a1bSJed Brown 
1150c4762a1bSJed Brown   test:
1151c4762a1bSJed Brown     requires: !complex
1152c4762a1bSJed Brown     suffix: periodic_1
115330602db0SMatthew G. Knepley     args: -quiet -run_type test -dm_plex_simplex 0 -dm_plex_box_faces 3,3 -dm_plex_box_bd periodic,periodic -vec_view vtk:test.vtu:vtk_vtu -petscspace_degree 1 -dm_refine 1
1154c4762a1bSJed Brown 
1155c4762a1bSJed Brown   # 2D serial P1 test with field bc
1156c4762a1bSJed Brown   test:
1157c4762a1bSJed Brown     suffix: field_bc_2d_p1_0
1158c4762a1bSJed Brown     requires: triangle
115930602db0SMatthew G. Knepley     args: -run_type test -bc_type dirichlet -field_bc -petscspace_degree 1 -bc_petscspace_degree 2 -show_initial -dm_plex_print_fem 1
1160c4762a1bSJed Brown 
1161c4762a1bSJed Brown   test:
1162c4762a1bSJed Brown     suffix: field_bc_2d_p1_1
1163c4762a1bSJed Brown     requires: triangle
116430602db0SMatthew G. Knepley     args: -run_type test -dm_refine 1 -bc_type dirichlet -field_bc -petscspace_degree 1 -bc_petscspace_degree 2 -show_initial -dm_plex_print_fem 1
1165c4762a1bSJed Brown 
1166c4762a1bSJed Brown   test:
1167c4762a1bSJed Brown     suffix: field_bc_2d_p1_neumann_0
1168c4762a1bSJed Brown     requires: triangle
116930602db0SMatthew G. Knepley     args: -run_type test -bc_type neumann -dm_plex_boundary_label boundary -field_bc -petscspace_degree 1 -bc_petscspace_degree 2 -show_initial -dm_plex_print_fem 1
1170c4762a1bSJed Brown 
1171c4762a1bSJed Brown   test:
1172c4762a1bSJed Brown     suffix: field_bc_2d_p1_neumann_1
1173c4762a1bSJed Brown     requires: triangle
117430602db0SMatthew G. Knepley     args: -run_type test -dm_refine 1 -bc_type neumann -dm_plex_boundary_label boundary -field_bc -petscspace_degree 1 -bc_petscspace_degree 2 -show_initial -dm_plex_print_fem 1
1175c4762a1bSJed Brown 
1176c4762a1bSJed Brown   # 3D serial P1 test with field bc
1177c4762a1bSJed Brown   test:
1178c4762a1bSJed Brown     suffix: field_bc_3d_p1_0
1179c4762a1bSJed Brown     requires: ctetgen
118030602db0SMatthew G. Knepley     args: -run_type test -dm_plex_dim 3 -bc_type dirichlet -field_bc -petscspace_degree 1 -bc_petscspace_degree 2 -show_initial -dm_plex_print_fem 1
1181c4762a1bSJed Brown 
1182c4762a1bSJed Brown   test:
1183c4762a1bSJed Brown     suffix: field_bc_3d_p1_1
1184c4762a1bSJed Brown     requires: ctetgen
118530602db0SMatthew G. Knepley     args: -run_type test -dm_plex_dim 3 -dm_refine 1 -bc_type dirichlet -field_bc -petscspace_degree 1 -bc_petscspace_degree 2 -show_initial -dm_plex_print_fem 1
1186c4762a1bSJed Brown 
1187c4762a1bSJed Brown   test:
1188c4762a1bSJed Brown     suffix: field_bc_3d_p1_neumann_0
1189c4762a1bSJed Brown     requires: ctetgen
119030602db0SMatthew G. Knepley     args: -run_type test -dm_plex_dim 3 -bc_type neumann -dm_plex_boundary_label boundary -field_bc -petscspace_degree 1 -bc_petscspace_degree 2 -show_initial -dm_plex_print_fem 1
1191c4762a1bSJed Brown 
1192c4762a1bSJed Brown   test:
1193c4762a1bSJed Brown     suffix: field_bc_3d_p1_neumann_1
1194c4762a1bSJed Brown     requires: ctetgen
119530602db0SMatthew G. Knepley     args: -run_type test -dm_plex_dim 3 -dm_refine 1 -bc_type neumann -dm_plex_boundary_label boundary -field_bc -petscspace_degree 1 -bc_petscspace_degree 2 -show_initial -dm_plex_print_fem 1
1196c4762a1bSJed Brown 
1197c4762a1bSJed Brown   # 2D serial P2 test with field bc
1198c4762a1bSJed Brown   test:
1199c4762a1bSJed Brown     suffix: field_bc_2d_p2_0
1200c4762a1bSJed Brown     requires: triangle
120130602db0SMatthew G. Knepley     args: -run_type test -bc_type dirichlet -field_bc -petscspace_degree 2 -bc_petscspace_degree 2 -show_initial -dm_plex_print_fem 1
1202c4762a1bSJed Brown 
1203c4762a1bSJed Brown   test:
1204c4762a1bSJed Brown     suffix: field_bc_2d_p2_1
1205c4762a1bSJed Brown     requires: triangle
120630602db0SMatthew G. Knepley     args: -run_type test -dm_refine 1 -bc_type dirichlet -field_bc -petscspace_degree 2 -bc_petscspace_degree 2 -show_initial -dm_plex_print_fem 1
1207c4762a1bSJed Brown 
1208c4762a1bSJed Brown   test:
1209c4762a1bSJed Brown     suffix: field_bc_2d_p2_neumann_0
1210c4762a1bSJed Brown     requires: triangle
121130602db0SMatthew G. Knepley     args: -run_type test -bc_type neumann -dm_plex_boundary_label boundary -field_bc -petscspace_degree 2 -bc_petscspace_degree 2 -show_initial -dm_plex_print_fem 1
1212c4762a1bSJed Brown 
1213c4762a1bSJed Brown   test:
1214c4762a1bSJed Brown     suffix: field_bc_2d_p2_neumann_1
1215c4762a1bSJed Brown     requires: triangle
121630602db0SMatthew G. Knepley     args: -run_type test -dm_refine 1 -bc_type neumann -dm_plex_boundary_label boundary -field_bc -petscspace_degree 2 -bc_petscspace_degree 2 -show_initial -dm_plex_print_fem 1
1217c4762a1bSJed Brown 
1218c4762a1bSJed Brown   # 3D serial P2 test with field bc
1219c4762a1bSJed Brown   test:
1220c4762a1bSJed Brown     suffix: field_bc_3d_p2_0
1221c4762a1bSJed Brown     requires: ctetgen
122230602db0SMatthew G. Knepley     args: -run_type test -dm_plex_dim 3 -bc_type dirichlet -field_bc -petscspace_degree 2 -bc_petscspace_degree 2 -show_initial -dm_plex_print_fem 1
1223c4762a1bSJed Brown 
1224c4762a1bSJed Brown   test:
1225c4762a1bSJed Brown     suffix: field_bc_3d_p2_1
1226c4762a1bSJed Brown     requires: ctetgen
122730602db0SMatthew G. Knepley     args: -run_type test -dm_plex_dim 3 -dm_refine 1 -bc_type dirichlet -field_bc -petscspace_degree 2 -bc_petscspace_degree 2 -show_initial -dm_plex_print_fem 1
1228c4762a1bSJed Brown 
1229c4762a1bSJed Brown   test:
1230c4762a1bSJed Brown     suffix: field_bc_3d_p2_neumann_0
1231c4762a1bSJed Brown     requires: ctetgen
123230602db0SMatthew G. Knepley     args: -run_type test -dm_plex_dim 3 -bc_type neumann -dm_plex_boundary_label boundary -field_bc -petscspace_degree 2 -bc_petscspace_degree 2 -show_initial -dm_plex_print_fem 1
1233c4762a1bSJed Brown 
1234c4762a1bSJed Brown   test:
1235c4762a1bSJed Brown     suffix: field_bc_3d_p2_neumann_1
1236c4762a1bSJed Brown     requires: ctetgen
123730602db0SMatthew G. Knepley     args: -run_type test -dm_plex_dim 3 -dm_refine 1 -bc_type neumann -dm_plex_boundary_label boundary -field_bc -petscspace_degree 2 -bc_petscspace_degree 2 -show_initial -dm_plex_print_fem 1
1238c4762a1bSJed Brown 
1239c4762a1bSJed Brown   # Full solve simplex: Convergence
1240c4762a1bSJed Brown   test:
12410fdc7489SMatthew Knepley     suffix: 3d_p1_conv
1242c4762a1bSJed Brown     requires: ctetgen
124330602db0SMatthew G. Knepley     args: -run_type full -dm_plex_dim 3 -dm_refine 1 -bc_type dirichlet -petscspace_degree 1 \
12440fdc7489SMatthew Knepley       -snes_convergence_estimate -convest_num_refine 1 -pc_type lu
1245c4762a1bSJed Brown 
1246c4762a1bSJed Brown   # Full solve simplex: PCBDDC
1247c4762a1bSJed Brown   test:
1248c4762a1bSJed Brown     suffix: tri_bddc
1249c4762a1bSJed Brown     requires: triangle !single
1250c4762a1bSJed Brown     nsize: 5
1251e600fa54SMatthew G. Knepley     args: -run_type full -petscpartitioner_type simple -dm_refine 2 -bc_type dirichlet -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
1252c4762a1bSJed Brown 
1253c4762a1bSJed Brown   # Full solve simplex: PCBDDC
1254c4762a1bSJed Brown   test:
1255c4762a1bSJed Brown     suffix: tri_parmetis_bddc
1256c4762a1bSJed Brown     requires: triangle !single parmetis
1257c4762a1bSJed Brown     nsize: 4
1258e600fa54SMatthew G. Knepley     args: -run_type full -petscpartitioner_type parmetis -dm_refine 2 -bc_type dirichlet -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
1259c4762a1bSJed Brown 
1260c4762a1bSJed Brown   testset:
1261e600fa54SMatthew G. Knepley     args: -run_type full -dm_plex_simplex 0 -dm_plex_box_faces 3,3 -petscpartitioner_type simple -dm_refine 2 -bc_type dirichlet -petscspace_degree 2 -dm_mat_type is -pc_type bddc -ksp_type gmres -snes_monitor_short -ksp_monitor_short -snes_view -petscspace_poly_tensor -pc_bddc_corner_selection -ksp_rtol 1.e-9 -pc_bddc_use_edges 0
1262c4762a1bSJed Brown     nsize: 5
1263c4762a1bSJed Brown     output_file: output/ex12_quad_bddc.out
1264c4762a1bSJed Brown     filter: sed -e "s/aijcusparse/aij/g" -e "s/aijviennacl/aij/g" -e "s/factorization: cusparse/factorization: petsc/g"
1265c4762a1bSJed Brown     test:
1266c4762a1bSJed Brown       requires: !single
1267c4762a1bSJed Brown       suffix: quad_bddc
1268c4762a1bSJed Brown     test:
1269c4762a1bSJed Brown       requires: !single cuda
1270c4762a1bSJed Brown       suffix: quad_bddc_cuda
1271c4762a1bSJed Brown       args: -matis_localmat_type aijcusparse -pc_bddc_dirichlet_pc_factor_mat_solver_type cusparse -pc_bddc_neumann_pc_factor_mat_solver_type cusparse
1272c4762a1bSJed Brown     test:
1273c4762a1bSJed Brown       requires: !single viennacl
1274c4762a1bSJed Brown       suffix: quad_bddc_viennacl
1275c4762a1bSJed Brown       args: -matis_localmat_type aijviennacl
1276c4762a1bSJed Brown 
1277c4762a1bSJed Brown   # Full solve simplex: ASM
1278c4762a1bSJed Brown   test:
1279c4762a1bSJed Brown     suffix: tri_q2q1_asm_lu
1280c4762a1bSJed Brown     requires: triangle !single
128130602db0SMatthew G. Knepley     args: -run_type full -dm_refine 3 -bc_type dirichlet -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
1282c4762a1bSJed Brown 
1283c4762a1bSJed Brown   test:
1284c4762a1bSJed Brown     suffix: tri_q2q1_msm_lu
1285c4762a1bSJed Brown     requires: triangle !single
128630602db0SMatthew G. Knepley     args: -run_type full -dm_refine 3 -bc_type dirichlet -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
1287c4762a1bSJed Brown 
1288c4762a1bSJed Brown   test:
1289c4762a1bSJed Brown     suffix: tri_q2q1_asm_sor
1290c4762a1bSJed Brown     requires: triangle !single
129130602db0SMatthew G. Knepley     args: -run_type full -dm_refine 3 -bc_type dirichlet -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
1292c4762a1bSJed Brown 
1293c4762a1bSJed Brown   test:
1294c4762a1bSJed Brown     suffix: tri_q2q1_msm_sor
1295c4762a1bSJed Brown     requires: triangle !single
129630602db0SMatthew G. Knepley     args: -run_type full -dm_refine 3 -bc_type dirichlet -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
1297c4762a1bSJed Brown 
1298c4762a1bSJed Brown   # Full solve simplex: FAS
1299c4762a1bSJed Brown   test:
1300c4762a1bSJed Brown     suffix: fas_newton_0
1301c4762a1bSJed Brown     requires: triangle !single
130230602db0SMatthew G. Knepley     args: -run_type full -variable_coefficient nonlinear -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
1303c4762a1bSJed Brown 
1304c4762a1bSJed Brown   test:
1305c4762a1bSJed Brown     suffix: fas_newton_1
1306c4762a1bSJed Brown     requires: triangle !single
130730602db0SMatthew G. Knepley     args: -run_type full -dm_refine_hierarchy 3 -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
1308c4ef839dSSatish Balay     filter: sed -e "s/total number of linear solver iterations=14/total number of linear solver iterations=15/g"
1309c4762a1bSJed Brown 
1310c4762a1bSJed Brown   test:
1311c4762a1bSJed Brown     suffix: fas_ngs_0
1312c4762a1bSJed Brown     requires: triangle !single
131330602db0SMatthew G. Knepley     args: -run_type full -variable_coefficient nonlinear -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
1314c4762a1bSJed Brown 
1315071b71afSMatthew G. Knepley   # These two tests are broken because DMPlexComputeInjectorFEM() only works for regularly refined meshes
1316c4762a1bSJed Brown   test:
1317c4762a1bSJed Brown     suffix: fas_newton_coarse_0
1318c4762a1bSJed Brown     requires: pragmatic triangle
1319c4762a1bSJed Brown     TODO: broken
1320071b71afSMatthew G. Knepley     args: -run_type full -variable_coefficient nonlinear -petscspace_degree 1 \
132134b6e994SJoe Wallwork           -dm_refine 2 -dm_coarsen_hierarchy 1 -dm_plex_hash_location -dm_adaptor pragmatic \
1322071b71afSMatthew G. Knepley           -snes_type fas -snes_fas_levels 2 -snes_converged_reason ::ascii_info_detail -snes_monitor_short -snes_view \
1323071b71afSMatthew G. Knepley             -fas_coarse_pc_type svd -fas_coarse_ksp_rtol 1.0e-10 -fas_coarse_snes_monitor_short -fas_coarse_snes_linesearch_type basic \
1324071b71afSMatthew G. Knepley             -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
1325c4762a1bSJed Brown 
1326c4762a1bSJed Brown   test:
1327c4762a1bSJed Brown     suffix: mg_newton_coarse_0
1328c4762a1bSJed Brown     requires: triangle pragmatic
1329c4762a1bSJed Brown     TODO: broken
1330071b71afSMatthew G. Knepley     args: -run_type full -petscspace_degree 1 \
133134b6e994SJoe Wallwork           -dm_refine 3 -dm_coarsen_hierarchy 3 -dm_plex_hash_location -dm_adaptor pragmatic \
1332071b71afSMatthew G. Knepley           -snes_atol 1.0e-8 -snes_rtol 0.0 -snes_monitor_short -snes_converged_reason ::ascii_info_detail -snes_view \
1333071b71afSMatthew G. Knepley             -ksp_type richardson -ksp_atol 1.0e-8 -ksp_rtol 0.0 -ksp_norm_type unpreconditioned -ksp_monitor_true_residual \
1334071b71afSMatthew G. Knepley               -pc_type mg -pc_mg_levels 4 \
1335071b71afSMatthew G. Knepley               -mg_levels_ksp_type gmres -mg_levels_pc_type ilu -mg_levels_ksp_max_it 10
1336c4762a1bSJed Brown 
1337c4762a1bSJed Brown   # Full solve tensor
1338c4762a1bSJed Brown   test:
1339c4762a1bSJed Brown     suffix: tensor_plex_2d
134030602db0SMatthew G. Knepley     args: -run_type test -dm_plex_simplex 0 -bc_type dirichlet -petscspace_degree 1 -dm_refine_hierarchy 2
1341c4762a1bSJed Brown 
1342c4762a1bSJed Brown   test:
1343c4762a1bSJed Brown     suffix: tensor_p4est_2d
1344c4762a1bSJed Brown     requires: p4est
134530602db0SMatthew G. Knepley     args: -run_type test -dm_plex_simplex 0 -bc_type dirichlet -petscspace_degree 1 -dm_forest_initial_refinement 2 -dm_forest_minimum_refinement 0 -dm_plex_convert_type p4est
1346c4762a1bSJed Brown 
1347c4762a1bSJed Brown   test:
1348c4762a1bSJed Brown     suffix: tensor_plex_3d
134930602db0SMatthew G. Knepley     args: -run_type test -dm_plex_simplex 0 -bc_type dirichlet -petscspace_degree 1 -dm_plex_dim 3 -dm_refine_hierarchy 1 -dm_plex_box_faces 2,2,2
1350c4762a1bSJed Brown 
1351c4762a1bSJed Brown   test:
1352c4762a1bSJed Brown     suffix: tensor_p4est_3d
1353c4762a1bSJed Brown     requires: p4est
135430602db0SMatthew G. Knepley     args: -run_type test -dm_plex_simplex 0 -bc_type dirichlet -petscspace_degree 1 -dm_forest_initial_refinement 1 -dm_forest_minimum_refinement 0 -dm_plex_dim 3 -dm_plex_convert_type p8est -dm_plex_box_faces 2,2,2
1355c4762a1bSJed Brown 
1356c4762a1bSJed Brown   test:
1357c4762a1bSJed Brown     suffix: p4est_test_q2_conformal_serial
1358c4762a1bSJed Brown     requires: p4est
135930602db0SMatthew G. Knepley     args: -run_type test -petscspace_degree 2 -dm_plex_simplex 0 -dm_plex_convert_type p4est -dm_forest_minimum_refinement 0 -dm_forest_initial_refinement 2
1360c4762a1bSJed Brown 
1361c4762a1bSJed Brown   test:
1362c4762a1bSJed Brown     suffix: p4est_test_q2_conformal_parallel
1363c4762a1bSJed Brown     requires: p4est
1364c4762a1bSJed Brown     nsize: 7
1365e600fa54SMatthew G. Knepley     args: -run_type test -petscspace_degree 2 -dm_plex_simplex 0 -dm_plex_convert_type p4est -dm_forest_minimum_refinement 0 -dm_forest_initial_refinement 2 -petscpartitioner_type simple
1366c4762a1bSJed Brown 
1367c4762a1bSJed Brown   test:
1368c4762a1bSJed Brown     suffix: p4est_test_q2_conformal_parallel_parmetis
1369c4762a1bSJed Brown     requires: parmetis p4est
1370c4762a1bSJed Brown     nsize: 4
1371e600fa54SMatthew G. Knepley     args: -run_type test -petscspace_degree 2 -dm_plex_simplex 0 -dm_plex_convert_type p4est -dm_forest_minimum_refinement 0 -dm_forest_initial_refinement 2 -petscpartitioner_type parmetis
1372c4762a1bSJed Brown 
1373c4762a1bSJed Brown   test:
1374c4762a1bSJed Brown     suffix: p4est_test_q2_nonconformal_serial
1375c4762a1bSJed Brown     requires: p4est
1376c4762a1bSJed Brown     filter: grep -v "CG or CGNE: variant"
137730602db0SMatthew G. Knepley     args: -run_type test -petscspace_degree 2 -dm_plex_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
1378c4762a1bSJed Brown 
1379c4762a1bSJed Brown   test:
1380c4762a1bSJed Brown     suffix: p4est_test_q2_nonconformal_parallel
1381c4762a1bSJed Brown     requires: p4est
1382c4762a1bSJed Brown     filter: grep -v "CG or CGNE: variant"
1383c4762a1bSJed Brown     nsize: 7
1384e600fa54SMatthew G. Knepley     args: -run_type test -petscspace_degree 2 -dm_plex_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
1385c4762a1bSJed Brown 
1386c4762a1bSJed Brown   test:
1387c4762a1bSJed Brown     suffix: p4est_test_q2_nonconformal_parallel_parmetis
1388c4762a1bSJed Brown     requires: parmetis p4est
1389c4762a1bSJed Brown     nsize: 4
1390e600fa54SMatthew G. Knepley     args: -run_type test -petscspace_degree 2 -dm_plex_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
1391c4762a1bSJed Brown 
1392c4762a1bSJed Brown   test:
1393c4762a1bSJed Brown     suffix: p4est_exact_q2_conformal_serial
1394c4762a1bSJed Brown     requires: p4est !single !complex !__float128
139530602db0SMatthew G. Knepley     args: -run_type exact -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 -dm_plex_simplex 0 -dm_plex_convert_type p4est -dm_forest_minimum_refinement 0 -dm_forest_initial_refinement 2
1396c4762a1bSJed Brown 
1397c4762a1bSJed Brown   test:
1398c4762a1bSJed Brown     suffix: p4est_exact_q2_conformal_parallel
1399c4762a1bSJed Brown     requires: p4est !single !complex !__float128
1400c4762a1bSJed Brown     nsize: 4
1401e600fa54SMatthew G. Knepley     args: -run_type exact -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 -dm_plex_simplex 0 -dm_plex_convert_type p4est -dm_forest_minimum_refinement 0 -dm_forest_initial_refinement 2
1402c4762a1bSJed Brown 
1403c4762a1bSJed Brown   test:
1404c4762a1bSJed Brown     suffix: p4est_exact_q2_conformal_parallel_parmetis
1405c4762a1bSJed Brown     requires: parmetis p4est !single
1406c4762a1bSJed Brown     nsize: 4
1407e600fa54SMatthew G. Knepley     args: -run_type exact -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 -dm_plex_simplex 0 -dm_plex_convert_type p4est -dm_forest_minimum_refinement 0 -dm_forest_initial_refinement 2 -petscpartitioner_type parmetis
1408c4762a1bSJed Brown 
1409c4762a1bSJed Brown   test:
1410c4762a1bSJed Brown     suffix: p4est_exact_q2_nonconformal_serial
1411c4762a1bSJed Brown     requires: p4est
141230602db0SMatthew G. Knepley     args: -run_type exact -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 -dm_plex_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
1413c4762a1bSJed Brown 
1414c4762a1bSJed Brown   test:
1415c4762a1bSJed Brown     suffix: p4est_exact_q2_nonconformal_parallel
1416c4762a1bSJed Brown     requires: p4est
1417c4762a1bSJed Brown     nsize: 7
1418e600fa54SMatthew G. Knepley     args: -run_type exact -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 -dm_plex_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
1419c4762a1bSJed Brown 
1420c4762a1bSJed Brown   test:
1421c4762a1bSJed Brown     suffix: p4est_exact_q2_nonconformal_parallel_parmetis
1422c4762a1bSJed Brown     requires: parmetis p4est
1423c4762a1bSJed Brown     nsize: 4
1424e600fa54SMatthew G. Knepley     args: -run_type exact -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 -dm_plex_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
1425c4762a1bSJed Brown 
1426c4762a1bSJed Brown   test:
1427c4762a1bSJed Brown     suffix: p4est_full_q2_nonconformal_serial
1428c4762a1bSJed Brown     requires: p4est !single
1429c4762a1bSJed Brown     filter: grep -v "variant HERMITIAN"
143030602db0SMatthew G. Knepley     args: -run_type full -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 -dm_plex_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
1431c4762a1bSJed Brown 
1432c4762a1bSJed Brown   test:
1433c4762a1bSJed Brown     suffix: p4est_full_q2_nonconformal_parallel
1434c4762a1bSJed Brown     requires: p4est !single
1435c4762a1bSJed Brown     filter: grep -v "variant HERMITIAN"
1436c4762a1bSJed Brown     nsize: 7
1437e600fa54SMatthew G. Knepley     args: -run_type full -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 -dm_plex_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
1438c4762a1bSJed Brown 
1439c4762a1bSJed Brown   test:
1440c4762a1bSJed Brown     suffix: p4est_full_q2_nonconformal_parallel_bddcfas
1441c4762a1bSJed Brown     requires: p4est !single
1442c4762a1bSJed Brown     filter: grep -v "variant HERMITIAN"
1443c4762a1bSJed Brown     nsize: 7
1444e600fa54SMatthew G. Knepley     args: -run_type full -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 -dm_plex_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
1445c4762a1bSJed Brown 
1446c4762a1bSJed Brown   test:
1447c4762a1bSJed Brown     suffix: p4est_full_q2_nonconformal_parallel_bddc
1448c4762a1bSJed Brown     requires: p4est !single
1449c4762a1bSJed Brown     filter: grep -v "variant HERMITIAN"
1450c4762a1bSJed Brown     nsize: 7
1451e600fa54SMatthew G. Knepley     args: -run_type full -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 -dm_plex_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
1452c4762a1bSJed Brown 
1453c4762a1bSJed Brown   test:
1454c4762a1bSJed Brown     TODO: broken
1455c4762a1bSJed Brown     suffix: p4est_fas_q2_conformal_serial
1456c4762a1bSJed Brown     requires: p4est !complex !__float128
145730602db0SMatthew G. Knepley     args: -run_type full -variable_coefficient nonlinear -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 -dm_plex_simplex 0 -dm_refine_hierarchy 3
1458c4762a1bSJed Brown 
1459c4762a1bSJed Brown   test:
1460c4762a1bSJed Brown     TODO: broken
1461c4762a1bSJed Brown     suffix: p4est_fas_q2_nonconformal_serial
1462c4762a1bSJed Brown     requires: p4est
146330602db0SMatthew G. Knepley     args: -run_type full -variable_coefficient nonlinear -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 -dm_plex_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
1464c4762a1bSJed Brown 
1465c4762a1bSJed Brown   test:
1466c4762a1bSJed Brown     suffix: fas_newton_0_p4est
1467c4762a1bSJed Brown     requires: p4est !single !__float128
146830602db0SMatthew G. Knepley     args: -run_type full -variable_coefficient nonlinear -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 -dm_plex_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
1469c4762a1bSJed Brown 
1470c4762a1bSJed Brown   # Full solve simplicial AMR
1471c4762a1bSJed Brown   test:
1472ab5a7ff4SJoe Wallwork     suffix: tri_p1_adapt_init_pragmatic
1473c4762a1bSJed Brown     requires: pragmatic
14748d1b37daSJoe Wallwork     args: -run_type exact -dm_refine 5 -bc_type dirichlet -petscspace_degree 1 -variable_coefficient ball -snes_converged_reason ::ascii_info_detail -pc_type lu -snes_adapt_initial 1 -adaptor_target_num 4000 -dm_plex_metric_h_max 0.5 -dm_adaptor pragmatic
1475c4762a1bSJed Brown 
1476c4762a1bSJed Brown   test:
14770383c1e7SJoe Wallwork     suffix: tri_p2_adapt_init_pragmatic
14780383c1e7SJoe Wallwork     requires: pragmatic
14790383c1e7SJoe Wallwork     args: -run_type exact -dm_refine 5 -bc_type dirichlet -petscspace_degree 2 -variable_coefficient ball -snes_converged_reason ::ascii_info_detail -pc_type lu -snes_adapt_initial 1 -adaptor_target_num 4000 -dm_plex_metric_h_max 0.5 -dm_adaptor pragmatic
14800383c1e7SJoe Wallwork 
14810383c1e7SJoe Wallwork   test:
1482ab5a7ff4SJoe Wallwork     suffix: tri_p1_adapt_init_mmg
1483ab5a7ff4SJoe Wallwork     requires: mmg
14848d1b37daSJoe Wallwork     args: -run_type exact -dm_refine 5 -bc_type dirichlet -petscspace_degree 1 -variable_coefficient ball -snes_converged_reason ::ascii_info_detail -pc_type lu -snes_adapt_initial 1 -adaptor_target_num 4000 -dm_plex_metric_h_max 0.5 -dm_adaptor mmg
1485c4762a1bSJed Brown 
1486c4762a1bSJed Brown   test:
14870383c1e7SJoe Wallwork     suffix: tri_p2_adapt_init_mmg
14880383c1e7SJoe Wallwork     requires: mmg
14890383c1e7SJoe Wallwork     args: -run_type exact -dm_refine 5 -bc_type dirichlet -petscspace_degree 2 -variable_coefficient ball -snes_converged_reason ::ascii_info_detail -pc_type lu -snes_adapt_initial 1 -adaptor_target_num 4000 -dm_plex_metric_h_max 0.5 -dm_adaptor mmg
14900383c1e7SJoe Wallwork 
14910383c1e7SJoe Wallwork   test:
1492ab5a7ff4SJoe Wallwork     suffix: tri_p1_adapt_seq_pragmatic
1493c4762a1bSJed Brown     requires: pragmatic
14948d1b37daSJoe Wallwork     args: -run_type exact -dm_refine 5 -bc_type dirichlet -petscspace_degree 1 -variable_coefficient ball -snes_converged_reason ::ascii_info_detail -pc_type lu -snes_adapt_sequence 2 -adaptor_target_num 4000 -dm_plex_metric_h_max 0.5 -dm_adaptor pragmatic
1495ab5a7ff4SJoe Wallwork 
1496ab5a7ff4SJoe Wallwork   test:
14970383c1e7SJoe Wallwork     suffix: tri_p2_adapt_seq_pragmatic
14980383c1e7SJoe Wallwork     requires: pragmatic
14990383c1e7SJoe Wallwork     args: -run_type exact -dm_refine 5 -bc_type dirichlet -petscspace_degree 2 -variable_coefficient ball -snes_converged_reason ::ascii_info_detail -pc_type lu -snes_adapt_sequence 2 -adaptor_target_num 4000 -dm_plex_metric_h_max 0.5 -dm_adaptor pragmatic
15000383c1e7SJoe Wallwork 
15010383c1e7SJoe Wallwork   test:
1502ab5a7ff4SJoe Wallwork     suffix: tri_p1_adapt_seq_mmg
1503ab5a7ff4SJoe Wallwork     requires: mmg
15048d1b37daSJoe Wallwork     args: -run_type exact -dm_refine 5 -bc_type dirichlet -petscspace_degree 1 -variable_coefficient ball -snes_converged_reason ::ascii_info_detail -pc_type lu -snes_adapt_sequence 2 -adaptor_target_num 4000 -dm_plex_metric_h_max 0.5 -dm_adaptor mmg
1505ab5a7ff4SJoe Wallwork 
1506ab5a7ff4SJoe Wallwork   test:
15070383c1e7SJoe Wallwork     suffix: tri_p2_adapt_seq_mmg
15080383c1e7SJoe Wallwork     requires: mmg
15090383c1e7SJoe Wallwork     args: -run_type exact -dm_refine 5 -bc_type dirichlet -petscspace_degree 2 -variable_coefficient ball -snes_converged_reason ::ascii_info_detail -pc_type lu -snes_adapt_sequence 2 -adaptor_target_num 4000 -dm_plex_metric_h_max 0.5 -dm_adaptor mmg
15100383c1e7SJoe Wallwork 
15110383c1e7SJoe Wallwork   test:
1512ab5a7ff4SJoe Wallwork     suffix: tri_p1_adapt_analytic_pragmatic
1513ab5a7ff4SJoe Wallwork     requires: pragmatic
1514ab5a7ff4SJoe Wallwork     args: -run_type exact -dm_refine 3 -bc_type dirichlet -petscspace_degree 1 -variable_coefficient cross -snes_adapt_initial 4 -adaptor_target_num 500 -adaptor_monitor -dm_plex_metric_h_min 0.0001 -dm_plex_metric_h_max 0.05 -dm_adaptor pragmatic
1515ab5a7ff4SJoe Wallwork 
1516ab5a7ff4SJoe Wallwork   test:
15170383c1e7SJoe Wallwork     suffix: tri_p2_adapt_analytic_pragmatic
15180383c1e7SJoe Wallwork     requires: pragmatic
15190383c1e7SJoe Wallwork     args: -run_type exact -dm_refine 3 -bc_type dirichlet -petscspace_degree 2 -variable_coefficient cross -snes_adapt_initial 4 -adaptor_target_num 500 -adaptor_monitor -dm_plex_metric_h_min 0.0001 -dm_plex_metric_h_max 0.05 -dm_adaptor pragmatic
15200383c1e7SJoe Wallwork 
15210383c1e7SJoe Wallwork   test:
1522ab5a7ff4SJoe Wallwork     suffix: tri_p1_adapt_analytic_mmg
1523ab5a7ff4SJoe Wallwork     requires: mmg
15248d1b37daSJoe Wallwork     args: -run_type exact -dm_refine 3 -bc_type dirichlet -petscspace_degree 1 -variable_coefficient cross -snes_adapt_initial 4 -adaptor_target_num 500 -adaptor_monitor -dm_plex_metric_h_max 0.5 -dm_adaptor mmg
1525c4762a1bSJed Brown 
1526b8d0c900SJoe Wallwork   test:
15270383c1e7SJoe Wallwork     suffix: tri_p2_adapt_analytic_mmg
15280383c1e7SJoe Wallwork     requires: mmg
15290383c1e7SJoe Wallwork     args: -run_type exact -dm_refine 3 -bc_type dirichlet -petscspace_degree 2 -variable_coefficient cross -snes_adapt_initial 4 -adaptor_target_num 500 -adaptor_monitor -dm_plex_metric_h_max 0.5 -dm_adaptor mmg
15300383c1e7SJoe Wallwork 
15310383c1e7SJoe Wallwork   test:
1532b8d0c900SJoe Wallwork     suffix: tri_p1_adapt_uniform_pragmatic
1533b8d0c900SJoe Wallwork     requires: pragmatic tetgen
1534dc13bed2SJoe Wallwork     nsize: 2
1535e600fa54SMatthew G. Knepley     args: -run_type full -dm_plex_box_faces 8,8,8 -bc_type dirichlet -petscspace_degree 1 -variable_coefficient none -snes_converged_reason ::ascii_info_detail -ksp_type cg -pc_type sor -snes_adapt_sequence 3 -adaptor_target_num 400 -dm_plex_metric_h_max 0.5 -dm_plex_dim 3 -dm_adaptor pragmatic
1536b8d0c900SJoe Wallwork     timeoutfactor: 2
1537b8d0c900SJoe Wallwork 
1538b8d0c900SJoe Wallwork   test:
15390383c1e7SJoe Wallwork     suffix: tri_p2_adapt_uniform_pragmatic
15400383c1e7SJoe Wallwork     requires: pragmatic tetgen
1541dc13bed2SJoe Wallwork     nsize: 2
1542e600fa54SMatthew G. Knepley     args: -run_type full -dm_plex_box_faces 8,8,8 -bc_type dirichlet -petscspace_degree 2 -variable_coefficient none -snes_converged_reason ::ascii_info_detail -ksp_type cg -pc_type sor -snes_adapt_sequence 1 -adaptor_target_num 400 -dm_plex_metric_h_max 0.5 -dm_plex_dim 3 -dm_adaptor pragmatic
15430383c1e7SJoe Wallwork     timeoutfactor: 1
15440383c1e7SJoe Wallwork 
15450383c1e7SJoe Wallwork   test:
1546b8d0c900SJoe Wallwork     suffix: tri_p1_adapt_uniform_mmg
1547b8d0c900SJoe Wallwork     requires: mmg tetgen
15488d1b37daSJoe Wallwork     args: -run_type full -dm_plex_box_faces 4,4,4 -bc_type dirichlet -petscspace_degree 1 -variable_coefficient none -snes_converged_reason ::ascii_info_detail -ksp_type cg -pc_type sor -snes_adapt_sequence 3 -adaptor_target_num 400 -dm_plex_metric_h_max 0.5 -dm_plex_dim 3 -dm_adaptor mmg
1549b8d0c900SJoe Wallwork     timeoutfactor: 2
1550b8d0c900SJoe Wallwork 
1551b8d0c900SJoe Wallwork   test:
15520383c1e7SJoe Wallwork     suffix: tri_p2_adapt_uniform_mmg
15530383c1e7SJoe Wallwork     requires: mmg tetgen
15540383c1e7SJoe Wallwork     args: -run_type full -dm_plex_box_faces 4,4,4 -bc_type dirichlet -petscspace_degree 2 -variable_coefficient none -snes_converged_reason ::ascii_info_detail -ksp_type cg -pc_type sor -snes_adapt_sequence 1 -adaptor_target_num 400 -dm_plex_metric_h_max 0.5 -dm_plex_dim 3 -dm_adaptor mmg
15550383c1e7SJoe Wallwork     timeoutfactor: 1
15560383c1e7SJoe Wallwork 
15570383c1e7SJoe Wallwork   test:
1558b8d0c900SJoe Wallwork     suffix: tri_p1_adapt_uniform_parmmg
1559b8d0c900SJoe Wallwork     requires: parmmg tetgen
1560dc13bed2SJoe Wallwork     nsize: 2
1561e600fa54SMatthew G. Knepley     args: -run_type full -dm_plex_box_faces 8,8,8 -bc_type dirichlet -petscspace_degree 1 -variable_coefficient none -snes_converged_reason ::ascii_info_detail -ksp_type cg -pc_type sor -snes_adapt_sequence 3 -adaptor_target_num 400 -dm_plex_metric_h_max 0.5 -dm_plex_dim 3 -dm_adaptor parmmg
1562b8d0c900SJoe Wallwork     timeoutfactor: 2
1563b8d0c900SJoe Wallwork 
15640383c1e7SJoe Wallwork   test:
15650383c1e7SJoe Wallwork     suffix: tri_p2_adapt_uniform_parmmg
15660383c1e7SJoe Wallwork     requires: parmmg tetgen
1567dc13bed2SJoe Wallwork     nsize: 2
1568e600fa54SMatthew G. Knepley     args: -run_type full -dm_plex_box_faces 8,8,8 -bc_type dirichlet -petscspace_degree 2 -variable_coefficient none -snes_converged_reason ::ascii_info_detail -ksp_type cg -pc_type sor -snes_adapt_sequence 1 -adaptor_target_num 400 -dm_plex_metric_h_max 0.5 -dm_plex_dim 3 -dm_adaptor parmmg
15690383c1e7SJoe Wallwork     timeoutfactor: 1
15700383c1e7SJoe Wallwork 
1571c4762a1bSJed Brown   # Full solve tensor AMR
1572c4762a1bSJed Brown   test:
1573c4762a1bSJed Brown     suffix: quad_q1_adapt_0
1574c4762a1bSJed Brown     requires: p4est
15758d1b37daSJoe Wallwork     args: -run_type exact -dm_plex_simplex 0 -dm_plex_convert_type p4est -bc_type dirichlet -petscspace_degree 1 -variable_coefficient ball -snes_converged_reason ::ascii_info_detail -pc_type lu -dm_forest_initial_refinement 4 -snes_adapt_initial 1 -dm_view
1576c4762a1bSJed Brown     filter: grep -v DM_
1577c4762a1bSJed Brown 
1578c4762a1bSJed Brown   test:
1579c4762a1bSJed Brown     suffix: amr_0
1580c4762a1bSJed Brown     nsize: 5
1581e600fa54SMatthew G. Knepley     args: -run_type test -petscpartitioner_type simple -dm_plex_simplex 0 -bc_type dirichlet -petscspace_degree 1 -dm_refine 1
1582c4762a1bSJed Brown 
1583c4762a1bSJed Brown   test:
1584c4762a1bSJed Brown     suffix: amr_1
1585c4762a1bSJed Brown     requires: p4est !complex
158630602db0SMatthew G. Knepley     args: -run_type test -dm_plex_simplex 0 -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
1587c4762a1bSJed Brown 
1588c4762a1bSJed Brown   test:
1589c4762a1bSJed Brown     suffix: p4est_solve_bddc
1590c4762a1bSJed Brown     requires: p4est !complex
1591e600fa54SMatthew G. Knepley     args: -run_type full -variable_coefficient nonlinear -nonzero_initial_guess 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 -dm_plex_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
1592c4762a1bSJed Brown     nsize: 4
1593c4762a1bSJed Brown 
1594c4762a1bSJed Brown   test:
1595c4762a1bSJed Brown     suffix: p4est_solve_fas
1596c4762a1bSJed Brown     requires: p4est
1597e600fa54SMatthew G. Knepley     args: -run_type full -variable_coefficient nonlinear -nonzero_initial_guess 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 -dm_plex_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
1598c4762a1bSJed Brown     nsize: 4
1599c4762a1bSJed Brown     TODO: identical machine two runs produce slightly different solver trackers
1600c4762a1bSJed Brown 
1601c4762a1bSJed Brown   test:
1602c4762a1bSJed Brown     suffix: p4est_convergence_test_1
1603c4762a1bSJed Brown     requires: p4est
1604e600fa54SMatthew G. Knepley     args:  -quiet -run_type test -petscspace_degree 1 -dm_plex_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
1605c4762a1bSJed Brown     nsize: 4
1606c4762a1bSJed Brown 
1607c4762a1bSJed Brown   test:
1608c4762a1bSJed Brown     suffix: p4est_convergence_test_2
1609c4762a1bSJed Brown     requires: p4est
161030602db0SMatthew G. Knepley     args: -quiet -run_type test -petscspace_degree 1 -dm_plex_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
1611c4762a1bSJed Brown 
1612c4762a1bSJed Brown   test:
1613c4762a1bSJed Brown     suffix: p4est_convergence_test_3
1614c4762a1bSJed Brown     requires: p4est
161530602db0SMatthew G. Knepley     args: -quiet -run_type test -petscspace_degree 1 -dm_plex_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
1616c4762a1bSJed Brown 
1617c4762a1bSJed Brown   test:
1618c4762a1bSJed Brown     suffix: p4est_convergence_test_4
1619c4762a1bSJed Brown     requires: p4est
162030602db0SMatthew G. Knepley     args: -quiet -run_type test -petscspace_degree 1 -dm_plex_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
1621c4762a1bSJed Brown     timeoutfactor: 5
1622c4762a1bSJed Brown 
1623c4762a1bSJed Brown   # Serial tests with GLVis visualization
1624c4762a1bSJed Brown   test:
1625c4762a1bSJed Brown     suffix: glvis_2d_tet_p1
162630602db0SMatthew G. Knepley     args: -quiet -run_type test -bc_type dirichlet -petscspace_degree 1 -vec_view glvis: -dm_plex_filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/square_periodic.msh -dm_plex_boundary_label marker -dm_plex_gmsh_periodic 0 -dm_coord_space 0
1627c4762a1bSJed Brown   test:
1628c4762a1bSJed Brown     suffix: glvis_2d_tet_p2
162930602db0SMatthew G. Knepley     args: -quiet -run_type test -bc_type dirichlet -petscspace_degree 2 -vec_view glvis: -dm_plex_filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/square_periodic.msh -dm_plex_boundary_label marker -dm_plex_gmsh_periodic 0 -dm_coord_space 0
1630c4762a1bSJed Brown   test:
1631c4762a1bSJed Brown     suffix: glvis_2d_hex_p1
163230602db0SMatthew G. Knepley     args: -quiet -run_type test -bc_type dirichlet -petscspace_degree 1 -vec_view glvis: -dm_plex_simplex 0 -dm_refine 1 -dm_coord_space 0
1633c4762a1bSJed Brown   test:
1634c4762a1bSJed Brown     suffix: glvis_2d_hex_p2
163530602db0SMatthew G. Knepley     args: -quiet -run_type test -bc_type dirichlet -petscspace_degree 2 -vec_view glvis: -dm_plex_simplex 0 -dm_refine 1 -dm_coord_space 0
1636c4762a1bSJed Brown   test:
1637c4762a1bSJed Brown     suffix: glvis_2d_hex_p2_p4est
1638c4762a1bSJed Brown     requires: p4est
163930602db0SMatthew G. Knepley     args: -quiet -run_type test -bc_type dirichlet -petscspace_degree 2 -vec_view glvis: -dm_plex_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 -viewer_glvis_dm_plex_enable_ncmesh
1640c4762a1bSJed Brown   test:
1641c4762a1bSJed Brown     suffix: glvis_2d_tet_p0
164230602db0SMatthew G. Knepley     args: -run_type exact -guess_vec_view glvis: -nonzero_initial_guess 1 -dm_plex_filename ${wPETSC_DIR}/share/petsc/datafiles/meshes/square_periodic.msh -dm_plex_boundary_label marker -petscspace_degree 0 -dm_coord_space 0
1643c4762a1bSJed Brown   test:
1644c4762a1bSJed Brown     suffix: glvis_2d_hex_p0
164530602db0SMatthew G. Knepley     args: -run_type exact -guess_vec_view glvis: -nonzero_initial_guess 1 -dm_plex_box_faces 5,7 -dm_plex_simplex 0 -petscspace_degree 0 -dm_coord_space 0
1646c4762a1bSJed Brown 
1647c4762a1bSJed Brown   # PCHPDDM tests
1648c4762a1bSJed Brown   testset:
1649c4762a1bSJed Brown     nsize: 4
1650dfd57a17SPierre Jolivet     requires: hpddm slepc !single defined(PETSC_HAVE_DYNAMIC_LIBRARIES) defined(PETSC_USE_SHARED_LIBRARIES)
1651e600fa54SMatthew G. Knepley     args: -run_type test -run_test_check_ksp -quiet -petscspace_degree 1 -petscpartitioner_type simple -bc_type none -dm_plex_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
1652c4762a1bSJed Brown     test:
1653c4762a1bSJed Brown       suffix: quad_singular_hpddm
165430602db0SMatthew G. Knepley       args: -dm_plex_box_faces 6,7
1655c4762a1bSJed Brown     test:
1656c4762a1bSJed Brown       requires: p4est
1657c4762a1bSJed Brown       suffix: p4est_singular_2d_hpddm
1658c4762a1bSJed Brown       args: -dm_plex_convert_type p4est -dm_forest_minimum_refinement 1 -dm_forest_initial_refinement 3 -dm_forest_maximum_refinement 3
1659c4762a1bSJed Brown     test:
1660c4762a1bSJed Brown       requires: p4est
1661c4762a1bSJed Brown       suffix: p4est_nc_singular_2d_hpddm
1662c4762a1bSJed 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
1663c4762a1bSJed Brown   testset:
1664c4762a1bSJed Brown     nsize: 4
1665dfd57a17SPierre Jolivet     requires: hpddm slepc triangle !single defined(PETSC_HAVE_DYNAMIC_LIBRARIES) defined(PETSC_USE_SHARED_LIBRARIES)
1666e600fa54SMatthew G. Knepley     args: -run_type full -petscpartitioner_type simple -dm_refine 2 -bc_type dirichlet -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
1667c4762a1bSJed Brown     test:
1668c4762a1bSJed Brown       args: -pc_hpddm_coarse_mat_type baij -options_left no
1669c4762a1bSJed Brown       suffix: tri_hpddm_reuse_baij
1670c4762a1bSJed Brown     test:
1671c4762a1bSJed Brown       requires: !complex
1672c4762a1bSJed Brown       suffix: tri_hpddm_reuse
1673c4762a1bSJed Brown   testset:
1674c4762a1bSJed Brown     nsize: 4
1675dfd57a17SPierre Jolivet     requires: hpddm slepc !single defined(PETSC_HAVE_DYNAMIC_LIBRARIES) defined(PETSC_USE_SHARED_LIBRARIES)
1676e600fa54SMatthew G. Knepley     args: -run_type full -petscpartitioner_type simple -dm_plex_box_faces 7,5 -dm_refine 2 -dm_plex_simplex 0 -bc_type dirichlet -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
1677c4762a1bSJed Brown     test:
1678c4762a1bSJed Brown       args: -pc_hpddm_coarse_mat_type baij -options_left no
1679c4762a1bSJed Brown       suffix: quad_hpddm_reuse_baij
1680c4762a1bSJed Brown     test:
1681c4762a1bSJed Brown       requires: !complex
1682c4762a1bSJed Brown       suffix: quad_hpddm_reuse
1683c4762a1bSJed Brown   testset:
1684c4762a1bSJed Brown     nsize: 4
1685dfd57a17SPierre Jolivet     requires: hpddm slepc !single defined(PETSC_HAVE_DYNAMIC_LIBRARIES) defined(PETSC_USE_SHARED_LIBRARIES)
1686e600fa54SMatthew G. Knepley     args: -run_type full -petscpartitioner_type simple -dm_plex_box_faces 7,5 -dm_refine 2 -dm_plex_simplex 0 -bc_type dirichlet -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
1687c4762a1bSJed Brown     test:
1688c4762a1bSJed Brown       args: -pc_hpddm_coarse_mat_type baij -options_left no
1689c4762a1bSJed Brown       suffix: quad_hpddm_reuse_threshold_baij
1690c4762a1bSJed Brown     test:
1691c4762a1bSJed Brown       requires: !complex
1692c4762a1bSJed Brown       suffix: quad_hpddm_reuse_threshold
1693c4762a1bSJed Brown   testset:
1694c4762a1bSJed Brown     nsize: 4
1695dfd57a17SPierre Jolivet     requires: hpddm slepc parmetis !single defined(PETSC_HAVE_DYNAMIC_LIBRARIES) defined(PETSC_USE_SHARED_LIBRARIES)
1696117ef88eSStefano Zampini     filter: sed -e "s/linear solver iterations=17/linear solver iterations=16/g"
1697e600fa54SMatthew G. Knepley     args: -run_type full -petscpartitioner_type parmetis -dm_refine 3 -bc_type dirichlet -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 -dm_plex_filename ${PETSC_DIR}/share/petsc/datafiles/meshes/square_periodic.msh -dm_plex_boundary_label marker -pc_hpddm_levels_1_sub_pc_factor_levels 3 -variable_coefficient ball -dm_plex_gmsh_periodic 0
1698c4762a1bSJed Brown     test:
1699c4762a1bSJed Brown       args: -pc_hpddm_coarse_mat_type baij -options_left no
17006ba0327bSPierre 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"
1701c4762a1bSJed Brown       suffix: tri_parmetis_hpddm_baij
1702c4762a1bSJed Brown     test:
17036ba0327bSPierre 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"
1704c4762a1bSJed Brown       requires: !complex
1705c4762a1bSJed Brown       suffix: tri_parmetis_hpddm
1706d6837840SMatthew G. Knepley 
1707d6837840SMatthew G. Knepley   # 2D serial P1 tests for adaptive MG
1708d6837840SMatthew G. Knepley   test:
1709d6837840SMatthew G. Knepley     suffix: 2d_p1_adaptmg_0
17102b3cbbdaSStefano Zampini     requires: triangle
1711908b9b43SStefano Zampini     args: -petscpartitioner_type simple -dm_refine_hierarchy 3 -dm_plex_box_faces 4,4 -bc_type dirichlet -petscspace_degree 1 \
1712d6837840SMatthew G. Knepley           -variable_coefficient checkerboard_0 -mat_petscspace_degree 0 -div 16 -k 3 \
1713d6837840SMatthew G. Knepley           -snes_max_it 1 -ksp_converged_reason \
1714d6837840SMatthew G. Knepley           -ksp_rtol 1e-8 -pc_type mg
1715d6837840SMatthew G. Knepley   test:
1716d6837840SMatthew G. Knepley     suffix: 2d_p1_adaptmg_1
1717908b9b43SStefano Zampini     requires: triangle bamg todo
1718908b9b43SStefano Zampini     args: -petscpartitioner_type simple -dm_refine_hierarchy 3 -dm_plex_box_faces 4,4 -bc_type dirichlet -petscspace_degree 1 \
1719d6837840SMatthew G. Knepley           -variable_coefficient checkerboard_0 -mat_petscspace_degree 0 -div 16 -k 3 \
1720d6837840SMatthew G. Knepley           -snes_max_it 1 -ksp_converged_reason \
17212b3cbbdaSStefano Zampini           -ksp_rtol 1e-8 -pc_type mg -pc_mg_galerkin -pc_mg_adapt_interp_coarse_space eigenvector -pc_mg_adapt_interp_n 1 \
1722d6837840SMatthew 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
1723908b9b43SStefano Zampini   test:
1724908b9b43SStefano Zampini     suffix: 2d_p1_adaptmg_gdsw
1725908b9b43SStefano Zampini     requires: triangle
1726908b9b43SStefano Zampini     nsize: 4
1727908b9b43SStefano Zampini     args: -petscpartitioner_type simple -dm_refine 3 -dm_plex_box_faces 4,4 -bc_type dirichlet -petscspace_degree 1 \
1728908b9b43SStefano Zampini           -variable_coefficient checkerboard_0 -mat_petscspace_degree 0 -div 16 -k 3 \
1729908b9b43SStefano Zampini           -snes_max_it 1 -ksp_converged_reason \
1730908b9b43SStefano Zampini           -ksp_rtol 1e-8 -pc_type mg -pc_mg_galerkin -pc_mg_adapt_interp_coarse_space gdsw -pc_mg_levels 2 -mg_levels_pc_type asm -dm_mat_type {{aij is}}
1731908b9b43SStefano Zampini 
1732908b9b43SStefano Zampini   test:
1733908b9b43SStefano Zampini     suffix: 2d_p1_adaptmg_agdsw
1734908b9b43SStefano Zampini     requires: triangle mumps
1735908b9b43SStefano Zampini     nsize: 4
1736908b9b43SStefano Zampini     args: -petscpartitioner_type simple -dm_refine 3 -dm_plex_box_faces 4,4 -bc_type dirichlet -petscspace_degree 1 \
1737908b9b43SStefano Zampini           -variable_coefficient checkerboard_0 -mat_petscspace_degree 0 -div 16 -k 3 \
1738908b9b43SStefano Zampini           -snes_max_it 1 -ksp_converged_reason \
1739908b9b43SStefano Zampini           -ksp_rtol 1e-8 -pc_type mg -pc_mg_galerkin -pc_mg_adapt_interp_coarse_space gdsw -pc_mg_levels 2 -mg_levels_pc_type asm -dm_mat_type is -mg_levels_gdsw_tolerance 0.1 -mg_levels_gdsw_pseudo_pc_type qr
1740d6837840SMatthew G. Knepley 
1741c4762a1bSJed Brown TEST*/
1742