18 deallocate_arnoldi_env,&
19 get_selected_ritz_val,&
47#include "./base/base_uses.f90"
53 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'preconditioner_solvers'
68 INTEGER :: my_solver_type
70 TYPE(
dbcsr_type),
OPTIONAL,
POINTER :: matrix_s
73 REAL(
dp) :: occ_matrix
77 SELECT CASE (my_solver_type)
82 CALL make_full_inverse_cholesky(preconditioner_env, matrix_s)
87 CALL make_full_fact_cholesky(preconditioner_env, matrix_s)
93 IF (
ASSOCIATED(preconditioner_env%sparse_matrix))
THEN
94 IF (preconditioner_env%condition_num < 0.0_dp) &
95 CALL estimate_cond_num(preconditioner_env%sparse_matrix, preconditioner_env%condition_num)
97 1.0_dp/preconditioner_env%condition_num*0.01_dp)
103 CALL make_full_inverse_cholesky(preconditioner_env, matrix_s)
106 CALL make_inverse_update(preconditioner_env, matrix_h)
112 cpabort(
"Doesn't know this type of solver")
122 SUBROUTINE make_full_inverse_cholesky(preconditioner_env, matrix_s)
125 TYPE(
dbcsr_type),
OPTIONAL,
POINTER :: matrix_s
127 CHARACTER(len=*),
PARAMETER :: routinen =
'make_full_inverse_cholesky'
129 INTEGER :: handle, info
133 CALL timeset(routinen, handle)
138 preconditioner_env%para_env, preconditioner_env%ctxt)
139 fm => preconditioner_env%fm
141 CALL cp_fm_create(fm_work, fm%matrix_struct, name=
"fm_work")
151 IF (
PRESENT(matrix_s))
THEN
163 CALL timestop(handle)
165 END SUBROUTINE make_full_inverse_cholesky
173 SUBROUTINE make_full_fact_cholesky(preconditioner_env, matrix_s)
176 TYPE(
dbcsr_type),
OPTIONAL,
POINTER :: matrix_s
178 CHARACTER(len=*),
PARAMETER :: routinen =
'make_full_fact_cholesky'
180 INTEGER :: handle, info_out
183 CALL timeset(routinen, handle)
188 preconditioner_env%para_env, preconditioner_env%ctxt)
190 fm => preconditioner_env%fm
196 IF (info_out .NE. 0)
THEN
199 IF (
PRESENT(matrix_s))
THEN
207 CALL timestop(handle)
209 END SUBROUTINE make_full_fact_cholesky
216 SUBROUTINE make_inverse_update(preconditioner_env, matrix_h)
220 CHARACTER(len=*),
PARAMETER :: routinen =
'make_inverse_update'
224 REAL(kind=
dp) :: filter_eps
226 CALL timeset(routinen, handle)
236 IF (.NOT.
ASSOCIATED(preconditioner_env%dbcsr_matrix))
THEN
239 CALL dbcsr_create(preconditioner_env%dbcsr_matrix,
"prec_dbcsr", &
240 template=matrix_h, matrix_type=dbcsr_type_no_symmetry)
244 filter_eps = 1.0_dp/preconditioner_env%condition_num*0.1_dp
247 CALL dbcsr_filter(preconditioner_env%dbcsr_matrix, filter_eps*100.0_dp)
249 CALL invert_hotelling(preconditioner_env%dbcsr_matrix, preconditioner_env%sparse_matrix, filter_eps*10.0_dp, &
250 use_inv_as_guess=use_guess, norm_convergence=0.4_dp, filter_eps=filter_eps)
252 CALL timestop(handle)
254 END SUBROUTINE make_inverse_update
262 SUBROUTINE estimate_cond_num(matrix, cond_num)
264 REAL(kind=
dp) :: cond_num
266 CHARACTER(len=*),
PARAMETER :: routinen =
'estimate_cond_num'
269 REAL(kind=
dp) :: max_ev, min_ev
270 TYPE(arnoldi_env_type) :: arnoldi_env
273 CALL timeset(routinen, handle)
276 ALLOCATE (matrices(1))
277 matrices(1)%matrix => matrix
279 CALL setup_arnoldi_env(arnoldi_env, matrices, max_iter=20, threshold=5.0e-4_dp, selection_crit=2, &
280 nval_request=1, nrestarts=15, generalized_ev=.false., iram=.false.)
282 max_ev = real(get_selected_ritz_val(arnoldi_env, 1),
dp)
283 CALL deallocate_arnoldi_env(arnoldi_env)
285 CALL setup_arnoldi_env(arnoldi_env, matrices, max_iter=20, threshold=5.0e-4_dp, selection_crit=3, &
286 nval_request=1, nrestarts=15, generalized_ev=.false., iram=.false.)
288 min_ev = real(get_selected_ritz_val(arnoldi_env, 1),
dp)
289 CALL deallocate_arnoldi_env(arnoldi_env)
291 cond_num = max_ev/min_ev
292 DEALLOCATE (matrices)
294 CALL timestop(handle)
295 END SUBROUTINE estimate_cond_num
306 TYPE(
dbcsr_type),
POINTER :: dbcsr_matrix, template_mat
308 CHARACTER(len=*),
PARAMETER :: routinen =
'transfer_fm_to_dbcsr'
312 CALL timeset(routinen, handle)
313 IF (
ASSOCIATED(fm_matrix))
THEN
314 IF (.NOT.
ASSOCIATED(dbcsr_matrix))
THEN
316 CALL dbcsr_create(dbcsr_matrix, template=template_mat, &
317 name=
"preconditioner_env%dbcsr_matrix", &
318 matrix_type=dbcsr_type_no_symmetry)
322 DEALLOCATE (fm_matrix)
326 CALL timestop(handle)
344 CHARACTER(len=*),
PARAMETER :: routinen =
'transfer_dbcsr_to_fm'
349 CALL timeset(routinen, handle)
350 IF (
ASSOCIATED(dbcsr_matrix))
THEN
351 NULLIFY (fm_struct_tmp)
353 IF (
ASSOCIATED(fm_matrix))
THEN
355 DEALLOCATE (fm_matrix)
360 context=context, para_env=para_env)
367 DEALLOCATE (dbcsr_matrix)
370 CALL timestop(handle)
arnoldi iteration using dbcsr
subroutine, public arnoldi_ev(matrix, arnoldi_env)
Driver routine for different arnoldi eigenvalue methods the selection which one is to be taken is mad...
collects all references to literature in CP2K as new algorithms / method are included from literature...
integer, save, public schiffmann2015
methods related to the blacs parallel environment
subroutine, public dbcsr_get_info(matrix, nblkrows_total, nblkcols_total, nfullrows_total, nfullcols_total, nblkrows_local, nblkcols_local, nfullrows_local, nfullcols_local, my_prow, my_pcol, local_rows, local_cols, proc_row_dist, proc_col_dist, row_blk_size, col_blk_size, row_blk_offset, col_blk_offset, distribution, name, matrix_type, group)
...
subroutine, public dbcsr_init_p(matrix)
...
subroutine, public dbcsr_filter(matrix, eps)
...
real(kind=dp) function, public dbcsr_get_occupation(matrix)
...
subroutine, public dbcsr_release(matrix)
...
DBCSR operations in CP2K.
subroutine, public copy_dbcsr_to_fm(matrix, fm)
Copy a DBCSR matrix to a BLACS matrix.
subroutine, public copy_fm_to_dbcsr(fm, matrix, keep_sparsity)
Copy a BLACS matrix to a dbcsr matrix.
basic linear algebra operations for full matrices
subroutine, public cp_fm_uplo_to_full(matrix, work, uplo)
given a triangular matrix according to uplo, computes the corresponding full matrix
various cholesky decomposition related routines
subroutine, public cp_fm_cholesky_invert(matrix, n, info_out)
used to replace the cholesky decomposition by the inverse
subroutine, public cp_fm_cholesky_decompose(matrix, n, info_out)
used to replace a symmetric positive def. matrix M with its cholesky decomposition U: M = U^T * U,...
represent the structure of a full matrix
subroutine, public cp_fm_struct_create(fmstruct, para_env, context, nrow_global, ncol_global, nrow_block, ncol_block, descriptor, first_p_pos, local_leading_dimension, template_fmstruct, square_blocks, force_block)
allocates and initializes a full matrix structure
subroutine, public cp_fm_struct_release(fmstruct)
releases a full matrix structure
represent a full matrix distributed on many processors
subroutine, public cp_fm_set_all(matrix, alpha, beta)
set all elements of a matrix to the same value, and optionally the diagonal to a different one
subroutine, public cp_fm_create(matrix, matrix_struct, name, use_sp)
creates a new full matrix with the given structure
Routines useful for iterative matrix calculations.
subroutine, public invert_hotelling(matrix_inverse, matrix, threshold, use_inv_as_guess, norm_convergence, filter_eps, accelerator_order, max_iter_lanczos, eps_lanczos, silent)
invert a symmetric positive definite matrix by Hotelling's method explicit symmetrization makes this ...
Defines the basic variable types.
integer, parameter, public dp
Interface to the message passing library MPI.
solves the preconditioner, contains to utility function for fm<->dbcsr transfers, should be moved soo...
subroutine, public transfer_dbcsr_to_fm(dbcsr_matrix, fm_matrix, para_env, context)
transfers a dbcsr to a full matrix
subroutine, public solve_preconditioner(my_solver_type, preconditioner_env, matrix_s, matrix_h)
...
subroutine, public transfer_fm_to_dbcsr(fm_matrix, dbcsr_matrix, template_mat)
transfers a full matrix to a dbcsr
represent a blacs multidimensional parallel environment (for the mpi corrispective see cp_paratypes/m...
keeps the information about the structure of a full matrix
stores all the informations relevant to an mpi environment