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)
THEN
95 CALL estimate_cond_num(preconditioner_env%sparse_matrix, preconditioner_env%condition_num)
98 1.0_dp/preconditioner_env%condition_num*0.01_dp)
104 CALL make_full_inverse_cholesky(preconditioner_env, matrix_s)
107 CALL make_inverse_update(preconditioner_env, matrix_h)
113 cpabort(
"Doesn't know this type of solver")
123 SUBROUTINE make_full_inverse_cholesky(preconditioner_env, matrix_s)
126 TYPE(
dbcsr_type),
OPTIONAL,
POINTER :: matrix_s
128 CHARACTER(len=*),
PARAMETER :: routinen =
'make_full_inverse_cholesky'
130 INTEGER :: handle, info
134 CALL timeset(routinen, handle)
139 preconditioner_env%para_env, preconditioner_env%ctxt)
140 fm => preconditioner_env%fm
142 CALL cp_fm_create(fm_work, fm%matrix_struct, name=
"fm_work")
152 IF (
PRESENT(matrix_s))
THEN
164 CALL timestop(handle)
166 END SUBROUTINE make_full_inverse_cholesky
174 SUBROUTINE make_full_fact_cholesky(preconditioner_env, matrix_s)
177 TYPE(
dbcsr_type),
OPTIONAL,
POINTER :: matrix_s
179 CHARACTER(len=*),
PARAMETER :: routinen =
'make_full_fact_cholesky'
181 INTEGER :: handle, info_out
184 CALL timeset(routinen, handle)
189 preconditioner_env%para_env, preconditioner_env%ctxt)
191 fm => preconditioner_env%fm
197 IF (info_out /= 0)
THEN
200 IF (
PRESENT(matrix_s))
THEN
208 CALL timestop(handle)
210 END SUBROUTINE make_full_fact_cholesky
217 SUBROUTINE make_inverse_update(preconditioner_env, matrix_h)
221 CHARACTER(len=*),
PARAMETER :: routinen =
'make_inverse_update'
225 REAL(kind=
dp) :: filter_eps
227 CALL timeset(routinen, handle)
237 IF (.NOT.
ASSOCIATED(preconditioner_env%dbcsr_matrix))
THEN
240 CALL dbcsr_create(preconditioner_env%dbcsr_matrix,
"prec_dbcsr", &
241 template=matrix_h, matrix_type=dbcsr_type_no_symmetry)
245 filter_eps = 1.0_dp/preconditioner_env%condition_num*0.1_dp
248 CALL dbcsr_filter(preconditioner_env%dbcsr_matrix, filter_eps*100.0_dp)
250 CALL invert_hotelling(preconditioner_env%dbcsr_matrix, preconditioner_env%sparse_matrix, filter_eps*10.0_dp, &
251 use_inv_as_guess=use_guess, norm_convergence=0.4_dp, filter_eps=filter_eps)
253 CALL timestop(handle)
255 END SUBROUTINE make_inverse_update
263 SUBROUTINE estimate_cond_num(matrix, cond_num)
265 REAL(kind=
dp) :: cond_num
267 CHARACTER(len=*),
PARAMETER :: routinen =
'estimate_cond_num'
270 REAL(kind=
dp) :: max_ev, min_ev
271 TYPE(arnoldi_env_type) :: arnoldi_env
274 CALL timeset(routinen, handle)
277 ALLOCATE (matrices(1))
278 matrices(1)%matrix => matrix
280 CALL setup_arnoldi_env(arnoldi_env, matrices, max_iter=20, threshold=5.0e-4_dp, selection_crit=2, &
281 nval_request=1, nrestarts=15, generalized_ev=.false., iram=.false.)
283 max_ev = real(get_selected_ritz_val(arnoldi_env, 1),
dp)
284 CALL deallocate_arnoldi_env(arnoldi_env)
286 CALL setup_arnoldi_env(arnoldi_env, matrices, max_iter=20, threshold=5.0e-4_dp, selection_crit=3, &
287 nval_request=1, nrestarts=15, generalized_ev=.false., iram=.false.)
289 min_ev = real(get_selected_ritz_val(arnoldi_env, 1),
dp)
290 CALL deallocate_arnoldi_env(arnoldi_env)
292 cond_num = max_ev/min_ev
293 DEALLOCATE (matrices)
295 CALL timestop(handle)
296 END SUBROUTINE estimate_cond_num
307 TYPE(
dbcsr_type),
POINTER :: dbcsr_matrix, template_mat
309 CHARACTER(len=*),
PARAMETER :: routinen =
'transfer_fm_to_dbcsr'
313 CALL timeset(routinen, handle)
314 IF (
ASSOCIATED(fm_matrix))
THEN
315 IF (.NOT.
ASSOCIATED(dbcsr_matrix))
THEN
317 CALL dbcsr_create(dbcsr_matrix, template=template_mat, &
318 name=
"preconditioner_env%dbcsr_matrix", &
319 matrix_type=dbcsr_type_no_symmetry)
323 DEALLOCATE (fm_matrix)
327 CALL timestop(handle)
345 CHARACTER(len=*),
PARAMETER :: routinen =
'transfer_dbcsr_to_fm'
350 CALL timeset(routinen, handle)
351 IF (
ASSOCIATED(dbcsr_matrix))
THEN
352 NULLIFY (fm_struct_tmp)
354 IF (
ASSOCIATED(fm_matrix))
THEN
356 DEALLOCATE (fm_matrix)
361 context=context, para_env=para_env)
368 DEALLOCATE (dbcsr_matrix)
371 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, nrow, ncol, set_zero)
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