[Pw_forum] Electron-phonon coupling

Paolo Giannozzi giannozz at nest.sns.it
Wed Apr 2 23:20:19 CEST 2003


Hi

> According to 7-th example,  the code is able to
> calculate \lambda_{nk} (in the example k-point is X).
> I am calculating it for a number of k-points in the
> 1/48 part of the BZ for FCC lattice. The origin of the
> k-points I am using is slightly shifted (so, it is
> not k=(000)).  I supposed that later \lambda_{nk}
> could be  integrated using the tetrahedron method.

you do not need any tetrahedron method: you just average over
the irreducible BZ. You can use gaussian broadening to calculate
alpha^2F(omega). I am attaching the code I used to sum over q
(no warranty that it works) and some notes I wrote.

Paolo
--
Paolo Giannozzi             e-mail:  giannozz at nest.sns.it
Scuola Normale Superiore    Phone:   +39/050509412
Piazza dei Cavalieri 7      Fax:     +39/050509417, 050563513
I-56126 Pisa, Italy         Office:  Lab. NEST, Via della Faggiola 19

-------------- next part --------------

      program elph

      implicit none
      integer npk, nsigx, nmodex, nex
      parameter(npk=200, nsigx=50, nmodex=100, nex=200)
      integer nks, ios, iuelph, ngauss, ngauss1, ngaussq, nsig, nmodes
      integer ik, ng, mu, nu, i
      real*8 q(3,npk), wk(npk), degauss(nsigx), w2(nmodex),
     +     dosef(nsigx), ef(nsigx), lambdaq(nmodex,nsigx),
     +     lambda(nsigx), alpha2F(nex,nsigx), logavg
      real*8 qread(3), dosef1, ef1, degauss1, gammaq, lambda2,
     +     w0gauss, degaussq, emax, deltae, e, omega, sum
      character*50 filelph
      external w0gauss

c emax and degaussq in THz
      read(5,*) emax, degaussq,ngaussq
      deltae=emax/(nex-1)
      read(5,*) nks
      if (nks.gt.npk) call error('lambda','too many q-points',npk)
      sum=0.d0
      do ik=1,nks
         read(5,*) q(1,ik), q(2,ik), q(3,ik), wk(ik)
         sum = sum + wk(ik)
      end do
      do ik=1,nks
         wk(ik)=wk(ik)/sum
      end do

      iuelph=4
      do ik=1,nks
         read(5,'(a)') filelph
         open(unit=iuelph,file=filelph,status='old',iostat=ios)
         read (iuelph,*) qread(1),qread(2),qread(3), nsig, nmodes
         if ( (qread(1)-q(1,ik))**2 + (qread(2)-q(2,ik))**2 
     +       +(qread(3)-q(3,ik))**2 .gt. 1.d-6) 
     +      call error('lambda','inconsistent q read',ik)
         if (nsig.le.0.or.nsig.gt.nsigx)
     +        call error('lambda','wrong/too many gauss.broad.',nsigx)
         if (nmodes.le.0.or.nmodes.gt.nmodex)
     +        call error('lambda','wrong # or too many modes',nmodex)
         if (ik.eq.1) then
            do ng=1,nsig
               lambda(ng)=0.d0
               do i=1,nex                  
                  alpha2F(i,ng)=0.d0
               end do
            end do
         end if
c read omega^2
         read(iuelph,*) (w2(nu),nu=1,nmodes)
c read data
         do ng=1,nsig
            read (iuelph,9000) degauss1, ngauss1
            if (ik.eq.1) then
               degauss(ng)=degauss1
               ngauss =ngauss1
            else
               if (degauss(ng).ne.degauss1.or.ngauss.ne.ngauss1)
     +          call error('lambda','inconsistent gauss.broad. read',ik)
            end if
            read (iuelph,9005) dosef1, ef1
            if (ik.eq.1) then
               dosef(ng)=dosef1
               ef(ng)=ef1
            else
               if (dosef(ng).ne.dosef1.or.ef(ng).ne.ef1)
     +          call error('lambda','inconsistent DOS(Ef) read',ik)
            end if
            do mu=1,nmodes
               read (iuelph,9010) nu, lambdaq(mu,ng), gammaq
               if (nu.ne.mu) call error('lambda','wrong mode read',mu)
c sum over k-points
               lambda(ng) = lambda(ng) + wk(ik)*lambdaq(mu,ng)
               do i=1,nex
                  e=(i-1)*deltae
c 1 Ry = 3289.828 THz
                  omega=sqrt(w2(mu))*3289.828
                  alpha2F(i,ng) = alpha2F(i,ng)
     +                 + wk(ik)*lambdaq(mu,ng)*omega*0.5d0
     +                  *w0gauss((e-omega)/degaussq,ngaussq)/degaussq
               end do
c
            end do
c
         end do
         close(unit=iuelph)

      end do

      open(unit=iuelph,file='lambda.dat',status='unknown',
     +     form='formatted')
      write(iuelph,9014)
      do ng=1,nsig
c lambda2 is used as a check
c logavg is the logarithmic average of omega used in McMillan's formula (?)
         lambda2=0.d0
         logavg =0.d0
         do i=2,nex
            e=(i-1)*deltae
            lambda2=lambda2 + alpha2F(i,ng)/e
            logavg =logavg + alpha2F(i,ng)*log(e)/e
         end do
         lambda2=lambda2*2.d0*deltae
         logavg =logavg*2.d0 *deltae
c 1 THz = 50 K
         logavg=exp(logavg/lambda2)*50.d0
         write(6,9015) lambda(ng), lambda2, logavg,dosef(ng),degauss(ng)
         write(iuelph,9016) 
     +        degauss(ng), lambda(ng), lambda2, logavg,dosef(ng)
      end do
      close(unit=iuelph)

      open(unit=iuelph,file='alpha2F.dat',status='unknown',
     +     form='formatted')
      write(iuelph,9020) (degauss(ng),ng=1,nsig)
      do i=1,nex
         e=(i-1)*deltae
         write(iuelph,9025) e,(alpha2F(i,ng),ng=1,nsig)
      end do
      close(unit=iuelph)

      stop
 9000 format(5x,'Gaussian Broadening: ',f7.3,' Ry, ngauss=',i4)
 9005 format(5x,'DOS =',f10.6,' states/spin/Ry/Unit Cell at Ef=',
     +       f10.6,' eV')
 9010 format(5x,'lambda(',i2,')=',f10.6,'   gamma=',f10.6,' GHz')
 9014 format('# degauss   lambda    int alpha2F  <log w>     N(Ef)')
 9015 format(5x,'lambda =',f9.6,' (',f10.6,')  <log w>=',f9.3,'K  ',
     +          'N(Ef)=',f9.6,' at degauss=',f5.3)
 9016 format(f7.3,2f12.6,f10.3,2f12.6)
 9020 format('# E(THz)',10(f10.3))
 9025 format(f8.4,10(f10.5))

      end

-------------- next part --------------
A non-text attachment was scrubbed...
Name: e-ph.tex
Type: application/x-tex
Size: 2214 bytes
Desc: 
Url : /pipermail/attachments/20030402/c5390192/attachment.bin 


More information about the Pw_forum mailing list