Actual source code: ex72.c

  1: static char help[] = "Reads a PETSc matrix and vector from a file and solves a linear system.\n\
  2: This version first preloads and solves a small system, then loads \n\
  3: another (larger) system and solves it as well.  This example illustrates\n\
  4: preloading of instructions with the smaller system so that more accurate\n\
  5: performance monitoring can be done with the larger one (that actually\n\
  6: is the system of interest).  See the 'Performance Hints' chapter of the\n\
  7: users manual for a discussion of preloading.  Input parameters include\n\
  8:   -f0 <input_file> : first file to load (small system)\n\
  9:   -f1 <input_file> : second file to load (larger system)\n\n\
 10:   -nearnulldim <0> : number of vectors in the near-null space immediately following matrix\n\n\
 11:   -trans  : solve transpose system instead\n\n";
 12: /*
 13:   This code can be used to test PETSc interface to other packages.\n\
 14:   Examples of command line options:       \n\
 15:    ./ex72 -f0 <datafile> -ksp_type preonly  \n\
 16:         -help -ksp_view                  \n\
 17:         -num_numfac <num_numfac> -num_rhs <num_rhs> \n\
 18:         -ksp_type preonly -pc_type lu -pc_factor_mat_solver_type superlu or superlu_dist or mumps \n\
 19:         -ksp_type preonly -pc_type cholesky -pc_factor_mat_solver_type mumps \n\
 20:    mpiexec -n <np> ./ex72 -f0 <datafile> -ksp_type cg -pc_type asm -pc_asm_type basic -sub_pc_type icc -mat_type sbaij
 21:  \n\n";
 22: */

 24: /*
 25:   Include "petscksp.h" so that we can use KSP solvers.  Note that this file
 26:   automatically includes:
 27:      petscsys.h       - base PETSc routines   petscvec.h - vectors
 28:      petscmat.h - matrices
 29:      petscis.h     - index sets            petscksp.h - Krylov subspace methods
 30:      petscviewer.h - viewers               petscpc.h  - preconditioners
 31: */
 32: #include <petscksp.h>

 34: int main(int argc, char **args)
 35: {
 36:   KSP         ksp;                         /* linear solver context */
 37:   Mat         A;                           /* matrix */
 38:   Vec         x, b, u;                     /* approx solution, RHS, exact solution */
 39:   PetscViewer viewer;                      /* viewer */
 40:   char        file[4][PETSC_MAX_PATH_LEN]; /* input file name */
 41:   PetscBool   table = PETSC_FALSE, flg, trans = PETSC_FALSE, initialguess = PETSC_FALSE;
 42:   PetscBool   outputSoln = PETSC_FALSE, constantnullspace = PETSC_FALSE;
 43:   PetscInt    its, num_numfac, m, n, M, p, nearnulldim = 0;
 44:   PetscReal   norm;
 45:   PetscBool   preload = PETSC_TRUE, isSymmetric, cknorm = PETSC_FALSE, initialguessfile = PETSC_FALSE;
 46:   PetscMPIInt rank;
 47:   char        initialguessfilename[PETSC_MAX_PATH_LEN];
 48:   char        mtype[PETSC_MAX_PATH_LEN];

 50:   PetscFunctionBeginUser;
 51:   PetscCall(PetscInitialize(&argc, &args, NULL, help));
 52:   PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank));
 53:   PetscCall(PetscOptionsGetBool(NULL, NULL, "-table", &table, NULL));
 54:   PetscCall(PetscOptionsGetBool(NULL, NULL, "-constantnullspace", &constantnullspace, NULL));
 55:   PetscCall(PetscOptionsGetBool(NULL, NULL, "-trans", &trans, NULL));
 56:   PetscCall(PetscOptionsGetBool(NULL, NULL, "-initialguess", &initialguess, NULL));
 57:   PetscCall(PetscOptionsGetBool(NULL, NULL, "-output_solution", &outputSoln, NULL));
 58:   PetscCall(PetscOptionsGetString(NULL, NULL, "-initialguessfilename", initialguessfilename, sizeof(initialguessfilename), &initialguessfile));
 59:   PetscCall(PetscOptionsGetInt(NULL, NULL, "-nearnulldim", &nearnulldim, NULL));

 61:   /*
 62:      Determine files from which we read the two linear systems
 63:      (matrix and right-hand-side vector).
 64:   */
 65:   PetscCall(PetscOptionsGetString(NULL, NULL, "-f", file[0], sizeof(file[0]), &flg));
 66:   if (flg) {
 67:     PetscCall(PetscStrncpy(file[1], file[0], sizeof(file[1])));
 68:     preload = PETSC_FALSE;
 69:   } else {
 70:     PetscCall(PetscOptionsGetString(NULL, NULL, "-f0", file[0], sizeof(file[0]), &flg));
 71:     PetscCheck(flg, PETSC_COMM_WORLD, PETSC_ERR_USER_INPUT, "Must indicate binary file with the -f0 or -f option");
 72:     PetscCall(PetscOptionsGetString(NULL, NULL, "-f1", file[1], sizeof(file[1]), &flg));
 73:     if (!flg) preload = PETSC_FALSE; /* don't bother with second system */
 74:   }

 76:   /* -----------------------------------------------------------
 77:                   Beginning of linear solver loop
 78:      ----------------------------------------------------------- */
 79:   /*
 80:      Loop through the linear solve 2 times.
 81:       - The intention here is to preload and solve a small system;
 82:         then load another (larger) system and solve it as well.
 83:         This process preloads the instructions with the smaller
 84:         system so that more accurate performance monitoring (via
 85:         -log_view) can be done with the larger one (that actually
 86:         is the system of interest).
 87:   */
 88:   PetscPreLoadBegin(preload, "Load system");

 90:   /* - - - - - - - - - - - New Stage - - - - - - - - - - - - -
 91:                          Load system
 92:    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

 94:   /*
 95:      Open binary file.  Note that we use FILE_MODE_READ to indicate
 96:      reading from this file.
 97:   */
 98:   PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, file[PetscPreLoadIt], FILE_MODE_READ, &viewer));

100:   /*
101:      Load the matrix and vector; then destroy the viewer.
102:   */
103:   PetscCall(MatCreate(PETSC_COMM_WORLD, &A));
104:   PetscCall(MatSetFromOptions(A));
105:   PetscCall(MatLoad(A, viewer));

