quantum-espresso/PW/read_file.f90

290 lines
8.3 KiB
Fortran

!
! Copyright (C) 2001 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 .
!
!
#if defined __NEW_PUNCH
!-----------------------------------------------------------------------
subroutine read_file
!-----------------------------------------------------------------------
!
! This routine allocates space for all quantities already computed
! in the pwscf program and reads them from the filpun file.
!
!
#include "machine.h"
use pwcom, only: tau, force, ityp, iunpun, nat, nbnd, nkstot, irt, &
tetra, ntetra, lsda, nspin, current_spin, cell_factor, lmovecell, nks, &
xk, ngms, gg, nls, ecutwfc, tpiba2, nrx1s, nr1s, nr2s, nr3s, nbndx, &
natomwfc, et, wg, rho, vr, ntyp, ityp, ngm, g, bg, nr1, nr2, nr3, &
strf, eigts1, eigts2, eigts3, isk, wk
use parameters, only: dp
use io, only: tmp_dir, prefix
use restart_module, only: readfile_new
#ifdef PARA
use para
#endif
implicit none
!
integer, parameter :: nax =1000 ! an unlikely large number of atoms
integer :: i, ik, ibnd, ios, ierr
!
real(kind=DP), allocatable :: et_g(:,:), wg_g(:,:)
real(kind=DP) :: rdum(1,1)
integer :: kunittmp
!
! choose the fortran unit to attach to the file
!
iunpun = 4
!
! a value of zero cause the parameter to be read from the ".save" file
!
kunittmp = 0
! here we read the variables that dimension the system
! in parallel execution, only root proc read the file
! and then broadcast the values to all ather procs
!
call readfile_new( 'dim', iunpun, rdum, rdum, kunittmp, 0, 0, ierr )
IF( ierr /= 0 ) THEN
call error ('read_file', 'problem reading file '// &
& trim(tmp_dir)//trim(prefix)//'.save', ierr)
END IF
!
#ifdef PARA
kunit = kunittmp
#endif
!
! allocate space for atomic positions, symmetries, forces, tetrahedra
!
if ( nat <= 0 .or. nat > nax ) &
call error ('read_file', 'wrong number of atoms', 1)
!
allocate( et_g(nbnd, nkstot), wg_g(nbnd, nkstot) )
allocate(tau (3, nat) )
allocate(ityp (nat) )
allocate(force (3, nat) )
allocate (irt( 48, nat))
allocate (tetra(4, MAX(ntetra,1)))
!
! here we read all the variables defining the system
! in parallel execution, only root proc read the file
! and then broadcast the values to all ather procs
!
call readfile_new( 'nowave', iunpun, et_g, wg_g, kunittmp, 0, 0, ierr )
IF( ierr /= 0 ) THEN
call error ('read_file', 'problem reading file '// &
& trim(tmp_dir)//trim(prefix)//'.save', ierr)
END IF
!
!
#ifdef PARA
kunit = kunittmp
! parallel execution: distribute across pools k-points and
! related variables (not a smart implementation)
nks = nkstot
! nks and nkstot are redefined by the following routine
call divide_et_impera (xk, wk, isk, lsda, nkstot, nks)
#endif
!
! check whether LSDA
!
if (lsda) then
nspin = 2
else
nspin = 1
current_spin = 1
endif
cell_factor = 1.d0
lmovecell = .false.
!
! allocate memory for G- and R-space fft arrays
!
call allocate_fft
call ggen
call set_pencils (nks, xk, ngms, gg, nls, ecutwfc / tpiba2, &
nrx1s, nr1s, nr2s, nr3s)
!
! allocate the potential
!
call allocate_locpot
call allocate_nlpot
!
! allocate wavefunctions and related quantities (including et and wg)
!
! TEMP: dimension natomwfc required in projwave by variable becp
! this is not a good reason - eventually nbndx must be = nbnd
!
nbndx = max(nbnd,natomwfc)
call allocate_wfc
!
et = et_g
wg = wg_g
!
deallocate( et_g, wg_g )
!
#ifdef PARA
call poolscatter (nbndx, nkstot, et, nks, et)
call poolscatter (nbnd , nkstot, wg, nks, wg)
#endif
!
! read the charge density
!
call io_pot ( - 1, trim(prefix)//'.rho', rho, nspin)
!
! read the potential
!
call io_pot ( - 1, trim(prefix)//'.pot', vr, nspin)
!
! re-calculate the local part of the pseudopotential vltot
! and the core correction charge (if any) - This is done here
! for compatibility with the previous version of read_file
!
call init_vloc
call struc_fact (nat, tau, ntyp, ityp, ngm, g, bg, nr1, nr2, &
nr3, strf, eigts1, eigts2, eigts3)
call setlocal
call set_rhoc
!
return
end subroutine read_file
#else
!-----------------------------------------------------------------------
subroutine read_file
!-----------------------------------------------------------------------
!
! This routine allocates space for all quantities already computed
! in the pwscf program and reads them from the filpun file.
!
!
#include "machine.h"
use pwcom
use io
#ifdef PARA
use para
#endif
implicit none
!
integer, parameter :: nax =1000 ! an unlikely large number of atoms
integer :: i, ik, ibnd, ios
!
iunpun = 4
open (unit = iunpun, file = trim(tmp_dir)//trim(prefix)//'.pun', &
form = 'unformatted', status = 'old', iostat = ios)
call error ('read_file', 'problem reading file '// &
& trim(tmp_dir)//trim(prefix)//'.pun', ios)
!
! here we read all the variables describing the system
! in parallel execution, all processors read the same file
!
call saveall (iunpun, - 1)
!
! allocate space for atomic positions, symmetries, forces, tetrahedra
!
if (nat.le.0.or.nat.gt.nax) &
call error ('read_file', 'wrong number of atoms', 1)
allocate(tau (3, nat) )
allocate(ityp (nat) )
allocate(force (3, nat) )
allocate (irt( 48, nat))
if (ltetra) allocate (tetra(4, ntetra))
!
read (iunpun, err = 100, iostat = ios) tau
read (iunpun, err = 101, iostat = ios) ityp
read (iunpun, err = 102, iostat = ios) irt
if (lforce) read (iunpun, err = 103, iostat = ios) force
if (ltetra) read (iunpun, err = 104, iostat = ios) tetra
!
read (iunpun, err = 105, iostat = ios) ( (xk (i, ik), i = 1, 3), &
ik = 1, nkstot)
read (iunpun, err = 105, iostat = ios) ( wk (ik), ik = 1, nkstot)
read (iunpun, err = 105, iostat = ios) ( isk (ik), ik = 1, nkstot)
#ifdef PARA
read (iunpun) kunit
! parallel execution: distribute across pools k-points and
! related variables (not a smart implementation)
nks = nkstot
! nks and nkstot are redefined by the following routine
call divide_et_impera (xk, wk, isk, lsda, nkstot, nks)
#endif
!
! check whether LSDA
!
if (lsda) then
nspin = 2
else
nspin = 1
current_spin = 1
endif
cell_factor = 1.d0
lmovecell = .false.
!
! allocate memory for G- and R-space fft arrays
!
call allocate_fft
call ggen
call set_pencils (nks, xk, ngms, gg, nls, ecutwfc / tpiba2, &
nrx1s, nr1s, nr2s, nr3s)
!
! allocate the potential
!
call allocate_locpot
call allocate_nlpot
!
! allocate wavefunctions and related quantities (including et and wg)
!
! TEMP: dimension natomwfc required in projwave by variable becp
! this is not a good reason - eventually nbndx must be = nbnd
!
nbndx = max(nbnd,natomwfc)
call allocate_wfc
!
read (iunpun, err = 106, iostat = ios) ( (et (ibnd, ik), ibnd = 1, &
nbnd), ik = 1, nkstot)
read (iunpun, err = 106, iostat = ios) ( (wg (ibnd, ik), ibnd = 1, &
nbnd), ik = 1, nkstot)
close (iunpun)
!
#ifdef PARA
call poolscatter (nbndx, nkstot, et, nks, et)
call poolscatter (nbnd , nkstot, wg, nks, wg)
#endif
!
! read the charge density
!
call io_pot ( - 1, trim(prefix)//'.rho', rho, nspin)
!
! read the potential
!
call io_pot ( - 1, trim(prefix)//'.pot', vr, nspin)
!
! re-calculate the local part of the pseudopotential vltot
! and the core correction charge (if any) - This is done here
! for compatibility with the previous version of read_file
!
call init_vloc
call struc_fact (nat, tau, ntyp, ityp, ngm, g, bg, nr1, nr2, &
nr3, strf, eigts1, eigts2, eigts3)
call setlocal
call set_rhoc
!
return
100 call error ('read_file', 'reading tau', abs (ios) )
101 call error ('read_file', 'reading ityp', abs (ios) )
102 call error ('read_file', 'reading irt', abs (ios) )
103 call error ('read_file', 'reading forces', abs (ios) )
104 call error ('read_file', 'reading tetrahedra', abs (ios) )
105 call error ('read_file', 'reading k-points', abs (ios) )
106 call error ('read_file', 'reading eigenvalues', abs (ios) )
end subroutine read_file
#endif