xref: /petsc/src/mat/tests/ex125.c (revision 53587d9363d5827a6b4fd92b4918af4444814a40)
1c4762a1bSJed Brown static char help[] = "Tests MatSolve() and MatMatSolve() (interface to superlu_dist, mumps and mkl_pardiso).\n\
278bc9606SHong Zhang Example: mpiexec -n <np> ./ex125 -f <matrix binary file> -nrhs 4 -mat_solver_type <>\n\n";
378bc9606SHong Zhang 
478bc9606SHong Zhang /*
578bc9606SHong Zhang -mat_solver_type:
678bc9606SHong Zhang   superlu
778bc9606SHong Zhang   superlu_dist
878bc9606SHong Zhang   mumps
978bc9606SHong Zhang   mkl_pardiso
1078bc9606SHong Zhang   cusparse
1178bc9606SHong Zhang   petsc
1278bc9606SHong Zhang */
13c4762a1bSJed Brown 
14c4762a1bSJed Brown #include <petscmat.h>
15c4762a1bSJed Brown 
165d955bbbSStefano Zampini PetscErrorCode CreateRandom(PetscInt n, PetscInt m, Mat *A)
175d955bbbSStefano Zampini {
185d955bbbSStefano Zampini   PetscFunctionBeginUser;
195d955bbbSStefano Zampini   PetscCall(MatCreate(PETSC_COMM_WORLD, A));
205d955bbbSStefano Zampini   PetscCall(MatSetType(*A, MATAIJ));
215d955bbbSStefano Zampini   PetscCall(MatSetFromOptions(*A));
225d955bbbSStefano Zampini   PetscCall(MatSetSizes(*A, PETSC_DECIDE, PETSC_DECIDE, n, m));
235d955bbbSStefano Zampini   PetscCall(MatSeqAIJSetPreallocation(*A, 5, NULL));
245d955bbbSStefano Zampini   PetscCall(MatMPIAIJSetPreallocation(*A, 5, NULL, 5, NULL));
255d955bbbSStefano Zampini   PetscCall(MatSetRandom(*A, NULL));
265d955bbbSStefano Zampini   PetscCall(MatAssemblyBegin(*A, MAT_FINAL_ASSEMBLY));
275d955bbbSStefano Zampini   PetscCall(MatAssemblyEnd(*A, MAT_FINAL_ASSEMBLY));
285d955bbbSStefano Zampini   PetscFunctionReturn(PETSC_SUCCESS);
295d955bbbSStefano Zampini }
305d955bbbSStefano Zampini 
315d955bbbSStefano Zampini PetscErrorCode CreateIdentity(PetscInt n, Mat *A)
325d955bbbSStefano Zampini {
335d955bbbSStefano Zampini   PetscFunctionBeginUser;
345d955bbbSStefano Zampini   PetscCall(MatCreate(PETSC_COMM_WORLD, A));
355d955bbbSStefano Zampini   PetscCall(MatSetType(*A, MATAIJ));
365d955bbbSStefano Zampini   PetscCall(MatSetFromOptions(*A));
375d955bbbSStefano Zampini   PetscCall(MatSetSizes(*A, PETSC_DECIDE, PETSC_DECIDE, n, n));
385d955bbbSStefano Zampini   PetscCall(MatSetUp(*A));
395d955bbbSStefano Zampini   PetscCall(MatAssemblyBegin(*A, MAT_FINAL_ASSEMBLY));
405d955bbbSStefano Zampini   PetscCall(MatAssemblyEnd(*A, MAT_FINAL_ASSEMBLY));
415d955bbbSStefano Zampini   PetscCall(MatShift(*A, 1.0));
425d955bbbSStefano Zampini   PetscFunctionReturn(PETSC_SUCCESS);
435d955bbbSStefano Zampini }
445d955bbbSStefano Zampini 
45d71ae5a4SJacob Faibussowitsch int main(int argc, char **args)
46d71ae5a4SJacob Faibussowitsch {
475d955bbbSStefano Zampini   Mat           A, Ae, RHS = NULL, RHS1 = NULL, C, F, X;
48c4762a1bSJed Brown   Vec           u, x, b;
49c4762a1bSJed Brown   PetscMPIInt   size;
5078bc9606SHong Zhang   PetscInt      m, n, nfact, nsolve, nrhs, ipack = 5;
51070736c7SStefano Zampini   PetscReal     norm, tol = 10 * PETSC_SQRT_MACHINE_EPSILON;
5262671d91SStefano Zampini   IS            perm = NULL, iperm = NULL;
53c4762a1bSJed Brown   MatFactorInfo info;
54c4762a1bSJed Brown   PetscRandom   rand;
5578bc9606SHong Zhang   PetscBool     flg, symm, testMatSolve = PETSC_TRUE, testMatMatSolve = PETSC_TRUE, testMatMatSolveTranspose = PETSC_TRUE, testMatSolveTranspose = PETSC_TRUE, match = PETSC_FALSE;
56c4762a1bSJed Brown   PetscBool     chol = PETSC_FALSE, view = PETSC_FALSE, matsolvexx = PETSC_FALSE;
57c4762a1bSJed Brown #if defined(PETSC_HAVE_MUMPS)
58c4762a1bSJed Brown   PetscBool test_mumps_opts = PETSC_FALSE;
59c4762a1bSJed Brown #endif
60c4762a1bSJed Brown   PetscViewer fd;                       /* viewer */
61c4762a1bSJed Brown   char        file[PETSC_MAX_PATH_LEN]; /* input file name */
6278bc9606SHong Zhang   char        pack[PETSC_MAX_PATH_LEN];
63c4762a1bSJed Brown 
64327415f7SBarry Smith   PetscFunctionBeginUser;
65c8025a54SPierre Jolivet   PetscCall(PetscInitialize(&argc, &args, NULL, help));
669566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
67c4762a1bSJed Brown 
68c4762a1bSJed Brown   /* Determine file from which we read the matrix A */
699566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetString(NULL, NULL, "-f", file, sizeof(file), &flg));
709a14fc28SStefano Zampini   if (flg) { /* Load matrix A */
719566063dSJacob Faibussowitsch     PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, file, FILE_MODE_READ, &fd));
729566063dSJacob Faibussowitsch     PetscCall(MatCreate(PETSC_COMM_WORLD, &A));
739566063dSJacob Faibussowitsch     PetscCall(MatSetFromOptions(A));
749566063dSJacob Faibussowitsch     PetscCall(MatLoad(A, fd));
759566063dSJacob Faibussowitsch     PetscCall(PetscViewerDestroy(&fd));
769a14fc28SStefano Zampini   } else {
779a14fc28SStefano Zampini     n = 13;
789566063dSJacob Faibussowitsch     PetscCall(PetscOptionsGetInt(NULL, NULL, "-n", &n, NULL));
799566063dSJacob Faibussowitsch     PetscCall(MatCreate(PETSC_COMM_WORLD, &A));
809566063dSJacob Faibussowitsch     PetscCall(MatSetType(A, MATAIJ));
819566063dSJacob Faibussowitsch     PetscCall(MatSetFromOptions(A));
829566063dSJacob Faibussowitsch     PetscCall(MatSetSizes(A, PETSC_DECIDE, PETSC_DECIDE, n, n));
839566063dSJacob Faibussowitsch     PetscCall(MatSetUp(A));
849566063dSJacob Faibussowitsch     PetscCall(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY));
859566063dSJacob Faibussowitsch     PetscCall(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY));
869566063dSJacob Faibussowitsch     PetscCall(MatShift(A, 1.0));
879a14fc28SStefano Zampini   }
88c4762a1bSJed Brown 
89c4762a1bSJed Brown   /* if A is symmetric, set its flag -- required by MatGetInertia() */
9078bc9606SHong Zhang   PetscCall(MatIsSymmetric(A, 0.0, &symm));
9178bc9606SHong Zhang   PetscCall(MatSetOption(A, MAT_SYMMETRIC, symm));
92c4762a1bSJed Brown 
935d955bbbSStefano Zampini   PetscCall(PetscOptionsGetBool(NULL, NULL, "-cholesky", &chol, NULL));
945d955bbbSStefano Zampini 
9562671d91SStefano Zampini   /* test MATNEST support */
9662671d91SStefano Zampini   flg = PETSC_FALSE;
9762671d91SStefano Zampini   PetscCall(PetscOptionsGetBool(NULL, NULL, "-test_nest", &flg, NULL));
9862671d91SStefano Zampini   if (flg) {
995d955bbbSStefano Zampini     Mat B;
10062671d91SStefano Zampini 
1015d955bbbSStefano Zampini     flg = PETSC_FALSE;
1025d955bbbSStefano Zampini     PetscCall(PetscOptionsGetBool(NULL, NULL, "-test_nest_bordered", &flg, NULL));
1035d955bbbSStefano Zampini     if (!flg) {
1045d955bbbSStefano Zampini       Mat mats[9] = {NULL, NULL, A, NULL, A, NULL, A, NULL, NULL};
1055d955bbbSStefano Zampini 
1065d955bbbSStefano Zampini       /* Create a nested matrix representing
10762671d91SStefano Zampini               | 0 0 A |
10862671d91SStefano Zampini               | 0 A 0 |
10962671d91SStefano Zampini               | A 0 0 |
11062671d91SStefano Zampini       */
11162671d91SStefano Zampini       PetscCall(MatCreateNest(PETSC_COMM_WORLD, 3, NULL, 3, NULL, mats, &B));
112*53587d93SPierre Jolivet       flg = PETSC_TRUE;
1135d955bbbSStefano Zampini     } else {
1145d955bbbSStefano Zampini       Mat mats[4];
1155d955bbbSStefano Zampini 
1165d955bbbSStefano Zampini       /* Create a nested matrix representing
1175d955bbbSStefano Zampini               | Id  R |
1185d955bbbSStefano Zampini               | R^t A |
1195d955bbbSStefano Zampini       */
1205d955bbbSStefano Zampini       PetscCall(MatGetSize(A, NULL, &n));
1215d955bbbSStefano Zampini       m = n + 12;
1225d955bbbSStefano Zampini       PetscCall(PetscOptionsGetInt(NULL, NULL, "-m", &m, NULL));
1235d955bbbSStefano Zampini       PetscCall(CreateIdentity(m, &mats[0]));
1245d955bbbSStefano Zampini       PetscCall(CreateRandom(m, n, &mats[1]));
1255d955bbbSStefano Zampini       mats[3] = A;
1265d955bbbSStefano Zampini 
1275d955bbbSStefano Zampini       /* use CreateTranspose/CreateHermitianTranspose or explicit matrix for debugging purposes */
1285d955bbbSStefano Zampini       flg = PETSC_FALSE;
1295d955bbbSStefano Zampini       PetscCall(PetscOptionsGetBool(NULL, NULL, "-expl", &flg, NULL));
130*53587d93SPierre Jolivet #if PetscDefined(USE_COMPLEX)
1315d955bbbSStefano Zampini       if (chol) { /* Hermitian transpose not supported by MUMPS Cholesky factor */
1325d955bbbSStefano Zampini         if (!flg) PetscCall(MatCreateTranspose(mats[1], &mats[2]));
1335d955bbbSStefano Zampini         else PetscCall(MatTranspose(mats[1], MAT_INITIAL_MATRIX, &mats[2]));
134*53587d93SPierre Jolivet         flg = PETSC_TRUE;
1355d955bbbSStefano Zampini       } else {
136*53587d93SPierre Jolivet         if (!flg) {
137*53587d93SPierre Jolivet           Mat B;
138*53587d93SPierre Jolivet 
139*53587d93SPierre Jolivet           PetscCall(MatDuplicate(mats[1], MAT_COPY_VALUES, &B));
140*53587d93SPierre Jolivet           PetscCall(MatCreateHermitianTranspose(B, &mats[2]));
141*53587d93SPierre Jolivet           PetscCall(MatDestroy(&B));
142*53587d93SPierre Jolivet           if (n == m) {
143*53587d93SPierre Jolivet             PetscCall(MatScale(mats[2], PetscCMPLX(4.0, -2.0)));
144*53587d93SPierre Jolivet             PetscCall(MatShift(mats[2], PetscCMPLX(-2.0, 1.0))); // mats[2] = (4 - 2i) B* - (2 - i) I
145*53587d93SPierre Jolivet             PetscCall(MatCreateHermitianTranspose(mats[2], &B));
146*53587d93SPierre Jolivet             PetscCall(MatDestroy(mats + 2));
147*53587d93SPierre Jolivet             PetscCall(MatScale(B, 0.5));
148*53587d93SPierre Jolivet             PetscCall(MatShift(B, PetscCMPLX(1.0, 0.5)));        // B = 0.5 mats[2]* - (1 - 0.5i) I = (2 + i) B - (1 + 0.5i) I + (1 + 0.5i) I = (2 + i) B
149*53587d93SPierre Jolivet             PetscCall(MatCreateHermitianTranspose(B, &mats[2])); // mats[2] = B* = (2 - i) B*
150*53587d93SPierre Jolivet             PetscCall(MatDestroy(&B));
151*53587d93SPierre Jolivet             PetscCall(MatScale(mats[1], PetscCMPLX(2.0, 1.0))); // mats[1] = (2 + i) B = mats[2]*
152*53587d93SPierre Jolivet           } else flg = PETSC_TRUE;
153*53587d93SPierre Jolivet         } else PetscCall(MatHermitianTranspose(mats[1], MAT_INITIAL_MATRIX, &mats[2]));
1545d955bbbSStefano Zampini       }
155*53587d93SPierre Jolivet #else
156*53587d93SPierre Jolivet       if (!flg) {
157*53587d93SPierre Jolivet         Mat B;
158*53587d93SPierre Jolivet 
159*53587d93SPierre Jolivet         PetscCall(MatDuplicate(mats[1], MAT_COPY_VALUES, &B));
160*53587d93SPierre Jolivet         PetscCall(MatCreateTranspose(B, &mats[2]));
161*53587d93SPierre Jolivet         PetscCall(MatDestroy(&B));
162*53587d93SPierre Jolivet         if (n == m) {
163*53587d93SPierre Jolivet           PetscCall(MatScale(mats[2], 4.0));
164*53587d93SPierre Jolivet           PetscCall(MatShift(mats[2], -2.0)); // mats[2] = 4 B' - 2 I
165*53587d93SPierre Jolivet           PetscCall(MatCreateTranspose(mats[2], &B));
166*53587d93SPierre Jolivet           PetscCall(MatDestroy(mats + 2));
167*53587d93SPierre Jolivet           PetscCall(MatScale(B, 0.5));
168*53587d93SPierre Jolivet           PetscCall(MatShift(B, 1.0));                // B = 0.5 mats[2]' + I = 0.5 (4 B' - 2 I)' + I = 2 B
169*53587d93SPierre Jolivet           PetscCall(MatCreateTranspose(B, &mats[2])); // mats[2] = B' = 2 B'
170*53587d93SPierre Jolivet           PetscCall(MatDestroy(&B));
171*53587d93SPierre Jolivet           PetscCall(MatScale(mats[1], 2.0)); // mats[1] = 2 B = mats[2]'
172*53587d93SPierre Jolivet         } else flg = PETSC_TRUE;
173*53587d93SPierre Jolivet       } else PetscCall(MatTranspose(mats[1], MAT_INITIAL_MATRIX, &mats[2]));
174*53587d93SPierre Jolivet #endif
1755d955bbbSStefano Zampini       PetscCall(MatCreateNest(PETSC_COMM_WORLD, 2, NULL, 2, NULL, mats, &B));
1765d955bbbSStefano Zampini       PetscCall(MatDestroy(&mats[0]));
1775d955bbbSStefano Zampini       PetscCall(MatDestroy(&mats[1]));
1785d955bbbSStefano Zampini       PetscCall(MatDestroy(&mats[2]));
1795d955bbbSStefano Zampini     }
18062671d91SStefano Zampini     PetscCall(MatDestroy(&A));
18162671d91SStefano Zampini     A = B;
18262671d91SStefano Zampini     PetscCall(MatSetOption(A, MAT_SYMMETRIC, symm));
1835d955bbbSStefano Zampini 
1845d955bbbSStefano Zampini     /* not all the combinations of MatMat operations are supported by MATNEST. */
1855d955bbbSStefano Zampini     PetscCall(MatComputeOperator(A, MATAIJ, &Ae));
1865d955bbbSStefano Zampini   } else {
1875d955bbbSStefano Zampini     PetscCall(PetscObjectReference((PetscObject)A));
1885d955bbbSStefano Zampini     Ae  = A;
189*53587d93SPierre Jolivet     flg = PETSC_TRUE;
19062671d91SStefano Zampini   }
19162671d91SStefano Zampini   PetscCall(MatGetLocalSize(A, &m, &n));
19262671d91SStefano Zampini   PetscCheck(m == n, PETSC_COMM_SELF, PETSC_ERR_ARG_SIZ, "This example is not intended for rectangular matrices (%" PetscInt_FMT ", %" PetscInt_FMT ")", m, n);
19362671d91SStefano Zampini 
1949566063dSJacob Faibussowitsch   PetscCall(MatViewFromOptions(A, NULL, "-A_view"));
1955d955bbbSStefano Zampini   PetscCall(MatViewFromOptions(Ae, NULL, "-A_view_expl"));
196c4762a1bSJed Brown 
197a5b23f4aSJose E. Roman   /* Create dense matrix C and X; C holds true solution with identical columns */
198c4762a1bSJed Brown   nrhs = 2;
1999566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetInt(NULL, NULL, "-nrhs", &nrhs, NULL));
2009566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "ex125: nrhs %" PetscInt_FMT "\n", nrhs));
2019566063dSJacob Faibussowitsch   PetscCall(MatCreate(PETSC_COMM_WORLD, &C));
2029566063dSJacob Faibussowitsch   PetscCall(MatSetOptionsPrefix(C, "rhs_"));
2039566063dSJacob Faibussowitsch   PetscCall(MatSetSizes(C, m, PETSC_DECIDE, PETSC_DECIDE, nrhs));
2049566063dSJacob Faibussowitsch   PetscCall(MatSetType(C, MATDENSE));
2059566063dSJacob Faibussowitsch   PetscCall(MatSetFromOptions(C));
2069566063dSJacob Faibussowitsch   PetscCall(MatSetUp(C));
207c4762a1bSJed Brown 
2089566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetBool(NULL, NULL, "-view_factor", &view, NULL));
2099566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetBool(NULL, NULL, "-test_matmatsolve", &testMatMatSolve, NULL));
21078bc9606SHong Zhang   PetscCall(PetscOptionsGetBool(NULL, NULL, "-test_matmatsolvetranspose", &testMatMatSolveTranspose, NULL));
21178bc9606SHong Zhang   PetscCall(PetscOptionsGetBool(NULL, NULL, "-test_matsolvetranspose", &testMatSolveTranspose, NULL));
212c4762a1bSJed Brown #if defined(PETSC_HAVE_MUMPS)
2139566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetBool(NULL, NULL, "-test_mumps_opts", &test_mumps_opts, NULL));
214c4762a1bSJed Brown #endif
215c4762a1bSJed Brown 
2169566063dSJacob Faibussowitsch   PetscCall(PetscRandomCreate(PETSC_COMM_WORLD, &rand));
2179566063dSJacob Faibussowitsch   PetscCall(PetscRandomSetFromOptions(rand));
2189566063dSJacob Faibussowitsch   PetscCall(MatSetRandom(C, rand));
2199566063dSJacob Faibussowitsch   PetscCall(MatDuplicate(C, MAT_DO_NOT_COPY_VALUES, &X));
220c4762a1bSJed Brown 
221c4762a1bSJed Brown   /* Create vectors */
2229566063dSJacob Faibussowitsch   PetscCall(MatCreateVecs(A, &x, &b));
2239566063dSJacob Faibussowitsch   PetscCall(VecDuplicate(x, &u)); /* save the true solution */
224c4762a1bSJed Brown 
225c4762a1bSJed Brown   /* Test Factorization */
226*53587d93SPierre Jolivet   if (flg) PetscCall(MatGetOrdering(A, MATORDERINGND, &perm, &iperm)); // TODO FIXME: MatConvert_Nest_AIJ() does not support chained MatCreate[Hermitian]Transpose()
227c4762a1bSJed Brown 
22878bc9606SHong Zhang   PetscCall(PetscOptionsGetString(NULL, NULL, "-mat_solver_type", pack, sizeof(pack), NULL));
229c4762a1bSJed Brown #if defined(PETSC_HAVE_SUPERLU)
23078bc9606SHong Zhang   PetscCall(PetscStrcmp(MATSOLVERSUPERLU, pack, &match));
23178bc9606SHong Zhang   if (match) {
23228b400f6SJacob Faibussowitsch     PetscCheck(!chol, PETSC_COMM_WORLD, PETSC_ERR_SUP, "SuperLU does not provide Cholesky!");
2339566063dSJacob Faibussowitsch     PetscCall(PetscPrintf(PETSC_COMM_WORLD, " SUPERLU LU:\n"));
2349566063dSJacob Faibussowitsch     PetscCall(MatGetFactor(A, MATSOLVERSUPERLU, MAT_FACTOR_LU, &F));
23578bc9606SHong Zhang     matsolvexx = PETSC_FALSE; /* Test MatMatSolve(F,RHS,RHS), RHS is a dense matrix, need further work */
23678bc9606SHong Zhang     ipack      = 0;
23778bc9606SHong Zhang     goto skipoptions;
23878bc9606SHong Zhang   }
239c4762a1bSJed Brown #endif
240c4762a1bSJed Brown #if defined(PETSC_HAVE_SUPERLU_DIST)
24178bc9606SHong Zhang   PetscCall(PetscStrcmp(MATSOLVERSUPERLU_DIST, pack, &match));
24278bc9606SHong Zhang   if (match) {
24328b400f6SJacob Faibussowitsch     PetscCheck(!chol, PETSC_COMM_WORLD, PETSC_ERR_SUP, "SuperLU does not provide Cholesky!");
2449566063dSJacob Faibussowitsch     PetscCall(PetscPrintf(PETSC_COMM_WORLD, " SUPERLU_DIST LU:\n"));
2459566063dSJacob Faibussowitsch     PetscCall(MatGetFactor(A, MATSOLVERSUPERLU_DIST, MAT_FACTOR_LU, &F));
246c4762a1bSJed Brown     matsolvexx = PETSC_TRUE;
24778bc9606SHong Zhang     if (symm) { /* A is symmetric */
24878bc9606SHong Zhang       testMatMatSolveTranspose = PETSC_TRUE;
24978bc9606SHong Zhang       testMatSolveTranspose    = PETSC_TRUE;
25078bc9606SHong Zhang     } else { /* superlu_dist does not support solving A^t x = rhs yet */
25178bc9606SHong Zhang       testMatMatSolveTranspose = PETSC_FALSE;
25278bc9606SHong Zhang       testMatSolveTranspose    = PETSC_FALSE;
25378bc9606SHong Zhang     }
25478bc9606SHong Zhang     ipack = 1;
25578bc9606SHong Zhang     goto skipoptions;
25678bc9606SHong Zhang   }
257c4762a1bSJed Brown #endif
258c4762a1bSJed Brown #if defined(PETSC_HAVE_MUMPS)
25978bc9606SHong Zhang   PetscCall(PetscStrcmp(MATSOLVERMUMPS, pack, &match));
26078bc9606SHong Zhang   if (match) {
261c4762a1bSJed Brown     if (chol) {
2629566063dSJacob Faibussowitsch       PetscCall(PetscPrintf(PETSC_COMM_WORLD, " MUMPS CHOLESKY:\n"));
2639566063dSJacob Faibussowitsch       PetscCall(MatGetFactor(A, MATSOLVERMUMPS, MAT_FACTOR_CHOLESKY, &F));
264c4762a1bSJed Brown     } else {
2659566063dSJacob Faibussowitsch       PetscCall(PetscPrintf(PETSC_COMM_WORLD, " MUMPS LU:\n"));
2669566063dSJacob Faibussowitsch       PetscCall(MatGetFactor(A, MATSOLVERMUMPS, MAT_FACTOR_LU, &F));
267c4762a1bSJed Brown     }
268c4762a1bSJed Brown     matsolvexx = PETSC_TRUE;
269c4762a1bSJed Brown     if (test_mumps_opts) {
270c4762a1bSJed Brown       /* test mumps options */
271c4762a1bSJed Brown       PetscInt  icntl;
272c4762a1bSJed Brown       PetscReal cntl;
273c4762a1bSJed Brown 
274c4762a1bSJed Brown       icntl = 2; /* sequential matrix ordering */
2759566063dSJacob Faibussowitsch       PetscCall(MatMumpsSetIcntl(F, 7, icntl));
276c4762a1bSJed Brown 
277c4762a1bSJed Brown       cntl = 1.e-6; /* threshold for row pivot detection */
2789566063dSJacob Faibussowitsch       PetscCall(MatMumpsSetIcntl(F, 24, 1));
2799566063dSJacob Faibussowitsch       PetscCall(MatMumpsSetCntl(F, 3, cntl));
280c4762a1bSJed Brown     }
28178bc9606SHong Zhang     ipack = 2;
28278bc9606SHong Zhang     goto skipoptions;
28378bc9606SHong Zhang   }
284c4762a1bSJed Brown #endif
285c4762a1bSJed Brown #if defined(PETSC_HAVE_MKL_PARDISO)
28678bc9606SHong Zhang   PetscCall(PetscStrcmp(MATSOLVERMKL_PARDISO, pack, &match));
28778bc9606SHong Zhang   if (match) {
288c4762a1bSJed Brown     if (chol) {
2899566063dSJacob Faibussowitsch       PetscCall(PetscPrintf(PETSC_COMM_WORLD, " MKL_PARDISO CHOLESKY:\n"));
2909566063dSJacob Faibussowitsch       PetscCall(MatGetFactor(A, MATSOLVERMKL_PARDISO, MAT_FACTOR_CHOLESKY, &F));
291c4762a1bSJed Brown     } else {
2929566063dSJacob Faibussowitsch       PetscCall(PetscPrintf(PETSC_COMM_WORLD, " MKL_PARDISO LU:\n"));
2939566063dSJacob Faibussowitsch       PetscCall(MatGetFactor(A, MATSOLVERMKL_PARDISO, MAT_FACTOR_LU, &F));
294c4762a1bSJed Brown     }
29578bc9606SHong Zhang     ipack = 3;
29678bc9606SHong Zhang     goto skipoptions;
29778bc9606SHong Zhang   }
298c4762a1bSJed Brown #endif
29938a8e8c1SStefano Zampini #if defined(PETSC_HAVE_CUDA)
30078bc9606SHong Zhang   PetscCall(PetscStrcmp(MATSOLVERCUSPARSE, pack, &match));
30178bc9606SHong Zhang   if (match) {
30238a8e8c1SStefano Zampini     if (chol) {
3039566063dSJacob Faibussowitsch       PetscCall(PetscPrintf(PETSC_COMM_WORLD, " CUSPARSE CHOLESKY:\n"));
3049566063dSJacob Faibussowitsch       PetscCall(MatGetFactor(A, MATSOLVERCUSPARSE, MAT_FACTOR_CHOLESKY, &F));
30538a8e8c1SStefano Zampini     } else {
3069566063dSJacob Faibussowitsch       PetscCall(PetscPrintf(PETSC_COMM_WORLD, " CUSPARSE LU:\n"));
3079566063dSJacob Faibussowitsch       PetscCall(MatGetFactor(A, MATSOLVERCUSPARSE, MAT_FACTOR_LU, &F));
30838a8e8c1SStefano Zampini     }
30978bc9606SHong Zhang     testMatSolveTranspose    = PETSC_FALSE;
31078bc9606SHong Zhang     testMatMatSolveTranspose = PETSC_FALSE;
31178bc9606SHong Zhang     ipack                    = 4;
31278bc9606SHong Zhang     goto skipoptions;
31378bc9606SHong Zhang   }
31438a8e8c1SStefano Zampini #endif
31578bc9606SHong Zhang   /* PETSc */
31678bc9606SHong Zhang   match = PETSC_TRUE;
31778bc9606SHong Zhang   if (match) {
318c4762a1bSJed Brown     if (chol) {
3199566063dSJacob Faibussowitsch       PetscCall(PetscPrintf(PETSC_COMM_WORLD, " PETSC CHOLESKY:\n"));
3209566063dSJacob Faibussowitsch       PetscCall(MatGetFactor(A, MATSOLVERPETSC, MAT_FACTOR_CHOLESKY, &F));
321c4762a1bSJed Brown     } else {
3229566063dSJacob Faibussowitsch       PetscCall(PetscPrintf(PETSC_COMM_WORLD, " PETSC LU:\n"));
3239566063dSJacob Faibussowitsch       PetscCall(MatGetFactor(A, MATSOLVERPETSC, MAT_FACTOR_LU, &F));
324c4762a1bSJed Brown     }
325c4762a1bSJed Brown     matsolvexx = PETSC_TRUE;
32678bc9606SHong Zhang     ipack      = 5;
32778bc9606SHong Zhang     goto skipoptions;
328c4762a1bSJed Brown   }
329c4762a1bSJed Brown 
33078bc9606SHong Zhang skipoptions:
3319566063dSJacob Faibussowitsch   PetscCall(MatFactorInfoInitialize(&info));
332c4762a1bSJed Brown   info.fill      = 5.0;
333c4762a1bSJed Brown   info.shifttype = (PetscReal)MAT_SHIFT_NONE;
334c4762a1bSJed Brown   if (chol) {
3359566063dSJacob Faibussowitsch     PetscCall(MatCholeskyFactorSymbolic(F, A, perm, &info));
336c4762a1bSJed Brown   } else {
3379566063dSJacob Faibussowitsch     PetscCall(MatLUFactorSymbolic(F, A, perm, iperm, &info));
338c4762a1bSJed Brown   }
339c4762a1bSJed Brown 
340c4762a1bSJed Brown   for (nfact = 0; nfact < 2; nfact++) {
341c4762a1bSJed Brown     if (chol) {
3429566063dSJacob Faibussowitsch       PetscCall(PetscPrintf(PETSC_COMM_WORLD, " %" PetscInt_FMT "-the CHOLESKY numfactorization \n", nfact));
3439566063dSJacob Faibussowitsch       PetscCall(MatCholeskyFactorNumeric(F, A, &info));
344c4762a1bSJed Brown     } else {
3459566063dSJacob Faibussowitsch       PetscCall(PetscPrintf(PETSC_COMM_WORLD, " %" PetscInt_FMT "-the LU numfactorization \n", nfact));
3469566063dSJacob Faibussowitsch       PetscCall(MatLUFactorNumeric(F, A, &info));
347c4762a1bSJed Brown     }
348c4762a1bSJed Brown     if (view) {
3499566063dSJacob Faibussowitsch       PetscCall(PetscViewerPushFormat(PETSC_VIEWER_STDOUT_WORLD, PETSC_VIEWER_ASCII_INFO));
3509566063dSJacob Faibussowitsch       PetscCall(MatView(F, PETSC_VIEWER_STDOUT_WORLD));
3519566063dSJacob Faibussowitsch       PetscCall(PetscViewerPopFormat(PETSC_VIEWER_STDOUT_WORLD));
352c4762a1bSJed Brown       view = PETSC_FALSE;
353c4762a1bSJed Brown     }
354c4762a1bSJed Brown 
355c4762a1bSJed Brown #if defined(PETSC_HAVE_SUPERLU_DIST)
356c4762a1bSJed Brown     if (ipack == 1) { /* Test MatSuperluDistGetDiagU()
357c4762a1bSJed Brown        -- input: matrix factor F; output: main diagonal of matrix U on all processes */
358c4762a1bSJed Brown       PetscInt     M;
359c4762a1bSJed Brown       PetscScalar *diag;
360c4762a1bSJed Brown   #if !defined(PETSC_USE_COMPLEX)
361c4762a1bSJed Brown       PetscInt nneg, nzero, npos;
362c4762a1bSJed Brown   #endif
363c4762a1bSJed Brown 
3649566063dSJacob Faibussowitsch       PetscCall(MatGetSize(F, &M, NULL));
3659566063dSJacob Faibussowitsch       PetscCall(PetscMalloc1(M, &diag));
3669566063dSJacob Faibussowitsch       PetscCall(MatSuperluDistGetDiagU(F, diag));
3679566063dSJacob Faibussowitsch       PetscCall(PetscFree(diag));
368c4762a1bSJed Brown 
369c4762a1bSJed Brown   #if !defined(PETSC_USE_COMPLEX)
370c4762a1bSJed Brown       /* Test MatGetInertia() */
37178bc9606SHong Zhang       if (symm) { /* A is symmetric */
3729566063dSJacob Faibussowitsch         PetscCall(MatGetInertia(F, &nneg, &nzero, &npos));
3739566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(PETSC_VIEWER_STDOUT_WORLD, " MatInertia: nneg: %" PetscInt_FMT ", nzero: %" PetscInt_FMT ", npos: %" PetscInt_FMT "\n", nneg, nzero, npos));
37478bc9606SHong Zhang       }
375c4762a1bSJed Brown   #endif
376c4762a1bSJed Brown     }
377c4762a1bSJed Brown #endif
378c4762a1bSJed Brown 
379d47f36abSHong Zhang #if defined(PETSC_HAVE_MUMPS)
380d47f36abSHong Zhang     /* mumps interface allows repeated call of MatCholeskyFactorSymbolic(), while the succession calls do nothing */
381d47f36abSHong Zhang     if (ipack == 2) {
382d47f36abSHong Zhang       if (chol) {
3839566063dSJacob Faibussowitsch         PetscCall(MatCholeskyFactorSymbolic(F, A, perm, &info));
3849566063dSJacob Faibussowitsch         PetscCall(MatCholeskyFactorNumeric(F, A, &info));
385d47f36abSHong Zhang       } else {
3869566063dSJacob Faibussowitsch         PetscCall(MatLUFactorSymbolic(F, A, perm, iperm, &info));
3879566063dSJacob Faibussowitsch         PetscCall(MatLUFactorNumeric(F, A, &info));
388d47f36abSHong Zhang       }
389d47f36abSHong Zhang     }
390d47f36abSHong Zhang #endif
391d47f36abSHong Zhang 
392b18964edSHong Zhang     /* Test MatMatSolve(), A X = B, where B can be dense or sparse */
393c4762a1bSJed Brown     if (testMatMatSolve) {
394c4762a1bSJed Brown       if (!nfact) {
3955d955bbbSStefano Zampini         PetscCall(MatMatMult(Ae, C, MAT_INITIAL_MATRIX, 2.0, &RHS));
396c4762a1bSJed Brown       } else {
3975d955bbbSStefano Zampini         PetscCall(MatMatMult(Ae, C, MAT_REUSE_MATRIX, 2.0, &RHS));
398c4762a1bSJed Brown       }
399c4762a1bSJed Brown       for (nsolve = 0; nsolve < 2; nsolve++) {
4009566063dSJacob Faibussowitsch         PetscCall(PetscPrintf(PETSC_COMM_WORLD, "   %" PetscInt_FMT "-the MatMatSolve \n", nsolve));
4019566063dSJacob Faibussowitsch         PetscCall(MatMatSolve(F, RHS, X));
402c4762a1bSJed Brown 
403c4762a1bSJed Brown         /* Check the error */
4049566063dSJacob Faibussowitsch         PetscCall(MatAXPY(X, -1.0, C, SAME_NONZERO_PATTERN));
4059566063dSJacob Faibussowitsch         PetscCall(MatNorm(X, NORM_FROBENIUS, &norm));
406b18964edSHong Zhang         if (norm > tol) PetscCall(PetscPrintf(PETSC_COMM_WORLD, "%" PetscInt_FMT "-the MatMatSolve: Norm of error %g, nsolve %" PetscInt_FMT "\n", nsolve, (double)norm, nsolve));
407c4762a1bSJed Brown       }
408b18964edSHong Zhang 
409c4762a1bSJed Brown       if (matsolvexx) {
410c4762a1bSJed Brown         /* Test MatMatSolve(F,RHS,RHS), RHS is a dense matrix */
4119566063dSJacob Faibussowitsch         PetscCall(MatCopy(RHS, X, SAME_NONZERO_PATTERN));
4129566063dSJacob Faibussowitsch         PetscCall(MatMatSolve(F, X, X));
413c4762a1bSJed Brown         /* Check the error */
4149566063dSJacob Faibussowitsch         PetscCall(MatAXPY(X, -1.0, C, SAME_NONZERO_PATTERN));
4159566063dSJacob Faibussowitsch         PetscCall(MatNorm(X, NORM_FROBENIUS, &norm));
416b18964edSHong Zhang         if (norm > tol) PetscCall(PetscPrintf(PETSC_COMM_WORLD, "MatMatSolve(F,RHS,RHS): Norm of error %g\n", (double)norm));
417c4762a1bSJed Brown       }
418c4762a1bSJed Brown 
419c4762a1bSJed Brown       if (ipack == 2 && size == 1) {
420c4762a1bSJed Brown         Mat spRHS, spRHST, RHST;
421c4762a1bSJed Brown 
4229566063dSJacob Faibussowitsch         PetscCall(MatTranspose(RHS, MAT_INITIAL_MATRIX, &RHST));
4239566063dSJacob Faibussowitsch         PetscCall(MatConvert(RHST, MATAIJ, MAT_INITIAL_MATRIX, &spRHST));
4249566063dSJacob Faibussowitsch         PetscCall(MatCreateTranspose(spRHST, &spRHS));
425c4762a1bSJed Brown         for (nsolve = 0; nsolve < 2; nsolve++) {
4269566063dSJacob Faibussowitsch           PetscCall(PetscPrintf(PETSC_COMM_WORLD, "   %" PetscInt_FMT "-the sparse MatMatSolve \n", nsolve));
4279566063dSJacob Faibussowitsch           PetscCall(MatMatSolve(F, spRHS, X));
428c4762a1bSJed Brown 
429c4762a1bSJed Brown           /* Check the error */
4309566063dSJacob Faibussowitsch           PetscCall(MatAXPY(X, -1.0, C, SAME_NONZERO_PATTERN));
4319566063dSJacob Faibussowitsch           PetscCall(MatNorm(X, NORM_FROBENIUS, &norm));
432b18964edSHong Zhang           if (norm > tol) PetscCall(PetscPrintf(PETSC_COMM_WORLD, "%" PetscInt_FMT "-the sparse MatMatSolve: Norm of error %g, nsolve %" PetscInt_FMT "\n", nsolve, (double)norm, nsolve));
433c4762a1bSJed Brown         }
434b18964edSHong Zhang         PetscCall(MatDestroy(&spRHST));
435b18964edSHong Zhang         PetscCall(MatDestroy(&spRHS));
436b18964edSHong Zhang         PetscCall(MatDestroy(&RHST));
437b18964edSHong Zhang       }
438b18964edSHong Zhang     }
439b18964edSHong Zhang 
440b18964edSHong Zhang     /* Test testMatMatSolveTranspose(), A^T X = B, where B can be dense or sparse */
441b18964edSHong Zhang     if (testMatMatSolveTranspose) {
442b18964edSHong Zhang       if (!nfact) {
4435d955bbbSStefano Zampini         PetscCall(MatTransposeMatMult(Ae, C, MAT_INITIAL_MATRIX, 2.0, &RHS1));
444b18964edSHong Zhang       } else {
4455d955bbbSStefano Zampini         PetscCall(MatTransposeMatMult(Ae, C, MAT_REUSE_MATRIX, 2.0, &RHS1));
446b18964edSHong Zhang       }
447b18964edSHong Zhang 
448b18964edSHong Zhang       for (nsolve = 0; nsolve < 2; nsolve++) {
44978bc9606SHong Zhang         PetscCall(PetscPrintf(PETSC_COMM_WORLD, "   %" PetscInt_FMT "-the MatMatSolveTranspose\n", nsolve));
450b18964edSHong Zhang         PetscCall(MatMatSolveTranspose(F, RHS1, X));
451b18964edSHong Zhang 
452b18964edSHong Zhang         /* Check the error */
453b18964edSHong Zhang         PetscCall(MatAXPY(X, -1.0, C, SAME_NONZERO_PATTERN));
454b18964edSHong Zhang         PetscCall(MatNorm(X, NORM_FROBENIUS, &norm));
455b18964edSHong Zhang         if (norm > tol) PetscCall(PetscPrintf(PETSC_COMM_WORLD, "%" PetscInt_FMT "-the MatMatSolveTranspose: Norm of error %g, nsolve %" PetscInt_FMT "\n", nsolve, (double)norm, nsolve));
456b18964edSHong Zhang       }
457b18964edSHong Zhang 
458b18964edSHong Zhang       if (ipack == 2 && size == 1) {
459b18964edSHong Zhang         Mat spRHS, spRHST, RHST;
460b18964edSHong Zhang 
461b18964edSHong Zhang         PetscCall(MatTranspose(RHS1, MAT_INITIAL_MATRIX, &RHST));
462b18964edSHong Zhang         PetscCall(MatConvert(RHST, MATAIJ, MAT_INITIAL_MATRIX, &spRHST));
463b18964edSHong Zhang         PetscCall(MatCreateTranspose(spRHST, &spRHS));
464b18964edSHong Zhang         for (nsolve = 0; nsolve < 2; nsolve++) {
465b18964edSHong Zhang           PetscCall(MatMatSolveTranspose(F, spRHS, X));
466b18964edSHong Zhang 
467b18964edSHong Zhang           /* Check the error */
468b18964edSHong Zhang           PetscCall(MatAXPY(X, -1.0, C, SAME_NONZERO_PATTERN));
469b18964edSHong Zhang           PetscCall(MatNorm(X, NORM_FROBENIUS, &norm));
470b18964edSHong Zhang           if (norm > tol) PetscCall(PetscPrintf(PETSC_COMM_WORLD, "%" PetscInt_FMT "-the sparse MatMatSolveTranspose: Norm of error %g, nsolve %" PetscInt_FMT "\n", nsolve, (double)norm, nsolve));
471c4762a1bSJed Brown         }
4729566063dSJacob Faibussowitsch         PetscCall(MatDestroy(&spRHST));
4739566063dSJacob Faibussowitsch         PetscCall(MatDestroy(&spRHS));
4749566063dSJacob Faibussowitsch         PetscCall(MatDestroy(&RHST));
475c4762a1bSJed Brown       }
476c4762a1bSJed Brown     }
477c4762a1bSJed Brown 
478c4762a1bSJed Brown     /* Test MatSolve() */
479c4762a1bSJed Brown     if (testMatSolve) {
480c4762a1bSJed Brown       for (nsolve = 0; nsolve < 2; nsolve++) {
4819566063dSJacob Faibussowitsch         PetscCall(VecSetRandom(x, rand));
4829566063dSJacob Faibussowitsch         PetscCall(VecCopy(x, u));
4835d955bbbSStefano Zampini         PetscCall(MatMult(Ae, x, b));
484c4762a1bSJed Brown 
4859566063dSJacob Faibussowitsch         PetscCall(PetscPrintf(PETSC_COMM_WORLD, "   %" PetscInt_FMT "-the MatSolve \n", nsolve));
4869566063dSJacob Faibussowitsch         PetscCall(MatSolve(F, b, x));
487c4762a1bSJed Brown 
488c4762a1bSJed Brown         /* Check the error */
4899566063dSJacob Faibussowitsch         PetscCall(VecAXPY(u, -1.0, x)); /* u <- (-1.0)x + u */
4909566063dSJacob Faibussowitsch         PetscCall(VecNorm(u, NORM_2, &norm));
491c4762a1bSJed Brown         if (norm > tol) {
492c4762a1bSJed Brown           PetscReal resi;
4935d955bbbSStefano Zampini           PetscCall(MatMult(Ae, x, u));   /* u = A*x */
4949566063dSJacob Faibussowitsch           PetscCall(VecAXPY(u, -1.0, b)); /* u <- (-1.0)b + u */
4959566063dSJacob Faibussowitsch           PetscCall(VecNorm(u, NORM_2, &resi));
4969566063dSJacob Faibussowitsch           PetscCall(PetscPrintf(PETSC_COMM_WORLD, "MatSolve: Norm of error %g, resi %g, numfact %" PetscInt_FMT "\n", (double)norm, (double)resi, nfact));
497c4762a1bSJed Brown         }
498c4762a1bSJed Brown       }
499c4762a1bSJed Brown     }
50078bc9606SHong Zhang 
50178bc9606SHong Zhang     /* Test MatSolveTranspose() */
50278bc9606SHong Zhang     if (testMatSolveTranspose) {
50378bc9606SHong Zhang       for (nsolve = 0; nsolve < 2; nsolve++) {
50478bc9606SHong Zhang         PetscCall(VecSetRandom(x, rand));
50578bc9606SHong Zhang         PetscCall(VecCopy(x, u));
5065d955bbbSStefano Zampini         PetscCall(MatMultTranspose(Ae, x, b));
50778bc9606SHong Zhang 
50878bc9606SHong Zhang         PetscCall(PetscPrintf(PETSC_COMM_WORLD, "   %" PetscInt_FMT "-the MatSolveTranspose\n", nsolve));
50978bc9606SHong Zhang         PetscCall(MatSolveTranspose(F, b, x));
51078bc9606SHong Zhang 
51178bc9606SHong Zhang         /* Check the error */
51278bc9606SHong Zhang         PetscCall(VecAXPY(u, -1.0, x)); /* u <- (-1.0)x + u */
51378bc9606SHong Zhang         PetscCall(VecNorm(u, NORM_2, &norm));
51478bc9606SHong Zhang         if (norm > tol) {
51578bc9606SHong Zhang           PetscReal resi;
516070736c7SStefano Zampini           PetscCall(MatMultTranspose(Ae, x, u)); /* u = A*x */
51778bc9606SHong Zhang           PetscCall(VecAXPY(u, -1.0, b));        /* u <- (-1.0)b + u */
51878bc9606SHong Zhang           PetscCall(VecNorm(u, NORM_2, &resi));
51978bc9606SHong Zhang           PetscCall(PetscPrintf(PETSC_COMM_WORLD, "MatSolveTranspose: Norm of error %g, resi %g, numfact %" PetscInt_FMT "\n", (double)norm, (double)resi, nfact));
52078bc9606SHong Zhang         }
52178bc9606SHong Zhang       }
52278bc9606SHong Zhang     }
523c4762a1bSJed Brown   }
524c4762a1bSJed Brown 
525c4762a1bSJed Brown   /* Free data structures */
5265d955bbbSStefano Zampini   PetscCall(MatDestroy(&Ae));
5279566063dSJacob Faibussowitsch   PetscCall(MatDestroy(&A));
5289566063dSJacob Faibussowitsch   PetscCall(MatDestroy(&C));
5299566063dSJacob Faibussowitsch   PetscCall(MatDestroy(&F));
5309566063dSJacob Faibussowitsch   PetscCall(MatDestroy(&X));
5319566063dSJacob Faibussowitsch   PetscCall(MatDestroy(&RHS));
532b18964edSHong Zhang   PetscCall(MatDestroy(&RHS1));
533c4762a1bSJed Brown 
5349566063dSJacob Faibussowitsch   PetscCall(PetscRandomDestroy(&rand));
5359566063dSJacob Faibussowitsch   PetscCall(ISDestroy(&perm));
5369566063dSJacob Faibussowitsch   PetscCall(ISDestroy(&iperm));
5379566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&x));
5389566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&b));
5399566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&u));
5409566063dSJacob Faibussowitsch   PetscCall(PetscFinalize());
541b122ec5aSJacob Faibussowitsch   return 0;
542c4762a1bSJed Brown }
543c4762a1bSJed Brown 
544c4762a1bSJed Brown /*TEST
545c4762a1bSJed Brown 
546c4762a1bSJed Brown    test:
547dfd57a17SPierre Jolivet       requires: datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES)
54878bc9606SHong Zhang       args: -f ${DATAFILESPATH}/matrices/medium -mat_solver_type petsc
549c4762a1bSJed Brown       output_file: output/ex125.out
550c4762a1bSJed Brown 
551c4762a1bSJed Brown    test:
5529a14fc28SStefano Zampini       suffix: 2
55378bc9606SHong Zhang       args: -mat_solver_type petsc
5549a14fc28SStefano Zampini       output_file: output/ex125.out
5559a14fc28SStefano Zampini 
5569a14fc28SStefano Zampini    test:
557c4762a1bSJed Brown       suffix: mkl_pardiso
558dfd57a17SPierre Jolivet       requires: mkl_pardiso datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES)
55978bc9606SHong Zhang       args: -f ${DATAFILESPATH}/matrices/small -mat_solver_type mkl_pardiso
560c4762a1bSJed Brown 
561c4762a1bSJed Brown    test:
5629a14fc28SStefano Zampini       suffix: mkl_pardiso_2
5639a14fc28SStefano Zampini       requires: mkl_pardiso
56478bc9606SHong Zhang       args: -mat_solver_type mkl_pardiso
5659a14fc28SStefano Zampini       output_file: output/ex125_mkl_pardiso.out
5669a14fc28SStefano Zampini 
5679a14fc28SStefano Zampini    test:
568c4762a1bSJed Brown       suffix: mumps
569dfd57a17SPierre Jolivet       requires: mumps datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES)
57078bc9606SHong Zhang       args: -f ${DATAFILESPATH}/matrices/small -mat_solver_type mumps
571c4762a1bSJed Brown       output_file: output/ex125_mumps_seq.out
572c4762a1bSJed Brown 
573c4762a1bSJed Brown    test:
57462671d91SStefano Zampini       suffix: mumps_nest
57562671d91SStefano Zampini       requires: mumps datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES)
5765d955bbbSStefano Zampini       args: -f ${DATAFILESPATH}/matrices/small -mat_solver_type mumps -test_nest -test_nest_bordered {{0 1}}
57762671d91SStefano Zampini       output_file: output/ex125_mumps_seq.out
57862671d91SStefano Zampini 
57962671d91SStefano Zampini    test:
580c4762a1bSJed Brown       suffix: mumps_2
581c4762a1bSJed Brown       nsize: 3
582dfd57a17SPierre Jolivet       requires: mumps datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES)
58378bc9606SHong Zhang       args: -f ${DATAFILESPATH}/matrices/small -mat_solver_type mumps
584c4762a1bSJed Brown       output_file: output/ex125_mumps_par.out
585c4762a1bSJed Brown 
586c4762a1bSJed Brown    test:
58762671d91SStefano Zampini       suffix: mumps_2_nest
58862671d91SStefano Zampini       nsize: 3
58962671d91SStefano Zampini       requires: mumps datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES)
5905d955bbbSStefano Zampini       args: -f ${DATAFILESPATH}/matrices/small -mat_solver_type mumps -test_nest -test_nest_bordered {{0 1}}
59162671d91SStefano Zampini       output_file: output/ex125_mumps_par.out
59262671d91SStefano Zampini 
59362671d91SStefano Zampini    test:
5949a14fc28SStefano Zampini       suffix: mumps_3
5959a14fc28SStefano Zampini       requires: mumps
59678bc9606SHong Zhang       args: -mat_solver_type mumps
5979a14fc28SStefano Zampini       output_file: output/ex125_mumps_seq.out
5989a14fc28SStefano Zampini 
5999a14fc28SStefano Zampini    test:
60062671d91SStefano Zampini       suffix: mumps_3_nest
60162671d91SStefano Zampini       requires: mumps
6025d955bbbSStefano Zampini       args: -mat_solver_type mumps -test_nest -test_nest_bordered {{0 1}}
60362671d91SStefano Zampini       output_file: output/ex125_mumps_seq.out
60462671d91SStefano Zampini 
60562671d91SStefano Zampini    test:
6069a14fc28SStefano Zampini       suffix: mumps_4
6079a14fc28SStefano Zampini       nsize: 3
6089a14fc28SStefano Zampini       requires: mumps
60978bc9606SHong Zhang       args: -mat_solver_type mumps
6109a14fc28SStefano Zampini       output_file: output/ex125_mumps_par.out
6119a14fc28SStefano Zampini 
6129a14fc28SStefano Zampini    test:
61362671d91SStefano Zampini       suffix: mumps_4_nest
61462671d91SStefano Zampini       nsize: 3
61562671d91SStefano Zampini       requires: mumps
6165d955bbbSStefano Zampini       args: -mat_solver_type mumps -test_nest -test_nest_bordered {{0 1}}
61762671d91SStefano Zampini       output_file: output/ex125_mumps_par.out
61862671d91SStefano Zampini 
61962671d91SStefano Zampini    test:
620d47f36abSHong Zhang       suffix: mumps_5
621d47f36abSHong Zhang       nsize: 3
622d47f36abSHong Zhang       requires: mumps
62378bc9606SHong Zhang       args: -mat_solver_type mumps -cholesky
624d47f36abSHong Zhang       output_file: output/ex125_mumps_par_cholesky.out
625d47f36abSHong Zhang 
626d47f36abSHong Zhang    test:
62762671d91SStefano Zampini       suffix: mumps_5_nest
62862671d91SStefano Zampini       nsize: 3
62962671d91SStefano Zampini       requires: mumps
6305d955bbbSStefano Zampini       args: -mat_solver_type mumps -cholesky -test_nest -test_nest_bordered {{0 1}}
63162671d91SStefano Zampini       output_file: output/ex125_mumps_par_cholesky.out
63262671d91SStefano Zampini 
63362671d91SStefano Zampini    test:
634*53587d93SPierre Jolivet       suffix: mumps_6
635*53587d93SPierre Jolivet       nsize: 2
636*53587d93SPierre Jolivet       requires: mumps
637*53587d93SPierre Jolivet       args: -mat_solver_type mumps -test_nest -test_nest_bordered -m 13 -n 13
638*53587d93SPierre Jolivet       output_file: output/ex125_mumps_par.out
639*53587d93SPierre Jolivet 
640*53587d93SPierre Jolivet    test:
64178bc9606SHong Zhang       suffix: superlu
64278bc9606SHong Zhang       requires: datafilespath double !complex !defined(PETSC_USE_64BIT_INDICES) superlu
64378bc9606SHong Zhang       args: -f ${DATAFILESPATH}/matrices/medium -mat_solver_type superlu
64478bc9606SHong Zhang       output_file: output/ex125_superlu.out
64578bc9606SHong Zhang 
64678bc9606SHong Zhang    test:
647c4762a1bSJed Brown       suffix: superlu_dist
6489a14fc28SStefano Zampini       nsize: {{1 3}}
649d4783600SBarry Smith       requires: datafilespath double !complex !defined(PETSC_USE_64BIT_INDICES) superlu_dist
65078bc9606SHong Zhang       args: -f ${DATAFILESPATH}/matrices/small -mat_solver_type superlu_dist -mat_superlu_dist_rowperm NOROWPERM
65178bc9606SHong Zhang       output_file: output/ex125_superlu_dist.out
652c4762a1bSJed Brown 
653c4762a1bSJed Brown    test:
654c4762a1bSJed Brown       suffix: superlu_dist_2
6559a14fc28SStefano Zampini       nsize: {{1 3}}
6569a14fc28SStefano Zampini       requires: superlu_dist !complex
65778bc9606SHong Zhang       args: -n 36 -mat_solver_type superlu_dist -mat_superlu_dist_rowperm NOROWPERM
658c4762a1bSJed Brown       output_file: output/ex125_superlu_dist.out
659c4762a1bSJed Brown 
660c4762a1bSJed Brown    test:
66178bc9606SHong Zhang       suffix: superlu_dist_3
66278bc9606SHong Zhang       nsize: {{1 3}}
66378bc9606SHong Zhang       requires: superlu_dist !complex
66478bc9606SHong Zhang       requires: datafilespath double !complex !defined(PETSC_USE_64BIT_INDICES) superlu_dist
66578bc9606SHong Zhang       args: -f ${DATAFILESPATH}/matrices/medium -mat_solver_type superlu_dist -mat_superlu_dist_rowperm NOROWPERM
66678bc9606SHong Zhang       output_file: output/ex125_superlu_dist_nonsymmetric.out
66778bc9606SHong Zhang 
66878bc9606SHong Zhang    test:
669c4762a1bSJed Brown       suffix: superlu_dist_complex
670c4762a1bSJed Brown       nsize: 3
671d4783600SBarry Smith       requires: datafilespath double superlu_dist complex !defined(PETSC_USE_64BIT_INDICES)
67278bc9606SHong Zhang       args: -f ${DATAFILESPATH}/matrices/farzad_B_rhs -mat_solver_type superlu_dist
673c4762a1bSJed Brown       output_file: output/ex125_superlu_dist_complex.out
674c4762a1bSJed Brown 
67538a8e8c1SStefano Zampini    test:
6769a14fc28SStefano Zampini       suffix: superlu_dist_complex_2
6779a14fc28SStefano Zampini       nsize: 3
6789a14fc28SStefano Zampini       requires: superlu_dist complex
67978bc9606SHong Zhang       args: -mat_solver_type superlu_dist
68078bc9606SHong Zhang       output_file: output/ex125_superlu_dist_complex_2.out
6819a14fc28SStefano Zampini 
6829a14fc28SStefano Zampini    test:
68338a8e8c1SStefano Zampini       suffix: cusparse
684dfd57a17SPierre Jolivet       requires: cuda datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES)
6850338c944SBarry Smith       #TODO: fix the bug with cholesky
68678bc9606SHong Zhang       #args: -mat_type aijcusparse -f ${DATAFILESPATH}/matrices/small -mat_solver_type cusparse -cholesky {{0 1}separate output}
68778bc9606SHong Zhang       args: -mat_type aijcusparse -f ${DATAFILESPATH}/matrices/small -mat_solver_type cusparse -cholesky {{0}separate output}
68838a8e8c1SStefano Zampini 
6899a14fc28SStefano Zampini    test:
6909a14fc28SStefano Zampini       suffix: cusparse_2
6919a14fc28SStefano Zampini       requires: cuda
69278bc9606SHong Zhang       args: -mat_type aijcusparse -mat_solver_type cusparse -cholesky {{0 1}separate output}
6939a14fc28SStefano Zampini 
694c4762a1bSJed Brown TEST*/
695