Line data Source code
1 : MODULE m_nIJmat
2 :
3 : !------------------------------------------------------------------------------ !
4 : ! !
5 : ! MODULE: m_nIJmat !
6 : ! !
7 : ! Author : Wejdan Beida !
8 : ! !
9 : ! Description: This module calculates the occupation matrix between two atoms. !
10 : ! !
11 : !------------------------------------------------------------------------------ !
12 :
13 :
14 : CONTAINS
15 :
16 0 : SUBROUTINE nIJ_mat(input,atoms,ne,usdus,jspin,we,eigVecCoeffs,cell,kpts,kptindx,nIJ_llp_mmp,enpara,v)
17 :
18 : USE m_types
19 : USE m_constants
20 : USE m_juDFT
21 : USE m_intgr, ONLY : intgr0
22 : USE m_radfun
23 : !USE m_check_mt_radii
24 :
25 : IMPLICIT NONE
26 :
27 : TYPE(t_usdus), INTENT(IN) :: usdus
28 : TYPE(t_input), INTENT(IN) :: input
29 : TYPE(t_atoms), INTENT(IN) :: atoms
30 : TYPE(t_eigVecCoeffs),INTENT(IN) :: eigVecCoeffs
31 : TYPE(t_kpts), INTENT(IN) :: kpts
32 : TYPE(t_cell), INTENT(IN) :: cell
33 : INTEGER, INTENT(IN) :: ne,jspin,kptindx
34 : REAL, INTENT(IN) :: we(:)
35 : COMPLEX, INTENT(INOUT) :: nIJ_llp_mmp(-lmaxU_const:,-lmaxU_const:,:)
36 : TYPE(t_enpara), INTENT(IN) :: enpara
37 : TYPE(t_potden), INTENT(IN) :: v
38 0 : TYPE(t_usdus) :: usdustemp
39 :
40 : INTEGER i,i_v,i_pair,natom1,latom1,ll1atom1,atom2,natom2,latom2,ll1atom2,matom1,matom2,lm1atom1,lm1atom2,counter
41 : COMPLEX c_0,A1, B1, A2, B2, power_factor, exponent
42 : REAL norm1_W, norm2_W
43 :
44 0 : counter=0
45 0 : DO i_v = 1,atoms%n_v
46 : Do atom2=1,atoms%lda_v(i_v)%numOtherAtoms
47 : counter=counter+1
48 : ENDDO
49 : ENDDO
50 :
51 0 : CALL usdustemp%init(atoms,input%jspins)
52 0 : CALL timestart("nIJ_mat")
53 :
54 0 : i_pair=1
55 0 : DO i_v = 1,atoms%n_v
56 0 : natom1=atoms%lda_v(i_v)%atomIndex
57 0 : latom1=atoms%lda_v(i_v)%thisAtomL
58 0 : ll1atom1=latom1*(latom1+1)
59 0 : norm1_W = usdus%ddn(latom1,atoms%itype(natom1),jspin)**0.5
60 0 : Do atom2=1,atoms%lda_v(i_v)%numOtherAtoms
61 0 : natom2=atoms%lda_v(i_v)%otherAtomIndices(atom2)
62 0 : latom2=atoms%lda_v(i_v)%otherAtomL
63 0 : ll1atom2=latom2*(latom2+1)
64 0 : norm2_W = usdus%ddn(latom2,atoms%itype(natom2),jspin)**0.5
65 0 : power_factor=(cmplx(0, 1)**latom1) *(cmplx(0, -1)**latom2)
66 0 : exponent=EXP(cmplx(0.0,-tpi_const)*dot_product(atoms%lda_v(i_v)%atomShifts(:,atom2),kpts%bk(:,kptindx)))
67 0 : Do matom1=-latom1,latom1
68 0 : lm1atom1=ll1atom1+matom1
69 0 : Do matom2=-latom2,latom2
70 0 : lm1atom2=ll1atom2+matom2
71 0 : c_0=cmplx_0
72 0 : Do i=1,ne
73 0 : A1 = eigVecCoeffs%abcof(i,lm1atom1,0,natom1,jspin)
74 0 : B1 = eigVecCoeffs%abcof(i,lm1atom1,1,natom1,jspin)
75 0 : A2 = eigVecCoeffs%abcof(i,lm1atom2,0,natom2,jspin)
76 0 : B2 = eigVecCoeffs%abcof(i,lm1atom2,1,natom2,jspin)
77 0 : c_0 = c_0 + we(i) * (conjg(A2)*A1 + conjg(A2)*B1*norm1_W + conjg(B2)*A1*norm2_W + conjg(B2)*B1*norm1_W*norm2_W) * power_factor * exponent
78 : ENDDO
79 0 : nIJ_llp_mmp(matom1,matom2,i_pair) = nIJ_llp_mmp(matom1,matom2,i_pair) + c_0
80 : ENDDO
81 : ENDDO
82 0 : i_pair=i_pair+1
83 : ENDDO
84 : ENDDO
85 0 : call timestop("nIJ_mat")
86 :
87 0 : END SUBROUTINE nIJ_mat
88 : END MODULE m_nIJmat
89 :
90 :
|