Line data Source code
1 : MODULE m_greensfEigVecCoeffs
2 :
3 : USE m_juDFT
4 : USE m_types
5 : USE m_constants
6 :
7 : IMPLICIT NONE
8 :
9 : CONTAINS
10 :
11 20700 : SUBROUTINE greensfEigVecCoeffs(nBands,l,lp,natom,natomp,atomType,atomTypep,spin1,spin2,&
12 20700 : l_sphavg,atoms,scalarGF,eigVecCoeffs,im)
13 :
14 : INTEGER, INTENT(IN) :: nBands !Bands handled on this rank
15 : INTEGER, INTENT(IN) :: l,lp,natom,natomp,atomType,atomTypep,spin1,spin2 !Information about the current element
16 : LOGICAL, INTENT(IN) :: l_sphavg
17 : TYPE(t_atoms), INTENT(IN) :: atoms
18 : TYPE(t_scalarGF), INTENT(IN) :: scalarGF
19 : TYPE(t_eigVecCoeffs), INTENT(IN) :: eigVecCoeffs
20 : COMPLEX, INTENT(INOUT) :: im(-lmaxU_const:,-lmaxU_const:,:,:)
21 :
22 : INTEGER :: m,mp,lm,lmp,ilo,ilop,nLO_ind,nLOp_ind,imat
23 :
24 87285246 : im = cmplx_0
25 :
26 : !$OMP parallel do default(none) collapse(2) &
27 : !$OMP shared(eigVecCoeffs,im,scalarGF,atoms) &
28 : !$OMP shared(l,lp,natom,natomp,nBands,atomType,atomTypep,spin1,spin2,l_sphavg) &
29 20700 : !$OMP private(m,mp,lm,lmp,ilo,ilop,nLO_ind,nLOp_ind,imat)
30 : DO m = -l, l
31 : DO mp = -lp,lp
32 : nLO_ind = 0
33 : nLOp_ind = 0
34 : lm = l*(l+1)+m
35 : lmp = lp*(lp+1)+mp
36 :
37 : !-------------------------
38 : !Contribution from valence states
39 : !-------------------------
40 : IF(l_sphavg) THEN
41 : im(m,mp,:,1) = im(m,mp,:,1) &
42 : + scalarGF%uun(spin1,spin2) * conjg(eigVecCoeffs%abcof(:nBands,lmp,0,natomp,spin1))&
43 : * eigVecCoeffs%abcof(:nBands,lm ,0,natom ,spin2) &
44 : + scalarGF%udn(spin1,spin2) * conjg(eigVecCoeffs%abcof(:nBands,lmp,0,natomp,spin1))&
45 : * eigVecCoeffs%abcof(:nBands,lm ,1,natom ,spin2) &
46 : + scalarGF%dun(spin1,spin2) * conjg(eigVecCoeffs%abcof(:nBands,lmp,1,natomp,spin1))&
47 : * eigVecCoeffs%abcof(:nBands,lm ,0,natom ,spin2) &
48 : + scalarGF%ddn(spin1,spin2) * conjg(eigVecCoeffs%abcof(:nBands,lmp,1,natomp,spin1))&
49 : * eigVecCoeffs%abcof(:nBands,lm ,1,natom ,spin2)
50 : ELSE
51 : im(m,mp,:,1) = im(m,mp,:,1) + conjg(eigVecCoeffs%abcof(:nBands,lmp,0,natomp,spin1))&
52 : * eigVecCoeffs%abcof(:nBands,lm ,0,natom ,spin2)
53 : im(m,mp,:,2) = im(m,mp,:,2) + conjg(eigVecCoeffs%abcof(:nBands,lmp,1,natomp,spin1))&
54 : * eigVecCoeffs%abcof(:nBands,lm ,1,natom ,spin2)
55 : im(m,mp,:,3) = im(m,mp,:,3) + conjg(eigVecCoeffs%abcof(:nBands,lmp,0,natomp,spin1))&
56 : * eigVecCoeffs%abcof(:nBands,lm ,1,natom ,spin2)
57 : im(m,mp,:,4) = im(m,mp,:,4) + conjg(eigVecCoeffs%abcof(:nBands,lmp,1,natomp,spin1))&
58 : * eigVecCoeffs%abcof(:nBands,lm ,0,natom ,spin2)
59 : END IF
60 :
61 : !------------------------------------------------------------------------------------------------------
62 : ! add local orbital contribution (not tested)
63 : !------------------------------------------------------------------------------------------------------
64 : DO ilo = 1, atoms%nlo(atomType)
65 : IF(atoms%llo(ilo,atomType).NE.l) CYCLE
66 : IF(l_sphavg) THEN
67 : im(m,mp,:,1) = im(m,mp,:,1) &
68 : + scalarGF%uulon(ilo,spin1,spin2) * conjg(eigVecCoeffs%abcof( :nBands,lmp,0,natomp,spin1))&
69 : * eigVecCoeffs%ccof(m ,:nBands,ilo,natom ,spin2) &
70 : + scalarGF%dulon(ilo,spin1,spin2) * conjg(eigVecCoeffs%abcof( :nBands,lmp,1,natomp,spin1))&
71 : * eigVecCoeffs%ccof(m ,:nBands,ilo,natom ,spin2)
72 : ELSE
73 : nLO_ind = nLO_ind + 1
74 : imat = 4+(nLO_ind-1)*2
75 : im(m,mp,:,imat+1) = im(m,mp,:,imat+1) + conjg(eigVecCoeffs%abcof( :nBands,lmp,0,natomp,spin1))&
76 : * eigVecCoeffs%ccof(m,:nBands,ilo,natom ,spin2)
77 : im(m,mp,:,imat+2) = im(m,mp,:,imat+2) + conjg(eigVecCoeffs%abcof( :nBands,lmp,1,natomp,spin1))&
78 : * eigVecCoeffs%ccof(m,:nBands,ilo,natom ,spin2)
79 : ENDIF
80 : ENDDO
81 : DO ilo = 1, atoms%nlo(atomTypep)
82 : IF(atoms%llo(ilo,atomTypep).NE.lp) CYCLE
83 : IF(l_sphavg) THEN
84 : im(m,mp,:,1) = im(m,mp,:,1) &
85 : + scalarGF%uloun(ilo,spin1,spin2) * conjg(eigVecCoeffs%ccof(mp,:nBands,ilo,natomp,spin1))&
86 : * eigVecCoeffs%abcof( :nBands,lm ,0,natom ,spin2) &
87 : + scalarGF%ulodn(ilo,spin1,spin2) * conjg(eigVecCoeffs%ccof(mp,:nBands,ilo,natomp,spin1))&
88 : * eigVecCoeffs%abcof( :nBands,lm ,1,natom ,spin2)
89 : ELSE
90 : nLO_ind = nLO_ind + 1
91 : imat = 4+(nLO_ind-1)*2
92 : im(m,mp,:,imat+1) = im(m,mp,:,imat+1) + conjg(eigVecCoeffs%ccof(mp,:nBands,ilo,natomp,spin1))&
93 : * eigVecCoeffs%abcof( :nBands,lm ,0,natom ,spin2)
94 : im(m,mp,:,imat+2) = im(m,mp,:,imat+2) + conjg(eigVecCoeffs%ccof(mp,:nBands,ilo,natomp,spin1))&
95 : * eigVecCoeffs%abcof( :nBands,lm ,1,natom ,spin2)
96 : ENDIF
97 : ENDDO
98 :
99 : DO ilo = 1, atoms%nlo(atomType)
100 : IF(atoms%llo(ilo,atomType).NE.l) CYCLE
101 : DO ilop = 1, atoms%nlo(atomTypep)
102 : IF (atoms%llo(ilop,atomTypep).NE.lp) CYCLE
103 : IF(l_sphavg) THEN
104 : im(m,mp,:,1) = im(m,mp,:,1) &
105 : + scalarGF%uloulopn(ilo,ilop,spin1,spin2) * conjg(eigVecCoeffs%ccof(mp,:nBands,ilop,natomp,spin1))&
106 : * eigVecCoeffs%ccof(m ,:nBands,ilo ,natom ,spin2)
107 : ELSE
108 : nLOp_ind = nLOp_ind + 1
109 : imat = 4+nLO_ind*2+nLOp_ind
110 : im(m,mp,:,imat) = im(m,mp,:,imat) + conjg(eigVecCoeffs%ccof(mp,:nBands,ilop,natomp,spin1))&
111 : * eigVecCoeffs%ccof(m ,:nBands,ilo ,natom ,spin2)
112 : ENDIF
113 : ENDDO
114 : ENDDO
115 : ENDDO!mp
116 : ENDDO !m
117 : !$OMP end parallel do
118 :
119 20700 : END SUBROUTINE greensfEigVecCoeffs
120 : END MODULE m_greensfEigVecCoeffs
|