57#include "./base/base_uses.f90"
63 CHARACTER(len=*),
PARAMETER,
PRIVATE :: moduleN =
'bse_full_diag'
90 SUBROUTINE create_a(fm_mat_S_ia_bse, fm_mat_S_bar_ij_bse, fm_mat_S_ab_bse, &
91 fm_A, Eigenval, unit_nr, &
92 homo, virtual, dimen_RI, mp2_env, &
95 TYPE(
cp_fm_type),
INTENT(IN) :: fm_mat_s_ia_bse, fm_mat_s_bar_ij_bse, &
98 REAL(kind=
dp),
DIMENSION(:) :: eigenval
99 INTEGER,
INTENT(IN) :: unit_nr, homo, virtual, dimen_ri
100 TYPE(
mp2_type),
INTENT(INOUT) :: mp2_env
104 CHARACTER(LEN=*),
PARAMETER :: routinen =
'create_A'
106 INTEGER :: a_virt_row, handle, i_occ_row, &
107 i_row_global, ii, j_col_global, jj, &
108 ncol_local_a, nrow_local_a, sizeeigen
109 INTEGER,
DIMENSION(4) :: reordering
110 INTEGER,
DIMENSION(:),
POINTER :: col_indices_a, row_indices_a
111 REAL(kind=
dp) :: alpha, alpha_screening, eigen_diff
119 CALL timeset(routinen, handle)
121 NULLIFY (dft_control, tddfpt_control)
122 CALL get_qs_env(qs_env, dft_control=dft_control)
123 tddfpt_control => dft_control%tddfpt2_control
125 IF (unit_nr > 0 .AND. mp2_env%bse%bse_debug_print)
THEN
126 WRITE (unit_nr,
'(T2,A10,T13,A10)')
'BSE|DEBUG|',
'Creating A'
130 SELECT CASE (mp2_env%bse%bse_spin_config)
138 alpha_screening = mp2_env%bse%screening_factor
140 alpha_screening = 1.0_dp
152 CALL cp_fm_struct_create(fm_struct_a, context=fm_mat_s_ia_bse%matrix_struct%context, nrow_global=homo*virtual, &
153 ncol_global=homo*virtual, para_env=fm_mat_s_ia_bse%matrix_struct%para_env)
157 CALL cp_fm_struct_create(fm_struct_w, context=fm_mat_s_ab_bse%matrix_struct%context, nrow_global=homo**2, &
158 ncol_global=virtual**2, para_env=fm_mat_s_ab_bse%matrix_struct%para_env)
165 CALL parallel_gemm(transa=
"T", transb=
"N", m=homo*virtual, n=homo*virtual, k=dimen_ri, alpha=alpha, &
166 matrix_a=fm_mat_s_ia_bse, matrix_b=fm_mat_s_ia_bse, beta=0.0_dp, &
169 IF (unit_nr > 0 .AND. mp2_env%bse%bse_debug_print)
THEN
170 WRITE (unit_nr,
'(T2,A10,T13,A16)')
'BSE|DEBUG|',
'Allocated A_iajb'
176 CALL parallel_gemm(transa=
"T", transb=
"N", m=homo**2, n=virtual**2, k=dimen_ri, alpha=alpha_screening, &
177 matrix_a=fm_mat_s_bar_ij_bse, matrix_b=fm_mat_s_ab_bse, beta=0.0_dp, &
181 IF (unit_nr > 0 .AND. mp2_env%bse%bse_debug_print)
THEN
182 WRITE (unit_nr,
'(T2,A10,T13,A16)')
'BSE|DEBUG|',
'Allocated W_ijab'
187 nrow_local=nrow_local_a, &
188 ncol_local=ncol_local_a, &
189 row_indices=row_indices_a, &
190 col_indices=col_indices_a)
197 reordering = (/1, 3, 2, 4/)
199 virtual, virtual, unit_nr, reordering, mp2_env)
202 IF (tddfpt_control%do_bse)
THEN
205 ALLOCATE (ex_env%bse_w_matrix_MO(1, 1))
206 CALL cp_fm_create(ex_env%bse_w_matrix_MO(1, 1), fm_struct_w)
207 CALL cp_fm_to_fm(fm_w, ex_env%bse_w_matrix_MO(1, 1))
212 DO ii = 1, nrow_local_a
214 i_row_global = row_indices_a(ii)
216 DO jj = 1, ncol_local_a
218 j_col_global = col_indices_a(jj)
220 IF (i_row_global == j_col_global)
THEN
221 i_occ_row = (i_row_global - 1)/virtual + 1
222 a_virt_row = mod(i_row_global - 1, virtual) + 1
223 eigen_diff = eigenval(a_virt_row + homo) - eigenval(i_occ_row)
224 fm_a%local_data(ii, jj) = fm_a%local_data(ii, jj) + eigen_diff
230 IF (tddfpt_control%do_bse)
THEN
231 sizeeigen =
SIZE(eigenval)
232 ALLOCATE (ex_env%gw_eigen(sizeeigen))
233 ex_env%gw_eigen(:) = eigenval(:)
241 CALL timestop(handle)
260 SUBROUTINE create_b(fm_mat_S_ia_bse, fm_mat_S_bar_ia_bse, fm_B, &
261 homo, virtual, dimen_RI, unit_nr, mp2_env)
263 TYPE(
cp_fm_type),
INTENT(IN) :: fm_mat_s_ia_bse, fm_mat_s_bar_ia_bse
265 INTEGER,
INTENT(IN) :: homo, virtual, dimen_ri, unit_nr
266 TYPE(
mp2_type),
INTENT(INOUT) :: mp2_env
268 CHARACTER(LEN=*),
PARAMETER :: routinen =
'create_B'
271 INTEGER,
DIMENSION(4) :: reordering
272 REAL(kind=
dp) :: alpha, alpha_screening
276 CALL timeset(routinen, handle)
278 IF (unit_nr > 0 .AND. mp2_env%bse%bse_debug_print)
THEN
279 WRITE (unit_nr,
'(T2,A10,T13,A10)')
'BSE|DEBUG|',
'Creating B'
283 SELECT CASE (mp2_env%bse%bse_spin_config)
291 alpha_screening = mp2_env%bse%screening_factor
293 alpha_screening = 1.0_dp
296 CALL cp_fm_struct_create(fm_struct_v, context=fm_mat_s_ia_bse%matrix_struct%context, nrow_global=homo*virtual, &
297 ncol_global=homo*virtual, para_env=fm_mat_s_ia_bse%matrix_struct%para_env)
304 IF (unit_nr > 0 .AND. mp2_env%bse%bse_debug_print)
THEN
305 WRITE (unit_nr,
'(T2,A10,T13,A16)')
'BSE|DEBUG|',
'Allocated B_iajb'
308 CALL parallel_gemm(transa=
"T", transb=
"N", m=homo*virtual, n=homo*virtual, k=dimen_ri, alpha=alpha, &
309 matrix_a=fm_mat_s_ia_bse, matrix_b=fm_mat_s_ia_bse, beta=0.0_dp, &
315 CALL parallel_gemm(transa=
"T", transb=
"N", m=homo*virtual, n=homo*virtual, k=dimen_ri, alpha=alpha_screening, &
316 matrix_a=fm_mat_s_bar_ia_bse, matrix_b=fm_mat_s_ia_bse, beta=0.0_dp, &
323 reordering = (/1, 4, 3, 2/)
325 virtual, virtual, unit_nr, reordering, mp2_env)
330 CALL timestop(handle)
351 fm_sqrt_A_minus_B, fm_inv_sqrt_A_minus_B, &
352 homo, virtual, unit_nr, mp2_env, diag_est)
355 TYPE(
cp_fm_type),
INTENT(INOUT) :: fm_c, fm_sqrt_a_minus_b, &
356 fm_inv_sqrt_a_minus_b
357 INTEGER,
INTENT(IN) :: homo, virtual, unit_nr
358 TYPE(
mp2_type),
INTENT(INOUT) :: mp2_env
359 REAL(kind=
dp),
INTENT(IN) :: diag_est
361 CHARACTER(LEN=*),
PARAMETER :: routinen =
'create_hermitian_form_of_ABBA'
363 INTEGER :: dim_mat, handle, n_dependent
364 REAL(kind=
dp),
DIMENSION(2) :: eigvals_ab_diff
365 TYPE(
cp_fm_type) :: fm_a_minus_b, fm_a_plus_b, fm_dummy, &
368 CALL timeset(routinen, handle)
370 IF (unit_nr > 0)
THEN
371 WRITE (unit_nr,
'(T2,A4,T7,A25,A39,ES6.0,A3)')
'BSE|',
'Diagonalizing aux. matrix', &
372 ' with size of A. This will take around ', diag_est,
" s."
389 CALL cp_fm_create(fm_sqrt_a_minus_b, fm_a%matrix_struct)
391 CALL cp_fm_create(fm_inv_sqrt_a_minus_b, fm_a%matrix_struct)
396 IF (unit_nr > 0 .AND. mp2_env%bse%bse_debug_print)
THEN
397 WRITE (unit_nr,
'(T2,A10,T13,A19)')
'BSE|DEBUG|',
'Created work arrays'
405 CALL cp_fm_to_fm(fm_a_minus_b, fm_inv_sqrt_a_minus_b)
413 CALL cp_fm_power(fm_inv_sqrt_a_minus_b, fm_dummy, -0.5_dp, 0.0_dp, n_dependent, eigvals=eigvals_ab_diff)
417 IF (eigvals_ab_diff(1) < 0)
THEN
418 CALL cp_abort(__location__, &
419 "Matrix (A-B) is not positive definite. "// &
420 "Hermitian diagonalization of full ABBA matrix is ill-defined.")
426 dim_mat = homo*virtual
427 CALL parallel_gemm(
"N",
"N", dim_mat, dim_mat, dim_mat, 1.0_dp, fm_inv_sqrt_a_minus_b, fm_a_minus_b, 0.0_dp, &
431 CALL parallel_gemm(
"N",
"N", dim_mat, dim_mat, dim_mat, 1.0_dp, fm_sqrt_a_minus_b, fm_a_plus_b, 0.0_dp, &
442 CALL parallel_gemm(
"N",
"N", dim_mat, dim_mat, dim_mat, 1.0_dp, fm_work_product, fm_sqrt_a_minus_b, 0.0_dp, &
446 IF (unit_nr > 0 .AND. mp2_env%bse%bse_debug_print)
THEN
447 WRITE (unit_nr,
'(T2,A10,T13,A36)')
'BSE|DEBUG|',
'Filled C=(A-B)^0.5 (A+B) (A-B)^0.5'
450 CALL timestop(handle)
470 fm_sqrt_A_minus_B, fm_inv_sqrt_A_minus_B, &
471 unit_nr, diag_est, mp2_env, qs_env, mo_coeff)
474 INTEGER,
INTENT(IN) :: homo, virtual, homo_irred
475 TYPE(
cp_fm_type),
INTENT(INOUT) :: fm_sqrt_a_minus_b, fm_inv_sqrt_a_minus_b
476 INTEGER,
INTENT(IN) :: unit_nr
477 REAL(kind=
dp),
INTENT(IN) :: diag_est
478 TYPE(
mp2_type),
INTENT(INOUT) :: mp2_env
480 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(IN) :: mo_coeff
482 CHARACTER(LEN=*),
PARAMETER :: routinen =
'diagonalize_C'
484 INTEGER :: diag_info, handle
485 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: exc_ens
486 TYPE(
cp_fm_type) :: fm_eigvec_x, fm_eigvec_y, fm_eigvec_z, &
487 fm_mat_eigvec_transform_diff, &
488 fm_mat_eigvec_transform_sum
490 CALL timeset(routinen, handle)
492 IF (unit_nr > 0)
THEN
493 WRITE (unit_nr,
'(T2,A4,T7,A17,A22,ES6.0,A3)')
'BSE|',
'Diagonalizing C. ', &
494 'This will take around ', diag_est,
' s.'
501 ALLOCATE (exc_ens(homo*virtual))
505 IF (diag_info /= 0)
THEN
506 CALL cp_abort(__location__, &
507 "Diagonalization of C=(A-B)^0.5 (A+B) (A-B)^0.5 failed in BSE")
513 IF (exc_ens(1) < 0)
THEN
514 IF (unit_nr > 0)
THEN
515 CALL cp_abort(__location__, &
516 "Matrix C=(A-B)^0.5 (A+B) (A-B)^0.5 has negative eigenvalues, i.e. "// &
517 "(A+B) is not positive definite.")
520 exc_ens = sqrt(exc_ens)
531 CALL cp_fm_create(fm_mat_eigvec_transform_sum, fm_c%matrix_struct)
533 CALL parallel_gemm(transa=
"N", transb=
"N", m=homo*virtual, n=homo*virtual, k=homo*virtual, alpha=1.0_dp, &
534 matrix_a=fm_sqrt_a_minus_b, matrix_b=fm_eigvec_z, beta=0.0_dp, &
535 matrix_c=fm_mat_eigvec_transform_sum)
541 CALL cp_fm_create(fm_mat_eigvec_transform_diff, fm_c%matrix_struct)
543 CALL parallel_gemm(transa=
"N", transb=
"N", m=homo*virtual, n=homo*virtual, k=homo*virtual, alpha=1.0_dp, &
544 matrix_a=fm_inv_sqrt_a_minus_b, matrix_b=fm_eigvec_z, beta=0.0_dp, &
545 matrix_c=fm_mat_eigvec_transform_diff)
555 CALL cp_fm_to_fm(fm_mat_eigvec_transform_sum, fm_eigvec_x)
561 CALL cp_fm_to_fm(fm_mat_eigvec_transform_sum, fm_eigvec_y)
568 CALL postprocess_bse(exc_ens, fm_eigvec_x, mp2_env, qs_env, mo_coeff, &
569 homo, virtual, homo_irred, unit_nr, &
570 .false., fm_eigvec_y)
576 CALL timestop(handle)
593 unit_nr, diag_est, mp2_env, qs_env, mo_coeff)
596 INTEGER,
INTENT(IN) :: homo, virtual, homo_irred, unit_nr
597 REAL(kind=
dp),
INTENT(IN) :: diag_est
598 TYPE(
mp2_type),
INTENT(INOUT) :: mp2_env
600 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(IN) :: mo_coeff
602 CHARACTER(LEN=*),
PARAMETER :: routinen =
'diagonalize_A'
604 INTEGER :: diag_info, handle
605 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: exc_ens
608 CALL timeset(routinen, handle)
611 IF (unit_nr > 0)
THEN
612 WRITE (unit_nr,
'(T2,A4,T7,A17,A22,ES6.0,A3)')
'BSE|',
'Diagonalizing A. ', &
613 'This will take around ', diag_est,
' s.'
620 ALLOCATE (exc_ens(homo*virtual))
624 IF (diag_info /= 0)
THEN
625 CALL cp_abort(__location__, &
626 "Diagonalization of A failed in TDA-BSE")
629 CALL postprocess_bse(exc_ens, fm_eigvec, mp2_env, qs_env, mo_coeff, &
630 homo, virtual, homo_irred, unit_nr, .true.)
635 CALL timestop(handle)
653 SUBROUTINE postprocess_bse(Exc_ens, fm_eigvec_X, mp2_env, qs_env, mo_coeff, &
654 homo, virtual, homo_irred, unit_nr, &
655 flag_TDA, fm_eigvec_Y)
657 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: exc_ens
659 TYPE(
mp2_type),
INTENT(INOUT) :: mp2_env
661 TYPE(
cp_fm_type),
DIMENSION(:),
INTENT(IN) :: mo_coeff
662 INTEGER :: homo, virtual, homo_irred, unit_nr
663 LOGICAL,
OPTIONAL :: flag_tda
664 TYPE(
cp_fm_type),
INTENT(IN),
OPTIONAL :: fm_eigvec_y
666 CHARACTER(LEN=*),
PARAMETER :: routinen =
'postprocess_bse'
668 CHARACTER(LEN=10) :: info_approximation, multiplet
669 INTEGER :: handle, i_exc, idir, n_moments_di, &
671 REAL(kind=
dp) :: alpha
672 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:) :: oscill_str, ref_point_multipole
673 REAL(kind=
dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: polarizability_residues, trans_mom_bse
675 TYPE(
cp_fm_type),
ALLOCATABLE,
DIMENSION(:) :: fm_dipole_ab_trunc, fm_dipole_ai_trunc, &
676 fm_dipole_ij_trunc, fm_quadpole_ab_trunc, fm_quadpole_ai_trunc, fm_quadpole_ij_trunc
678 DIMENSION(:) :: exc_descr
680 CALL timeset(routinen, handle)
683 IF (mp2_env%bse%bse_spin_config == 0)
THEN
684 multiplet =
"Singlet"
687 multiplet =
"Triplet"
690 IF (.NOT.
PRESENT(flag_tda))
THEN
694 info_approximation =
" -TDA- "
696 info_approximation =
"-ABBA-"
703 ALLOCATE (fm_dipole_ij_trunc(n_moments_di))
704 ALLOCATE (fm_dipole_ab_trunc(n_moments_di))
705 ALLOCATE (fm_dipole_ai_trunc(n_moments_di))
706 ALLOCATE (ref_point_multipole(3))
708 CALL get_multipoles_mo(fm_dipole_ai_trunc, fm_dipole_ij_trunc, fm_dipole_ab_trunc, &
709 qs_env, mo_coeff, ref_point_multipole, 1, &
710 homo, virtual, fm_eigvec_x%matrix_struct%context)
712 IF (mp2_env%bse%num_print_exc_descr > 0)
THEN
714 ALLOCATE (fm_quadpole_ij_trunc(n_moments_quad))
715 ALLOCATE (fm_quadpole_ab_trunc(n_moments_quad))
716 ALLOCATE (fm_quadpole_ai_trunc(n_moments_quad))
717 CALL get_multipoles_mo(fm_quadpole_ai_trunc, fm_quadpole_ij_trunc, fm_quadpole_ab_trunc, &
718 qs_env, mo_coeff, ref_point_multipole, 2, &
719 homo, virtual, fm_eigvec_x%matrix_struct%context)
721 ALLOCATE (exc_descr(mp2_env%bse%num_print_exc_descr))
722 DO i_exc = 1, mp2_env%bse%num_print_exc_descr
724 .false., unit_nr, mp2_env)
725 IF (.NOT. flag_tda)
THEN
727 .false., unit_nr, mp2_env)
730 fm_quadpole_ij_trunc, fm_quadpole_ab_trunc, &
731 fm_quadpole_ai_trunc, &
732 i_exc, homo, virtual, &
736 fm_quadpole_ij_trunc, fm_quadpole_ab_trunc, &
737 fm_quadpole_ai_trunc, &
738 i_exc, homo, virtual)
741 IF (.NOT. flag_tda)
THEN
747 IF (mp2_env%bse%bse_spin_config == 0)
THEN
749 trans_mom_bse, oscill_str, polarizability_residues, &
750 mp2_env, homo, virtual, unit_nr, &
756 multiplet, alpha, mp2_env, unit_nr)
760 info_approximation, mp2_env, unit_nr)
764 info_approximation, mp2_env, unit_nr, fm_eigvec_y)
768 homo, virtual, homo_irred, flag_tda, &
769 info_approximation, mp2_env, unit_nr)
771 IF (mp2_env%bse%num_print_exc_descr > 0)
THEN
773 mp2_env%bse%num_print_exc_descr, mp2_env%bse%bse_debug_print, &
774 mp2_env%bse%print_directional_exc_descr, &
779 IF (mp2_env%bse%do_nto_analysis)
THEN
780 IF (unit_nr > 0)
THEN
781 WRITE (unit_nr,
'(T2,A4)')
'BSE|'
782 WRITE (unit_nr,
'(T2,A4,T7,A47)') &
783 'BSE|',
"Calculating Natural Transition Orbitals (NTOs)."
784 WRITE (unit_nr,
'(T2,A4)')
'BSE|'
787 mo_coeff, homo, virtual, &
788 info_approximation, &
790 qs_env, unit_nr, mp2_env)
793 DO idir = 1, n_moments_di
798 IF (mp2_env%bse%num_print_exc_descr > 0)
THEN
799 DO idir = 1, n_moments_quad
804 DEALLOCATE (fm_quadpole_ai_trunc, fm_quadpole_ij_trunc, fm_quadpole_ab_trunc)
805 DEALLOCATE (exc_descr)
807 DEALLOCATE (fm_dipole_ai_trunc, fm_dipole_ij_trunc, fm_dipole_ab_trunc)
808 DEALLOCATE (ref_point_multipole)
809 IF (mp2_env%bse%bse_spin_config == 0)
THEN
810 DEALLOCATE (oscill_str, trans_mom_bse, polarizability_residues)
812 IF (unit_nr > 0)
THEN
813 WRITE (unit_nr,
'(T2,A4)')
'BSE|'
814 WRITE (unit_nr,
'(T2,A4)')
'BSE|'
817 CALL timestop(handle)
819 END SUBROUTINE postprocess_bse
Routines for the full diagonalization of GW + Bethe-Salpeter for computing electronic excitations.
subroutine, public diagonalize_a(fm_a, homo, virtual, homo_irred, unit_nr, diag_est, mp2_env, qs_env, mo_coeff)
Solving hermitian eigenvalue equation A X^n = Ω^n X^n.
subroutine, public diagonalize_c(fm_c, homo, virtual, homo_irred, fm_sqrt_a_minus_b, fm_inv_sqrt_a_minus_b, unit_nr, diag_est, mp2_env, qs_env, mo_coeff)
Solving eigenvalue equation C Z^n = (Ω^n)^2 Z^n . Here, the eigenvectors Z^n relate to X^n via Eq....
subroutine, public create_b(fm_mat_s_ia_bse, fm_mat_s_bar_ia_bse, fm_b, homo, virtual, dimen_ri, unit_nr, mp2_env)
Matrix B constructed from 3c-B-matrices (cf. subroutine mult_B_with_W) B_ia,jb = α * v_ia,...
subroutine, public create_hermitian_form_of_abba(fm_a, fm_b, fm_c, fm_sqrt_a_minus_b, fm_inv_sqrt_a_minus_b, homo, virtual, unit_nr, mp2_env, diag_est)
Construct Matrix C=(A-B)^0.5 (A+B) (A-B)^0.5 to solve full BSE matrix as a hermitian problem (cf....
subroutine, public create_a(fm_mat_s_ia_bse, fm_mat_s_bar_ij_bse, fm_mat_s_ab_bse, fm_a, eigenval, unit_nr, homo, virtual, dimen_ri, mp2_env, para_env, qs_env)
Matrix A constructed from GW energies and 3c-B-matrices (cf. subroutine mult_B_with_W) A_ia,...
Routines for printing information in context of the BSE calculation.
subroutine, public print_output_header(homo, virtual, homo_irred, flag_tda, multiplet, alpha, mp2_env, unit_nr)
...
subroutine, public print_optical_properties(exc_ens, oscill_str, trans_mom_bse, polarizability_residues, homo, virtual, homo_irred, flag_tda, info_approximation, mp2_env, unit_nr)
...
subroutine, public print_exciton_descriptors(exc_descr, ref_point_multipole, unit_nr, num_print_exc_descr, print_checkvalue, print_directional_exc_descr, prefix_output, qs_env)
Prints exciton descriptors, cf. Mewes et al., JCTC 14, 710-725 (2018)
subroutine, public print_transition_amplitudes(fm_eigvec_x, homo, virtual, homo_irred, info_approximation, mp2_env, unit_nr, fm_eigvec_y)
...
subroutine, public print_excitation_energies(exc_ens, homo, virtual, flag_tda, multiplet, info_approximation, mp2_env, unit_nr)
...
Routines for computing excitonic properties, e.g. exciton diameter, from the BSE.
subroutine, public get_oscillator_strengths(fm_eigvec_x, exc_ens, fm_dipole_ai_trunc, trans_mom_bse, oscill_str, polarizability_residues, mp2_env, homo_red, virtual_red, unit_nr, fm_eigvec_y)
Compute and return BSE dipoles d_r^n = sqrt(2) sum_ia < ψ_i | r | ψ_a > ( X_ia^n + Y_ia^n ) and oscil...
subroutine, public get_exciton_descriptors(exc_descr, fm_x_ia, fm_multipole_ij_trunc, fm_multipole_ab_trunc, fm_multipole_ai_trunc, i_exc, homo, virtual, fm_y_ia)
...
subroutine, public calculate_ntos(fm_x, fm_y, mo_coeff, homo, virtual, info_approximation, oscill_str, qs_env, unit_nr, mp2_env)
...
Auxiliary routines for GW + Bethe-Salpeter for computing electronic excitations.
subroutine, public get_multipoles_mo(fm_multipole_ai_trunc, fm_multipole_ij_trunc, fm_multipole_ab_trunc, qs_env, mo_coeff, rpoint, n_moments, homo_red, virtual_red, context_bse)
...
subroutine, public reshuffle_eigvec(fm_eigvec, fm_eigvec_reshuffled, homo, virtual, n_exc, do_transpose, unit_nr, mp2_env)
...
subroutine, public comp_eigvec_coeff_bse(fm_work, eig_vals, beta, gamma, do_transpose)
Routine for computing the coefficients of the eigenvectors of the BSE matrix from a multiplication wi...
subroutine, public fm_general_add_bse(fm_out, fm_in, beta, nrow_secidx_in, ncol_secidx_in, nrow_secidx_out, ncol_secidx_out, unit_nr, reordering, mp2_env)
Adds and reorders full matrices with a combined index structure, e.g. adding W_ij,...
methods related to the blacs parallel environment
subroutine, public cp_blacs_env_release(blacs_env)
releases the given blacs_env
subroutine, public cp_blacs_env_create(blacs_env, para_env, blacs_grid_layout, blacs_repeatable, row_major, grid_2d)
allocates and initializes a type that represent a blacs context
Defines control structures, which contain the parameters and the settings for the DFT-based calculati...
Basic linear algebra operations for full matrices.
subroutine, public cp_fm_scale_and_add(alpha, matrix_a, beta, matrix_b)
calc A <- alpha*A + beta*B optimized for alpha == 1.0 (just add beta*B) and beta == 0....
used for collecting some of the diagonalization schemes available for cp_fm_type. cp_fm_power also mo...
subroutine, public cp_fm_power(matrix, work, exponent, threshold, n_dependent, verbose, eigvals)
...
subroutine, public choose_eigv_solver(matrix, eigenvectors, eigenvalues, info)
Choose the Eigensolver depending on which library is available ELPA seems to be unstable for small sy...
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_get_info(matrix, name, nrow_global, ncol_global, nrow_block, ncol_block, nrow_local, ncol_local, row_indices, col_indices, local_data, context, nrow_locals, ncol_locals, matrix_struct, para_env)
returns all kind of information about the full matrix
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
Types for excited states potential energies.
Calculation of the incomplete Gamma function F_n(t) for multi-center integrals over Cartesian Gaussia...
Defines the basic variable types.
integer, parameter, public dp
Interface to the message passing library MPI.
Types needed for MP2 calculations.
basic linear algebra operations for full matrixes
subroutine, public get_qs_env(qs_env, atomic_kind_set, qs_kind_set, cell, super_cell, cell_ref, use_ref_cell, kpoints, dft_control, mos, sab_orb, sab_all, qmmm, qmmm_periodic, sac_ae, sac_ppl, sac_lri, sap_ppnl, sab_vdw, sab_scp, sap_oce, sab_lrc, sab_se, sab_xtbe, sab_tbe, sab_core, sab_xb, sab_xtb_pp, sab_xtb_nonbond, sab_almo, sab_kp, sab_kp_nosym, sab_cneo, particle_set, energy, force, matrix_h, matrix_h_im, matrix_ks, matrix_ks_im, matrix_vxc, run_rtp, rtp, matrix_h_kp, matrix_h_im_kp, matrix_ks_kp, matrix_ks_im_kp, matrix_vxc_kp, kinetic_kp, matrix_s_kp, matrix_w_kp, matrix_s_ri_aux_kp, matrix_s, matrix_s_ri_aux, matrix_w, matrix_p_mp2, matrix_p_mp2_admm, rho, rho_xc, pw_env, ewald_env, ewald_pw, active_space, mpools, input, para_env, blacs_env, scf_control, rel_control, kinetic, qs_charges, vppl, rho_core, rho_nlcc, rho_nlcc_g, ks_env, ks_qmmm_env, wf_history, scf_env, local_particles, local_molecules, distribution_2d, dbcsr_dist, molecule_kind_set, molecule_set, subsys, cp_subsys, oce, local_rho_set, rho_atom_set, task_list, task_list_soft, rho0_atom_set, rho0_mpole, rhoz_set, rhoz_cneo_set, ecoul_1c, rho0_s_rs, rho0_s_gs, rhoz_cneo_s_rs, rhoz_cneo_s_gs, do_kpoints, has_unit_metric, requires_mo_derivs, mo_derivs, mo_loc_history, nkind, natom, nelectron_total, nelectron_spin, efield, neighbor_list_id, linres_control, xas_env, virial, cp_ddapc_env, cp_ddapc_ewald, outer_scf_history, outer_scf_ihistory, x_data, et_coupling, dftb_potential, results, se_taper, se_store_int_env, se_nddo_mpole, se_nonbond_env, admm_env, lri_env, lri_density, exstate_env, ec_env, harris_env, dispersion_env, gcp_env, vee, rho_external, external_vxc, mask, mp2_env, bs_env, kg_env, wanniercentres, atprop, ls_scf_env, do_transport, transport_env, v_hartree_rspace, s_mstruct_changed, rho_changed, potential_changed, forces_up_to_date, mscfg_env, almo_scf_env, gradient_history, variable_history, embed_pot, spin_embed_pot, polar_env, mos_last_converged, eeq, rhs, do_rixs, tb_tblite)
Get the QUICKSTEP environment.
represent a blacs multidimensional parallel environment (for the mpi corrispective see cp_paratypes/m...
keeps the information about the structure of a full matrix
Contains information on the excited states energy.
stores all the informations relevant to an mpi environment