5 REAL(KIND=8) :: rel_tol, abs_tol
6 CHARACTER(LEN=20) ::
solver, precond
11 SUBROUTINE init_solver(my_par,my_ksp,matrix,communicator,solver,precond, opt_re_init)
13 #include "petsc/finclude/petsc.h" 16 LOGICAL,
INTENT(IN),
OPTIONAL :: opt_re_init
18 CHARACTER(*),
OPTIONAL :: solver, precond
25 petscerrorcode :: ierr
26 mpi_comm :: communicator
28 IF (.NOT.
PRESENT(opt_re_init))
THEN 34 IF (my_par%it_max.LE.0)
THEN 37 IF (my_par%rel_tol.LE.0.d0)
THEN 38 my_par%rel_tol = 1.d-8
40 IF (my_par%abs_tol.LE.0.d0)
THEN 41 my_par%abs_tol = 1.d-14
44 IF (.NOT.re_init)
CALL kspcreate(communicator,my_ksp,ierr)
49 CALL kspsetoperators(my_ksp,matrix,matrix,ierr)
51 IF (
PRESENT(solver))
THEN 54 IF (solver(deb:fin)==
'BCGS')
THEN 55 CALL kspsettype(my_ksp, kspbcgs, ierr)
56 ELSE IF (solver(deb:fin)==
'GMRES')
THEN 57 CALL kspsettype(my_ksp, kspgmres, ierr)
58 ELSE IF (solver(deb:fin)==
'FGMRES')
THEN 59 CALL kspsettype(my_ksp, kspfgmres, ierr)
60 ELSE IF (solver(deb:fin)==
'PCR')
THEN 61 CALL kspsettype(my_ksp, kspcr, ierr)
62 ELSE IF (solver(deb:fin)==
'CHEBYCHEV')
THEN 63 CALL kspsettype(my_ksp, kspchebyshev, ierr)
64 ELSE IF (solver(deb:fin)==
'CG')
THEN 65 CALL kspsettype(my_ksp, kspcg, ierr)
67 CALL kspsettype(my_ksp, kspfgmres, ierr)
70 CALL kspsettype(my_ksp, kspfgmres, ierr)
72 CALL kspsettolerances(my_ksp, my_par%rel_tol, my_par%abs_tol, &
73 petsc_default_real, my_par%it_max, ierr)
74 CALL kspgetpc(my_ksp, prec, ierr)
75 IF (
PRESENT(precond))
THEN 78 IF (precond(deb:fin)==
'JACOBI')
THEN 79 CALL pcsettype(prec, pcbjacobi, ierr)
80 ELSE IF (precond(deb:fin)==
'HYPRE')
THEN 81 CALL pcsettype(prec, pchypre, ierr)
82 ELSE IF (precond(deb:fin)==
'SSOR')
THEN 83 CALL pcsettype(prec, pcsor, ierr)
84 ELSE IF (precond(deb:fin)==
'MUMPS')
THEN 85 CALL pcsettype(prec, pclu, ierr)
86 CALL kspsettype(my_ksp, ksppreonly, ierr)
88 CALL pcfactorsetmatsolvertype(prec, matsolvermumps, ierr)
90 CALL pcsettype(prec, pchypre, ierr)
93 CALL pcsettype(prec, pchypre, ierr)
95 CALL kspsetfromoptions(my_ksp, ierr)
98 SUBROUTINE solver(my_ksp,b,x,reinit,verbose)
99 #include "petsc/finclude/petsc.h" 102 LOGICAL,
OPTIONAL :: reinit, verbose
105 petscerrorcode :: ierr
107 kspconvergedreason :: reason
108 IF (.NOT.
PRESENT(reinit)) reinit=.true.
111 IF (reinit)
CALL veczeroentries (x,ierr)
112 CALL kspsolve(my_ksp,b,x,ierr)
114 CALL kspgetiterationnumber(my_ksp, its, ierr)
115 CALL kspgetconvergedreason(my_ksp, reason, ierr)
118 WRITE(*,*)
"KSP_CONVERGED_RTOL, Nb of iterations", its
120 WRITE(*,*)
"KSP_CONVERGED_ATOL, Nb of iterations", its
122 WRITE(*,*)
"Converged after one single iteration of the preconditioner is applied" 124 WRITE(*,*)
"Converge for strange reason:", reason
126 WRITE(*,*)
"KSP_DIVERGED_NULL" 128 WRITE(*,*)
"Not converged after it_max", its
130 WRITE(*,*)
"Not converged: explosion" 132 WRITE(*,*)
"Not converged for strange reasons", reason
134 WRITE(*,*)
"Not converged: Indefinite preconditioner" 136 WRITE(*,*)
"Not converged: NAN" 138 WRITE(*,*)
"Not converged: Indefinite matrix" 140 WRITE(*,*)
"Something strange happened", reason
148 #include "petsc/finclude/petsc.h" 152 LOGICAL,
OPTIONAL :: clean
153 REAL(KIND=8),
DIMENSION(:),
POINTER :: aa
154 INTEGER :: nnzm1, dom_np
155 LOGICAL :: test_clean
157 mpi_comm :: communicator
159 petscerrorcode :: ierr
161 dom_np =
SIZE(la%ia)-1
162 nnzm1=la%ia(dom_np)-la%ia(0)-1
163 ALLOCATE(aa(0:nnzm1))
174 CALL matcreatempiaijwitharrays(communicator,dom_np,dom_np,petsc_decide, &
175 petsc_decide, la%ia, la%ja, aa, matrix, ierr)
178 IF (
PRESENT(clean))
THEN 184 IF (
ASSOCIATED(la%ia))
DEALLOCATE(la%ia)
185 IF (
ASSOCIATED(la%ja))
DEALLOCATE(la%ja)
191 #include "petsc/finclude/petsc.h" 195 INTEGER,
DIMENSION(2) :: i_loc
196 INTEGER,
DIMENSION(:),
POINTER :: ia, ja
197 REAL(KIND=8),
DIMENSION(:),
POINTER :: aa
198 INTEGER :: nnzm1, dom_np, p, i, n
200 mpi_comm :: communicator
202 petscerrorcode :: ierr
204 dom_np = i_loc(2) - i_loc(1) + 1
205 nnzm1 = aij%ia(i_loc(2)+1)-aij%ia(i_loc(1))-1
206 ALLOCATE(ia(0:dom_np),ja(0:nnzm1))
210 ia(i) = aij%ia(n+1)-aij%ia(i_loc(1))
211 DO p=aij%ia(n), aij%ia(n+1)-1
212 ja(p-aij%ia(i_loc(1)))= aij%ja(p)-1
216 ALLOCATE(aa(0:nnzm1))
218 CALL matcreatempiaijwitharrays(communicator,dom_np,dom_np,petsc_decide, &
219 petsc_decide, ia, ja, aa, matrix, ierr)
226 #include "petsc/finclude/petsc.h" 230 INTEGER,
DIMENSION(2) :: i_loc
232 INTEGER,
DIMENSION(:),
POINTER :: ia, ja
233 REAL(KIND=8),
DIMENSION(:),
POINTER :: aa
234 INTEGER :: nnzm1, dom_np, p, i, n, ib, k
236 mpi_comm :: communicator
238 petscerrorcode :: ierr
240 dom_np = i_loc(2) - i_loc(1) + 1
241 nnzm1 = n_b*(aij%ia(i_loc(2)+1)-aij%ia(i_loc(1))-1)
242 ALLOCATE(ia(0:n_b*dom_np),ja(0:nnzm1))
246 ib = i + (k-1)*dom_np
248 ia(i) = n_b*(aij%ia(n+1)-aij%ia(i_loc(1)))
249 DO p=aij%ia(n), aij%ia(n+1)-1
250 ja(p-aij%ia(i_loc(1)))= aij%ja(p)-1
255 ALLOCATE(aa(0:nnzm1))
257 CALL matcreatempiaijwitharrays(communicator,dom_np,dom_np,petsc_decide, &
258 petsc_decide, ia, ja, aa, matrix, ierr)
subroutine solver(my_ksp, b, x, reinit, verbose)
integer function, public last_of_string(string)
subroutine create_local_petsc_matrix(communicator, LA, matrix, clean)
integer function, public start_of_string(string)
subroutine init_solver(my_par, my_ksp, matrix, communicator, solver, precond, opt_re_init)
subroutine create_local_petsc_block_matrix(communicator, n_b, aij, i_loc, matrix)
subroutine create_local_petsc_matrix_a_detruire(communicator, aij, i_loc, matrix)