mirror of https://gitlab.com/QEF/q-e.git
320 lines
12 KiB
Fortran
320 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
|
|
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
|
|
lconstrain, &! if .TRUE. the calculation is constraint
|
|
ldamped, &! if .TRUE. the calculation is a damped dynamics
|
|
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
|
|
!=----------------------------------------------------------------------------=!
|