Actual source code: ex72.c
petsc-3.13.6 2020-09-29
Report Typos and Errors

      2: static char help[] = "Reads a PETSc matrix and vector from a file and solves a linear system.\n\
      3: This version first preloads and solves a small system, then loads \n\
      4: another (larger) system and solves it as well.  This example illustrates\n\
      5: preloading of instructions with the smaller system so that more accurate\n\
      6: performance monitoring can be done with the larger one (that actually\n\
      7: is the system of interest).  See the 'Performance Hints' chapter of the\n\
      8: users manual for a discussion of preloading.  Input parameters include\n\
      9:   -f0 <input_file> : first file to load (small system)\n\
     10:   -f1 <input_file> : second file to load (larger system)\n\n\
     11:   -nearnulldim <0> : number of vectors in the near-null space immediately following matrix\n\n\
     12:   -trans  : solve transpose system instead\n\n";
     13: /*
     14:   This code can be used to test PETSc interface to other packages.\n\
     15:   Examples of command line options:       \n\
     16:    ./ex72 -f0 <datafile> -ksp_type preonly  \n\
     17:         -help -ksp_view                  \n\
     18:         -num_numfac <num_numfac> -num_rhs <num_rhs> \n\
     19:         -ksp_type preonly -pc_type lu -pc_factor_mat_solver_type superlu or superlu_dist or mumps \n\
     20:         -ksp_type preonly -pc_type cholesky -pc_factor_mat_solver_type mumps \n\
     21:    mpiexec -n <np> ./ex72 -f0 <datafile> -ksp_type cg -pc_type asm -pc_asm_type basic -sub_pc_type icc -mat_type sbaij
     22:  \n\n";
     23: */
     24: /*T
     25:    Concepts: KSP^solving a linear system
     26:    Processors: n
     27: T*/

     33: /*
     34:   Include "petscksp.h" so that we can use KSP solvers.  Note that this file
     35:   automatically includes:
     36:      petscsys.h       - base PETSc routines   petscvec.h - vectors
     37:      petscmat.h - matrices
     38:      petscis.h     - index sets            petscksp.h - Krylov subspace methods
     39:      petscviewer.h - viewers               petscpc.h  - preconditioners
     40: */
     41:  #include <petscksp.h>

     43: int main(int argc,char **args)
     44: {
     45:   KSP            ksp;             /* linear solver context */
     46:   Mat            A;               /* matrix */
     47:   Vec            x,b,u;           /* approx solution, RHS, exact solution */
     48:   PetscViewer    viewer;          /* viewer */
     49:   char           file[4][PETSC_MAX_PATH_LEN];     /* input file name */
     50:   PetscBool      table     =PETSC_FALSE,flg,trans=PETSC_FALSE,initialguess = PETSC_FALSE;
     51:   PetscBool      outputSoln=PETSC_FALSE,constantnullspace = PETSC_FALSE;
     53:   PetscInt       its,num_numfac,m,n,M,nearnulldim = 0;
     54:   PetscReal      norm;
     55:   PetscBool      preload=PETSC_TRUE,isSymmetric,cknorm=PETSC_FALSE,initialguessfile = PETSC_FALSE;
     56:   PetscMPIInt    rank;
     57:   char           initialguessfilename[PETSC_MAX_PATH_LEN];

     59:   PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr;
     60:   MPI_Comm_rank(PETSC_COMM_WORLD,&rank);
     61:   PetscOptionsGetBool(NULL,NULL,"-table",&table,NULL);
     62:   PetscOptionsGetBool(NULL,NULL,"-constantnullspace",&constantnullspace,NULL);
     63:   PetscOptionsGetBool(NULL,NULL,"-trans",&trans,NULL);
     64:   PetscOptionsGetBool(NULL,NULL,"-initialguess",&initialguess,NULL);
     65:   PetscOptionsGetBool(NULL,NULL,"-output_solution",&outputSoln,NULL);
     66:   PetscOptionsGetString(NULL,NULL,"-initialguessfilename",initialguessfilename,PETSC_MAX_PATH_LEN,&initialguessfile);
     67:   PetscOptionsGetInt(NULL,NULL,"-nearnulldim",&nearnulldim,NULL);

     69:   /*
     70:      Determine files from which we read the two linear systems
     71:      (matrix and right-hand-side vector).
     72:   */
     73:   PetscOptionsGetString(NULL,NULL,"-f",file[0],PETSC_MAX_PATH_LEN,&flg);
     74:   if (flg) {
     75:     PetscStrcpy(file[1],file[0]);
     76:     preload = PETSC_FALSE;
     77:   } else {
     78:     PetscOptionsGetString(NULL,NULL,"-f0",file[0],PETSC_MAX_PATH_LEN,&flg);
     79:     if (!flg) SETERRQ(PETSC_COMM_WORLD,PETSC_ERR_USER_INPUT,"Must indicate binary file with the -f0 or -f option");
     80:     PetscOptionsGetString(NULL,NULL,"-f1",file[1],PETSC_MAX_PATH_LEN,&flg);
     81:     if (!flg) preload = PETSC_FALSE;   /* don't bother with second system */
     82:   }

     84:   /* -----------------------------------------------------------
     85:                   Beginning of linear solver loop
     86:      ----------------------------------------------------------- */
     87:   /*
     88:      Loop through the linear solve 2 times.
     89:       - The intention here is to preload and solve a small system;
     90:         then load another (larger) system and solve it as well.
     91:         This process preloads the instructions with the smaller
     92:         system so that more accurate performance monitoring (via
     93:         -log_view) can be done with the larger one (that actually
     94:         is the system of interest).
     95:   */
     96:   PetscPreLoadBegin(preload,"Load system");

     98:   /* - - - - - - - - - - - New Stage - - - - - - - - - - - - -
     99:                          Load system
    100:    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

    102:   /*
    103:      Open binary file.  Note that we use FILE_MODE_READ to indicate
    104:      reading from this file.
    105:   */
    106:   PetscViewerBinaryOpen(PETSC_COMM_WORLD,file[PetscPreLoadIt],FILE_MODE_READ,&viewer);

    108:   /*
    109:      Load the matrix and vector; then destroy the viewer.
    110:   */
    111:   MatCreate(PETSC_COMM_WORLD,&A);
    112:   MatSetFromOptions(A);
    113:   MatLoad(A,viewer);
    114:   if (nearnulldim) {
    115:     MatNullSpace nullsp;
    116:     Vec          *nullvecs;
    117:     PetscInt     i;
    118:     PetscMalloc1(nearnulldim,&nullvecs);
    119:     for (i=0; i<nearnulldim; i++) {
    120:       VecCreate(PETSC_COMM_WORLD,&nullvecs[i]);
    121:       VecLoad(nullvecs[i],viewer);
    122:     }
    123:     MatNullSpaceCreate(PETSC_COMM_WORLD,PETSC_FALSE,nearnulldim,nullvecs,&nullsp);
    124:     MatSetNearNullSpace(A,nullsp);
    125:     for (i=0; i<nearnulldim; i++) {VecDestroy(&nullvecs[i]);}
    126:     PetscFree(nullvecs);
    127:     MatNullSpaceDestroy(&nullsp);
    128:   }
    129:   if (constantnullspace) {
    130:     MatNullSpace constant;
    131:     MatNullSpaceCreate(PETSC_COMM_WORLD,PETSC_TRUE,0,NULL,&constant);
    132:     MatSetNullSpace(A,constant);
    133:     MatNullSpaceDestroy(&constant);
    134:   }
    135:   flg  = PETSC_FALSE;
    136:   PetscOptionsGetString(NULL,NULL,"-rhs",file[2],PETSC_MAX_PATH_LEN,&flg);
    137:   VecCreate(PETSC_COMM_WORLD,&b);
    138:   if (flg) {   /* rhs is stored in a separate file */
    139:     if (file[2][0] == '0' || file[2][0] == 0) {
    140:       PetscInt    m;
    141:       PetscScalar one = 1.0;
    142:       PetscInfo(0,"Using vector of ones for RHS\n");
    143:       MatGetLocalSize(A,&m,NULL);
    144:       VecSetSizes(b,m,PETSC_DECIDE);
    145:       VecSetFromOptions(b);
    146:       VecSet(b,one);
    147:     } else {
    148:       PetscViewerDestroy(&viewer);
    149:       PetscViewerBinaryOpen(PETSC_COMM_WORLD,file[2],FILE_MODE_READ,&viewer);
    150:       VecSetFromOptions(b);
    151:       VecLoad(b,viewer);
    152:     }
    153:   } else {   /* rhs is stored in the same file as matrix */
    154:     VecSetFromOptions(b);
    155:     VecLoad(b,viewer);
    156:   }
    157:   PetscViewerDestroy(&viewer);

    159:   /* Make A singular for testing zero-pivot of ilu factorization */
    160:   /* Example: ./ex72 -f0 <datafile> -test_zeropivot -pc_factor_shift_type <shift_type> */
    161:   flg  = PETSC_FALSE;
    162:   PetscOptionsGetBool(NULL,NULL, "-test_zeropivot", &flg,NULL);
    163:   if (flg) { /* set a row as zeros */
    164:     PetscInt          row=0;
    165:     MatSetOption(A,MAT_KEEP_NONZERO_PATTERN,PETSC_TRUE);
    166:     MatZeroRows(A,1,&row,0.0,NULL,NULL);
    167:   }

    169:   /* Check whether A is symmetric, then set A->symmetric option */
    170:   flg = PETSC_FALSE;
    171:   PetscOptionsGetBool(NULL,NULL, "-check_symmetry", &flg,NULL);
    172:   if (flg) {
    173:     MatIsSymmetric(A,0.0,&isSymmetric);
    174:     if (!isSymmetric) {
    175:       PetscPrintf(PETSC_COMM_WORLD,"Warning: A is non-symmetric \n");
    176:     }
    177:   }

    179:   /*
    180:      If the loaded matrix is larger than the vector (due to being padded
    181:      to match the block size of the system), then create a new padded vector.
    182:   */

    184:   MatGetLocalSize(A,&m,&n);
    185:   /*  if (m != n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ, "This example is not intended for rectangular matrices (%d, %d)", m, n);*/
    186:   MatGetSize(A,&M,NULL);
    187:   VecGetSize(b,&m);
    188:   if (M != m) {   /* Create a new vector b by padding the old one */
    189:     PetscInt    j,mvec,start,end,indx;
    190:     Vec         tmp;
    191:     PetscScalar *bold;

    193:     VecCreate(PETSC_COMM_WORLD,&tmp);
    194:     VecSetSizes(tmp,n,PETSC_DECIDE);
    195:     VecSetFromOptions(tmp);
    196:     VecGetOwnershipRange(b,&start,&end);
    197:     VecGetLocalSize(b,&mvec);
    198:     VecGetArray(b,&bold);
    199:     for (j=0; j<mvec; j++) {
    200:       indx = start+j;
    201:       VecSetValues(tmp,1,&indx,bold+j,INSERT_VALUES);
    202:     }
    203:     VecRestoreArray(b,&bold);
    204:     VecDestroy(&b);
    205:     VecAssemblyBegin(tmp);
    206:     VecAssemblyEnd(tmp);
    207:     b    = tmp;
    208:   }

    210:   MatCreateVecs(A,&x,NULL);
    211:   VecDuplicate(b,&u);
    212:   if (initialguessfile) {
    213:     PetscViewerBinaryOpen(PETSC_COMM_WORLD,initialguessfilename,FILE_MODE_READ,&viewer);
    214:     VecLoad(x,viewer);
    215:     PetscViewerDestroy(&viewer);
    216:     initialguess = PETSC_TRUE;
    217:   } else if (initialguess) {
    218:     VecSet(x,1.0);
    219:   } else {
    220:     VecSet(x,0.0);
    221:   }

    224:   /* Check scaling in A */
    225:   flg  = PETSC_FALSE;
    226:   PetscOptionsGetBool(NULL,NULL, "-check_scaling", &flg,NULL);
    227:   if (flg) {
    228:     Vec       max, min;
    229:     PetscInt  idx;
    230:     PetscReal val;

    232:     VecDuplicate(x, &max);
    233:     VecDuplicate(x, &min);
    234:     MatGetRowMaxAbs(A, max, NULL);
    235:     MatGetRowMinAbs(A, min, NULL);
    236:     {
    237:       PetscViewerASCIIOpen(PETSC_COMM_WORLD, "max.data", &viewer);
    238:       VecView(max, viewer);
    239:       PetscViewerDestroy(&viewer);
    240:       PetscViewerASCIIOpen(PETSC_COMM_WORLD, "min.data", &viewer);
    241:       VecView(min, viewer);
    242:       PetscViewerDestroy(&viewer);
    243:     }
    244:     VecView(max, PETSC_VIEWER_DRAW_WORLD);
    245:     VecMax(max, &idx, &val);
    246:     PetscPrintf(PETSC_COMM_WORLD, "Largest max row element %g at row %D\n", (double)val, idx);
    247:     VecView(min, PETSC_VIEWER_DRAW_WORLD);
    248:     VecMin(min, &idx, &val);
    249:     PetscPrintf(PETSC_COMM_WORLD, "Smallest min row element %g at row %D\n", (double)val, idx);
    250:     VecMin(max, &idx, &val);
    251:     PetscPrintf(PETSC_COMM_WORLD, "Smallest max row element %g at row %D\n", (double)val, idx);
    252:     VecPointwiseDivide(max, max, min);
    253:     VecMax(max, &idx, &val);
    254:     PetscPrintf(PETSC_COMM_WORLD, "Largest row ratio %g at row %D\n", (double)val, idx);
    255:     VecView(max, PETSC_VIEWER_DRAW_WORLD);
    256:     VecDestroy(&max);
    257:     VecDestroy(&min);
    258:   }

    260:   /*  MatView(A,PETSC_VIEWER_STDOUT_WORLD); */
    261:   /* - - - - - - - - - - - New Stage - - - - - - - - - - - - -
    262:                     Setup solve for system
    263:    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
    264:   /*
    265:      Conclude profiling last stage; begin profiling next stage.
    266:   */
    267:   PetscPreLoadStage("KSPSetUpSolve");

    269:   /*
    270:      Create linear solver; set operators; set runtime options.
    271:   */
    272:   KSPCreate(PETSC_COMM_WORLD,&ksp);
    273:   KSPSetInitialGuessNonzero(ksp,initialguess);
    274:   num_numfac = 1;
    275:   PetscOptionsGetInt(NULL,NULL,"-num_numfac",&num_numfac,NULL);
    276:   while (num_numfac--) {
    277:     PC        pc;
    278:     PetscBool lsqr,isbddc,ismatis;
    279:     char      str[32];

    281:     PetscOptionsGetString(NULL,NULL,"-ksp_type",str,32,&lsqr);
    282:     if (lsqr) {
    283:       PetscStrcmp("lsqr",str,&lsqr);
    284:     }
    285:     if (lsqr) {
    286:       Mat BtB;
    287:       MatTransposeMatMult(A,A,MAT_INITIAL_MATRIX,4,&BtB);
    288:       KSPSetOperators(ksp,A,BtB);
    289:       MatDestroy(&BtB);
    290:     } else {
    291:       KSPSetOperators(ksp,A,A);
    292:     }
    293:     KSPSetFromOptions(ksp);

    295:     /* if we test BDDC, make sure pmat is of type MATIS */
    296:     KSPGetPC(ksp,&pc);
    297:     PetscObjectTypeCompare((PetscObject)pc,PCBDDC,&isbddc);
    298:     PetscObjectTypeCompare((PetscObject)A,MATIS,&ismatis);
    299:     if (isbddc && !ismatis) {
    300:       Mat J;

    302:       MatConvert(A,MATIS,MAT_INITIAL_MATRIX,&J);
    303:       KSPSetOperators(ksp,A,J);
    304:       MatDestroy(&J);
    305:     }

    307:     /*
    308:      Here we explicitly call KSPSetUp() and KSPSetUpOnBlocks() to
    309:      enable more precise profiling of setting up the preconditioner.
    310:      These calls are optional, since both will be called within
    311:      KSPSolve() if they haven't been called already.
    312:     */
    313:     KSPSetUp(ksp);
    314:     KSPSetUpOnBlocks(ksp);

    316:     /* - - - - - - - - - - - New Stage - - - - - - - - - - - - -
    317:                          Solve system
    318:       - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

    320:     /*
    321:      Solve linear system;
    322:     */
    323:     if (trans) {
    324:       KSPSolveTranspose(ksp,b,x);
    325:       KSPGetIterationNumber(ksp,&its);
    326:     } else {
    327:       PetscInt num_rhs=1;
    328:       PetscOptionsGetInt(NULL,NULL,"-num_rhs",&num_rhs,NULL);
    329:       cknorm = PETSC_FALSE;
    330:       PetscOptionsGetBool(NULL,NULL,"-cknorm",&cknorm,NULL);
    331:       while (num_rhs--) {
    332:         if (num_rhs == 1) VecSet(x,0.0);
    333:         KSPSolve(ksp,b,x);
    334:       }
    335:       KSPGetIterationNumber(ksp,&its);
    336:       if (cknorm) {     /* Check error for each rhs */
    337:         if (trans) {
    338:           MatMultTranspose(A,x,u);
    339:         } else {
    340:           MatMult(A,x,u);
    341:         }
    342:         VecAXPY(u,-1.0,b);
    343:         VecNorm(u,NORM_2,&norm);
    344:         PetscPrintf(PETSC_COMM_WORLD,"  Number of iterations = %3D\n",its);
    345:         if (!PetscIsNanScalar(norm)) {
    346:           if (norm < 1.e-12) {
    347:             PetscPrintf(PETSC_COMM_WORLD,"  Residual norm < 1.e-12\n");
    348:           } else {
    349:             PetscPrintf(PETSC_COMM_WORLD,"  Residual norm %g\n",(double)norm);
    350:           }
    351:         }
    352:       }
    353:     }   /* while (num_rhs--) */

    355:     /* - - - - - - - - - - - New Stage - - - - - - - - - - - - -
    356:           Check error, print output, free data structures.
    357:      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */

    359:     /*
    360:        Check error
    361:     */
    362:     if (trans) {
    363:       MatMultTranspose(A,x,u);
    364:     } else {
    365:       MatMult(A,x,u);
    366:     }
    367:     VecAXPY(u,-1.0,b);
    368:     VecNorm(u,NORM_2,&norm);
    369:     /*
    370:      Write output (optinally using table for solver details).
    371:       - PetscPrintf() handles output for multiprocessor jobs
    372:         by printing from only one processor in the communicator.
    373:       - KSPView() prints information about the linear solver.
    374:     */
    375:     if (table) {
    376:       char        *matrixname,kspinfo[120];

    378:       /*
    379:        Open a string viewer; then write info to it.
    380:       */
    381:       PetscViewerStringOpen(PETSC_COMM_WORLD,kspinfo,sizeof(kspinfo),&viewer);
    382:       KSPView(ksp,viewer);
    383:       PetscStrrchr(file[PetscPreLoadIt],'/',&matrixname);
    384:       PetscPrintf(PETSC_COMM_WORLD,"%-8.8s %3D %2.0e %s \n",matrixname,its,norm,kspinfo);

    386:       /*
    387:         Destroy the viewer
    388:       */
    389:       PetscViewerDestroy(&viewer);
    390:     } else {
    391:       PetscPrintf(PETSC_COMM_WORLD,"Number of iterations = %3D\n",its);
    392:       if (!PetscIsNanScalar(norm)) {
    393:         if (norm < 1.e-12 && !PetscIsNanScalar((PetscScalar)norm)) {
    394:           PetscPrintf(PETSC_COMM_WORLD,"  Residual norm < 1.e-12\n");
    395:         } else {
    396:           PetscPrintf(PETSC_COMM_WORLD,"Residual norm %g\n",(double)norm);
    397:         }
    398:       }
    399:     }
    400:     PetscOptionsGetString(NULL,NULL,"-solution",file[3],PETSC_MAX_PATH_LEN,&flg);
    401:     if (flg) {
    402:       Vec         xstar;
    403:       PetscReal   norm;

    405:       PetscViewerBinaryOpen(PETSC_COMM_WORLD,file[3],FILE_MODE_READ,&viewer);
    406:       VecCreate(PETSC_COMM_WORLD,&xstar);
    407:       VecLoad(xstar,viewer);
    408:       VecAXPY(xstar, -1.0, x);
    409:       VecNorm(xstar, NORM_2, &norm);
    410:       PetscPrintf(PETSC_COMM_WORLD, "Error norm %g\n", (double)norm);
    411:       VecDestroy(&xstar);
    412:       PetscViewerDestroy(&viewer);
    413:     }
    414:     if (outputSoln) {
    415:       PetscViewerBinaryOpen(PETSC_COMM_WORLD,"solution.petsc",FILE_MODE_WRITE,&viewer);
    416:       VecView(x, viewer);
    417:       PetscViewerDestroy(&viewer);
    418:     }

    420:     flg  = PETSC_FALSE;
    421:     PetscOptionsGetBool(NULL,NULL, "-ksp_reason", &flg,NULL);
    422:     if (flg) {
    423:       KSPConvergedReason reason;
    424:       KSPGetConvergedReason(ksp,&reason);
    425:       PetscPrintf(PETSC_COMM_WORLD,"KSPConvergedReason: %D\n", reason);
    426:     }

    428:   }   /* while (num_numfac--) */

    430:   /*
    431:      Free work space.  All PETSc objects should be destroyed when they
    432:      are no longer needed.
    433:   */
    434:   MatDestroy(&A); VecDestroy(&b);
    435:   VecDestroy(&u); VecDestroy(&x);
    436:   KSPDestroy(&ksp);
    437:   PetscPreLoadEnd();
    438:   /* -----------------------------------------------------------
    439:                       End of linear solver loop
    440:      ----------------------------------------------------------- */

    442:   PetscFinalize();
    443:   return ierr;
    444: }

    447: /*TEST

    449:    build:
    450:       requires: !complex

    452:    testset:
    453:       suffix: 1
    454:       nsize: 2
    455:       args: -f0 ${wPETSC_DIR}/share/petsc/datafiles/matrices/spd-real-int@PETSC_INDEX_SIZE@-float@PETSC_SCALAR_SIZE@
    456:       requires: !__float128

    458:    testset:
    459:       suffix: 1a
    460:       args: -f0 ${wPETSC_DIR}/share/petsc/datafiles/matrices/spd-real-int@PETSC_INDEX_SIZE@-float@PETSC_SCALAR_SIZE@
    461:       requires: !__float128

    463:    testset:
    464:       nsize: 2
    465:       requires: datafilespath double !define(PETSC_USE_64BIT_INDICES)
    466:       args: -f0 ${DATAFILESPATH}/matrices/medium
    467:       args:  -ksp_type bicg
    468:       test:
    469:          suffix: 2

    471:    testset:
    472:       requires: datafilespath double !define(PETSC_USE_64BIT_INDICES)
    473:       args: -f0 ${DATAFILESPATH}/matrices/medium
    474:       args: -ksp_type bicg
    475:       test:
    476:          suffix: 4
    477:          args: -pc_type lu
    478:       test:
    479:          suffix: 5

    481:    testset:
    482:       suffix: 6
    483:       requires: datafilespath double !define(PETSC_USE_64BIT_INDICES)
    484:       args: -f0 ${DATAFILESPATH}/matrices/fem1
    485:       args: -pc_factor_levels 2 -pc_factor_fill 1.73 -ksp_gmres_cgs_refinement_type refine_always

    487:    testset:
    488:       TODO: Matrix row/column sizes are not compatible with block size
    489:       suffix: 7
    490:       requires: datafilespath double !define(PETSC_USE_64BIT_INDICES)
    491:       args: -f0 ${DATAFILESPATH}/matrices/medium
    492:       args: -viewer_binary_skip_info -mat_type seqbaij
    493:       args: -matload_block_size {{2 3 4 5 6 7 8}separate output}
    494:       args: -ksp_max_it 100 -ksp_gmres_cgs_refinement_type refine_always
    495:       args: -ksp_rtol 1.0e-15 -ksp_monitor_short
    496:       test:
    497:          suffix: a
    498:       test:
    499:          suffix: b
    500:          args: -pc_factor_mat_ordering_type nd
    501:       test:
    502:          suffix: c
    503:          args: -pc_factor_levels 1

    505:    testset:
    506:       TODO: Matrix row/column sizes are not compatible with block size
    507:       suffix: 7_d
    508:       requires: datafilespath double !define(PETSC_USE_64BIT_INDICES)
    509:       args: -f0 ${DATAFILESPATH}/matrices/medium
    510:       args: -viewer_binary_skip_info -mat_type seqbaij
    511:       args: -matload_block_size {{2 3 4 5 6 7 8}shared output}
    512:       args: -ksp_type preonly -pc_type lu

    514:    testset:
    515:       suffix: 8
    516:       requires: datafilespath double !define(PETSC_USE_64BIT_INDICES)
    517:       args: -f0 ${DATAFILESPATH}/matrices/medium
    518:       args: -ksp_diagonal_scale -pc_type eisenstat -ksp_monitor_short -ksp_diagonal_scale_fix -ksp_gmres_cgs_refinement_type refine_always -mat_no_inode

    520:    testset:
    521:       TODO: Matrix row/column sizes are not compatible with block size
    522:       suffix: 9
    523:       requires: datafilespath double !define(PETSC_USE_64BIT_INDICES)
    524:       args: -f0 ${DATAFILESPATH}/matrices/medium
    525:       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
    526:       test:
    527:          suffix: a
    528:          args: -mat_type seqbaij
    529:       test:
    530:          suffix: b
    531:          args: -mat_type seqbaij -trans
    532:       test:
    533:          suffix: c
    534:          nsize: 2
    535:          args: -mat_type mpibaij
    536:       test:
    537:          suffix: d
    538:          nsize: 2
    539:          args: -mat_type mpibaij -trans
    540:       test:
    541:          suffix: e
    542:          nsize: 3
    543:          args: -mat_type mpibaij
    544:       test:
    545:          suffix: f
    546:          nsize: 3
    547:          args: -mat_type mpibaij -trans

    550:    testset:
    551:       suffix: 10
    552:       nsize: 2
    553:       requires: datafilespath double !define(PETSC_USE_64BIT_INDICES)
    554:       args: -ksp_type fgmres -pc_type ksp -f0 ${DATAFILESPATH}/matrices/medium -ksp_fgmres_modifypcksp -ksp_monitor_short

    556:    testset:
    557:       suffix: 12
    558:       requires: matlab
    559:       args: -pc_type lu -pc_factor_mat_solver_type matlab -f0 ${DATAFILESPATH}/matrices/arco1

    561:    testset:
    562:       suffix: 13
    563:       requires: lusol
    564:       args: -f0 ${DATAFILESPATH}/matrices/arco1
    565:       args: -mat_type lusol -pc_type lu

    567:    testset:
    568:       nsize: 3
    569:       args: -f0 ${DATAFILESPATH}/matrices/medium
    570:       requires: datafilespath double !define(PETSC_USE_64BIT_INDICES)
    571:       test:
    572:          suffix: 14
    573:          requires: spai
    574:          args: -pc_type spai
    575:       test:
    576:          suffix: 15
    577:          requires: hypre
    578:          args: -pc_type hypre -pc_hypre_type pilut
    579:       test:
    580:          suffix: 16
    581:          requires: hypre
    582:          args: -pc_type hypre -pc_hypre_type parasails
    583:       test:
    584:          suffix: 17
    585:          requires: hypre
    586:          args: -pc_type hypre -pc_hypre_type boomeramg
    587:       test:
    588:          suffix: 18
    589:          requires: hypre
    590:          args: -pc_type hypre -pc_hypre_type euclid

    592:    testset:
    593:       suffix: 19
    594:       requires: datafilespath double !define(PETSC_USE_64BIT_INDICES)
    595:       args: -f0 ${DATAFILESPATH}/matrices/poisson1
    596:       args: -ksp_type cg -pc_type icc
    597:       args: -pc_factor_levels {{0 2 4}separate output}
    598:       test:
    599:       test:
    600:          args: -mat_type seqsbaij

    603:    testset:
    604:       suffix: ILU
    605:       requires: datafilespath double !define(PETSC_USE_64BIT_INDICES)
    606:       args: -f0 ${DATAFILESPATH}/matrices/small
    607:       args: -pc_factor_levels 1
    608:       test:
    609:       test:
    610:          # This is tested against regular ILU (used to be denoted ILUBAIJ)
    611:          args: -mat_type baij

    613:    testset:
    614:       suffix: aijcusparse
    615:       requires: datafilespath double !define(PETSC_USE_64BIT_INDICES) cuda
    616:       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

    618:    testset:
    619:       TODO: No output file. Need to determine if deprecated
    620:       suffix: asm_viennacl
    621:       nsize: 2
    622:       requires: viennacl
    623:       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}

    625:    testset:
    626:       nsize: 2
    627:       requires: datafilespath double !define(PETSC_USE_64BIT_INDICES) hypre
    628:       args: -f0 ${DATAFILESPATH}/matrices/poisson2.gz -ksp_monitor_short -ksp_rtol 1.E-9 -pc_type hypre -pc_hypre_type boomeramg
    629:       test:
    630:          suffix: boomeramg_euclid
    631:          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
    632:          TODO: Need to determine if deprecated
    633:       test:
    634:          suffix: boomeramg_euclid_bj
    635:          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
    636:          TODO: Need to determine if deprecated
    637:       test:
    638:          suffix: boomeramg_parasails
    639:          args: -pc_hypre_boomeramg_smooth_type ParaSails -pc_hypre_boomeramg_smooth_num_levels 2
    640:       test:
    641:          suffix: boomeramg_pilut
    642:          args: -pc_hypre_boomeramg_smooth_type Pilut -pc_hypre_boomeramg_smooth_num_levels 2
    643:       test:
    644:          suffix: boomeramg_schwarz
    645:          args: -pc_hypre_boomeramg_smooth_type Schwarz-smoothers

    647:    testset:
    648:       suffix: cg_singlereduction
    649:       requires: datafilespath double !define(PETSC_USE_64BIT_INDICES)
    650:       args: -f0 ${DATAFILESPATH}/matrices/small
    651:       args: -mat_type mpisbaij -ksp_type cg -pc_type eisenstat -ksp_monitor_short -ksp_converged_reason
    652:       test:
    653:       test:
    654:          args: -ksp_cg_single_reduction

    656:    testset:
    657:       requires: datafilespath double !define(PETSC_USE_64BIT_INDICES)
    658:       args: -f0 ${DATAFILESPATH}/matrices/poisson2.gz
    659:       args: -ksp_monitor_short -pc_type icc
    660:       test:
    661:          suffix: cr
    662:          args: -ksp_type cr
    663:       test:
    664:          suffix: lcd
    665:          args: -ksp_type lcd

    667:    testset:
    668:       requires: datafilespath double !define(PETSC_USE_64BIT_INDICES)
    669:       args: -f0 ${DATAFILESPATH}/matrices/small
    670:       args: -ksp_monitor_short -ksp_view -mat_view ascii::ascii_info
    671:       test:
    672:          suffix: seqaijcrl
    673:          args: -mat_type seqaijcrl
    674:       test:
    675:          suffix: seqaijperm
    676:          args: -mat_type seqaijperm

    678:    testset:
    679:       nsize: 2
    680:       requires: datafilespath double !define(PETSC_USE_64BIT_INDICES)
    681:       args: -f0 ${DATAFILESPATH}/matrices/small
    682:       args: -ksp_monitor_short -ksp_view
    683:       # Different output files
    684:       test:
    685:          suffix: mpiaijcrl
    686:          args: -mat_type mpiaijcrl
    687:       test:
    688:          suffix: mpiaijperm
    689:          args: -mat_type mpiaijperm

    691:    testset:
    692:       nsize: 4
    693:       requires: datafilespath double !define(PETSC_USE_64BIT_INDICES)
    694:       args: -ksp_monitor_short -ksp_view
    695:       test:
    696:          suffix: xxt
    697:          args: -f0 ${DATAFILESPATH}/matrices/poisson1 -check_symmetry -ksp_type cg -pc_type tfs
    698:       test:
    699:          suffix: xyt
    700:          args: -f0 ${DATAFILESPATH}/matrices/medium -ksp_type gmres -pc_type tfs

    702:    testset:
    703:       # The output file here is the same as mumps
    704:       suffix: mumps_cholesky
    705:       output_file: output/ex72_mumps.out
    706:       requires: datafilespath double !define(PETSC_USE_64BIT_INDICES) mumps
    707:       args: -f0 ${DATAFILESPATH}/matrices/small -ksp_type preonly -pc_type cholesky -pc_factor_mat_solver_type mumps -num_numfac 2 -num_rhs 2
    708:       nsize: {{1 2}}
    709:       test:
    710:          args: -mat_type sbaij -mat_ignore_lower_triangular
    711:       test:
    712:          args: -mat_type aij
    713:       test:
    714:          args: -mat_type aij -matload_spd

    716:    testset:
    717:       # The output file here is the same as mumps
    718:       suffix: mumps_lu
    719:       output_file: output/ex72_mumps.out
    720:       requires: datafilespath double !define(PETSC_USE_64BIT_INDICES) mumps
    721:       args: -f0 ${DATAFILESPATH}/matrices/small -ksp_type preonly -pc_type lu -pc_factor_mat_solver_type mumps -num_numfac 2 -num_rhs 2
    722:       test:
    723:          args: -mat_type seqaij
    724:       test:
    725:          nsize: 2
    726:          args: -mat_type mpiaij
    727:       test:
    728:          args: -mat_type seqbaij -matload_block_size 2
    729:       test:
    730:          nsize: 2
    731:          args: -mat_type mpibaij -matload_block_size 2
    732:       test:
    733:          args: -mat_type aij -mat_mumps_icntl_7 5
    734:          TODO: Need to determine if deprecated

    736:    test:
    737:       suffix: mumps_lu_parmetis
    738:       output_file: output/ex72_mumps.out
    739:       requires: datafilespath double !define(PETSC_USE_64BIT_INDICES) mumps parmetis
    740:       nsize: 2
    741:       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

    743:    test:
    744:       suffix: mumps_lu_ptscotch
    745:       output_file: output/ex72_mumps.out
    746:       requires: datafilespath double !define(PETSC_USE_64BIT_INDICES) mumps ptscotch
    747:       nsize: 2
    748:       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

    750:    testset:
    751:       # The output file here is the same as mumps
    752:       suffix: mumps_redundant
    753:       output_file: output/ex72_mumps_redundant.out
    754:       nsize: 8
    755:       requires: datafilespath double !define(PETSC_USE_64BIT_INDICES) mumps
    756:       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

    758:    testset:
    759:       suffix: pastix_cholesky
    760:       requires: datafilespath double !define(PETSC_USE_64BIT_INDICES) pastix
    761:       output_file: output/ex72_mumps.out
    762:       nsize: {{1 2}}
    763:       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

    765:    testset:
    766:       suffix: pastix_lu
    767:       requires: datafilespath double !define(PETSC_USE_64BIT_INDICES) pastix
    768:       args: -f0 ${DATAFILESPATH}/matrices/small -ksp_type preonly -pc_type lu -pc_factor_mat_solver_type pastix -num_numfac 2 -num_rhs 2
    769:       output_file: output/ex72_mumps.out
    770:       test:
    771:          args: -mat_type seqaij
    772:       test:
    773:          nsize: 2
    774:          args: -mat_type mpiaij

    776:    testset:
    777:       suffix: pastix_redundant
    778:       output_file: output/ex72_mumps_redundant.out
    779:       nsize: 8
    780:       requires: datafilespath double !define(PETSC_USE_64BIT_INDICES) pastix
    781:       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

    784:    testset:
    785:       suffix: superlu_dist_lu
    786:       requires: datafilespath double !define(PETSC_USE_64BIT_INDICES) superlu_dist
    787:       output_file: output/ex72_mumps.out
    788:       args: -f0 ${DATAFILESPATH}/matrices/small -ksp_type preonly -pc_type lu -pc_factor_mat_solver_type superlu_dist -num_numfac 2 -num_rhs 2
    789:       nsize: {{1 2}}

    791:    testset:
    792:       suffix: superlu_dist_redundant
    793:       nsize: 8
    794:       output_file: output/ex72_mumps_redundant.out
    795:       requires: datafilespath double !define(PETSC_USE_64BIT_INDICES) superlu_dist
    796:       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

    798:    testset:
    799:       suffix: superlu_lu
    800:       output_file: output/ex72_mumps.out
    801:       requires: datafilespath double !define(PETSC_USE_64BIT_INDICES) superlu
    802:       args: -f0 ${DATAFILESPATH}/matrices/small -ksp_type preonly -pc_type lu -pc_factor_mat_solver_type superlu -num_numfac 2 -num_rhs 2

    804:    testset:
    805:       suffix: umfpack
    806:       requires: datafilespath double !define(PETSC_USE_64BIT_INDICES) suitesparse
    807:       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

    810:    testset:
    811:       suffix: zeropivot
    812:       requires: datafilespath double !define(PETSC_USE_64BIT_INDICES) mumps
    813:       args: -f0 ${DATAFILESPATH}/matrices/small -test_zeropivot -ksp_converged_reason -ksp_type fgmres -pc_type ksp
    814:       test:
    815:          nsize: 3
    816:          args: -ksp_pc_type bjacobi
    817:       test:
    818:          nsize: 2
    819:          args: -ksp_ksp_type cg -ksp_pc_type bjacobi -ksp_pc_bjacobi_blocks 1
    820:       #test:
    821:          #nsize: 3
    822:          #args: -ksp_ksp_converged_reason -ksp_pc_type bjacobi -ksp_sub_ksp_converged_reason
    823:          #TODO: Need to determine if deprecated

    825:    testset:
    826:       requires: datafilespath double !define(PETSC_USE_64BIT_INDICES)
    827:       args: -f0 ${DATAFILESPATH}/matrices/medium -ksp_type fgmres
    828:       test:
    829:          suffix: bddc_seq
    830:          nsize: 1
    831:          args: -pc_type bddc
    832:       test:
    833:          suffix: bddc_par
    834:          nsize: 2
    835:          args: -pc_type bddc
    836:       test:
    837:          requires: parmetis
    838:          suffix: bddc_par_nd_parmetis
    839:          filter: sed -e "s/Number of iterations =   [0-9]/Number of iterations = 9/g"
    840:          nsize: 4
    841:          args: -ksp_error_if_not_converged -pc_type bddc -mat_is_disassemble_l2g_type nd -mat_partitioning_type parmetis
    842:       test:
    843:          requires: ptscotch define(PETSC_HAVE_SCOTCH_PARMETIS_V3_NODEND)
    844:          suffix: bddc_par_nd_ptscotch
    845:          filter: sed -e "s/Number of iterations =   [0-9]/Number of iterations = 9/g"
    846:          nsize: 4
    847:          args: -ksp_error_if_not_converged -pc_type bddc -mat_is_disassemble_l2g_type nd -mat_partitioning_type ptscotch
    848: TEST*/