# DFTK.jl: The density-functional toolkit.

The density-functional toolkit, **DFTK** for short, is a library of Julia routines for playing with plane-wave density-functional theory (DFT) algorithms. In its basic formulation it solves periodic Kohn-Sham equations. The unique feature of the code is its **emphasis on simplicity and flexibility** with the goal of facilitating methodological development and interdisciplinary collaboration. In about 7k lines of pure Julia code we support a sizeable set of features. Our performance is of the same order of magnitude as much larger production codes such as Abinit, Quantum Espresso and VASP. DFTK's source code is publicly available on github.

If you are new to density-functional theory or plane-wave methods, see our notes on Periodic problems and our collection of lectures, workshops and literature on DFT.

## Package features

- Methods and models:
- Kohn-Sham-like models, with an emphasis on flexibility: compose your own model, from Cohen-Bergstresser linear eigenvalue equations to Gross-Pitaevskii equations and sophisticated LDA/GGA functionals (any functional from the libxc library)
- Analytic potentials or Godecker norm-conserving pseudopotentials (GTH, HGH)
- Brillouin zone symmetry for $k$-point sampling using spglib
- Smearing functions for metals
- Collinear spin polarization for magnetic systems
- Self-consistent field approaches: Damping, Kerker mixing, LDOS mixing, Anderson/Pulay/DIIS acceleration
- Direct minimization, Newton solver
- Multi-level threading ($k$-points eigenvectors, FFTs, linear algebra)
- MPI-based distributed parallelism (distribution over $k$-points)
- 1D / 2D / 3D systems
- Magnetic fields
- Treat systems beyond 800 electrons

- Ground-state properties and post-processing:
- Total energy
- Forces, stresses
- Density of states (DOS), local density of states (LDOS)
- Band structures
- Easy access to all intermediate quantities (e.g. density, Bloch waves)

- Support for arbitrary floating point types, including
`Float32`

(single precision) or`Double64`

(from DoubleFloats.jl). For DFT this is currently restricted to LDA (with Slater exchange and VWN correlation). - Runs out of the box on Linux, macOS and Windows
- Third-party integrations:
- Seamless integration with many standard Input and output formats.
- Use structures prepared in pymatgen, ASE or abipy.
- asedftk: DFTK-based calculator implementation for ASE.

Missing a feature? Look for an open issue or create a new one. Want to contribute? See our contributing notes.

## Example index

First, new users should take a look at the Installation and Tutorial sections. More details about DFTK are explained in the examples as we go along:

- Temperature and metallic systems
- Creating supercells with pymatgen
- Creating slabs with ASE
- Collinear spin and magnetic systems
- Geometry optimization
- Monitoring self-consistent field calculations
- Saving SCF results on disk and SCF checkpoints
- Polarizability by linear response
- Gross-Pitaevskii equation in one dimension
- Gross-Pitaevskii equation with magnetism
- Cohen-Bergstresser model
- Arbitrary floating-point types
- Polarizability using automatic differentiation
- Custom solvers
- Custom potential

These and more examples can be found in the `examples`

directory of the main code.

In the documentation we use very rough convergence parameters to be able to automatically generate this documentation very quickly. Therefore results are far from converged. Tighter thresholds and larger grids should be used for more realistic results.

If you have a great example you think would fit here, please open a pull request!