pynitride.physics.material module

class pynitride.physics.material.AlGaN(spin_splitting=0, polarity='metal')

Bases: Wurtzite

Superclass for Wurtzite materials.

Parameters:

spin_splitting – an artificial splitting energy between spin-up and spin-down. If a non-zero splitting energy is provided, the small terms in the k.p Hamiltonian which couple spin-up and spin-down are zeroed so that the spin_splitting will be exactly as specified. This is convenient for scattering problems whenever spin is not important, because thereafter, one can simply ignore one half of the bands.

class pynitride.physics.material.AlInGaN(spin_splitting=0)

Bases: Wurtzite

Superclass for Wurtzite materials.

Parameters:

spin_splitting – an artificial splitting energy between spin-up and spin-down. If a non-zero splitting energy is provided, the small terms in the k.p Hamiltonian which couple spin-up and spin-down are zeroed so that the spin_splitting will be exactly as specified. This is convenient for scattering problems whenever spin is not important, because thereafter, one can simply ignore one half of the bands.

class pynitride.physics.material.Insulator(name)

Bases: MaterialSystem

Represents a parameterized material.

strain_to(m, straincond={})
class pynitride.physics.material.MaterialSystem

Bases: object

Represents a parameterized material.

append_dopants(dopants)
bulk(**kwargs)
get(mesh, item)
polarization(mesh, key)

Populates the mesh with the polarization P and potentially other related functions

Parameters:
  • mesh – the mesh

  • key – the key being sought

surface_barrier(m)

Returns the surface barrier height based on the top boundary of the mesh.

Parameters:

m – the mesh, should be the global mesh so there is a top boundary

update(destmesh, reason)
vergard(lookup)

Interpolates a parameter for the material system.

The material using this function must have a vergard basis defined, eg

self.vergard={ 'x': 'AlN', 'y':'InN', None: 'GaN'}

where ‘x’, ‘y’ are arbitrarily named mole-fraction variables that are defined on the mesh and the dict values are strings indicating the basis material for each mole-fraction variable. The None key indicates the basis material for the x=y=0 limit. Each of the above materials must have the relevant lookup defined in the parameter database.

Parameters:

lookup – the string with which to query the parameter database for each material basis

class pynitride.physics.material.Wurtzite(spin_splitting=0, orientation=1)

Bases: MaterialSystem

Superclass for Wurtzite materials.

Parameters:

spin_splitting – an artificial splitting energy between spin-up and spin-down. If a non-zero splitting energy is provided, the small terms in the k.p Hamiltonian which couple spin-up and spin-down are zeroed so that the spin_splitting will be exactly as specified. This is convenient for scattering problems whenever spin is not important, because thereafter, one can simply ignore one half of the bands.

bulk_lattice_condition(m)

The natural lattice constant of the bottommost point

ec_Cmats(m, q)

Elastic continuum matrices.

\[\begin{split}\begin{equation} C_0=\begin{pmatrix} C_{11} & \cdot & \cdot \\ \cdot & (C_{11}-C_{12})/2 & \cdot \\ \cdot & \cdot & C_{44} \end{pmatrix} \end{equation}\end{split}\]
\[\begin{split}\begin{equation} C_l=\begin{pmatrix} \cdot & \cdot & C_{13} \\ \cdot & \cdot & \cdot \\ C_{44} & \cdot & \cdot \end{pmatrix} \end{equation}\end{split}\]
\[\begin{split}\begin{equation} C_r=\begin{pmatrix} \cdot & \cdot & C_{44} \\ \cdot & \cdot & \cdot \\ C_{13} & \cdot & \cdot \end{pmatrix} \end{equation}\end{split}\]
\[\begin{split}\begin{equation} C_2=\begin{pmatrix} C_{44} & \cdot & \cdot \\ \cdot & C_{44} & \cdot \\ \cdot & \cdot & C_{33} \end{pmatrix} \end{equation}\end{split}\]
Parameters:
  • m – the mesh

  • q – the in-plane wavevector

Returns:

a tuple of (C0,Cl,Cr,C2), where each is an (3 mesh.Nn) x (3 mesh.Nn) complex matrix

ec_CmatsXZ(m, q)

Like Wurtzite.ec_Cmats() but only the 2x2 XZ matrices.

ec_CmatsY(m, q)

Like Wurtzite.ec_Cmats() but only the 1x1 Y (center) matrices.

kp_Cmats(m, kx, ky, carrier, kxl=None, kyl=None)

Returns the kp matrices needed by MultibandKP

The matrices are in the bases used by Birner. The naming convention for the C matrices is given in Finite Element Method.

If kxl, kyl are not specified, then kx, ky is used for both the left ket wavevector and the right ket wavevector. This is almost always the correct thing to do. There are some times when one cares about the matrix element of the kp Hamiltonian between two different wavevectors (such as in surface roughness scattering). In that case, the left ket wavevector can be specified separately via kxl, kyl. The resulting matrices may, of course, be non-Hermitian.

If the artificial spin-splitting (see Wurtzite) is zero, the matrices are

\[C_{0}=C_{0L}+C_{0D}+C_{0S}\]
\[\begin{split}\begin{equation} C_{l}= I_2 \otimes \begin{pmatrix} \cdot & \cdot & k_x^lN_2^+ \\ \cdot & \cdot & k_y^lN_2^+ \\ k_x^lN_2^- & k_y^lN_2^- & \cdot \end{pmatrix} \end{equation}\end{split}\]
\[\begin{split}\begin{equation} C_{r}= I_2 \otimes \begin{pmatrix} \cdot & \cdot & N_2^-k_x^r \\ \cdot & \cdot & N_2^-k_y^r \\ N_2^+k_x^r & N_2^+k_y^r & \cdot \end{pmatrix} \end{equation}\end{split}\]
\[\begin{split}\begin{equation} C_{2}= I_2 \otimes \begin{pmatrix} M_2^u & \cdot & \cdot \\ \cdot & M_2^u & \cdot \\ \cdot & \cdot & L_2^u \\ \end{pmatrix} \end{equation}\end{split}\]

