quantum-espresso/Modules/control_flags.f90

319 lines
12 KiB
Fortran

!
! Copyright (C) 2002 FPMD 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 .
!
!=----------------------------------------------------------------------------=!
MODULE control_flags
!=----------------------------------------------------------------------------=!
!
! this module contains all basic variables that controls the istuctions
! execution flow
! ----------------------------------------------
!
USE kinds
USE parameters
IMPLICIT NONE
SAVE
PRIVATE
TYPE convergence_criteria
LOGICAL :: active
INTEGER :: nstep
REAL(dbl) :: ekin
REAL(dbl) :: derho
REAL(dbl) :: force
END TYPE
TYPE ionic_conjugate_gradient
LOGICAL :: active
INTEGER :: nstepix
INTEGER :: nstepex
REAL(dbl) :: ionthr
REAL(dbl) :: elethr
END TYPE
PUBLIC :: tbeg, htbeg, nomore, &
nbeg, isave, iprint, tv0rd, nv0rd, tzeroc, tzerop, newnfi, tnewnfi, &
tfor, tpre, tzeroe, tsde, tsdp, tsdc, taurdr, ndr, &
ndw, tortho, tstress, tprnfor, prn, timing, &
memchk, tconjgrad, tprnsfac, toptical, &
tcarpar, rhoout, trane, ampre, tranp, amprp, &
tdipole, t_diis, t_diis_simple, t_diis_rot, tnosee, tnosep, tnoseh, &
tcp, tcap, tnodump, tdamp, tdampions, tconvthrs, &
convergence_criteria, tionstep, nstepe, tsteepdesc, &
ionic_conjugate_gradient, tconjgrad_ion, &
tatomicwfc, tscreen, gamma_only, ekin_conv_thr, ekin_maxiter
PUBLIC :: fix_dependencies, check_flags
PUBLIC :: tbuff, tvlocw, trhor, trhow, thdyn, iprsta
PUBLIC :: twfcollect
! ... declare execution control variables
LOGICAL :: tbuff = .FALSE. ! save wfc on unit 21 ( only cp, never used)
LOGICAL :: tvlocw = .FALSE. ! write potential to unit 46 ( only cp, seldom used)
LOGICAL :: trhor = .FALSE. ! read rho from unit 47 (only cp, seldom used)
LOGICAL :: trhow = .FALSE. ! write rho to unit 47 (only cp, seldom used)
LOGICAL :: prn = .FALSE. ! verbosity
LOGICAL :: tsde = .FALSE. ! electronic steepest descent
LOGICAL :: tzeroe = .FALSE. ! set to zero the electronic velocities
LOGICAL :: tfor = .FALSE. ! move the ions ( calculate forces )
LOGICAL :: tsdp = .FALSE. ! ionic steepest descent
LOGICAL :: tzerop = .FALSE. ! set to zero the ionic velocities
LOGICAL :: tprnfor = .FALSE. ! print forces to standard output
LOGICAL :: taurdr = .FALSE. ! read ionic position from standard input
LOGICAL :: tv0rd = .FALSE. ! read ionic velocities from standard input
LOGICAL :: tpre = .FALSE. ! calculate stress, and (in fpmd) variable cell dynamic
LOGICAL :: thdyn = .FALSE. ! variable-cell dynamics (only cp)
LOGICAL :: tsdc = .FALSE. ! cell geometry steepest descent
LOGICAL :: tzeroc = .FALSE. ! set to zero the cell geometry velocities
LOGICAL :: tstress = .FALSE. ! print stress to standard output
LOGICAL :: tortho = .FALSE. ! use iterative orthogonalization
LOGICAL :: tconjgrad = .FALSE. ! use conjugate gradient electronic minimization
LOGICAL :: timing = .FALSE. ! print out timing information
LOGICAL :: memchk = .FALSE. ! check for memory leakage
LOGICAL :: tprnsfac = .FALSE. ! print out structure factor
LOGICAL :: toptical = .FALSE. ! print out optical properties
LOGICAL :: tcarpar = .FALSE. ! tcarpar is set TRUE for a "pure" Car Parrinello simulation
LOGICAL :: rhoout = .FALSE. ! print out charge densities
LOGICAL :: tnodump = .FALSE. ! if true avoid the dump of the wavefunctions in resetart
LOGICAL :: tdamp = .FALSE. ! Use damped dinamics for electrons
LOGICAL :: tdampions = .FALSE. ! Use damped dinamics for electrons
LOGICAL :: tatomicwfc= .FALSE. ! Use atomic wavefunctions as starting guess for ch. density
LOGICAL :: tscreen = .FALSE. ! Use screened coulomb potentials for cluster calculations
LOGICAL :: twfcollect = .FALSE. ! Collect wave function in the restart file at the end of run.
TYPE (convergence_criteria) :: tconvthrs
! thresholds used to check GS convergence
! ... Ionic vs Electronic step frequency
! ... When "ion_nstep > 1" and "electron_dynamics = 'md' | 'sd' ", ions are
! ... propagated every "ion_nstep" electronic step only if the electronic
! ... "ekin" is lower than "ekin_conv_thr"
!
LOGICAL :: tionstep = .FALSE.
INTEGER :: nstepe = 1
! parameters to control how many electronic steps
! between ions move
LOGICAL :: tsteepdesc = .FALSE.
! parameters for electronic steepest desceent
TYPE (ionic_conjugate_gradient) :: tconjgrad_ion
! conjugate gradient for ionic minimization
INTEGER :: nbeg = 0 ! internal code for initialization ( -1, 0, 1, 2, .. )
INTEGER :: ndw = 0 !
INTEGER :: ndr = 0 !
INTEGER :: nomore = 0 !
INTEGER :: iprint = 0 ! print output every iprint step
INTEGER :: isave = 0 ! write restart to ndr unit every isave step
INTEGER :: nv0rd = 0 !
INTEGER :: iprsta = 0 ! output verbosity (increasing from 0 to infinity)
LOGICAL :: gamma_only = .TRUE. ! true if only gamma point is used
LOGICAL :: tnewnfi = .FALSE.
INTEGER :: newnfi = 0
! ... Wave function randomization
LOGICAL :: trane = .FALSE.
REAL(dbl) :: ampre = 0.0d0
! ... Ionic position randomization
LOGICAL :: tranp(nsx) = .FALSE.
REAL(dbl) :: amprp(nsx) = 0.0d0
! ... Read the cell from standard input
LOGICAL :: tbeg = .FALSE.
REAL(dbl) :: htbeg(3,3) = 0.0d0
! ... This flags control the calculation of the Dipole Moments
LOGICAL :: tdipole = .FALSE.
! ... Flags that controls DIIS electronic minimization
LOGICAL :: t_diis = .FALSE.
LOGICAL :: t_diis_simple = .FALSE.
LOGICAL :: t_diis_rot = .FALSE.
! ... Flag controlling the Nose thermostat for electrons
LOGICAL :: tnosee = .FALSE.
! ... Flag controlling the Nose thermostat for the cell
LOGICAL :: tnoseh = .FALSE.
! ... Flag controlling the Nose thermostat for ions
LOGICAL :: tnosep = .FALSE.
LOGICAL :: tcap = .FALSE.
LOGICAL :: tcp = .FALSE.
REAL(dbl) :: ekin_conv_thr = 0.0d0
INTEGER :: ekin_maxiter = 100
REAL(dbl) :: etot_conv_thr = 0.0d0
INTEGER :: etot_maxiter = 100
REAL(dbl) :: forc_conv_thr = 0.0d0
INTEGER :: forc_maxiter = 100
!
! ... Several variables controlling the run
!
! ... Control variables use mainly in PW calculations
!
!
REAL(KIND=DP), PUBLIC :: &
mixing_beta, &! the mixing parameter
tr2, &! the convergence threshold for potential
upscale, &! maximum reduction of convergence threshold
time_max, &! maximum allowed cpu time in sec
ethr, &! the convergence threshold for eigenvalues
alpha0, &! the mixing parameters for the extrapolation
beta0, &! of the starting potential
diis_ethr_cg ! threshold in eigval for starting DIIS
INTEGER, PUBLIC :: &
ngm0, &! used in mix_rho
niter, &! the maximum number of iteration
nmix, &! the number of iteration kept in the history
imix, &! the type of mixing (0=plain,1=TF,2=local-TF)
! iprint, &! the interval between full writing of results
iverbosity, &! type of printing ( 0 few, 1 all )
david, &! used on Davidson diagonalization
nstep, &! number of minimization steps
istep, &! current minimization step
isolve, &! Davidson or CG diagonalization
iswitch, &! general switch for the calculation type
modenum, &! used with iswitch=-4
max_cg_iter, &! maximum number of iterations in a CG di
diis_buff, &! dimension of the buffer in diis
diis_ndim, &! dimension of reduced basis in DIIS
order ! type of potential updating ( see update_pot )
!
LOGICAL, PUBLIC :: &
lscf, &! if .TRUE. the calculation is selfconsistent
lbfgs, &! if .TRUE. the calculation is a relaxation based on new BFGS scheme
loldbfgs, &! if .TRUE. the calculation is a bfgs-type relaxation based on the old scheme
lmd, &! if .TRUE. the calculation is a dynamics
lneb, &! if .TRUE. the calculation is neb
lphonon, &! if .TRUE. the calculation is phonon
conv_elec, &! if .TRUE. electron convergence has been reached
conv_ions, &! if .TRUE. ionic convergence has been reached
nosym, &! if .TRUE. no symmetry is used
noinv = .FALSE., &! if .TRUE. eliminates inversion symmetry
diis_wfc_keep, &! if .TRUE. keeps old wfc for starting
restart, &! if .TRUE. restart from results of a preceding run
reduce_io ! if .TRUE. reduce the I/O to the strict minimum
!
! end of module-scope declarations
! ----------------------------------------------
!=----------------------------------------------------------------------------=!
CONTAINS
!=----------------------------------------------------------------------------=!
SUBROUTINE fix_dependencies()
IMPLICIT NONE
! ... Restart file dump
tnodump = .false.
! this flag used for benchmarking and debug
! if true Do not save wave functions and other system
! properties on the writefile subroutine
IF( ndw < 0 ) THEN
tnodump = .true.
END IF
! ... Car Parrinello simulation
tcarpar = .TRUE.
IF( tconjgrad .OR. t_diis .OR. tsteepdesc ) THEN
tcarpar = .FALSE.
END IF
! ... if TPRE = .FALSE. set TSDC and TZEROC to .FALSE. too.
IF( .NOT. tpre ) THEN
tsdc = .FALSE.
tzeroc = .FALSE.
END IF
IF( .NOT. tfor ) THEN
tzerop = .FALSE.
tv0rd = .FALSE.
tsdp = .FALSE.
tcp = .FALSE.
tcap = .FALSE.
tnosep = .FALSE.
ELSE
IF( tsdp ) THEN
tcp = .FALSE.
tcap = .FALSE.
tnosep = .FALSE.
tv0rd = .FALSE.
END IF
IF( tv0rd ) THEN
tzerop = .TRUE.
END IF
END IF
IF ( tsde ) THEN
tnosee = .FALSE.
END IF
CALL check_flags()
RETURN
END SUBROUTINE fix_dependencies
!=----------------------------------------------------------------------------=!
SUBROUTINE check_flags()
! ... do some checks for consistency
IF ( tnosee .AND. t_diis ) THEN
CALL errore(' control_flags ','DIIS + ELECT. NOSE ? ',0)
END IF
IF ( tortho .AND. t_diis ) THEN
! CALL errore(' control_flags ','DIIS, ORTHO NOT PERMITTED',0)
END IF
IF(tnosep .AND. tcp) THEN
CALL errore(' control_flags ',' TCP AND TNOSEP BOTH TRUE',0)
END IF
IF(tnosep .AND. tcap) THEN
CALL errore(' control_flags ',' TCAP AND TNOSEP BOTH TRUE',0)
END IF
IF(tcp .AND. tcap) THEN
CALL errore(' control_flags ',' TCP AND TCAP BOTH TRUE',0)
END IF
IF( tdipole .AND. tpre ) THEN
CALL errore(' control_flags ',' DIPOLE WITH CELL DYNAMICS ',0)
END IF
IF( tv0rd .AND. tsdp ) THEN
CALL errore(' control_flags ',' READING IONS VELOCITY WITH STEEPEST D.',0)
END IF
RETURN
END SUBROUTINE check_flags
!=----------------------------------------------------------------------------=!
END MODULE control_flags
!=----------------------------------------------------------------------------=!