Actual source code: ex75f.F90
1: !
2: ! Description: Solves a series of linear systems using KSPHPDDM.
3: !
5: program main
6: #include <petsc/finclude/petscksp.h>
7: use petscksp
8: implicit none
9: Vec x, b
10: Mat A
11: #if defined(PETSC_HAVE_HPDDM)
12: Mat U
13: #endif
14: KSP ksp
15: PetscInt i, j, nmat
16: PetscViewer viewer
17: character*(PETSC_MAX_PATH_LEN) dir, name
18: character*(8) fmt
19: character(3) cmat
20: PetscBool flg, reset
21: PetscErrorCode ierr
23: PetscCallA(PetscInitialize(ierr))
24: dir = '.'
25: PetscCallA(PetscOptionsGetString(PETSC_NULL_OPTIONS, PETSC_NULL_CHARACTER, '-load_dir', dir, flg, ierr))
26: PetscCallA(PetscOptionsGetInt(PETSC_NULL_OPTIONS, PETSC_NULL_CHARACTER, '-nmat', nmat, flg, ierr))
27: reset = PETSC_FALSE
28: PetscCallA(PetscOptionsGetBool(PETSC_NULL_OPTIONS, PETSC_NULL_CHARACTER, '-reset', reset, flg, ierr))
29: PetscCallA(MatCreate(PETSC_COMM_WORLD, A, ierr))
30: PetscCallA(KSPCreate(PETSC_COMM_WORLD, ksp, ierr))
31: PetscCallA(KSPSetOperators(ksp, A, A, ierr))
32: do 50 i = 0, nmat - 1
33: j = i + 400
34: fmt = '(I3)'
35: write (cmat, fmt) j
36: write (name, '(a)') trim(dir)//'/A_'//cmat//'.dat'
37: PetscCallA(PetscViewerBinaryOpen(PETSC_COMM_WORLD, name, FILE_MODE_READ, viewer, ierr))
38: PetscCallA(MatLoad(A, viewer, ierr))
39: PetscCallA(PetscViewerDestroy(viewer, ierr))
40: if (i == 0) then
41: PetscCallA(MatCreateVecs(A, x, b, ierr))
42: end if
43: write (name, '(a)') trim(dir)//'/rhs_'//cmat//'.dat'
44: PetscCallA(PetscViewerBinaryOpen(PETSC_COMM_WORLD, name, FILE_MODE_READ, viewer, ierr))
45: PetscCallA(VecLoad(b, viewer, ierr))
46: PetscCallA(PetscViewerDestroy(viewer, ierr))
47: PetscCallA(KSPSetFromOptions(ksp, ierr))
48: PetscCallA(KSPSolve(ksp, b, x, ierr))
49: PetscCallA(PetscObjectTypeCompare(ksp, KSPHPDDM, flg, ierr))
50: #if defined(PETSC_HAVE_HPDDM)
51: if (flg .and. reset) then
52: PetscCallA(KSPHPDDMGetDeflationMat(ksp, U, ierr))
53: PetscCallA(KSPReset(ksp, ierr))
54: PetscCallA(KSPSetOperators(ksp, A, A, ierr))
55: PetscCallA(KSPSetFromOptions(ksp, ierr))
56: PetscCallA(KSPSetUp(ksp, ierr))
57: if (.not. PetscObjectIsNull(U)) then
58: PetscCallA(KSPHPDDMSetDeflationMat(ksp, U, ierr))
59: PetscCallA(MatDestroy(U, ierr))
60: end if
61: end if
62: #endif
63: 50 continue
64: PetscCallA(VecDestroy(x, ierr))
65: PetscCallA(VecDestroy(b, ierr))
66: PetscCallA(MatDestroy(A, ierr))
67: PetscCallA(KSPDestroy(ksp, ierr))
68: PetscCallA(PetscFinalize(ierr))
69: end
71: !/*TEST
72: !
73: ! test:
74: ! suffix: 1
75: ! output_file: output/ex75_1.out
76: ! nsize: 1
77: ! requires: hpddm datafilespath double !complex !defined(PETSC_USE_64BIT_INDICES)
78: ! 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 -load_dir ${DATAFILESPATH}/matrices/hpddm/GCRODR
79: !
80: ! test:
81: ! requires: hpddm datafilespath double !complex !defined(PETSC_USE_64BIT_INDICES)
82: ! suffix: 1_icc
83: ! output_file: output/ex75_1_icc.out
84: ! nsize: 1
85: ! 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
86: !
87: ! testset:
88: ! requires: hpddm datafilespath double !complex !defined(PETSC_USE_64BIT_INDICES)
89: ! 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 -ksp_hpddm_recycle 20 -load_dir ${DATAFILESPATH}/matrices/hpddm/GCRODR
90: ! test:
91: ! nsize: 1
92: ! suffix: 2_seq
93: ! output_file: output/ex75_2.out
94: ! test:
95: ! nsize: 2
96: ! suffix: 2_par
97: ! output_file: output/ex75_2.out
98: !
99: ! testset:
100: ! requires: hpddm datafilespath double !complex !defined(PETSC_USE_64BIT_INDICES)
101: ! output_file: output/ex75_2_icc.out
102: ! nsize: 1
103: ! 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 -ksp_hpddm_recycle 20 -reset {{false true}shared output} -load_dir ${DATAFILESPATH}/matrices/hpddm/GCRODR
104: ! test:
105: ! suffix: 2_icc
106: ! args:
107: ! test:
108: ! suffix: 2_icc_atol
109: ! output_file: output/ex75_2_icc_atol.out
110: ! args: -ksp_atol 1e-12
111: !
112: !TEST*/