fourier_loc_q_to_R Subroutine

public subroutine fourier_loc_q_to_R(num_kpts, counts, displs, rank, nrpts, irvec, kpt_latt, op_q, op_R)

Fourier transforms Wannier-gauge representation of a given operator O from q-space to R-space:

O_ij(q) --> O_ij(R) = (1/N_kpts) sum_q e^{-iqR} O_ij(q)

Arguments

Type IntentOptional Attributes Name
integer, intent(in) :: num_kpts
integer, intent(in) :: counts(0:)
integer, intent(in) :: displs(0:)
integer, intent(in) :: rank
integer, intent(in) :: nrpts
integer, intent(in) :: irvec(:,:)
real(kind=dp), intent(in) :: kpt_latt(:,:)
complex(kind=dp), intent(in) :: op_q(:,:,:)

Operator in q-space

complex(kind=dp), intent(out) :: op_R(:,:,:)

Operator in R-space


Called by

proc~~fourier_loc_q_to_r~~CalledByGraph proc~fourier_loc_q_to_r fourier_loc_q_to_R proc~get_aa_r get_AA_R proc~get_aa_r->proc~fourier_loc_q_to_r proc~get_bb_r get_BB_R proc~get_bb_r->proc~fourier_loc_q_to_r proc~get_cc_r get_CC_R proc~get_cc_r->proc~fourier_loc_q_to_r proc~get_saa_r get_SAA_R proc~get_saa_r->proc~fourier_loc_q_to_r proc~get_sbb_r get_SBB_R proc~get_sbb_r->proc~fourier_loc_q_to_r proc~berry_main berry_main proc~berry_main->proc~get_aa_r proc~berry_main->proc~get_bb_r proc~berry_main->proc~get_cc_r proc~berry_main->proc~get_saa_r proc~berry_main->proc~get_sbb_r proc~berry_get_sc_klist berry_get_sc_klist proc~berry_main->proc~berry_get_sc_klist proc~gyrotropic_main gyrotropic_main proc~gyrotropic_main->proc~get_aa_r proc~gyrotropic_main->proc~get_bb_r proc~gyrotropic_main->proc~get_cc_r proc~k_path k_path proc~k_path->proc~get_aa_r proc~k_path->proc~get_bb_r proc~k_path->proc~get_cc_r proc~k_slice k_slice proc~k_slice->proc~get_aa_r proc~k_slice->proc~get_bb_r proc~k_slice->proc~get_cc_r proc~wham_get_eig_uu_hh_aa_sc_tb_conv wham_get_eig_UU_HH_AA_sc_TB_conv proc~wham_get_eig_uu_hh_aa_sc_tb_conv->proc~get_aa_r proc~berry_get_sc_klist->proc~wham_get_eig_uu_hh_aa_sc_tb_conv program~postw90 postw90 program~postw90->proc~berry_main program~postw90->proc~gyrotropic_main program~postw90->proc~k_path program~postw90->proc~k_slice

Source Code

  subroutine fourier_loc_q_to_R(num_kpts, counts, displs, rank, nrpts, irvec, kpt_latt, op_q, op_R)
    !================================================
    !
    !! Fourier transforms Wannier-gauge representation
    !! of a given operator O from q-space to R-space:
    !!
    !! O_ij(q) --> O_ij(R) = (1/N_kpts) sum_q e^{-iqR} O_ij(q)
    !
    !================================================

    implicit none

    ! Arguments
    real(kind=dp), intent(in) :: kpt_latt(:, :)
    integer, intent(in) :: num_kpts, rank, counts(0:), displs(0:), nrpts, irvec(:, :)
    complex(kind=dp), intent(in) :: op_q(:, :, :) !! Operator in q-space
    complex(kind=dp), intent(out) :: op_R(:, :, :) !! Operator in R-space

    ! local variables
    integer :: ir, ik, ik_start, ik_end
    real(kind=dp) :: rdotq
    complex(kind=dp) :: phase_fac

    ik_start = displs(rank) + 1
    ik_end = displs(rank) + counts(rank)

    op_R = cmplx_0
    do ir = 1, nrpts
      do ik = ik_start, ik_end
        rdotq = twopi*dot_product(kpt_latt(:, ik), irvec(:, ir))
        phase_fac = exp(-cmplx_i*rdotq)
        op_R(:, :, ir) = op_R(:, :, ir) + phase_fac*op_q(:, :, ik - ik_start + 1)
      end do
    end do
    op_R = op_R/real(num_kpts, dp)

  end subroutine fourier_loc_q_to_R