qtcad.device.many_body module
Solver for many body states which assembles and diagonalizes the Coulomb Hamiltonian for interacting quantum-confined electrons.
- class qtcad.device.many_body.Solver(device=None, solver_params=None, single_body_solver_params=None)
Bases:
Solver
Many-body solver using exact diagonalization in a truncated subspace.
- Attributes:
device (Device object) – The device for which to solve for the many-body eigenstates
num_states (int) – Number of single-particle states to consider, starting from the lowest eigenvalue.
precision (float) – Relative precision to use upon performing the Coulomb integration
ham_hop (2d array) – Single particle diagonal Hamiltonian
coulomb_mat (4d array) – Coefficients \(V_{ijkl}\) of the Coulomb interaction in second quantization.
overlap (bool) – If False, neglect overlapping terms in the Coulomb interaction matrix.
- __init__(device=None, solver_params=None, single_body_solver_params=None)
Constructor for the many-body solver.
- Parameters:
device (Device object, optional) – Device for which we wish to apply the many-body solver. If no Device is provided, the
energies
andcoulomb_mat
attributes must be specified in the solver_params object. In this case, the many-body solver will use these values to solve the many-body problem.solver_params (SolverParams object or None, optional) – An object containing the parameters of the solver. If None, use default parameter values.
single_body_solver_params (SolverParams object or None, optional) – An object containing the parameters of the single-particle solver to run to find the orbital basis states. If None, use default parameter values.
Note
The full degeneracy of the system will be a product of the spin degeneracy with any other degeneracy (e.g. band or valley). If no Device object is provided,
energies
andcoulomb_mat
must be provided to define the many-body problem to be solved. In addition, even if a Device object is provided, the energies and Coulomb matrix can be provided in the solver_params object to skip the single-particle solver and Coulomb matrix computation.
- get_add_spectrum(chem_pot=0.0, temperature=None)
Gets the charge addition spectrum of the system at equilibrium.
The charge addition spectrum is defined as:
\[\frac{\partial\langle N\rangle}{\partial\mu}= \frac{\langle N^2\rangle-\langle N\rangle^2}{k_B T},\]where \(N\) is the total particle number in the system, \(k_B\) is Boltzmann’s constant, \(T\) is temperature, and \(\mu\) is the chemical potential of reservoirs in equilibrium with the system, assuming the grand canonical ensemble. The expectation values in the above equation are taken in this grand-canonical thermodynamic equilibrium state.
This definition is taken from:
Hensgens et al. Nature (London), Vol. 548 pp. 70-73 (2017)
- Parameters:
chem_pot (float, optional) – The chemical potential. Default: 0.
temperature (float, optional) – The temperature. Default: None, in which case the device temperature is used if it exists, and otherwise temperature is set to 1 K.
- Returns:
float – The charge addition spectrum for the current electrostatic configuration.
- get_avg_number(chem_pot=0.0, temperature=None)
Gets the expectation value of the particle-number operator in the thermodynamic equilibrium state of the grand canonical ensemble with user-defined temperature and chemical potential.
- Parameters:
chem_pot (float, optional) – The chemical potential. Default: 0.
temperature (float, optional) – The temperature. Default: None, in which case the device temperature is used if it exists, and otherwise temperature is set to 0 K.
- Returns:
float – The average particle number.
Note
Must be called after the
solve
method.
- get_avg_number_power(power, chem_pot=0.0, temperature=None)
Gets the expectation value of the operator \(N^k\) in the thermodynamic equilibrium state of the grand canonical ensemble, where \(N\) is the total particle number and \(k\) is some arbitrary power.
- Parameters:
power (int or float) – The power \(k\).
chem_pot (float, optional) – The chemical potential. Default: 0.
temperature (float, optional) – The temperature. Default: None, in which case the device temperature is used if it exists, and otherwise temperature is set to 1 K.
- Returns:
float –
- The expectation value of the \(k\)-th power of the
particle number.
Note
Must be called after the
solve
method.
- get_chem_potentials()
Gets the chemical potentials of the system, defined as \(\mu(N) = E(N+1)-E(N)\) with \(N\) the total energy with \(N\) particles in their ground states.
- Returns:
1d array – The chemical potentials.
- get_coulomb_matrix(overlap=None, verbose=True)
Gets the Coulomb interaction matrix in the eigenbasis of the single particle eigenstates.
- Parameters:
overlap (bool or None, optional) – If False, neglect overlapping terms in the Coulomb interaction matrix. If None, use the value of the
overlap
attribute of this Solver object.verbose (bool, optional) – Verbosity. Default: True.
- Returns:
ndarray – The Coulomb interaction matrix. If overlap is True, returns a 4D array. Otherwise, returns \(V_{ij} = V_{ijij}\).
Note
This method also stores the Coulomb interaction matrix in the
coulomb_mat
attribute of theDevice
object over which this Solver is instantiated.
- solve(verbose=True)
Solves the many-body problem and store the solution in the device.
- Parameters:
verbose (bool, optional) – Verbosity. Default: True.
Note
The solution is stored in the
many_body_subspaces
attribute of the device: a list containing theSubspace
object for each N-body subspace. In addition, the chemical potentials and Coulomb peak positions are evaluated and stored in thechem_potentials
andcoulomb_peak_pos
attributes of theDevice
object, respectively. Thecoulomb_peak_pos
attribute is only relevant when the system being modeling is a single quantum dot with a single gate; otherwise theJunction
class should be used. Finally, the coefficients V_ijkl of the Coulomb interaction in second quantization are stored in thecoulomb_mat
attribute of the many-body Solver object.
- class qtcad.device.many_body.SolverParams(inp_dict=None)
Bases:
SolverParams
Parameters to pass to a many-body solver.
- Attributes:
energies (1d array, optional) – The single-particle energies. If None, use values stored in the input device. Default: None.
coulomb_mat (2d or 4d array, optional) – The Coulomb interaction matrix to use. If None, compute the Coulomb matrix using the single-particle states stored in the input device. Default: None.
num_states (int, optional) – Number of single-particle states to consider, starting from the lowest eigenvalue. Default: 2.
n_degen (int, optional) – Degeneracy of the single particle states. Can be used for e.g. valley degeneracy, spin, … Default: 2.
num_particles (range or list of int, optional) – Numbers of particles to solve for. Each integer value \(N\) labels an \(N\)-particle subspace to consider in the many-body solver. If None, considers all \(N\)-particle subspaces allowed by the basis states, i.e., a maximum particle number equal to \(n_\mathrm{states}\times n_\mathrm{degen}\). Default: None.
precision (float, optional) – Relative precision to use upon performing the Coulomb integration Default: 1e-6.
alpha (float, optional) – Lever arm of the gate of interest over the electronic structure of the device. Default: 1.
overlap (bool, optional) – If False, neglect overlapping terms in the Coulomb interaction matrix. Default: True.
cutoff (float) – Relative cutoff on Coulomb integrals (with respect to the largest integral) below which Coulomb integrals are neglected. Default: 1e-6
- __init__(inp_dict=None)
Instantiate the SolverParams object.
- Parameters:
inp_dict (dict, optional) – Dictionary specifying certain solver parameters to be used instead of their default values.