In this example, we'll look at how to use various pseudopotential (PSP) formats in DFTK and discuss briefly the utility and importance of pseudopotentials.

Currently, DFTK supports norm-conserving (NC) PSPs in separable (Kleinman-Bylander) form. Two file formats can currently be read and used: analytical Hartwigsen-Goedecker-Hutter (HGH) PSPs and numeric Unified Pseudopotential Format (UPF) PSPs.

In brief, the pseudopotential approach replaces the all-electron atomic potential with an effective atomic potential. In this pseudopotential, tightly-bound core electrons are completely eliminated ("frozen") and chemically-active valence electron wavefunctions are replaced with smooth pseudo-wavefunctions whose Fourier representations decay quickly. Both these transformations aim at reducing the number of Fourier modes required to accurately represent the wavefunction of the system, greatly increasing computational efficiency.

Different PSP generation codes produce various file formats which contain the same general quantities required for pesudopotential evaluation. HGH PSPs are constructed from a fixed functional form based on Gaussians, and the files simply tablulate various coefficients fitted for a given element. UPF PSPs take a more flexible approach where the functional form used to generate the PSP is arbitrary, and the resulting functions are tabulated on a radial grid in the file. The UPF file format is documented here: http://pseudopotentials.quantum-espresso.org/home/unified-pseudopotential-format.

In this example, we will compare the convergence of an analytical HGH PSP with a modern UPF PSP from PseudoDojo. Then, we will compare the bandstructure at the converged parameters calculated using the two PSPs.

In [1]:

```
using DFTK
using Downloads
using Unitful
using Plots
```

In [2]:

```
PSEUDOLIB = "https://raw.githubusercontent.com/JuliaMolSim/PseudoLibrary"
COMMIT = "56d1774708e1adfff35d30a403004cb98de4224b"
URL_UPF = PSEUDOLIB * "/$COMMIT/pseudos/pd_nc_sr_lda_standard_04_upf/Li.upf";
```

`load_psp`

, which determines the
file format using the file extension.

In [3]:

```
psp_hgh = load_psp("hgh/lda/li-q3.hgh");
path_upf = Downloads.download(URL_UPF, joinpath(tempdir(), "Li.upf"))
psp_upf = load_psp(path_upf);
```

*harder*, i.e. it requires a higher energy cutoff, than the UPF PSP. In general,
numeric pseudopotentials tend to be softer than analytical pseudos because of the
flexibility of sampling arbitrary functions on a grid.

In [4]:

```
function run_bands(psp)
a = -1.53877u"Å"
b = -2.66523u"Å"
c = -4.92295u"Å"
lattice = [ a a 0;
-b b 0;
0 0 -c]
Li = ElementPsp(:Li; psp)
atoms = [Li, Li]
positions = [[1/3, 2/3, 1/4],
[2/3, 1/3, 3/4]]
# These are (as you saw above) completely unconverged parameters
model = model_LDA(lattice, atoms, positions; temperature=1e-2)
basis = PlaneWaveBasis(model; Ecut=24, kgrid=(6, 6, 4))
scfres = self_consistent_field(basis; tol=1e-4)
bandplot = plot_bandstructure(scfres)
(; scfres, bandplot)
end;
```

In [5]:

```
result_hgh = run_bands(psp_hgh)
result_hgh.scfres.energies
```

n Energy log10(ΔE) log10(Δρ) Diag Δtime --- --------------- --------- --------- ---- ------ 1 -13.91967405931 -0.12 5.3 2 -13.98183883897 -1.21 -0.71 1.9 1.03s 3 -13.98666559711 -2.32 -1.53 2.6 1.13s 4 -13.98668186065 -4.79 -2.27 1.1 818ms 5 -13.98668227674 -6.38 -2.98 2.2 948ms 6 -13.98668235968 -7.08 -3.93 2.4 978ms 7 -13.98668236476 -8.29 -4.38 3.3 1.20s Computing bands along kpath: Γ -> M -> K -> Γ -> A -> L -> H -> A and L -> M and H -> K Diagonalising Hamiltonian kblocks: 100%|████████████████| Time: 0:00:27

Out[5]:

Energy breakdown (in Ha): Kinetic 11.3792090 AtomicLocal -20.7901733 AtomicNonlocal 0.0000000 Ewald -5.0511706 PspCorrection -0.0009254 Hartree 3.7115851 Xc -3.2266835 Entropy -0.0085236 total -13.986682364761

In [6]:

```
result_upf = run_bands(psp_upf)
result_upf.scfres.energies
```

n Energy log10(ΔE) log10(Δρ) Diag Δtime --- --------------- --------- --------- ---- ------ 1 -14.14867070483 -0.15 5.2 2 -14.21787398009 -1.16 -0.76 2.0 1.17s 3 -14.22231399034 -2.35 -1.54 2.4 1.15s 4 -14.22233968310 -4.59 -2.63 1.1 883ms 5 -14.22234159368 -5.72 -2.95 3.2 1.24s 6 -14.22234164490 -7.29 -4.08 1.1 798ms Computing bands along kpath: Γ -> M -> K -> Γ -> A -> L -> H -> A and L -> M and H -> K Diagonalising Hamiltonian kblocks: 100%|████████████████| Time: 0:00:27

Out[6]:

Energy breakdown (in Ha): Kinetic 10.2239402 AtomicLocal -10.9142053 AtomicNonlocal -8.9743168 Ewald -5.0511706 PspCorrection 0.1151544 Hartree 3.5205945 Xc -3.1341549 Entropy -0.0081831 total -14.222341644904

In [7]:

```
plot(result_hgh.bandplot, result_upf.bandplot, titles=["HGH" "UPF"], size=(800, 400))
```

Out[7]: