Spin-Texture Calculation

by Benedikt Maurer for exciting neon

(Jupyter notebook by Mara Voiculescu & Martin Kuban)


Purpose: In this tutorial you will learn how to calculate the spin texture with exciting for GaAs.



0. Before Starting

Read the following paragraphs before starting with the rest of this tutorial!

Before running any Jupyter tutorials, please refer to the 00_before_starting.md document on how to correctly set up the environment. This only needs to be done once. After which, the venv can be (re)activated from exciting's root directory:

source tools/excitingjupyter/venv/excitingvenv/bin/activate

As a first step, you may create a running directory for the notebook.

In [1]:
%%bash
mkdir -p run_tutorial_spin_texture


1. Theoretical Background

An interesting property of the electronic structure with spin-orbit coupling (SOC) is the so-called spin texture. It can be used, e.g., to differentiate between the Rashba and the Dresselhaus effect (see Kepenekian2015).

The spin texture $\boldsymbol s(n,\boldsymbol k)$ is defined as the expectation value of a vector of Pauli matrices on a two dimensional k-grid. At k for the state n it is defined as:

\begin{equation} \tag{1} \boldsymbol s(n,\boldsymbol k) = \langle n,\boldsymbol k|\boldsymbol \sigma | n,\boldsymbol k \rangle \end{equation}


2. Spin Texture of GaAs

To calculate the spin texture for GaAs, create the file input.xml and save the following lines into it:

<input>
   <title>GaAs spin texture</title>

   <structure speciespath="$EXCITINGROOT/species">
      <crystal scale="10.683" >
         <basevect>  0.0     0.5     0.5 </basevect>
         <basevect>  0.5     0.0     0.5 </basevect>
         <basevect>  0.5     0.5     0.0 </basevect>
      </crystal>

      <species speciesfile='Ga.xml' rmt='2.0'>
         <atom coord="0.00 0.00 0.00"/>
      </species>

      <species speciesfile='As.xml' rmt='2.0'>
         <atom coord="0.25 0.25 0.25"/>
      </species>
   </structure>

   <groundstate
      do="fromscratch"
      xctype="GGA_PBE"
      rgkmax="6"
      gmaxvr="15"
      ngridk="4 4 4"
      swidth="1d-6"
      epsengy="1d-6"
      maxscl="40"
      nempty="15">

      <spin spinorb="true"/>
   </groundstate>

   <properties>
      <spintext bands="23 30">
         <plot2d>
            <parallelogram grid = "12 12">
               <origin coord = "-0.042506  -0.042506  -0.085013"/>
               <point  coord = "-0.042506   0.050235   0.007728"/>
               <point  coord = " 0.050235  -0.042506   0.007728"/>
            </parallelogram>
         </plot2d>
      </spintext>
   </properties>
</input>
In [2]:
from excitingjupyter.utilities import get_input_xml_from_notebook   

# Extract input file content from this notebook:
input_str = get_input_xml_from_notebook("03_tutorial_spin_texture_calculation", "SPIN_TEXTURE")

# Write out the input as an XML file:
with open('./run_tutorial_spin_texture/input.xml', "w") as fid:
    fid.write(input_str)

Then, set up the correct species path and run exciting to perform the groundstate calculation:

In [3]:
%%bash
cd run_tutorial_spin_texture
python3 -m excitingscripts.setup.excitingroot
time $EXCITINGROOT/bin/exciting_smp input.xml
cd ..
 ### Using specified input file: input.xml
 ### Using specified input file: input.xml
   Elapsed time = 1m19s

Note that spin-orbit coupling (SOC) is enabled spinorb="true". Spin texture calculations are only allowed for ground states with enabled SOC.

Note also the spintext element in the properties element:

  • The bands attribute defines the band range that is considered. In this case we are interested in the bands around the band gap. You can extract the band numbers from the EIGVAL.OUT.
  • The parallelogram element defines the k-grid for the spin texture calculation. The k-points are homogeneously distributed on a parallelogram in the reciprocal space. In the example of this tutorial, we consider a square with sidelength 0.1 [a.u.] (a.u. = Bohr-1) in the (kx, ky) plane. The centre of this square is the Γ point and the borders are parallel to the Cartesian kx and ky axes.
  • grid defines the number of k-points per direction.
  • The parallelogram is spanned between origin and the points defined by point.

Be aware of that coord is given in reciprocal coordinates.

When the calculation is done, you can plot the spin texture for the first conduction band using the script excitingscripts.plot.spintext (for a detailed description of the script arguments see The python script "plot.spintext") as follows:

In [86]:
%%bash
cd run_tutorial_spin_texture
python3 -m excitingscripts.plot.spintext -b 29 -c energy 
cd ..
  • -b defines the band that is considered for the plot which is in this case the first conduction band. You can extract the numbers of the states from EIGVAL.OUT.
  • -c specifies if the energy or the z component of the spin orientation is considered for the contour plot. The choices are "energy" or "spin_z".

Note that the script is designed for rectangular spin textures!

The resulting PNG file PLOT-spintext.png can be should look like the following:

In the plot, k1 and k2 correspond to the k-vectors (k1,0,0)T and (0,k2,0)T, respectively. The color map represents the energy of the chosen state. Note that the unit of k1 and k2 are given in atomic units (Bohr-1).


Literature

  • Kepenekian2015: The form of the spin texture and more information on Rashba and Dresselhaus effects is given in: M. Kepenekian, R. Robles, C. Katan, D. Sapori, L. Pedesseau, & J. Even. Rashba and Dresselhaus Effects in Hybrid Organic-Inorganic Perovskites: From Basics to Devices. ACS Nano, 9(12), 11557–11567 (2015). DOI