Pseudopotential Generation

By far the most helpful document for generating pseudopotential with quantum espresso is Paolo Giannozzi’s notes. Generating a .UPF file with ld1.x is very easy. Any reasonable input will run through. The hard part is making sure the generated pseudo potential is soft and transferable.

Soft means the pseudopotential should not have the steep hard-core like wiggling of the true atomic potential.

The goal in life of a pseudopotential is to help reproduce all-electron calculations while requiring a low plane wave cutoff. The reason an all-electron calculation requires a very high plane wave cutoff is that the electron-nucleus cusp is very spread out in Fourier space (recall a delta function is uniformly spread out in Fourier space).

Genreation

The following exercise is taken from this document.

Firstly, only the &input card is needed for a simple all-electron calculation

&input
title = 'all-electron Si'
zed = 14.0 ! or equivalently atom = 'Si'
iswitch = 1 ! 1 for all electron, 2 for PP test, 3 for PP generation
dft = 'lda'
prefix = 'si'
config = '[Ne] 3s2 3p2' ! neutral atom
rmax = 20 ! (bohr) the extent of the most delocalized orbital
! take logarithmic derivative at Rcut=2.20 over the energy
! range -2.0 to 1.0 with dE=0.01
rlderiv = 2.20, eminld = -2.0, emaxld = 1.0, deld = 0.01

To generate a pseudopotential, change iswitch to 3, append the following &inputp card and specify the orbitals to be pseudized. Energy eigenvalue = 0.0 means the orbital energies of the pseudopotential will try to match the all-electron simulation. Rcut_us is only useful for ultrasoft pseudopotential.

&inputp
pseudotype = 1 ! old-format norm-conserving
lloc = 1 ! angular momentum of the local channel ?
file_pseudopw = 'Si.UPF'
tm = .true. ! Troullier-Martins
author = 'me!'
/
2
3S 1 0 2.00 0.00 2.20 2.20
! S=1 l occ. energy Rcut Rcut_us
3P 2 1 2.00 0.00 2.20 2.20
! P=2 l occ. eigen. Rcut Rcut_us

Congratulations! ‘Si.UPF’ should now be generated, authored by ‘me!’!

Test Correctness

Firstly, let’s make sure the program actually worked correctly. That is, the generated pseudopotential can reproduce all-atom results for the configuration it’s trying to match (neutral `Si’ atom). Look in si.test and you should see 0.00 on the last column, meaning that the eigenvalues for the pseudized orbitals and the true orbitals are the same. This is just a sanity check, now onto the real tests:

Orbitals

Look in sips.wfc and you should see the pseudized and true 3S and 3P radial functions (the pseudized ones come first). Plot them together and you will see that the pseudized wave functions match exactly with the true wave functions beyond the specified cutoff radius of 2.20 bohr, and softer within the cutoff.

log derivatives

The logarithmic derivative of the pseudopotential in sips.dlog should also match that of the true potential in si.dlog up to high energies.

Test Transferability

Take your precious pseudopotential to a different folder, copy over the previous input, change iswitch and replace the &inputp card with the following &test card:

&test
nconf = 5
file_pseudo = 'Si.UPF'
configts(1) = '3s2 3p2'
configts(2) = '3s2 3p1'
configts(3) = '3s2 3p0'
configts(4) = '3s1 3p0'
configts(5) = '3s0 3p0'
/

This will run the above correctness tests for the neutral and several charged cases. We will see that the pseudopotential works fairly well (a. eigenvalue of orbitals match to ~1mRy b. orbitals match outside of Rcut c. logarithmic derivative matches for low energy) for the first three configurations and fails completely for the highly charged Si \(^{4+}\) configuration.