calculateVelocity

calculateVelocity(configuration, kpoint=None, spin=None, band_indices=None)

Calculates the Bloch-state velocity \(\frac{1}{\hbar} \frac{dE}{dk}\) using first order perturbation theory.

Parameters:
  • configuration (BulkConfiguration) – The configuration for which to calculate the velocity.

  • kpoint (tuple of floats) – The kpoint as three floats representing fractional reciprocal space coordinates.
    Default: The Gamma point (0.0, 0.0, 0.0)

  • spin (Spin.Up | Spin.Down | Spin.All) – The spin component for which to perform the calculation.
    Default: Spin.All

  • band_indices (list of non-negative int) – Indices of the bands for which to calculate the velocity.
    Default: All bands (range(number_of_bands))

Returns:

The velocities for each band.

Return type:

numpy.array

Usage Examples

Evaluate the valence band velocity for graphene at the Dirac point:

# -------------------------------------------------------------
# Bulk configuration
# -------------------------------------------------------------

# Set up configuration
bulk_configuration = BulkConfiguration(
    bravais_lattice=Hexagonal(2.4612*Angstrom, 6.709*Angstrom),
    elements=[Carbon, Carbon],
    fractional_coordinates=[[ 0.333333333333,  0.166666666667,  0.5 ],
                            [ 0.666666666667,  0.833333333333,  0.5 ]],
    )

# -------------------------------------------------------------
# Calculator
# -------------------------------------------------------------
calculator = LCAOCalculator()

bulk_configuration.setCalculator(calculator)
nlprint(bulk_configuration)
bulk_configuration.update()

# Fractional k-point, slighly displaced away from the Dirac point.
k = [1./3+0.001, 1./3+0.001, 0  ]

# Calculate the velocity of the band with band-index 3 (valence band) 
velocity = calculateVelocity(bulk_configuration, kpoint=k, spin=Spin.Up, band_indices=[3])
# Take the velocity component along the X cartesian direction.
velocity = velocity[0][0][0]

# Print the result.
print('Fermi velocity of graphene:')
print('v = %.2e m/s' %abs(velocity.inUnitsOf(Meter/Second)))

graphene_velocity.py

Running the script you will get a Fermi velocity of \(v_F=8.4\cdot 10^{5}\) m/s, which is close to literature values, genereally reported to be \(\approx 10^6\) m/s.

Notes

  • The band velocity, usually defined as \(v_n(\mathbf{k}) = \nabla_\mathbf{k}E_n(\mathbf{k})\) is evaluated using first-order perturbation theory. The velocity in Cartesian direction \(\alpha\) of band \(n\) at wavevector \(\mathbf{k}\) is:

    \[v_n^\alpha(\mathbf{k}) = \langle \psi_n(\mathbf{k})| \partial_{k_\alpha} H(\mathbf{k}) - \epsilon_n(\mathbf{k}) \partial_{k_\alpha} S(\mathbf{k})| \psi_n(\mathbf{k}) \rangle,\]

    where \(|\psi_n(\mathbf{k}\rangle\) is the Bloch eigenstate in band \(n\) with energy \(\epsilon_n(\mathbf{k})\). \(\partial_{k_\alpha} H(\mathbf{k})\) and \(\partial_{k_\alpha} S(\mathbf{k})\) are the derivative of the Fourier transformed Hamiltonian and overlap matrices with respect to Cartesian component \(k_\alpha\).