# API reference

This page provides a plain list of all documented functions, structs, modules and macros in DFTK. Note that this list is neither structured, complete nor particularly clean, so it only provides rough orientation at the moment. The best reference is the code itself.

DFTK.DFTKModule

DFTK –- The density-functional toolkit. Provides functionality for experimenting with plane-wave density-functional theory algorithms.

source
DFTK.AdaptiveBandsType

Dynamically adapt number of bands to be converged to ensure that the orbitals of lowest occupation are occupied to at most occupation_threshold. To obtain rapid convergence of the eigensolver a gap between the eigenvalues of the last occupied orbital and the last computed (but not converged) orbital of gap_min is ensured.

source
DFTK.AtomicNonlocalType

Nonlocal term coming from norm-conserving pseudopotentials in Kleinmann-Bylander form. $\text{Energy} = \sum_a \sum_{ij} \sum_{n} f_n <ψ_n|p_{ai}> D_{ij} <p_{aj}|ψ_n>.$

source
DFTK.BlowupCHVType

Blow-up function as proposed in https://arxiv.org/abs/2210.00442 The blow-up order of the function is fixed to ensure C^2 regularity of the energies bands away from crossings and Lipschitz continuity at crossings.

source
DFTK.DielectricMixingType

We use a simplification of the Resta model DOI 10.1103/physrevb.16.2717 and set $χ_0(q) = \frac{C_0 G^2}{4π (1 - C_0 G^2 / k_{TF}^2)}$ where $C_0 = 1 - ε_r$ with $ε_r$ being the macroscopic relative permittivity. We neglect $K_\text{xc}$, such that $J^{-1} ≈ \frac{k_{TF}^2 - C_0 G^2}{ε_r k_{TF}^2 - C_0 G^2}$

By default it assumes a relative permittivity of 10 (similar to Silicon). εr == 1 is equal to SimpleMixing and εr == Inf to KerkerMixing. The mixing is applied to $ρ$ and $ρ_\text{spin}$ in the same way.

source
DFTK.DielectricModelType

A localised dielectric model for $χ_0$:

$$$\sqrt{L(x)} \text{IFFT} \frac{C_0 G^2}{4π (1 - C_0 G^2 / k_{TF}^2)} \text{FFT} \sqrt{L(x)}$$$

where $C_0 = 1 - ε_r$, L(r) is a real-space localization function and otherwise the same conventions are used as in DielectricMixing.

source
DFTK.DivAgradOperatorType

Nonlocal "divAgrad" operator $-½ ∇ ⋅ (A ∇)$ where $A$ is a scalar field on the real-space grid. The $-½$ is included, such that this operator is a generalisation of the kinetic energy operator (which is obtained for $A=1$).

source
DFTK.ElementCohenBergstresserMethod

Element where the interaction with electrons is modelled as in CohenBergstresser1966. Only the homonuclear lattices of the diamond structure are implemented (i.e. Si, Ge, Sn).

key may be an element symbol (like :Si), an atomic number (e.g. 14) or an element name (e.g. "silicon")

source
DFTK.ElementCoulombMethod

Element interacting with electrons via a bare Coulomb potential (for all-electron calculations) key may be an element symbol (like :Si), an atomic number (e.g. 14) or an element name (e.g. "silicon")

source
DFTK.ElementPspMethod

Element interacting with electrons via a pseudopotential model. key may be an element symbol (like :Si), an atomic number (e.g. 14) or an element name (e.g. "silicon")

source
DFTK.EntropyType

Entropy term -TS, where S is the electronic entropy. Turns the energy E into the free energy F=E-TS. This is in particular useful because the free energy, not the energy, is minimized at self-consistency.

source
DFTK.EwaldType

Ewald term: electrostatic energy per unit cell of the array of point charges defined by model.atoms in a uniform background of compensating charge yielding net neutrality.

source
DFTK.FixedBandsType

In each SCF step converge exactly n_bands_converge, computing along the way exactly n_bands_compute (usually a few more to ease convergence in systems with small gaps).

source
DFTK.HartreeType

Hartree term: for a decaying potential V the energy would be

1/2 ∫ρ(x)ρ(y)V(x-y) dxdy

with the integral on x in the unit cell and of y in the whole space. For the Coulomb potential with periodic boundary conditions, this is rather

1/2 ∫ρ(x)ρ(y) G(x-y) dx dy

where G is the Green's function of the periodic Laplacian with zero mean (-Δ G = sum{R} 4π δR, integral of G zero on a unit cell).

source
DFTK.KerkerMixingType

Kerker mixing: $J^{-1} ≈ \frac{|G|^2}{k_{TF}^2 + |G|^2}$ where $k_{TF}$ is the Thomas-Fermi wave vector. For spin-polarized calculations by default the spin density is not preconditioned. Unless a non-default value for $ΔDOS_Ω$ is specified. This value should roughly be the expected difference in density of states (per unit volume) between spin-up and spin-down.

Notes:

• Abinit calls $1/k_{TF}$ the dielectric screening length (parameter dielng)
source
DFTK.KpointType

Discretization information for $k$-point-dependent quantities such as orbitals. More generally, a $k$-point is a block of the Hamiltonian; eg collinear spin is treated by doubling the number of kpoints.

source
DFTK.LazyHcatType

