IFermi is a Python (3.6+) library and set of command-line tools for the generation, analysis, and visualisation of Fermi surfaces and Fermi slices. The goal of the library is to provide fully featured FermiSurface and FermiSlice objects that allow for easy manipulation and analysis. The main features include:
Interpolation of electronic band structures onto dense k-point meshes.
Extraction of Fermi surfaces and Fermi slices from electronic band structures.
Projection of arbitrary properties onto Fermi surfaces and Fermi slices.
Tools to calculate Fermi surface dimensionality, orientation, and averaged projections, including Fermi velocities.
Generation and visualisation of spin-texture.
IFermi’s command-line tools only work with VASP calculations but support for additional DFT packages will be added in the future.
The online documentation provides a full description of the available command-line options.
Fermi surface properties, including dimensionality and orientation can be extracted from a vasprun.xml file using:
ifermi info --property velocity
Fermi Surface Summary ===================== # surfaces: 5 Area: 32.75 Å⁻² Avg velocity: 9.131e+05 m/s Isosurfaces ~~~~~~~~~~~ Band Area [Å⁻²] Velocity avg [m/s] Dimensionality Orientation ------ ------------ -------------------- ---------------- ------------- 6 1.944 7.178e+05 2D (0, 0, 1) 7 4.370 9.092e+05 quasi-2D (0, 0, 1) 7 2.961 5.880e+05 2D (0, 0, 1) 8 3.549 1.105e+06 quasi-2D (0, 0, 1) 8 3.549 1.105e+06 quasi-2D (0, 0, 1)
Three-dimensional Fermi surfaces can be visualized from a
vasprun.xml file using:
The two-dimensional slice of a Fermi surface along the plane specified by the miller
indices (j k l) and distance d can be plotted from a
vasprun.xml file using:
ifermi plot --slice j k l d
ifermi command line tools are build on the IFermi Python library. Here is an
example of how to load DFT calculation outputs, interpolate the energies onto a dense mesh,
generate a Fermi surface, calculate Fermi surface properties, and visualise the surface.
A more complete summary of the API is given in the API introduction page
and in the API Reference page in the documentation.
from pymatgen.io.vasp.outputs import Vasprun from ifermi.surface import FermiSurface from ifermi.interpolate import FourierInterpolator from ifermi.plot import FermiSlicePlotter, FermiSurfacePlotter, save_plot, show_plot from ifermi.kpoints import kpoints_from_bandstructure # load VASP calculation outputs vr = Vasprun("vasprun.xml") bs = vr.get_band_structure() # interpolate the energies onto a dense k-point mesh interpolator = FourierInterpolator(bs) dense_bs, velocities = interpolator.interpolate_bands(return_velocities=True) # generate the Fermi surface and calculate the dimensionality fs = FermiSurface.from_band_structure( dense_bs, mu=0.0, wigner_seitz=True, calculate_dimensionality=True ) # generate the Fermi surface and calculate the group velocity at the # center of each triangular face dense_kpoints = kpoints_from_bandstructure(dense_bs) fs = FermiSurface.from_band_structure( dense_bs, mu=0.0, wigner_seitz=True, calculate_dimensionality=True, property_data=velocities, property_kpoints=dense_kpoints ) # number of isosurfaces in the Fermi surface fs.n_surfaces # number of isosurfaces for each Spin channel fs.n_surfaces_per_spin # the total area of the Fermi surface fs.area # the area of each isosurface fs.area_surfaces # loop over all isosurfaces and check their properties # the isosurfaces are given as a list for each spin channel for spin, isosurfaces in fs.isosurfaces.items(): for isosurface in isosurfaces: # the dimensionality (does the surface cross periodic boundaries) isosurface.dimensionality # what is the orientation isosurface.orientation # does the surface have face properties isosurface.has_properties # calculate the norms of the properties isosurface.properties_norms # calculate scalar projection of properties on to [0 0 1] vector isosurface.scalar_projection((0, 0, 1)) # uniformly sample the surface faces to a consistent density isosurface.sample_uniform(0.1) # plot the Fermi surface fs_plotter = FermiSurfacePlotter(fs) plot = fs_plotter.get_plot() # generate Fermi slice along the (0 0 1) plane going through the Γ-point. fermi_slice = fs.get_fermi_slice((0, 0, 1)) # number of isolines in the slice fermi_slice.n_lines # do the lines have segment properties fermi_slice.has_properties # plot slice slice_plotter = FermiSlicePlotter(fermi_slice) plot = slice_plotter.get_plot() save_plot(plot, "fermi-slice.png") # saves the plot to a file show_plot(plot) # displays an interactive plot
If you find IFermi useful, please encourage its development by citing the following paper in your research output:
Ganose, A. M., Searle, A., Jain, A., Griffin, S. M., IFermi: A python library for Fermi surface generation and analysis. Journal of Open Source Software, 2021, 6 (59), 3089
The recommended way to install IFermi is in a conda environment.
conda create --name ifermi pip cmake numpy conda activate ifermi conda install -c conda-forge pymatgen boltztrap2 pyfftw pip install ifermi `
IFermi is currently compatible with Python 3.6+ and relies on a number of open-source python packages, specifically:
pymatgen for parsing DFT calculation outputs.
BoltzTrap2 for band structure interpolation.
trimesh for manipulating isosurfaces.
The integration tests can be run to ensure IFermi has been installed correctly. First download the IFermi source and install the test requirements.
git clone https://github.com/fermisurfaces/IFermi.git cd IFermi pip install .[tests]
The tests can be run in the IFermi folder using:
Track changes to IFermi through the changelog.
IFermi is made available under the MIT License (see LICENSE file).
Developed by Amy Searle and Alex Ganose. Sinéad Griffin designed and led the project.