spin_get_moment_k Subroutine

private subroutine spin_get_moment_k(kpt, ef, spn_k, num_wann, ws_region, wannier_data, real_lattice, mp_grid, ws_distance, HH_R, SS_R, wigner_seitz, error, comm)

Uses

  • proc~~spin_get_moment_k~~UsesGraph proc~spin_get_moment_k spin_get_moment_k module~w90_comms w90_comms proc~spin_get_moment_k->module~w90_comms module~w90_constants w90_constants proc~spin_get_moment_k->module~w90_constants module~w90_postw90_common w90_postw90_common proc~spin_get_moment_k->module~w90_postw90_common module~w90_postw90_types w90_postw90_types proc~spin_get_moment_k->module~w90_postw90_types module~w90_types w90_types proc~spin_get_moment_k->module~w90_types module~w90_utility w90_utility proc~spin_get_moment_k->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_common->module~w90_constants module~w90_error w90_error module~w90_postw90_common->module~w90_error module~w90_postw90_types->module~w90_comms module~w90_postw90_types->module~w90_constants module~w90_types->module~w90_constants module~w90_utility->module~w90_comms module~w90_utility->module~w90_constants module~w90_error->module~w90_comms module~w90_error->module~w90_error_base

Computes the spin magnetic moment by Wannier interpolation at the specified k-point

Arguments

Type IntentOptional Attributes Name
real(kind=dp), intent(in) :: kpt(3)
real(kind=dp), intent(in) :: ef
real(kind=dp), intent(out) :: spn_k(3)
integer, intent(in) :: num_wann
type(ws_region_type), intent(in) :: ws_region
type(wannier_data_type), intent(in) :: wannier_data
real(kind=dp), intent(in) :: real_lattice(3,3)
integer, intent(in) :: mp_grid(3)
type(ws_distance_type), intent(inout) :: ws_distance
complex(kind=dp), intent(inout), allocatable :: HH_R(:,:,:)
complex(kind=dp), intent(inout), allocatable :: SS_R(:,:,:,:)
type(wigner_seitz_type), intent(in) :: wigner_seitz
type(w90_error_type), intent(out), allocatable :: error
type(w90_comm_type), intent(in) :: comm

Calls

proc~~spin_get_moment_k~~CallsGraph proc~spin_get_moment_k spin_get_moment_k proc~pw90common_fourier_r_to_k pw90common_fourier_R_to_k proc~spin_get_moment_k->proc~pw90common_fourier_r_to_k proc~pw90common_get_occ pw90common_get_occ proc~spin_get_moment_k->proc~pw90common_get_occ proc~utility_diagonalize utility_diagonalize proc~spin_get_moment_k->proc~utility_diagonalize proc~utility_rotate_diag utility_rotate_diag proc~spin_get_moment_k->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~~spin_get_moment_k~~CalledByGraph proc~spin_get_moment_k spin_get_moment_k proc~spin_get_moment spin_get_moment proc~spin_get_moment->proc~spin_get_moment_k program~postw90 postw90 program~postw90->proc~spin_get_moment

Source Code

  subroutine spin_get_moment_k(kpt, ef, spn_k, num_wann, ws_region, wannier_data, real_lattice, &
                               mp_grid, ws_distance, HH_R, SS_R, wigner_seitz, error, comm)
    !================================================!
    !! Computes the spin magnetic moment by Wannier interpolation
    !! at the specified k-point
    !================================================!

    use w90_constants, only: dp, cmplx_i
    use w90_utility, only: utility_diagonalize, utility_rotate_diag
    use w90_types, only: print_output_type, wannier_data_type, ws_region_type, &
                         ws_distance_type
    use w90_postw90_common, only: pw90common_fourier_R_to_k, pw90common_get_occ
    use w90_postw90_types, only: wigner_seitz_type
    use w90_comms, only: w90_comm_type

    ! arguments
    type(ws_region_type), intent(in) :: ws_region
    type(wannier_data_type), intent(in) :: wannier_data
    type(wigner_seitz_type), intent(in) :: wigner_seitz
    type(ws_distance_type), intent(inout) :: ws_distance
    type(w90_error_type), allocatable, intent(out) :: error
    type(w90_comm_type), intent(in) :: comm

    integer, intent(in) :: mp_grid(3)
    integer, intent(in) :: num_wann

    real(kind=dp), intent(in) :: ef
    real(kind=dp), intent(in) :: kpt(3)
    real(kind=dp), intent(in) :: real_lattice(3, 3)
    real(kind=dp), intent(out) :: spn_k(3)

    complex(kind=dp), allocatable, intent(inout) :: HH_R(:, :, :) !  <0n|r|Rm>
    complex(kind=dp), allocatable, intent(inout) :: SS_R(:, :, :, :) ! <0n|sigma_x,y,z|Rm>

    ! local variables
    ! Physics

    complex(kind=dp), allocatable :: HH(:, :)
    complex(kind=dp), allocatable :: SS(:, :, :)
    complex(kind=dp), allocatable :: UU(:, :)
    real(kind=dp)                 :: spn_nk(num_wann, 3)

    ! Misc/Dummy

    integer          :: i, is
    real(kind=dp)    :: eig(num_wann), occ(num_wann)

    allocate (HH(num_wann, num_wann))
    allocate (UU(num_wann, num_wann))
    allocate (SS(num_wann, num_wann, 3))

    call pw90common_fourier_R_to_k(ws_region, wannier_data, ws_distance, wigner_seitz, HH, HH_R, &
                                   kpt, real_lattice, mp_grid, 0, num_wann, error, comm)
    if (allocated(error)) return

    call utility_diagonalize(HH, num_wann, eig, UU, error, comm)
    if (allocated(error)) return

    call pw90common_get_occ(ef, eig, occ, num_wann)

    spn_k(1:3) = 0.0_dp
    do is = 1, 3
      call pw90common_fourier_R_to_k(ws_region, wannier_data, ws_distance, wigner_seitz, &
                                     SS(:, :, is), SS_R(:, :, :, is), kpt, real_lattice, mp_grid, &
                                     0, num_wann, error, comm)
      if (allocated(error)) return

      spn_nk(:, is) = aimag(cmplx_i*utility_rotate_diag(SS(:, :, is), UU, num_wann))
      do i = 1, num_wann
        spn_k(is) = spn_k(is) + occ(i)*spn_nk(i, is)
      end do
    end do

  end subroutine spin_get_moment_k