Kinetic energy preconditioning in ONETEP
- Author:
Chengcheng Xiao
- Date:
Dec 2025
ONETEP at the moment, by default uses a modified Teter reciprocal preconditioning.
The original Teter reciprocal preconditioning function is defined as:
where
and \(T_i=\left < \psi_i\left|\frac{-\hbar^2}{2 m} \nabla^2\right| \psi_i \right>\) which is related to the band \(i\) that \(P\) is applied to.
In ONETEP, by default we want to avoid calculating the kinetic energy eigenvalues, \(x\) is modified to be:
and \(k_0\) is a manually specified number.
Automatic selection of \(k_0\)
Since ONETEP version 8, it is possible to perform calculations where \(k_0\) is calculated automatically based on the kinetic energy at each NGWF optimisation step. I.e.,
where \(K\) is the density kernel and \(\mathrm{Max[Eig(KT)]}\) gives the max eigenvalue of the (occupation weighted) kinetic energy matrix in the NGWF basis.
Note that in the case of multi-kpoint/spin-polarised calculation, k-point/spin average is performed and a single \(k_0\) is obtained for the whole system.
It is also possible to perfrom NGWF-specific preconditioning. In this case, each NGWF will have its own \(k_0\). For example, if we use the kinetic energy matrix weighted by the occupation numbers \(KT\), then for the \(i\)-th NGWF, we have
There are three options for the matrix to use for NGWF-specific preconditioning:
The diagonal elements of \(KT\): Occupation weighted kinetic energy.
The diagonal elements of \(S^{-1}T\): Tensor corrected kinetic energy.
The diagonal elements of \(T\): Bare kinetic energy.
Testing is needed to determine which option is the best for specific systems. Note that kinetic energy preconditioning can affect the total energy so one should always check and make sure the convergence of total energy difference (e.g. bettwen a pristine system and a distorted system) is correct.
Keywords
precond_recip[Basic, bool, defaultT] Turn on reciprocal space kinetic energy preconditioning? [Incompatible withprecond_real]precond_real[Basic, bool, defaultF] Turn on real space kinetic energy preconditioning? [Incompatible withprecond_recipand automatic \(k_0\) mode.]precond_scheme[Basic, string, defaultTETER] The type of kinetic energy preconditioning scheme to use. Options are: BG, MAURI, TETER or NONE.k_zero[Basic, physical 1/Bohr, default3.0] The \(k_0\) value used in the kinetic energy preconditioning. If set to a negative value, ONETEP will automatically calculate the \(k_0\) value based on the average kinetic energy of the system.precond_array[Basic, bool, defaultF] Turn on NGWF-specific preconditioning where each NGWF has its own \(k_0\) value based on its own kinetic energy expectation value? (requiresk_zeroto be negative).precond_array_type[Basic, string, defaultKT] The type of kinetic energy to use for NGWF-specific preconditioning. Options are:KT,INVST, andT. (requiresprecond_arrayto beT).threads_precond[Basic, int, default same asthreads_num_fftboxes] How many threads to use for batch preconditioning. Whenprecond_array=T, the biggerthreads_precondthe more memory is required.