70 real(RP) :: tol = 1
e-8_rp
81 character(10) :: name=
'CG' 92 logical :: ierr = .false.
97 real(RP),
dimension(:),
allocatable :: xr
99 real(RP),
dimension(:),
allocatable ::
br 184 integer ,
intent(in),
optional :: type
185 real(RP),
intent(in),
optional :: tol
186 integer ,
intent(in),
optional :: itMax, restart, verb
188 if (
present(type))
then 196 call quit(
"krylov_mod: krylov_create: unknown type")
200 if(
present(itmax )) k%itMax = itmax
201 if(
present(restart)) k%restart = restart
202 if(
present(tol )) k%tol = tol
203 if(
present(verb )) k%verb = verb
211 write(*,*)
"krylov_mod : krylov_print" 212 write(*,*)
" name = "// trim(k%name)
213 write(*,*)
" tolerance =", k%tol
214 write(*,*)
" itMax =", k%itMax
215 write(*,*)
" verbosity =", k%verb
216 write(*,*)
" restart =", k%restart
243 if (k%iter<0) k%ierr = .true.
246 write(*,*)
" Iterations =", k%iter
247 write(*,*)
" Performed x-->A*x =", k%AEval
248 write(*,*)
" Residual =", k%res
250 write(*,*)
' CPU =',&
260 real(RP),
dimension(:),
intent(inout) :: x
261 type(
krylov) ,
intent(inout) :: k
263 real(RP),
dimension(:),
intent(in) :: b
264 procedure(rntorn) :: A
266 if (k%verb>0)
write(*,*)
"krylov_mod : solve_raw = ",&
274 call cg(x, k%iter, k%res, &
275 & b, a, k%tol, k%itmax, k%verb)
279 call gmres(x, k%iter, k%AEval, k%res, &
280 & b, a, k%tol, k%itmax, k%restart, k%verb)
283 call quit(
"krylov_mod: krylov_solve_raw:& 284 & incorrect solver type")
299 real(RP),
dimension(:),
intent(inout) :: x
300 type(
krylov) ,
intent(inout) :: k
302 real(RP),
dimension(:),
intent(in) :: b
303 type(
csr) ,
intent(in) :: mat
310 real(RP),
dimension(:),
intent(out) :: y
311 real(RP),
dimension(:),
intent(in) :: x
322 real(RP),
dimension(:),
intent(inout) :: x
323 type(
krylov) ,
intent(inout) :: k
324 real(RP),
dimension(:),
intent(in) :: b
325 procedure(rntorn) :: A, pc
327 if (k%verb>0)
write(*,*)
"krylov_mod : solve_pc = ",&
334 call pcg(x, k%iter, k%res, &
335 & b, a, pc, k%tol, k%itmax, k%verb)
339 call quit(
"krylov_mod: krylov_solve_pc:& 340 & incorrect solver type")
352 real(RP),
dimension(:),
intent(inout) :: x
353 type(
krylov) ,
intent(inout) :: k
354 real(RP),
dimension(:),
intent(in) :: b
355 type(
csr) ,
intent(in) :: mat
356 type(
precond) ,
intent(inout) :: pc
373 if (.NOT.
allocated(k%xr))
call allocmem(k%xr, mat%nl)
374 if (
size(k%xr,1)/=mat%nl)
call allocmem(k%xr, mat%nl)
375 if (.NOT.
allocated(k%br))
call allocmem(k%br, mat%nl)
376 if (
size(k%br,1)/=mat%nl)
call allocmem(k%br, mat%nl)
386 call reorder(x, pc%permInv, k%xr)
389 call quit(
"krylov_mod: krylov_solve_prec: & 390 & incorrect preconditioning type")
397 real(RP),
dimension(:),
intent(out) :: y
398 real(RP),
dimension(:),
intent(in) :: x
405 real(RP),
dimension(:),
intent(out) :: y
406 real(RP),
dimension(:),
intent(in) :: x
408 call mult(y, pc%invD , x)
413 real(RP),
dimension(:),
intent(out) :: y
414 real(RP),
dimension(:),
intent(in) :: x
subroutine krylov_clear(k)
Destructor.
DEFINITION OF ABSTRACT_INTERFACES FOR THE LIBRARY CHORAL
subroutine, public pcg(x, iter, res, b, A, pc, tol, itmax, verb)
Preconditioned conjugate gradient.
deallocate memory for real(RP) arrays
subroutine solve_start(k)
Reset krylov parameters before solving.
The type precond defines preconditioning for linear systems.
integer, parameter kry_gmres
GmRes linear solver.
subroutine, public cg(x, iter, res, b, A, tol, itmax, verb)
Conjugate gradient (no preconditioning)
subroutine krylov_solve_csr(x, k, b, mat)
SOLVE : KRYLOV no preconditioning.
The type krylov defines the settings of a linear solver.
x solution of LLT x = b, L lower diagonal LT = transpose(L)
integer, parameter, public sp
simple precision for real numbers
subroutine, public gmres(x, iter, nbPrd, res, b, A, tol, itmax, rst, verb)
GMRES (no preconditioning)
REAL NUMBERS PRECISION IN CHORAL: selects simple/double/quad
OPENMP OPERATIONS ON 1-DIMENSIONAL REAL ARRAYS
CG LINEAR SOLVER = Conjugate Gradient
real(rp) function e(x, v1, v2)
Derived type for sparse matrices in CSR format.
integer, parameter pc_jacobi
Jacobi diagonal preconditioning.
subroutine krylov_solve_pc(x, k, b, A, pc)
SOLVE : KRYLOV with preconditioning.
allocate memory for real(RP) arrays
subroutine krylov_solve_raw(x, k, b, A)
SOLVE : KRYLOV no preconditioning.
subroutine krylov_solve_prec(x, k, b, mat, pc)
KRYLOV with preconditioning defined with a prec type.
integer, parameter pc_icc0
Incomplete Cholesky, order 0.
type(krylov) function krylov_create(type, tol, itMax, restart, verb)
Constructor for the type krylov
subroutine solve_end(k)
ends up solving
subroutine prec_jac(y, x)
DERIVED TYPE precond: preconditioning for linear systems
subroutine prec_icc0(y, x)
DERIVED TYPE csr for sparse matrices
DERIVED TYPE krylov: for the resolution of linear systems
integer, parameter pc_0
void preconditioning
subroutine krylov_print(k)
Print a short description.
integer, parameter kry_cg
CG linear solver.
print a short description