Skip to main content

Fermi surface plotting tool from DFT output

Project description

IFermi logo

📖 Official Documentation 📖

🙋 Support Forum 🙋

📝 JOSS Paper 📝

IFermi is a Python (3.9+) 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.
  • Interactive visualisation of Fermi surfaces and slices, with support for mayavi, plotly and matplotlib.
  • 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.

Example Fermi surfaces

Quick start

The online documentation provides a full description of the available command-line options.

Analysis

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)

Visualisation

Three-dimensional Fermi surfaces can be visualized from a vasprun.xml file using:

ifermi plot

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

Python library

The 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

Citing IFermi

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

Installation

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.9+ and relies on a number of open-source python packages, specifically:

Running tests

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:

pytest

Need Help?

Ask questions about the IFermi Python API and command-line tools on the IFermi support forum. If you've found an issue with IFermi, please submit a bug report here.

What’s new?

Track changes to IFermi through the changelog.

Contributing

We greatly appreciate any contributions in the form of a pull request. Additional information on contributing to IFermi can be found here. We maintain a list of all contributors here.

License

IFermi is made available under the MIT License (see LICENSE file).

Acknowledgements

Developed by Amy Searle and Alex Ganose. Sinéad Griffin designed and led the project.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ifermi-0.3.6.tar.gz (50.7 kB view details)

Uploaded Source

Built Distribution

ifermi-0.3.6-py3-none-any.whl (50.0 kB view details)

Uploaded Python 3

File details

Details for the file ifermi-0.3.6.tar.gz.

File metadata

  • Download URL: ifermi-0.3.6.tar.gz
  • Upload date:
  • Size: 50.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.9.20

File hashes

Hashes for ifermi-0.3.6.tar.gz
Algorithm Hash digest
SHA256 e5f2eeee19c1208d863779d86e324adb5d254c0dfa24c432a1b0d6a944297697
MD5 fc12e42cf3baa57baeee727a7665b692
BLAKE2b-256 b9582cf037c1c62ab72e6e77992bce95b929d363ea487faf73d8e6bd98ca2833

See more details on using hashes here.

File details

Details for the file ifermi-0.3.6-py3-none-any.whl.

File metadata

  • Download URL: ifermi-0.3.6-py3-none-any.whl
  • Upload date:
  • Size: 50.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/5.1.1 CPython/3.9.20

File hashes

Hashes for ifermi-0.3.6-py3-none-any.whl
Algorithm Hash digest
SHA256 b363e6493472f16634a79cc529661d41c2903d8541357412774b760bb2830e7b
MD5 17c2c1dd88ebd7577fce3ae44765b334
BLAKE2b-256 5f6a0361338a175c36a07bf21e7c854e67aa04ea4f2f0432d5bd4e2f179399b3

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page