109
111
call UC_expansion_Sigma_GammaT(E, &
112
no_used,no_tot,El,nq, &
111
113
El%GA,El%Sigma,El%Gamma,nwork,work)
113
115
if ( El%Bulk ) then
114
call UC_expansion_Sigma_Bulk(nou,no,El,nq, &
116
call UC_expansion_Sigma_Bulk(no_used,no_tot,El,nq, &
115
117
El%GA,El%Sigma,nwork,work)
117
119
if ( cE%idx(1) /= 1 ) then ! .not. CONTOUR_EQ
132
call UC_expansion_Sigma(E,nou,no,El,nq, &
134
call UC_expansion_Sigma(E,no_used,no_tot,El,nq, &
133
135
El%GA,El%Sigma,nwork,work)
265
269
! \Sigma = Z*S - H - \Sigma_bulk
266
!$OMP parallel do default(shared), private(io,jo), collapse(2)
270
!$OMP parallel do default(shared), private(io,jo)
269
273
Sigma(io,jo) = work(io,jo,2) - Sigma(io,jo)
457
461
! ********************
458
462
! * LOCAL variables *
459
463
! ********************
460
integer :: iuo, juo, iow
464
integer :: iuo, juo, no
462
466
if ( nq == 1 ) then
463
467
#ifndef TS_NOCHECKS
464
468
if ( no_u /= no_s ) call die('no_E/=no_s')
467
! In case the pre-expansion is not done on H, S
468
if ( El%pre_expand == 1 .and. product(El%Bloch) > 1 ) then
471
! nq == 1 for pre_expand > 0, hence we need to check whether HS
472
! needs to be expanded
473
if ( El%pre_expand == 1 .and. El%bloch%size() > 1 ) then
470
475
! Note that this is because the interface for H and S
472
!$OMP parallel do default(shared), private(iuo,juo), collapse(2)
477
!$OMP parallel do default(shared), private(iuo,juo)
474
479
do iuo = 1 , no_s
475
480
GSE(iuo,juo) = ZEnergy * S(iuo,juo,1) - H(iuo,juo,1)
478
483
!$OMP end parallel do
480
call update_UC_expansion_A(iow,no_s,El,nq,na_u,lasto,&
485
call update_UC_expansion_A(no,no_s,El,El%bloch%size(),na_u,lasto,&
481
486
GSE(1,1),HSE(1,1))
485
! We do not need to copy over GS, as it is
488
!$OMP parallel do default(shared), private(iuo,juo), collapse(2)
490
!$OMP parallel do default(shared), private(iuo,juo)
489
491
do juo = 1 , no_s
490
492
do iuo = 1 , no_s
491
493
!GSE(iuo,juo,1) = GS(iuo,juo,1)
495
497
!$OMP end parallel do
499
501
else if ( El%repeat ) then
500
502
call repeat(H, S, GS)
504
call El%bloch%matrix_unfold_HS_G(El%bkpt_cur, no_u, H, S, GS, Zenergy, HSE, GSE)
507
509
subroutine repeat(H, S, GS)
508
complex(dp), dimension(no_u,no_u,El%Bloch(1),El%Bloch(2),El%Bloch(3)), intent(in) :: H, S, GS
510
complex(dp), dimension(no_u,no_u,El%Bloch%B(1),El%Bloch%B(2),El%Bloch%B(3)), intent(in) :: H, S, GS
509
511
integer :: B(3), i1, i2, i3
510
512
integer :: iau,ia1,ia2,ia3
511
integer :: jow,jau,ja1,ja2,ja3
513
integer :: iow,jow,jau,ja1,ja2,ja3
512
514
complex(dp) :: p(3), pZ, qPi
513
515
real(dp) :: rPi(3), wq
518
520
!$OMP& private(jow,jau,ja1,ja2,ja3,juo)
523
525
!$OMP end workshare
525
527
! Save some multiplications
527
529
wq = log(1._dp / real(nq,dp))
533
rPi = 2._dp * Pi * (q_exp(El,i1,i2,i3) + El%bkpt_cur)
535
rPi = 2._dp * Pi * (El%bloch%get_k(i1,i2,i3) + El%bkpt_cur)
534
536
qPi = exp(cmplx(0._dp,rPi(1),dp))
537
539
do iau = 1 , na_u
538
540
do ia3 = 1 , B(3)
539
541
do ia2 = 1 , B(2)
559
561
do juo = 1 + lasto(jau-1) , lasto(jau)
564
HSE(jow,iow) = HSE(jow,iow) + pZ * S(juo,iuo,i1,i2,i3) - p(1) * H(juo,iuo,i1,i2,i3)
562
565
GSE(jow,iow) = GSE(jow,iow) + p(1) * GS(juo,iuo,i1,i2,i3)
563
HSE(jow,iow) = HSE(jow,iow) + pZ * S(juo,iuo,i1,i2,i3) - p(1) * H(juo,iuo,i1,i2,i3)
583
585
end subroutine repeat
585
subroutine tile(H, S, GS)
586
complex(dp), dimension(no_u,no_u,El%Bloch(1),El%Bloch(2),El%Bloch(3)), intent(in) :: H, S, GS
587
integer :: B(3), i1, i2, i3
588
integer :: iau,ia1,ia2,ia3
589
integer :: jow,jau,ja1,ja2,ja3
590
complex(dp) :: p(3), pZ, qPi
591
real(dp) :: rPi(3), wq
593
!$OMP parallel default(shared), private(wq,rPi,qPi,p,pZ), &
594
!$OMP& private(B,i1,i2,i3), &
595
!$OMP& private(iow,iau,ia1,ia2,ia3,iuo), &
596
!$OMP& private(jow,jau,ja1,ja2,ja3,juo)
603
! Save some multiplications
605
wq = log(1._dp / real(nq,dp))
611
rPi = 2._dp * Pi * (q_exp(El,i1,i2,i3) + El%bkpt_cur)
612
qPi = exp(cmplx(0._dp,rPi(1),dp))
619
p(3) = exp(cmplx(wq,-ia1*rPi(1)-ia2*rPi(2)-ia3*rPi(3),kind=dp))
620
iow = (( (ia3-1)*B(2) + (ia2-1) ) * B(1) + (ia1-1)) * no_u
626
p(2) = p(3)*exp(cmplx(0._dp,ja3*rPi(3),kind=dp))
628
p(1) = p(2)*exp(cmplx(0._dp,ja2*rPi(2),kind=dp))
630
! This takes one additional phase per iteration
636
GSE(jow,iow) = GSE(jow,iow) + p(1) * GS(juo,iuo,i1,i2,i3)
637
HSE(jow,iow) = HSE(jow,iow) + pZ * S(juo,iuo,i1,i2,i3) - p(1) * H(juo,iuo,i1,i2,i3)
657
587
end subroutine update_UC_expansion
659
589
subroutine update_UC_expansion_A(no_u,no_s,El,nq, &
665
595
integer, intent(in) :: no_u, no_s
666
596
type(Elec), intent(in) :: El
667
597
integer, intent(in) :: nq, na_u, lasto(0:na_u)
668
complex(dp), intent(in) :: A(no_u,no_u,El%Bloch(1),El%Bloch(2),El%Bloch(3))
598
complex(dp), intent(in) :: A(no_u,no_u,El%Bloch%B(1),El%Bloch%B(2),El%Bloch%B(3))
669
599
! ********************
670
600
! * OUTPUT variables *
671
601
! ********************
672
602
complex(dp), intent(inout) :: AE(no_s,no_s)
674
integer :: B(3), i1, i2, i3
675
integer :: iau,iow,ia1,ia2,ia3,iuo
676
integer :: jau,jow,ja1,ja2,ja3,juo
677
complex(dp) :: p(3), qPi
678
real(dp) :: rPi(3), wq
680
604
if ( no_u == no_s ) then
681
605
call die('update_UC_expansion_A: error!')
682
606
else if ( El%repeat ) then
609
call El%Bloch%matrix_unfold(El%bkpt_cur, no_u, A, AE)
694
618
! surface Green function
696
620
subroutine repeat()
621
integer :: B(3), i1, i2, i3
622
integer :: iau,iow,ia1,ia2,ia3,iuo
623
integer :: jau,jow,ja1,ja2,ja3,juo
624
complex(dp) :: p(3), qPi
625
real(dp) :: rPi(3), wq
698
627
!$OMP parallel default(shared), private(wq,rPi,qPi,p), &
699
628
!$OMP& private(B,i1,i2,i3), &
705
634
!$OMP end workshare
707
636
! Save some multiplications
709
638
wq = log(1._dp / real(nq,dp))
715
rPi(:) = 2._dp * Pi * (q_exp(El,i1,i2,i3) + El%bkpt_cur)
716
qPi = exp(cmplx(0._dp,rPi(1),kind=dp))
644
rPi(:) = 2._dp * Pi * (El%bloch%get_k(i1,i2,i3) + El%bkpt_cur)
645
qPi = exp(cmplx(0._dp,rPi(1),dp))
719
648
do iau = 1 , na_u
720
649
do ia3 = 1 , B(3)
721
650
do ia2 = 1 , B(2)
760
689
!$OMP end parallel
762
691
end subroutine repeat
766
!$OMP parallel default(shared), private(wq,rPi,qPi,p), &
767
!$OMP& private(B,i1,i2,i3), &
768
!$OMP& private(iow,iau,ia1,ia2,ia3,iuo), &
769
!$OMP& private(jow,jau,ja1,ja2,ja3,juo)
775
! Save some multiplications
777
wq = log(1._dp / real(nq,dp))
783
rPi(:) = 2._dp * Pi * (q_exp(El,i1,i2,i3) + El%bkpt_cur)
784
qPi = exp(cmplx(0._dp,rPi(1),kind=dp))
791
p(3) = exp(cmplx(wq,-ia1*rPi(1)-ia2*rPi(2)-ia3*rPi(3),kind=dp))
792
iow = (( (ia3-1)*B(2) + (ia2-1) ) * B(1) + (ia1-1)) * no_u
798
p(2) = p(3)*exp(cmplx(0._dp,ja3*rPi(3),kind=dp))
800
p(1) = p(2)*exp(cmplx(0._dp,ja2*rPi(2),kind=dp))
806
AE(jow,iow) = AE(jow,iow) + p(1) * A(juo,iuo,i1,i2,i3)
826
693
end subroutine update_UC_expansion_A
828
695
end module m_ts_elec_se