xref: /petsc/src/mat/tests/ex125.c (revision 9a3a8673b4aea812b2f0c314666d2e7ff14d2577)
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 
CreateRandom(PetscInt n,PetscInt m,Mat * A)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 
CreateIdentity(PetscInt n,Mat * A)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 
main(int argc,char ** args)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;
5639989c4fSStefano Zampini   PetscBool     chol = PETSC_FALSE, view = PETSC_FALSE, matsolvexx = PETSC_FALSE, test_inertia;
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 
9339989c4fSStefano Zampini   test_inertia = symm;
9439989c4fSStefano Zampini   PetscCall(PetscOptionsGetBool(NULL, NULL, "-test_inertia", &test_inertia, NULL));
9539989c4fSStefano Zampini 
965d955bbbSStefano Zampini   PetscCall(PetscOptionsGetBool(NULL, NULL, "-cholesky", &chol, NULL));
97cf053153SJunchao Zhang   PetscCall(PetscOptionsGetReal(NULL, NULL, "-tol", &tol, NULL));
985d955bbbSStefano Zampini 
9962671d91SStefano Zampini   /* test MATNEST support */
10062671d91SStefano Zampini   flg = PETSC_FALSE;
10162671d91SStefano Zampini   PetscCall(PetscOptionsGetBool(NULL, NULL, "-test_nest", &flg, NULL));
10262671d91SStefano Zampini   if (flg) {
1035d955bbbSStefano Zampini     Mat B;
10462671d91SStefano Zampini 
1055d955bbbSStefano Zampini     flg = PETSC_FALSE;
1065d955bbbSStefano Zampini     PetscCall(PetscOptionsGetBool(NULL, NULL, "-test_nest_bordered", &flg, NULL));
1075d955bbbSStefano Zampini     if (!flg) {
1085d955bbbSStefano Zampini       Mat mats[9] = {NULL, NULL, A, NULL, A, NULL, A, NULL, NULL};
1095d955bbbSStefano Zampini 
1105d955bbbSStefano Zampini       /* Create a nested matrix representing
11162671d91SStefano Zampini               | 0 0 A |
11262671d91SStefano Zampini               | 0 A 0 |
11362671d91SStefano Zampini               | A 0 0 |
11462671d91SStefano Zampini       */
11562671d91SStefano Zampini       PetscCall(MatCreateNest(PETSC_COMM_WORLD, 3, NULL, 3, NULL, mats, &B));
11653587d93SPierre Jolivet       flg = PETSC_TRUE;
1175d955bbbSStefano Zampini     } else {
1185d955bbbSStefano Zampini       Mat mats[4];
1195d955bbbSStefano Zampini 
1205d955bbbSStefano Zampini       /* Create a nested matrix representing
1215d955bbbSStefano Zampini               | Id  R |
1225d955bbbSStefano Zampini               | R^t A |
1235d955bbbSStefano Zampini       */
1245d955bbbSStefano Zampini       PetscCall(MatGetSize(A, NULL, &n));
1255d955bbbSStefano Zampini       m = n + 12;
1265d955bbbSStefano Zampini       PetscCall(PetscOptionsGetInt(NULL, NULL, "-m", &m, NULL));
1275d955bbbSStefano Zampini       PetscCall(CreateIdentity(m, &mats[0]));
1285d955bbbSStefano Zampini       PetscCall(CreateRandom(m, n, &mats[1]));
1295d955bbbSStefano Zampini       mats[3] = A;
1305d955bbbSStefano Zampini 
1315d955bbbSStefano Zampini       /* use CreateTranspose/CreateHermitianTranspose or explicit matrix for debugging purposes */
1325d955bbbSStefano Zampini       flg = PETSC_FALSE;
1335d955bbbSStefano Zampini       PetscCall(PetscOptionsGetBool(NULL, NULL, "-expl", &flg, NULL));
13453587d93SPierre Jolivet #if PetscDefined(USE_COMPLEX)
1355d955bbbSStefano Zampini       if (chol) { /* Hermitian transpose not supported by MUMPS Cholesky factor */
1365d955bbbSStefano Zampini         if (!flg) PetscCall(MatCreateTranspose(mats[1], &mats[2]));
1375d955bbbSStefano Zampini         else PetscCall(MatTranspose(mats[1], MAT_INITIAL_MATRIX, &mats[2]));
13853587d93SPierre Jolivet         flg = PETSC_TRUE;
1395d955bbbSStefano Zampini       } else {
14053587d93SPierre Jolivet         if (!flg) {
14153587d93SPierre Jolivet           Mat B;
14253587d93SPierre Jolivet 
14353587d93SPierre Jolivet           PetscCall(MatDuplicate(mats[1], MAT_COPY_VALUES, &B));
14453587d93SPierre Jolivet           PetscCall(MatCreateHermitianTranspose(B, &mats[2]));
14553587d93SPierre Jolivet           PetscCall(MatDestroy(&B));
14653587d93SPierre Jolivet           if (n == m) {
14753587d93SPierre Jolivet             PetscCall(MatScale(mats[2], PetscCMPLX(4.0, -2.0)));
14853587d93SPierre Jolivet             PetscCall(MatShift(mats[2], PetscCMPLX(-2.0, 1.0))); // mats[2] = (4 - 2i) B* - (2 - i) I
14953587d93SPierre Jolivet             PetscCall(MatCreateHermitianTranspose(mats[2], &B));
15053587d93SPierre Jolivet             PetscCall(MatDestroy(mats + 2));
15153587d93SPierre Jolivet             PetscCall(MatScale(B, 0.5));
15253587d93SPierre 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
15353587d93SPierre Jolivet             PetscCall(MatCreateHermitianTranspose(B, &mats[2])); // mats[2] = B* = (2 - i) B*
15453587d93SPierre Jolivet             PetscCall(MatDestroy(&B));
15553587d93SPierre Jolivet             PetscCall(MatScale(mats[1], PetscCMPLX(2.0, 1.0))); // mats[1] = (2 + i) B = mats[2]*
15653587d93SPierre Jolivet           } else flg = PETSC_TRUE;
15753587d93SPierre Jolivet         } else PetscCall(MatHermitianTranspose(mats[1], MAT_INITIAL_MATRIX, &mats[2]));
1585d955bbbSStefano Zampini       }
15953587d93SPierre Jolivet #else
16053587d93SPierre Jolivet       if (!flg) {
16153587d93SPierre Jolivet         Mat B;
16253587d93SPierre Jolivet 
16353587d93SPierre Jolivet         PetscCall(MatDuplicate(mats[1], MAT_COPY_VALUES, &B));
16453587d93SPierre Jolivet         PetscCall(MatCreateTranspose(B, &mats[2]));
16553587d93SPierre Jolivet         PetscCall(MatDestroy(&B));
16653587d93SPierre Jolivet         if (n == m) {
16753587d93SPierre Jolivet           PetscCall(MatScale(mats[2], 4.0));
16853587d93SPierre Jolivet           PetscCall(MatShift(mats[2], -2.0)); // mats[2] = 4 B' - 2 I
16953587d93SPierre Jolivet           PetscCall(MatCreateTranspose(mats[2], &B));
17053587d93SPierre Jolivet           PetscCall(MatDestroy(mats + 2));
17153587d93SPierre Jolivet           PetscCall(MatScale(B, 0.5));
17253587d93SPierre Jolivet           PetscCall(MatShift(B, 1.0));                // B = 0.5 mats[2]' + I = 0.5 (4 B' - 2 I)' + I = 2 B
17353587d93SPierre Jolivet           PetscCall(MatCreateTranspose(B, &mats[2])); // mats[2] = B' = 2 B'
17453587d93SPierre Jolivet           PetscCall(MatDestroy(&B));
17553587d93SPierre Jolivet           PetscCall(MatScale(mats[1], 2.0)); // mats[1] = 2 B = mats[2]'
17653587d93SPierre Jolivet         } else flg = PETSC_TRUE;
17753587d93SPierre Jolivet       } else PetscCall(MatTranspose(mats[1], MAT_INITIAL_MATRIX, &mats[2]));
17853587d93SPierre Jolivet #endif
1795d955bbbSStefano Zampini       PetscCall(MatCreateNest(PETSC_COMM_WORLD, 2, NULL, 2, NULL, mats, &B));
1805d955bbbSStefano Zampini       PetscCall(MatDestroy(&mats[0]));
1815d955bbbSStefano Zampini       PetscCall(MatDestroy(&mats[1]));
1825d955bbbSStefano Zampini       PetscCall(MatDestroy(&mats[2]));
1835d955bbbSStefano Zampini     }
18462671d91SStefano Zampini     PetscCall(MatDestroy(&A));
18562671d91SStefano Zampini     A = B;
18662671d91SStefano Zampini     PetscCall(MatSetOption(A, MAT_SYMMETRIC, symm));
1875d955bbbSStefano Zampini 
1885d955bbbSStefano Zampini     /* not all the combinations of MatMat operations are supported by MATNEST. */
1895d955bbbSStefano Zampini     PetscCall(MatComputeOperator(A, MATAIJ, &Ae));
1905d955bbbSStefano Zampini   } else {
1915d955bbbSStefano Zampini     PetscCall(PetscObjectReference((PetscObject)A));
1925d955bbbSStefano Zampini     Ae  = A;
19353587d93SPierre Jolivet     flg = PETSC_TRUE;
19462671d91SStefano Zampini   }
19562671d91SStefano Zampini   PetscCall(MatGetLocalSize(A, &m, &n));
19662671d91SStefano 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);
19762671d91SStefano Zampini 
1989566063dSJacob Faibussowitsch   PetscCall(MatViewFromOptions(A, NULL, "-A_view"));
1995d955bbbSStefano Zampini   PetscCall(MatViewFromOptions(Ae, NULL, "-A_view_expl"));
200c4762a1bSJed Brown 
201a5b23f4aSJose E. Roman   /* Create dense matrix C and X; C holds true solution with identical columns */
202c4762a1bSJed Brown   nrhs = 2;
2039566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetInt(NULL, NULL, "-nrhs", &nrhs, NULL));
2049566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_WORLD, "ex125: nrhs %" PetscInt_FMT "\n", nrhs));
2059566063dSJacob Faibussowitsch   PetscCall(MatCreate(PETSC_COMM_WORLD, &C));
2069566063dSJacob Faibussowitsch   PetscCall(MatSetOptionsPrefix(C, "rhs_"));
2079566063dSJacob Faibussowitsch   PetscCall(MatSetSizes(C, m, PETSC_DECIDE, PETSC_DECIDE, nrhs));
2089566063dSJacob Faibussowitsch   PetscCall(MatSetType(C, MATDENSE));
2099566063dSJacob Faibussowitsch   PetscCall(MatSetFromOptions(C));
2109566063dSJacob Faibussowitsch   PetscCall(MatSetUp(C));
211c4762a1bSJed Brown 
2129566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetBool(NULL, NULL, "-view_factor", &view, NULL));
2139566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetBool(NULL, NULL, "-test_matmatsolve", &testMatMatSolve, NULL));
21478bc9606SHong Zhang   PetscCall(PetscOptionsGetBool(NULL, NULL, "-test_matmatsolvetranspose", &testMatMatSolveTranspose, NULL));
21578bc9606SHong Zhang   PetscCall(PetscOptionsGetBool(NULL, NULL, "-test_matsolvetranspose", &testMatSolveTranspose, NULL));
216c4762a1bSJed Brown #if defined(PETSC_HAVE_MUMPS)
2179566063dSJacob Faibussowitsch   PetscCall(PetscOptionsGetBool(NULL, NULL, "-test_mumps_opts", &test_mumps_opts, NULL));
218c4762a1bSJed Brown #endif
219c4762a1bSJed Brown 
2209566063dSJacob Faibussowitsch   PetscCall(PetscRandomCreate(PETSC_COMM_WORLD, &rand));
2219566063dSJacob Faibussowitsch   PetscCall(PetscRandomSetFromOptions(rand));
2229566063dSJacob Faibussowitsch   PetscCall(MatSetRandom(C, rand));
2239566063dSJacob Faibussowitsch   PetscCall(MatDuplicate(C, MAT_DO_NOT_COPY_VALUES, &X));
224c4762a1bSJed Brown 
225c4762a1bSJed Brown   /* Create vectors */
2269566063dSJacob Faibussowitsch   PetscCall(MatCreateVecs(A, &x, &b));
2279566063dSJacob Faibussowitsch   PetscCall(VecDuplicate(x, &u)); /* save the true solution */
228c4762a1bSJed Brown 
229c4762a1bSJed Brown   /* Test Factorization */
23053587d93SPierre Jolivet   if (flg) PetscCall(MatGetOrdering(A, MATORDERINGND, &perm, &iperm)); // TODO FIXME: MatConvert_Nest_AIJ() does not support chained MatCreate[Hermitian]Transpose()
231c4762a1bSJed Brown 
23278bc9606SHong Zhang   PetscCall(PetscOptionsGetString(NULL, NULL, "-mat_solver_type", pack, sizeof(pack), NULL));
233c4762a1bSJed Brown #if defined(PETSC_HAVE_SUPERLU)
23478bc9606SHong Zhang   PetscCall(PetscStrcmp(MATSOLVERSUPERLU, pack, &match));
23578bc9606SHong Zhang   if (match) {
23628b400f6SJacob Faibussowitsch     PetscCheck(!chol, PETSC_COMM_WORLD, PETSC_ERR_SUP, "SuperLU does not provide Cholesky!");
2379566063dSJacob Faibussowitsch     PetscCall(PetscPrintf(PETSC_COMM_WORLD, " SUPERLU LU:\n"));
2389566063dSJacob Faibussowitsch     PetscCall(MatGetFactor(A, MATSOLVERSUPERLU, MAT_FACTOR_LU, &F));
23978bc9606SHong Zhang     matsolvexx = PETSC_FALSE; /* Test MatMatSolve(F,RHS,RHS), RHS is a dense matrix, need further work */
24078bc9606SHong Zhang     ipack      = 0;
24178bc9606SHong Zhang     goto skipoptions;
24278bc9606SHong Zhang   }
243c4762a1bSJed Brown #endif
244c4762a1bSJed Brown #if defined(PETSC_HAVE_SUPERLU_DIST)
24578bc9606SHong Zhang   PetscCall(PetscStrcmp(MATSOLVERSUPERLU_DIST, pack, &match));
24678bc9606SHong Zhang   if (match) {
24728b400f6SJacob Faibussowitsch     PetscCheck(!chol, PETSC_COMM_WORLD, PETSC_ERR_SUP, "SuperLU does not provide Cholesky!");
2489566063dSJacob Faibussowitsch     PetscCall(PetscPrintf(PETSC_COMM_WORLD, " SUPERLU_DIST LU:\n"));
2499566063dSJacob Faibussowitsch     PetscCall(MatGetFactor(A, MATSOLVERSUPERLU_DIST, MAT_FACTOR_LU, &F));
250c4762a1bSJed Brown     matsolvexx = PETSC_TRUE;
25178bc9606SHong Zhang     if (symm) { /* A is symmetric */
25278bc9606SHong Zhang       testMatMatSolveTranspose = PETSC_TRUE;
25378bc9606SHong Zhang       testMatSolveTranspose    = PETSC_TRUE;
25478bc9606SHong Zhang     } else { /* superlu_dist does not support solving A^t x = rhs yet */
25578bc9606SHong Zhang       testMatMatSolveTranspose = PETSC_FALSE;
25678bc9606SHong Zhang       testMatSolveTranspose    = PETSC_FALSE;
25778bc9606SHong Zhang     }
25878bc9606SHong Zhang     ipack = 1;
25978bc9606SHong Zhang     goto skipoptions;
26078bc9606SHong Zhang   }
261c4762a1bSJed Brown #endif
262c4762a1bSJed Brown #if defined(PETSC_HAVE_MUMPS)
26378bc9606SHong Zhang   PetscCall(PetscStrcmp(MATSOLVERMUMPS, pack, &match));
26478bc9606SHong Zhang   if (match) {
265c4762a1bSJed Brown     if (chol) {
2669566063dSJacob Faibussowitsch       PetscCall(PetscPrintf(PETSC_COMM_WORLD, " MUMPS CHOLESKY:\n"));
2679566063dSJacob Faibussowitsch       PetscCall(MatGetFactor(A, MATSOLVERMUMPS, MAT_FACTOR_CHOLESKY, &F));
268c4762a1bSJed Brown     } else {
2699566063dSJacob Faibussowitsch       PetscCall(PetscPrintf(PETSC_COMM_WORLD, " MUMPS LU:\n"));
2709566063dSJacob Faibussowitsch       PetscCall(MatGetFactor(A, MATSOLVERMUMPS, MAT_FACTOR_LU, &F));
271c4762a1bSJed Brown     }
272c4762a1bSJed Brown     matsolvexx = PETSC_TRUE;
273c4762a1bSJed Brown     if (test_mumps_opts) {
274c4762a1bSJed Brown       /* test mumps options */
275c4762a1bSJed Brown       PetscInt  icntl;
276c4762a1bSJed Brown       PetscReal cntl;
277c4762a1bSJed Brown 
278c4762a1bSJed Brown       icntl = 2; /* sequential matrix ordering */
2799566063dSJacob Faibussowitsch       PetscCall(MatMumpsSetIcntl(F, 7, icntl));
280c4762a1bSJed Brown 
281c4762a1bSJed Brown       cntl = 1.e-6; /* threshold for row pivot detection */
2829566063dSJacob Faibussowitsch       PetscCall(MatMumpsSetIcntl(F, 24, 1));
2839566063dSJacob Faibussowitsch       PetscCall(MatMumpsSetCntl(F, 3, cntl));
284c4762a1bSJed Brown     }
28578bc9606SHong Zhang     ipack = 2;
28678bc9606SHong Zhang     goto skipoptions;
28778bc9606SHong Zhang   }
288c4762a1bSJed Brown #endif
289c4762a1bSJed Brown #if defined(PETSC_HAVE_MKL_PARDISO)
29078bc9606SHong Zhang   PetscCall(PetscStrcmp(MATSOLVERMKL_PARDISO, pack, &match));
29178bc9606SHong Zhang   if (match) {
292c4762a1bSJed Brown     if (chol) {
2939566063dSJacob Faibussowitsch       PetscCall(PetscPrintf(PETSC_COMM_WORLD, " MKL_PARDISO CHOLESKY:\n"));
2949566063dSJacob Faibussowitsch       PetscCall(MatGetFactor(A, MATSOLVERMKL_PARDISO, MAT_FACTOR_CHOLESKY, &F));
295c4762a1bSJed Brown     } else {
2969566063dSJacob Faibussowitsch       PetscCall(PetscPrintf(PETSC_COMM_WORLD, " MKL_PARDISO LU:\n"));
2979566063dSJacob Faibussowitsch       PetscCall(MatGetFactor(A, MATSOLVERMKL_PARDISO, MAT_FACTOR_LU, &F));
298c4762a1bSJed Brown     }
29978bc9606SHong Zhang     ipack = 3;
30078bc9606SHong Zhang     goto skipoptions;
30178bc9606SHong Zhang   }
302c4762a1bSJed Brown #endif
30338a8e8c1SStefano Zampini #if defined(PETSC_HAVE_CUDA)
30478bc9606SHong Zhang   PetscCall(PetscStrcmp(MATSOLVERCUSPARSE, pack, &match));
30578bc9606SHong Zhang   if (match) {
30638a8e8c1SStefano Zampini     if (chol) {
3079566063dSJacob Faibussowitsch       PetscCall(PetscPrintf(PETSC_COMM_WORLD, " CUSPARSE CHOLESKY:\n"));
3089566063dSJacob Faibussowitsch       PetscCall(MatGetFactor(A, MATSOLVERCUSPARSE, MAT_FACTOR_CHOLESKY, &F));
30938a8e8c1SStefano Zampini     } else {
3109566063dSJacob Faibussowitsch       PetscCall(PetscPrintf(PETSC_COMM_WORLD, " CUSPARSE LU:\n"));
3119566063dSJacob Faibussowitsch       PetscCall(MatGetFactor(A, MATSOLVERCUSPARSE, MAT_FACTOR_LU, &F));
31238a8e8c1SStefano Zampini     }
31378bc9606SHong Zhang     testMatSolveTranspose    = PETSC_FALSE;
31478bc9606SHong Zhang     testMatMatSolveTranspose = PETSC_FALSE;
31578bc9606SHong Zhang     ipack                    = 4;
31678bc9606SHong Zhang     goto skipoptions;
31778bc9606SHong Zhang   }
31838a8e8c1SStefano Zampini #endif
31978bc9606SHong Zhang   /* PETSc */
32078bc9606SHong Zhang   match = PETSC_TRUE;
32178bc9606SHong Zhang   if (match) {
322c4762a1bSJed Brown     if (chol) {
3239566063dSJacob Faibussowitsch       PetscCall(PetscPrintf(PETSC_COMM_WORLD, " PETSC CHOLESKY:\n"));
3249566063dSJacob Faibussowitsch       PetscCall(MatGetFactor(A, MATSOLVERPETSC, MAT_FACTOR_CHOLESKY, &F));
325c4762a1bSJed Brown     } else {
3269566063dSJacob Faibussowitsch       PetscCall(PetscPrintf(PETSC_COMM_WORLD, " PETSC LU:\n"));
3279566063dSJacob Faibussowitsch       PetscCall(MatGetFactor(A, MATSOLVERPETSC, MAT_FACTOR_LU, &F));
328c4762a1bSJed Brown     }
329c4762a1bSJed Brown     matsolvexx = PETSC_TRUE;
33078bc9606SHong Zhang     ipack      = 5;
33178bc9606SHong Zhang     goto skipoptions;
332c4762a1bSJed Brown   }
333c4762a1bSJed Brown 
33478bc9606SHong Zhang skipoptions:
3359566063dSJacob Faibussowitsch   PetscCall(MatFactorInfoInitialize(&info));
336c4762a1bSJed Brown   info.fill      = 5.0;
337c4762a1bSJed Brown   info.shifttype = (PetscReal)MAT_SHIFT_NONE;
338c4762a1bSJed Brown   if (chol) {
3399566063dSJacob Faibussowitsch     PetscCall(MatCholeskyFactorSymbolic(F, A, perm, &info));
340c4762a1bSJed Brown   } else {
3419566063dSJacob Faibussowitsch     PetscCall(MatLUFactorSymbolic(F, A, perm, iperm, &info));
342c4762a1bSJed Brown   }
343c4762a1bSJed Brown 
344c4762a1bSJed Brown   for (nfact = 0; nfact < 2; nfact++) {
345c4762a1bSJed Brown     if (chol) {
3469566063dSJacob Faibussowitsch       PetscCall(PetscPrintf(PETSC_COMM_WORLD, " %" PetscInt_FMT "-the CHOLESKY numfactorization \n", nfact));
3479566063dSJacob Faibussowitsch       PetscCall(MatCholeskyFactorNumeric(F, A, &info));
348c4762a1bSJed Brown     } else {
3499566063dSJacob Faibussowitsch       PetscCall(PetscPrintf(PETSC_COMM_WORLD, " %" PetscInt_FMT "-the LU numfactorization \n", nfact));
3509566063dSJacob Faibussowitsch       PetscCall(MatLUFactorNumeric(F, A, &info));
351c4762a1bSJed Brown     }
352c4762a1bSJed Brown     if (view) {
3539566063dSJacob Faibussowitsch       PetscCall(PetscViewerPushFormat(PETSC_VIEWER_STDOUT_WORLD, PETSC_VIEWER_ASCII_INFO));
3549566063dSJacob Faibussowitsch       PetscCall(MatView(F, PETSC_VIEWER_STDOUT_WORLD));
3559566063dSJacob Faibussowitsch       PetscCall(PetscViewerPopFormat(PETSC_VIEWER_STDOUT_WORLD));
356c4762a1bSJed Brown       view = PETSC_FALSE;
357c4762a1bSJed Brown     }
358c4762a1bSJed Brown 
359c4762a1bSJed Brown #if defined(PETSC_HAVE_SUPERLU_DIST)
360c4762a1bSJed Brown     if (ipack == 1) { /* Test MatSuperluDistGetDiagU()
361c4762a1bSJed Brown        -- input: matrix factor F; output: main diagonal of matrix U on all processes */
362c4762a1bSJed Brown       PetscInt     M;
363c4762a1bSJed Brown       PetscScalar *diag;
364c4762a1bSJed Brown   #if !defined(PETSC_USE_COMPLEX)
365c4762a1bSJed Brown       PetscInt nneg, nzero, npos;
366c4762a1bSJed Brown   #endif
367c4762a1bSJed Brown 
3689566063dSJacob Faibussowitsch       PetscCall(MatGetSize(F, &M, NULL));
3699566063dSJacob Faibussowitsch       PetscCall(PetscMalloc1(M, &diag));
3709566063dSJacob Faibussowitsch       PetscCall(MatSuperluDistGetDiagU(F, diag));
3719566063dSJacob Faibussowitsch       PetscCall(PetscFree(diag));
372c4762a1bSJed Brown 
373c4762a1bSJed Brown   #if !defined(PETSC_USE_COMPLEX)
374c4762a1bSJed Brown       /* Test MatGetInertia() */
37539989c4fSStefano Zampini       if (test_inertia) { /* A is symmetric */
3769566063dSJacob Faibussowitsch         PetscCall(MatGetInertia(F, &nneg, &nzero, &npos));
3779566063dSJacob Faibussowitsch         PetscCall(PetscViewerASCIIPrintf(PETSC_VIEWER_STDOUT_WORLD, " MatInertia: nneg: %" PetscInt_FMT ", nzero: %" PetscInt_FMT ", npos: %" PetscInt_FMT "\n", nneg, nzero, npos));
37878bc9606SHong Zhang       }
379c4762a1bSJed Brown   #endif
380c4762a1bSJed Brown     }
381c4762a1bSJed Brown #endif
382c4762a1bSJed Brown 
383d47f36abSHong Zhang #if defined(PETSC_HAVE_MUMPS)
384d47f36abSHong Zhang     /* mumps interface allows repeated call of MatCholeskyFactorSymbolic(), while the succession calls do nothing */
385d47f36abSHong Zhang     if (ipack == 2) {
386d47f36abSHong Zhang       if (chol) {
3879566063dSJacob Faibussowitsch         PetscCall(MatCholeskyFactorSymbolic(F, A, perm, &info));
3889566063dSJacob Faibussowitsch         PetscCall(MatCholeskyFactorNumeric(F, A, &info));
389d47f36abSHong Zhang       } else {
3909566063dSJacob Faibussowitsch         PetscCall(MatLUFactorSymbolic(F, A, perm, iperm, &info));
3919566063dSJacob Faibussowitsch         PetscCall(MatLUFactorNumeric(F, A, &info));
392d47f36abSHong Zhang       }
393d47f36abSHong Zhang     }
394d47f36abSHong Zhang #endif
395d47f36abSHong Zhang 
396b18964edSHong Zhang     /* Test MatMatSolve(), A X = B, where B can be dense or sparse */
397c4762a1bSJed Brown     if (testMatMatSolve) {
398c4762a1bSJed Brown       if (!nfact) {
3995d955bbbSStefano Zampini         PetscCall(MatMatMult(Ae, C, MAT_INITIAL_MATRIX, 2.0, &RHS));
400c4762a1bSJed Brown       } else {
4015d955bbbSStefano Zampini         PetscCall(MatMatMult(Ae, C, MAT_REUSE_MATRIX, 2.0, &RHS));
402c4762a1bSJed Brown       }
403c4762a1bSJed Brown       for (nsolve = 0; nsolve < 2; nsolve++) {
4049566063dSJacob Faibussowitsch         PetscCall(PetscPrintf(PETSC_COMM_WORLD, "   %" PetscInt_FMT "-the MatMatSolve \n", nsolve));
4059566063dSJacob Faibussowitsch         PetscCall(MatMatSolve(F, RHS, X));
406c4762a1bSJed Brown 
407c4762a1bSJed Brown         /* Check the error */
4089566063dSJacob Faibussowitsch         PetscCall(MatAXPY(X, -1.0, C, SAME_NONZERO_PATTERN));
4099566063dSJacob Faibussowitsch         PetscCall(MatNorm(X, NORM_FROBENIUS, &norm));
410b18964edSHong 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));
411c4762a1bSJed Brown       }
412b18964edSHong Zhang 
413c4762a1bSJed Brown       if (matsolvexx) {
414c4762a1bSJed Brown         /* Test MatMatSolve(F,RHS,RHS), RHS is a dense matrix */
4159566063dSJacob Faibussowitsch         PetscCall(MatCopy(RHS, X, SAME_NONZERO_PATTERN));
4169566063dSJacob Faibussowitsch         PetscCall(MatMatSolve(F, X, X));
417c4762a1bSJed Brown         /* Check the error */
4189566063dSJacob Faibussowitsch         PetscCall(MatAXPY(X, -1.0, C, SAME_NONZERO_PATTERN));
4199566063dSJacob Faibussowitsch         PetscCall(MatNorm(X, NORM_FROBENIUS, &norm));
420b18964edSHong Zhang         if (norm > tol) PetscCall(PetscPrintf(PETSC_COMM_WORLD, "MatMatSolve(F,RHS,RHS): Norm of error %g\n", (double)norm));
421c4762a1bSJed Brown       }
422c4762a1bSJed Brown 
423c4762a1bSJed Brown       if (ipack == 2 && size == 1) {
424c4762a1bSJed Brown         Mat spRHS, spRHST, RHST;
425c4762a1bSJed Brown 
4269566063dSJacob Faibussowitsch         PetscCall(MatTranspose(RHS, MAT_INITIAL_MATRIX, &RHST));
4279566063dSJacob Faibussowitsch         PetscCall(MatConvert(RHST, MATAIJ, MAT_INITIAL_MATRIX, &spRHST));
4289566063dSJacob Faibussowitsch         PetscCall(MatCreateTranspose(spRHST, &spRHS));
429c4762a1bSJed Brown         for (nsolve = 0; nsolve < 2; nsolve++) {
4309566063dSJacob Faibussowitsch           PetscCall(PetscPrintf(PETSC_COMM_WORLD, "   %" PetscInt_FMT "-the sparse MatMatSolve \n", nsolve));
4319566063dSJacob Faibussowitsch           PetscCall(MatMatSolve(F, spRHS, X));
432c4762a1bSJed Brown 
433c4762a1bSJed Brown           /* Check the error */
4349566063dSJacob Faibussowitsch           PetscCall(MatAXPY(X, -1.0, C, SAME_NONZERO_PATTERN));
4359566063dSJacob Faibussowitsch           PetscCall(MatNorm(X, NORM_FROBENIUS, &norm));
436b18964edSHong 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));
437c4762a1bSJed Brown         }
438b18964edSHong Zhang         PetscCall(MatDestroy(&spRHST));
439b18964edSHong Zhang         PetscCall(MatDestroy(&spRHS));
440b18964edSHong Zhang         PetscCall(MatDestroy(&RHST));
441b18964edSHong Zhang       }
442b18964edSHong Zhang     }
443b18964edSHong Zhang 
444b18964edSHong Zhang     /* Test testMatMatSolveTranspose(), A^T X = B, where B can be dense or sparse */
445b18964edSHong Zhang     if (testMatMatSolveTranspose) {
446b18964edSHong Zhang       if (!nfact) {
4475d955bbbSStefano Zampini         PetscCall(MatTransposeMatMult(Ae, C, MAT_INITIAL_MATRIX, 2.0, &RHS1));
448b18964edSHong Zhang       } else {
4495d955bbbSStefano Zampini         PetscCall(MatTransposeMatMult(Ae, C, MAT_REUSE_MATRIX, 2.0, &RHS1));
450b18964edSHong Zhang       }
451b18964edSHong Zhang 
452b18964edSHong Zhang       for (nsolve = 0; nsolve < 2; nsolve++) {
45378bc9606SHong Zhang         PetscCall(PetscPrintf(PETSC_COMM_WORLD, "   %" PetscInt_FMT "-the MatMatSolveTranspose\n", nsolve));
454b18964edSHong Zhang         PetscCall(MatMatSolveTranspose(F, RHS1, X));
455b18964edSHong Zhang 
456b18964edSHong Zhang         /* Check the error */
457b18964edSHong Zhang         PetscCall(MatAXPY(X, -1.0, C, SAME_NONZERO_PATTERN));
458b18964edSHong Zhang         PetscCall(MatNorm(X, NORM_FROBENIUS, &norm));
459b18964edSHong 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));
460b18964edSHong Zhang       }
461b18964edSHong Zhang 
462b18964edSHong Zhang       if (ipack == 2 && size == 1) {
463b18964edSHong Zhang         Mat spRHS, spRHST, RHST;
464b18964edSHong Zhang 
465b18964edSHong Zhang         PetscCall(MatTranspose(RHS1, MAT_INITIAL_MATRIX, &RHST));
466b18964edSHong Zhang         PetscCall(MatConvert(RHST, MATAIJ, MAT_INITIAL_MATRIX, &spRHST));
467b18964edSHong Zhang         PetscCall(MatCreateTranspose(spRHST, &spRHS));
468b18964edSHong Zhang         for (nsolve = 0; nsolve < 2; nsolve++) {
469b18964edSHong Zhang           PetscCall(MatMatSolveTranspose(F, spRHS, X));
470b18964edSHong Zhang 
471b18964edSHong Zhang           /* Check the error */
472b18964edSHong Zhang           PetscCall(MatAXPY(X, -1.0, C, SAME_NONZERO_PATTERN));
473b18964edSHong Zhang           PetscCall(MatNorm(X, NORM_FROBENIUS, &norm));
474b18964edSHong 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));
475c4762a1bSJed Brown         }
4769566063dSJacob Faibussowitsch         PetscCall(MatDestroy(&spRHST));
4779566063dSJacob Faibussowitsch         PetscCall(MatDestroy(&spRHS));
4789566063dSJacob Faibussowitsch         PetscCall(MatDestroy(&RHST));
479c4762a1bSJed Brown       }
480c4762a1bSJed Brown     }
481c4762a1bSJed Brown 
482c4762a1bSJed Brown     /* Test MatSolve() */
483c4762a1bSJed Brown     if (testMatSolve) {
484c4762a1bSJed Brown       for (nsolve = 0; nsolve < 2; nsolve++) {
4859566063dSJacob Faibussowitsch         PetscCall(VecSetRandom(x, rand));
4869566063dSJacob Faibussowitsch         PetscCall(VecCopy(x, u));
4875d955bbbSStefano Zampini         PetscCall(MatMult(Ae, x, b));
488c4762a1bSJed Brown 
4899566063dSJacob Faibussowitsch         PetscCall(PetscPrintf(PETSC_COMM_WORLD, "   %" PetscInt_FMT "-the MatSolve \n", nsolve));
4909566063dSJacob Faibussowitsch         PetscCall(MatSolve(F, b, x));
491c4762a1bSJed Brown 
492c4762a1bSJed Brown         /* Check the error */
4939566063dSJacob Faibussowitsch         PetscCall(VecAXPY(u, -1.0, x)); /* u <- (-1.0)x + u */
4949566063dSJacob Faibussowitsch         PetscCall(VecNorm(u, NORM_2, &norm));
495c4762a1bSJed Brown         if (norm > tol) {
496c4762a1bSJed Brown           PetscReal resi;
4975d955bbbSStefano Zampini           PetscCall(MatMult(Ae, x, u));   /* u = A*x */
4989566063dSJacob Faibussowitsch           PetscCall(VecAXPY(u, -1.0, b)); /* u <- (-1.0)b + u */
4999566063dSJacob Faibussowitsch           PetscCall(VecNorm(u, NORM_2, &resi));
5009566063dSJacob Faibussowitsch           PetscCall(PetscPrintf(PETSC_COMM_WORLD, "MatSolve: Norm of error %g, resi %g, numfact %" PetscInt_FMT "\n", (double)norm, (double)resi, nfact));
501c4762a1bSJed Brown         }
502c4762a1bSJed Brown       }
503c4762a1bSJed Brown     }
50478bc9606SHong Zhang 
50578bc9606SHong Zhang     /* Test MatSolveTranspose() */
50678bc9606SHong Zhang     if (testMatSolveTranspose) {
50778bc9606SHong Zhang       for (nsolve = 0; nsolve < 2; nsolve++) {
50878bc9606SHong Zhang         PetscCall(VecSetRandom(x, rand));
50978bc9606SHong Zhang         PetscCall(VecCopy(x, u));
5105d955bbbSStefano Zampini         PetscCall(MatMultTranspose(Ae, x, b));
51178bc9606SHong Zhang 
51278bc9606SHong Zhang         PetscCall(PetscPrintf(PETSC_COMM_WORLD, "   %" PetscInt_FMT "-the MatSolveTranspose\n", nsolve));
51378bc9606SHong Zhang         PetscCall(MatSolveTranspose(F, b, x));
51478bc9606SHong Zhang 
51578bc9606SHong Zhang         /* Check the error */
51678bc9606SHong Zhang         PetscCall(VecAXPY(u, -1.0, x)); /* u <- (-1.0)x + u */
51778bc9606SHong Zhang         PetscCall(VecNorm(u, NORM_2, &norm));
51878bc9606SHong Zhang         if (norm > tol) {
51978bc9606SHong Zhang           PetscReal resi;
520070736c7SStefano Zampini           PetscCall(MatMultTranspose(Ae, x, u)); /* u = A*x */
52178bc9606SHong Zhang           PetscCall(VecAXPY(u, -1.0, b));        /* u <- (-1.0)b + u */
52278bc9606SHong Zhang           PetscCall(VecNorm(u, NORM_2, &resi));
52378bc9606SHong Zhang           PetscCall(PetscPrintf(PETSC_COMM_WORLD, "MatSolveTranspose: Norm of error %g, resi %g, numfact %" PetscInt_FMT "\n", (double)norm, (double)resi, nfact));
52478bc9606SHong Zhang         }
52578bc9606SHong Zhang       }
52678bc9606SHong Zhang     }
527c4762a1bSJed Brown   }
528c4762a1bSJed Brown 
529c4762a1bSJed Brown   /* Free data structures */
5305d955bbbSStefano Zampini   PetscCall(MatDestroy(&Ae));
5319566063dSJacob Faibussowitsch   PetscCall(MatDestroy(&A));
5329566063dSJacob Faibussowitsch   PetscCall(MatDestroy(&C));
5339566063dSJacob Faibussowitsch   PetscCall(MatDestroy(&F));
5349566063dSJacob Faibussowitsch   PetscCall(MatDestroy(&X));
5359566063dSJacob Faibussowitsch   PetscCall(MatDestroy(&RHS));
536b18964edSHong Zhang   PetscCall(MatDestroy(&RHS1));
537c4762a1bSJed Brown 
5389566063dSJacob Faibussowitsch   PetscCall(PetscRandomDestroy(&rand));
5399566063dSJacob Faibussowitsch   PetscCall(ISDestroy(&perm));
5409566063dSJacob Faibussowitsch   PetscCall(ISDestroy(&iperm));
5419566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&x));
5429566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&b));
5439566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&u));
5449566063dSJacob Faibussowitsch   PetscCall(PetscFinalize());
545b122ec5aSJacob Faibussowitsch   return 0;
546c4762a1bSJed Brown }
547c4762a1bSJed Brown 
548c4762a1bSJed Brown /*TEST
549c4762a1bSJed Brown 
550c4762a1bSJed Brown    test:
551dfd57a17SPierre Jolivet       requires: datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES)
55278bc9606SHong Zhang       args: -f ${DATAFILESPATH}/matrices/medium -mat_solver_type petsc
553c4762a1bSJed Brown       output_file: output/ex125.out
554c4762a1bSJed Brown 
555c4762a1bSJed Brown    test:
5569a14fc28SStefano Zampini       suffix: 2
55778bc9606SHong Zhang       args: -mat_solver_type petsc
5589a14fc28SStefano Zampini       output_file: output/ex125.out
5599a14fc28SStefano Zampini 
5609a14fc28SStefano Zampini    test:
561c4762a1bSJed Brown       suffix: mkl_pardiso
562dfd57a17SPierre Jolivet       requires: mkl_pardiso datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES)
56378bc9606SHong Zhang       args: -f ${DATAFILESPATH}/matrices/small -mat_solver_type mkl_pardiso
564c4762a1bSJed Brown 
565c4762a1bSJed Brown    test:
5669a14fc28SStefano Zampini       suffix: mkl_pardiso_2
5679a14fc28SStefano Zampini       requires: mkl_pardiso
56878bc9606SHong Zhang       args: -mat_solver_type mkl_pardiso
5699a14fc28SStefano Zampini       output_file: output/ex125_mkl_pardiso.out
5709a14fc28SStefano Zampini 
571cf053153SJunchao Zhang    testset:
572dfd57a17SPierre Jolivet       requires: mumps datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES)
57378bc9606SHong Zhang       args: -f ${DATAFILESPATH}/matrices/small -mat_solver_type mumps
574c4762a1bSJed Brown       output_file: output/ex125_mumps_seq.out
575c4762a1bSJed Brown 
576c4762a1bSJed Brown       test:
577cf053153SJunchao Zhang         requires: defined(PETSC_HAVE_MUMPS_MIXED_PRECISION)
578cf053153SJunchao Zhang         suffix: mumps_single
579cf053153SJunchao Zhang         args: -pc_precision single -tol 1e-5
580cf053153SJunchao Zhang       test:
581cf053153SJunchao Zhang         suffix: mumps_double
582cf053153SJunchao Zhang         args: -pc_precision double
583cf053153SJunchao Zhang 
584cf053153SJunchao Zhang    testset:
58562671d91SStefano Zampini       requires: mumps datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES)
5865d955bbbSStefano Zampini       args: -f ${DATAFILESPATH}/matrices/small -mat_solver_type mumps -test_nest -test_nest_bordered {{0 1}}
58762671d91SStefano Zampini       output_file: output/ex125_mumps_seq.out
58862671d91SStefano Zampini 
58962671d91SStefano Zampini       test:
590cf053153SJunchao Zhang         requires: defined(PETSC_HAVE_MUMPS_MIXED_PRECISION)
591cf053153SJunchao Zhang         suffix: mumps_nest_single
592cf053153SJunchao Zhang         args: -pc_precision single -tol 1e-4
593cf053153SJunchao Zhang       test:
594cf053153SJunchao Zhang         suffix: mumps_nest_double
595cf053153SJunchao Zhang         args: -pc_precision double
596cf053153SJunchao Zhang 
597cf053153SJunchao Zhang    testset:
598c4762a1bSJed Brown       nsize: 3
599dfd57a17SPierre Jolivet       requires: mumps datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES)
60078bc9606SHong Zhang       args: -f ${DATAFILESPATH}/matrices/small -mat_solver_type mumps
601c4762a1bSJed Brown       output_file: output/ex125_mumps_par.out
602c4762a1bSJed Brown 
603c4762a1bSJed Brown       test:
604cf053153SJunchao Zhang         requires: defined(PETSC_HAVE_MUMPS_MIXED_PRECISION)
605cf053153SJunchao Zhang         suffix: mumps_2_single
606cf053153SJunchao Zhang         args: -pc_precision single -tol 1e-5
607cf053153SJunchao Zhang       test:
608cf053153SJunchao Zhang         suffix: mumps_2_double
609cf053153SJunchao Zhang         args: -pc_precision double
610cf053153SJunchao Zhang 
611cf053153SJunchao Zhang    test:
61262671d91SStefano Zampini       suffix: mumps_2_nest
61362671d91SStefano Zampini       nsize: 3
61462671d91SStefano Zampini       requires: mumps datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES)
6155d955bbbSStefano Zampini       args: -f ${DATAFILESPATH}/matrices/small -mat_solver_type mumps -test_nest -test_nest_bordered {{0 1}}
61662671d91SStefano Zampini       output_file: output/ex125_mumps_par.out
61762671d91SStefano Zampini 
61862671d91SStefano Zampini    test:
6199a14fc28SStefano Zampini       suffix: mumps_3
6209a14fc28SStefano Zampini       requires: mumps
62178bc9606SHong Zhang       args: -mat_solver_type mumps
6229a14fc28SStefano Zampini       output_file: output/ex125_mumps_seq.out
6239a14fc28SStefano Zampini 
624*c13ae4d5SJunchao Zhang    testset:
62562671d91SStefano Zampini       requires: mumps
6265d955bbbSStefano Zampini       args: -mat_solver_type mumps -test_nest -test_nest_bordered {{0 1}}
62762671d91SStefano Zampini       output_file: output/ex125_mumps_seq.out
62862671d91SStefano Zampini 
62962671d91SStefano Zampini       test:
630*c13ae4d5SJunchao Zhang         requires: !__float128
631*c13ae4d5SJunchao Zhang         suffix: mumps_3_nest
632*c13ae4d5SJunchao Zhang       test:
633*c13ae4d5SJunchao Zhang         suffix: mumps_3_nest_fp128
634*c13ae4d5SJunchao Zhang         requires: __float128
635*c13ae4d5SJunchao Zhang         args: -tol 1e-8
636*c13ae4d5SJunchao Zhang 
637*c13ae4d5SJunchao Zhang    test:
6389a14fc28SStefano Zampini       suffix: mumps_4
6399a14fc28SStefano Zampini       nsize: 3
6409a14fc28SStefano Zampini       requires: mumps
64178bc9606SHong Zhang       args: -mat_solver_type mumps
6429a14fc28SStefano Zampini       output_file: output/ex125_mumps_par.out
6439a14fc28SStefano Zampini 
644*c13ae4d5SJunchao Zhang    testset:
64562671d91SStefano Zampini       nsize: 3
64662671d91SStefano Zampini       requires: mumps
6475d955bbbSStefano Zampini       args: -mat_solver_type mumps -test_nest -test_nest_bordered {{0 1}}
64862671d91SStefano Zampini       output_file: output/ex125_mumps_par.out
64962671d91SStefano Zampini 
65062671d91SStefano Zampini       test:
651*c13ae4d5SJunchao Zhang         requires: !__float128
652*c13ae4d5SJunchao Zhang         suffix: mumps_4_nest
653*c13ae4d5SJunchao Zhang       test:
654*c13ae4d5SJunchao Zhang         suffix: mumps_4_nest_fp128
655*c13ae4d5SJunchao Zhang         requires: __float128
656*c13ae4d5SJunchao Zhang         args: -tol 1e-8
657*c13ae4d5SJunchao Zhang 
658*c13ae4d5SJunchao Zhang    test:
659d47f36abSHong Zhang       suffix: mumps_5
660d47f36abSHong Zhang       nsize: 3
661d47f36abSHong Zhang       requires: mumps
66278bc9606SHong Zhang       args: -mat_solver_type mumps -cholesky
663d47f36abSHong Zhang       output_file: output/ex125_mumps_par_cholesky.out
664d47f36abSHong Zhang 
665*c13ae4d5SJunchao Zhang    testset:
66662671d91SStefano Zampini       nsize: 3
66762671d91SStefano Zampini       requires: mumps
6685d955bbbSStefano Zampini       args: -mat_solver_type mumps -cholesky -test_nest -test_nest_bordered {{0 1}}
66962671d91SStefano Zampini       output_file: output/ex125_mumps_par_cholesky.out
67062671d91SStefano Zampini 
67162671d91SStefano Zampini       test:
672*c13ae4d5SJunchao Zhang         requires: !__float128
673*c13ae4d5SJunchao Zhang         suffix: mumps_5_nest
674*c13ae4d5SJunchao Zhang       test:
675*c13ae4d5SJunchao Zhang         suffix: mumps_5_nest_fp128
676*c13ae4d5SJunchao Zhang         requires: __float128
677*c13ae4d5SJunchao Zhang         args: -tol 1e-8
678*c13ae4d5SJunchao Zhang 
679*c13ae4d5SJunchao Zhang    test:
68053587d93SPierre Jolivet       nsize: 2
68153587d93SPierre Jolivet       requires: mumps
68253587d93SPierre Jolivet       args: -mat_solver_type mumps -test_nest -test_nest_bordered -m 13 -n 13
68353587d93SPierre Jolivet       output_file: output/ex125_mumps_par.out
68453587d93SPierre Jolivet 
68553587d93SPierre Jolivet       test:
686*c13ae4d5SJunchao Zhang         requires: !__float128
687*c13ae4d5SJunchao Zhang         suffix: mumps_6
688*c13ae4d5SJunchao Zhang       test:
689*c13ae4d5SJunchao Zhang         suffix: mumps_6_fp128
690*c13ae4d5SJunchao Zhang         requires: __float128
691*c13ae4d5SJunchao Zhang         args: -tol 1e-8
692*c13ae4d5SJunchao Zhang 
693*c13ae4d5SJunchao Zhang    test:
69478bc9606SHong Zhang       suffix: superlu
69578bc9606SHong Zhang       requires: datafilespath double !complex !defined(PETSC_USE_64BIT_INDICES) superlu
69678bc9606SHong Zhang       args: -f ${DATAFILESPATH}/matrices/medium -mat_solver_type superlu
69778bc9606SHong Zhang       output_file: output/ex125_superlu.out
69878bc9606SHong Zhang 
69978bc9606SHong Zhang    test:
700c4762a1bSJed Brown       suffix: superlu_dist
7019a14fc28SStefano Zampini       nsize: {{1 3}}
702d4783600SBarry Smith       requires: datafilespath double !complex !defined(PETSC_USE_64BIT_INDICES) superlu_dist
70378bc9606SHong Zhang       args: -f ${DATAFILESPATH}/matrices/small -mat_solver_type superlu_dist -mat_superlu_dist_rowperm NOROWPERM
70478bc9606SHong Zhang       output_file: output/ex125_superlu_dist.out
705c4762a1bSJed Brown 
706c4762a1bSJed Brown    test:
707c4762a1bSJed Brown       suffix: superlu_dist_2
7089a14fc28SStefano Zampini       nsize: {{1 3}}
7099a14fc28SStefano Zampini       requires: superlu_dist !complex
71078bc9606SHong Zhang       args: -n 36 -mat_solver_type superlu_dist -mat_superlu_dist_rowperm NOROWPERM
711c4762a1bSJed Brown       output_file: output/ex125_superlu_dist.out
712c4762a1bSJed Brown 
713c4762a1bSJed Brown    test:
71478bc9606SHong Zhang       suffix: superlu_dist_3
71578bc9606SHong Zhang       nsize: {{1 3}}
71678bc9606SHong Zhang       requires: superlu_dist !complex
71778bc9606SHong Zhang       requires: datafilespath double !complex !defined(PETSC_USE_64BIT_INDICES) superlu_dist
71878bc9606SHong Zhang       args: -f ${DATAFILESPATH}/matrices/medium -mat_solver_type superlu_dist -mat_superlu_dist_rowperm NOROWPERM
71978bc9606SHong Zhang       output_file: output/ex125_superlu_dist_nonsymmetric.out
72078bc9606SHong Zhang 
72178bc9606SHong Zhang    test:
722c4762a1bSJed Brown       suffix: superlu_dist_complex
723c4762a1bSJed Brown       nsize: 3
724d4783600SBarry Smith       requires: datafilespath double superlu_dist complex !defined(PETSC_USE_64BIT_INDICES)
72578bc9606SHong Zhang       args: -f ${DATAFILESPATH}/matrices/farzad_B_rhs -mat_solver_type superlu_dist
726c4762a1bSJed Brown       output_file: output/ex125_superlu_dist_complex.out
727c4762a1bSJed Brown 
72838a8e8c1SStefano Zampini    test:
7299a14fc28SStefano Zampini       suffix: superlu_dist_complex_2
7309a14fc28SStefano Zampini       nsize: 3
7319a14fc28SStefano Zampini       requires: superlu_dist complex
73278bc9606SHong Zhang       args: -mat_solver_type superlu_dist
73378bc9606SHong Zhang       output_file: output/ex125_superlu_dist_complex_2.out
7349a14fc28SStefano Zampini 
7359a14fc28SStefano Zampini    test:
73638a8e8c1SStefano Zampini       suffix: cusparse
737dfd57a17SPierre Jolivet       requires: cuda datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES)
7380338c944SBarry Smith       #TODO: fix the bug with cholesky
73978bc9606SHong Zhang       #args: -mat_type aijcusparse -f ${DATAFILESPATH}/matrices/small -mat_solver_type cusparse -cholesky {{0 1}separate output}
74078bc9606SHong Zhang       args: -mat_type aijcusparse -f ${DATAFILESPATH}/matrices/small -mat_solver_type cusparse -cholesky {{0}separate output}
74138a8e8c1SStefano Zampini 
7429a14fc28SStefano Zampini    test:
7439a14fc28SStefano Zampini       suffix: cusparse_2
7449a14fc28SStefano Zampini       requires: cuda
74578bc9606SHong Zhang       args: -mat_type aijcusparse -mat_solver_type cusparse -cholesky {{0 1}separate output}
7469a14fc28SStefano Zampini 
74739989c4fSStefano Zampini    testset:
74839989c4fSStefano Zampini       nsize: {{1 2}separate output}
74939989c4fSStefano Zampini       requires: double !defined(PETSC_USE_64BIT_INDICES) datafilespath !complex
75039989c4fSStefano Zampini       args: -f ${DATAFILESPATH}/matrices/mixed_poisson
75139989c4fSStefano Zampini       test:
75239989c4fSStefano Zampini         requires: superlu_dist TODO # superlu_dist is broken
75339989c4fSStefano Zampini         suffix: saddle_point_superlu_dist
75439989c4fSStefano Zampini         args: -mat_solver_type superlu_dist -mat_superlu_dist_rowperm {{norowperm largediag_mc64}} -test_inertia 0
75539989c4fSStefano Zampini       test:
75639989c4fSStefano Zampini         requires: mumps
75739989c4fSStefano Zampini         suffix: saddle_point_mumps_lu
75839989c4fSStefano Zampini         args: -mat_solver_type mumps -mat_mumps_icntl_14 100
75939989c4fSStefano Zampini       test:
76039989c4fSStefano Zampini         requires: mumps
76139989c4fSStefano Zampini         suffix: saddle_point_mumps_cholesky
76239989c4fSStefano Zampini         args: -cholesky -mat_solver_type mumps
76339989c4fSStefano Zampini 
764c4762a1bSJed Brown TEST*/
765