For OO_true (true vector):
| Type | Intent | Optional | Attributes | Name | ||
|---|---|---|---|---|---|---|
| type(ws_region_type), | intent(in) | :: | ws_region | |||
| type(wannier_data_type), | intent(in) | :: | wannier_data | |||
| type(ws_distance_type), | intent(inout) | :: | ws_distance | |||
| type(wigner_seitz_type), | intent(in) | :: | wigner_seitz | |||
| complex(kind=dp), | intent(in) | :: | OO_R(:,:,:,:) | |||
| real(kind=dp), | intent(in) | :: | kpt(3) | |||
| real(kind=dp), | intent(in) | :: | real_lattice(3,3) | |||
| integer, | intent(in) | :: | mp_grid(3) | |||
| integer, | intent(in) | :: | num_wann | |||
| type(w90_error_type), | intent(out), | allocatable | :: | error | ||
| type(w90_comm_type), | intent(in) | :: | comm | |||
| complex(kind=dp), | intent(out), | optional | :: | OO_true(:,:,:) | ||
| complex(kind=dp), | intent(out), | optional | :: | OO_pseudo(:,:,:) |
subroutine pw90common_fourier_R_to_k_vec(ws_region, wannier_data, ws_distance, wigner_seitz, & OO_R, kpt, real_lattice, mp_grid, num_wann, error, & comm, OO_true, OO_pseudo) !================================================! ! !! For OO_true (true vector): !! $${\vec O}_{ij}(k) = \sum_R e^{+ik.R} {\vec O}_{ij}(R)$$ ! !================================================! use w90_constants, only: dp, cmplx_0, cmplx_i, twopi use w90_types, only: ws_region_type, wannier_data_type, ws_distance_type use w90_ws_distance, only: ws_translate_dist use w90_postw90_types, only: wigner_seitz_type use w90_comms, only: w90_comm_type implicit none ! arguments type(ws_region_type), intent(in) :: ws_region type(wannier_data_type), intent(in) :: wannier_data type(ws_distance_type), intent(inout) :: ws_distance type(wigner_seitz_type), intent(in) :: wigner_seitz type(w90_error_type), allocatable, intent(out) :: error type(w90_comm_type), intent(in) :: comm integer, intent(in) :: num_wann integer, intent(in) :: mp_grid(3) real(kind=dp), intent(in) :: kpt(3), real_lattice(3, 3) complex(kind=dp), intent(in) :: OO_R(:, :, :, :) complex(kind=dp), optional, intent(out) :: OO_true(:, :, :) complex(kind=dp), optional, intent(out) :: OO_pseudo(:, :, :) ! local variables integer :: ir, i, j, ideg real(kind=dp) :: rdotk complex(kind=dp) :: phase_fac if (present(OO_true)) OO_true = cmplx_0 if (present(OO_pseudo)) OO_pseudo = cmplx_0 do ir = 1, wigner_seitz%nrpts_pw90 ! [lp] Original code, without IJ-dependent shift: rdotk = twopi*dot_product(kpt(:), wigner_seitz%irvec_pw90(:, ir)) phase_fac = cmplx(cos(rdotk), sin(rdotk), dp) if (present(OO_true)) then OO_true(:, :, 1) = OO_true(:, :, 1) + phase_fac*OO_R(:, :, ir, 1) OO_true(:, :, 2) = OO_true(:, :, 2) + phase_fac*OO_R(:, :, ir, 2) OO_true(:, :, 3) = OO_true(:, :, 3) + phase_fac*OO_R(:, :, ir, 3) end if if (present(OO_pseudo)) then OO_pseudo(:, :, 1) = OO_pseudo(:, :, 1) & + cmplx_i*wigner_seitz%crvec_pw90(2, ir)*phase_fac*OO_R(:, :, ir, 3) & - cmplx_i*wigner_seitz%crvec_pw90(3, ir)*phase_fac*OO_R(:, :, ir, 2) OO_pseudo(:, :, 2) = OO_pseudo(:, :, 2) & + cmplx_i*wigner_seitz%crvec_pw90(3, ir)*phase_fac*OO_R(:, :, ir, 1) & - cmplx_i*wigner_seitz%crvec_pw90(1, ir)*phase_fac*OO_R(:, :, ir, 3) OO_pseudo(:, :, 3) = OO_pseudo(:, :, 3) & + cmplx_i*wigner_seitz%crvec_pw90(1, ir)*phase_fac*OO_R(:, :, ir, 2) & - cmplx_i*wigner_seitz%crvec_pw90(2, ir)*phase_fac*OO_R(:, :, ir, 1) end if end do end subroutine pw90common_fourier_R_to_k_vec