Actual source code: ex75.c

      1: #include <petsc.h>

      3: static char help[] = "Solves a series of linear systems using KSPHPDDM.\n\n";

      5: int main(int argc, char **args)
      6: {
      7:   Vec x, b; /* computed solution and RHS */
      8:   Mat A;    /* linear system matrix */
      9:   KSP ksp;  /* linear solver context */
     10: #if defined(PETSC_HAVE_HPDDM)
     11:   Mat U; /* deflation space */
     12: #endif
     13:   PetscInt    i, j, nmat = 10;
     14:   PetscViewer viewer;
     15:   char        dir[PETSC_MAX_PATH_LEN], name[256];
     16:   PetscBool   flg, reset = PETSC_FALSE;

     18:   PetscFunctionBeginUser;
     19:   PetscCall(PetscInitialize(&argc, &args, NULL, help));
     20:   PetscCall(PetscStrncpy(dir, ".", sizeof(dir)));
     21:   PetscCall(PetscOptionsGetString(NULL, NULL, "-load_dir", dir, sizeof(dir), NULL));
     22:   PetscCall(PetscOptionsGetInt(NULL, NULL, "-nmat", &nmat, NULL));
     23:   PetscCall(PetscOptionsGetBool(NULL, NULL, "-reset", &reset, NULL));
     24:   PetscCall(MatCreate(PETSC_COMM_WORLD, &A));
     25:   PetscCall(KSPCreate(PETSC_COMM_WORLD, &ksp));
     26:   PetscCall(KSPSetOperators(ksp, A, A));
     27:   for (i = 0; i < nmat; i++) {
     28:     j = i + 400;
     29:     PetscCall(PetscSNPrintf(name, sizeof(name), "%s/A_%" PetscInt_FMT ".dat", dir, j));
     30:     PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, name, FILE_MODE_READ, &viewer));
     31:     PetscCall(MatLoad(A, viewer));
     32:     PetscCall(PetscViewerDestroy(&viewer));
     33:     if (i == 0) PetscCall(MatCreateVecs(A, &x, &b));
     34:     PetscCall(PetscSNPrintf(name, sizeof(name), "%s/rhs_%" PetscInt_FMT ".dat", dir, j));
     35:     PetscCall(PetscViewerBinaryOpen(PETSC_COMM_WORLD, name, FILE_MODE_READ, &viewer));
     36:     PetscCall(VecLoad(b, viewer));
     37:     PetscCall(PetscViewerDestroy(&viewer));
     38:     PetscCall(KSPSetFromOptions(ksp));
     39:     PetscCall(KSPSolve(ksp, b, x));
     40:     PetscCall(PetscObjectTypeCompare((PetscObject)ksp, KSPHPDDM, &flg));
     41: #if defined(PETSC_HAVE_HPDDM)
     42:     if (flg && reset) {
     43:       PetscCall(KSPHPDDMGetDeflationMat(ksp, &U));
     44:       PetscCall(KSPReset(ksp));
     45:       PetscCall(KSPSetOperators(ksp, A, A));
     46:       PetscCall(KSPSetFromOptions(ksp));
     47:       PetscCall(KSPSetUp(ksp));
     48:       if (U) {
     49:         PetscCall(KSPHPDDMSetDeflationMat(ksp, U));
     50:         PetscCall(MatDestroy(&U));
     51:       }
     52:     }
     53: #endif
     54:   }
     55:   PetscCall(VecDestroy(&x));
     56:   PetscCall(VecDestroy(&b));
     57:   PetscCall(MatDestroy(&A));
     58:   PetscCall(KSPDestroy(&ksp));
     59:   PetscCall(PetscFinalize());
     60:   return 0;
     61: }

     63: /*TEST

     65:    test:
     66:       suffix: 1
     67:       nsize: 1
     68:       requires: hpddm datafilespath double !complex !defined(PETSC_USE_64BIT_INDICES)
     69:       args: -nmat 1 -pc_type none -ksp_converged_reason -ksp_type {{gmres hpddm}shared output} -ksp_max_it 1000 -ksp_gmres_restart 1000 -ksp_rtol 1e-10 -ksp_hpddm_type {{gmres bgmres}shared output} -options_left no -load_dir ${DATAFILESPATH}/matrices/hpddm/GCRODR

     71:    test:
     72:       requires: hpddm datafilespath double !complex !defined(PETSC_USE_64BIT_INDICES)
     73:       suffix: 1_icc
     74:       nsize: 1
     75:       args: -nmat 1 -pc_type icc -ksp_converged_reason -ksp_type {{gmres hpddm}shared output} -ksp_max_it 1000 -ksp_gmres_restart 1000 -ksp_rtol 1e-10 -load_dir ${DATAFILESPATH}/matrices/hpddm/GCRODR

     77:    testset:
     78:       requires: hpddm datafilespath double !complex !defined(PETSC_USE_64BIT_INDICES)
     79:       args: -nmat 3 -pc_type none -ksp_converged_reason -ksp_type hpddm -ksp_max_it 1000 -ksp_gmres_restart 40 -ksp_rtol 1e-10 -ksp_hpddm_type {{gcrodr bgcrodr}shared output} -ksp_hpddm_recycle 20 -load_dir ${DATAFILESPATH}/matrices/hpddm/GCRODR
     80:       test:
     81:         nsize: 1
     82:         suffix: 2_seq
     83:         output_file: output/ex75_2.out
     84:       test:
     85:         nsize: 2
     86:         suffix: 2_par
     87:         output_file: output/ex75_2.out

     89:    testset:
     90:       requires: hpddm datafilespath double !complex !defined(PETSC_USE_64BIT_INDICES)
     91:       nsize: 1
     92:       args: -nmat 3 -pc_type icc -ksp_converged_reason -ksp_type hpddm -ksp_max_it 1000 -ksp_gmres_restart 40 -ksp_rtol 1e-10 -ksp_hpddm_type {{gcrodr bgcrodr}shared output} -ksp_hpddm_recycle 20 -reset {{false true}shared output} -load_dir ${DATAFILESPATH}/matrices/hpddm/GCRODR
     93:       test:
     94:         suffix: 2_icc
     95:         args:
     96:       test:
     97:         suffix: 2_icc_atol
     98:         args: -ksp_atol 1e-12

    100:    test:
    101:       requires: hpddm datafilespath double !complex !defined(PETSC_USE_64BIT_INDICES) slepc defined(PETSC_HAVE_DYNAMIC_LIBRARIES) defined(PETSC_USE_SHARED_LIBRARIES)
    102:       nsize: 2
    103:       suffix: symmetric
    104:       args: -nmat 3 -pc_type jacobi -ksp_converged_reason -ksp_type hpddm -ksp_max_it 1000 -ksp_gmres_restart 40 -ksp_atol 1e-11 -ksp_hpddm_type bgcrodr -ksp_hpddm_recycle 20 -reset {{false true}shared output} -load_dir ${DATAFILESPATH}/matrices/hpddm/GCRODR -ksp_hpddm_recycle_symmetric true

    106: TEST*/