17 arnoldi_symm_local_diag, &
18 arnoldi_tridiag_local_diag
23 USE dbcsr_api,
ONLY: &
24 dbcsr_add, dbcsr_copy, dbcsr_get_data_p, dbcsr_get_info, dbcsr_iterator_blocks_left, &
25 dbcsr_iterator_next_block, dbcsr_iterator_start, dbcsr_iterator_stop, dbcsr_iterator_type, &
26 dbcsr_p_type, dbcsr_scale, dbcsr_type
30 #include "../base/base_uses.f90"
36 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'arnoldi_methods'
41 INTERFACE convert_matrix
42 MODULE PROCEDURE convert_matrix_z_to_d
43 MODULE PROCEDURE convert_matrix_d_to_z
44 MODULE PROCEDURE convert_matrix_z_to_z
57 CHARACTER(LEN=*),
PARAMETER :: routinen =
'arnoldi_iram'
61 CALL timeset(routinen, handle)
63 IF (
has_d_real(arnoldi_data))
CALL arnoldi_iram_d(arnoldi_data)
64 IF (
has_d_cmplx(arnoldi_data))
CALL arnoldi_iram_z(arnoldi_data)
78 CHARACTER(LEN=*),
PARAMETER :: routinen =
'compute_evals'
82 CALL timeset(routinen, handle)
84 IF (
has_d_real(arnoldi_data))
CALL compute_evals_d(arnoldi_data)
85 IF (
has_d_cmplx(arnoldi_data))
CALL compute_evals_z(arnoldi_data)
100 TYPE(dbcsr_p_type),
DIMENSION(:) :: matrix
104 CHARACTER(LEN=*),
PARAMETER :: routinen =
'arnoldi_init'
108 CALL timeset(routinen, handle)
110 IF (
has_d_real(arnoldi_data))
CALL arnoldi_init_d(matrix, vectors, arnoldi_data)
111 IF (
has_d_cmplx(arnoldi_data))
CALL arnoldi_init_z(matrix, vectors, arnoldi_data)
113 CALL timestop(handle)
126 TYPE(dbcsr_p_type),
DIMENSION(:) :: matrix, matrix_arnoldi
130 CHARACTER(LEN=*),
PARAMETER :: routinen =
'gev_arnoldi_init'
134 CALL timeset(routinen, handle)
136 IF (
has_d_real(arnoldi_data))
CALL gev_arnoldi_init_d(matrix, matrix_arnoldi, vectors, arnoldi_data)
137 IF (
has_d_cmplx(arnoldi_data))
CALL gev_arnoldi_init_z(matrix, matrix_arnoldi, vectors, arnoldi_data)
139 CALL timestop(handle)
150 TYPE(dbcsr_p_type),
DIMENSION(:) :: matrix
154 CHARACTER(LEN=*),
PARAMETER :: routinen =
'build_subspace'
158 CALL timeset(routinen, handle)
160 IF (
has_d_real(arnoldi_data))
CALL build_subspace_d(matrix, vectors, arnoldi_data)
161 IF (
has_d_cmplx(arnoldi_data))
CALL build_subspace_z(matrix, vectors, arnoldi_data)
163 CALL timestop(handle)
175 TYPE(dbcsr_p_type),
DIMENSION(:) :: matrix
179 CHARACTER(LEN=*),
PARAMETER :: routinen =
'gev_build_subspace'
183 CALL timeset(routinen, handle)
185 IF (
has_d_real(arnoldi_data))
CALL gev_build_subspace_d(matrix, vectors, arnoldi_data)
186 IF (
has_d_cmplx(arnoldi_data))
CALL gev_build_subspace_z(matrix, vectors, arnoldi_data)
188 CALL timestop(handle)
202 TYPE(dbcsr_p_type),
DIMENSION(:) :: matrix, matrix_arnoldi
206 CHARACTER(LEN=*),
PARAMETER :: routinen =
'gev_update_data'
210 CALL timeset(routinen, handle)
212 IF (
has_d_real(arnoldi_data))
CALL gev_update_data_d(matrix, matrix_arnoldi, vectors, arnoldi_data)
213 IF (
has_d_cmplx(arnoldi_data))
CALL gev_update_data_z(matrix, matrix_arnoldi, vectors, arnoldi_data)
215 CALL timestop(handle)
224 SUBROUTINE convert_matrix_z_to_d(m_out, m_in)
225 REAL(
real_8),
DIMENSION(:, :) :: m_out
226 COMPLEX(real_8),
DIMENSION(:, :) :: m_in
228 m_out(:, :) = real(m_in(:, :), kind=
real_8)
229 END SUBROUTINE convert_matrix_z_to_d
236 SUBROUTINE convert_matrix_d_to_z(m_out, m_in)
237 COMPLEX(real_8),
DIMENSION(:, :) :: m_out
238 REAL(
real_8),
DIMENSION(:, :) :: m_in
240 m_out(:, :) = cmplx(m_in, 0.0, kind=
real_8)
241 END SUBROUTINE convert_matrix_d_to_z
249 SUBROUTINE convert_matrix_z_to_z(m_out, m_in)
250 COMPLEX(real_8),
DIMENSION(:, :) :: m_out, m_in
253 END SUBROUTINE convert_matrix_z_to_z
260 SUBROUTINE compute_evals_d (arnoldi_data)
263 COMPLEX(real_8),
DIMENSION(:, :),
ALLOCATABLE :: levec
270 ndim = control%current_step
271 ALLOCATE (levec(ndim, ndim))
275 IF (control%generalized_ev)
THEN
276 CALL arnoldi_symm_local_diag(
'V', ar_data%Hessenberg(1:ndim, 1:ndim), ndim, &
277 ar_data%evals(1:ndim), ar_data%revec(1:ndim, 1:ndim))
279 IF (control%symmetric)
THEN
280 CALL arnoldi_tridiag_local_diag(
'N',
'V', ar_data%Hessenberg(1:ndim, 1:ndim), ndim, &
281 ar_data%evals(1:ndim), ar_data%revec(1:ndim, 1:ndim), levec)
283 CALL arnoldi_general_local_diag(
'N',
'V', ar_data%Hessenberg(1:ndim, 1:ndim), ndim, &
284 ar_data%evals(1:ndim), ar_data%revec(1:ndim, 1:ndim), levec)
290 END SUBROUTINE compute_evals_d
299 SUBROUTINE arnoldi_init_d (matrix, vectors, arnoldi_data)
300 TYPE(dbcsr_p_type),
DIMENSION(:) :: matrix
304 INTEGER :: i, iseed(4), row_size, col_size, &
305 nrow_local, ncol_local, &
308 TYPE(dbcsr_iterator_type) :: iter
310 REAL(kind=
real_8),
DIMENSION(:),
ALLOCATABLE :: &
312 REAL(kind=
real_8),
DIMENSION(:),
POINTER :: data_vec
313 LOGICAL :: local_comp
316 TYPE(mp_comm_type) :: pcol_group
319 pcol_group = control%pcol_group
320 local_comp = control%local_comp
325 CALL dbcsr_get_info(matrix=vectors%input_vec, nfullrows_local=nrow_local, nfullcols_local=ncol_local)
326 ALLOCATE (v_vec(nrow_local))
327 ALLOCATE (w_vec(nrow_local))
328 v_vec = 0.0_real_8; w_vec = 0.0_real_8
329 ar_data%Hessenberg = 0.0_real_8
331 IF (control%has_initial_vector)
THEN
333 CALL transfer_local_array_to_dbcsr_d (vectors%input_vec, ar_data%f_vec, nrow_local, control%local_comp)
336 CALL dbcsr_iterator_start(iter, vectors%input_vec)
337 DO WHILE (dbcsr_iterator_blocks_left(iter))
338 CALL dbcsr_iterator_next_block(iter, row, col, data_vec, row_size=row_size, col_size=col_size)
339 iseed(1) = 2; iseed(2) = mod(row, 4095); iseed(3) = mod(col, 4095); iseed(4) = 11
340 CALL dlarnv(2, iseed, row_size*col_size, data_vec)
342 CALL dbcsr_iterator_stop(iter)
345 CALL transfer_dbcsr_to_local_array_d (vectors%input_vec, v_vec, nrow_local, control%local_comp)
348 CALL compute_norms_d (v_vec, norm, rnorm, control%pcol_group)
350 IF (rnorm == 0) rnorm = 1
351 CALL dbcsr_scale(vectors%input_vec, real(1.0,
real_8)/rnorm)
354 CALL transfer_dbcsr_to_local_array_d (vectors%input_vec, v_vec, nrow_local, control%local_comp)
357 DO i = 1,
SIZE(matrix)
358 CALL dbcsr_matrix_colvec_multiply(matrix(i)%matrix, vectors%input_vec, vectors%result_vec, 1.0_real_8, &
359 0.0_real_8, vectors%rep_row_vec, vectors%rep_col_vec)
360 CALL dbcsr_copy(vectors%input_vec, vectors%result_vec)
363 CALL transfer_dbcsr_to_local_array_d (vectors%result_vec, w_vec, nrow_local, control%local_comp)
366 ar_data%Hessenberg(1, 1) = dot_product(v_vec, w_vec)
367 CALL pcol_group%sum(ar_data%Hessenberg(1, 1))
368 ar_data%f_vec = w_vec - v_vec*ar_data%Hessenberg(1, 1)
370 ar_data%local_history(:, 1) = v_vec(:)
373 control%current_step = 1
375 DEALLOCATE (v_vec, w_vec)
377 END SUBROUTINE arnoldi_init_d
387 SUBROUTINE arnoldi_iram_d (arnoldi_data)
392 COMPLEX(real_8),
DIMENSION(:, :),
ALLOCATABLE :: tmp_mat, safe_mat, q, tmp_mat1
393 COMPLEX(real_8),
DIMENSION(:),
ALLOCATABLE :: work, tau, work_measure
394 INTEGER :: msize, lwork, i, j, info, nwant
395 REAL(kind=
real_8) :: beta, sigma
396 REAL(kind=
real_8),
DIMENSION(:, :),
ALLOCATABLE :: qdata
401 msize = control%current_step
402 nwant = control%nval_out
403 ALLOCATE (tmp_mat(msize, msize));
ALLOCATE (safe_mat(msize, msize))
404 ALLOCATE (q(msize, msize));
ALLOCATE (tmp_mat1(msize, msize))
405 ALLOCATE (work_measure(1))
406 ALLOCATE (tau(msize));
ALLOCATE (qdata(msize, msize))
408 q = cmplx(0.0, 0.0,
real_8)
410 q(i, i) = cmplx(1.0, 0.0,
real_8)
414 CALL convert_matrix(tmp_mat, ar_data%Hessenberg(1:msize, 1:msize))
415 safe_mat(:, :) = tmp_mat(:, :)
419 IF (any(control%selected_ind == i)) cycle
422 tmp_mat(j, j) = tmp_mat(j, j) - ar_data%evals(i)
426 CALL zgeqrf(msize, msize, tmp_mat, msize, tau, work_measure, lwork, info)
427 lwork = int(work_measure(1))
428 IF (
ALLOCATED(work))
THEN
429 IF (
SIZE(work) .LT. lwork)
THEN
433 IF (.NOT.
ALLOCATED(work))
ALLOCATE (work(lwork))
434 CALL zgeqrf(msize, msize, tmp_mat, msize, tau, work, lwork, info)
436 CALL zungqr(msize, msize, msize, tmp_mat, msize, tau, work, lwork, info)
438 tmp_mat1(:, :) = q(:, :)
439 CALL zgemm(
'N',
'N', msize, msize, msize, cmplx(1.0, 0.0,
real_8), tmp_mat1, msize, tmp_mat, msize, cmplx(0.0, 0.0,&
443 CALL zgemm(
'C',
'N', msize, msize, msize, cmplx(1.0, 0.0,
real_8), tmp_mat, msize, safe_mat, msize, cmplx(0.0, 0.0,&
446 CALL zgemm(
'N',
'N', msize, msize, msize, cmplx(1.0, 0.0,
real_8), tmp_mat1, msize, tmp_mat, msize, cmplx(0.0, 0.0,&
452 safe_mat(j + 2:msize, j) = cmplx(0.0, 0.0,
real_8)
454 tmp_mat(:, :) = safe_mat(:, :)
458 ar_data%Hessenberg = 0.0_real_8
459 CALL convert_matrix(ar_data%Hessenberg(1:msize, 1:msize), safe_mat)
460 CALL convert_matrix(qdata, q)
462 beta = ar_data%Hessenberg(nwant + 1, nwant); sigma = qdata(msize, nwant)
465 IF (control%local_comp)
THEN
466 ar_data%f_vec = matmul(ar_data%local_history(:, 1:msize), qdata(1:msize, nwant + 1))*beta + ar_data%f_vec(:)*sigma
467 ar_data%local_history(:, 1:nwant) = matmul(ar_data%local_history(:, 1:msize), qdata(1:msize, 1:nwant))
470 control%current_step = nwant
472 DEALLOCATE (tmp_mat, safe_mat, q, qdata, tmp_mat1, work, tau, work_measure)
474 END SUBROUTINE arnoldi_iram_d
486 SUBROUTINE build_subspace_d (matrix, vectors, arnoldi_data)
487 TYPE(dbcsr_p_type),
DIMENSION(:) :: matrix
491 INTEGER :: i, j, ncol_local, nrow_local
496 REAL(kind=
real_8),
ALLOCATABLE,
DIMENSION(:) :: h_vec, s_vec, v_vec, w_vec
497 TYPE(dbcsr_type),
POINTER :: input_vec, result_vec, swap_vec
501 control%converged = .false.
504 CALL dbcsr_get_info(matrix=vectors%input_vec, nfullrows_local=nrow_local, nfullcols_local=ncol_local)
505 ALLOCATE (v_vec(nrow_local));
ALLOCATE (w_vec(nrow_local))
506 v_vec = 0.0_real_8; w_vec = 0.0_real_8
507 ALLOCATE (s_vec(control%max_iter));
ALLOCATE (h_vec(control%max_iter))
509 DO j = control%current_step, control%max_iter - 1
512 CALL compute_norms_d (ar_data%f_vec, norm, rnorm, control%pcol_group)
515 IF (control%myproc == 0) control%converged = rnorm .LT. real(control%threshold,
real_8)
516 CALL control%mp_group%bcast(control%converged, 0)
517 IF (control%converged)
EXIT
520 IF (rnorm == 0) rnorm = 1
521 v_vec(:) = ar_data%f_vec(:)/rnorm; ar_data%local_history(:, j + 1) = v_vec(:); ar_data%Hessenberg(j + 1, j) = norm
523 input_vec => vectors%input_vec
524 result_vec => vectors%result_vec
525 CALL transfer_local_array_to_dbcsr_d (input_vec, v_vec, nrow_local, control%local_comp)
528 DO i = 1,
SIZE(matrix)
529 CALL dbcsr_matrix_colvec_multiply(matrix(i)%matrix, input_vec, result_vec, 1.0_real_8, &
530 0.0_real_8, vectors%rep_row_vec, vectors%rep_col_vec)
531 swap_vec => input_vec
532 input_vec => result_vec
533 result_vec => swap_vec
536 CALL transfer_dbcsr_to_local_array_d (input_vec, w_vec, nrow_local, control%local_comp)
539 CALL gram_schmidt_ortho_d (h_vec, ar_data%f_vec, s_vec, w_vec, nrow_local, j + 1, &
540 ar_data%local_history, ar_data%local_history, control%local_comp, control%pcol_group)
544 CALL dgks_ortho_d (h_vec, ar_data%f_vec, s_vec, nrow_local, j + 1, ar_data%local_history, &
545 ar_data%local_history, control%local_comp, control%pcol_group)
547 ar_data%Hessenberg(1:j + 1, j + 1) = h_vec(1:j + 1)
548 control%current_step = j + 1
552 CALL compute_norms_d (ar_data%f_vec, norm, rnorm, control%pcol_group)
553 ar_data%Hessenberg(control%current_step + 1, control%current_step) = norm
556 CALL control%mp_group%bcast(ar_data%Hessenberg, 0)
558 DEALLOCATE (v_vec, w_vec, h_vec, s_vec)
560 END SUBROUTINE build_subspace_d
569 SUBROUTINE transfer_dbcsr_to_local_array_d (vec, array, n, is_local)
570 TYPE(dbcsr_type) :: vec
571 REAL(kind=
real_8),
DIMENSION(:) :: array
574 REAL(kind=
real_8),
DIMENSION(:),
POINTER :: data_vec
576 data_vec => dbcsr_get_data_p(vec, select_data_type=0.0_real_8)
577 IF (is_local) array(1:n) = data_vec(1:n)
579 END SUBROUTINE transfer_dbcsr_to_local_array_d
588 SUBROUTINE transfer_local_array_to_dbcsr_d (vec, array, n, is_local)
589 TYPE(dbcsr_type) :: vec
590 REAL(kind=
real_8),
DIMENSION(:) :: array
593 REAL(kind=
real_8),
DIMENSION(:),
POINTER :: data_vec
595 data_vec => dbcsr_get_data_p(vec, select_data_type=0.0_real_8)
596 IF (is_local) data_vec(1:n) = array(1:n)
598 END SUBROUTINE transfer_local_array_to_dbcsr_d
613 SUBROUTINE gram_schmidt_ortho_d (h_vec, f_vec, s_vec, w_vec, nrow_local, &
614 j, local_history, reorth_mat, local_comp, pcol_group)
615 REAL(kind=
real_8),
DIMENSION(:) :: h_vec, s_vec, f_vec, w_vec
616 REAL(kind=
real_8),
DIMENSION(:, :) :: local_history, reorth_mat
617 INTEGER :: nrow_local, j
618 TYPE(mp_comm_type),
INTENT(IN) :: pcol_group
619 LOGICAL :: local_comp
621 CHARACTER(LEN=*),
PARAMETER :: routinen =
'Gram_Schmidt_ortho_d'
624 CALL timeset(routinen, handle)
627 h_vec = 0.0_real_8; f_vec = 0.0_real_8; s_vec = 0.0_real_8
628 IF (local_comp)
CALL dgemv(
'T', nrow_local, j, 1.0_real_8, local_history, &
629 nrow_local, w_vec, 1, 0.0_real_8, h_vec, 1)
630 CALL pcol_group%sum(h_vec(1:j))
632 IF (local_comp)
CALL dgemv(
'N', nrow_local, j, 1.0_real_8, reorth_mat, &
633 nrow_local, h_vec, 1, 0.0_real_8, f_vec, 1)
634 f_vec(:) = w_vec(:) - f_vec(:)
636 CALL timestop(handle)
638 END SUBROUTINE gram_schmidt_ortho_d
652 SUBROUTINE dgks_ortho_d (h_vec, f_vec, s_vec, nrow_local, j, &
653 local_history, reorth_mat, local_comp, pcol_group)
654 REAL(kind=
real_8),
DIMENSION(:) :: h_vec, s_vec, f_vec
655 REAL(kind=
real_8),
DIMENSION(:, :) :: local_history, reorth_mat
656 INTEGER :: nrow_local, j
657 TYPE(mp_comm_type),
INTENT(IN) :: pcol_group
659 CHARACTER(LEN=*),
PARAMETER :: routinen =
'DGKS_ortho_d'
660 LOGICAL :: local_comp
663 CALL timeset(routinen, handle)
665 IF (local_comp)
CALL dgemv(
'T', nrow_local, j, 1.0_real_8, local_history, &
666 nrow_local, f_vec, 1, 0.0_real_8, s_vec, 1)
667 CALL pcol_group%sum(s_vec(1:j))
668 IF (local_comp)
CALL dgemv(
'N', nrow_local, j, -1.0_real_8, reorth_mat, &
669 nrow_local, s_vec, 1, 1.0_real_8, f_vec, 1)
670 h_vec(1:j) = h_vec(1:j) + s_vec(1:j)
672 CALL timestop(handle)
674 END SUBROUTINE dgks_ortho_d
684 SUBROUTINE compute_norms_d (vec, norm, rnorm, pcol_group)
685 REAL(kind=
real_8),
DIMENSION(:) :: vec
688 TYPE(mp_comm_type),
INTENT(IN) :: pcol_group
691 norm = dot_product(vec, vec)
692 CALL pcol_group%sum(norm)
693 rnorm = sqrt(real(norm,
real_8))
696 END SUBROUTINE compute_norms_d
707 SUBROUTINE gev_arnoldi_init_d (matrix, matrix_arnoldi, vectors, arnoldi_data)
708 TYPE(dbcsr_p_type),
DIMENSION(:) :: matrix
709 TYPE(dbcsr_p_type),
DIMENSION(:) :: matrix_arnoldi
713 INTEGER :: iseed(4), row_size, col_size, &
714 nrow_local, ncol_local, &
717 TYPE(dbcsr_iterator_type) :: iter
718 REAL(kind=
real_8) :: norm, denom
719 REAL(kind=
real_8),
DIMENSION(:),
ALLOCATABLE :: &
721 REAL(kind=
real_8),
DIMENSION(:),
POINTER :: data_vec
722 LOGICAL :: local_comp
725 TYPE(mp_comm_type) :: pcol_group
728 pcol_group = control%pcol_group
729 local_comp = control%local_comp
734 CALL dbcsr_get_info(matrix=vectors%input_vec, nfullrows_local=nrow_local, nfullcols_local=ncol_local)
735 ALLOCATE (v_vec(nrow_local))
736 ALLOCATE (w_vec(nrow_local))
737 v_vec = 0.0_real_8; w_vec = 0.0_real_8
738 ar_data%Hessenberg = 0.0_real_8
740 IF (control%has_initial_vector)
THEN
742 CALL transfer_local_array_to_dbcsr_d (vectors%input_vec, ar_data%f_vec, nrow_local, control%local_comp)
745 CALL dbcsr_iterator_start(iter, vectors%input_vec)
746 DO WHILE (dbcsr_iterator_blocks_left(iter))
747 CALL dbcsr_iterator_next_block(iter, row, col, data_vec, row_size=row_size, col_size=col_size)
748 iseed(1) = 2; iseed(2) = mod(row, 4095); iseed(3) = mod(col, 4095); iseed(4) = 11
749 CALL dlarnv(2, iseed, row_size*col_size, data_vec)
751 CALL dbcsr_iterator_stop(iter)
754 CALL transfer_dbcsr_to_local_array_d (vectors%input_vec, v_vec, nrow_local, control%local_comp)
757 CALL compute_norms_d (v_vec, norm, rnorm, control%pcol_group)
759 IF (rnorm == 0) rnorm = 1
760 CALL dbcsr_scale(vectors%input_vec, real(1.0,
real_8)/rnorm)
762 CALL dbcsr_matrix_colvec_multiply(matrix(1)%matrix, vectors%input_vec, vectors%result_vec, 1.0_real_8, &
763 0.0_real_8, vectors%rep_row_vec, vectors%rep_col_vec)
765 CALL transfer_dbcsr_to_local_array_d (vectors%result_vec, w_vec, nrow_local, control%local_comp)
767 ar_data%rho_scale = 0.0_real_8
768 ar_data%rho_scale = dot_product(v_vec, w_vec)
769 CALL pcol_group%sum(ar_data%rho_scale)
771 CALL dbcsr_matrix_colvec_multiply(matrix(2)%matrix, vectors%input_vec, vectors%result_vec, 1.0_real_8, &
772 0.0_real_8, vectors%rep_row_vec, vectors%rep_col_vec)
774 CALL transfer_dbcsr_to_local_array_d (vectors%result_vec, w_vec, nrow_local, control%local_comp)
777 denom = dot_product(v_vec, w_vec)
778 CALL pcol_group%sum(denom)
779 IF (control%myproc == 0) ar_data%rho_scale = ar_data%rho_scale/denom
780 CALL control%mp_group%bcast(ar_data%rho_scale, 0)
783 CALL dbcsr_copy(matrix_arnoldi(1)%matrix, matrix(1)%matrix)
784 CALL dbcsr_add(matrix_arnoldi(1)%matrix, matrix(2)%matrix, 1.0_real_8, -ar_data%rho_scale)
786 ar_data%x_vec = v_vec
788 END SUBROUTINE gev_arnoldi_init_d
799 SUBROUTINE gev_build_subspace_d (matrix, vectors, arnoldi_data)
800 TYPE(dbcsr_p_type),
DIMENSION(:) :: matrix
804 INTEGER :: j, ncol_local, nrow_local
808 REAL(kind=
real_8),
ALLOCATABLE,
DIMENSION(:) :: h_vec, s_vec, v_vec, w_vec
809 REAL(kind=
real_8),
ALLOCATABLE,
DIMENSION(:, :) :: zmat, czmat, bzmat
810 TYPE(mp_comm_type) :: pcol_group
814 control%converged = .false.
815 pcol_group = control%pcol_group
818 CALL dbcsr_get_info(matrix=vectors%input_vec, nfullrows_local=nrow_local, nfullcols_local=ncol_local)
819 ALLOCATE (v_vec(nrow_local));
ALLOCATE (w_vec(nrow_local))
820 v_vec = 0.0_real_8; w_vec = 0.0_real_8
821 ALLOCATE (s_vec(control%max_iter));
ALLOCATE (h_vec(control%max_iter))
822 ALLOCATE (zmat(nrow_local, control%max_iter));
ALLOCATE (czmat(nrow_local, control%max_iter))
823 ALLOCATE (bzmat(nrow_local, control%max_iter))
825 CALL transfer_local_array_to_dbcsr_d (vectors%input_vec, ar_data%x_vec, nrow_local, control%local_comp)
826 CALL dbcsr_matrix_colvec_multiply(matrix(2)%matrix, vectors%input_vec, vectors%result_vec, 1.0_real_8, &
827 0.0_real_8, vectors%rep_row_vec, vectors%rep_col_vec)
828 CALL transfer_dbcsr_to_local_array_d (vectors%result_vec, bzmat(:, 1), nrow_local, control%local_comp)
831 norm = dot_product(ar_data%x_vec, bzmat(:, 1))
832 CALL pcol_group%sum(norm)
833 IF (control%local_comp)
THEN
834 zmat(:, 1) = ar_data%x_vec/sqrt(norm); bzmat(:, 1) = bzmat(:, 1)/sqrt(norm)
837 DO j = 1, control%max_iter
838 control%current_step = j
839 CALL transfer_local_array_to_dbcsr_d (vectors%input_vec, zmat(:, j), nrow_local, control%local_comp)
840 CALL dbcsr_matrix_colvec_multiply(matrix(1)%matrix, vectors%input_vec, vectors%result_vec, 1.0_real_8, &
841 0.0_real_8, vectors%rep_row_vec, vectors%rep_col_vec)
842 CALL transfer_dbcsr_to_local_array_d (vectors%result_vec, czmat(:, j), nrow_local, control%local_comp)
843 w_vec(:) = czmat(:, j)
846 CALL gram_schmidt_ortho_d (h_vec, ar_data%f_vec, s_vec, w_vec, nrow_local, j, &
847 bzmat, zmat, control%local_comp, control%pcol_group)
851 CALL dgks_ortho_d (h_vec, ar_data%f_vec, s_vec, nrow_local, j, bzmat, &
852 zmat, control%local_comp, control%pcol_group)
854 CALL transfer_local_array_to_dbcsr_d (vectors%input_vec, ar_data%f_vec, nrow_local, control%local_comp)
855 CALL dbcsr_matrix_colvec_multiply(matrix(2)%matrix, vectors%input_vec, vectors%result_vec, 1.0_real_8, &
856 0.0_real_8, vectors%rep_row_vec, vectors%rep_col_vec)
857 CALL transfer_dbcsr_to_local_array_d (vectors%result_vec, v_vec, nrow_local, control%local_comp)
859 norm = dot_product(ar_data%f_vec, v_vec)
860 CALL pcol_group%sum(norm)
862 IF (control%myproc == 0) control%converged = real(norm,
real_8) .LT. epsilon(real(1.0,
real_8))
863 CALL control%mp_group%bcast(control%converged, 0)
864 IF (control%converged)
EXIT
865 IF (j == control%max_iter - 1)
EXIT
867 IF (control%local_comp)
THEN
868 zmat(:, j + 1) = ar_data%f_vec/sqrt(norm); bzmat(:, j + 1) = v_vec(:)/sqrt(norm)
875 ar_data%Hessenberg = 0.0_real_8
876 IF (control%local_comp)
THEN
877 ar_data%Hessenberg(1:control%current_step, 1:control%current_step) = &
878 matmul(transpose(czmat(:, 1:control%current_step)), zmat(:, 1:control%current_step))
880 CALL control%mp_group%sum(ar_data%Hessenberg)
882 ar_data%local_history = zmat
885 DEALLOCATE (v_vec);
DEALLOCATE (w_vec);
DEALLOCATE (s_vec);
DEALLOCATE (h_vec);
DEALLOCATE (czmat);
886 DEALLOCATE (zmat);
DEALLOCATE (bzmat)
888 END SUBROUTINE gev_build_subspace_d
903 SUBROUTINE gev_update_data_d (matrix, matrix_arnoldi, vectors, arnoldi_data)
904 TYPE(dbcsr_p_type),
DIMENSION(:) :: matrix
905 TYPE(dbcsr_p_type),
DIMENSION(:) :: matrix_arnoldi
911 INTEGER :: ncol_local, nrow_local, ind, i
912 REAL(kind=
real_8),
ALLOCATABLE,
DIMENSION(:) :: v_vec
915 COMPLEX(real_8) :: val
922 val = ar_data%evals(control%selected_ind(1))
923 ar_data%rho_scale = ar_data%rho_scale + real(val,
real_8)
925 ar_data%x_vec = 0.0_real_8
926 DO i = 1, control%current_step
927 val = ar_data%revec(i, control%selected_ind(1))
928 ar_data%x_vec(:) = ar_data%x_vec(:) + ar_data%local_history(:, i)*real(val,
real_8)
934 CALL dbcsr_copy(matrix_arnoldi(1)%matrix, matrix(1)%matrix)
935 CALL dbcsr_add(matrix_arnoldi(1)%matrix, matrix(2)%matrix, 1.0_real_8, -ar_data%rho_scale)
938 CALL dbcsr_get_info(matrix=vectors%input_vec, nfullrows_local=nrow_local, nfullcols_local=ncol_local)
939 IF (ncol_local > 0)
THEN
940 ALLOCATE (v_vec(nrow_local))
941 CALL compute_norms_d (ar_data%x_vec, norm, rnorm, control%pcol_group)
942 v_vec(:) = ar_data%x_vec(:)/rnorm
944 CALL transfer_local_array_to_dbcsr_d (vectors%input_vec, v_vec, nrow_local, control%local_comp)
945 CALL dbcsr_matrix_colvec_multiply(matrix_arnoldi(1)%matrix, vectors%input_vec, vectors%result_vec, 1.0_real_8, &
946 0.0_real_8, vectors%rep_row_vec, vectors%rep_col_vec)
947 CALL transfer_dbcsr_to_local_array_d (vectors%result_vec, v_vec, nrow_local, control%local_comp)
948 IF (ncol_local > 0)
THEN
949 CALL compute_norms_d (v_vec, norm, rnorm, control%pcol_group)
951 control%converged = rnorm .LT. control%threshold
955 CALL control%mp_group%bcast(control%converged, 0)
956 ind = control%selected_ind(1)
957 CALL control%mp_group%bcast(ar_data%rho_scale, 0)
960 ar_data%evals(ind) = ar_data%rho_scale
962 END SUBROUTINE gev_update_data_d
968 SUBROUTINE compute_evals_z (arnoldi_data)
971 COMPLEX(real_8),
DIMENSION(:, :),
ALLOCATABLE :: levec
978 ndim = control%current_step
979 ALLOCATE (levec(ndim, ndim))
983 IF (control%generalized_ev)
THEN
984 CALL arnoldi_symm_local_diag(
'V', ar_data%Hessenberg(1:ndim, 1:ndim), ndim, &
985 ar_data%evals(1:ndim), ar_data%revec(1:ndim, 1:ndim))
987 IF (control%symmetric)
THEN
988 CALL arnoldi_tridiag_local_diag(
'N',
'V', ar_data%Hessenberg(1:ndim, 1:ndim), ndim, &
989 ar_data%evals(1:ndim), ar_data%revec(1:ndim, 1:ndim), levec)
991 CALL arnoldi_general_local_diag(
'N',
'V', ar_data%Hessenberg(1:ndim, 1:ndim), ndim, &
992 ar_data%evals(1:ndim), ar_data%revec(1:ndim, 1:ndim), levec)
998 END SUBROUTINE compute_evals_z
1007 SUBROUTINE arnoldi_init_z (matrix, vectors, arnoldi_data)
1008 TYPE(dbcsr_p_type),
DIMENSION(:) :: matrix
1012 INTEGER :: i, iseed(4), row_size, col_size, &
1013 nrow_local, ncol_local, &
1016 TYPE(dbcsr_iterator_type) :: iter
1017 COMPLEX(kind=real_8) :: norm
1018 COMPLEX(kind=real_8),
DIMENSION(:),
ALLOCATABLE :: &
1020 COMPLEX(kind=real_8),
DIMENSION(:),
POINTER :: data_vec
1021 LOGICAL :: local_comp
1024 TYPE(mp_comm_type) :: pcol_group
1027 pcol_group = control%pcol_group
1028 local_comp = control%local_comp
1033 CALL dbcsr_get_info(matrix=vectors%input_vec, nfullrows_local=nrow_local, nfullcols_local=ncol_local)
1034 ALLOCATE (v_vec(nrow_local))
1035 ALLOCATE (w_vec(nrow_local))
1036 v_vec = cmplx(0.0, 0.0,
real_8); w_vec = cmplx(0.0, 0.0,
real_8)
1037 ar_data%Hessenberg = cmplx(0.0, 0.0,
real_8)
1039 IF (control%has_initial_vector)
THEN
1041 CALL transfer_local_array_to_dbcsr_z (vectors%input_vec, ar_data%f_vec, nrow_local, control%local_comp)
1044 CALL dbcsr_iterator_start(iter, vectors%input_vec)
1045 DO WHILE (dbcsr_iterator_blocks_left(iter))
1046 CALL dbcsr_iterator_next_block(iter, row, col, data_vec, row_size=row_size, col_size=col_size)
1047 iseed(1) = 2; iseed(2) = mod(row, 4095); iseed(3) = mod(col, 4095); iseed(4) = 11
1048 CALL zlarnv(2, iseed, row_size*col_size, data_vec)
1050 CALL dbcsr_iterator_stop(iter)
1053 CALL transfer_dbcsr_to_local_array_z (vectors%input_vec, v_vec, nrow_local, control%local_comp)
1056 CALL compute_norms_z (v_vec, norm, rnorm, control%pcol_group)
1058 IF (rnorm == 0) rnorm = 1
1059 CALL dbcsr_scale(vectors%input_vec, real(1.0,
real_8)/rnorm)
1062 CALL transfer_dbcsr_to_local_array_z (vectors%input_vec, v_vec, nrow_local, control%local_comp)
1065 DO i = 1,
SIZE(matrix)
1066 CALL dbcsr_matrix_colvec_multiply(matrix(i)%matrix, vectors%input_vec, vectors%result_vec, cmplx(1.0, 0.0,
real_8), &
1067 cmplx(0.0, 0.0,
real_8), vectors%rep_row_vec, vectors%rep_col_vec)
1068 CALL dbcsr_copy(vectors%input_vec, vectors%result_vec)
1071 CALL transfer_dbcsr_to_local_array_z (vectors%result_vec, w_vec, nrow_local, control%local_comp)
1074 ar_data%Hessenberg(1, 1) = dot_product(v_vec, w_vec)
1075 CALL pcol_group%sum(ar_data%Hessenberg(1, 1))
1076 ar_data%f_vec = w_vec - v_vec*ar_data%Hessenberg(1, 1)
1078 ar_data%local_history(:, 1) = v_vec(:)
1081 control%current_step = 1
1083 DEALLOCATE (v_vec, w_vec)
1085 END SUBROUTINE arnoldi_init_z
1095 SUBROUTINE arnoldi_iram_z (arnoldi_data)
1100 COMPLEX(real_8),
DIMENSION(:, :),
ALLOCATABLE :: tmp_mat, safe_mat, q, tmp_mat1
1101 COMPLEX(real_8),
DIMENSION(:),
ALLOCATABLE :: work, tau, work_measure
1102 INTEGER :: msize, lwork, i, j, info, nwant
1103 COMPLEX(kind=real_8) :: beta, sigma
1104 COMPLEX(kind=real_8),
DIMENSION(:, :),
ALLOCATABLE :: qdata
1109 msize = control%current_step
1110 nwant = control%nval_out
1111 ALLOCATE (tmp_mat(msize, msize));
ALLOCATE (safe_mat(msize, msize))
1112 ALLOCATE (q(msize, msize));
ALLOCATE (tmp_mat1(msize, msize))
1113 ALLOCATE (work_measure(1))
1114 ALLOCATE (tau(msize));
ALLOCATE (qdata(msize, msize))
1116 q = cmplx(0.0, 0.0,
real_8)
1118 q(i, i) = cmplx(1.0, 0.0,
real_8)
1122 CALL convert_matrix(tmp_mat, ar_data%Hessenberg(1:msize, 1:msize))
1123 safe_mat(:, :) = tmp_mat(:, :)
1127 IF (any(control%selected_ind == i)) cycle
1130 tmp_mat(j, j) = tmp_mat(j, j) - ar_data%evals(i)
1134 CALL zgeqrf(msize, msize, tmp_mat, msize, tau, work_measure, lwork, info)
1135 lwork = int(work_measure(1))
1136 IF (
ALLOCATED(work))
THEN
1137 IF (
SIZE(work) .LT. lwork)
THEN
1141 IF (.NOT.
ALLOCATED(work))
ALLOCATE (work(lwork))
1142 CALL zgeqrf(msize, msize, tmp_mat, msize, tau, work, lwork, info)
1144 CALL zungqr(msize, msize, msize, tmp_mat, msize, tau, work, lwork, info)
1146 tmp_mat1(:, :) = q(:, :)
1147 CALL zgemm(
'N',
'N', msize, msize, msize, cmplx(1.0, 0.0,
real_8), tmp_mat1, msize, tmp_mat, msize, cmplx(0.0, 0.0,&
1151 CALL zgemm(
'C',
'N', msize, msize, msize, cmplx(1.0, 0.0,
real_8), tmp_mat, msize, safe_mat, msize, cmplx(0.0, 0.0,&
1154 CALL zgemm(
'N',
'N', msize, msize, msize, cmplx(1.0, 0.0,
real_8), tmp_mat1, msize, tmp_mat, msize, cmplx(0.0, 0.0,&
1160 safe_mat(j + 2:msize, j) = cmplx(0.0, 0.0,
real_8)
1162 tmp_mat(:, :) = safe_mat(:, :)
1166 ar_data%Hessenberg = cmplx(0.0, 0.0,
real_8)
1167 CALL convert_matrix(ar_data%Hessenberg(1:msize, 1:msize), safe_mat)
1168 CALL convert_matrix(qdata, q)
1170 beta = ar_data%Hessenberg(nwant + 1, nwant); sigma = qdata(msize, nwant)
1173 IF (control%local_comp)
THEN
1174 ar_data%f_vec = matmul(ar_data%local_history(:, 1:msize), qdata(1:msize, nwant + 1))*beta + ar_data%f_vec(:)*sigma
1175 ar_data%local_history(:, 1:nwant) = matmul(ar_data%local_history(:, 1:msize), qdata(1:msize, 1:nwant))
1178 control%current_step = nwant
1180 DEALLOCATE (tmp_mat, safe_mat, q, qdata, tmp_mat1, work, tau, work_measure)
1182 END SUBROUTINE arnoldi_iram_z
1194 SUBROUTINE build_subspace_z (matrix, vectors, arnoldi_data)
1195 TYPE(dbcsr_p_type),
DIMENSION(:) :: matrix
1199 INTEGER :: i, j, ncol_local, nrow_local
1203 COMPLEX(kind=real_8) :: norm
1204 COMPLEX(kind=real_8),
ALLOCATABLE,
DIMENSION(:) :: h_vec, s_vec, v_vec, w_vec
1205 TYPE(dbcsr_type),
POINTER :: input_vec, result_vec, swap_vec
1209 control%converged = .false.
1212 CALL dbcsr_get_info(matrix=vectors%input_vec, nfullrows_local=nrow_local, nfullcols_local=ncol_local)
1213 ALLOCATE (v_vec(nrow_local));
ALLOCATE (w_vec(nrow_local))
1214 v_vec = cmplx(0.0, 0.0,
real_8); w_vec = cmplx(0.0, 0.0,
real_8)
1215 ALLOCATE (s_vec(control%max_iter));
ALLOCATE (h_vec(control%max_iter))
1217 DO j = control%current_step, control%max_iter - 1
1220 CALL compute_norms_z (ar_data%f_vec, norm, rnorm, control%pcol_group)
1223 IF (control%myproc == 0) control%converged = rnorm .LT. real(control%threshold,
real_8)
1224 CALL control%mp_group%bcast(control%converged, 0)
1225 IF (control%converged)
EXIT
1228 IF (rnorm == 0) rnorm = 1
1229 v_vec(:) = ar_data%f_vec(:)/rnorm; ar_data%local_history(:, j + 1) = v_vec(:); ar_data%Hessenberg(j + 1, j) = norm
1231 input_vec => vectors%input_vec
1232 result_vec => vectors%result_vec
1233 CALL transfer_local_array_to_dbcsr_z (input_vec, v_vec, nrow_local, control%local_comp)
1236 DO i = 1,
SIZE(matrix)
1237 CALL dbcsr_matrix_colvec_multiply(matrix(i)%matrix, input_vec, result_vec, cmplx(1.0, 0.0,
real_8), &
1238 cmplx(0.0, 0.0,
real_8), vectors%rep_row_vec, vectors%rep_col_vec)
1239 swap_vec => input_vec
1240 input_vec => result_vec
1241 result_vec => swap_vec
1244 CALL transfer_dbcsr_to_local_array_z (input_vec, w_vec, nrow_local, control%local_comp)
1247 CALL gram_schmidt_ortho_z (h_vec, ar_data%f_vec, s_vec, w_vec, nrow_local, j + 1, &
1248 ar_data%local_history, ar_data%local_history, control%local_comp, control%pcol_group)
1252 CALL dgks_ortho_z (h_vec, ar_data%f_vec, s_vec, nrow_local, j + 1, ar_data%local_history, &
1253 ar_data%local_history, control%local_comp, control%pcol_group)
1255 ar_data%Hessenberg(1:j + 1, j + 1) = h_vec(1:j + 1)
1256 control%current_step = j + 1
1260 CALL compute_norms_z (ar_data%f_vec, norm, rnorm, control%pcol_group)
1261 ar_data%Hessenberg(control%current_step + 1, control%current_step) = norm
1264 CALL control%mp_group%bcast(ar_data%Hessenberg, 0)
1266 DEALLOCATE (v_vec, w_vec, h_vec, s_vec)
1268 END SUBROUTINE build_subspace_z
1277 SUBROUTINE transfer_dbcsr_to_local_array_z (vec, array, n, is_local)
1278 TYPE(dbcsr_type) :: vec
1279 COMPLEX(kind=real_8),
DIMENSION(:) :: array
1282 COMPLEX(kind=real_8),
DIMENSION(:),
POINTER :: data_vec
1284 data_vec => dbcsr_get_data_p(vec, select_data_type=cmplx(0.0, 0.0,
real_8))
1285 IF (is_local) array(1:n) = data_vec(1:n)
1287 END SUBROUTINE transfer_dbcsr_to_local_array_z
1296 SUBROUTINE transfer_local_array_to_dbcsr_z (vec, array, n, is_local)
1297 TYPE(dbcsr_type) :: vec
1298 COMPLEX(kind=real_8),
DIMENSION(:) :: array
1301 COMPLEX(kind=real_8),
DIMENSION(:),
POINTER :: data_vec
1303 data_vec => dbcsr_get_data_p(vec, select_data_type=cmplx(0.0, 0.0,
real_8))
1304 IF (is_local) data_vec(1:n) = array(1:n)
1306 END SUBROUTINE transfer_local_array_to_dbcsr_z
1321 SUBROUTINE gram_schmidt_ortho_z (h_vec, f_vec, s_vec, w_vec, nrow_local, &
1322 j, local_history, reorth_mat, local_comp, pcol_group)
1323 COMPLEX(kind=real_8),
DIMENSION(:) :: h_vec, s_vec, f_vec, w_vec
1324 COMPLEX(kind=real_8),
DIMENSION(:, :) :: local_history, reorth_mat
1325 INTEGER :: nrow_local, j
1326 TYPE(mp_comm_type),
INTENT(IN) :: pcol_group
1327 LOGICAL :: local_comp
1329 CHARACTER(LEN=*),
PARAMETER :: routinen =
'Gram_Schmidt_ortho_z'
1332 CALL timeset(routinen, handle)
1335 h_vec = cmplx(0.0, 0.0,
real_8); f_vec = cmplx(0.0, 0.0,
real_8); s_vec = cmplx(0.0, 0.0,
real_8)
1336 IF (local_comp)
CALL zgemv(
'T', nrow_local, j, cmplx(1.0, 0.0,
real_8), local_history, &
1337 nrow_local, w_vec, 1, cmplx(0.0, 0.0,
real_8), h_vec, 1)
1338 CALL pcol_group%sum(h_vec(1:j))
1340 IF (local_comp)
CALL zgemv(
'N', nrow_local, j, cmplx(1.0, 0.0,
real_8), reorth_mat, &
1341 nrow_local, h_vec, 1, cmplx(0.0, 0.0,
real_8), f_vec, 1)
1342 f_vec(:) = w_vec(:) - f_vec(:)
1344 CALL timestop(handle)
1346 END SUBROUTINE gram_schmidt_ortho_z
1360 SUBROUTINE dgks_ortho_z (h_vec, f_vec, s_vec, nrow_local, j, &
1361 local_history, reorth_mat, local_comp, pcol_group)
1362 COMPLEX(kind=real_8),
DIMENSION(:) :: h_vec, s_vec, f_vec
1363 COMPLEX(kind=real_8),
DIMENSION(:, :) :: local_history, reorth_mat
1364 INTEGER :: nrow_local, j
1365 TYPE(mp_comm_type),
INTENT(IN) :: pcol_group
1367 CHARACTER(LEN=*),
PARAMETER :: routinen =
'DGKS_ortho_z'
1368 LOGICAL :: local_comp
1371 CALL timeset(routinen, handle)
1373 IF (local_comp)
CALL zgemv(
'T', nrow_local, j, cmplx(1.0, 0.0,
real_8), local_history, &
1374 nrow_local, f_vec, 1, cmplx(0.0, 0.0,
real_8), s_vec, 1)
1375 CALL pcol_group%sum(s_vec(1:j))
1376 IF (local_comp)
CALL zgemv(
'N', nrow_local, j, cmplx(-1.0, 0.0,
real_8), reorth_mat, &
1377 nrow_local, s_vec, 1, cmplx(1.0, 0.0,
real_8), f_vec, 1)
1378 h_vec(1:j) = h_vec(1:j) + s_vec(1:j)
1380 CALL timestop(handle)
1382 END SUBROUTINE dgks_ortho_z
1392 SUBROUTINE compute_norms_z (vec, norm, rnorm, pcol_group)
1393 COMPLEX(kind=real_8),
DIMENSION(:) :: vec
1395 COMPLEX(kind=real_8) :: norm
1396 TYPE(mp_comm_type),
INTENT(IN) :: pcol_group
1399 norm = dot_product(vec, vec)
1400 CALL pcol_group%sum(norm)
1401 rnorm = sqrt(real(norm,
real_8))
1402 norm=cmplx(rnorm, 0.0,
real_8)
1404 END SUBROUTINE compute_norms_z
1415 SUBROUTINE gev_arnoldi_init_z (matrix, matrix_arnoldi, vectors, arnoldi_data)
1416 TYPE(dbcsr_p_type),
DIMENSION(:) :: matrix
1417 TYPE(dbcsr_p_type),
DIMENSION(:) :: matrix_arnoldi
1421 INTEGER :: iseed(4), row_size, col_size, &
1422 nrow_local, ncol_local, &
1425 TYPE(dbcsr_iterator_type) :: iter
1426 COMPLEX(kind=real_8) :: norm, denom
1427 COMPLEX(kind=real_8),
DIMENSION(:),
ALLOCATABLE :: &
1429 COMPLEX(kind=real_8),
DIMENSION(:),
POINTER :: data_vec
1430 LOGICAL :: local_comp
1433 TYPE(mp_comm_type) :: pcol_group
1436 pcol_group = control%pcol_group
1437 local_comp = control%local_comp
1442 CALL dbcsr_get_info(matrix=vectors%input_vec, nfullrows_local=nrow_local, nfullcols_local=ncol_local)
1443 ALLOCATE (v_vec(nrow_local))
1444 ALLOCATE (w_vec(nrow_local))
1445 v_vec = cmplx(0.0, 0.0,
real_8); w_vec = cmplx(0.0, 0.0,
real_8)
1446 ar_data%Hessenberg = cmplx(0.0, 0.0,
real_8)
1448 IF (control%has_initial_vector)
THEN
1450 CALL transfer_local_array_to_dbcsr_z (vectors%input_vec, ar_data%f_vec, nrow_local, control%local_comp)
1453 CALL dbcsr_iterator_start(iter, vectors%input_vec)
1454 DO WHILE (dbcsr_iterator_blocks_left(iter))
1455 CALL dbcsr_iterator_next_block(iter, row, col, data_vec, row_size=row_size, col_size=col_size)
1456 iseed(1) = 2; iseed(2) = mod(row, 4095); iseed(3) = mod(col, 4095); iseed(4) = 11
1457 CALL zlarnv(2, iseed, row_size*col_size, data_vec)
1459 CALL dbcsr_iterator_stop(iter)
1462 CALL transfer_dbcsr_to_local_array_z (vectors%input_vec, v_vec, nrow_local, control%local_comp)
1465 CALL compute_norms_z (v_vec, norm, rnorm, control%pcol_group)
1467 IF (rnorm == 0) rnorm = 1
1468 CALL dbcsr_scale(vectors%input_vec, real(1.0,
real_8)/rnorm)
1470 CALL dbcsr_matrix_colvec_multiply(matrix(1)%matrix, vectors%input_vec, vectors%result_vec, cmplx(1.0, 0.0,
real_8), &
1471 cmplx(0.0, 0.0,
real_8), vectors%rep_row_vec, vectors%rep_col_vec)
1473 CALL transfer_dbcsr_to_local_array_z (vectors%result_vec, w_vec, nrow_local, control%local_comp)
1475 ar_data%rho_scale = cmplx(0.0, 0.0,
real_8)
1476 ar_data%rho_scale = dot_product(v_vec, w_vec)
1477 CALL pcol_group%sum(ar_data%rho_scale)
1479 CALL dbcsr_matrix_colvec_multiply(matrix(2)%matrix, vectors%input_vec, vectors%result_vec, cmplx(1.0, 0.0,
real_8), &
1480 cmplx(0.0, 0.0,
real_8), vectors%rep_row_vec, vectors%rep_col_vec)
1482 CALL transfer_dbcsr_to_local_array_z (vectors%result_vec, w_vec, nrow_local, control%local_comp)
1484 denom = cmplx(0.0, 0.0,
real_8)
1485 denom = dot_product(v_vec, w_vec)
1486 CALL pcol_group%sum(denom)
1487 IF (control%myproc == 0) ar_data%rho_scale = ar_data%rho_scale/denom
1488 CALL control%mp_group%bcast(ar_data%rho_scale, 0)
1491 CALL dbcsr_copy(matrix_arnoldi(1)%matrix, matrix(1)%matrix)
1492 CALL dbcsr_add(matrix_arnoldi(1)%matrix, matrix(2)%matrix, cmplx(1.0, 0.0,
real_8), -ar_data%rho_scale)
1494 ar_data%x_vec = v_vec
1496 END SUBROUTINE gev_arnoldi_init_z
1507 SUBROUTINE gev_build_subspace_z (matrix, vectors, arnoldi_data)
1508 TYPE(dbcsr_p_type),
DIMENSION(:) :: matrix
1512 INTEGER :: j, ncol_local, nrow_local
1515 COMPLEX(kind=real_8) :: norm
1516 COMPLEX(kind=real_8),
ALLOCATABLE,
DIMENSION(:) :: h_vec, s_vec, v_vec, w_vec
1517 COMPLEX(kind=real_8),
ALLOCATABLE,
DIMENSION(:, :) :: zmat, czmat, bzmat
1518 TYPE(mp_comm_type) :: pcol_group
1522 control%converged = .false.
1523 pcol_group = control%pcol_group
1526 CALL dbcsr_get_info(matrix=vectors%input_vec, nfullrows_local=nrow_local, nfullcols_local=ncol_local)
1527 ALLOCATE (v_vec(nrow_local));
ALLOCATE (w_vec(nrow_local))
1528 v_vec = cmplx(0.0, 0.0,
real_8); w_vec = cmplx(0.0, 0.0,
real_8)
1529 ALLOCATE (s_vec(control%max_iter));
ALLOCATE (h_vec(control%max_iter))
1530 ALLOCATE (zmat(nrow_local, control%max_iter));
ALLOCATE (czmat(nrow_local, control%max_iter))
1531 ALLOCATE (bzmat(nrow_local, control%max_iter))
1533 CALL transfer_local_array_to_dbcsr_z (vectors%input_vec, ar_data%x_vec, nrow_local, control%local_comp)
1534 CALL dbcsr_matrix_colvec_multiply(matrix(2)%matrix, vectors%input_vec, vectors%result_vec, cmplx(1.0, 0.0,
real_8), &
1535 cmplx(0.0, 0.0,
real_8), vectors%rep_row_vec, vectors%rep_col_vec)
1536 CALL transfer_dbcsr_to_local_array_z (vectors%result_vec, bzmat(:, 1), nrow_local, control%local_comp)
1538 norm = cmplx(0.0, 0.0,
real_8)
1539 norm = dot_product(ar_data%x_vec, bzmat(:, 1))
1540 CALL pcol_group%sum(norm)
1541 IF (control%local_comp)
THEN
1542 zmat(:, 1) = ar_data%x_vec/sqrt(norm); bzmat(:, 1) = bzmat(:, 1)/sqrt(norm)
1545 DO j = 1, control%max_iter
1546 control%current_step = j
1547 CALL transfer_local_array_to_dbcsr_z (vectors%input_vec, zmat(:, j), nrow_local, control%local_comp)
1548 CALL dbcsr_matrix_colvec_multiply(matrix(1)%matrix, vectors%input_vec, vectors%result_vec, cmplx(1.0, 0.0,
real_8), &
1549 cmplx(0.0, 0.0,
real_8), vectors%rep_row_vec, vectors%rep_col_vec)
1550 CALL transfer_dbcsr_to_local_array_z (vectors%result_vec, czmat(:, j), nrow_local, control%local_comp)
1551 w_vec(:) = czmat(:, j)
1554 CALL gram_schmidt_ortho_z (h_vec, ar_data%f_vec, s_vec, w_vec, nrow_local, j, &
1555 bzmat, zmat, control%local_comp, control%pcol_group)
1559 CALL dgks_ortho_z (h_vec, ar_data%f_vec, s_vec, nrow_local, j, bzmat, &
1560 zmat, control%local_comp, control%pcol_group)
1562 CALL transfer_local_array_to_dbcsr_z (vectors%input_vec, ar_data%f_vec, nrow_local, control%local_comp)
1563 CALL dbcsr_matrix_colvec_multiply(matrix(2)%matrix, vectors%input_vec, vectors%result_vec, cmplx(1.0, 0.0,
real_8), &
1564 cmplx(0.0, 0.0,
real_8), vectors%rep_row_vec, vectors%rep_col_vec)
1565 CALL transfer_dbcsr_to_local_array_z (vectors%result_vec, v_vec, nrow_local, control%local_comp)
1566 norm = cmplx(0.0, 0.0,
real_8)
1567 norm = dot_product(ar_data%f_vec, v_vec)
1568 CALL pcol_group%sum(norm)
1570 IF (control%myproc == 0) control%converged = real(norm,
real_8) .LT. epsilon(real(1.0,
real_8))
1571 CALL control%mp_group%bcast(control%converged, 0)
1572 IF (control%converged)
EXIT
1573 IF (j == control%max_iter - 1)
EXIT
1575 IF (control%local_comp)
THEN
1576 zmat(:, j + 1) = ar_data%f_vec/sqrt(norm); bzmat(:, j + 1) = v_vec(:)/sqrt(norm)
1583 ar_data%Hessenberg = cmplx(0.0, 0.0,
real_8)
1584 IF (control%local_comp)
THEN
1585 ar_data%Hessenberg(1:control%current_step, 1:control%current_step) = &
1586 matmul(transpose(czmat(:, 1:control%current_step)), zmat(:, 1:control%current_step))
1588 CALL control%mp_group%sum(ar_data%Hessenberg)
1590 ar_data%local_history = zmat
1593 DEALLOCATE (v_vec);
DEALLOCATE (w_vec);
DEALLOCATE (s_vec);
DEALLOCATE (h_vec);
DEALLOCATE (czmat);
1594 DEALLOCATE (zmat);
DEALLOCATE (bzmat)
1596 END SUBROUTINE gev_build_subspace_z
1611 SUBROUTINE gev_update_data_z (matrix, matrix_arnoldi, vectors, arnoldi_data)
1612 TYPE(dbcsr_p_type),
DIMENSION(:) :: matrix
1613 TYPE(dbcsr_p_type),
DIMENSION(:) :: matrix_arnoldi
1619 INTEGER :: ncol_local, nrow_local, ind, i
1620 COMPLEX(kind=real_8),
ALLOCATABLE,
DIMENSION(:) :: v_vec
1622 COMPLEX(kind=real_8) :: norm
1623 COMPLEX(real_8) :: val
1630 val = ar_data%evals(control%selected_ind(1))
1631 ar_data%rho_scale = ar_data%rho_scale + val
1633 ar_data%x_vec = cmplx(0.0, 0.0,
real_8)
1634 DO i = 1, control%current_step
1635 val = ar_data%revec(i, control%selected_ind(1))
1636 ar_data%x_vec(:) = ar_data%x_vec(:) + ar_data%local_history(:, i)*val
1642 CALL dbcsr_copy(matrix_arnoldi(1)%matrix, matrix(1)%matrix)
1643 CALL dbcsr_add(matrix_arnoldi(1)%matrix, matrix(2)%matrix, cmplx(1.0, 0.0,
real_8), -ar_data%rho_scale)
1646 CALL dbcsr_get_info(matrix=vectors%input_vec, nfullrows_local=nrow_local, nfullcols_local=ncol_local)
1647 IF (ncol_local > 0)
THEN
1648 ALLOCATE (v_vec(nrow_local))
1649 CALL compute_norms_z (ar_data%x_vec, norm, rnorm, control%pcol_group)
1650 v_vec(:) = ar_data%x_vec(:)/rnorm
1652 CALL transfer_local_array_to_dbcsr_z (vectors%input_vec, v_vec, nrow_local, control%local_comp)
1653 CALL dbcsr_matrix_colvec_multiply(matrix_arnoldi(1)%matrix, vectors%input_vec, vectors%result_vec, cmplx(1.0, 0.0,&
1655 cmplx(0.0, 0.0,
real_8), vectors%rep_row_vec, vectors%rep_col_vec)
1656 CALL transfer_dbcsr_to_local_array_z (vectors%result_vec, v_vec, nrow_local, control%local_comp)
1657 IF (ncol_local > 0)
THEN
1658 CALL compute_norms_z (v_vec, norm, rnorm, control%pcol_group)
1660 control%converged = rnorm .LT. control%threshold
1664 CALL control%mp_group%bcast(control%converged, 0)
1665 ind = control%selected_ind(1)
1666 CALL control%mp_group%bcast(ar_data%rho_scale, 0)
1669 ar_data%evals(ind) = ar_data%rho_scale
1671 END SUBROUTINE gev_update_data_z
provides a unified interface to lapack geev routines
methods for arnoldi iteration
subroutine, public arnoldi_init(matrix, vectors, arnoldi_data)
Interface for the initialization of the arnoldi subspace creation currently it can only setup a rando...
subroutine, public gev_update_data(matrix, matrix_arnoldi, vectors, arnoldi_data)
in the generalized eigenvalue the matrix depende on the projection therefore the outer loop has to bu...
subroutine, public gev_build_subspace(matrix, vectors, arnoldi_data)
here the iterations are performed and the krylov space for the generalized eigenvalue problem is crea...
subroutine, public compute_evals(arnoldi_data)
Interface to compute the eigenvalues of a nonsymmetric matrix This is only the serial version.
subroutine, public gev_arnoldi_init(matrix, matrix_arnoldi, vectors, arnoldi_data)
Interface for the initialization of the arnoldi subspace creation for the generalized eigenvalue prob...
subroutine, public build_subspace(matrix, vectors, arnoldi_data)
here the iterations are performed and the krylov space is constructed
subroutine, public arnoldi_iram(arnoldi_data)
Interface for the routine calcualting the implicit restarts Currently all based on lapack.
collection of types used in arnoldi
type(arnoldi_data_c_type) function, pointer, public get_data_c(ar_data)
...
type(arnoldi_data_s_type) function, pointer, public get_data_s(ar_data)
...
type(arnoldi_data_z_type) function, pointer, public get_data_z(ar_data)
...
logical function, public has_d_real(ar_data)
...
type(arnoldi_data_d_type) function, pointer, public get_data_d(ar_data)
...
type(arnoldi_control_type) function, pointer, public get_control(ar_data)
...
elemental logical function, public has_d_cmplx(ar_data)
...
operations for skinny matrices/vectors expressed in dbcsr form
Defines the basic variable types.
integer, parameter, public real_8
Interface to the message passing library MPI.