(git:f2099e5)
Loading...
Searching...
No Matches
bse_davidson.F File Reference

Go to the source code of this file.

Modules

module  bse_davidson
 Block Davidson solvers for the lowest excitations of the Bethe-Salpeter equation on top of the matrix-free application of A and B: the TDA problem sum_jb A_ia,jb X_jb = Ω X_ia (bse_davidson_tda) and the full problem, either as sum_jb [(A+B)(A-B)]_ia,jb x_jb = Ω^2 x_ia (bse_davidson_abba_mk) or as the pair sum_jb (A+B)_ia,jb y_jb = Ω x_ia, sum_jb (A-B)_ia,jb x_jb = Ω y_ia (bse_davidson_abba_os). Every solver projects its problem onto an orthonormal basis, takes the lowest Ritz pairs, extends the basis by the preconditioned residuals of the roots still in need and restarts thick at the subspace ceiling; the helpers below are shared by the three drivers.

Functions/Subroutines

subroutine, public bse_davidson::bse_davidson_tda (mv_env, bse_env, unit_nr, exc_ens, fm_x)
 Block Davidson with thick restart for the NUM_EXC_EN lowest solutions of sum_jb A_ia,jb X_jb^n = Ω^n X_ia^n. With the orthonormal basis Z_ia,m the reduced matrix is Ar_mn = sum_ia Z_ia,m (A Z)_ia,n with eigenpairs (θ_k, c_mk), X_ia^k = sum_m Z_ia,m c_mk, and the basis grows by the corrections t_ia,k = r_ia,k/(d_ia - θ_k) of the residuals r_ia,k = sum_m (A Z)_ia,m c_mk - θ_k X_ia^k, d_ia being the diagonal chosen by PRECONDITIONER. Arrays: Ar_mn (the reduced A) in fm_red_A on the process grid, c_mk in coef_ritz, θ_k c_mk in coef_ritz_theta.
subroutine, public bse_davidson::bse_davidson_abba_mk (mv_env, bse_env, unit_nr, exc_ens, fm_x, fm_y, abba_status, ab_margin, fm_x_tda)
 Block Davidson with thick restart for the NUM_EXC_EN lowest solutions of the full problem, written as sum_jb [(A+B)(A-B)]_ia,jb x_jb^n = (Ω^n)^2 x_ia^n with x^n = X^n - Y^n, which is symmetric in the inner product <u,v> = sum_ia,jb u_ia (A-B)_ia,jb v_jb. The basis V_ia,m is orthonormal in that inner product, W_ia,m = sum_jb (A-B)_ia,jb V_jb,m, and the reduced matrix Hr_mn = sum_ia,jb W_ia,m (A+B)_ia,jb W_jb,n has the eigenpairs ((Ω^k)^2, c_mk). Then x_ia^k = (Ω^k)^1/2 sum_m V_ia,m c_mk and y_ia^k = (X^k+Y^k)_ia = (Ω^k)^-1/2 sum_m W_ia,m c_mk obey sum_ia x_ia^k y_ia^k = 1, the residual is r_ia,k = sum_jb (A+B)_ia,jb y_jb^k - Ω^k x_ia^k and the correction t_ia,k = r_ia,k/(d_ia^2 - (Ω^k)^2), d_ia chosen by PRECONDITIONER. Arrays: Hr_mn in fm_red_M on the process grid, c_mk in coef_ritz, (Ω^k)^1/2 c_mk in coef_x, (Ω^k)^-1/2 c_mk in coef_y, Ω^k (Ω^k)^1/2 c_mk in coef_x_omega.
subroutine, public bse_davidson::bse_davidson_abba_os (mv_env, bse_env, unit_nr, exc_ens, fm_x, fm_y, abba_status, ab_margin, fm_x_tda)
 Block Davidson with thick restart for the NUM_EXC_EN lowest solutions of the full problem in the paired form of Olsen and Stratmann: with x^n = X^n - Y^n, y^n = X^n + Y^n, M = A+B and K = A-B, sum_jb M_ia,jb y_jb^n = Ω^n x_ia^n and sum_jb K_ia,jb x_jb^n = Ω^n y_ia^n. One orthonormal basis b_ia,m carries both vectors: Mr_mn = sum_ia b_ia,m (M b)_ia,n and Kr_mn = sum_ia b_ia,m (K b)_ia,n are solved by solve_reduced_paired for Ω^k, R_mk and L_mk with y_ia^k = sum_m b_ia,m R_mk, x_ia^k = sum_m b_ia,m L_mk and sum_ia x_ia^k y_ia^k = 1. The basis grows by the corrections t_ia,k = r_ia,k/(d_ia - Ω^k) of both residuals, rR_ia,k = sum_m (M b)_ia,m R_mk - Ω^k x_ia^k and rL_ia,k = sum_m (K b)_ia,m L_mk - Ω^k y_ia^k, d_ia chosen by PRECONDITIONER; the rR block enters before the rL block, which is nearly parallel to it for a small B. Arrays: Mr_mn and Kr_mn in fm_red_M and fm_red_K on the process grid, R_mk in coef_right, L_mk in coef_left.
subroutine, public bse_davidson::bse_davidson_refcheck (fm_a_explicit, exc_ens, fm_x, bse_env, unit_nr, fm_b_explicit, fm_y)
 Debug check of a Davidson result against the full diagonalization of the explicit matrices: energies, and per multiplet the smallest singular value of X_ref^T X for the TDA, or of X_ref^T X - Y_ref^T Y for ABBA. ABBA diagonalizes the Hermitian reduction C = (A-B)^1/2 (A+B) (A-B)^1/2 with C T^n = (Ω^n)^2 T^n, (X+Y)^n = (Ω^n)^-1/2 (A-B)^1/2 T^n, (X-Y)^n = (Ω^n)^1/2 (A-B)^-1/2 T^n. A failed reference solve aborts: this is debug output with nothing to fall back on.

Variables

integer, parameter, public bse_davidson::abba_ok = 0
integer, parameter, public bse_davidson::abba_indefinite = 1