The Elk Code
deveqnfv.f90
Go to the documentation of this file.
1 
2 ! Copyright (C) 2013 J. K. Dewhurst, S. Sharma and E. K. U. Gross.
3 ! This file is distributed under the terms of the GNU General Public License.
4 ! See the file COPYING for license details.
5 
6 subroutine deveqnfv(ngp,ngpq,igpig,igpqig,vgpc,vgpqc,evalfv,apwalm,apwalmq, &
7  dapwalm,dapwalmq,evecfv,devalfvp,devecfv)
8 use modmain
9 use modphonon
10 use modomp
11 implicit none
12 ! arguments
13 integer, intent(in) :: ngp,ngpq
14 integer, intent(in) :: igpig(ngkmax),igpqig(ngkmax)
15 real(8), intent(in) :: vgpc(3,ngkmax),vgpqc(3,ngkmax)
16 real(8), intent(in) :: evalfv(nstfv)
17 complex(8), intent(in) :: apwalm(ngkmax,apwordmax,lmmaxapw,natmtot)
18 complex(8), intent(in) :: apwalmq(ngkmax,apwordmax,lmmaxapw,natmtot)
19 complex(8), intent(in) :: dapwalm(ngkmax,apwordmax,lmmaxapw)
20 complex(8), intent(in) :: dapwalmq(ngkmax,apwordmax,lmmaxapw)
21 complex(8), intent(in) :: evecfv(nmatmax,nstfv)
22 real(8), intent(out) :: devalfvp(nstfv)
23 complex(8), intent(out) :: devecfv(nmatmax,nstfv)
24 ! local variables
25 integer nm,nmq,is,ias,jst,i
26 integer lwork,info,nthd
27 real(8) t1
28 complex(8) z1
29 ! allocatable arrays
30 real(8), allocatable :: w(:),rwork(:)
31 complex(8), allocatable :: h(:,:),o(:,:),dh(:,:),od(:,:)
32 complex(8), allocatable :: x(:),y(:),work(:)
33 ! external functions
34 real(8), external :: ddot
35 ! matrix sizes for k and k+q
36 nm=ngp+nlotot
37 nmq=ngpq+nlotot
38 allocate(h(nmq,nmq),o(nmq,nmq))
39 ! compute the Hamiltonian and overlap matrices at p+q
40 call holdthd(2,nthd)
41 !$OMP PARALLEL SECTIONS DEFAULT(SHARED) &
42 !$OMP NUM_THREADS(nthd)
43 !$OMP SECTION
44 call hmlfv(nmq,ngpq,igpqig,vgpqc,apwalmq,h)
45 !$OMP SECTION
46 call olpfv(nmq,ngpq,igpqig,apwalmq,o)
47 !$OMP END PARALLEL SECTIONS
48 call freethd(nthd)
49 ! solve the generalised eigenvalue problem (H - eⱼ O)|vⱼ> = 0
50 ! (note: these are also the eigenvalues/vectors of O⁻¹ H )
51 lwork=2*nmq
52 allocate(w(nmq),rwork(3*nmq),work(lwork))
53 call zhegv(1,'V','U',nmq,h,nmq,o,nmq,w,work,lwork,rwork,info)
54 if (info /= 0) then
55  write(*,*)
56  write(*,'("Error(deveqnfv): diagonalisation failed")')
57  write(*,'(" ZHEGV returned INFO = ",I8)') info
58  write(*,*)
59  stop
60 end if
61 deallocate(rwork,o,work)
62 ! compute the Hamiltonian and overlap matrix derivatives
63 allocate(dh(nmq,nm),od(nmq,nm))
64 call holdthd(2,nthd)
65 !$OMP PARALLEL SECTIONS DEFAULT(SHARED) &
66 !$OMP PRIVATE(ias,is) &
67 !$OMP NUM_THREADS(nthd)
68 !$OMP SECTION
69 call dhmlistl(ngp,ngpq,igpig,igpqig,vgpc,vgpqc,nmq,dh)
70 dh(ngpq+1:nmq,1:ngp)=0.d0
71 dh(1:nmq,ngp+1:nm)=0.d0
72 do ias=1,natmtot
73  is=idxis(ias)
74  call dhmlaa(is,ias,ngp,ngpq,apwalm(:,:,:,ias),apwalmq(:,:,:,ias),dapwalm, &
75  dapwalmq,nmq,dh)
76  call dhmlalo(is,ias,ngp,ngpq,apwalm(:,:,:,ias),apwalmq(:,:,:,ias),dapwalm, &
77  dapwalmq,nmq,dh)
78  call dhmllolo(is,ias,ngp,ngpq,nmq,dh)
79 end do
80 !$OMP SECTION
81 call dolpistl(ngp,ngpq,igpig,igpqig,nmq,od)
82 od(ngpq+1:nmq,1:ngp)=0.d0
83 od(1:nmq,ngp+1:nm)=0.d0
84 do ias=1,natmtot
85  is=idxis(ias)
86  call dolpaa(is,ias,ngp,ngpq,apwalm(:,:,:,ias),apwalmq(:,:,:,ias),dapwalm, &
87  dapwalmq,nmq,od)
88  call dolpalo(is,ias,ngp,ngpq,dapwalm,dapwalmq,nmq,od)
89 end do
90 !$OMP END PARALLEL SECTIONS
91 call freethd(nthd)
92 allocate(x(nmq),y(nmq))
93 ! loop over states
94 do jst=1,nstfv
95 ! compute |dvⱼ> = V (eⱼ - D)⁻¹ V† (dH - eⱼ dO)|vⱼ>
96  z1=-evalfv(jst)
97  call zgemv('N',nmq,nm,z1,od,nmq,evecfv(:,jst),1,zzero,x,1)
98  call zgemv('N',nmq,nm,zone,dh,nmq,evecfv(:,jst),1,zone,x,1)
99 ! compute the first-order change in eigenvalue
100  if (tphq0) then
101  devalfvp(jst)=ddot(2*nmq,evecfv(:,jst),1,x,1)
102  else
103  devalfvp(jst)=0.d0
104  end if
105  call zgemv('C',nmq,nmq,zone,h,nmq,x,1,zzero,y,1)
106  do i=1,nmq
107  t1=evalfv(jst)-w(i)
108  if (abs(t1) > epsdev) then
109  y(i)=y(i)/t1
110  else
111  y(i)=0.d0
112  end if
113  end do
114  call zgemv('N',nmq,nmq,zone,h,nmq,y,1,zzero,devecfv(:,jst),1)
115 end do
116 deallocate(w,h,dh,od,x,y)
117 end subroutine
118 
pure subroutine dolpistl(ngp, ngpq, igpig, igpqig, ld, od)
Definition: dolpistl.f90:7
logical tphq0
Definition: modphonon.f90:17
subroutine dhmlaa(is, ias, ngp, ngpq, apwalm, apwalmq, dapwalm, dapwalmq, ld, dh)
Definition: dhmlaa.f90:7
subroutine olpfv(nmatp, ngp, igpig, apwalm, o)
Definition: olpfv.f90:7
integer nlotot
Definition: modmain.f90:790
Definition: modomp.f90:6
complex(8), parameter zone
Definition: modmain.f90:1240
pure subroutine dhmlistl(ngp, ngpq, igpig, igpqig, vgpc, vgpqc, ld, dh)
Definition: dhmlistl.f90:7
subroutine dolpaa(is, ias, ngp, ngpq, apwalm, apwalmq, dapwalm, dapwalmq, ld, od)
Definition: dolpaa.f90:7
complex(8), parameter zzero
Definition: modmain.f90:1240
integer, dimension(maxatoms *maxspecies) idxis
Definition: modmain.f90:44
subroutine deveqnfv(ngp, ngpq, igpig, igpqig, vgpc, vgpqc, evalfv, apwalm, apwalmq, dapwalm, dapwalmq, evecfv, devalfvp, devecfv)
Definition: deveqnfv.f90:8
real(8) epsdev
Definition: modphonon.f90:128
subroutine freethd(nthd)
Definition: modomp.f90:106
subroutine holdthd(nloop, nthd)
Definition: modomp.f90:78
pure subroutine dhmllolo(is, ias, ngp, ngpq, ld, dh)
Definition: dhmllolo.f90:7
pure subroutine dolpalo(is, ias, ngp, ngpq, dapwalm, dapwalmq, ld, od)
Definition: dolpalo.f90:7
subroutine hmlfv(nmatp, ngp, igpig, vgpc, apwalm, h)
Definition: hmlfv.f90:7
pure subroutine dhmlalo(is, ias, ngp, ngpq, apwalm, apwalmq, dapwalm, dapwalmq, ld, dh)
Definition: dhmlalo.f90:7