Skip to content

Commit

Permalink
Merge pull request wannier-developers#181 from Julen-ia/shift-current
Browse files Browse the repository at this point in the history
Shift current
  • Loading branch information
giovannipizzi authored Jun 13, 2018
2 parents 75f641d + c13998c commit e9becb3
Show file tree
Hide file tree
Showing 6 changed files with 405 additions and 367 deletions.
28 changes: 23 additions & 5 deletions src/parameters.F90
Original file line number Diff line number Diff line change
Expand Up @@ -489,6 +489,7 @@ module w90_parameters
public :: param_lib_set_atoms
public :: param_memory_estimate
public :: param_get_smearing_type
public :: param_get_convention_type
public :: param_dist
public :: param_chkpt_dist

Expand Down Expand Up @@ -2328,6 +2329,26 @@ function param_get_smearing_type(smearing_index)

end function param_get_smearing_type

function param_get_convention_type(sc_phase_conv)
!! This function returns a string describing the convention
!! associated to a sc_phase_conv integer value.
integer, intent(in) :: sc_phase_conv
!! The integer index for which we want to get the string
character(len=80) :: param_get_convention_type

character(len=4) :: orderstr

if (sc_phase_conv .eq. 1) then
param_get_convention_type = "Tight-binding convention"
else if (sc_phase_conv .eq. 2) then
param_get_convention_type = "Wannier90 convention"
else
param_get_convention_type = "Unknown type of convention"
end if

end function param_get_convention_type



function get_smearing_index(string,keyword)
!! This function parses a string containing the type of
Expand Down Expand Up @@ -3003,11 +3024,8 @@ subroutine param_postw90_write
if(index(berry_task,'sc')>0) then
write(stdout,'(1x,a46,10x,f8.3,13x,a1)') '| Smearing factor for shift current :',sc_eta,'|'
write(stdout,'(1x,a46,10x,f8.3,13x,a1)') '| Frequency theshold for shift current :',sc_w_thr,'|'
if (sc_phase_conv.eq.1) then
write(stdout,'(1x,a46,10x,f8.3,13x,a1)') '| Using TB phase convention, number :',sc_phase_conv,'|'
else
write(stdout,'(1x,a46,10x,f8.3,13x,a1)') '| Using W90 phase convention, number :',sc_phase_conv,'|'
end if
write(stdout,'(1x,a46,1x,a27,3x,a1)') '| Bloch sums :',&
trim(param_get_convention_type(sc_phase_conv)),'|'
end if
if(kubo_adpt_smr.eqv.adpt_smr .and. kubo_adpt_smr_fac==adpt_smr_fac .and. kubo_adpt_smr_max==adpt_smr_max &
.and. kubo_smr_fixed_en_width==smr_fixed_en_width .and. smr_index==kubo_smr_index) then
Expand Down
35 changes: 21 additions & 14 deletions src/postw90/berry.F90
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ module w90_berry
integer, dimension(6) , parameter , public :: berry_alpha_S=alpha_S
integer, dimension(6) , parameter, public:: berry_beta_S=beta_S
! integer, dimension(3,3) , parameter, public:: berry_alpha_beta_S= (/ (/1,4,5/), (/ 4,2,6 /) , (/ 5,6,3 /) /)
integer, parameter, public:: berry_alpha_beta_S(3,3) = reshape((/ 1,4,5, 4,2,6, 5,6,3 /), (/3,3/))
integer, parameter, public:: berry_alpha_beta_S(3,3) = reshape((/ 1,4,5, 4,2,6, 5,6,3 /),(/3,3/))
!(/ (/1,4,5/), (/ 4,2,6 /) , (/ 5,6,3 /) /)