107:   PetscCall(PetscOptionsGetString(NULL, NULL, "-mat_convert_type", mtype, sizeof(mtype), &flg));
108:   if (flg) PetscCall(MatConvert(A, mtype, MAT_INPLACE_MATRIX, &A));

110:   if (nearnulldim) {
111:     MatNullSpace nullsp;
112:     Vec         *nullvecs;
113:     PetscCall(PetscMalloc1(nearnulldim, &nullvecs));
114:     for (PetscInt i = 0; i < nearnulldim; i++) {
115:       PetscCall(VecCreate(PETSC_COMM_WORLD, &nullvecs[i]));
116:       PetscCall(VecLoad(nullvecs[i], viewer));
117:     }
118:     PetscCall(MatNullSpaceCreate(PETSC_COMM_WORLD, PETSC_FALSE, nearnulldim, nullvecs, &nullsp));
119:     PetscCall(MatSetNearNullSpace(A, nullsp));
120:     for (PetscInt i = 0; i < nearnulldim; i++) PetscCall(VecDestroy(&nullvecs[i]));
121:     PetscCall(PetscFree(nullvecs));
122:     PetscCall(MatNullSpaceDestroy(&nullsp));
123:   }
124:   if (constantnullspace) {
125:     MatNullSpace constant;
126:     PetscCall(MatNullSpaceCreate(PETSC_COMM_WORLD, PETSC_TRUE, 0, NULL, &constant));
127:     PetscCall(MatSetNullSpace(A, constant));
128:     PetscCall(MatNullSpaceDestroy(&constant));
129:   }
130:   flg = PETSC_FALSE;
131:   PetscCall(PetscOptionsGetString(NULL, NULL, "-rhs", file[2], sizeof(file[2]), &flg));
132:   PetscCall(VecCreate(PETSC_COMM_WORLD, &b));
133:   if (flg) { /* rhs is stored in a separate file */
134:     if (file[2][0] == '0' || file[2][0] == 0) {
135:       PetscInt    m;
136:       PetscScalar one = 1.0;
137:       PetscCall(PetscInfo(0, "Using vector of ones for RHS\n"));
138:       PetscCall(MatGetLocalSize(A, &m, NULL));
139:       PetscCall(VecSetSizes(b, m, PETSC_DECIDE));
140:       PetscCall(VecSetFromOptions(b));
141:       PetscCall(VecSet(b, one));
142:     } else {
143:       PetscCall(PetscViewerDestroy(&viewer));
144:       PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, file[2], FILE_MODE_READ, &viewer));
145:       PetscCall(VecSetFromOptions(b));
146:       PetscCall(VecLoad(b, viewer));
147:     }
148:   } else { /* rhs is stored in the same file as matrix */
149:     PetscCall(VecSetFromOptions(b));
150:     PetscCall(VecLoad(b, viewer));
151:   }
152:   PetscCall(PetscViewerDestroy(&viewer));

154:   /* Make A singular for testing zero-pivot of ilu factorization */
155:   /* Example: ./ex72 -f0 <datafile> -test_zeropivot -pc_factor_shift_type <shift_type> */
156:   flg = PETSC_FALSE;
157:   PetscCall(PetscOptionsGetBool(NULL, NULL, "-test_zeropivot", &flg, NULL));
158:   if (flg) { /* set a row as zeros */
159:     PetscInt row = 0;
160:     PetscCall(MatSetOption(A, MAT_KEEP_NONZERO_PATTERN, PETSC_TRUE));
161:     PetscCall(MatZeroRows(A, 1, &row, 0.0, NULL, NULL));
162:   }

164:   /* Check whether A is symmetric, then set A->symmetric option */
165:   flg = PETSC_FALSE;
166:   PetscCall(PetscOptionsGetBool(NULL, NULL, "-check_symmetry", &flg, NULL));
167:   if (flg) {
168:     PetscCall(MatIsSymmetric(A, 0.0, &isSymmetric));
169:     if (!isSymmetric) PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Warning: A is non-symmetric \n"));
170:   }

172:   /*
173:      If the loaded matrix is larger than the vector (due to being padded
174:      to match the block size of the system), then create a new padded vector.
175:   */

177:   PetscCall(MatGetLocalSize(A, NULL, &n));
178:   PetscCall(MatGetSize(A, &M, NULL));
179:   PetscCall(VecGetSize(b, &m));
180:   PetscCall(VecGetLocalSize(b, &p));
181:   flg = (PetscBool)(M != m || p != n); /* Global or local dimension mismatch */
182:   PetscCallMPI(MPIU_Allreduce(MPI_IN_PLACE, &flg, 1, MPI_C_BOOL, MPI_LOR, PetscObjectComm((PetscObject)A)));
183:   if (flg) { /* Create a new vector b by padding the old one */
184:     PetscInt     j, mvec, start, end, indx;
185:     Vec          tmp;
186:     PetscScalar *bold;

188:     PetscCall(VecCreate(PETSC_COMM_WORLD, &tmp));
189:     PetscCall(VecSetSizes(tmp, n, PETSC_DECIDE));
190:     PetscCall(VecSetFromOptions(tmp));
191:     PetscCall(VecGetOwnershipRange(b, &start, &end));
192:     PetscCall(VecGetLocalSize(b, &mvec));
193:     PetscCall(VecGetArray(b, &bold));
194:     for (j = 0; j < mvec; j++) {
195:       indx = start + j;
196:       PetscCall(VecSetValues(tmp, 1, &indx, bold + j, INSERT_VALUES));
197:     }
198:     PetscCall(VecRestoreArray(b, &bold));
199:     PetscCall(VecDestroy(&b));
200:     PetscCall(VecAssemblyBegin(tmp));
201:     PetscCall(VecAssemblyEnd(tmp));
202:     b = tmp;
203:   }

205:   PetscCall(MatCreateVecs(A, &x, NULL));
206:   PetscCall(VecDuplicate(b, &u));
207:   if (initialguessfile) {
208:     PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, initialguessfilename, FILE_MODE_READ, &viewer));
209:     PetscCall(VecLoad(x, viewer));
210:     PetscCall(PetscViewerDestroy(&viewer));
211:     initialguess = PETSC_TRUE;
212:   } else if (initialguess) PetscCall(VecSet(x, 1.0));
213:   else PetscCall(VecSet(x, 0.0));

