xref: /petsc/src/ksp/ksp/tutorials/ex72.c (revision 8564c97f3fe574910f676ffb31bf76fa44548916)
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 */
23 
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>
33 
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];
49 
50   PetscFunctionBeginUser;
51   PetscCall(PetscInitialize(&argc, &args, (char *)0, 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));
60 
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   }
75 
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");
89 
90   /* - - - - - - - - - - - New Stage - - - - - - - - - - - - -
91                          Load system
92    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
93 
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));
99 
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));
106 
107   PetscCall(PetscOptionsGetString(NULL, NULL, "-mat_convert_type", mtype, sizeof(mtype), &flg));
108   if (flg) PetscCall(MatConvert(A, mtype, MAT_INPLACE_MATRIX, &A));
109 
110   if (nearnulldim) {
111     MatNullSpace nullsp;
112     Vec         *nullvecs;
113     PetscInt     i;
114     PetscCall(PetscMalloc1(nearnulldim, &nullvecs));
115     for (i = 0; i < nearnulldim; i++) {
116       PetscCall(VecCreate(PETSC_COMM_WORLD, &nullvecs[i]));
117       PetscCall(VecLoad(nullvecs[i], viewer));
118     }
119     PetscCall(MatNullSpaceCreate(PETSC_COMM_WORLD, PETSC_FALSE, nearnulldim, nullvecs, &nullsp));
120     PetscCall(MatSetNearNullSpace(A, nullsp));
121     for (i = 0; i < nearnulldim; i++) PetscCall(VecDestroy(&nullvecs[i]));
122     PetscCall(PetscFree(nullvecs));
123     PetscCall(MatNullSpaceDestroy(&nullsp));
124   }
125   if (constantnullspace) {
126     MatNullSpace constant;
127     PetscCall(MatNullSpaceCreate(PETSC_COMM_WORLD, PETSC_TRUE, 0, NULL, &constant));
128     PetscCall(MatSetNullSpace(A, constant));
129     PetscCall(MatNullSpaceDestroy(&constant));
130   }
131   flg = PETSC_FALSE;
132   PetscCall(PetscOptionsGetString(NULL, NULL, "-rhs", file[2], sizeof(file[2]), &flg));
133   PetscCall(VecCreate(PETSC_COMM_WORLD, &b));
134   if (flg) { /* rhs is stored in a separate file */
135     if (file[2][0] == '0' || file[2][0] == 0) {
136       PetscInt    m;
137       PetscScalar one = 1.0;
138       PetscCall(PetscInfo(0, "Using vector of ones for RHS\n"));
139       PetscCall(MatGetLocalSize(A, &m, NULL));
140       PetscCall(VecSetSizes(b, m, PETSC_DECIDE));
141       PetscCall(VecSetFromOptions(b));
142       PetscCall(VecSet(b, one));
143     } else {
144       PetscCall(PetscViewerDestroy(&viewer));
145       PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, file[2], FILE_MODE_READ, &viewer));
146       PetscCall(VecSetFromOptions(b));
147       PetscCall(VecLoad(b, viewer));
148     }
149   } else { /* rhs is stored in the same file as matrix */
150     PetscCall(VecSetFromOptions(b));
151     PetscCall(VecLoad(b, viewer));
152   }
153   PetscCall(PetscViewerDestroy(&viewer));
154 
155   /* Make A singular for testing zero-pivot of ilu factorization */
156   /* Example: ./ex72 -f0 <datafile> -test_zeropivot -pc_factor_shift_type <shift_type> */
157   flg = PETSC_FALSE;
158   PetscCall(PetscOptionsGetBool(NULL, NULL, "-test_zeropivot", &flg, NULL));
159   if (flg) { /* set a row as zeros */
160     PetscInt row = 0;
161     PetscCall(MatSetOption(A, MAT_KEEP_NONZERO_PATTERN, PETSC_TRUE));
162     PetscCall(MatZeroRows(A, 1, &row, 0.0, NULL, NULL));
163   }
164 
165   /* Check whether A is symmetric, then set A->symmetric option */
166   flg = PETSC_FALSE;
167   PetscCall(PetscOptionsGetBool(NULL, NULL, "-check_symmetry", &flg, NULL));
168   if (flg) {
169     PetscCall(MatIsSymmetric(A, 0.0, &isSymmetric));
170     if (!isSymmetric) PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Warning: A is non-symmetric \n"));
171   }
172 
173   /*
174      If the loaded matrix is larger than the vector (due to being padded
175      to match the block size of the system), then create a new padded vector.
176   */
177 
178   PetscCall(MatGetLocalSize(A, NULL, &n));
179   PetscCall(MatGetSize(A, &M, NULL));
180   PetscCall(VecGetSize(b, &m));
181   PetscCall(VecGetLocalSize(b, &p));
182   preload = (PetscBool)(M != m || p != n); /* Global or local dimension mismatch */
183   PetscCall(MPIU_Allreduce(&preload, &flg, 1, MPIU_BOOL, MPI_LOR, PetscObjectComm((PetscObject)A)));
184   if (flg) { /* Create a new vector b by padding the old one */
185     PetscInt     j, mvec, start, end, indx;
186     Vec          tmp;
187     PetscScalar *bold;
188 
189     PetscCall(VecCreate(PETSC_COMM_WORLD, &tmp));
190     PetscCall(VecSetSizes(tmp, n, PETSC_DECIDE));
191     PetscCall(VecSetFromOptions(tmp));
192     PetscCall(VecGetOwnershipRange(b, &start, &end));
193     PetscCall(VecGetLocalSize(b, &mvec));
194     PetscCall(VecGetArray(b, &bold));
195     for (j = 0; j < mvec; j++) {
196       indx = start + j;
197       PetscCall(VecSetValues(tmp, 1, &indx, bold + j, INSERT_VALUES));
198     }
199     PetscCall(VecRestoreArray(b, &bold));
200     PetscCall(VecDestroy(&b));
201     PetscCall(VecAssemblyBegin(tmp));
202     PetscCall(VecAssemblyEnd(tmp));
203     b = tmp;
204   }
205 
206   PetscCall(MatCreateVecs(A, &x, NULL));
207   PetscCall(VecDuplicate(b, &u));
208   if (initialguessfile) {
209     PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, initialguessfilename, FILE_MODE_READ, &viewer));
210     PetscCall(VecLoad(x, viewer));
211     PetscCall(PetscViewerDestroy(&viewer));
212     initialguess = PETSC_TRUE;
213   } else if (initialguess) {
214     PetscCall(VecSet(x, 1.0));
215   } else {
216     PetscCall(VecSet(x, 0.0));
217   }
218 
219   /* Check scaling in A */
220   flg = PETSC_FALSE;
221   PetscCall(PetscOptionsGetBool(NULL, NULL, "-check_scaling", &flg, NULL));
222   if (flg) {
223     Vec       max, min, l1;
224     PetscInt  idx;
225     PetscReal val;
226 
227     PetscCall(VecDuplicate(x, &max));
228     PetscCall(VecDuplicate(x, &min));
229     PetscCall(VecDuplicate(x, &l1));
230     PetscCall(MatGetRowMaxAbs(A, max, NULL));
231     PetscCall(MatGetRowMinAbs(A, min, NULL));
232     PetscCall(MatGetRowSumAbs(A, l1));
233     if (PETSC_FALSE) {
234       PetscCall(PetscViewerASCIIOpen(PETSC_COMM_WORLD, "max.data", &viewer));
235       PetscCall(VecView(max, viewer));
236       PetscCall(PetscViewerDestroy(&viewer));
237       PetscCall(PetscViewerASCIIOpen(PETSC_COMM_WORLD, "min.data", &viewer));
238       PetscCall(VecView(min, viewer));
239       PetscCall(PetscViewerDestroy(&viewer));
240       PetscCall(PetscViewerASCIIOpen(PETSC_COMM_WORLD, "l1.data", &viewer));
241       PetscCall(VecView(l1, viewer));
242       PetscCall(PetscViewerDestroy(&viewer));
243     }
244     PetscCall(VecView(max, PETSC_VIEWER_DRAW_WORLD));
245     PetscCall(VecMax(max, &idx, &val));
246     PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Largest max row element %g at row %" PetscInt_FMT "\n", (double)val, idx));
247     PetscCall(VecView(min, PETSC_VIEWER_DRAW_WORLD));
248     PetscCall(VecMin(min, &idx, &val));
249     PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Smallest min row element %g at row %" PetscInt_FMT "\n", (double)val, idx));
250     PetscCall(VecMin(max, &idx, &val));
251     PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Smallest max row element %g at row %" PetscInt_FMT "\n", (double)val, idx));
252     PetscCall(VecPointwiseDivide(max, max, min));
253     PetscCall(VecMax(max, &idx, &val));
254     PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Largest row ratio %g at row %" PetscInt_FMT "\n", (double)val, idx));
255     PetscCall(VecView(max, PETSC_VIEWER_DRAW_WORLD));
256     PetscCall(VecMax(max, &idx, &val));
257     PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Largest row ratio %g at row %" PetscInt_FMT "\n", (double)val, idx));
258     PetscCall(VecView(max, PETSC_VIEWER_DRAW_WORLD));
259     PetscCall(VecView(max, PETSC_VIEWER_DRAW_WORLD));
260     PetscCall(VecMax(l1, &idx, &val));
261     PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Largest l1 row element %g at row %" PetscInt_FMT "\n", (double)val, idx));
262     PetscCall(VecDestroy(&max));
263     PetscCall(VecDestroy(&min));
264     PetscCall(VecDestroy(&l1));
265   }
266 
267   /*  PetscCall(MatView(A,PETSC_VIEWER_STDOUT_WORLD)); */
268   /* - - - - - - - - - - - New Stage - - - - - - - - - - - - -
269                     Setup solve for system
270    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
271   /*
272      Conclude profiling last stage; begin profiling next stage.
273   */
274   PetscPreLoadStage("KSPSetUpSolve");
275 
276   /*
277      Create linear solver; set operators; set runtime options.
278   */
279   PetscCall(KSPCreate(PETSC_COMM_WORLD, &ksp));
280   PetscCall(KSPSetInitialGuessNonzero(ksp, initialguess));
281   num_numfac = 1;
282   PetscCall(PetscOptionsGetInt(NULL, NULL, "-num_numfac", &num_numfac, NULL));
283   while (num_numfac--) {
284     PC        pc;
285     PetscBool lsqr, isbddc, ismatis;
286     char      str[32];
287 
288     PetscCall(PetscOptionsGetString(NULL, NULL, "-ksp_type", str, sizeof(str), &lsqr));
289     if (lsqr) PetscCall(PetscStrcmp("lsqr", str, &lsqr));
290     if (lsqr) {
291       Mat BtB;
292       PetscCall(MatTransposeMatMult(A, A, MAT_INITIAL_MATRIX, 4, &BtB));
293       PetscCall(KSPSetOperators(ksp, A, BtB));
294       PetscCall(MatDestroy(&BtB));
295     } else {
296       PetscCall(KSPSetOperators(ksp, A, A));
297     }
298     PetscCall(KSPSetFromOptions(ksp));
299 
300     /* if we test BDDC, make sure pmat is of type MATIS */
301     PetscCall(KSPGetPC(ksp, &pc));
302     PetscCall(PetscObjectTypeCompare((PetscObject)pc, PCBDDC, &isbddc));
303     PetscCall(PetscObjectTypeCompare((PetscObject)A, MATIS, &ismatis));
304     if (isbddc && !ismatis) {
305       Mat J;
306 
307       PetscCall(MatConvert(A, MATIS, MAT_INITIAL_MATRIX, &J));
308       PetscCall(KSPSetOperators(ksp, A, J));
309       PetscCall(MatDestroy(&J));
310     }
311 
312     /*
313      Here we explicitly call KSPSetUp() and KSPSetUpOnBlocks() to
314      enable more precise profiling of setting up the preconditioner.
315      These calls are optional, since both will be called within
316      KSPSolve() if they haven't been called already.
317     */
318     PetscCall(KSPSetUp(ksp));
319     PetscCall(KSPSetUpOnBlocks(ksp));
320 
321     /* - - - - - - - - - - - New Stage - - - - - - - - - - - - -
322                          Solve system
323       - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
324 
325     /*
326      Solve linear system;
327     */
328     if (trans) {
329       PetscCall(KSPSolveTranspose(ksp, b, x));
330       PetscCall(KSPGetIterationNumber(ksp, &its));
331     } else {
332       PetscInt num_rhs = 1;
333       PetscCall(PetscOptionsGetInt(NULL, NULL, "-num_rhs", &num_rhs, NULL));
334       cknorm = PETSC_FALSE;
335       PetscCall(PetscOptionsGetBool(NULL, NULL, "-cknorm", &cknorm, NULL));
336       while (num_rhs--) {
337         if (num_rhs == 1) PetscCall(VecSet(x, 0.0));
338         PetscCall(KSPSolve(ksp, b, x));
339       }
340       PetscCall(KSPGetIterationNumber(ksp, &its));
341       if (cknorm) { /* Check error for each rhs */
342         if (trans) {
343           PetscCall(MatMultTranspose(A, x, u));
344         } else {
345           PetscCall(MatMult(A, x, u));
346         }
347         PetscCall(VecAXPY(u, -1.0, b));
348         PetscCall(VecNorm(u, NORM_2, &norm));
349         PetscCall(PetscPrintf(PETSC_COMM_WORLD, "  Number of iterations = %3" PetscInt_FMT "\n", its));
350         if (!PetscIsNanScalar(norm)) {
351           if (norm < 1.e-12) {
352             PetscCall(PetscPrintf(PETSC_COMM_WORLD, "  Residual norm < 1.e-12\n"));
353           } else {
354             PetscCall(PetscPrintf(PETSC_COMM_WORLD, "  Residual norm %g\n", (double)norm));
355           }
356         }
357       }
358     } /* while (num_rhs--) */
359 
360     /* - - - - - - - - - - - New Stage - - - - - - - - - - - - -
361           Check error, print output, free data structures.
362      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
363 
364     /*
365        Check error
366     */
367     if (trans) {
368       PetscCall(MatMultTranspose(A, x, u));
369     } else {
370       PetscCall(MatMult(A, x, u));
371     }
372     PetscCall(VecAXPY(u, -1.0, b));
373     PetscCall(VecNorm(u, NORM_2, &norm));
374     /*
375      Write output (optionally using table for solver details).
376       - PetscPrintf() handles output for multiprocessor jobs
377         by printing from only one processor in the communicator.
378       - KSPView() prints information about the linear solver.
379     */
380     if (table) {
381       char *matrixname = NULL, kspinfo[120];
382 
383       /*
384        Open a string viewer; then write info to it.
385       */
386       PetscCall(PetscViewerStringOpen(PETSC_COMM_WORLD, kspinfo, sizeof(kspinfo), &viewer));
387       PetscCall(KSPView(ksp, viewer));
388       PetscCall(PetscStrrchr(file[PetscPreLoadIt], '/', &matrixname));
389       PetscCall(PetscPrintf(PETSC_COMM_WORLD, "%-8.8s %3" PetscInt_FMT " %2.0e %s \n", matrixname, its, (double)norm, kspinfo));
390 
391       /*
392         Destroy the viewer
393       */
394       PetscCall(PetscViewerDestroy(&viewer));
395     } else {
396       PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Number of iterations = %3" PetscInt_FMT "\n", its));
397       if (!PetscIsNanScalar(norm)) {
398         if (norm < 1.e-12 && !PetscIsNanScalar((PetscScalar)norm)) {
399           PetscCall(PetscPrintf(PETSC_COMM_WORLD, "  Residual norm < 1.e-12\n"));
400         } else {
401           PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Residual norm %g\n", (double)norm));
402         }
403       }
404     }
405     PetscCall(PetscOptionsGetString(NULL, NULL, "-solution", file[3], sizeof(file[3]), &flg));
406     if (flg) {
407       Vec       xstar;
408       PetscReal norm;
409 
410       PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, file[3], FILE_MODE_READ, &viewer));
411       PetscCall(VecCreate(PETSC_COMM_WORLD, &xstar));
412       PetscCall(VecLoad(xstar, viewer));
413       PetscCall(VecAXPY(xstar, -1.0, x));
414       PetscCall(VecNorm(xstar, NORM_2, &norm));
415       PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error norm %g\n", (double)norm));
416       PetscCall(VecDestroy(&xstar));
417       PetscCall(PetscViewerDestroy(&viewer));
418     }
419     if (outputSoln) {
420       PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, "solution.petsc", FILE_MODE_WRITE, &viewer));
421       PetscCall(VecView(x, viewer));
422       PetscCall(PetscViewerDestroy(&viewer));
423     }
424 
425     flg = PETSC_FALSE;
426     PetscCall(PetscOptionsGetBool(NULL, NULL, "-ksp_reason", &flg, NULL));
427     if (flg) {
428       KSPConvergedReason reason;
429       PetscCall(KSPGetConvergedReason(ksp, &reason));
430       PetscCall(PetscPrintf(PETSC_COMM_WORLD, "KSPConvergedReason: %s\n", KSPConvergedReasons[reason]));
431     }
432 
433   } /* while (num_numfac--) */
434 
435   /*
436      Free work space.  All PETSc objects should be destroyed when they
437      are no longer needed.
438   */
439   PetscCall(MatDestroy(&A));
440   PetscCall(VecDestroy(&b));
441   PetscCall(VecDestroy(&u));
442   PetscCall(VecDestroy(&x));
443   PetscCall(KSPDestroy(&ksp));
444   PetscPreLoadEnd();
445   /* -----------------------------------------------------------
446                       End of linear solver loop
447      ----------------------------------------------------------- */
448 
449   PetscCall(PetscFinalize());
450   return 0;
451 }
452 
453 /*TEST
454 
455    build:
456       requires: !complex
457 
458    testset:
459       suffix: 1
460       nsize: 2
461       args: -f0 ${wPETSC_DIR}/share/petsc/datafiles/matrices/spd-real-int@PETSC_INDEX_SIZE@-float@PETSC_SCALAR_SIZE@
462       requires: !__float128
463 
464    testset:
465       suffix: 1a
466       args: -f0 ${wPETSC_DIR}/share/petsc/datafiles/matrices/spd-real-int@PETSC_INDEX_SIZE@-float@PETSC_SCALAR_SIZE@
467       requires: !__float128
468 
469    testset:
470       nsize: 2
471       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
472       args: -f0 ${DATAFILESPATH}/matrices/medium
473       args: -ksp_type bicg
474       test:
475          suffix: 2
476 
477    testset:
478       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
479       args: -f0 ${DATAFILESPATH}/matrices/medium
480       args: -ksp_type bicg
481       test:
482          suffix: 4
483          args: -pc_type lu
484       test:
485          suffix: 5
486 
487    testset:
488       suffix: 6
489       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
490       args: -f0 ${DATAFILESPATH}/matrices/fem1
491       args: -pc_factor_levels 2 -pc_factor_fill 1.73 -ksp_gmres_cgs_refinement_type refine_always
492 
493    testset:
494       TODO: Matrix row/column sizes are not compatible with block size
495       suffix: 7
496       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
497       args: -f0 ${DATAFILESPATH}/matrices/medium
498       args: -viewer_binary_skip_info -mat_type seqbaij
499       args: -matload_block_size {{2 3 4 5 6 7 8}separate output}
500       args: -ksp_max_it 100 -ksp_gmres_cgs_refinement_type refine_always
501       args: -ksp_rtol 1.0e-15 -ksp_monitor_short
502       test:
503          suffix: a
504       test:
505          suffix: b
506          args: -pc_factor_mat_ordering_type nd
507       test:
508          suffix: c
509          args: -pc_factor_levels 1
510       test:
511          requires: metis
512          suffix: d
513          args: -pc_factor_mat_ordering_type metisnd
514 
515    testset:
516       TODO: Matrix row/column sizes are not compatible with block size
517       suffix: 7_d
518       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
519       args: -f0 ${DATAFILESPATH}/matrices/medium
520       args: -viewer_binary_skip_info -mat_type seqbaij
521       args: -matload_block_size {{2 3 4 5 6 7 8}shared output}
522       args: -ksp_type preonly -pc_type lu
523 
524    testset:
525       suffix: 8
526       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
527       args: -f0 ${DATAFILESPATH}/matrices/medium
528       args: -ksp_diagonal_scale -pc_type eisenstat -ksp_monitor_short -ksp_diagonal_scale_fix -ksp_gmres_cgs_refinement_type refine_always -mat_no_inode
529 
530    testset:
531       TODO: Matrix row/column sizes are not compatible with block size
532       suffix: 9
533       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
534       args: -f0 ${DATAFILESPATH}/matrices/medium
535       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_short
536       test:
537          suffix: a
538          args: -mat_type seqbaij
539       test:
540          suffix: b
541          args: -mat_type seqbaij -trans
542       test:
543          suffix: c
544          nsize: 2
545          args: -mat_type mpibaij
546       test:
547          suffix: d
548          nsize: 2
549          args: -mat_type mpibaij -trans
550       test:
551          suffix: e
552          nsize: 3
553          args: -mat_type mpibaij
554       test:
555          suffix: f
556          nsize: 3
557          args: -mat_type mpibaij -trans
558 
559    testset:
560       suffix: 10
561       nsize: 2
562       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
563       args: -ksp_type fgmres -pc_type ksp -f0 ${DATAFILESPATH}/matrices/medium -ksp_fgmres_modifypcksp -ksp_monitor_short
564 
565    testset:
566       suffix: 12
567       requires: datafilespath matlab
568       args: -pc_type lu -pc_factor_mat_solver_type matlab -f0 ${DATAFILESPATH}/matrices/arco1
569 
570    testset:
571       suffix: 13
572       requires: datafilespath lusol
573       args: -f0 ${DATAFILESPATH}/matrices/arco1
574       args: -mat_type lusol -pc_type lu
575 
576    testset:
577       nsize: 3
578       args: -f0 ${DATAFILESPATH}/matrices/medium
579       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
580       test:
581          suffix: 14
582          requires: spai
583          args: -pc_type spai
584       test:
585          suffix: 15
586          requires: hypre !defined(PETSC_HAVE_HYPRE_DEVICE)
587          args: -pc_type hypre -pc_hypre_type pilut
588       test:
589          suffix: 16
590          requires: hypre !defined(PETSC_HAVE_HYPRE_DEVICE)
591          args: -pc_type hypre -pc_hypre_type parasails
592       test:
593          suffix: 17
594          requires: hypre !defined(PETSC_HAVE_HYPRE_DEVICE)
595          args: -pc_type hypre -pc_hypre_type boomeramg
596       test:
597          suffix: 18
598          requires: hypre !defined(PETSC_HAVE_HYPRE_DEVICE)
599          args: -pc_type hypre -pc_hypre_type euclid
600 
601    testset:
602       suffix: 19
603       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
604       args: -f0 ${DATAFILESPATH}/matrices/poisson1
605       args: -ksp_type cg -pc_type icc
606       args: -pc_factor_levels {{0 2 4}separate output}
607       test:
608       test:
609          args: -mat_type seqsbaij
610 
611    testset:
612       suffix: ILU
613       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
614       args: -f0 ${DATAFILESPATH}/matrices/small
615       args: -pc_factor_levels 1
616       test:
617       test:
618          # This is tested against regular ILU (used to be denoted ILUBAIJ)
619          args: -mat_type baij
620 
621    testset:
622       suffix: aijcusparse
623       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES) cuda
624       args: -f0 ${DATAFILESPATH}/matrices/medium -ksp_monitor_short -ksp_view -mat_view ascii::ascii_info -mat_type aijcusparse -pc_factor_mat_solver_type cusparse -pc_type ilu -vec_type cuda
625 
626    testset:
627       TODO: No output file. Need to determine if deprecated
628       suffix: asm_viennacl
629       nsize: 2
630       requires: viennacl
631       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}
632 
633    testset:
634       nsize: 2
635       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES) hypre !defined(PETSC_HAVE_HYPRE_DEVICE)
636       args: -f0 ${DATAFILESPATH}/matrices/poisson2.gz -ksp_monitor_short -ksp_rtol 1.E-9 -pc_type hypre -pc_hypre_type boomeramg
637       test:
638          suffix: boomeramg_euclid
639          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
640       test:
641          suffix: boomeramg_euclid_bj
642          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
643       test:
644          suffix: boomeramg_parasails
645          args: -pc_hypre_boomeramg_smooth_type ParaSails -pc_hypre_boomeramg_smooth_num_levels 2
646       test:
647          suffix: boomeramg_pilut
648          args: -pc_hypre_boomeramg_smooth_type Pilut -pc_hypre_boomeramg_smooth_num_levels 2
649       test:
650          suffix: boomeramg_schwarz
651          args: -pc_hypre_boomeramg_smooth_type Schwarz-smoothers
652 
653    testset:
654       suffix: cg_singlereduction
655       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
656       args: -f0 ${DATAFILESPATH}/matrices/small
657       args: -mat_type mpisbaij -ksp_type cg -pc_type eisenstat -ksp_monitor_short -ksp_converged_reason
658       test:
659       test:
660          args: -ksp_cg_single_reduction
661 
662    testset:
663       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
664       args: -f0 ${DATAFILESPATH}/matrices/poisson2.gz
665       args: -ksp_monitor_short -pc_type icc
666       test:
667          suffix: cr
668          args: -ksp_type cr
669       test:
670          suffix: lcd
671          args: -ksp_type lcd
672 
673    testset:
674       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
675       args: -f0 ${DATAFILESPATH}/matrices/small
676       args: -ksp_monitor_short -ksp_view -mat_view ascii::ascii_info
677       test:
678          suffix: seqaijcrl
679          args: -mat_type seqaijcrl
680       test:
681          suffix: seqaijperm
682          args: -mat_type seqaijperm
683 
684    testset:
685       nsize: 2
686       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
687       args: -f0 ${DATAFILESPATH}/matrices/small
688       args: -ksp_monitor_short -ksp_view
689       # Different output files
690       test:
691          suffix: mpiaijcrl
692          args: -mat_type mpiaijcrl
693       test:
694          suffix: mpiaijperm
695          args: -mat_type mpiaijperm
696 
697    testset:
698       nsize: 4
699       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES) !defined(PETSC_HAVE_I_MPI_NUMVERSION)
700       args: -ksp_monitor_short -ksp_view
701       test:
702          suffix: xxt
703          args: -f0 ${DATAFILESPATH}/matrices/poisson1 -check_symmetry -check_scaling -ksp_type cg -pc_type tfs
704       test:
705          suffix: xyt
706          args: -f0 ${DATAFILESPATH}/matrices/medium -ksp_type gmres -pc_type tfs
707 
708    testset:
709       # The output file here is the same as mumps
710       suffix: mumps_cholesky
711       output_file: output/ex72_mumps.out
712       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES) mumps
713       args: -f0 ${DATAFILESPATH}/matrices/small -ksp_type preonly -pc_type cholesky -pc_factor_mat_solver_type mumps -num_numfac 2 -num_rhs 2
714       nsize: {{1 2}}
715       test:
716          args: -mat_type sbaij -mat_ignore_lower_triangular
717       test:
718          args: -mat_type aij
719       test:
720          args: -mat_type aij -matload_spd
721 
722    testset:
723       # The output file here is the same as mumps
724       suffix: mumps_lu
725       output_file: output/ex72_mumps.out
726       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES) mumps
727       args: -f0 ${DATAFILESPATH}/matrices/small -ksp_type preonly -pc_type lu -pc_factor_mat_solver_type mumps -num_numfac 2 -num_rhs 2
728       test:
729          args: -mat_type seqaij
730       test:
731          nsize: 2
732          args: -mat_type mpiaij
733       test:
734          args: -mat_type seqbaij -matload_block_size 2
735       test:
736          nsize: 2
737          args: -mat_type mpibaij -matload_block_size 2
738       test:
739          args: -mat_type aij -mat_mumps_icntl_7 5
740          TODO: Need to determine if deprecated
741 
742    test:
743       suffix: mumps_lu_parmetis
744       output_file: output/ex72_mumps.out
745       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES) mumps parmetis
746       nsize: 2
747       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
748 
749    test:
750       suffix: mumps_lu_ptscotch
751       output_file: output/ex72_mumps.out
752       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES) mumps ptscotch
753       nsize: 2
754       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
755 
756    testset:
757       # The output file here is the same as mumps
758       suffix: mumps_redundant
759       output_file: output/ex72_mumps_redundant.out
760       nsize: 8
761       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES) mumps
762       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
763 
764    testset:
765       suffix: pastix_cholesky
766       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES) pastix
767       output_file: output/ex72_mumps.out
768       nsize: {{1 2}}
769       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
770 
771    testset:
772       suffix: pastix_lu
773       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES) pastix
774       args: -f0 ${DATAFILESPATH}/matrices/small -ksp_type preonly -pc_type lu -pc_factor_mat_solver_type pastix -num_numfac 2 -num_rhs 2
775       output_file: output/ex72_mumps.out
776       test:
777          args: -mat_type seqaij
778       test:
779          nsize: 2
780          args: -mat_type mpiaij
781 
782    testset:
783       suffix: pastix_redundant
784       output_file: output/ex72_mumps_redundant.out
785       nsize: 8
786       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES) pastix
787       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
788 
789    testset:
790       suffix: superlu_dist_lu
791       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES) superlu_dist
792       output_file: output/ex72_mumps.out
793       args: -f0 ${DATAFILESPATH}/matrices/small -ksp_type preonly -pc_type lu -pc_factor_mat_solver_type superlu_dist -num_numfac 2 -num_rhs 2
794       nsize: {{1 2}}
795 
796    testset:
797       suffix: superlu_dist_redundant
798       nsize: 8
799       output_file: output/ex72_mumps_redundant.out
800       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES) superlu_dist
801       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
802 
803    testset:
804       suffix: superlu_lu
805       output_file: output/ex72_mumps.out
806       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES) superlu
807       args: -f0 ${DATAFILESPATH}/matrices/small -ksp_type preonly -pc_type lu -pc_factor_mat_solver_type superlu -num_numfac 2 -num_rhs 2
808 
809    testset:
810       suffix: umfpack
811       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES) suitesparse
812       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
813 
814    testset:
815       suffix: zeropivot
816       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
817       args: -f0 ${DATAFILESPATH}/matrices/small -test_zeropivot -ksp_converged_reason -ksp_type fgmres -pc_type ksp -fp_trap 0
818       test:
819          nsize: 3
820          args: -ksp_pc_type bjacobi
821       test:
822          nsize: 2
823          args: -ksp_ksp_type cg -ksp_pc_type bjacobi -ksp_pc_bjacobi_blocks 1
824       #test:
825          #nsize: 3
826          #args: -ksp_ksp_converged_reason -ksp_pc_type bjacobi -ksp_sub_ksp_converged_reason
827          #TODO: Need to determine if deprecated
828 
829    testset:
830       requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
831       args: -mat_convert_type is -f0 ${DATAFILESPATH}/matrices/medium -ksp_type fgmres
832       test:
833          suffix: aij_gdsw
834          nsize: 4
835          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
836       test:
837          output_file: output/ex72_aij_gdsw.out
838          suffix: is_gdsw
839          nsize: 4
840          args: -pc_type mg -pc_mg_levels 2 -pc_mg_adapt_interp_coarse_space gdsw -pc_mg_galerkin -mg_levels_pc_type asm
841       test:
842          suffix: is_asm
843          nsize: {{1 2}separate output}
844          args: -pc_type asm
845       test:
846          suffix: bddc_seq
847          nsize: 1
848          args: -pc_type bddc
849       test:
850          suffix: bddc_par
851          nsize: 2
852          args: -pc_type bddc
853       test:
854          requires: parmetis
855          suffix: bddc_par_nd_parmetis
856          filter: sed -e "s/Number of iterations =   [0-9]/Number of iterations = 9/g"
857          nsize: 4
858          args: -ksp_error_if_not_converged -pc_type bddc -mat_is_disassemble_l2g_type nd -mat_partitioning_type parmetis
859       test:
860          requires: ptscotch defined(PETSC_HAVE_SCOTCH_PARMETIS_V3_NODEND)
861          suffix: bddc_par_nd_ptscotch
862          filter: sed -e "s/Number of iterations =   [0-9]/Number of iterations = 9/g"
863          nsize: 4
864          args: -ksp_error_if_not_converged -pc_type bddc -mat_is_disassemble_l2g_type nd -mat_partitioning_type ptscotch
865 
866    testset:
867       requires: !__float128 hpddm slepc defined(PETSC_HAVE_DYNAMIC_LIBRARIES) defined(PETSC_USE_SHARED_LIBRARIES)
868       test:
869          suffix: hpddm_mat
870          output_file: output/ex72_bddc_seq.out
871          filter: sed -e "s/Number of iterations =   2/Number of iterations =   1/g"
872          nsize: 2
873          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
874       test:
875          requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
876          suffix: hpddm_gen_non_hermitian
877          output_file: output/ex72_2.out
878          nsize: 4
879          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 0.7 -ksp_pc_side right
880       test:
881          requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES) mumps !defined(PETSCTEST_VALGRIND)
882          suffix: hpddm_gen_non_hermitian_baij
883          output_file: output/ex72_10.out
884          nsize: 4
885          timeoutfactor: 2
886          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 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_short
887 
888    # BDDC multiple subdomains per process tests
889    test:
890      requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
891      suffix: matis_bddc_multisub_3d
892      nsize: {{1 2 3 4 5 6 7 8}}
893      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
894 
895    test:
896      requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
897      suffix: matis_bddc_multisub_2d
898      nsize: {{1 2 3 4 5 6 7 8}}
899      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
900 
901    test:
902      requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
903      suffix: matis_bddc_multisub_plex_2d
904      nsize: {{1 2 3 4 5 6 7 8}}
905      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
906 
907    test:
908      requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
909      suffix: matis_bddc_multisub_plex_3d
910      nsize: {{1 2 3 4 5 6 7 8}}
911      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
912 
913    test:
914      requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
915      suffix: matis_bddc_multisub_hcurl_2d
916      nsize: {{1 2 3 4 5 6 7 8}}
917      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
918 
919    test:
920      requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
921      suffix: matis_bddc_multisub_hdiv_3d
922      nsize: {{1 2 3 4 5 6 7 8}}
923      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 
925    # These two tests slightly depend on the number of processes since the
926    # the Nedelec 3D support is not completely independent on the decomposition
927    test:
928      requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
929      suffix: matis_bddc_multisub_hcurl_3d
930      nsize: {{1 3 4 8}separate output}
931      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
932 
933    test:
934      requires: datafilespath double !defined(PETSC_USE_64BIT_INDICES)
935      suffix: matis_bddc_multisub_hcurl_3d_amr
936      nsize: {{1 3 4 8}separate output}
937      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
938 
939 TEST*/
940