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.

Copper

copper.cell

%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

copper.param

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 bs_nextra_bands is 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 calculation.

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 .check file and generate a .bxsf file with a 9x9x9 grid (729 points).

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 .cell 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.

Cu Fermi surface

MgB2

This example is inspired by the documentation for Fermisurfer.

MgB2.cell

%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 used.

So now (almost) identical results are produced whether one uses the .check or .bands file for analysis:

$ 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.

MgB2 Fermi surface

The result is coarser than for the copper surface, but far fewer k-points are being used.

ScB2

This example has its own page.