ViennaSHE 1.3.0
Free open-source semiconductor device simulator using spherical harmonics expansions techniques.
dispersion.hpp
Go to the documentation of this file.
1#ifndef VIENNASHE_PHYSICS_DISPERSION_HPP
2#define VIENNASHE_PHYSICS_DISPERSION_HPP
3
4/* ============================================================================
5 Copyright (c) 2011-2022, Institute for Microelectronics,
6 Institute for Analysis and Scientific Computing,
7 TU Wien.
8
9 -----------------
10 ViennaSHE - The Vienna Spherical Harmonics Expansion Boltzmann Solver
11 -----------------
12
13 http://viennashe.sourceforge.net/
14
15 License: MIT (X11), see file LICENSE in the base directory
16=============================================================================== */
17
22
24
25#include <math.h>
26
31namespace viennashe
32{
33 namespace physics
34 {
35
41 {
42 public:
45 virtual double density_of_states(double ekin, double theta = 0, double phi = 0) const = 0;
46
49 virtual double velocity(double ekin, double theta = 0, double phi = 0) const = 0;
50
53 virtual double norm_k(double ekin, double theta = 0, double phi = 0) const = 0;
54
56 virtual bool is_isotropic() const { return true; } //be isotropic by default
57
59 virtual dispersion_base * clone() const = 0;
60
61 virtual double symmetry_factor() const = 0;
62
63 virtual ~dispersion_base() {}
64 };
65
66
69 {
70 public:
71 dispersion_proxy(dispersion_base const * ptr) : ptr_(ptr) {}
72
75 double density_of_states(double ekin, double theta = 0, double phi = 0) const
76 {
77 return ptr_->density_of_states(ekin, theta, phi);
78 }
79
82 double velocity(double ekin, double theta = 0, double phi = 0) const
83 {
84 return ptr_->velocity(ekin, theta, phi);
85 }
86
89 double norm_k(double ekin, double theta = 0, double phi = 0) const
90 {
91 return ptr_->norm_k(ekin, theta, phi);
92 }
93
95 bool is_isotropic() const
96 {
97 return ptr_->is_isotropic();
98 }
99
100 dispersion_base const * get() const { return ptr_; }
101
102 double symmetry_factor() const { return ptr_->symmetry_factor(); }
103
104 private:
105 dispersion_base const * ptr_;
106 };
107
108
115 template <typename MaterialType>
117 {
119
120 public:
121 parabolic_dispersion(viennashe::carrier_type_id ctype) : carrier_type_id_(ctype) {}
122
123 /*double energy(double k_norm) const
124 {
125 double hbar = constants::hbar;
126 double mstar = constants::mstar;
127 return hbar*hbar * k_norm * k_norm / (2.0 * mstar);
128 }*/
129
132 double norm_k(double energy, double theta = 0, double phi = 0) const
133 {
134 (void)theta;(void)phi; //prevents unused parameter warnings
135 if (energy <= 0.0)
136 return 0.0;
137
138 double hbar = constants::hbar;
139 double mstar = MaterialType::dos_effective_mass(carrier_type_id_);
140 return sqrt( 2.0 * energy * mstar / (hbar * hbar) );
141 }
142
151 double density_of_states(double eps, double theta = 0, double phi = 0) const
152 {
153 (void)theta;(void)phi; //prevents unused parameter warnings
154 if (eps < 0.0)
155 return 0.0;
156
157 const double hbar = constants::hbar;
158 const double mstar = MaterialType::dos_effective_mass(carrier_type_id_);
159 const double pi = viennashe::math::constants::pi;
160 const double prefactor = mstar * sqrt(2.0 * mstar) / (8.0 * pi * pi * pi * hbar * hbar * hbar);
161
162 return prefactor
163 * sqrt(eps);
164 }
165
172 double velocity(double eps, double theta = 0, double phi = 0) const
173 {
174 (void)theta;(void)phi; //prevents unused parameter warnings
175 if (eps < 0.0)
176 return 0.0;
177
178 double m_c = MaterialType::conductivity_effective_mass(carrier_type_id_);
179 double m_d = MaterialType::dos_effective_mass(carrier_type_id_);
180
181 return sqrt(m_c / m_d) //due to Herring-Vogt transform (see paper by Jin et al.)
182 * sqrt( 2.0 * eps / MaterialType::dos_effective_mass(carrier_type_id_) );
183 }
184
185 dispersion_base * clone() const { return new self_type(carrier_type_id_); }
186
188 double symmetry_factor() const
189 {
190 if (carrier_type_id_ == ELECTRON_TYPE_ID)
191 return 6.0;
192 return 4.0;
193 }
194
195 private:
196 viennashe::carrier_type_id carrier_type_id_;
197 };
198
199
206 template <typename MaterialType>
208 {
209 public:
210 modena_dispersion(viennashe::carrier_type_id ctype, double a = 0.5 / viennashe::physics::constants::q) : carrier_type_id_(ctype), alpha(a) {}
211
214 double norm_k(double energy, double theta = 0, double phi = 0) const
215 {
216 (void)theta;(void)phi; //prevents unused parameter warnings
217 if (energy < 0.0)
218 return 0.0;
219
220 const double hbar = constants::hbar;
221 const double mstar = MaterialType::dos_effective_mass(carrier_type_id_);
222 return sqrt( 2.0 * energy * (1.0 + alpha * energy) * mstar / (hbar * hbar) );
223 }
224
233 double density_of_states(double eps, double theta = 0, double phi = 0) const
234 {
235 (void)theta;(void)phi; //prevents unused parameter warnings
236 if (eps > 0.0)
237 {
238 const double hbar = constants::hbar;
239 const double mstar = MaterialType::dos_effective_mass(carrier_type_id_);
240 const double pi = viennashe::math::constants::pi;
241 const double prefactor = mstar * sqrt(2.0 * mstar) / (8.0 * pi * pi * pi * hbar * hbar * hbar);
242
243 return prefactor * 4.0 * pi
244 * (1.0 + 2.0 * alpha * eps)
245 * sqrt( eps * (1.0 + alpha * eps));
246 }
247
248 return 0.0;
249 }
250
257 double velocity(double eps, double theta = 0, double phi = 0) const
258 {
259 (void)theta;(void)phi; //prevents unused parameter warnings
260 if (eps < 0)
261 return 0;
262
263 double gamma = eps * (1.0 + alpha * eps);
264 double dgam = 1.0 + 2.0 * alpha * eps; //derivative of gamma w.r.t. eps
265
266 double m_c = MaterialType::conductivity_effective_mass(carrier_type_id_);
267 double m_d = MaterialType::dos_effective_mass(carrier_type_id_);
268
269 return sqrt(m_c / m_d) //due to Herring-Vogt transform (see paper by Jin et al.)
270 * sqrt( 2.0 * gamma / MaterialType::dos_effective_mass(carrier_type_id_)) / dgam;
271 }
272
273 dispersion_base * clone() const { return new modena_dispersion(carrier_type_id_, alpha); }
274
276 double symmetry_factor() const
277 {
278 if (carrier_type_id_ == ELECTRON_TYPE_ID)
279 return 6.0;
280 return 4.0;
281 }
282
283 private:
284 viennashe::carrier_type_id carrier_type_id_;
285 double alpha;
286 };
287
288
295 template <typename MaterialType>
297 {
298 public:
299 ext_vecchi_dispersion(viennashe::carrier_type_id ctype, double a = 0.5 / viennashe::physics::constants::q) : carrier_type_id_(ctype), alpha(a) {}
300
306 double norm_k(double energy, double theta = 0, double phi = 0) const
307 {
308 (void)theta;(void)phi; //prevents unused parameter warnings
309 if (energy < 0.0) { return 0.0; }
310
311 //throw dispersion_not_invertible_exception("Cannot invert dispersion relation for extended Vecchi model!");
312 //return 0;
313
314 double hbar = constants::hbar;
315 double mstar = MaterialType::dos_effective_mass(carrier_type_id_);
316 return sqrt( 2.0 * energy * mstar / (hbar * hbar) );
317 }
318
327 double density_of_states(double eps, double theta = 0, double phi = 0) const
328 {
329 (void)theta;(void)phi; //prevents unused parameter warnings
330 if (eps > 0.0)
332
333 return 0.0;
334 }
335
344 double velocity(double eps, double theta = 0, double phi = 0) const
345 {
346 (void)theta;(void)phi; //prevents unused parameter warnings
347 if (eps > 0.0)
348 {
349 const double m_c = MaterialType::conductivity_effective_mass(carrier_type_id_);
350 const double m_d = MaterialType::dos_effective_mass(carrier_type_id_);
351
352 return sqrt(m_c / m_d) // due to Herring-Vogt transform
354 }
355
356 return 0.0;
357 }
358
359 dispersion_base * clone() const { return new ext_vecchi_dispersion(carrier_type_id_); }
360
362 double symmetry_factor() const
363 {
364 if (carrier_type_id_ == ELECTRON_TYPE_ID)
365 return 6.0;
366 return 4.0;
367 }
368
369 private:
370 viennashe::carrier_type_id carrier_type_id_;
371 double alpha;
372 };
373
374
375
376 } //namespace physics
377} //namespace viennashe
378
379#endif
Common interface for band structures.
Definition: dispersion.hpp:41
virtual bool is_isotropic() const
Returns true if the dispersion relation is isotropic.
Definition: dispersion.hpp:56
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
A proxy object for a dispersion relation. Does NOT take ownership of the provided pointer!
Definition: dispersion.hpp:69
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)
Definition: dispersion.hpp:75
bool is_isotropic() const
Returns true if the dispersion relation is isotropic.
Definition: dispersion.hpp:95
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)....
Definition: dispersion.hpp:89
double velocity(double ekin, double theta=0, double phi=0) const
Returns the velocity as a function of kinetic energy (and angles, eventually)
Definition: dispersion.hpp:82
dispersion_base const * get() const
Definition: dispersion.hpp:100
dispersion_proxy(dispersion_base const *ptr)
Definition: dispersion.hpp:71
Non-parabolic isotropic dispersion relation proposed by Jin et al. TED 2011 (uses real DOS)
Definition: dispersion.hpp:297
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).
Definition: dispersion.hpp:306
double density_of_states(double eps, double theta=0, double phi=0) const
Generalized density of states.
Definition: dispersion.hpp:327
ext_vecchi_dispersion(viennashe::carrier_type_id ctype, double a=0.5/viennashe::physics::constants::q)
Definition: dispersion.hpp:299
dispersion_base * clone() const
Clones the dispersion relation. User must ensure that the returned copy is deleted.
Definition: dispersion.hpp:359
double symmetry_factor() const
Returns the number of symmetric bands in k-space.
Definition: dispersion.hpp:362
double velocity(double eps, double theta=0, double phi=0) const
Carrier group velocity.
Definition: dispersion.hpp:344
Non-parabolic dispersion relation proposed by the Modena group (spherically symmetric).
Definition: dispersion.hpp:208
double density_of_states(double eps, double theta=0, double phi=0) const
Generalized density of states.
Definition: dispersion.hpp:233
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)....
Definition: dispersion.hpp:214
double symmetry_factor() const
Returns the number of symmetric bands in k-space.
Definition: dispersion.hpp:276
dispersion_base * clone() const
Clones the dispersion relation. User must ensure that the returned copy is deleted.
Definition: dispersion.hpp:273
modena_dispersion(viennashe::carrier_type_id ctype, double a=0.5/viennashe::physics::constants::q)
Definition: dispersion.hpp:210
double velocity(double eps, double theta=0, double phi=0) const
Carrier group velocity.
Definition: dispersion.hpp:257
Parabolic dispersion relation (spherically symmetric)
Definition: dispersion.hpp:117
dispersion_base * clone() const
Clones the dispersion relation. User must ensure that the returned copy is deleted.
Definition: dispersion.hpp:185
double symmetry_factor() const
Returns the number of symmetric bands in k-space.
Definition: dispersion.hpp:188
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)....
Definition: dispersion.hpp:132
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.
Definition: dispersion.hpp:151
parabolic_dispersion(viennashe::carrier_type_id ctype)
Definition: dispersion.hpp:121
double velocity(double eps, double theta=0, double phi=0) const
Carrier group velocity.
Definition: dispersion.hpp:172
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.
Definition: dos_RSi.hpp:4974
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.
Definition: dos_RSi.hpp:4948
The main ViennaSHE namespace. All functionality resides inside this namespace.
Definition: accessors.hpp:40
carrier_type_id
Enumeration type for selecting the carrier type.
Definition: forwards.h:185
@ ELECTRON_TYPE_ID
Definition: forwards.h:187
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.
Definition: constants.hpp:34
static const double q
Elementary charge.
Definition: constants.hpp:44
static const double hbar
Modified Planck constant.
Definition: constants.hpp:50