Name

OpticalSpectrum — Class for representing the optical spectrum for a configuraiton with an attached calculator.

Synopsis

Namespace: NanoLanguage
OpticalSpectrum(
configuration,
kpoints,
energies,
broadening,
bands_below_fermi_level,
bands_above_fermi_level
)

Description

Constructructor for the OpticalSpectrum object.

OpticalSpectrum Arguments

configuration

The configuration with an attached calculator.

Type: Bulkconfiguration

Default: None
kpoints

The k-points for which the transitions should be calculated.

Type: MonkhorstPackGrid

Default: MonkhorstPackGrid(nx,ny,nz), where nx, ny, nz is the sampling used for the selfconsistent calculation.
energies

The energies for which the polarizability should be calculated.

Type: List containing elements of the type PhysicalQuantity of energy unit.

Default: numpy.linspace(0, 4, 101)*eV
broadening

The broadening parameter used for the polarizability.

Type: PhysicalQuantity with unit energy.

Default: 0.1 eV
bands_below_fermi_level

The maxinum number of valence band states to include at each k-point.

Type: integer > 0

Default: 4
bands_above_fermi_level

The maximum number of conduction band states to include at each k-point.

Type: integer > 0

Default: 4

OpticalSpectrum Methods

A OpticalSpectrum object provides the following methods:

  • broadening(): Query function for the broadening.

  • energies(): Query function for the energies.

  • evaluateDielectricConstant(spin): Function for evaluating the real part of the dielectric constant using the Kubo-Greenwood formalism.

    spin

    The spin to calculate for.

    Type: Spin.Up | Spin.Down | Spin.Sum

    Default: Spin.Sum
  • evaluateImaginaryDielectricConstant(spin): Function for evaluating the imaginary part of the dielectric constant using the Kubo-Greenwood formalism.

    spin

    The spin to calculate for.

    Type: Spin.Up | Spin.Down | Spin.Sum

    Default: Spin.Sum
  • evaluateImaginaryPolarizability(spin): Function for evaluating the imaginary part of the polarizability using the Kubo-Greenwood formalism.

    spin

    The spin to calculate for.

    Type: Spin.Up | Spin.Down | Spin.Sum

    Default: Spin.Sum
  • evaluatePolarizability(spin): Function for evaluating the real part of the polarizability using the Kubo-Greenwood formalism.

    spin

    The spin to calculate for.

    Type: Spin.Up | Spin.Down | Spin.Sum

    Default: Spin.Sum
  • maxConductionStates(): Query function for the maximum number of conduction states to include.

  • maxValenceStates(): Query function for the maximum nunmber of valence states to include.

  • nlprint(stream): Print a string containing an ASCII table useful for plotting the optical spectrum.

    stream

    The stream the optical spectrum (susceptibility) should be written to.

    Type: A stream that supports strings being written to using 'write'.

    Default: sys.stdout

Usage Examples

Calculate the opticalspectrum of silicon and save it to a file. Print out the Dielectric Tensor.

# Set up silicon crystal
bulk_configuration = BulkConfiguration(
    bravais_lattice=FaceCenteredCubic(5.4306*Angstrom),
    elements=[Silicon, Silicon],
    cartesian_coordinates=[[ 0.     ,  0.     ,  0.     ],
                         [ 1.35765,  1.35765,  1.35765]]*Angstrom
    )

#setup calculator
numerical_accuracy_parameters = NumericalAccuracyParameters(
    k_point_sampling=(6, 6, 6),
    )

# setup DFT calculator using Meta-GGA
calculator = LCAOCalculator(
    basis_set=LDABasis.DoubleZetaDoublePolarized,
    exchange_correlation=MGGA.TB09LDA,
    numerical_accuracy_parameters=numerical_accuracy_parameters,
    )

bulk_configuration.setCalculator(calculator)
bulk_configuration.update()

# Optical spectrum
optical_spectrum = OpticalSpectrum(
    configuration=bulk_configuration,
    kpoints=MonkhorstPackGrid(15,15,15),
    energies=numpy.linspace(0,5,101)*eV,
    broadening=0.1*eV,
    max_valence=4,
    max_conduction=4,
    )

nlsave('si_optical.nc', optical_spectrum)

# Print out the dielectric constant (Experimental value is 11.9)
print 'Dielectric Tensor'
print optical_spectrum.evaluateDielectricConstant(energies=[0.0]*eV)[:,:,0]

si_optical.py

Notes

  • We use the Kubo-Greenwood formula to calculate the susceptibility tensor [38]

    \displaystyle

          \chi_{ij}(\omega) = - \frac{ e^2 \hbar^4}{m^2 \epsilon_0 V \omega^2} \sum_{nm}
          \frac{f(E_m)-f(E_n)}{E_{nm}-\hbar \omega - i \hbar \Gamma}
          \pi_{nm}^i \pi_{mn}^j,

    where \pi_{nm}^i is the i-component of the dipole matrix element between state n and m, V the volume, \Gamma the broadening, and f the Fermi function.

  • The response coefficients, the dielectric constant \epsilon_r, polarizability \alpha, and optical conductivity \sigma, are related to the susceptibility as

    \displaystyle

          \epsilon_r(\omega)  =  (1 + \chi(\omega) ),

    \displaystyle

          \alpha(\omega)   =  V \epsilon_0 \chi(\omega),

    \displaystyle

          \sigma(\omega)  =  - i \omega \epsilon_0 \chi(\omega).

    The derivation of the last relation can be found in Ref. [36].

  • The refractive index, n, is related to the complex dielectric constant through

    \displaystyle

          n + i \kappa = \sqrt{\epsilon_r},

    here \kappa is the extinction coefficient.

    In terms of the real ( \epsilon_1) and complex parts ( \epsilon_2) of the dielectric constant

    \displaystyle

          n  =  \sqrt{\frac{\sqrt{\epsilon_1^2+\epsilon_2^2}+\epsilon_1}{2}},

    \displaystyle

          \kappa  =  \sqrt{ \frac{ \sqrt{ \epsilon_1^2+ \epsilon_2^2}-
          \epsilon_1}{2}}.

  • The optical absorption coefficient is related to the extinction coefficient through [37]

    \displaystyle

          \alpha_a = 2 \frac{\omega}{c} \kappa.

    The reflectivity is given by [35]

    \displaystyle

          r = \frac{(1-n)^2 + \kappa^2}{(1+n)^2 + \kappa^2}.

Thus from the dielectric constant a number of other optical properties are easily obtained.

For further background information on optical spectra see the section called “Optical response functions”.