215:   /* Check scaling in A */
216:   flg = PETSC_FALSE;
217:   PetscCall(PetscOptionsGetBool(NULL, NULL, "-check_scaling", &flg, NULL));
218:   if (flg) {
219:     Vec       max, min, l1;
220:     PetscInt  idx;
221:     PetscReal val;

223:     PetscCall(VecDuplicate(x, &max));
224:     PetscCall(VecDuplicate(x, &min));
225:     PetscCall(VecDuplicate(x, &l1));
226:     PetscCall(MatGetRowMaxAbs(A, max, NULL));
227:     PetscCall(MatGetRowMinAbs(A, min, NULL));
228:     PetscCall(MatGetRowSumAbs(A, l1));
229:     if (PETSC_FALSE) {
230:       PetscCall(PetscViewerASCIIOpen(PETSC_COMM_WORLD, "max.data", &viewer));
231:       PetscCall(VecView(max, viewer));
232:       PetscCall(PetscViewerDestroy(&viewer));
233:       PetscCall(PetscViewerASCIIOpen(PETSC_COMM_WORLD, "min.data", &viewer));
234:       PetscCall(VecView(min, viewer));
235:       PetscCall(PetscViewerDestroy(&viewer));
236:       PetscCall(PetscViewerASCIIOpen(PETSC_COMM_WORLD, "l1.data", &viewer));
237:       PetscCall(VecView(l1, viewer));
238:       PetscCall(PetscViewerDestroy(&viewer));
239:     }
240:     PetscCall(VecView(max, PETSC_VIEWER_DRAW_WORLD));
241:     PetscCall(VecMax(max, &idx, &val));
242:     PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Largest max row element %g at row %" PetscInt_FMT "\n", (double)val, idx));
243:     PetscCall(VecView(min, PETSC_VIEWER_DRAW_WORLD));
244:     PetscCall(VecMin(min, &idx, &val));
245:     PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Smallest min row element %g at row %" PetscInt_FMT "\n", (double)val, idx));
246:     PetscCall(VecMin(max, &idx, &val));
247:     PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Smallest max row element %g at row %" PetscInt_FMT "\n", (double)val, idx));
248:     PetscCall(VecPointwiseDivide(max, max, min));
249:     PetscCall(VecMax(max, &idx, &val));
250:     PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Largest row ratio %g at row %" PetscInt_FMT "\n", (double)val, idx));
251:     PetscCall(VecView(max, PETSC_VIEWER_DRAW_WORLD));
252:     PetscCall(VecMax(max, &idx, &val));
253:     PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Largest row ratio %g at row %" PetscInt_FMT "\n", (double)val, idx));
254:     PetscCall(VecView(max, PETSC_VIEWER_DRAW_WORLD));
255:     PetscCall(VecView(max, PETSC_VIEWER_DRAW_WORLD));
256:     PetscCall(VecMax(l1, &idx, &val));
257:     PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Largest l1 row element %g at row %" PetscInt_FMT "\n", (double)val, idx));
258:     PetscCall(VecDestroy(&max));
259:     PetscCall(VecDestroy(&min));
260:     PetscCall(VecDestroy(&l1));
261:   }

263:   /*  PetscCall(MatView(A,PETSC_VIEWER_STDOUT_WORLD)); */
264:   /* - - - - - - - - - - - New Stage - - - - - - - - - - - - -
265:                     Setup solve for system
266:    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
267:   /*
268:      Conclude profiling last stage; begin profiling next stage.
269:   */
270:   PetscPreLoadStage("KSPSetUpSolve");

