Compute D^H_a=UU^dag.del_a UU (a=x,y,z) using Eq.(24) of WYSV06
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(pw90_berry_mod_type), | intent(in) | :: | pw90_berry | |||
| complex(kind=dp), | intent(in) | :: | delHH(:,:,:) | |||
| complex(kind=dp), | intent(out) | :: | D_h(:,:,:) | |||
| complex(kind=dp), | intent(in) | :: | UU(:,:) | |||
| real(kind=dp), | intent(in) | :: | eig(:) | |||
| integer, | intent(in) | :: | num_wann |
subroutine wham_get_D_h_P_value(pw90_berry, delHH, D_h, UU, eig, num_wann) !================================================! ! !! Compute D^H_a=UU^dag.del_a UU (a=x,y,z) !! using Eq.(24) of WYSV06 ! and prescription for energy denominator ! from BK81 ! !================================================! ! TO DO: Implement version where energy denominators only connect ! occupied and empty states. In this case probably do not need ! to worry about avoiding small energy denominators use w90_constants, only: dp, cmplx_0 use w90_postw90_types, only: pw90_berry_mod_type !sc_eta use w90_utility, only: utility_rotate ! arguments type(pw90_berry_mod_type), intent(in) :: pw90_berry integer, intent(in) :: num_wann real(kind=dp), intent(in) :: eig(:) complex(kind=dp), intent(in) :: delHH(:, :, :) complex(kind=dp), intent(in) :: UU(:, :) complex(kind=dp), intent(out) :: D_h(:, :, :) ! local variables complex(kind=dp), allocatable :: delHH_bar_i(:, :) integer :: n, m, i real(kind=dp) :: deltaE allocate (delHH_bar_i(num_wann, num_wann)) D_h = cmplx_0 deltaE = 0.d0 do i = 1, 3 delHH_bar_i(:, :) = utility_rotate(delHH(:, :, i), UU, num_wann) do m = 1, num_wann do n = 1, num_wann if (n == m) cycle deltaE = eig(m) - eig(n) D_h(n, m, i) = delHH_bar_i(n, m)*(deltaE/(deltaE**(2) + pw90_berry%sc_eta**(2))) end do end do end do end subroutine wham_get_D_h_P_value