28#include "../base/base_uses.f90"
59 nval_request, nrestarts, generalized_ev, iram)
64 INTEGER :: selection_crit, nval_request, nrestarts
65 LOGICAL :: generalized_ev, iram
67 CALL setup_arnoldi_control(arnoldi_env, matrix, max_iter, threshold, selection_crit, &
68 nval_request, nrestarts, generalized_ev, iram)
70 CALL setup_arnoldi_data(arnoldi_env, matrix, max_iter)
80 SUBROUTINE setup_arnoldi_data(arnoldi_env, matrix, max_iter)
89 CALL dbcsr_get_info(matrix=matrix(1)%matrix, nfullrows_local=nrow_local)
90 ALLOCATE (ar_data%f_vec(nrow_local))
91 ALLOCATE (ar_data%x_vec(nrow_local))
92 ALLOCATE (ar_data%Hessenberg(max_iter + 1, max_iter))
93 ALLOCATE (ar_data%local_history(nrow_local, max_iter))
95 ALLOCATE (ar_data%evals(max_iter))
96 ALLOCATE (ar_data%revec(max_iter, max_iter))
100 END SUBROUTINE setup_arnoldi_data
114 SUBROUTINE setup_arnoldi_control(arnoldi_env, matrix, max_iter, threshold, selection_crit, &
115 nval_request, nrestarts, generalized_ev, iram)
119 REAL(
dp) :: threshold
120 INTEGER :: selection_crit, nval_request, nrestarts
121 LOGICAL :: generalized_ev, iram
123 INTEGER :: group_handle, pcol_handle
124 LOGICAL :: subgroups_defined
133 group=group_handle, &
134 mynode=control%myproc, &
135 subgroups_defined=subgroups_defined, &
136 pcol_group=pcol_handle)
138 CALL control%mp_group%set_handle(group_handle)
139 CALL control%pcol_group%set_handle(pcol_handle)
141 IF (.NOT. subgroups_defined) &
142 cpabort(
"arnoldi only with subgroups")
144 control%symmetric = .false.
146 IF (
SIZE(matrix) == 1) &
150 control%max_iter = max_iter
151 control%current_step = 0
152 control%selection_crit = selection_crit
153 control%nval_req = nval_request
154 control%threshold = threshold
155 control%converged = .false.
156 control%has_initial_vector = .false.
158 control%nrestart = nrestarts
159 control%generalized_ev = generalized_ev
161 IF (control%nval_req > 1 .AND. control%nrestart > 0 .AND. .NOT. control%iram) &
162 CALL cp_abort(__location__,
'with more than one eigenvalue requested '// &
163 'internal restarting with a previous EVEC is a bad idea, set IRAM or nrestsart=0')
166 IF (control%generalized_ev .AND. selection_crit == 1) &
167 CALL cp_abort(__location__, &
168 'generalized ev can only highest OR lowest EV')
169 IF (control%generalized_ev .AND. nval_request .NE. 1) &
170 CALL cp_abort(__location__, &
171 'generalized ev can only compute one EV at the time')
172 IF (control%generalized_ev .AND. control%nrestart == 0) &
173 CALL cp_abort(__location__, &
174 'outer loops are mandatory for generalized EV, set nrestart appropriatly')
175 IF (
SIZE(matrix) .NE. 2 .AND. control%generalized_ev) &
176 CALL cp_abort(__location__, &
177 'generalized ev needs exactly two matrices as input (2nd is the metric)')
179 ALLOCATE (control%selected_ind(max_iter))
182 END SUBROUTINE setup_arnoldi_control
196 COMPLEX(dp),
ALLOCATABLE,
DIMENSION(:) :: ritz_v
197 INTEGER :: i, myind, sspace_size, vsize
198 INTEGER,
DIMENSION(:),
POINTER :: selected_ind
199 REAL(kind=
dp),
DIMENSION(:),
POINTER :: data_vec
206 sspace_size = get_subsp_size(arnoldi_env)
207 vsize =
SIZE(ar_data%f_vec)
208 myind = selected_ind(ind)
209 ALLOCATE (ritz_v(vsize))
210 ritz_v = cmplx(0.0, 0.0,
dp)
214 IF (control%local_comp)
THEN
215 DO i = 1, sspace_size
216 ritz_v(:) = ritz_v(:) + ar_data%local_history(:, i)*ar_data%revec(i, myind)
221 data_vec(1:vsize) = real(ritz_v(1:vsize), kind=
dp)
239 IF (
ASSOCIATED(ar_data%f_vec))
DEALLOCATE (ar_data%f_vec)
240 IF (
ASSOCIATED(ar_data%x_vec))
DEALLOCATE (ar_data%x_vec)
241 IF (
ASSOCIATED(ar_data%Hessenberg))
DEALLOCATE (ar_data%Hessenberg)
242 IF (
ASSOCIATED(ar_data%local_history))
DEALLOCATE (ar_data%local_history)
243 IF (
ASSOCIATED(ar_data%evals))
DEALLOCATE (ar_data%evals)
244 IF (
ASSOCIATED(ar_data%revec))
DEALLOCATE (ar_data%revec)
248 DEALLOCATE (control%selected_ind)
260 INTEGER :: i, last_el, my_crit, my_ind
261 REAL(
dp) :: convergence
268 last_el = control%current_step
269 convergence = real(0.0,
dp)
270 my_crit = control%selection_crit
271 control%nval_out = min(control%nval_req, control%current_step)
272 SELECT CASE (my_crit)
275 CALL index_min_max_real_eval(ar_data%evals, control%current_step, control%selected_ind, control%nval_out)
278 CALL index_nmax_real_eval(ar_data%evals, control%current_step, control%selected_ind, control%nval_out)
281 CALL index_nmin_real_eval(ar_data%evals, control%current_step, control%selected_ind, control%nval_out)
283 cpabort(
"unknown selection index")
286 DO i = 1, control%nval_out
287 my_ind = control%selected_ind(i)
288 convergence = max(convergence, &
289 abs(ar_data%revec(last_el, my_ind)*ar_data%Hessenberg(last_el + 1, last_el)))
291 control%converged = convergence .LT. control%threshold
300 SUBROUTINE set_eval_selection(arnoldi_env, itype)
307 control%selection_crit = itype
308 END SUBROUTINE set_eval_selection
322 nrestart = control%nrestart
331 FUNCTION get_nval_out(arnoldi_env)
RESULT(nval_out)
338 nval_out = control%nval_out
340 END FUNCTION get_nval_out
347 FUNCTION get_subsp_size(arnoldi_env)
RESULT(current_step)
349 INTEGER :: current_step
354 current_step = control%current_step
356 END FUNCTION get_subsp_size
370 converged = control%converged
383 COMPLEX(dp) :: eval_out
385 COMPLEX(dp),
DIMENSION(:),
POINTER :: evals
387 INTEGER,
DIMENSION(:),
POINTER :: selected_ind
389 IF (ind .GT. get_nval_out(arnoldi_env)) &
390 cpabort(
'outside range of indexed evals')
393 ev_ind = selected_ind(ind)
395 eval_out = evals(ev_ind)
405 SUBROUTINE get_all_selected_ritz_val(arnoldi_env, eval_out)
407 COMPLEX(dp),
DIMENSION(:) :: eval_out
409 COMPLEX(dp),
DIMENSION(:),
POINTER :: evals
410 INTEGER :: ev_ind, ind
411 INTEGER,
DIMENSION(:),
POINTER :: selected_ind
414 IF (
SIZE(eval_out) .LT. get_nval_out(arnoldi_env)) &
415 cpabort(
'array for eval output too small')
420 DO ind = 1, get_nval_out(arnoldi_env)
421 ev_ind = selected_ind(ind)
422 eval_out(ind) = evals(ev_ind)
425 END SUBROUTINE get_all_selected_ritz_val
436 INTEGER :: ncol_local, nrow_local
437 REAL(kind=
dp),
DIMENSION(:),
POINTER :: data_vec
442 control%has_initial_vector = .true.
445 CALL dbcsr_get_info(matrix=vector, nfullrows_local=nrow_local, nfullcols_local=ncol_local)
447 IF (nrow_local*ncol_local > 0) ar_data%f_vec(1:nrow_local) = data_vec(1:nrow_local)
462 SUBROUTINE index_min_max_real_eval(evals, current_step, selected_ind, neval)
463 COMPLEX(dp),
DIMENSION(:) :: evals
464 INTEGER,
INTENT(IN) :: current_step
465 INTEGER,
DIMENSION(:) :: selected_ind
469 INTEGER,
DIMENSION(current_step) :: indexing
470 REAL(
dp),
DIMENSION(current_step) :: tmp_array
474 tmp_array(1:current_step) = real(evals(1:current_step),
dp)
475 CALL sort(tmp_array, current_step, indexing)
476 DO i = 1, current_step
477 IF (abs(aimag(evals(indexing(i)))) < epsilon(0.0_dp))
THEN
478 selected_ind(1) = indexing(i)
483 DO i = current_step, 1, -1
484 IF (abs(aimag(evals(indexing(i)))) < epsilon(0.0_dp))
THEN
485 selected_ind(2) = indexing(i)
491 END SUBROUTINE index_min_max_real_eval
500 SUBROUTINE index_nmax_real_eval(evals, current_step, selected_ind, neval)
501 COMPLEX(dp),
DIMENSION(:) :: evals
502 INTEGER,
INTENT(IN) :: current_step
503 INTEGER,
DIMENSION(:) :: selected_ind
507 INTEGER,
DIMENSION(current_step) :: indexing
508 REAL(
dp),
DIMENSION(current_step) :: tmp_array
510 nlimit = neval; neval = 0
512 tmp_array(1:current_step) = real(evals(1:current_step),
dp)
513 CALL sort(tmp_array, current_step, indexing)
514 DO i = 1, current_step
515 IF (abs(aimag(evals(indexing(current_step + 1 - i)))) < epsilon(0.0_dp))
THEN
516 selected_ind(i) = indexing(current_step + 1 - i)
518 IF (neval == nlimit)
EXIT
522 END SUBROUTINE index_nmax_real_eval
531 SUBROUTINE index_nmin_real_eval(evals, current_step, selected_ind, neval)
532 COMPLEX(dp),
DIMENSION(:) :: evals
533 INTEGER,
INTENT(IN) :: current_step
534 INTEGER,
DIMENSION(:) :: selected_ind
538 INTEGER,
DIMENSION(current_step) :: indexing
539 REAL(
dp),
DIMENSION(current_step) :: tmp_array
541 nlimit = neval; neval = 0
543 tmp_array(1:current_step) = real(evals(1:current_step),
dp)
544 CALL sort(tmp_array, current_step, indexing)
545 DO i = 1, current_step
546 IF (abs(aimag(evals(indexing(i)))) < epsilon(0.0_dp))
THEN
547 selected_ind(i) = indexing(i)
549 IF (neval == nlimit)
EXIT
553 END SUBROUTINE index_nmin_real_eval
The methods which allow to analyze and manipulate the arnoldi procedure The main routine and this sho...
subroutine, public deallocate_arnoldi_env(arnoldi_env)
Deallocate the data in arnoldi_env.
integer function, public get_nrestart(arnoldi_env)
returns the number of restarts allowed for arnoldi
logical function, public arnoldi_is_converged(arnoldi_env)
Find out whether the method with the current search criterion is converged.
subroutine, public get_selected_ritz_vector(arnoldi_env, ind, matrix, vector)
...
subroutine, public select_evals(arnoldi_env)
perform the selection of eigenvalues, fills the selected_ind array
subroutine, public setup_arnoldi_env(arnoldi_env, matrix, max_iter, threshold, selection_crit, nval_request, nrestarts, generalized_ev, iram)
This routine sets the environment for the arnoldi iteration and the krylov subspace creation....
subroutine, public set_arnoldi_initial_vector(arnoldi_env, vector)
...
complex(dp) function, public get_selected_ritz_val(arnoldi_env, ind)
get a single specific Ritz value from the set of selected
collection of types used in arnoldi
complex(dp) function, dimension(:), pointer, public get_evals(arnoldi_env)
...
type(arnoldi_data_type) function, pointer, public get_data(arnoldi_env)
...
type(arnoldi_control_type) function, pointer, public get_control(arnoldi_env)
...
subroutine, public set_control(arnoldi_env, control)
...
subroutine, public set_data(arnoldi_env, ar_data)
...
integer function, dimension(:), pointer, public get_sel_ind(arnoldi_env)
...
operations for skinny matrices/vectors expressed in dbcsr form
subroutine, public create_col_vec_from_matrix(dbcsr_vec, matrix, ncol)
creates a dbcsr col vector like object which lives on proc_col 0 and has the same row dist as the tem...
character function, public dbcsr_get_matrix_type(matrix)
...
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)
...
real(kind=dp) function, dimension(:), pointer, public dbcsr_get_data_p(matrix, lb, ub)
...
subroutine, public dbcsr_release(matrix)
...
subroutine, public dbcsr_mp_grid_setup(dist)
...
subroutine, public dbcsr_distribution_get(dist, row_dist, col_dist, nrows, ncols, has_threads, group, mynode, numnodes, nprows, npcols, myprow, mypcol, pgrid, subgroups_defined, prow_group, pcol_group)
...
Defines the basic variable types.
integer, parameter, public dp
All kind of helpful little routines.