1#ifndef VIENNASHE_PHYSICS_DISPERSION_HPP
2#define VIENNASHE_PHYSICS_DISPERSION_HPP
49 virtual double velocity(
double ekin,
double theta = 0,
double phi = 0)
const = 0;
53 virtual double norm_k(
double ekin,
double theta = 0,
double phi = 0)
const = 0;
82 double velocity(
double ekin,
double theta = 0,
double phi = 0)
const
84 return ptr_->
velocity(ekin, theta, phi);
89 double norm_k(
double ekin,
double theta = 0,
double phi = 0)
const
91 return ptr_->
norm_k(ekin, theta, phi);
115 template <
typename MaterialType>
132 double norm_k(
double energy,
double theta = 0,
double phi = 0)
const
134 (void)theta;(void)phi;
139 double mstar = MaterialType::dos_effective_mass(carrier_type_id_);
140 return sqrt( 2.0 * energy * mstar / (hbar * hbar) );
153 (void)theta;(void)phi;
158 const double mstar = MaterialType::dos_effective_mass(carrier_type_id_);
160 const double prefactor = mstar * sqrt(2.0 * mstar) / (8.0 * pi * pi * pi * hbar * hbar * hbar);
172 double velocity(
double eps,
double theta = 0,
double phi = 0)
const
174 (void)theta;(void)phi;
178 double m_c = MaterialType::conductivity_effective_mass(carrier_type_id_);
179 double m_d = MaterialType::dos_effective_mass(carrier_type_id_);
181 return sqrt(m_c / m_d)
182 * sqrt( 2.0 * eps / MaterialType::dos_effective_mass(carrier_type_id_) );
206 template <
typename MaterialType>
214 double norm_k(
double energy,
double theta = 0,
double phi = 0)
const
216 (void)theta;(void)phi;
221 const double mstar = MaterialType::dos_effective_mass(carrier_type_id_);
222 return sqrt( 2.0 * energy * (1.0 + alpha * energy) * mstar / (hbar * hbar) );
235 (void)theta;(void)phi;
239 const double mstar = MaterialType::dos_effective_mass(carrier_type_id_);
241 const double prefactor = mstar * sqrt(2.0 * mstar) / (8.0 * pi * pi * pi * hbar * hbar * hbar);
243 return prefactor * 4.0 * pi
244 * (1.0 + 2.0 * alpha * eps)
245 * sqrt( eps * (1.0 + alpha * eps));
257 double velocity(
double eps,
double theta = 0,
double phi = 0)
const
259 (void)theta;(void)phi;
263 double gamma = eps * (1.0 + alpha * eps);
264 double dgam = 1.0 + 2.0 * alpha * eps;
266 double m_c = MaterialType::conductivity_effective_mass(carrier_type_id_);
267 double m_d = MaterialType::dos_effective_mass(carrier_type_id_);
269 return sqrt(m_c / m_d)
270 * sqrt( 2.0 * gamma / MaterialType::dos_effective_mass(carrier_type_id_)) / dgam;
295 template <
typename MaterialType>
306 double norm_k(
double energy,
double theta = 0,
double phi = 0)
const
308 (void)theta;(void)phi;
309 if (energy < 0.0) {
return 0.0; }
315 double mstar = MaterialType::dos_effective_mass(carrier_type_id_);
316 return sqrt( 2.0 * energy * mstar / (hbar * hbar) );
329 (void)theta;(void)phi;
344 double velocity(
double eps,
double theta = 0,
double phi = 0)
const
346 (void)theta;(void)phi;
349 const double m_c = MaterialType::conductivity_effective_mass(carrier_type_id_);
350 const double m_d = MaterialType::dos_effective_mass(carrier_type_id_);
352 return sqrt(m_c / m_d)
Common interface for band structures.
virtual bool is_isotropic() const
Returns true if the dispersion relation is isotropic.
virtual double norm_k(double ekin, double theta=0, double phi=0) const =0
Returns the norm of the k-vector as a function of energy (and angles, eventually)....
virtual double velocity(double ekin, double theta=0, double phi=0) const =0
Returns the group velocity as a function of kinetic energy (and angles, eventually)
virtual dispersion_base * clone() const =0
Clones the dispersion relation. User must ensure that the returned copy is deleted.
virtual double density_of_states(double ekin, double theta=0, double phi=0) const =0
Returns the density of states as a function of kinetic energy (and angles, eventually)
virtual double symmetry_factor() const =0
virtual ~dispersion_base()
A proxy object for a dispersion relation. Does NOT take ownership of the provided pointer!
double density_of_states(double ekin, double theta=0, double phi=0) const
Returns the density of states as a function of kinetic energy (and angles, eventually)
bool is_isotropic() const
Returns true if the dispersion relation is isotropic.
double norm_k(double ekin, double theta=0, double phi=0) const
Returns the norm of the k-vector as a function of energy (and angles, eventually)....
double velocity(double ekin, double theta=0, double phi=0) const
Returns the velocity as a function of kinetic energy (and angles, eventually)
dispersion_base const * get() const
double symmetry_factor() const
dispersion_proxy(dispersion_base const *ptr)
Non-parabolic isotropic dispersion relation proposed by Jin et al. TED 2011 (uses real DOS)
double norm_k(double energy, double theta=0, double phi=0) const
Returns the norm of the k-vector as a function of energy (and angles, eventually).
double density_of_states(double eps, double theta=0, double phi=0) const
Generalized density of states.
ext_vecchi_dispersion(viennashe::carrier_type_id ctype, double a=0.5/viennashe::physics::constants::q)
dispersion_base * clone() const
Clones the dispersion relation. User must ensure that the returned copy is deleted.
double symmetry_factor() const
Returns the number of symmetric bands in k-space.
double velocity(double eps, double theta=0, double phi=0) const
Carrier group velocity.
Non-parabolic dispersion relation proposed by the Modena group (spherically symmetric).
double density_of_states(double eps, double theta=0, double phi=0) const
Generalized density of states.
double norm_k(double energy, double theta=0, double phi=0) const
Returns the norm of the k-vector as a function of energy (and angles, eventually)....
double symmetry_factor() const
Returns the number of symmetric bands in k-space.
dispersion_base * clone() const
Clones the dispersion relation. User must ensure that the returned copy is deleted.
modena_dispersion(viennashe::carrier_type_id ctype, double a=0.5/viennashe::physics::constants::q)
double velocity(double eps, double theta=0, double phi=0) const
Carrier group velocity.
Parabolic dispersion relation (spherically symmetric)
dispersion_base * clone() const
Clones the dispersion relation. User must ensure that the returned copy is deleted.
double symmetry_factor() const
Returns the number of symmetric bands in k-space.
double norm_k(double energy, double theta=0, double phi=0) const
Returns the norm of the k-vector as a function of energy (and angles, eventually)....
double density_of_states(double eps, double theta=0, double phi=0) const
Total generalized density of states for one spin direction, considering six-fold symmetry.
parabolic_dispersion(viennashe::carrier_type_id ctype)
double velocity(double eps, double theta=0, double phi=0) const
Carrier group velocity.
Contains the density of states (DOS) and group velocity for electrons and holes in relaxed silicon (R...
A very simple material database. Needs to be replaced by something more versatile soon.
Provides a number of fundamental math constants.
double get_group_velocity(const double eps, const viennashe::carrier_type_id ctype)
Convenience function for returning the group velocity for carriers in the respective band.
double get_density_of_states(const double eps, const viennashe::carrier_type_id ctype)
Convenience function for returning the density of states for carriers in the respective band.
The main ViennaSHE namespace. All functionality resides inside this namespace.
carrier_type_id
Enumeration type for selecting the carrier type.
Provides a number of fundamental constants. All constants in SI units.
Returns a few helper routines for computing physical quantities. To be replaced in the future.
static const double pi
Pi.
static const double q
Elementary charge.
static const double hbar
Modified Planck constant.