wham_get_deleig_a Subroutine

private subroutine wham_get_deleig_a(deleig_a, eig, delHH_a, UU, num_wann, pw90_band_deriv_degen, error, comm)

Uses

  • proc~~wham_get_deleig_a~~UsesGraph proc~wham_get_deleig_a wham_get_deleig_a module~w90_comms w90_comms proc~wham_get_deleig_a->module~w90_comms module~w90_constants w90_constants proc~wham_get_deleig_a->module~w90_constants module~w90_postw90_types w90_postw90_types proc~wham_get_deleig_a->module~w90_postw90_types module~w90_utility w90_utility proc~wham_get_deleig_a->module~w90_utility module~w90_comms->module~w90_constants module~w90_error_base w90_error_base module~w90_comms->module~w90_error_base module~w90_postw90_types->module~w90_comms module~w90_postw90_types->module~w90_constants module~w90_utility->module~w90_comms module~w90_utility->module~w90_constants

Band derivatives dE/dk_a

Arguments

Type IntentOptional Attributes Name
real(kind=dp), intent(out) :: deleig_a(num_wann)
real(kind=dp), intent(in) :: eig(num_wann)
complex(kind=dp), intent(in) :: delHH_a(:,:)
complex(kind=dp), intent(in) :: UU(:,:)
integer, intent(in) :: num_wann
type(pw90_band_deriv_degen_type), intent(in) :: pw90_band_deriv_degen
type(w90_error_type), intent(out), allocatable :: error
type(w90_comm_type), intent(in) :: comm

Calls

proc~~wham_get_deleig_a~~CallsGraph proc~wham_get_deleig_a wham_get_deleig_a proc~utility_diagonalize utility_diagonalize proc~wham_get_deleig_a->proc~utility_diagonalize proc~utility_rotate utility_rotate proc~wham_get_deleig_a->proc~utility_rotate proc~utility_rotate_diag utility_rotate_diag proc~wham_get_deleig_a->proc~utility_rotate_diag proc~set_error_fatal set_error_fatal proc~utility_diagonalize->proc~set_error_fatal zhpevx zhpevx proc~utility_diagonalize->zhpevx proc~utility_matmul_diag utility_matmul_diag proc~utility_rotate_diag->proc~utility_matmul_diag proc~utility_zgemm_new utility_zgemm_new proc~utility_rotate_diag->proc~utility_zgemm_new proc~comms_sync_error comms_sync_error proc~set_error_fatal->proc~comms_sync_error proc~set_base_error set_base_error proc~set_error_fatal->proc~set_base_error zgemm zgemm proc~utility_zgemm_new->zgemm

Called by

proc~~wham_get_deleig_a~~CalledByGraph proc~wham_get_deleig_a wham_get_deleig_a proc~wham_get_eig_deleig wham_get_eig_deleig proc~wham_get_eig_deleig->proc~wham_get_deleig_a proc~wham_get_eig_deleig_tb_conv wham_get_eig_deleig_TB_conv proc~wham_get_eig_deleig_tb_conv->proc~wham_get_deleig_a proc~berry_get_kdotp berry_get_kdotp proc~berry_get_kdotp->proc~wham_get_eig_deleig proc~berry_get_kubo_k berry_get_kubo_k proc~berry_get_kubo_k->proc~wham_get_eig_deleig proc~berry_get_sc_klist berry_get_sc_klist proc~berry_get_sc_klist->proc~wham_get_eig_deleig proc~berry_get_sc_klist->proc~wham_get_eig_deleig_tb_conv proc~berry_get_shc_klist berry_get_shc_klist proc~berry_get_shc_klist->proc~wham_get_eig_deleig proc~calctdfanddos calcTDFandDOS proc~calctdfanddos->proc~wham_get_eig_deleig proc~dos_main dos_main proc~dos_main->proc~wham_get_eig_deleig proc~geninterp_main geninterp_main proc~geninterp_main->proc~wham_get_eig_deleig proc~gyrotropic_get_k_list gyrotropic_get_k_list proc~gyrotropic_get_k_list->proc~wham_get_eig_deleig proc~k_slice k_slice proc~k_slice->proc~wham_get_eig_deleig proc~k_slice->proc~berry_get_shc_klist proc~berry_main berry_main proc~berry_main->proc~berry_get_kdotp proc~berry_main->proc~berry_get_kubo_k proc~berry_main->proc~berry_get_sc_klist proc~berry_main->proc~berry_get_shc_klist proc~boltzwann_main boltzwann_main proc~boltzwann_main->proc~calctdfanddos proc~gyrotropic_main gyrotropic_main proc~gyrotropic_main->proc~gyrotropic_get_k_list proc~k_path k_path proc~k_path->proc~berry_get_shc_klist program~postw90 postw90 program~postw90->proc~dos_main program~postw90->proc~geninterp_main program~postw90->proc~k_slice program~postw90->proc~berry_main program~postw90->proc~boltzwann_main program~postw90->proc~gyrotropic_main program~postw90->proc~k_path

