Line data Source code
1 : MODULE m_dostetra
2 :
3 : USE m_types_kpts
4 : USE m_types_input
5 : USE m_tetrahedronInit
6 :
7 : IMPLICIT NONE
8 :
9 : CONTAINS
10 :
11 0 : SUBROUTINE dostetra(kpts,input,eMesh,eig,qal,g,energyShift)
12 :
13 : TYPE(t_kpts), INTENT(IN) :: kpts
14 : TYPE(t_input), INTENT(IN) :: input
15 : REAL, INTENT(IN) :: eMesh(:)
16 : REAL, INTENT(IN) :: eig(:,:,:)
17 : REAL, INTENT(IN) :: qal(:,:,:)
18 : REAL, INTENT(INOUT) :: g(:,:)
19 : REAL, OPTIONAL, INTENT(IN) :: energyShift
20 :
21 0 : INTEGER :: ikpt,iBand,ie,ispin,neig(kpts%nkpt)
22 0 : REAL :: w(size(eMesh),size(qal,1))
23 : REAL :: shift
24 0 : REAL, ALLOCATABLE :: eig_shifted(:,:,:)
25 :
26 0 : shift = 0.0
27 0 : IF(PRESENT(energyShift)) shift = energyShift
28 :
29 0 : eig_shifted = eig - shift
30 :
31 0 : g = 0.0
32 0 : DO ispin = 1, size(qal,3)
33 0 : DO ikpt = 1, kpts%nkpt
34 0 : neig=count(eig(:,ikpt,ispin)<1E99)
35 : ENDDO
36 0 : DO ikpt = 1, kpts%nkpt
37 : !------------------------------------------------------
38 : ! Calculate the weights for the DOS on the energy Grid
39 : !------------------------------------------------------
40 : CALL tetrahedronInit(kpts,input,ikpt,eig_shifted(:,:,ispin),MINVAL(neig),eMesh,&
41 0 : w,dos=.TRUE.)
42 0 : DO iBand = 1, neig(ikpt)
43 0 : DO ie = 1, SIZE(eMesh)
44 0 : g(ie,ispin) = g(ie,ispin) + w(ie,iBand) * 2.0/input%jspins * qal(iBand,ikpt,ispin)
45 : ENDDO
46 : ENDDO
47 : ENDDO
48 : ENDDO
49 :
50 0 : END SUBROUTINE dostetra
51 : END MODULE m_dostetra
|