1c4762a1bSJed Brown static char help[] = "Tests MatSolve() and MatMatSolve() (interface to superlu_dist, mumps and mkl_pardiso).\n\ 278bc9606SHong Zhang Example: mpiexec -n <np> ./ex125 -f <matrix binary file> -nrhs 4 -mat_solver_type <>\n\n"; 378bc9606SHong Zhang 478bc9606SHong Zhang /* 578bc9606SHong Zhang -mat_solver_type: 678bc9606SHong Zhang superlu 778bc9606SHong Zhang superlu_dist 878bc9606SHong Zhang mumps 978bc9606SHong Zhang mkl_pardiso 1078bc9606SHong Zhang cusparse 1178bc9606SHong Zhang petsc 1278bc9606SHong Zhang */ 13c4762a1bSJed Brown 14c4762a1bSJed Brown #include <petscmat.h> 15c4762a1bSJed Brown 165d955bbbSStefano Zampini PetscErrorCode CreateRandom(PetscInt n, PetscInt m, Mat *A) 175d955bbbSStefano Zampini { 185d955bbbSStefano Zampini PetscFunctionBeginUser; 195d955bbbSStefano Zampini PetscCall(MatCreate(PETSC_COMM_WORLD, A)); 205d955bbbSStefano Zampini PetscCall(MatSetType(*A, MATAIJ)); 215d955bbbSStefano Zampini PetscCall(MatSetFromOptions(*A)); 225d955bbbSStefano Zampini PetscCall(MatSetSizes(*A, PETSC_DECIDE, PETSC_DECIDE, n, m)); 235d955bbbSStefano Zampini PetscCall(MatSeqAIJSetPreallocation(*A, 5, NULL)); 245d955bbbSStefano Zampini PetscCall(MatMPIAIJSetPreallocation(*A, 5, NULL, 5, NULL)); 255d955bbbSStefano Zampini PetscCall(MatSetRandom(*A, NULL)); 265d955bbbSStefano Zampini PetscCall(MatAssemblyBegin(*A, MAT_FINAL_ASSEMBLY)); 275d955bbbSStefano Zampini PetscCall(MatAssemblyEnd(*A, MAT_FINAL_ASSEMBLY)); 285d955bbbSStefano Zampini PetscFunctionReturn(PETSC_SUCCESS); 295d955bbbSStefano Zampini } 305d955bbbSStefano Zampini 315d955bbbSStefano Zampini PetscErrorCode CreateIdentity(PetscInt n, Mat *A) 325d955bbbSStefano Zampini { 335d955bbbSStefano Zampini PetscFunctionBeginUser; 345d955bbbSStefano Zampini PetscCall(MatCreate(PETSC_COMM_WORLD, A)); 355d955bbbSStefano Zampini PetscCall(MatSetType(*A, MATAIJ)); 365d955bbbSStefano Zampini PetscCall(MatSetFromOptions(*A)); 375d955bbbSStefano Zampini PetscCall(MatSetSizes(*A, PETSC_DECIDE, PETSC_DECIDE, n, n)); 385d955bbbSStefano Zampini PetscCall(MatSetUp(*A)); 395d955bbbSStefano Zampini PetscCall(MatAssemblyBegin(*A, MAT_FINAL_ASSEMBLY)); 405d955bbbSStefano Zampini PetscCall(MatAssemblyEnd(*A, MAT_FINAL_ASSEMBLY)); 415d955bbbSStefano Zampini PetscCall(MatShift(*A, 1.0)); 425d955bbbSStefano Zampini PetscFunctionReturn(PETSC_SUCCESS); 435d955bbbSStefano Zampini } 445d955bbbSStefano Zampini 45d71ae5a4SJacob Faibussowitsch int main(int argc, char **args) 46d71ae5a4SJacob Faibussowitsch { 475d955bbbSStefano Zampini Mat A, Ae, RHS = NULL, RHS1 = NULL, C, F, X; 48c4762a1bSJed Brown Vec u, x, b; 49c4762a1bSJed Brown PetscMPIInt size; 5078bc9606SHong Zhang PetscInt m, n, nfact, nsolve, nrhs, ipack = 5; 51070736c7SStefano Zampini PetscReal norm, tol = 10 * PETSC_SQRT_MACHINE_EPSILON; 5262671d91SStefano Zampini IS perm = NULL, iperm = NULL; 53c4762a1bSJed Brown MatFactorInfo info; 54c4762a1bSJed Brown PetscRandom rand; 5578bc9606SHong Zhang PetscBool flg, symm, testMatSolve = PETSC_TRUE, testMatMatSolve = PETSC_TRUE, testMatMatSolveTranspose = PETSC_TRUE, testMatSolveTranspose = PETSC_TRUE, match = PETSC_FALSE; 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)); 97*cf053153SJunchao 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 571*cf053153SJunchao 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: 577*cf053153SJunchao Zhang requires: defined(PETSC_HAVE_MUMPS_MIXED_PRECISION) 578*cf053153SJunchao Zhang suffix: mumps_single 579*cf053153SJunchao Zhang args: -pc_precision single -tol 1e-5 580*cf053153SJunchao Zhang test: 581*cf053153SJunchao Zhang suffix: mumps_double 582*cf053153SJunchao Zhang args: -pc_precision double 583*cf053153SJunchao Zhang 584*cf053153SJunchao 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: 590*cf053153SJunchao Zhang requires: defined(PETSC_HAVE_MUMPS_MIXED_PRECISION) 591*cf053153SJunchao Zhang suffix: mumps_nest_single 592*cf053153SJunchao Zhang args: -pc_precision single -tol 1e-4 593*cf053153SJunchao Zhang test: 594*cf053153SJunchao Zhang suffix: mumps_nest_double 595*cf053153SJunchao Zhang args: -pc_precision double 596*cf053153SJunchao Zhang 597*cf053153SJunchao 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: 604*cf053153SJunchao Zhang requires: defined(PETSC_HAVE_MUMPS_MIXED_PRECISION) 605*cf053153SJunchao Zhang suffix: mumps_2_single 606*cf053153SJunchao Zhang args: -pc_precision single -tol 1e-5 607*cf053153SJunchao Zhang test: 608*cf053153SJunchao Zhang suffix: mumps_2_double 609*cf053153SJunchao Zhang args: -pc_precision double 610*cf053153SJunchao Zhang 611*cf053153SJunchao 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 6249a14fc28SStefano Zampini test: 62562671d91SStefano Zampini suffix: mumps_3_nest 62662671d91SStefano Zampini requires: mumps 6275d955bbbSStefano Zampini args: -mat_solver_type mumps -test_nest -test_nest_bordered {{0 1}} 62862671d91SStefano Zampini output_file: output/ex125_mumps_seq.out 62962671d91SStefano Zampini 63062671d91SStefano Zampini test: 6319a14fc28SStefano Zampini suffix: mumps_4 6329a14fc28SStefano Zampini nsize: 3 6339a14fc28SStefano Zampini requires: mumps 63478bc9606SHong Zhang args: -mat_solver_type mumps 6359a14fc28SStefano Zampini output_file: output/ex125_mumps_par.out 6369a14fc28SStefano Zampini 6379a14fc28SStefano Zampini test: 63862671d91SStefano Zampini suffix: mumps_4_nest 63962671d91SStefano Zampini nsize: 3 64062671d91SStefano Zampini requires: mumps 6415d955bbbSStefano Zampini args: -mat_solver_type mumps -test_nest -test_nest_bordered {{0 1}} 64262671d91SStefano Zampini output_file: output/ex125_mumps_par.out 64362671d91SStefano Zampini 64462671d91SStefano Zampini test: 645d47f36abSHong Zhang suffix: mumps_5 646d47f36abSHong Zhang nsize: 3 647d47f36abSHong Zhang requires: mumps 64878bc9606SHong Zhang args: -mat_solver_type mumps -cholesky 649d47f36abSHong Zhang output_file: output/ex125_mumps_par_cholesky.out 650d47f36abSHong Zhang 651d47f36abSHong Zhang test: 65262671d91SStefano Zampini suffix: mumps_5_nest 65362671d91SStefano Zampini nsize: 3 65462671d91SStefano Zampini requires: mumps 6555d955bbbSStefano Zampini args: -mat_solver_type mumps -cholesky -test_nest -test_nest_bordered {{0 1}} 65662671d91SStefano Zampini output_file: output/ex125_mumps_par_cholesky.out 65762671d91SStefano Zampini 65862671d91SStefano Zampini test: 65953587d93SPierre Jolivet suffix: mumps_6 66053587d93SPierre Jolivet nsize: 2 66153587d93SPierre Jolivet requires: mumps 66253587d93SPierre Jolivet args: -mat_solver_type mumps -test_nest -test_nest_bordered -m 13 -n 13 66353587d93SPierre Jolivet output_file: output/ex125_mumps_par.out 66453587d93SPierre Jolivet 66553587d93SPierre Jolivet test: 66678bc9606SHong Zhang suffix: superlu 66778bc9606SHong Zhang requires: datafilespath double !complex !defined(PETSC_USE_64BIT_INDICES) superlu 66878bc9606SHong Zhang args: -f ${DATAFILESPATH}/matrices/medium -mat_solver_type superlu 66978bc9606SHong Zhang output_file: output/ex125_superlu.out 67078bc9606SHong Zhang 67178bc9606SHong Zhang test: 672c4762a1bSJed Brown suffix: superlu_dist 6739a14fc28SStefano Zampini nsize: {{1 3}} 674d4783600SBarry Smith requires: datafilespath double !complex !defined(PETSC_USE_64BIT_INDICES) superlu_dist 67578bc9606SHong Zhang args: -f ${DATAFILESPATH}/matrices/small -mat_solver_type superlu_dist -mat_superlu_dist_rowperm NOROWPERM 67678bc9606SHong Zhang output_file: output/ex125_superlu_dist.out 677c4762a1bSJed Brown 678c4762a1bSJed Brown test: 679c4762a1bSJed Brown suffix: superlu_dist_2 6809a14fc28SStefano Zampini nsize: {{1 3}} 6819a14fc28SStefano Zampini requires: superlu_dist !complex 68278bc9606SHong Zhang args: -n 36 -mat_solver_type superlu_dist -mat_superlu_dist_rowperm NOROWPERM 683c4762a1bSJed Brown output_file: output/ex125_superlu_dist.out 684c4762a1bSJed Brown 685c4762a1bSJed Brown test: 68678bc9606SHong Zhang suffix: superlu_dist_3 68778bc9606SHong Zhang nsize: {{1 3}} 68878bc9606SHong Zhang requires: superlu_dist !complex 68978bc9606SHong Zhang requires: datafilespath double !complex !defined(PETSC_USE_64BIT_INDICES) superlu_dist 69078bc9606SHong Zhang args: -f ${DATAFILESPATH}/matrices/medium -mat_solver_type superlu_dist -mat_superlu_dist_rowperm NOROWPERM 69178bc9606SHong Zhang output_file: output/ex125_superlu_dist_nonsymmetric.out 69278bc9606SHong Zhang 69378bc9606SHong Zhang test: 694c4762a1bSJed Brown suffix: superlu_dist_complex 695c4762a1bSJed Brown nsize: 3 696d4783600SBarry Smith requires: datafilespath double superlu_dist complex !defined(PETSC_USE_64BIT_INDICES) 69778bc9606SHong Zhang args: -f ${DATAFILESPATH}/matrices/farzad_B_rhs -mat_solver_type superlu_dist 698c4762a1bSJed Brown output_file: output/ex125_superlu_dist_complex.out 699c4762a1bSJed Brown 70038a8e8c1SStefano Zampini test: 7019a14fc28SStefano Zampini suffix: superlu_dist_complex_2 7029a14fc28SStefano Zampini nsize: 3 7039a14fc28SStefano Zampini requires: superlu_dist complex 70478bc9606SHong Zhang args: -mat_solver_type superlu_dist 70578bc9606SHong Zhang output_file: output/ex125_superlu_dist_complex_2.out 7069a14fc28SStefano Zampini 7079a14fc28SStefano Zampini test: 70838a8e8c1SStefano Zampini suffix: cusparse 709dfd57a17SPierre Jolivet requires: cuda datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES) 7100338c944SBarry Smith #TODO: fix the bug with cholesky 71178bc9606SHong Zhang #args: -mat_type aijcusparse -f ${DATAFILESPATH}/matrices/small -mat_solver_type cusparse -cholesky {{0 1}separate output} 71278bc9606SHong Zhang args: -mat_type aijcusparse -f ${DATAFILESPATH}/matrices/small -mat_solver_type cusparse -cholesky {{0}separate output} 71338a8e8c1SStefano Zampini 7149a14fc28SStefano Zampini test: 7159a14fc28SStefano Zampini suffix: cusparse_2 7169a14fc28SStefano Zampini requires: cuda 71778bc9606SHong Zhang args: -mat_type aijcusparse -mat_solver_type cusparse -cholesky {{0 1}separate output} 7189a14fc28SStefano Zampini 71939989c4fSStefano Zampini testset: 72039989c4fSStefano Zampini nsize: {{1 2}separate output} 72139989c4fSStefano Zampini requires: double !defined(PETSC_USE_64BIT_INDICES) datafilespath !complex 72239989c4fSStefano Zampini args: -f ${DATAFILESPATH}/matrices/mixed_poisson 72339989c4fSStefano Zampini test: 72439989c4fSStefano Zampini requires: superlu_dist TODO # superlu_dist is broken 72539989c4fSStefano Zampini suffix: saddle_point_superlu_dist 72639989c4fSStefano Zampini args: -mat_solver_type superlu_dist -mat_superlu_dist_rowperm {{norowperm largediag_mc64}} -test_inertia 0 72739989c4fSStefano Zampini test: 72839989c4fSStefano Zampini requires: mumps 72939989c4fSStefano Zampini suffix: saddle_point_mumps_lu 73039989c4fSStefano Zampini args: -mat_solver_type mumps -mat_mumps_icntl_14 100 73139989c4fSStefano Zampini test: 73239989c4fSStefano Zampini requires: mumps 73339989c4fSStefano Zampini suffix: saddle_point_mumps_cholesky 73439989c4fSStefano Zampini args: -cholesky -mat_solver_type mumps 73539989c4fSStefano Zampini 736c4762a1bSJed Brown TEST*/ 737