optics{}

Specifications for the optics keyword, e.g. for the calculation of the optical absorption.

There is a nice optics tutorial tutorial on the optical absorption feature of nextnano++.

optics{

 debuglevel = 2

 region{
  name = "optical_active"

  # Input values

  # (sigma+) circularly polarized light around the x axis
  polarization{ name = "y+iz"
                re = [0,1,0]
                im = [0,0, 1] }

  refractive_index     = 10.0  # []       (optional)
  normalization_volume = 100.0 # [nm^dim] (optional)


  # Setting for k|| and eigenstate summation
  make_spin_degenerate            = no
  spin_align                      = yes

  interband                       = yes
  intraband                       = yes

  energy_threshold                = 1e-6    # [eV]
  transition_threshold            = 1e-6    # [eV]
  occupation_threshold            = 0       # [eV]

  k_integration{
     relative_size      = 0.1               #

     num_points         = 4

     # Specify either num_subpoints or num_totalsubpoints.
     num_subpoints      =  16
     num_totalsubpoints = 128

     symmetry           = 1
  }


  # Treatment of occupation
  occupation_ignore               = no
  occupation_interpolate_invfermi = yes
  occupation_const_fermilevel     = no


  # Output settings
  output_transitions = yes
  output_components  = yes

  energy_min                   = 1.4      # [eV]
  energy_max                   = 1.7      # [eV]
  energy_resolution            = 0.001    # [eV]
  energy_broadening_lorentzian = 0.005    # [eV]
# energy_broadening_gaussian   = 0.005    # [eV]

  dipole_approximation = no       # preliminary

  }
 }

debuglevel

value

integer value >= -1 and <= 4.

default

0

The larger this value, the more verbose the diagnostic output will be.

region{}

name
value

“string”

example

optical_active

name of the quantum region for which optics is calculated

polarization{}
name

“string”

re

real part

im

imaginary part

Define polarizations of incoming light for which optical absorption should be calculated.

Examples:

# linearly polarized light in x direction.
# name is used for the file names of the output.
polarization{ name = "x"        re = [1,0,0]                 }

# linearly polarized light in y direction
polarization{ name = "y"        re = [0,1,0]                 }

# linearly polarized light in z direction
polarization{ name = "z"        re = [0,0,1]                 }


# TM mode.
# This naming might be useful when analyzing heterostructure
# grown in x direction.
polarization{ name = "TM"        re = [1,0,0]                }

# TE mode
polarization{ name = "TEy"       re = [0,1,0]                }

# TE mode
polarization{ name = "TEz"       re = [0,0,1]                }


# (sigma+) circularly polarized light around the x axis
polarization{ name = "y+iz"     re = [0,1,0]   im = [0,0, 1] }

# (sigma-) circularly polarized light around the x axis
polarization{ name = "y-iz"     re = [0,1,0]   im = [0,0,-1] }


# an example for an arbitrary polarization direction
polarization{ name = "x1y1z2"   re = [1,1,2]                 }
refractive_index
optional

optional

value

double

unit

dimensionless

example

10.0

Specify an alternative refractive index for the substrate material.

normalization_volume
optional

optional

value

double

unit

[nm^dim]

example

100.0

Specify an alternative normalization volume for the optical spectra. The default is the volume of the simulated device.

Settings for \(k_\parallel\) and eigenstate summation

make_spin_degenerate
value

yes or no

optional

optional

default

no

Effect of the flag is throwing away every second state from the respective quantum solver, i.e. the states are made spin degenerate and are counted twice. Use only when all states are pairwise identical.

spin_align
value

yes or no

default

?

yes: aligns spin-degenerate states in a virtual magnetic field prior to the optics calculations.

no: Spin-degenerate states enter the optics calculation in a random superposition.

interband
value

yes or no

default

yes

Compute optical valence band to conduction band transitions.

intraband
value

yes or no

default

yes

Compute optical valence band to valence band and conduction band to conduction band transitions.

energy_threshold
value

double

default

1e-6 # [eV]

example

1e-8 # [eV]

Only transitions between states with at least this energy difference are regarded when computing optical spectra. 1e-8 [eV] should be reasonable in most cases.

transition_threshold
value

double

default

1e-6 # [eV]

example

1e-4 # [eV]

Only transitions between states with at least this optical intensity are regarded when computing optical spectra. A value of 0 can be safely used as a default. Higher values can reduce computational time but may neglect weak optical transitions.

