mirror of https://gitlab.com/QEF/q-e.git
137 lines
2.9 KiB
Fortran
137 lines
2.9 KiB
Fortran
!
|
|
! Copyright (C) 2006 PWSCF group
|
|
! This file is distributed under the terms of the
|
|
! GNU General Public License. See the file `License'
|
|
! in the root directory of the present distribution,
|
|
! or http://www.gnu.org/copyleft/gpl.txt .
|
|
! GNU License
|
|
!
|
|
! Eyvaz Isaev
|
|
|
|
! Theoretical Physics Department,
|
|
! Moscow State Institute of Steel and Alloys
|
|
! (Technological University)
|
|
!
|
|
! Condensed Matter Theory Group,
|
|
! Uppsala University, Sweden
|
|
!
|
|
! Eyvaz.Isaev@fysik.uu.se
|
|
! evyaz_isaev@yahoo.com
|
|
!
|
|
! This program calculates phonon density of states using the tetrahedra method
|
|
! frequences are in cm^{-1}
|
|
! a frequency step delta_e (cm^{-1}) is read from temporary phdos.in file
|
|
! Suitable for Espresso 3.0 and higher versions
|
|
|
|
include 'parameters.h'
|
|
|
|
! initial parameters
|
|
parameter (nmax=10000)
|
|
|
|
c reading frequences
|
|
|
|
read(5,'(12X,I4,6X,I4)') nzone, Nkpt
|
|
|
|
!!! NB nzone=3*natoms
|
|
irec=14*nzone
|
|
nstar=nzone
|
|
natoms=nzone/3
|
|
|
|
print*, 'natoms==', natoms
|
|
print*,'irec====',irec
|
|
|
|
open(2,file='eigenv',access='direct',form='unformatted',
|
|
* recl=irec)
|
|
|
|
do 4 ki=1,nkpt
|
|
read(5,*)
|
|
read(5,*) (e(l),l=1,nzone)
|
|
write(2,rec=ki) (e(l),l=1,nzone)
|
|
|
|
if(ki.eq.1) then
|
|
E_min=e(1)
|
|
E_max=e(1)
|
|
endif
|
|
|
|
do i=1,nzone
|
|
if(e(i).le.E_min) E_min=e(i)
|
|
if(e(i).ge.E_max) E_max=e(i)
|
|
enddo
|
|
|
|
4 continue
|
|
12 format(8f10.4)
|
|
close(2)
|
|
|
|
! print*,'Testing eigenv'
|
|
|
|
open(9,file='phdos.in',access='sequential')
|
|
read(9,*) delta_e
|
|
print*, delta_e
|
|
read(9,*) (atom(i),i=1,natoms)
|
|
print*,atom(1),atom(2)
|
|
close(9)
|
|
|
|
! give some delta ~0.0001 then E_min=0
|
|
|
|
if(E_min.gt.0.0) then
|
|
Emin=0.0
|
|
else
|
|
Emin=E_min
|
|
write(6,'("It seems you have imaginary frequences.\
|
|
* Hopefully you know what you are doing")')
|
|
endif
|
|
! We take somewhat larger frequency range
|
|
if(E_max.le.100) then
|
|
Emax=E_max*(1+0.06)
|
|
else if(E_max.gt.100.and.E_max.lt.500) then
|
|
Emax=E_max*(1+0.05)
|
|
else if(E_max.gt.500.and.E_max.lt.1000) then
|
|
Emax=E_max*(1+0.04)
|
|
else if(E_max.gt.1000) then
|
|
Emax=E_max*(1+0.03)
|
|
endif
|
|
|
|
nstep=aint((Emax-Emin)/delta_e) - 1
|
|
|
|
if(nstep.gt.nmax) then
|
|
write(6,
|
|
* '("Be sure your phonon spectrum is correct: Emax >2500 cm-1")')
|
|
write(6,'("Or you do not use very small delta_e")')
|
|
stop
|
|
endif
|
|
|
|
print*,'nstep====', nstep
|
|
|
|
open(17,file='eigenv',access='direct',form='unformatted',
|
|
* recl=irec)
|
|
|
|
do 41 ki=1,11
|
|
read(17,rec=ki) (e(i),i=1,3)
|
|
write(6,121) (e(i),i=1,3)
|
|
41 continue
|
|
121 format(8f10.4)
|
|
close(17)
|
|
|
|
print*,'E_min=',E_min,' E_max=', E_max
|
|
print*,'nstep====', nstep
|
|
|
|
call k_brillouin
|
|
|
|
call generate_tetra(npnt)
|
|
!
|
|
open(unit=8,file='PHDOS.out',access='sequential',form='formatted')
|
|
rewind 8
|
|
|
|
print*,'before integration: E_min=', E_min,' E_max=', E_max
|
|
write(8,'("#", I4)') natoms
|
|
write(8,'("#", I6," ",2f14.8)') nstep, emax, delta_e
|
|
do 1 i=1,nstep
|
|
e1=emin+delta_e*(i-1)
|
|
call Integration(e1,tdos,dos,1)
|
|
write(8,2) e1,dos
|
|
1 continue
|
|
2 format(2f14.8)
|
|
close(8)
|
|
stop
|
|
end
|