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