qtcad.device.multivalley_EMT module

Multi-valley effective-mass theory (EMT) solver.

class qtcad.device.multivalley_EMT.Solver(dvc: Device, solver_params: SolverParams | None = None)

Bases: Solver

Properties required to calculate valley-coupled energies and eigenstates using multi-valley effective-mass theory (MVEMT).

Attributes:
  • d (device object) – The device to simulate.

  • val (2D arrays) – Location of each valley in the Brillouin zone.

  • bloch (2D array) – Planewave description of the Bloch amplitudes situated at each valley of val. The first three columns identify the planewave component and the next two columns give the real and imaginary parts of the associated coefficient in the planewave expansion.

  • bloch_files (list) – List of pathlib Path objects or strings giving the path of files storing the planewave decomposition of the Bloch amplitudes of each valley (one file per valley).

  • m_inv_tensors (3D array) – Contains the inverse effective mass tensors corresponding to the valley states determined by self.val and self.bloch. By default, the effective mass tensors for the \(\pm z\) valleys of silicon are used.

  • num_states (int) – Number of states to solve for, starting from the lowest eigenvalue.

  • tol (float) – Solver tolerance (stopping criterion). Relative accuracy for eigenvalues.

  • maxiter (int) – Maximum number of iterations.

__init__(dvc: Device, solver_params: SolverParams | None = None)

Constructor of the multi-valley effective-mass theory (MVEMT) solver.

Parameters:
  • dvc (device object) – The device to simulate.

  • solver_params (SolverParams obj or None, optional) – The parameters of the solver.

solve()

Solve Schrödinger’s equation including intervalley matrix elements of the confinement potential (included under the multi-valley effective mass theory [MVEMT]).

class qtcad.device.multivalley_EMT.SolverParams(inp_dict: dict | None = None)

Bases: SolverParams

Parameters to pass to a multivalley effective-mass theory solver.

Attributes:
  • tol (float) – Tolerance to use in a calculation. Default: 1e-6. If method is “fast”, this is the absolute tolerance in eV. If method is “robust”, this is relative tolerance.

  • maxiter (int) – Maximum number of iterations in a self-consistent loop. Default: 1000.

  • method (str) – The method to use to solve linear or eigenvalue problems: “robust” or “fast”. Default: “robust”.

  • num_states (int) – Number of states to solve for, starting from the lowest eigenvalue.

  • val (2D array) – Location of each valley in the Brillouin zone. First index: valley index. Second index: Cartesian directions (xyz coordinates). By default, the \(\pm z\) valleys of silicon are used.

  • bloch_files (list) – List of pathlib Path objects or strings giving the path of files storing the planewave decomposition of the Bloch amplitudes of each valley (one file per valley). By default, the bloch amplitudes for the \(\pm z\) valleys of silicon are used.

  • m_inv_tensors (3D array) – Contains the inverse effective mass tensors corresponding to the valley states determined by self.val and self.bloch. By default, the effective mass tensors for the \(\pm z\) valleys of silicon are used.

  • lattice_const (float) – The lattice constant \(a\) of the crystal in SI units. By default, the silicon lattice constant, \(a = 5.431\times10^{-10}\) m is used.

  • approx (None, ‘trivial’, or ‘ff’, optional) – Approximation applied to simplify the matrix-element calculation. Options are: (i) "trivial" for the trivial approximation where the Bloch amplitudes are set to unity, \(u_{\nu}(\mathbf{r}) = 1\), (ii) "ff" for the form-factor approximation where products of Bloch amplitudes are approximated by constants, \(u_{\nu}^{\ast}(\mathbf{r})u_{\nu'}(\mathbf{r}) = a_0^{\nu\nu'}\) where \(a_0^{\nu\nu'}\) are constants that depend only on the valleys \(\nu\) and \(\nu'\), (iii) None where the Bloch amplitudes are treated exactly.

  • guess (2d array, str, or None) – Initial guess to use in the first Schrödinger iteration when the fast solver is used. If None, use default guess (random). Otherwise, must be a tuple whose first entry is the wave functions (with global node index first, and state index second), and whose second entry is the eigenenergies. Default: None.

  • parallel (bool) – Whether to use parallel algorithms to solve the eigenvalue problem. Only available for the “fast” method. The parallel algorithm is typically faster than the serial algorithm when (1) the system has at least 4 available logical cores and (2) the (sub)mesh on which the Schrödinger equation is solved has at least 10,000 nodes. Default: True.

  • verbose (bool) – Verbosity level. Default: True.

Note

The first dimension of val, bloch_files, and m_inv_tensors should be the same. Furthermore, the entries should be associated to each other, i.e., the state at band extremum val[i] has a periodic Bloch amplitude described in bloch_files[i] and an (inverse) effective mass tensor given by m_inv_tensors[i]. The files containing the Bloch amplitudes (bloch_files) are text files consisting of five columns. The rows of the files correspond to distinct reciprocal lattice vector components \(\mathbf G\). The first three columns give the coordinates of each reciprocal lattice vector in units of \(2\pi/a\), with \(a\) the lattice constant. The last two columns give the real and imaginary part of the associated coefficient \(A_{\mathbf G}^\nu\) in the plane wave expansion for this valley \(\nu\).

__init__(inp_dict: dict | None = None)

Instantiate the SolverParams object.

Parameters:

inp_dict (dict, optional) – Dictionary specifying certain solver parameters to be used instead of their default values.