quantum-espresso/PW/non_scf.f90

97 lines
2.9 KiB
Fortran

!
! Copyright (C) 2001-2007 Quantum-ESPRESSO 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 .
!
#include "f_defs.h"
!
!-----------------------------------------------------------------------
SUBROUTINE non_scf (ik_)
!-----------------------------------------------------------------------
!
! ... diagonalization of the KS hamiltonian in the non-scf case
!
USE kinds, ONLY : DP
USE bp, ONLY : lelfield, lberry
USE control_flags, ONLY : lbands, io_level
USE ener, ONLY : ef
USE io_global, ONLY : stdout, ionode
USE io_files, ONLY : iunwfc, nwordwfc, iunefield
USE buffers, ONLY : save_buffer
USE klist, ONLY : xk, wk, nks, nkstot
USE lsda_mod, ONLY : lsda, nspin
USE wvfct, ONLY : nbnd, et, npwx
USE wavefunctions_module, ONLY : evc
!
IMPLICIT NONE
!
INTEGER, INTENT (in) :: ik_
!
! ... local variables
!
INTEGER :: iter = 1, i, ik
REAL(DP) :: dr2 = 0.d0
REAL(DP), EXTERNAL :: get_clock
!
!
CALL start_clock( 'electrons' )
!
WRITE( stdout, 9002 )
!
CALL flush_unit( stdout )
!
IF ( lelfield) THEN
!
CALL c_bands_efield ( iter, ik_, dr2 )
!
ELSE
!
CALL c_bands_nscf ( ik_ )
!
END IF
!
! ... xk, wk, isk, et, wg are distributed across pools;
! ... the first node has a complete copy of xk, wk, isk,
! ... while eigenvalues et and weights wg must be
! ... explicitly collected to the first node
! ... this is done here for et, in weights () for wg
!
CALL poolrecover( et, nbnd, nkstot, nks )
!
! ... calculate weights of Kohn-Sham orbitals
! ... may be needed in further calculations such as phonon
!
IF ( .NOT. lbands ) CALL weights ( )
!
! ... Note that if you want to use more k-points for the phonon
! ... calculation then those needed for self-consistency, you can,
! ... by performing a scf with less k-points, followed by a non-scf
! ... one with additional k-points, whose weight on input is set to zero
!
WRITE( stdout, 9000 ) get_clock( 'PWSCF' )
!
WRITE( stdout, 9102 )
!
! ... write band eigenvalues
!
CALL print_ks_energies ( )
!
! ... save converged wfc if they have not been written previously
!
IF ( nks == 1 .AND. (io_level < 2) .AND. (io_level > -1) ) &
CALL save_buffer ( evc, nwordwfc, iunwfc, nks )
!
! ... do a Berry phase polarization calculation if required
!
IF ( lberry ) CALL c_phase()
!
CALL stop_clock( 'electrons' )
!
9000 FORMAT(/' total cpu time spent up to now is ',F9.2,' secs' )
9002 FORMAT(/' Band Structure Calculation' )
9102 FORMAT(/' End of band structure calculation' )
!
END SUBROUTINE non_scf