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