272:   /*
273:      Create linear solver; set operators; set runtime options.
274:   */
275:   PetscCall(KSPCreate(PETSC_COMM_WORLD, &ksp));
276:   PetscCall(KSPSetInitialGuessNonzero(ksp, initialguess));
277:   num_numfac = 1;
278:   PetscCall(PetscOptionsGetInt(NULL, NULL, "-num_numfac", &num_numfac, NULL));
279:   while (num_numfac--) {
280:     PC        pc;
281:     PetscBool lsqr, isbddc, ismatis;
282:     char      str[32];

284:     PetscCall(PetscOptionsGetString(NULL, NULL, "-ksp_type", str, sizeof(str), &lsqr));
285:     if (lsqr) PetscCall(PetscStrcmp("lsqr", str, &lsqr));
286:     if (lsqr) {
287:       Mat BtB;
288:       PetscCall(MatTransposeMatMult(A, A, MAT_INITIAL_MATRIX, 4, &BtB));
289:       PetscCall(KSPSetOperators(ksp, A, BtB));
290:       PetscCall(MatDestroy(&BtB));
291:     } else PetscCall(KSPSetOperators(ksp, A, A));
292:     PetscCall(KSPSetFromOptions(ksp));

294:     /* if we test BDDC, make sure pmat is of type MATIS */
295:     PetscCall(KSPGetPC(ksp, &pc));
296:     PetscCall(PetscObjectTypeCompare((PetscObject)pc, PCBDDC, &isbddc));
297:     PetscCall(PetscObjectTypeCompare((PetscObject)A, MATIS, &ismatis));
298:     if (isbddc && !ismatis) {
299:       Mat J;

301:       PetscCall(MatConvert(A, MATIS, MAT_INITIAL_MATRIX, &J));
302:       PetscCall(KSPSetOperators(ksp, A, J));
303:       PetscCall(MatDestroy(&J));
304:     }

306:     /*
307:      Here we explicitly call KSPSetUp() and KSPSetUpOnBlocks() to
308:      enable more precise profiling of setting up the preconditioner.
309:      These calls are optional, since both will be called within
310:      KSPSolve() if they haven't been called already.
311:     */
312:     PetscCall(KSPSetUp(ksp));
313:     PetscCall(KSPSetUpOnBlocks(ksp));

315:     /* - - - - - - - - - - - New Stage - - - - - - - - - - - - -
316:                          Solve system
317:       - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

319:     /*
320:      Solve linear system;
321:     */
322:     if (trans) {
323:       PetscCall(KSPSolveTranspose(ksp, b, x));
324:       PetscCall(KSPGetIterationNumber(ksp, &its));
325:     } else {
326:       PetscInt num_rhs = 1;
327:       PetscCall(PetscOptionsGetInt(NULL, NULL, "-num_rhs", &num_rhs, NULL));
328:       cknorm = PETSC_FALSE;
329:       PetscCall(PetscOptionsGetBool(NULL, NULL, "-cknorm", &cknorm, NULL));
330:       while (num_rhs--) {
331:         if (num_rhs == 1) PetscCall(VecSet(x, 0.0));
332:         PetscCall(KSPSolve(ksp, b, x));
333:       }
334:       PetscCall(KSPGetIterationNumber(ksp, &its));
335:       if (cknorm) { /* Check error for each rhs */
336:         if (trans) PetscCall(MatMultTranspose(A, x, u));
337:         else PetscCall(MatMult(A, x, u));
338:         PetscCall(VecAXPY(u, -1.0, b));
339:         PetscCall(VecNorm(u, NORM_2, &norm));
340:         PetscCall(PetscPrintf(PETSC_COMM_WORLD, "  Number of iterations = %3" PetscInt_FMT "\n", its));
341:         if (!PetscIsNanScalar(norm)) PetscCall(PetscPrintf(PETSC_COMM_WORLD, "  Residual norm %g\n", (double)norm));
342:       }
343:     } /* while (num_rhs--) */

345:     /* - - - - - - - - - - - New Stage - - - - - - - - - - - - -
346:           Check error, print output, free data structures.
347:      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

349:     /*
350:        Check error
351:     */
352:     if (trans) PetscCall(MatMultTranspose(A, x, u));
353:     else PetscCall(MatMult(A, x, u));
354:     PetscCall(VecAXPY(u, -1.0, b));
355:     PetscCall(VecNorm(u, NORM_2, &norm));
356:     /*
357:      Write output (optionally using table for solver details).
358:       - PetscPrintf() handles output for multiprocessor jobs
359:         by printing from only one processor in the communicator.
360:       - KSPView() prints information about the linear solver.
361:     */
362:     if (table) {
363:       char *matrixname = NULL, kspinfo[120];

365:       /*
366:        Open a string viewer; then write info to it.
367:       */
368:       PetscCall(PetscViewerStringOpen(PETSC_COMM_WORLD, kspinfo, sizeof(kspinfo), &viewer));
369:       PetscCall(KSPView(ksp, viewer));
370:       PetscCall(PetscStrrchr(file[PetscPreLoadIt], '/', &matrixname));
371:       PetscCall(PetscPrintf(PETSC_COMM_WORLD, "%-8.8s %3" PetscInt_FMT " %2.0e %s \n", matrixname, its, (double)norm, kspinfo));

373:       /*
374:         Destroy the viewer
375:       */
376:       PetscCall(PetscViewerDestroy(&viewer));
377:     } else {
378:       PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Number of iterations = %3" PetscInt_FMT "\n", its));
379:       if (!PetscIsNanReal(norm)) PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Residual norm %g\n", (double)norm));
380:     }
381:     PetscCall(PetscOptionsGetString(NULL, NULL, "-solution", file[3], sizeof(file[3]), &flg));
382:     if (flg) {
383:       Vec       xstar;
384:       PetscReal norm;

386:       PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, file[3], FILE_MODE_READ, &viewer));
387:       PetscCall(VecCreate(PETSC_COMM_WORLD, &xstar));
388:       PetscCall(VecLoad(xstar, viewer));
389:       PetscCall(VecAXPY(xstar, -1.0, x));
390:       PetscCall(VecNorm(xstar, NORM_2, &norm));
391:       PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error norm %g\n", (double)norm));
392:       PetscCall(VecDestroy(&xstar));
393:       PetscCall(PetscViewerDestroy(&viewer));
394:     }
395:     if (outputSoln) {
396:       PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, "solution.petsc", FILE_MODE_WRITE, &viewer));
397:       PetscCall(VecView(x, viewer));
398:       PetscCall(PetscViewerDestroy(&viewer));
399:     }

401:     flg = PETSC_FALSE;
402:     PetscCall(PetscOptionsGetBool(NULL, NULL, "-ksp_reason", &flg, NULL));
403:     if (flg) {
404:       KSPConvergedReason reason;
405:       PetscCall(KSPGetConvergedReason(ksp, &reason));
406:       PetscCall(PetscPrintf(PETSC_COMM_WORLD, "KSPConvergedReason: %s\n", KSPConvergedReasons[reason]));
407:     }

409:   } /* while (num_numfac--) */

411:   /*
412:      Free work space.  All PETSc objects should be destroyed when they
413:      are no longer needed.
414:   */
415:   PetscCall(MatDestroy(&A));
416:   PetscCall(VecDestroy(&b));
417:   PetscCall(VecDestroy(&u));
418:   PetscCall(VecDestroy(&x));
419:   PetscCall(KSPDestroy(&ksp));
420:   PetscPreLoadEnd();
421:   /* -----------------------------------------------------------
422:                       End of linear solver loop
423:      ----------------------------------------------------------- */

425:   PetscCall(PetscFinalize());
426:   return 0;
427: }

