To implement both Kerker preconditioning and wave-dependent metric method into CONQUEST we note that both involves at least two Fourier transforms (to transform into reciprocal space and then back). It is therefore ideal if we can add the Kerker preconditioning and the wave-dependent weight at the same time while we are working inside the reciprocal space. Two additional arrays of the dimensions were added, one for storing the preconditioned residuals on real space grid: and one for storing the covariant residuals for the wave-dependent metric on real space grid: . Note that here denotes the inverse Fourier transform.

It is possible to save the memory and calculate the preconditioned and the covariant residuals for every Pulay history and then accumulate in the Pulay mixing procedure (see equation (1)). However since CONQUEST is a code optimised for parallel calculation with many processors and Fourier transformation is a very communication intensive procedure, such approach would mean we have to do two Fourier transforms for every of the Pulay histories for every history summation loop in equation (1), and this would result a very inefficient code. By introducing two additional arrays to the code we minimise communications required for performing Fourier transforms. Note also that the original histories of the residual are still required because they are still needed in the calculation of the metric --acting as the contravariant part of the inner product.

Three subroutines were added to the original `hartree_module`

in
the CONQUEST source code. Subroutine `kerker`

is for
self-consistent calculation using Kerker preconditioning only,
`wdmetric`

is for using wave-dependent metric only and
`kerker_and_wdmetric`

is for using both.

Pseudocode algorithm 1 gives a rough schematic for
subroutine `kerker_and_wdmetric`

. The subroutines `kerker`

and `wdmetric`

are similar with the relevant parts omitted (for
`kerker`

the parts with wave-dependent metric will be omitted and
vice versa for `wdmetric`

). One of the subroutines is called
depending on user input (whether to use Kerker preconditioning or
wave-dependent metric or both) for every new residual, and the results
from the temporary arrays
and
(see algorithm 1) are stored in the correct Pulay history
slots in the
and
arrays
respectively. The preconditioned and covariant residuals are then used
in the normal Pulay mixing routine already implemented in
CONQUEST, replacing the appropriate Pulay history residuals.

Lianheng Tong 2011-03-02