Expand Down Expand Up @@ -1281,13 +1281,16 @@ subroutine berry_get_sc_klist(kpt,sc_k_list)
!
use w90_constants, only : dp,cmplx_0,cmplx_i
use w90_utility, only : utility_re_tr,utility_im_tr,utility_w0gauss,utility_w0gauss_vec
use w90_parameters, only : num_wann,nfermi,kubo_nfreq,kubo_freq_list,fermi_energy_list,kubo_smr_index,&
berry_kmesh,kubo_adpt_smr_fac,kubo_adpt_smr_max,kubo_adpt_smr,&
kubo_eigval_max,kubo_smr_fixed_en_width,sc_phase_conv,sc_w_thr
use w90_postw90_common, only : pw90common_fourier_R_to_k_vec_dadb, pw90common_fourier_R_to_k_new_second_d,&
pw90common_get_occ, pw90common_kmesh_spacing, pw90common_fourier_R_to_k_vec_dadb_TB_conv
use w90_wan_ham, only : wham_get_eig_UU_HH_JJlist,wham_get_occ_mat_list,wham_get_D_h, wham_get_eig_UU_HH_AA_sc,&
wham_get_eig_deleig,wham_get_D_h_P_value,wham_get_eig_deleig_TB_conv,wham_get_eig_UU_HH_AA_sc_TB_conv
use w90_parameters, only : num_wann,nfermi,kubo_nfreq,kubo_freq_list,fermi_energy_list,&
kubo_smr_index,berry_kmesh,kubo_adpt_smr_fac,&
kubo_adpt_smr_max,kubo_adpt_smr,kubo_eigval_max,&
kubo_smr_fixed_en_width,sc_phase_conv,sc_w_thr
use w90_postw90_common, only : pw90common_fourier_R_to_k_vec_dadb, &
pw90common_fourier_R_to_k_new_second_d,pw90common_get_occ, &
pw90common_kmesh_spacing, pw90common_fourier_R_to_k_vec_dadb_TB_conv
use w90_wan_ham, only : wham_get_eig_UU_HH_JJlist,wham_get_occ_mat_list,wham_get_D_h, &
wham_get_eig_UU_HH_AA_sc,wham_get_eig_deleig,wham_get_D_h_P_value,&
wham_get_eig_deleig_TB_conv,wham_get_eig_UU_HH_AA_sc_TB_conv
use w90_get_oper, only : AA_R
use w90_utility, only : utility_rotate,utility_zdotu
! Arguments
Expand Down Expand Up @@ -1430,12 +1433,14 @@ subroutine berry_get_sc_klist(kpt,sc_k_list)
! its composed of 8 terms in total, see Eq (34) combined with (30) and
! (32) of IATS18
gen_r_nm(:) = ( AA_da_bar(n,m,:,a)&
+( (AA_bar(n,n,:)-AA_bar(m,m,:))*D_h(n,m,a) + (AA_bar(n,n,a)-AA_bar(m,m,a))*D_h(n,m,:)) &
+( (AA_bar(n,n,:)-AA_bar(m,m,:))*D_h(n,m,a) + &
(AA_bar(n,n,a)-AA_bar(m,m,a))*D_h(n,m,:)) &
-cmplx_i*AA_bar(n,m,:)*(AA_bar(n,n,a)-AA_bar(m,m,a))&
+sum_AD(:,a)&
+cmplx_i*(HH_dadb_bar(n,m,:,a)&
+sum_HD(:,a)&
+(D_h(n,m,:)*(eig_da(n,a)-eig_da(m,a)) + D_h(n,m,a)*(eig_da(n,:)-eig_da(m,:)) ) )&
+(D_h(n,m,:)*(eig_da(n,a)-eig_da(m,a)) + &
D_h(n,m,a)*(eig_da(n,:)-eig_da(m,:)) ) )&
/(eig(m)-eig(n)) )