Simple wrapper to represent a matrix formed by the concatenation of column blocks: it is mostly equivalent to hcat, but doesn't allocate the full matrix. LazyHcat only supports a few multiplication routines: furthermore, a multiplication involving this structure will always yield a plain array (and not a LazyHcat structure). LazyHcat is a lightweight subset of BlockArrays.jl's functionalities, but has the advantage to be able to store GPU Arrays (BlockArrays is heavily built on Julia's CPU Array).

source
DFTK.LdosModelType

Represents the LDOS-based $χ_0$ model

$$$χ_0(r, r') = (-D_\text{loc}(r) δ(r, r') + D_\text{loc}(r) D_\text{loc}(r') / D)$$$

where $D_\text{loc}$ is the local density of states and $D$ the density of states. For details see Herbst, Levitt 2020 arXiv:2009.01665

source
DFTK.ModelMethod
Model(system::AbstractSystem; kwargs...)

AtomsBase-compatible Model constructor. Sets structural information (atoms, positions, lattice, n_electrons etc.) from the passed system.

source
DFTK.ModelMethod
Model(lattice, atoms, positions; n_electrons, magnetic_moments, terms, temperature,
smearing, spin_polarization, symmetries)

Creates the physical specification of a model (without any discretization information).

n_electrons is taken from atoms if not specified.

spin_polarization is :none by default (paired electrons) unless any of the elements has a non-zero initial magnetic moment. In this case the spin_polarization will be :collinear.

magnetic_moments is only used to determine the symmetry and the spin_polarization; it is not stored inside the datastructure.

smearing is Fermi-Dirac if temperature is non-zero, none otherwise

The symmetries kwarg allows (a) to pass true / false to enable / disable the automatic determination of lattice symmetries or (b) to pass an explicit list of symmetry operations to use for lowering the computational effort. The default behaviour is equal to true, namely that the code checks the specified model in form of the Hamiltonian terms, lattice, atoms and magnetic_moments parameters and from these automatically determines a set of symmetries it can safely use. If you want to pass custom symmetry operations (e.g. a reduced or extended set) use the symmetry_operations function. Notice that this may lead to wrong results if e.g. the external potential breaks some of the passed symmetries. Use false to turn off symmetries completely.

source
DFTK.ModelMethod
Model(model; [lattice, positions, atoms, kwargs...])
Model{T}(model; [lattice, positions, atoms, kwargs...])

Construct an identical model to model with the option to change some of the contained parameters. This constructor is useful for changing the data type in the model or for changing lattice or positions in geometry/lattice optimisations.

source
DFTK.PairwisePotentialMethod

Pairwise terms: Pairwise potential between nuclei, e.g., Van der Waals potentials, such as Lennard—Jones terms. The potential is dependent on the distance between to atomic positions and the pairwise atomic types: For a distance d between to atoms A and B, the potential is V(d, params[(A, B)]). The parameters max_radius is of 100 by default, and gives the maximum distance (in Cartesian coordinates) between nuclei for which we consider interactions.

source
DFTK.PlaneWaveBasisType

A plane-wave discretized Model. Normalization conventions:

• Things that are expressed in the G basis are normalized so that if $x$ is the vector, then the actual function is $\sum_G x_G e_G$ with $e_G(x) = e^{iG x} / \sqrt(\Omega)$, where $\Omega$ is the unit cell volume. This is so that, eg $norm(ψ) = 1$ gives the correct normalization. This also holds for the density and the potentials.
• Quantities expressed on the real-space grid are in actual values.

ifft and fft convert between these representations.

source
DFTK.PlaneWaveBasisMethod

Creates a PlaneWaveBasis using the kinetic energy cutoff Ecut and a Monkhorst-Pack $k$-point grid. The MP grid can either be specified directly with kgrid providing the number of points in each dimension and kshift the shift (0 or 1/2 in each direction). If not specified a grid is generated using kgrid_from_minimal_spacing with a minimal spacing of 2π * 0.022 per Bohr.

source
DFTK.PspHghMethod
PspHgh(path[, identifier, description])

Construct a Hartwigsen, Goedecker, Teter, Hutter separable dual-space Gaussian pseudopotential (1998) from file.

source
DFTK.PspUpfMethod
PspUpf(path[, identifier])

Construct a Unified Pseudopotential Format pseudopotential from file.

Does not support:

• Non-linear core correction
• Fully-realtivistic / spin-orbit pseudos
• Bare Coulomb / all-electron potentials
• Semilocal potentials
• Ultrasoft potentials
• Projector-augmented wave potentials
• GIPAW reconstruction data
source
DFTK.RealFourierOperatorType

Linear operators that act on tuples (real, fourier) The main entry point is apply!(out, op, in) which performs the operation out += op*in where out and in are named tuples (real, fourier) They also implement mul! and Matrix(op) for exploratory use.

source
DFTK.χ0MixingType

Generic mixing function using a model for the susceptibility composed of the sum of the χ0terms. For valid χ0terms See the subtypes of χ0Model. The dielectric model is solved in real space using a GMRES. Either the full kernel (RPA=false) or only the Hartree kernel (RPA=true) are employed. verbose=true lets the GMRES run in verbose mode (useful for debugging).

source
AbstractFFTs.fft!Method

In-place version of fft!. NOTE: If kpt is given, not only f_fourier but also f_real is overwritten.

source
AbstractFFTs.fftMethod
fft(basis::PlaneWaveBasis, [kpt::Kpoint, ] f_real)

Perform an FFT to obtain the Fourier representation of f_real. If kpt is given, the coefficients are truncated to the k-dependent spherical basis set.

source
AbstractFFTs.ifftMethod
ifft(basis::PlaneWaveBasis, [kpt::Kpoint, ] f_fourier)

Perform an iFFT to obtain the quantity defined by f_fourier defined on the k-dependent spherical basis set (if kpt is given) or the k-independent cubic (if it is not) on the real-space grid.

source
AtomsBase.atomic_systemFunction
atomic_system(model::DFTK.Model, magnetic_moments=[])
atomic_system(lattice, atoms, positions, magnetic_moments=[])

Construct an AtomsBase atomic system from a DFTK model and associated magnetic moments or from the usual lattice, atoms and positions list used in DFTK plus magnetic moments.

source
AtomsBase.periodic_systemFunction
periodic_system(model::DFTK.Model, magnetic_moments=[])
periodic_system(lattice, atoms, positions, magnetic_moments=[])

Construct an AtomsBase atomic system from a DFTK model and associated magnetic moments or from the usual lattice, atoms and positions list used in DFTK plus magnetic moments.

source
Brillouin.KPaths.irrfbz_pathMethod

Extract the high-symmetry $k$-point path corresponding to the passed model using Brillouin. Uses the conventions described in the reference work by Cracknell, Davies, Miller, and Love (CDML). Of note, this has minor differences to the $k$-path reference (Y. Himuma et. al. Comput. Mater. Sci. 128, 140 (2017)) underlying the path-choices of Brillouin.jl, specifically for oA and mC Bravais types.

If the cell is a supercell of a smaller primitive cell, the standard $k$-path of the associated primitive cell is returned. So, the high-symmetry $k$ points are those of the primitive cell Brillouin zone, not those of the supercell Brillouin zone.

The dim argument allows to artificially truncate the dimension of the employed model, e.g. allowing to plot a 2D bandstructure of a 3D model (useful for example for plotting band structures of sheets with dim=2).

Due to lacking support in Spglib.jl for two-dimensional lattices it is (a) assumed that model.lattice is a conventional lattice and (b) required to pass the space group number using the sgnum keyword argument.

source
DFTK.CROPFunction

CROP-accelerated root-finding iteration for f, starting from x0 and keeping a history of m steps. Optionally warming specifies the number of non-accelerated steps to perform for warming up the history.

source
DFTK.G_vectorsMethod
G_vectors(basis::PlaneWaveBasis)
G_vectors(basis::PlaneWaveBasis, kpt::Kpoint)

The list of wave vectors $G$ in reduced (integer) coordinates of a basis or a $k$-point kpt.

source
DFTK.G_vectorsMethod
G_vectors([architecture=AbstractArchitecture], fft_size::Tuple)

The wave vectors G in reduced (integer) coordinates for a cubic basis set of given sizes.

source
DFTK.G_vectors_cartMethod
G_vectors_cart(basis::PlaneWaveBasis)
G_vectors_cart(basis::PlaneWaveBasis, kpt::Kpoint)

The list of $G$ vectors of a given basis or kpt, in cartesian coordinates.

source
DFTK.HybridMixingMethod

The model for the susceptibility is

\begin{aligned} χ_0(r, r') &= (-D_\text{loc}(r) δ(r, r') + D_\text{loc}(r) D_\text{loc}(r') / D) \\ &+ \sqrt{L(x)} \text{IFFT} \frac{C_0 G^2}{4π (1 - C_0 G^2 / k_{TF}^2)} \text{FFT} \sqrt{L(x)} \end{aligned}

where $C_0 = 1 - ε_r$, $D_\text{loc}$ is the local density of states, $D$ is the density of states and the same convention for parameters are used as in DielectricMixing. Additionally there is the real-space localization function L(r). For details see Herbst, Levitt 2020 arXiv:2009.01665

Important kwargs passed on to χ0Mixing

• RPA: Is the random-phase approximation used for the kernel (i.e. only Hartree kernel is used and not XC kernel)
• verbose: Run the GMRES in verbose mode.
• reltol: Relative tolerance for GMRES
source
DFTK.IncreaseMixingTemperatureMethod

Increase the temperature used for computing the SCF preconditioners. Initially the temperature is increased by a factor, which is then smoothly lowered towards the temperature used within the model as the SCF converges. Once the density change is below above_ρdiff the mixing temperature is equal to the model temperature.

source
DFTK.LdosMixingMethod

The model for the susceptibility is

\begin{aligned} χ_0(r, r') &= (-D_\text{loc}(r) δ(r, r') + D_\text{loc}(r) D_\text{loc}(r') / D) \end{aligned}

where $D_\text{loc}$ is the local density of states, $D$ is the density of states. For details see Herbst, Levitt 2020 arXiv:2009.01665.

Important kwargs passed on to χ0Mixing

• RPA: Is the random-phase approximation used for the kernel (i.e. only Hartree kernel is used and not XC kernel)
• verbose: Run the GMRES in verbose mode.
• reltol: Relative tolerance for GMRES
source
DFTK.ScfAcceptImprovingStepMethod

Accept a step if the energy is at most increasing by max_energy and the residual is at most max_relative_residual times the residual in the previous step.

source
DFTK.ScfDiagtolMethod

Determine the tolerance used for the next diagonalization. This function takes $|ρnext - ρin|$ and multiplies it with ratio_ρdiff to get the next diagtol, ensuring additionally that the returned value is between diagtol_min and diagtol_max and never increases.

source
DFTK.ScfPlotTraceFunction

Plot the trace of an SCF, i.e. the absolute error of the total energy at each iteration versus the converged energy in a semilog plot. By default a new plot canvas is generated, but an existing one can be passed and reused along with kwargs for the call to plot!. Requires Plots to be loaded.

source
DFTK.apply_KMethod
apply_K(basis::PlaneWaveBasis, δψ, ψ, ρ, occupation)

Compute the application of K defined at ψ to δψ. ρ is the density issued from ψ. δψ also generates a δρ, computed with compute_δρ.

source
DFTK.apply_kernelMethod
apply_kernel(basis::PlaneWaveBasis, δρ; kwargs...)

Computes the potential response to a perturbation δρ in real space, as a 4D (i,j,k,σ) array.

source
DFTK.apply_symopMethod

Apply a symmetry operation to eigenvectors ψk at a given kpoint to obtain an equivalent point in [-0.5, 0.5)^3 and associated eigenvectors (expressed in the basis of the new $k$-point).

source
DFTK.apply_ΩMethod
apply_Ω(δψ, ψ, H::Hamiltonian, Λ)

Compute the application of Ω defined at ψ to δψ. H is the Hamiltonian computed from ψ and Λ is the set of Rayleigh coefficients ψk' * Hk * ψk at each k-point.

source
DFTK.attach_pspMethod
attach_psp(system::AbstractSystem, pspmap::AbstractDict{Symbol,String})
attach_psp(system::AbstractSystem; psps::String...)

Return a new system with the pseudopotential property of all atoms set according to the passed pspmap, which maps from the atomic symbol to a pseudopotential identifier. Alternatively the mapping from atomic symbol to pseudopotential identifier can also be passed as keyword arguments. An empty string can be used to denote elements where the full Coulomb potential should be employed.

Examples

Select pseudopotentials for all silicon and oxygen atoms in the system.

julia> attach_psp(system, Dict(:Si => "hgh/lda/si-q4", :O => "hgh/lda/o-q6")

Same thing but using the kwargs syntax:

julia> attach_psp(system, Si="hgh/lda/si-q4", O="hgh/lda/o-q6")
source
DFTK.build_fft_plans!Method

Plan a FFT of type T and size fft_size, spending some time on finding an optimal algorithm. (Inplace, out-of-place) x (forward, backward) FFT plans are returned.

source
DFTK.build_projection_vectors_Method

Build projection vectors for a atoms array generated by term_nonlocal

\begin{aligned} H_{\rm at} &= \sum_{ij} C_{ij} \ket{p_i} \bra{p_j} \\ H_{\rm per} &= \sum_R \sum_{ij} C_{ij} \ket{p_i(x-R)} \bra{p_j(x-R)} \end{aligned}\begin{aligned} \braket{e_k(G') \middle| H_{\rm per}}{e_k(G)} &= \ldots \\ &= \frac{1}{Ω} \sum_{ij} C_{ij} \hat p_i(k+G') \hat p_j^*(k+G), \end{aligned}

where $\hat p_i(q) = ∫_{ℝ^3} p_i(r) e^{-iq·r} dr$.

We store $\frac{1}{\sqrt Ω} \hat p_i(k+G)$ in proj_vectors.

source
DFTK.bzmesh_ir_wedgeMethod
 bzmesh_ir_wedge(kgrid_size, symmetries; kshift=[0, 0, 0])

Construct the irreducible wedge of a uniform Brillouin zone mesh for sampling $k$-points, given the crystal symmetries symmetries. Returns the list of irreducible $k$-point (fractional) coordinates, the associated weights and the new symmetries compatible with the grid.

source
DFTK.bzmesh_uniformMethod
bzmesh_uniform(kgrid_size; kshift=[0, 0, 0])

Construct a (shifted) uniform Brillouin zone mesh for sampling the $k$-points. Returns all $k$-point coordinates, appropriate weights and the identity SymOp.

source
DFTK.cell_to_supercellMethod

Transpose all data from a given self-consistent-field result from unit cell to supercell conventions. The parameters to adapt are the following:

• basis_supercell and ψ_supercell are computed by the routines above.
• The supercell occupations vector is the concatenation of all input occupations vectors.
• The supercell density is computed with supercell occupations and ψ_supercell.
• Supercell energies are the multiplication of input energies by the number of unit cells in the supercell.

Other parameters stay untouched.

source
DFTK.cell_to_supercellMethod

Construct a plane-wave basis whose unit cell is the supercell associated to an input basis $k$-grid. All other parameters are modified so that the respective physical systems associated to both basis are equivalent.

source
DFTK.cell_to_supercellMethod

Re-organize Bloch waves computed in a given basis as Bloch waves of the associated supercell basis. The output ψ_supercell have a single component at $Γ$-point, such that ψ_supercell[Γ][:, k+n] contains ψ[k][:, n], within normalization on the supercell.

source
DFTK.cg!Method

Implementation of the conjugate gradient method which allows for preconditioning and projection operations along iterations.

source
DFTK.compute_Ak_gaussian_guessMethod

Compute the matrix $[A_k]_{m,n} = \langle ψ_m^k | g^{\text{per}}_n \rangle$

$g^{per}_n$ are periodized gaussians whose respective centers are given as an (num_bands,1) array [ [center 1], ... ].

Centers are to be given in lattice coordinates and G_vectors in reduced coordinates. The dot product is computed in the Fourier space.

Given an orbital $g_n$, the periodized orbital is defined by : $g^{per}_n = \sum\limits_{R \in {\rm lattice}} g_n( \cdot - R)$. The Fourier coefficient of $g^{per}_n$ at any G is given by the value of the Fourier transform of $g_n$ in G.

source
DFTK.compute_densityMethod
compute_density(basis::PlaneWaveBasis, ψ::AbstractVector, occupation::AbstractVector)

Compute the density for a wave function ψ discretized on the plane-wave grid basis, where the individual k-points are occupied according to occupation. ψ should be one coefficient matrix per $k$-point. It is possible to ask only for occupations higher than a certain level to be computed by using an optional occupation_threshold. By default all occupation numbers are considered.

source
DFTK.compute_fft_sizeMethod

Determine the minimal grid size for the cubic basis set to be able to represent product of orbitals (with the default supersampling=2).

Optionally optimize the grid afterwards for the FFT procedure by ensuring factorization into small primes.

The function will determine the smallest parallelepiped containing the wave vectors $|G|^2/2 \leq E_\text{cut} ⋅ \text{supersampling}^2$. For an exact representation of the density resulting from wave functions represented in the spherical basis sets, supersampling should be at least 2.

If factors is not empty, ensure that the resulting fft_size contains all the factors

source
DFTK.compute_forces_cartMethod

Compute the cartesian forces of an obtained SCF solution in Hartree / Bohr. Returns a list of lists of forces [[force for atom in positions] for (element, positions) in atoms] which has the same structure as the atoms object passed to the underlying Model.

source
DFTK.compute_kernelMethod
compute_kernel(basis::PlaneWaveBasis; kwargs...)

Computes a matrix representation of the full response kernel (derivative of potential with respect to density) in real space. For non-spin-polarized calculations the matrix dimension is prod(basis.fft_size) × prod(basis.fft_size) and for collinear spin-polarized cases it is 2prod(basis.fft_size) × 2prod(basis.fft_size). In this case the matrix has effectively 4 blocks

$$$\left(\begin{array}{cc} K_{αα} & K_{αβ}\\ K_{βα} & K_{ββ} \end{array}\right)$$$
source
DFTK.compute_occupationMethod

Compute occupation and Fermi level given eigenvalues and using fermialg. The tol_n_elec gives the accuracy on the electron count which should be at least achieved.

source
DFTK.compute_δocc!Method

Compute the derivatives of the occupations (and of the Fermi level). The derivatives of the occupations are in-place stored in δocc. The tuple (; δocc, δεF) is returned. It is assumed the passed δocc are initialised to zero.

source
DFTK.compute_δψ!Method

Perform in-place computations of the derivatives of the wave functions by solving a Sternheimer equation for each k-points. It is assumed the passed δψ are initialised to zero.

source
DFTK.compute_χ0Method

Compute the independent-particle susceptibility. Will blow up for large systems. For non-spin-polarized calculations the matrix dimension is prod(basis.fft_size) × prod(basis.fft_size) and for collinear spin-polarized cases it is 2prod(basis.fft_size) × 2prod(basis.fft_size). In this case the matrix has effectively 4 blocks, which are:

$$$\left(\begin{array}{cc} (χ_0)_{αα} & (χ_0)_{αβ} \\ (χ_0)_{βα} & (χ_0)_{ββ} \end{array}\right)$$$
source
DFTK.count_n_projMethod
count_n_proj(psps, psp_positions)

Number of projector functions for all angular momenta up to psp.lmax and for all atoms in the system, including angular parts from -m:m.

source
DFTK.count_n_projMethod
count_n_proj(psp, l)

Number of projector functions for angular momentum l, including angular parts from -m:m.

source
DFTK.count_n_projMethod
count_n_proj(psp)

Number of projector functions for all angular momenta up to psp.lmax, including angular parts from -m:m.

source
DFTK.create_supercellMethod

Construct a supercell of size supercell_size from a unit cell described by its lattice, atoms and their positions.

source
DFTK.diagonalize_all_kblocksMethod

Function for diagonalising each $k$-Point blow of ham one step at a time. Some logic for interpolating between $k$-points is used if interpolate_kpoints is true and if no guesses are given. eigensolver is the iterative eigensolver that really does the work, operating on a single $k$-Block. eigensolver should support the API eigensolver(A, X0; prec, tol, maxiter) prec_type should be a function that returns a preconditioner when called as prec(ham, kpt)

source
DFTK.direct_minimizationMethod

Computes the ground state by direct minimization. kwargs... are passed to Optim.Options(). Note that the resulting ψ are not necessarily eigenvectors of the Hamiltonian.

source
DFTK.divergence_realMethod

Compute divergence of an operand function, which returns the cartesian x,y,z components in real space when called with the arguments 1 to 3. The divergence is also returned as a real-space array.

source
DFTK.energy_ewaldMethod

Compute the electrostatic interaction energy per unit cell between point charges in a uniform background of compensating charge to yield net neutrality.lattice should contain the lattice vectors as columns. charges and positions are the point charges and their positions (as an array of arrays) in fractional coordinates. If forces is not nothing, minus the derivatives of the energy with respect to positions is computed.

For now this function returns zero energy and force on non-3D systems. Use a pairwise potential term if you want to customise this treatment.

source
DFTK.energy_pairwiseMethod

Compute the pairwise interaction energy per unit cell between atomic sites. If forces is not nothing, minus the derivatives of the energy with respect to positions is computed. The potential is expected to decrease quickly at infinity.

source
DFTK.energy_psp_correctionMethod

Compute the correction term for properly modelling the interaction of the pseudopotential core with the compensating background charge induced by the Ewald term.

source
DFTK.enforce_real!Method

Ensure its real-space equivalent of passed Fourier-space representation is entirely real by removing wavevectors G that don't have a -G counterpart in the basis.

source
DFTK.eval_psp_density_core_fourierMethod
eval_psp_density_core_fourier(psp, q)

Evaluate the atomic core charge density in reciprocal space: ρval(q) = ∫{R^3} ρcore(r) e^{-iqr} dr = 4π ∫{R+} ρcore(r) sin(qr)/qr r^2 dr

source
DFTK.eval_psp_energy_correctionFunction
eval_psp_energy_correction([T=Float64,] psp, n_electrons)

Evaluate the energy correction to the Ewald electrostatic interaction energy of one unit cell, which is required compared the Ewald expression for point-like nuclei. n_electrons is the number of electrons per unit cell. This defines the uniform compensating background charge, which is assumed here.

Notice: The returned result is the energy per unit cell and not the energy per volume. To obtain the latter, the caller needs to divide by the unit cell volume.

The energy correction is defined as the limit of the Fourier-transform of the local potential as $q \to 0$, using the same correction as in the Fourier-transform of the local potential: math \lim_{q \to 0} 4π N_{\rm elec} ∫_{ℝ_+} (V(r) - C(r)) \frac{\sin(qr)}{qr} r^2 dr + F[C(r)] = 4π N_{\rm elec} ∫_{ℝ_+} (V(r) + Z/r) r^2 dr

source
DFTK.eval_psp_local_fourierMethod
eval_psp_local_fourier(psp, q)

Evaluate the local part of the pseudopotential in reciprocal space:

\begin{aligned} V_{\rm loc}(q) &= ∫_{ℝ^3} V_{\rm loc}(r) e^{-iqr} dr \\ &= 4π ∫_{ℝ_+} V_{\rm loc}(r) \frac{\sin(qr)}{q} r dr \end{aligned}

In practice, the local potential should be corrected using a Coulomb-like term $C(r) = -Z/r$ to remove the long-range tail of $V_{\rm loc}(r)$ from the integral:

\begin{aligned} V_{\rm loc}(q) &= ∫_{ℝ^3} (V_{\rm loc}(r) - C(r)) e^{-iq·r} dr + F[C(r)] \\ &= 4π ∫_{ℝ_+} (V_{\rm loc}(r) + Z/r) \frac{\sin(qr)}{qr} r^2 dr - Z/q^2 \end{aligned}
source
DFTK.eval_psp_projector_fourierMethod
eval_psp_projector_fourier(psp, i, l, q)

Evaluate the radial part of the i-th projector for angular momentum l at the reciprocal vector with modulus q:

\begin{aligned} p(q) &= ∫_{ℝ^3} p_{il}(r) e^{-iq·r} dr \\ &= 4π ∫_{ℝ_+} r^2 p_{il}(r) j_l(qr) dr \end{aligned}
source
DFTK.eval_psp_projector_realMethod
eval_psp_projector_real(psp, i, l, r)

Evaluate the radial part of the i-th projector for angular momentum l in real-space at the vector with modulus r.

source
DFTK.find_equivalent_kptMethod

Find the equivalent index of the coordinate kcoord ∈ ℝ³ in a list kcoords ∈ [-½, ½)³. ΔG is the vector of ℤ³ such that kcoords[index] = kcoord + ΔG.

source
DFTK.gather_kptsMethod

Gather the distributed data of a quantity depending on k-Points on the master process and return it. On the other (non-master) processes nothing is returned.

source
DFTK.gather_kptsMethod

Gather the distributed $k$-point data on the master process and return it as a PlaneWaveBasis. On the other (non-master) processes nothing is returned. The returned object should not be used for computations and only to extract data for post-processing and serialisation to disk.

source
DFTK.guess_densityFunction
guess_density(basis::PlaneWaveBasis, method::DensityConstructionMethod,
magnetic_moments=[]; n_electrons=basis.model.n_electrons)

Build a superposition of atomic densities (SAD) guess density or a rarndom guess density.

The guess atomic densities are taken as one of the following depending on the input method:

-RandomDensity(): A random density, normalized to the number of electrons basis.model.n_electrons. Does not support magnetic moments. -ValenceDensityAuto(): A combination of the ValenceDensityGaussian and ValenceDensityPseudo methods where elements whose pseudopotentials provide numeric valence charge density data use them and elements without use Gaussians. -ValenceDensityGaussian(): Gaussians of length specified by atom_decay_length normalized for the correct number of electrons:

$$$\hat{ρ}(G) = Z_{\mathrm{valence}} \exp\left(-(2π \text{length} |G|)^2\right)$$$
• ValenceDensityPseudo(): Numerical pseudo-atomic valence charge densities from the

pseudopotentials. Will fail if one or more elements in the system has a pseudopotential that does not have valence charge density data.

When magnetic moments are provided, construct a symmetry-broken density guess. The magnetic moments should be specified in units of $μ_B$.

source
DFTK.index_G_vectorsMethod

Return the index tuple I such that G_vectors(basis)[I] == G or the index i such that G_vectors(basis, kpoint)[i] == G. Returns nothing if outside the range of valid wave vectors.

source
DFTK.interpolate_densityMethod

Interpolate a function expressed in a basis basis_in to a basis basis_out. This interpolation uses a very basic real-space algorithm, and makes a DWIM-y attempt to take into account the fact that basis_out can be a supercell of basis_in.

source
DFTK.interpolate_kpointMethod

Interpolate some data from one $k$-point to another. The interpolation is fast, but not necessarily exact. Intended only to construct guesses for iterative solvers.

source
DFTK.is_metalMethod
is_metal(eigenvalues, εF; tol)

Determine whether the provided bands indicate the material is a metal, i.e. where bands are cut by the Fermi level.

source
DFTK.k_to_kpq_mappingMethod

Return the indices of the kpoints shifted by q. That is for each kpoint of the basis: kpoints[ik].coordinate + q = kpoints[indices[ik]].coordinate.

source
DFTK.kgrid_from_minimal_n_kpointsMethod

Selects a kgrid size which ensures that at least a n_kpoints total number of $k$-points are used. The distribution of $k$-points amongst coordinate directions is as uniformly as possible, trying to achieve an identical minimal spacing in all directions.

source
DFTK.list_pspFunction
list_psp(element; functional, family, core, datadir_psp)

List the pseudopotential files known to DFTK. Allows various ways to restrict the displayed files.

Examples

julia> list_psp(family="hgh")

will list all HGH-type pseudopotentials and

julia> list_psp(family="hgh", functional="lda")

will only list those for LDA (also known as Pade in this context) and

julia> list_psp(:O, core=:semicore)

will list all oxygen semicore pseudopotentials known to DFTK.

source
DFTK.load_pspMethod

Load a pseudopotential file from the library of pseudopotentials. The file is searched in the directory datadir_psp() and by the key. If the key is a path to a valid file, the extension is used to determine the type of the pseudopotential file format and a respective class is returned.

source
DFTK.model_atomicMethod

Convenience constructor, which builds a standard atomic (kinetic + atomic potential) model. Use extra_terms to add additional terms.

source
DFTK.multiply_by_expiqrMethod

Return the Fourier coefficients for ψk · e^{i q·r} in the basis of kpt_out, where ψk is defined on a basis kpt_in.

source
DFTK.newtonMethod
newton(basis::PlaneWaveBasis{T}, ψ0;
tol=1e-6, tol_cg=tol / 100, maxiter=20, callback=ScfDefaultCallback(),
is_converged=ScfConvergenceDensity(tol))

Newton algorithm. Be careful that the starting point needs to be not too far from the solution.

source
DFTK.next_densityFunction

Obtain new density ρ by diagonalizing ham. Follows the policy imposed by the bands data structure to determine and adjust the number of bands to be computed.

source
DFTK.norm_cplxMethod

Complex-analytic extension of LinearAlgebra.norm(x) from real to complex inputs. Needed for phonons as we want to perform a matrix-vector product f'(x)·h, where f is a real-to-real function and h a complex vector. To do this using automatic differentiation, we can extend analytically f to accept complex inputs, then differentiate t -> f(x+t·h). This will fail if non-analytic functions like norm are used for complex inputs, and therefore we have to redefine it.

source
DFTK.overlap_Mmn_k_kpbMethod

Computes the matrix $[M^{k,b}]_{m,n} = \langle u_{m,k} | u_{n,k+b} \rangle$ for given k, kpb = $k+b$.

G_shift is the "shifting" vector, correction due to the periodicity conditions imposed on $k \to ψ_k$. It is non zero if kpb is taken in another unit cell of the reciprocal lattice. We use here that: $u_{n(k + G_{\rm shift})}(r) = e^{-i*\langle G_{\rm shift},r \rangle} u_{nk}$.

source
DFTK.plot_bandstructureFunction

Compute and plot the band structure. n_bands selects the number of bands to compute. If this value is absent and an scfres is used to start the calculation a default of n_bands_scf + 5sqrt(n_bands_scf) is used. The unit used to plot the bands can be selected using the unit parameter. Like in the rest of DFTK Hartree is used by default. Another standard choices is unit=u"eV" (electron volts). The kline_density is given in number of $k$-points per inverse bohrs (i.e. overall in units of length).

source
DFTK.psp_local_polynomialFunction

The local potential of a HGH pseudopotentials in reciprocal space can be brought to the form $Q(t) / (t^2 exp(t^2 / 2))$ where $t = r_\text{loc} q$ and Q is a polynomial of at most degree 8. This function returns Q.

source
DFTK.psp_projector_polynomialFunction

The nonlocal projectors of a HGH pseudopotentials in reciprocal space can be brought to the form $Q(t) exp(-t^2 / 2)$ where $t = r_l q$ and Q is a polynomial. This function returns Q.

source
DFTK.qcut_psp_localMethod

Estimate an upper bound for the argument q after which abs(eval_psp_local_fourier(psp, q)) is a strictly decreasing function.

source
DFTK.r_vectorsMethod
r_vectors(basis::PlaneWaveBasis)

The list of $r$ vectors, in reduced coordinates. By convention, this is in [0,1)^3.

source
DFTK.read_w90_nnkpMethod

Read the .nnkp file provided by the preprocessing routine of Wannier90 (i.e. "wannier90.x -pp prefix") Returns:

1. the array 'nnkpts' of k points, their respective nearest neighbors and associated shifing vectors (non zero if the neighbor is located in another cell).
2. the number 'nntot' of neighbors per k point.

TODO: add the possibility to exclude bands

source
DFTK.run_wannier90Function

Wannerize the obtained bands using wannier90. By default all converged bands from the scfres are employed (change with n_bands kwargs) and n_wannier = n_bands wannier functions are computed using random Gaussians as guesses. All keyword arguments supported by Wannier90 for the disentanglement may be added as keyword arguments. The function returns the fileprefix.

Experimental feature

Currently this is an experimental feature, which has not yet been tested to full depth. The interface is considered unstable and may change incompatibly in the future. Use at your own risk and please report bugs in case you encounter any.

source
DFTK.save_scfresMethod
save_scfres(filename, scfres)

Save an scfres obtained from self_consistent_field to a file. The format is determined from the file extension. Currently the following file extensions are recognized and supported:

• jld2: A JLD2 file. Stores the complete state and can be used (with load_scfres) to restart an SCF from a checkpoint or post-process an SCF solution. See Saving SCF results on disk and SCF checkpoints for details.
• vts: A VTK file for visualisation e.g. in paraview. Stores the density, spin density and some metadata (energy, Fermi level, occupation etc.). Supports these keyword arguments:
• save_ψ: Save the real-space representation of the orbitals as well (may lead to larger files).
• extra_data: Dict{String,Array} with additional data on the 3D real-space grid to store into the VTK file.
No compatibility guarantees

No guarantees are made with respect to this function at this point. It may change incompatibly between DFTK versions or stop working / be removed in the future.

source
DFTK.scf_damping_quadratic_modelMethod

Use the two iteration states info and info_next to find a damping value from a quadratic model for the SCF energy. Returns nothing if the constructed model is not considered trustworthy, else returns the suggested damping.

source
DFTK.self_consistent_fieldMethod
self_consistent_field(basis; [tol, mixing, damping, ρ, ψ])

Solve the Kohn-Sham equations with a density-based SCF algorithm using damped, preconditioned iterations where $ρ_\text{next} = α P^{-1} (ρ_\text{out} - ρ_\text{in})$.

Overview of parameters:

• ρ: Initial density
• ψ: Initial orbitals
• tol: Tolerance for the density change ($\|ρ_\text{out} - ρ_\text{in}\|$) to flag convergence. Default is 1e-6.
• is_converged: Convergence control callback. Typical objects passed here are DFTK.ScfConvergenceDensity(tol) (the default), DFTK.ScfConvergenceEnergy(tol) or DFTK.ScfConvergenceForce(tol).
• maxiter: Maximal number of SCF iterations
• mixing: Mixing method, which determines the preconditioner $P^{-1}$ in the above equation. Typical mixings are LdosMixing, KerkerMixing, SimpleMixing or DielectricMixing. Default is LdosMixing()
• damping: Damping parameter $α$ in the above equation. Default is 0.8.
• nbandsalg: By default DFTK uses nbandsalg=AdaptiveBands(model), which adaptively determines the number of bands to compute. If you want to influence this algorithm or use a predefined number of bands in each SCF step, pass a FixedBands or AdaptiveBands.
• callback: Function called at each SCF iteration. Usually takes care of printing the intermediate state.
source
DFTK.solve_ΩplusKMethod
solve_ΩplusK(basis::PlaneWaveBasis{T}, ψ, res, occupation;
tol=1e-10, verbose=false) where {T}

Return δψ where (Ω+K) δψ = rhs

source
DFTK.solve_ΩplusK_splitMethod

Solve the problem (Ω+K) δψ = rhs using a split algorithm, where rhs is typically -δHextψ (the negative matvec of an external perturbation with the SCF orbitals ψ) and δψ is the corresponding total variation in the orbitals ψ. Additionally returns: - δρ: Total variation in density) - δHψ: Total variation in Hamiltonian applied to orbitals - δeigenvalues: Total variation in eigenvalues - δVind: Change in potential induced by δρ (the term needed on top of δHextψ to get δHψ).

source
DFTK.spglib_atomsMethod

Convert the DFTK atom groups and positions datastructure into a tuple of datastructures for use with spglib. Validity of the input data is assumed. The output positions contains positions per atom, numbers contains the mapping atom to a unique number for each group of indistinguishable atoms, spins contains the $z$-component of the initial magnetic moment on each atom, mapping contains the mapping of the numbers to the element objects in DFTK and collinear whether the atoms mark a case of collinear spin or not. Notice that if collinear is false then spins is garbage.

source
DFTK.spglib_standardize_cellMethod

Returns crystallographic conventional cell according to the International Table of Crystallography Vol A (ITA) in case primitive=false. If primitive=true the primitive lattice is returned in the convention of the reference work of Cracknell, Davies, Miller, and Love (CDML). Of note this has minor differences to the primitive setting choice made in the ITA.

source
DFTK.sphericalbesselj_fastMethod
sphericalbesselj_fast(l::Integer, x::Number)

Returns the spherical Bessel function of the first kind jl(x). Consistent with https://en.wikipedia.org/wiki/Besselfunction#SphericalBesselfunctions and with SpecialFunctions.sphericalbesselj. Specialized for integer 0 <= l <= 5.

source
DFTK.standardize_atomsFunction

Apply various standardisations to a lattice and a list of atoms. It uses spglib to detect symmetries (within tol_symmetry), then cleans up the lattice according to the symmetries (unless correct_symmetry is false) and returns the resulting standard lattice and atoms. If primitive is true (default) the primitive unit cell is returned, else the conventional unit cell is returned.

source
DFTK.synchronize_deviceMethod

Synchronize data and finish all operations on the execution stream of the device. This needs to be called explicitly before a task finishes (e.g. in an @spawn block).

source
DFTK.transfer_blochwave_kptMethod

Transfer an array ψk_in expanded on kpt_in, and produce $ψ(r) e^{i ΔG·r}$ expanded on kpt_out. It is mostly useful for phonons. Beware: ψk_out can lose information if the shift ΔG is large or if the G_vectors differ between k-points.

source
DFTK.transfer_mappingMethod

Compute the index mapping between two bases. Returns two arrays idcs_in and idcs_out such that ψkout[idcs_out] = ψkin[idcs_in] does the transfer from ψkin (defined on basis_in and kpt_in) to ψkout (defined on basis_out and kpt_out).

source
DFTK.unfold_bzMethod

" Convert a basis into one that doesn't use BZ symmetry. This is mainly useful for debug purposes (e.g. in cases we don't want to bother thinking about symmetries).

source
DFTK.ylm_realMethod

Returns the (l,m) real spherical harmonic Ylm(r). Consistent with https://en.wikipedia.org/wiki/Tableofsphericalharmonics#Realsphericalharmonics

source
DFTK.zeros_likeFunction

Create an array of same "array type" as X filled with zeros, minimizing the number of allocations. This unifies CPU and GPU code, as the output will always be on the same device as the input.

source
DFTK.Smearing.entropyMethod

Entropy. Note that this is a function of the energy x, not of occupation(x). This function satisfies s' = x f' (see https://www.vasp.at/vasp-workshop/k-points.pdf p. 12 and https://arxiv.org/pdf/1805.07144.pdf p. 18.

source
DFTK.Smearing.occupationFunction
occupation(S::SmearingFunction, x)

Occupation at x, where in practice x = (ε - εF) / temperature. If temperature is zero, (ε-εF)/temperature = ±∞. The occupation function is required to give 1 and 0 respectively in these cases.

source