3D Fermi surface#

PyProcar’s 3D Fermi surface utility is able to generate Fermi surface plots projected over spin, atoms and orbitals or a combination of one or many of each. This utility is also capable of projecting external properties that are provided on a mesh grid in momentum space. This feature is useful when one wants to project properties that are not provided in PROCAR file such as Fermi velocity, electron-phonon coupling and electron effective mass. We divide this section into three sub sections, plain Fermi surface, projection of properties from PROCAR and projection of properties from external file.

Note

When plotting 3D Fermi surfaces, it is important to use a Monkhorst-Pack k-grid while setting ISYM=-1 in the INCAR file (turn off symmetry).

3D surfaces#

This section focuses on how the 3d image is created, if you are only interested in using this functionality, you can skip this part and move to the examples section. A surface is created by adding a collection of small polygons. By increasing the number of polygons, one can increase the smoothness of the surface. These polygons are defined by a collection of points on the surface also known as vertices and a recipe for their connections to create the polygons, which is defined by a list of points. This list is called faces. For example the following defines a cube:

vertices
 1   1.000000 -1.000000 -1.000000
 2   1.000000 -1.000000  1.000000
 3  -1.000000 -1.000000  1.000000
 4  -1.000000 -1.000000 -1.000000
 5   1.000000  1.000000 -0.999999
 6   0.999999  1.000000  1.000001
 7  -1.000000  1.000000  1.000000
 8  -1.000000  1.000000 -1.000000
faces
2 3 4
8 7 6
5 6 2
6 7 3
3 7 8
1 4 8
1 2 4
5 8 6
1 5 2
2 6 3
4 3 8
5 1 8

for example the first face defined by a triangle instructs to connect points 2,3 and 4. One can also assign colors to each face. pyprocar uses this feature to assign the projection colors to the surfaces. Another important aspect to this in definning the surface is the normals to the faces, however a tutorial about fermi surface is not a good place to get into details about surfaces.

To generate the fermi surface PyProcar uses different levels of generality to surfaces. The level is the definition of a surface which is handled by the class surface in pyprocar.core.Surface which only requires faces and vertices. The next level is an isosurface which is handeled by pyprocar.core.Isosurface, this class represents the equation \(f(x,y,z)=V\), where \(V\) is the isovalue and \(f(x,y,z)\) is the function. In a fermi surface \(f(x,y,z)\) will be the energy of each band at different points of the k space and \(V\) will be the fermi energy. To use this class one needs to provide the function in a 3 dimentional matrix and the isovalue. The next level is the fermi surface which is defined by an isosurfcace which is handled by the class pyprocar.fermisurface3d.FermiSurfcae3D. This function requires a list of kpoints and the eigen-values of the energy for a specific band. However one does not have to be concerned about the specifics of different layers and just use the pyprocar.fermi3D function to generate the fermi surface. This work would not have been possible without the amazing packages, pyvista_doc and trimesh_doc. If you use pyprocar’s 3D fermi surface in your publication please cite trimesh and pyvista as well with the following citation information.

trimesh_cite:

@software{trimesh,
      author = {{Dawson-Haggerty et al.}},
      title = {trimesh},
      url = {https://trimsh.org/},
      version = {3.2.0},
      date = {2019-12-8},
}

PyVista:

@article{sullivan2019pyvista,
doi = {10.21105/joss.01450},
url = {https://doi.org/10.21105/joss.01450},
year = {2019},
month = {may},
publisher = {The Open Journal},
volume = {4},
number = {37},
pages = {1450},
author = {C. Bane Sullivan and Alexander Kaszynski},
title = {{PyVista}: 3D plotting and mesh analysis through a streamlined interface for the Visualization Toolkit ({VTK})},
journal = {Journal of Open Source Software}
}

Keyboard shortcuts#

When plotting with the interactive rendering windows in VTK, several keyboard shortcuts are available:

Key

Action

Linux/Windows

Mac

q

Close the rendering window

f

Focus and zoom in on a point

v

Isometric camera view

w

Switch all datasets to a wireframe representation

r

Reset the camera to view all datasets

s

Switch all datasets to a surface representation

shift+click or middle-click

shift+click

Pan the rendering scene

left-click

cmd+click

Rotate the rendering scene in 3D

ctrl+click

Rotate the rendering scene in 2D (view-plane)

mouse-wheel or right-click

ctl+click

Continuously zoom the rendering scene

shift+s

Save a screenhsot (only on BackgroundPlotter)

shift+c

Enable interactive cell selection/picking

up/down

Zoom in and out

+/-

Increase/decrease the point size and line widths