! loop over the remaining two indexes of the matrix product.
Expand All @@ -1455,16 +1460,18 @@ subroutine berry_get_sc_klist(kpt,sc_k_list)
! multiply matrix elements with delta function for the relevant frequencies
if (istart<=iend) then
delta=0.0
delta(istart:iend)= utility_w0gauss_vec( (eig(m)-eig(n)+omega(istart:iend))/eta_smr,kubo_smr_index)/eta_smr
call DGER( 18 , iend-istart+1 , occ_fac , I_nm , 1 , delta(istart:iend) , 1 , sc_k_list(:,:,istart:iend) , 18 )
delta(istart:iend)= &
utility_w0gauss_vec( (eig(m)-eig(n)+omega(istart:iend))/eta_smr,kubo_smr_index)/eta_smr
call DGER(18,iend-istart+1,occ_fac,I_nm,1,delta(istart:iend),1,sc_k_list(:,:,istart:iend),18)
endif
! same for delta(E_mn-w)
istart=max(int( (eig(m)-eig(n)-sc_w_thr*eta_smr-wmin)/wstep+1 ),1)
iend= min(int( (eig(m)-eig(n)+sc_w_thr*eta_smr-wmin)/wstep+1 ),kubo_nfreq)
if (istart<=iend) then
delta=0.0
delta(istart:iend)= utility_w0gauss_vec( (eig(n)-eig(m)+omega(istart:iend))/eta_smr,kubo_smr_index)/eta_smr
call DGER( 18 , iend-istart+1 , occ_fac , I_nm , 1 , delta(istart:iend) , 1 , sc_k_list(:,:,istart:iend) , 18 )
delta(istart:iend)= &
utility_w0gauss_vec( (eig(n)-eig(m)+omega(istart:iend))/eta_smr,kubo_smr_index)/eta_smr
call DGER(18,iend-istart+1,occ_fac,I_nm,1,delta(istart:iend),1,sc_k_list(:,:,istart:iend),18)
endif

enddo ! bands
Expand Down
36 changes: 24 additions & 12 deletions src/postw90/postw90_common.F90
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,8 @@ module w90_postw90_common
public :: nrpts, rpt_origin, v_matrix, ndegen, irvec, crvec
public :: num_int_kpts_on_node, int_kpts, weight
public :: pw90common_kmesh_spacing
public :: pw90common_fourier_R_to_k_new_second_d, pw90common_fourier_R_to_k_new_second_d_TB_conv, pw90common_fourier_R_to_k_vec_dadb, pw90common_fourier_R_to_k_vec_dadb_TB_conv
public :: pw90common_fourier_R_to_k_new_second_d, pw90common_fourier_R_to_k_new_second_d_TB_conv, &
pw90common_fourier_R_to_k_vec_dadb, pw90common_fourier_R_to_k_vec_dadb_TB_conv