429: /*TEST

431:    build:
432:       requires: !complex

434:    testset:
435:       suffix: 1
436:       nsize: 2
437:       args: -f0 ${wPETSC_DIR}/share/petsc/datafiles/matrices/spd-real-int@PETSC_INDEX_SIZE@-float@PETSC_SCALAR_SIZE@
438:       requires: !__float128

440:    testset:
441:       suffix: 1a
442:       args: -f0 ${wPETSC_DIR}/share/petsc/datafiles/matrices/spd-real-int@PETSC_INDEX_SIZE@-float@PETSC_SCALAR_SIZE@
443:       requires: !__float128

445:    testset:
446:       nsize: 2
447:       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
448:       args: -f0 ${DATAFILESPATH}/matrices/medium
449:       args: -ksp_type bicg
450:       test:
451:          suffix: 2

453:    testset:
454:       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
455:       args: -f0 ${DATAFILESPATH}/matrices/medium
456:       args: -ksp_type bicg
457:       test:
458:          suffix: 4
459:          args: -pc_type lu
460:       test:
461:          suffix: 5

463:    testset:
464:       suffix: 6
465:       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
466:       args: -f0 ${DATAFILESPATH}/matrices/fem1
467:       args: -pc_factor_levels 2 -pc_factor_fill 1.73 -ksp_gmres_cgs_refinement_type refine_always

469:    testset:
470:       TODO: Matrix row/column sizes are not compatible with block size
471:       suffix: 7
472:       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
473:       args: -f0 ${DATAFILESPATH}/matrices/medium
474:       args: -viewer_binary_skip_info -mat_type seqbaij
475:       args: -matload_block_size {{2 3 4 5 6 7 8}separate output}
476:       args: -ksp_max_it 100 -ksp_gmres_cgs_refinement_type refine_always
477:       args: -ksp_rtol 1.0e-15 -ksp_monitor
478:       test:
479:          suffix: a
480:       test:
481:          suffix: b
482:          args: -pc_factor_mat_ordering_type nd
483:       test:
484:          suffix: c
485:          args: -pc_factor_levels 1
486:       test:
487:          requires: metis
488:          suffix: d
489:          args: -pc_factor_mat_ordering_type metisnd

491:    testset:
492:       TODO: Matrix row/column sizes are not compatible with block size
493:       suffix: 7_d
494:       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
495:       args: -f0 ${DATAFILESPATH}/matrices/medium
496:       args: -viewer_binary_skip_info -mat_type seqbaij
497:       args: -matload_block_size {{2 3 4 5 6 7 8}shared output}
498:       args: -ksp_type preonly -pc_type lu

500:    testset:
501:       suffix: 8
502:       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
503:       args: -f0 ${DATAFILESPATH}/matrices/medium
504:       args: -ksp_diagonal_scale -pc_type eisenstat -ksp_monitor -ksp_diagonal_scale_fix -ksp_gmres_cgs_refinement_type refine_always -mat_no_inode

506:    testset:
507:       TODO: Matrix row/column sizes are not compatible with block size
508:       suffix: 9
509:       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
510:       args: -f0 ${DATAFILESPATH}/matrices/medium
511:       args: -viewer_binary_skip_info -matload_block_size {{1 2 3 4 5 6 7}separate output} -ksp_max_it 100 -ksp_gmres_cgs_refinement_type refine_always -ksp_rtol 1.0e-15 -ksp_monitor
512:       test:
513:          suffix: a
514:          args: -mat_type seqbaij
515:       test:
516:          suffix: b
517:          args: -mat_type seqbaij -trans
518:       test:
519:          suffix: c
520:          nsize: 2
521:          args: -mat_type mpibaij
522:       test:
523:          suffix: d
524:          nsize: 2
525:          args: -mat_type mpibaij -trans
526:       test:
527:          suffix: e
528:          nsize: 3
529:          args: -mat_type mpibaij
530:       test:
531:          suffix: f
532:          nsize: 3
533:          args: -mat_type mpibaij -trans

535:    testset:
536:       suffix: 10
537:       nsize: 2
538:       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
539:       args: -ksp_type fgmres -pc_type ksp -f0 ${DATAFILESPATH}/matrices/medium -ksp_fgmres_modifypcksp -ksp_monitor

541:    testset:
542:       suffix: 12
543:       requires: datafilespath matlab
544:       args: -pc_type lu -pc_factor_mat_solver_type matlab -f0 ${DATAFILESPATH}/matrices/arco1

546:    testset:
547:       suffix: 13
548:       requires: datafilespath lusol
549:       args: -f0 ${DATAFILESPATH}/matrices/arco1
550:       args: -mat_type lusol -pc_type lu

552:    testset:
553:       nsize: 3
554:       args: -f0 ${DATAFILESPATH}/matrices/medium
555:       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
556:       test:
557:          suffix: 14
558:          requires: spai
559:          args: -pc_type spai
560:       test:
561:          suffix: 15
562:          requires: hypre !defined(PETSC_HAVE_HYPRE_DEVICE)
563:          args: -pc_type hypre -pc_hypre_type pilut
564:       test:
565:          suffix: 16
566:          requires: hypre !defined(PETSC_HAVE_HYPRE_DEVICE)
567:          args: -pc_type hypre -pc_hypre_type parasails
568:       test:
569:          suffix: 17
570:          requires: hypre !defined(PETSC_HAVE_HYPRE_DEVICE)
571:          args: -pc_type hypre -pc_hypre_type boomeramg
572:       test:
573:          suffix: 18
574:          requires: hypre !defined(PETSC_HAVE_HYPRE_DEVICE)
575:          args: -pc_type hypre -pc_hypre_type euclid
576:       test:
577:          suffix: 20
578:          requires: hypre !defined(PETSC_HAVE_HYPRE_DEVICE)
579:          args: -pc_type hypre -pc_hypre_type ilu

581:    testset:
582:       suffix: 19
583:       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
584:       args: -f0 ${DATAFILESPATH}/matrices/poisson1
585:       args: -ksp_type cg -pc_type icc
586:       args: -pc_factor_levels {{0 2 4}separate output}
587:       test:
588:       test:
589:          args: -mat_type seqsbaij

591:    testset:
592:       suffix: ILU
593:       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
594:       args: -f0 ${DATAFILESPATH}/matrices/small
595:       args: -pc_factor_levels 1
596:       test:
597:       test:
598:          # This is tested against regular ILU (used to be denoted ILUBAIJ)
599:          args: -mat_type baij

601:    testset:
602:       suffix: aijcusparse
603:       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES) cuda
604:       args: -f0 ${DATAFILESPATH}/matrices/medium -ksp_monitor -ksp_view -mat_view ascii::ascii_info -mat_type aijcusparse -pc_factor_mat_solver_type cusparse -pc_type ilu -vec_type cuda

606:    testset:
607:       TODO: No output file. Need to determine if deprecated
608:       suffix: asm_viennacl
609:       nsize: 2
610:       requires: viennacl
611:       args: -pc_type asm -pc_asm_sub_mat_type aijviennacl -f0 ${wPETSC_DIR}/share/petsc/datafiles/matrices/spd-real-int${PETSC_INDEX_SIZE}-float${PETSC_SCALAR_SIZE}

613:    testset:
614:       nsize: 2
615:       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES) hypre !defined(PETSC_HAVE_HYPRE_DEVICE)
616:       args: -f0 ${DATAFILESPATH}/matrices/poisson2.gz -ksp_monitor -ksp_rtol 1.E-9 -pc_type hypre -pc_hypre_type boomeramg
617:       test:
618:          suffix: boomeramg_euclid
619:          args: -pc_hypre_boomeramg_smooth_type Euclid -pc_hypre_boomeramg_smooth_num_levels 2 -pc_hypre_boomeramg_eu_level 1 -pc_hypre_boomeramg_eu_droptolerance 0.01
620:       test:
621:          suffix: boomeramg_euclid_bj
622:          args: -pc_hypre_boomeramg_smooth_type Euclid -pc_hypre_boomeramg_smooth_num_levels 2 -pc_hypre_boomeramg_eu_level 1 -pc_hypre_boomeramg_eu_droptolerance 0.01 -pc_hypre_boomeramg_eu_bj
623:       test:
624:          suffix: boomeramg_parasails
625:          args: -pc_hypre_boomeramg_smooth_type ParaSails -pc_hypre_boomeramg_smooth_num_levels 2
626:       test:
627:          suffix: boomeramg_pilut
628:          args: -pc_hypre_boomeramg_smooth_type Pilut -pc_hypre_boomeramg_smooth_num_levels 2
629:       test:
630:          suffix: boomeramg_schwarz
631:          args: -pc_hypre_boomeramg_smooth_type Schwarz-smoothers

633:    testset:
634:       suffix: cg_singlereduction
635:       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
636:       args: -f0 ${DATAFILESPATH}/matrices/small
637:       args: -mat_type mpisbaij -ksp_type cg -pc_type eisenstat -ksp_monitor -ksp_converged_reason
638:       test:
639:       test:
640:          args: -ksp_cg_single_reduction

642:    testset:
643:       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
644:       args: -f0 ${DATAFILESPATH}/matrices/poisson2.gz
645:       args: -ksp_monitor -pc_type icc
646:       test:
647:          suffix: cr
648:          args: -ksp_type cr
649:       test:
650:          suffix: lcd
651:          args: -ksp_type lcd

653:    testset:
654:       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
655:       args: -f0 ${DATAFILESPATH}/matrices/small
656:       args: -ksp_monitor -ksp_view -mat_view ascii::ascii_info
657:       test:
658:          suffix: seqaijcrl
659:          args: -mat_type seqaijcrl
660:       test:
661:          suffix: seqaijperm
662:          args: -mat_type seqaijperm

664:    testset:
665:       nsize: 2
666:       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
667:       args: -f0 ${DATAFILESPATH}/matrices/small
668:       args: -ksp_monitor -ksp_view
669:       # Different output files
670:       test:
671:          suffix: mpiaijcrl
672:          args: -mat_type mpiaijcrl
673:       test:
674:          suffix: mpiaijperm
675:          args: -mat_type mpiaijperm

677:    testset:
678:       nsize: 4
679:       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES) !defined(PETSC_HAVE_I_MPI)
680:       args: -ksp_monitor -ksp_view
681:       test:
682:          suffix: xxt
683:          args: -f0 ${DATAFILESPATH}/matrices/poisson1 -check_symmetry -check_scaling -ksp_type cg -pc_type tfs
684:       test:
685:          suffix: xyt
686:          args: -f0 ${DATAFILESPATH}/matrices/medium -ksp_type gmres -pc_type tfs

688:    testset:
689:       # The output file here is the same as mumps
690:       suffix: mumps_cholesky
691:       output_file: output/ex72_mumps.out
692:       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES) mumps
693:       args: -f0 ${DATAFILESPATH}/matrices/small -ksp_type preonly -pc_type cholesky -pc_factor_mat_solver_type mumps -num_numfac 2 -num_rhs 2
694:       nsize: {{1 2}}
695:       test:
696:          args: -mat_type sbaij -mat_ignore_lower_triangular
697:       test:
698:          args: -mat_type aij
699:       test:
700:          args: -mat_type aij -matload_spd

702:    testset:
703:       # The output file here is the same as mumps
704:       suffix: mumps_lu
705:       output_file: output/ex72_mumps.out
706:       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES) mumps
707:       args: -f0 ${DATAFILESPATH}/matrices/small -ksp_type preonly -pc_type lu -pc_factor_mat_solver_type mumps -num_numfac 2 -num_rhs 2
708:       test:
709:          args: -mat_type seqaij
710:       test:
711:          nsize: 2
712:          args: -mat_type mpiaij
713:       test:
714:          args: -mat_type seqbaij -matload_block_size 2
715:       test:
716:          nsize: 2
717:          args: -mat_type mpibaij -matload_block_size 2
718:       test:
719:          args: -mat_type aij -mat_mumps_icntl_7 5
720:          TODO: Need to determine if deprecated

722:    test:
723:       suffix: mumps_lu_parmetis
724:       output_file: output/ex72_mumps.out
725:       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES) mumps parmetis
726:       nsize: 2
727:       args: -f0 ${DATAFILESPATH}/matrices/small -ksp_type preonly -pc_type lu -pc_factor_mat_solver_type mumps -num_numfac 2 -num_rhs 2 -mat_type mpiaij -mat_mumps_icntl_28 2 -mat_mumps_icntl_29 2

729:    test:
730:       suffix: mumps_lu_ptscotch
731:       output_file: output/ex72_mumps.out
732:       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES) mumps ptscotch
733:       nsize: 2
734:       args: -f0 ${DATAFILESPATH}/matrices/small -ksp_type preonly -pc_type lu -pc_factor_mat_solver_type mumps -num_numfac 2 -num_rhs 2 -mat_type mpiaij -mat_mumps_icntl_28 2 -mat_mumps_icntl_29 1

736:    testset:
737:       # The output file here is the same as mumps
738:       suffix: mumps_redundant
739:       output_file: output/ex72_mumps_redundant.out
740:       nsize: 8
741:       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES) mumps
742:       args: -f0 ${DATAFILESPATH}/matrices/medium -ksp_type preonly -pc_type redundant -pc_redundant_number {{8 7 6 5 4 3 2 1}} -redundant_pc_factor_mat_solver_type mumps -num_numfac 2 -num_rhs 2

744:    testset:
745:       suffix: pastix_cholesky
746:       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES) pastix
747:       output_file: output/ex72_mumps.out
748:       nsize: {{1 2}}
749:       args: -f0 ${DATAFILESPATH}/matrices/small -ksp_type preonly -pc_factor_mat_solver_type pastix -num_numfac 2 -num_rhs 2 -pc_type cholesky -mat_type sbaij -mat_ignore_lower_triangular -mat_pastix_thread_nbr 1

751:    testset:
752:       suffix: pastix_lu
753:       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES) pastix
754:       args: -f0 ${DATAFILESPATH}/matrices/small -ksp_type preonly -pc_type lu -pc_factor_mat_solver_type pastix -num_numfac 2 -num_rhs 2 -mat_pastix_thread_nbr 1
755:       output_file: output/ex72_mumps.out
756:       test:
757:          args: -mat_type seqaij
758:       test:
759:          nsize: 2
760:          args: -mat_type mpiaij

762:    testset:
763:       suffix: pastix_redundant
764:       output_file: output/ex72_mumps_redundant.out
765:       nsize: 8
766:       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES) pastix
767:       args: -f0 ${DATAFILESPATH}/matrices/medium -ksp_type preonly -pc_type redundant -pc_redundant_number {{8 7 6 5 4 3 2 1}} -redundant_pc_factor_mat_solver_type pastix -num_numfac 2 -num_rhs 2 -mat_pastix_thread_nbr 1

769:    testset:
770:       suffix: superlu_dist_lu
771:       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES) superlu_dist
772:       output_file: output/ex72_mumps.out
773:       args: -f0 ${DATAFILESPATH}/matrices/small -ksp_type preonly -pc_type lu -pc_factor_mat_solver_type superlu_dist -num_numfac 2 -num_rhs 2
774:       nsize: {{1 2}}

776:    testset:
777:       suffix: superlu_dist_redundant
778:       nsize: 8
779:       output_file: output/ex72_mumps_redundant.out
780:       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES) superlu_dist
781:       args: -f0 ${DATAFILESPATH}/matrices/medium -ksp_type preonly -pc_type redundant -pc_redundant_number {{8 7 6 5 4 3 2 1}} -redundant_pc_factor_mat_solver_type superlu_dist -num_numfac 2 -num_rhs 2

783:    testset:
784:       suffix: superlu_lu
785:       output_file: output/ex72_mumps.out
786:       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES) superlu
787:       args: -f0 ${DATAFILESPATH}/matrices/small -ksp_type preonly -pc_type lu -pc_factor_mat_solver_type superlu -num_numfac 2 -num_rhs 2

789:    testset:
790:       suffix: umfpack
791:       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES) suitesparse
792:       args: -f0 ${DATAFILESPATH}/matrices/small -ksp_type preonly -pc_type lu -mat_type seqaij -pc_factor_mat_solver_type umfpack -num_numfac 2 -num_rhs 2

794:    testset:
795:       suffix: zeropivot
796:       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
797:       args: -f0 ${DATAFILESPATH}/matrices/small -test_zeropivot -ksp_converged_reason -ksp_type fgmres -pc_type ksp -fp_trap 0
798:       test:
799:          nsize: 3
800:          args: -ksp_pc_type bjacobi
801:       test:
802:          nsize: 2
803:          args: -ksp_ksp_type cg -ksp_pc_type bjacobi -ksp_pc_bjacobi_blocks 1
804:       #test:
805:          #nsize: 3
806:          #args: -ksp_ksp_converged_reason -ksp_pc_type bjacobi -ksp_sub_ksp_converged_reason
807:          #TODO: Need to determine if deprecated

809:    testset:
810:       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
811:       args: -mat_convert_type is -f0 ${DATAFILESPATH}/matrices/medium -ksp_type fgmres
812:       test:
813:          suffix: aij_gdsw
814:          nsize: 4
815:          args: -mat_convert_type aij -pc_type mg -pc_mg_levels 2 -pc_mg_adapt_interp_coarse_space gdsw -pc_mg_galerkin -mg_levels_pc_type asm
816:       test:
817:          output_file: output/ex72_aij_gdsw.out
818:          suffix: is_gdsw
819:          nsize: 4
820:          args: -pc_type mg -pc_mg_levels 2 -pc_mg_adapt_interp_coarse_space gdsw -pc_mg_galerkin -mg_levels_pc_type asm
821:       test:
822:          suffix: is_asm
823:          nsize: {{1 2}separate output}
824:          args: -pc_type asm
825:       test:
826:          suffix: bddc_seq
827:          nsize: 1
828:          args: -pc_type bddc
829:       test:
830:          suffix: bddc_par
831:          nsize: 2
832:          args: -pc_type bddc
833:       test:
834:          requires: parmetis
835:          suffix: bddc_par_nd_parmetis
836:          filter: sed -e "s/Number of iterations =   [0-9]/Number of iterations = 9/g"
837:          nsize: 4
838:          args: -ksp_error_if_not_converged -pc_type bddc -mat_is_disassemble_l2g_type nd -mat_partitioning_type parmetis
839:       test:
840:          requires: ptscotch defined(PETSC_HAVE_SCOTCH_PARMETIS_V3_NODEND)
841:          suffix: bddc_par_nd_ptscotch
842:          filter: sed -e "s/Number of iterations =   [0-9]/Number of iterations = 9/g"
843:          nsize: 4
844:          args: -ksp_error_if_not_converged -pc_type bddc -mat_is_disassemble_l2g_type nd -mat_partitioning_type ptscotch

846:    testset:
847:       requires: !__float128 hpddm slepc defined(PETSC_HAVE_DYNAMIC_LIBRARIES) defined(PETSC_USE_SHARED_LIBRARIES)
848:       test:
849:          suffix: hpddm_mat
850:          output_file: output/ex72_bddc_seq.out
851:          filter: sed -e "s/Number of iterations =   2/Number of iterations =   1/g"
852:          nsize: 2
853:          args: -f0 ${wPETSC_DIR}/share/petsc/datafiles/matrices/spd-real-int@PETSC_INDEX_SIZE@-float@PETSC_SCALAR_SIZE@ -pc_type hpddm -pc_hpddm_define_subdomains -pc_hpddm_levels_1_sub_pc_type cholesky -pc_hpddm_levels_1_eps_nev 5 -pc_hpddm_levels_1_st_pc_type mat
854:       test:
855:          requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
856:          suffix: hpddm_gen_non_hermitian
857:          output_file: output/ex72_2.out
858:          nsize: 4
859:          args: -f0 ${DATAFILESPATH}/matrices/arco1 -pc_type hpddm -pc_hpddm_define_subdomains -pc_hpddm_levels_1_sub_pc_type lu -pc_hpddm_levels_1_eps_nev 10 -pc_hpddm_levels_1_st_share_sub_ksp -pc_hpddm_levels_1_eps_gen_non_hermitian -pc_hpddm_coarse_mat_type baij -pc_hpddm_block_splitting -pc_hpddm_levels_1_eps_threshold_absolute 0.7 -ksp_pc_side right
860:       test:
861:          requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES) mumps !defined(PETSCTEST_VALGRIND)
862:          suffix: hpddm_gen_non_hermitian_baij
863:          output_file: output/ex72_10.out
864:          nsize: 4
865:          timeoutfactor: 2
866:          args: -f0 ${DATAFILESPATH}/matrices/arco6 -pc_type hpddm -pc_hpddm_define_subdomains -pc_hpddm_levels_1_sub_pc_type lu -pc_hpddm_levels_1_eps_nev 30 -pc_hpddm_levels_1_st_share_sub_ksp -pc_hpddm_levels_1_eps_gen_non_hermitian -pc_hpddm_coarse_mat_type baij -pc_hpddm_block_splitting -pc_hpddm_levels_1_eps_threshold_absolute 0.8 -ksp_pc_side right -mat_type baij -pc_hpddm_levels_1_sub_pc_factor_mat_solver_type mumps -pc_hpddm_levels_1_eps_tol 1.0e-2 -ksp_monitor
867:       test:
868:          requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
869:          suffix: hpddm_too_much_oversampling
870:          output_file: output/ex72_2.out
871:          nsize: 2
872:          filter: sed -e "s/Number of iterations =   3/Number of iterations =  10/g"
873:          args: -f0 ${DATAFILESPATH}/matrices/small -pc_type hpddm -pc_hpddm_levels_1_svd_nsv 1 -pc_hpddm_levels_1_st_share_sub_ksp -pc_hpddm_levels_1_sub_pc_type lu -pc_hpddm_harmonic_overlap 3 -pc_hpddm_coarse_mat_type aij

875:    # BDDC multiple subdomains per process tests
876:    test:
877:      requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
878:      suffix: matis_bddc_multisub_3d
879:      nsize: {{1 2 3 4 5 6 7 8}}
880:      args: -f ${DATAFILESPATH}/matrices/matis/poisson_DMDA_9x9x9_3x3x3.dat -pc_type bddc -ksp_type cg -ksp_norm_type natural -ksp_error_if_not_converged -mat_type is -pc_bddc_use_faces

882:    test:
883:      requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
884:      suffix: matis_bddc_multisub_2d
885:      nsize: {{1 2 3 4 5 6 7 8}}
886:      args: -f ${DATAFILESPATH}/matrices/matis/poisson_DMDA_9x9_3x3.dat -pc_type bddc -ksp_type cg -ksp_norm_type natural -ksp_error_if_not_converged -mat_type is

888:    test:
889:      requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
890:      suffix: matis_bddc_multisub_plex_2d
891:      nsize: {{1 2 3 4 5 6 7 8}}
892:      args: -f ${DATAFILESPATH}/matrices/matis/poisson_DMPLEX_32x32_16.dat -pc_type bddc -ksp_type cg -ksp_norm_type natural -ksp_error_if_not_converged -mat_type is

894:    test:
895:      requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
896:      suffix: matis_bddc_multisub_plex_3d
897:      nsize: {{1 2 3 4 5 6 7 8}}
898:      args: -f ${DATAFILESPATH}/matrices/matis/poisson_DMPLEX_16x16x16_16.dat -pc_type bddc -ksp_type cg -ksp_norm_type natural -ksp_error_if_not_converged -mat_type is

900:    test:
901:      requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
902:      suffix: matis_bddc_multisub_plex_3d_deluxe
903:      nsize: {{1 2 3 4 5 6 7 8}}
904:      args: -f ${DATAFILESPATH}/matrices/matis/poisson_DMPLEX_16x16x16_16.dat -pc_type bddc -ksp_type cg -ksp_norm_type natural -ksp_error_if_not_converged -mat_type is -pc_bddc_use_deluxe_scaling

906:    test:
907:      requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
908:      suffix: matis_bddc_multisub_hcurl_2d
909:      nsize: {{1 2 3 4 5 6 7 8}}
910:      args: -f ${DATAFILESPATH}/matrices/matis/hcurl_mfem_amrquad2_16.dat -pc_bddc_load ${DATAFILESPATH}/matrices/matis/bddc_hcurl_mfem_amrquad2_16.dat -pc_type bddc -ksp_type cg -ksp_norm_type natural -ksp_error_if_not_converged -mat_type is -pc_bddc_local_mat_graph_square 1

912:    test:
913:      requires: datafilespath double mumps !defined(PETSC_USE_64BIT_INDICES)
914:      suffix: matis_bddc_multisub_hcurl_2d_adaptive
915:      nsize: {{1 2 3 4 5 6 7 8}}
916:      args: -f ${DATAFILESPATH}/matrices/matis/hcurl_mfem_amrquad2_16.dat -pc_bddc_load ${DATAFILESPATH}/matrices/matis/bddc_hcurl_mfem_amrquad2_16.dat -pc_type bddc -ksp_type cg -ksp_norm_type natural -ksp_error_if_not_converged -mat_type is -pc_bddc_local_mat_graph_square 1 -pc_bddc_use_deluxe_scaling -pc_bddc_adaptive_threshold 2 -pc_bddc_schur_exact {{0 1}}

918:    test:
919:      requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
920:      suffix: matis_bddc_multisub_hdiv_3d
921:      nsize: {{1 2 3 4 5 6 7 8}}
922:      args: -f ${DATAFILESPATH}/matrices/matis/hdiv_mfem_inlinehex2_16.dat -pc_bddc_load ${DATAFILESPATH}/matrices/matis/bddc_hdiv_mfem_inlinehex2_16.dat -pc_type bddc -ksp_type cg -ksp_norm_type natural -ksp_error_if_not_converged -mat_type is -pc_bddc_use_local_mat_graph 0

924:    test:
925:      requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
926:      suffix: matis_bddc_multisub_hcurl_3d
927:      nsize: {{1 3 4 8}}
928:      args: -f ${DATAFILESPATH}/matrices/matis/hcurl_mfem_inlinehex_16.dat -pc_bddc_load ${DATAFILESPATH}/matrices/matis/bddc_hcurl_mfem_inlinehex_16.dat -pc_type bddc -ksp_type cg -ksp_norm_type natural -ksp_error_if_not_converged -mat_type is -pc_bddc_local_mat_graph_square 1

930:    test:
931:      requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
932:      suffix: matis_bddc_multisub_hcurl_3d_amr
933:      nsize: {{1 3 4 8}}
934:      args: -f ${DATAFILESPATH}/matrices/matis/hcurl_mfem_amrhex_16.dat -pc_bddc_load ${DATAFILESPATH}/matrices/matis/bddc_hcurl_mfem_amrhex_16.dat -pc_type bddc -ksp_type cg -ksp_norm_type natural -ksp_error_if_not_converged -mat_type is -pc_bddc_local_mat_graph_square 1

936: TEST*/