Fermi Surfaces with Castep
Two systems are considered, copper and magnesium boride.
Castep's definition of the Monkhorst-Pack grid means that odd-numbered grids will include the gamma point, as XCrysden requires. Otherwise one must specify a shift.
%block LATTICE_CART -1.7669227 0.0000000 1.7669227 0.0000000 1.7669227 1.7669227 -1.7669227 1.7669227 0.0000000 %endblock LATTICE_CART %block POSITIONS_FRAC Cu 0.000000 0.000000 0.000000 %endblock POSITIONS_FRAC KPOINT_MP_GRID 9 9 9 KPOINT_MP_OFFSET 0 0 0 BS_KPOINT_MP_GRID 45 45 45 BS_KPOINT_MP_OFFSET 0 0 0 symmetry_generate
task : bandstructure bs_nextra_bands : 0
This example will use a 9x9x9 grid for the electronic minimisation, which symmetry will reduce to 35 k-points. It then uses a 45x45x45 grid for calculating the band structure, which symmetry reduces to 2300 k-points.
Note that Castep assumes that more bands are wanted in a
bandstructure calculations. Extra unoccupied bands are not needed
for the visualisation of the Fermi surface. Castep's default is to
add 5√nbands bands, so this calculation which uses ten bands
for the electronic minimisation will default to 26 for the band
structure calculation unless
set. Failure to set
bs_nextra_bands merely increases
the run-time and disk space required by a factor of about 2.5.
The above calculation requires about 1GB of memory, 100MB of disk space, and takes around 5 minutes on a quad core 3GHz Ivy Bridge desktop. It can be run with
$ castep copper
The results include a
.check file which contains the
wavefunctions from just the 35 kpoints used in the electronic
minimisation, and a
.bands file which contains
eigenvalues from the 2300 kpoints used in the band structure
Either can be used as input to c2x. If run as:
$ c2x --bxsf copper.check copper.bxsf
it will use the eigenvalues from the electronic minimisation and
the symmetry operations also found in the
and generate a
.bxsf file with a 9x9x9 grid (729
If run as:
$ c2x --bxsf copper.bands copper.bxsf
it will use the eigenvalues from the band structure calculation,
and will additionally read the
.cell file. On finding
no symmetry operations explicitly listed in the
file it will call spglib (if compiled with spglib support) in order
to obtain the symmetry operations required to expand the k-points
back to the unreduced grid.
Finally one can run XCrysDen as:
$ xcrysden --bxsf copper.bxsf &
The bands will be listed twice, once for each spin, as Castep defaults to treating this system as spin-polarised. The bands which cross the Fermi surface are numbers 6, and 6+nbands.
This example is inspired by the documentation for Fermisurfer.
%block LATTICE_CART 3.0737596 0.0000000 0.0000000 -1.5368798 2.6619539 0.0000000 0.0000000 0.0000000 3.5199867 %endblock LATTICE_CART %block POSITIONS_FRAC Mg 0.000000000 0.000000000 0.000000000 B 0.333333333 0.666666667 0.500000000 B 0.666666667 0.333333333 0.500000000 %endblock POSITIONS_FRAC KPOINT_MP_GRID 16 16 12 KPOINT_MP_OFFSET 0.031250000 0.031250000 0.125000000 symmetry_generate
This time extra k-points are not generated with a band structure
calculation, so no
.param file is required, and an even
grid with a shift to move it back to including the gamma point is
So now (almost) identical results are produced whether one uses
.bands file for
$ c2x --bxsf MgB2.check MgB2.check.bxsf $ c2x --bxsf MgB2.bands MgB2.bands.bxsf
Three bands (7,8 and 9) cross the Fermi level in this system, and Castep does not perform a spin-polarised calculation by default as there is an even number of electrons in the system.
The result is coarser than for the copper surface, but far fewer k-points are being used.
This example has its own page.
Back to visualising Fermi surfaces.