occupation_threshold
value

double; 0 <= 1

default

0 # [eV]

example

1e-8 # [eV]

Only transitions between states with at least this occupation are regarded when computing optical spectra. A value of 0 can be safely used as a default. Higher values can reduce computational time but may neglect weakly occupied states.

k_integration{}
relative_size
value

double, 0.001 <= relative_size <= 1.0

default

0.1

example

0.3

size of \(k_\parallel\) space integration

num_points
value

integer

units

?

default

4

example

8

number of points in \(k_\parallel\) space where transition intensities are computed

Note

Specify either num_subpoints or num_totalsubpoints.

num_subpoints
default

?

example

16

example

256

number of interpolation points for \(k_\parallel\) space integration (relative to num_points)

num_totalsubpoints
default

128

example

128

total number of interpolation points for \(k_\parallel\) space integration (relative to num_points)

symmetry
value

integer; 1, 2, 3 or 4

default

1

example

4

rotational \(k_\parallel\) space symmetry

force_k0_subspace
value

yes or no

default

no

If set to yes, \(k_\parallel\) integration in quantum{} is modified in that only states for point \(k=0\) are computed exactly, whereas all other k points are computed in the subspace of the \(k=0\) wavefunctions. As a result of this approximation, computational speed is much improved (you may even be able to also enlarge the number of eigenvalues). In case you are planning to use this approximation for final results, please make sure to check whether the resulting loss of accuracy in optical spectra is acceptable.

Treatment of occupation

occupation_ignore
value

yes or no

default

no

Ignore the occupation of states when computing optical spectra: Valence bands and conduction bands are considered to be fully occupied and fully empty, respectively.

occupation_interpolate_invfermi
value

yes or no

default

yes

less important. This option may increase accuracy of numerical \(k_\parallel\) space integration.

occupation_const_fermilevel
value

yes or no

default

no

In semi-classical current calculations, the quasi-Fermi level may depend on position. Optical spectra on the other hand are computed in a completely quantum mechanical way. To resolve this inconsistency, the Fermi level is averaged. Note that both options violate the physical assumption in some way and are only a valid approximation for almost constant Fermi levels. no: In this case, the inconsistency is resolved by computing a position dependent occupation number.

Output settings

output_transitions
value

yes or no

default

no

Output transition intensities and energies for each pair of states.

output_components
value

yes or no

default

no

Output the spinor components for each state at each \(k_\parallel\) point (only relevant in multi-band \(\mathbf{k} \cdot \mathbf{p}\) calculations).

energy_min
value

double

default

? # [eV]

example

1.4 # [eV]

lower energy bound for optical spectra

energy_max
value

double

default

? # [eV]

example

1.7 # [eV]

upper energy bound for optical spectra

energy_resolution
value

double

default

0.001 # [eV]

spectral resolution

Energy broadening (Lorentzian or Gaussian)

energy_broadening_lorentzian
value

real number >= 0.000001

unit

[eV]

default

0.0 (i.e. switched off if undefined)

energy_broadening_gaussian
value

real number >= 0.000001

unit

[eV]

default

0.0 (i.e. switched off if undefined)

Set respective broadenings to value greater than 0.0 to get corresponding broadening for spectra. (In 1D and 2D, both Lorentzian and Gaussian can be used simultaneously.)

dipole_approximation
value

yes or no

default

no

preliminary

Specify whether to calculate the matrix elements corresponding to optical transitions with dipole approximation. Note: \(<\psi_1|p e|\psi_2>\) elements are calculated by default, with dipole approximation: \(p’ e <\psi_1|\psi_2>\) (without scaling: \(e\) is polarization direction, and \(p\) is momentum operator, \(p'\) is the integral for the Bloch central functions)

For more details, see [Eissfeller2008].

opticaldevice{}

opticaldevice{
  name            = "optical_active"
  line_broadening = 1
  line_width      = 1.0   # [eV]
  photon_energy   = 1.0   # [eV]
}

name

value

“string”

example

optical_active

name of quantum region for which optical generation should be calculated

line_broadening

value

integer

example

1

broadening type: for Lorentzian it is 1

line_width

value

double

example

1.0

for Lorentzian broadening the linewidth in [eV]

photon_energy

value

double

example

1.0

the mid energy of the radiation in [eV]