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