where \(C_{0S}\) is the strain matrix from Wurtzite.kp_strain_mat() and

\[\begin{split}\begin{equation} C_{0L}= I_2 \otimes \begin{pmatrix} k_x^lL_1^uk_x^r+k_y^lM_1^uk_y^r & k_x^lN_1^+k_y^r+k_y^lN_1^-k_x^r& \cdot\\ k_y^lN_1^+k_x^r+k_x^lN_1^-k_y^r & k_x^lM_1^uk_x^r+k_y^lL_1^uk_y^r& \cdot\\ \cdot & \cdot & k_x^lM_3^uk_x^r+k_y^lM_3^uk_y^r \end{pmatrix} \end{equation}\end{split}\]
\[\begin{split}\begin{equation} C_{0D}=\begin{pmatrix} \Delta_1 & - i\Delta_2 & \cdot & \cdot & \cdot & \Delta_3 \\ i\Delta_2 & \Delta_1 & \cdot & \cdot & \cdot & - i\Delta_3 \\ \cdot & \cdot & \cdot & -\Delta_3 & i\Delta_3 & \cdot \\ \cdot & \cdot & -\Delta_3 & \Delta_1 & i\Delta_2 & \cdot \\ \cdot & \cdot & - i\Delta_3 & - i\Delta_2 & \Delta_1 & \cdot \\ \Delta_3 & i\Delta_3 & \cdot & \cdot & \cdot & \cdot \end{pmatrix} \end{equation}\end{split}\]

If the artificial spin-splitting is provided, then the off-diagonal 3x3 blocks of C_0 are zeroed out, and an additional matrix

\[\begin{split}\begin{equation} SS=\begin{pmatrix} ss/2 & \cdot & \cdot & \cdot & \cdot & \cdot \\ \cdot & ss/2 & \cdot & \cdot & \cdot & \cdot \\ \cdot & \cdot & ss/2 & \cdot & \cdot & \cdot \\ \cdot & \cdot & \cdot & -ss/2 & \cdot & \cdot \\ \cdot & \cdot & \cdot & \cdot & -ss/2 & \cdot \\ \cdot & \cdot & \cdot & \cdot & \cdot & -ss/2 \end{pmatrix} \end{equation}\end{split}\]

is added to \(C_0\)

Parameters:
  • m – the mesh

  • kx – the wavevector

  • ky – the wavevector

  • carrier – ‘electron’ or ‘hole’

  • kxl – the wavevector of the left ket

  • kyl – the wavevector of the left ket

Returns:

a tuple of (C0,Cl,Cr,C2), where each is an (n mesh.Nn) x (n mesh.Nn) complex matrix, n=2,6 for electrons,holes

kp_dim = {'electron': 2, 'hole': 6}

Dimension of the kp problem, 6 for holes, 2 for electrons.

kp_strain_mat(m, carrier, **strains)

Returns the strain deformation matrix by the means noted on pg 2496 of CC96.

See examples/wzstrainterms.ipynb to show that this is consistent.

For conduction band

\[\begin{split}\begin{pmatrix} a_{c2} e_{xx} + a_{c2} e_{yy} + a_{c1} e_{zz} & 0 \\ 0 & a_{c2} e_{xx} + a_{c2} e_{yy} + a_{c1} e_{zz} \\ \end{pmatrix}\end{split}\]
\[\begin{gather} a_{c1}=a_1+D_1,\quad a_{c2}=a_2+D_2 \end{gather}\]

For valence band, the 6x6 strain matrix is a block diagonal of two 3x3 blocks

\[\begin{split}\begin{pmatrix} l_1 e_{xx} +m_1 e_{yy} +m_2 e_{zz} & n_1 e_{xy} & n_2 e_{xz}\\ n_1 e_{xy} & m_1 e_{xx} +l_1 e_{yy} +m_2 e_{zz} & n_2 e_{yz}\\ n_2 e_{xz} & n_2 e_{yz} & m_3 e_{xx} +m_3 e_{yy} +l_2 e_{zz}\\ \end{pmatrix}\end{split}\]
\[\begin{split}\begin{gather} l_1=D_2+D_4+D_5, \quad l_2=D_1\\ m_1=D_2+D_4-D_5, \quad m_2=D_1+D_3 \quad m_3=D_2\\ n_1=2 D_5 \quad n_2=\sqrt{2} D_6 \end{gather}\end{split}\]
Parameters:
  • m – the mesh

  • strains – optional dictionary of strain fuctions (‘exx’, ‘exy’ etc). If not provided, these will be taken from the mesh

Returns:

a (n mesh.Nn) x (n mesh.Nn) complex matrix, n=2,6 for electrons,holes

polarization(m, key)

Populates the mesh with the polarization P and potentially other related functions

Parameters:
  • mesh – the mesh

  • key – the key being sought

strain_to(m, straincond={})

Strains the material to the specified condition.

The straincond dict can contain a key ‘a’, in which case this will be the in-plane lattice constant. Or the straincond dict can contain separate keys ax, ay for two lattice constants.

In addition to the above choice, a zcond entry can indicate how the stress/strain in the z-direction should be handled: ‘free’ is the typical pseudomorphic condition (for wurtzite, \(e_{zz}=-C_{13}/C_{33}(e_{xx}+e_{yy})\)).

This function populates all the eij variables onto the mesh, setting zero for the shear components.

Parameters:
  • m – the mesh

  • straincond – see above