! AAM PROBABLY REMOVE THIS
! This 'save' statement could probably be ommited, since this module
Expand Down Expand Up @@ -928,7 +929,8 @@ subroutine pw90common_fourier_R_to_k_new_second_d_TB_conv(kpt,OO_R,oo_a_R,OO,OO_
!=======================================================!

use w90_constants, only : dp,cmplx_0,cmplx_i,twopi
use w90_parameters, only : timing_level,num_kpts,kpt_latt, num_wann, use_ws_distance, wannier_centres, recip_lattice
use w90_parameters, only : timing_level,num_kpts,kpt_latt, num_wann, &
use_ws_distance, wannier_centres, recip_lattice
use w90_ws_distance, only : irdist_ws, wdist_ndeg, ws_translate_dist
use w90_utility, only : utility_cart_to_frac

Expand Down Expand Up @@ -981,20 +983,23 @@ subroutine pw90common_fourier_R_to_k_new_second_d_TB_conv(kpt,OO_R,oo_a_R,OO,OO_
do i=1,num_wann
do ideg = 1,wdist_ndeg(j,i,ir)

rdotk=twopi*dot_product(kpt(:),real(irdist_ws(:,ideg,i,j,ir)+wannier_centres_frac(:,j)-wannier_centres_frac(:,i),dp))
rdotk=twopi*dot_product(kpt(:),real(irdist_ws(:,ideg,i,j,ir)+&
wannier_centres_frac(:,j)-wannier_centres_frac(:,i),dp))
phase_fac=cmplx(cos(rdotk),sin(rdotk),dp)/real(ndegen(ir)*wdist_ndeg(i,j,ir),dp)
if(present(OO)) OO(i,j)=OO(i,j)+phase_fac*OO_R(i,j,ir)
if(present(OO_da)) then
do a=1,3
OO_da(i,j,a)=OO_da(i,j,a)+cmplx_i*(crvec(a,ir)+local_wannier_centres(a,j)-local_wannier_centres(a,i))*phase_fac*OO_R(i,j,ir)
OO_da(i,j,a)=OO_da(i,j,a)+cmplx_i*(crvec(a,ir)+local_wannier_centres(a,j)-&
local_wannier_centres(a,i))*phase_fac*OO_R(i,j,ir)
enddo
endif
if(present(OO_dadb)) then
do a=1,3
do b=1,3
OO_dadb(i,j,a,b)=OO_dadb(i,j,a,b)-&
(crvec(a,ir)+local_wannier_centres(a,j)-local_wannier_centres(a,i))*&
(crvec(b,ir)+local_wannier_centres(b,j)-local_wannier_centres(b,i))*phase_fac*OO_R(i,j,ir)
(crvec(b,ir)+local_wannier_centres(b,j)-local_wannier_centres(b,i))*&
phase_fac*OO_R(i,j,ir)
enddo
enddo
end if
Expand All @@ -1012,15 +1017,17 @@ subroutine pw90common_fourier_R_to_k_new_second_d_TB_conv(kpt,OO_R,oo_a_R,OO,OO_
if(present(OO)) OO(i,j)=OO(i,j)+phase_fac*OO_R(i,j,ir)
if(present(OO_da)) then
do a=1,3
OO_da(i,j,a)=OO_da(i,j,a)+cmplx_i*(crvec(a,ir)+local_wannier_centres(a,j)-local_wannier_centres(a,i))*phase_fac*OO_R(i,j,ir)
OO_da(i,j,a)=OO_da(i,j,a)+cmplx_i*(crvec(a,ir)+&
local_wannier_centres(a,j)-local_wannier_centres(a,i))*phase_fac*OO_R(i,j,ir)
enddo
endif
if(present(OO_dadb)) then
do a=1,3
do b=1,3
OO_dadb(i,j,a,b)=OO_dadb(i,j,a,b)-&
(crvec(a,ir)+local_wannier_centres(a,j)-local_wannier_centres(a,i))*&
(crvec(b,ir)+local_wannier_centres(b,j)-local_wannier_centres(b,i))*phase_fac*OO_R(i,j,ir)
(crvec(b,ir)+local_wannier_centres(b,j)-local_wannier_centres(b,i))*&
phase_fac*OO_R(i,j,ir)
enddo
enddo
end if
Expand Down Expand Up @@ -1214,7 +1221,8 @@ subroutine pw90common_fourier_R_to_k_vec_dadb_TB_conv(kpt,OO_R,OO_da,OO_dadb)
!====================================================================!

use w90_constants, only : dp,cmplx_0,cmplx_i,twopi
use w90_parameters, only : num_kpts,kpt_latt, num_wann, use_ws_distance, wannier_centres, recip_lattice
use w90_parameters, only : num_kpts,kpt_latt, num_wann, use_ws_distance, &
wannier_centres, recip_lattice
use w90_ws_distance, only : irdist_ws, wdist_ndeg, ws_translate_dist
use w90_utility, only : utility_cart_to_frac

Expand Down Expand Up @@ -1285,7 +1293,8 @@ subroutine pw90common_fourier_R_to_k_vec_dadb_TB_conv(kpt,OO_R,OO_da,OO_dadb)
do i=1,num_wann
do ideg = 1,wdist_ndeg(j,i,ir)

rdotk=twopi*dot_product(kpt(:),real(irdist_ws(:,ideg,i,j,ir)+wannier_centres_frac(:,j)-wannier_centres_frac(:,i),dp))
rdotk=twopi*dot_product(kpt(:),real(irdist_ws(:,ideg,i,j,ir)+&
wannier_centres_frac(:,j)-wannier_centres_frac(:,i),dp))
phase_fac=cmplx(cos(rdotk),sin(rdotk),dp)/real(ndegen(ir)*wdist_ndeg(i,j,ir),dp)
! rdotk=twopi*dot_product(kpt(:),irvec(:,ir))
! phase_fac=cmplx(cos(rdotk),sin(rdotk),dp)/real(ndegen(ir),dp)
Expand All @@ -1307,7 +1316,8 @@ subroutine pw90common_fourier_R_to_k_vec_dadb_TB_conv(kpt,OO_R,OO_da,OO_dadb)
else
do a=1,3
do b=1,3
OO_dadb(i,j,a,b)=OO_dadb(i,j,a,b)+cmplx_i*(crvec(b,ir)+local_wannier_centres(b,j)-local_wannier_centres(b,i))*phase_fac*OO_R(i,j,ir,a)
OO_dadb(i,j,a,b)=OO_dadb(i,j,a,b)+cmplx_i*(crvec(b,ir)+local_wannier_centres(b,j)-&
local_wannier_centres(b,i))*phase_fac*OO_R(i,j,ir,a)
enddo
enddo
endif
Expand Down Expand Up @@ -1346,15 +1356,17 @@ subroutine pw90common_fourier_R_to_k_vec_dadb_TB_conv(kpt,OO_R,OO_da,OO_dadb)
if ((irvec(1,ir).eq.0).and.(irvec(2,ir).eq.0).and.(irvec(3,ir).eq.0).and.(i.eq.j)) then
do a=1,3
do b=1,3
OO_dadb(i,j,a,b)=OO_dadb(i,j,a,b)+cmplx_i*(crvec(b,ir)+local_wannier_centres(b,j)-local_wannier_centres(b,i))*phase_fac*&
OO_dadb(i,j,a,b)=OO_dadb(i,j,a,b)+cmplx_i*(crvec(b,ir)+local_wannier_centres(b,j)-&
local_wannier_centres(b,i))*phase_fac*&
( OO_R(i,j,ir,a)-local_wannier_centres(a,j) )
enddo
enddo
! cycle
else
do a=1,3
do b=1,3
OO_dadb(i,j,a,b)=OO_dadb(i,j,a,b)+cmplx_i*(crvec(b,ir)+local_wannier_centres(b,j)-local_wannier_centres(b,i))*phase_fac*OO_R(i,j,ir,a)
OO_dadb(i,j,a,b)=OO_dadb(i,j,a,b)+cmplx_i*(crvec(b,ir)+local_wannier_centres(b,j)-&
local_wannier_centres(b,i))*phase_fac*OO_R(i,j,ir,a)
enddo
enddo
endif
Expand Down
3 changes: 2 additions & 1 deletion src/postw90/wan_ham.F90
Original file line number Diff line number Diff line change
Expand Up @@ -505,7 +505,8 @@ subroutine wham_get_eig_UU_HH_AA_sc_TB_conv(kpt,eig,UU,HH,HH_da,HH_dadb)

use w90_parameters, only : num_wann
use w90_get_oper, only : HH_R,get_HH_R,AA_R,get_AA_R
use w90_postw90_common, only : pw90common_fourier_R_to_k_new_second_d, pw90common_fourier_R_to_k_new_second_d_TB_conv
use w90_postw90_common, only : pw90common_fourier_R_to_k_new_second_d, &
pw90common_fourier_R_to_k_new_second_d_TB_conv
use w90_utility, only : utility_diagonalize

real(kind=dp), dimension(3), intent(in) :: kpt
Expand Down
Loading

0 comments on commit e9becb3

Please sign in to comment.