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
26 integer jst,i,nthd
27 real(8) t1
28 complex(8) z1
29 ! allocatable arrays
30 real(8), allocatable :: w(:)
31 complex(8), allocatable :: h(:,:),o(:,:),dh(:,:),od(:,:),x(:),y(:)
32 ! external functions
33 real(8), external :: ddot
34 ! matrix sizes for k and k+q
35 nm=ngp+nlotot
36 nmq=ngpq+nlotot
37 allocate(h(nmq,nmq),o(nmq,nmq))
38 ! compute the Hamiltonian and overlap matrices at p+q
39 call holdthd(2,nthd)
40 !$OMP PARALLEL SECTIONS DEFAULT(SHARED) &
41 !$OMP NUM_THREADS(nthd)
42 !$OMP SECTION
43 call hmlfv(nmq,ngpq,igpqig,vgpqc,apwalmq,h)
44 !$OMP SECTION
45 call olpfv(nmq,ngpq,igpqig,apwalmq,o)
46 !$OMP END PARALLEL SECTIONS
47 call freethd(nthd)
48 ! solve the generalised eigenvalue problem (H - eⱼ O)|vⱼ> = 0
49 ! (note: these are also the eigenvalues/vectors of O⁻¹ H )
50 allocate(w(nmq))
51 call zhegvdi(nmq,nmq,h,o,w)
52 ! compute the Hamiltonian and overlap matrix derivatives
53 allocate(dh(nmq,nm),od(nmq,nm))
54 call holdthd(2,nthd)
55 !$OMP PARALLEL SECTIONS DEFAULT(SHARED) &
56 !$OMP PRIVATE(ias,is) &
57 !$OMP NUM_THREADS(nthd)
58 !$OMP SECTION
59 call dhmlistl(ngp,ngpq,igpig,igpqig,vgpc,vgpqc,nmq,dh)
60 dh(ngpq+1:nmq,1:ngp)=0.d0
61 dh(1:nmq,ngp+1:nm)=0.d0
62 do ias=1,natmtot
63  is=idxis(ias)
64  call dhmlaa(is,ias,ngp,ngpq,apwalm(:,:,:,ias),apwalmq(:,:,:,ias),dapwalm, &
65  dapwalmq,nmq,dh)
66  call dhmlalo(is,ias,ngp,ngpq,apwalm(:,:,:,ias),apwalmq(:,:,:,ias),dapwalm, &
67  dapwalmq,nmq,dh)
68  call dhmllolo(is,ias,ngp,ngpq,nmq,dh)
69 end do
70 !$OMP SECTION
71 call dolpistl(ngp,ngpq,igpig,igpqig,nmq,od)
72 od(ngpq+1:nmq,1:ngp)=0.d0
73 od(1:nmq,ngp+1:nm)=0.d0
74 do ias=1,natmtot
75  is=idxis(ias)
76  call dolpaa(is,ias,ngp,ngpq,apwalm(:,:,:,ias),apwalmq(:,:,:,ias),dapwalm, &
77  dapwalmq,nmq,od)
78  call dolpalo(is,ias,ngp,ngpq,dapwalm,dapwalmq,nmq,od)
79 end do
80 !$OMP END PARALLEL SECTIONS
81 call freethd(nthd)
82 allocate(x(nmq),y(nmq))
83 ! loop over states
84 do jst=1,nstfv
85 ! compute |dvⱼ> = V (eⱼ - D)⁻¹ V† (dH - eⱼ dO)|vⱼ>
86  z1=-evalfv(jst)
87  call zgemv('N',nmq,nm,z1,od,nmq,evecfv(:,jst),1,zzero,x,1)
88  call zgemv('N',nmq,nm,zone,dh,nmq,evecfv(:,jst),1,zone,x,1)
89 ! compute the first-order change in eigenvalue
90  if (tphq0) then
91  devalfvp(jst)=ddot(2*nmq,evecfv(:,jst),1,x,1)
92  else
93  devalfvp(jst)=0.d0
94  end if
95  call zgemv('C',nmq,nmq,zone,h,nmq,x,1,zzero,y,1)
96  do i=1,nmq
97  t1=evalfv(jst)-w(i)
98  if (abs(t1) > epsdev) then
99  y(i)=y(i)/t1
100  else
101  y(i)=0.d0
102  end if
103  end do
104  call zgemv('N',nmq,nmq,zone,h,nmq,y,1,zzero,devecfv(:,jst),1)
105 end do
106 deallocate(w,h,dh,od,x,y)
107 end subroutine
108 
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:788
Definition: modomp.f90:6
complex(8), parameter zone
Definition: modmain.f90:1227
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:1227
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:112
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 zhegvdi(n, ld, a, b, w)
Definition: zhegvdi.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