Source Code

  subroutine wham_get_deleig_a(deleig_a, eig, delHH_a, UU, num_wann, pw90_band_deriv_degen, &
                               error, comm)
    !================================================!
    !
    !! Band derivatives dE/dk_a
    !
    !================================================!

    use w90_constants, only: dp !, cmplx_0, cmplx_i
    use w90_utility, only: utility_diagonalize, utility_rotate, utility_rotate_diag
    use w90_postw90_types, only: pw90_band_deriv_degen_type
    use w90_comms, only: w90_comm_type

    ! arguments
    type(pw90_band_deriv_degen_type), intent(in) :: pw90_band_deriv_degen
    integer, intent(in) :: num_wann
    real(kind=dp), intent(in) :: eig(num_wann)
    real(kind=dp), intent(out) :: deleig_a(num_wann)
    complex(kind=dp), intent(in) :: delHH_a(:, :)
    complex(kind=dp), intent(in) :: UU(:, :)
    type(w90_error_type), allocatable, intent(out) :: error
    type(w90_comm_type), intent(in) :: comm

    ! local variables
    integer                       :: i, degen_min, degen_max, dim
    real(kind=dp)                 :: diff
    complex(kind=dp), allocatable :: delHH_bar_a(:, :), U_deg(:, :)

    allocate (delHH_bar_a(num_wann, num_wann))
    allocate (U_deg(num_wann, num_wann))

    if (pw90_band_deriv_degen%use_degen_pert) then

      delHH_bar_a = utility_rotate(delHH_a, UU, num_wann)

      ! Assuming that the energy eigenvalues are stored in eig(:) in
      ! increasing order (diff >= 0)

      i = 0
      do
        i = i + 1
        if (i > num_wann) exit
        if (i + 1 <= num_wann) then
          diff = eig(i + 1) - eig(i)
        else

          ! i-th is the highest band, and it is non-degenerate

          diff = pw90_band_deriv_degen%degen_thr + 1.0_dp
        end if
        if (diff < pw90_band_deriv_degen%degen_thr) then

          ! Bands i and i+1 are degenerate

          degen_min = i
          degen_max = degen_min + 1

          ! See if any higher bands are in the same degenerate group

          do
            if (degen_max + 1 > num_wann) exit
            diff = eig(degen_max + 1) - eig(degen_max)
            if (diff < pw90_band_deriv_degen%degen_thr) then
              degen_max = degen_max + 1
            else
              exit
            end if
          end do

          ! Bands from degen_min to degen_max are degenerate. Diagonalize
          ! the submatrix in Eq.(31) YWVS07 over this degenerate subspace.
          ! The eigenvalues are the band gradients

          dim = degen_max - degen_min + 1
          call utility_diagonalize(delHH_bar_a(degen_min:degen_max, degen_min:degen_max), dim, &
                                   deleig_a(degen_min:degen_max), U_deg(1:dim, 1:dim), error, comm)
          if (allocated(error)) return

          ! Scanned bands up to degen_max

          i = degen_max
        else

          ! Use non-degenerate form [Eq.(27) YWVS07] for current (i-th) band

          deleig_a(i) = real(delHH_bar_a(i, i), dp)
        end if
      end do

    else

      ! Use non-degenerate form for all bands

      deleig_a(:) = real(utility_rotate_diag(delHH_a(:, :), UU, num_wann), dp)

    end if

  end subroutine wham_get_deleig_a