-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathemcParabolicIsotropValley.hpp
97 lines (79 loc) · 3.32 KB
/
emcParabolicIsotropValley.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#ifndef EMC_PARABOLIC_ISOTROP_VALLEY_HPP
#define EMC_PARABOLIC_ISOTROP_VALLEY_HPP
#include <math.h>
#include <ValleyTypes/emcAbstractValley.hpp>
#include <emcConstants.hpp>
/** \brief class for parabolic valley of a semiconductor
* with isotropical effective mass
* @param relEffMass relative effective mass of particle
* @param particleMass mass of one simulated particle
* @param effMass effective mass of particle
* @param degFactor degeneracy factor of energy-valley / nr of equal valleys
* @param bottomEnergy energy of the bottom of the valley (in eV)
*/
template <class T>
class emcParabolicIsotropValley : public emcAbstractValley<T> {
private:
T relEffMass;
T particleMass;
T effMass;
SizeType degFactor;
std::array<T, 3> vogtFactor;
T bottomEnergy;
public:
emcParabolicIsotropValley() = delete;
/*! \brief Constructor.
*
* @param inRelEffMass relative effective mass of valley
* @param inParticleMass mass of particles
* @param inDegFactor nr of equivalent subvalleys
* @param inBottomEnergy energy of the bottom of the valley (in eV)
*/
emcParabolicIsotropValley(T inRelEffMass, T inParticleMass,
SizeType inDegFactor, T inBottomEnergy = 0.)
: relEffMass(inRelEffMass), particleMass(inParticleMass),
degFactor(inDegFactor), effMass(inRelEffMass * inParticleMass),
vogtFactor({1, 1, 1}), bottomEnergy(inBottomEnergy) {}
/// returns DOS effMass (not energy dependent)
T getEffMassDOS(T /*energy*/ = 0) const { return effMass; }
/// returns counductive effMass (not energy dependent)
T getEffMassCond(T /*energy*/ = 0) const { return effMass; }
T getBottomEnergy() const { return bottomEnergy; }
/// nonParabolicity is 0 for parabolic valleys
T getNonParabolicity() const { return 0; }
SizeType getDegeneracyFactor() const { return degFactor; }
/// returns norm of wave-vector: k = sqrt(2 * m * E) / h
T getNormWaveVec(T energy) const {
return std::sqrt(2 * effMass * constants::q * energy) / constants::hbar;
}
/// returns energy (in eV): E = k^2 * h^2 / (2 * m)
T getEnergy(const std::array<T, 3> &k) const {
return constants::hbar * constants::hbar * square(k) /
(2 * effMass * constants::q);
}
/// Vogt-Transformation Factor not needed for isotrop valleys
/// is set to (1,1,1) in beginning
const std::array<T, 3> &getVogtTransformationFactor() const {
return vogtFactor;
}
/// returns velocity = h * k / m
std::array<T, 3> getVelocity(const std::array<T, 3> &k, T /*energy*/,
SizeType /*idxSubValley*/) const {
return scale(k, constants::hbar / effMass);
}
/// return gamma = energy (in eV)
T getGamma(T energy) const { return energy; }
/// isotrop valley characteristics are independent of coordinate system,
/// just returns vector in given coordinate system
std::array<T, 3> transformToEllipseCoord(SizeType /*idxSubValley*/,
const std::array<T, 3> &vec) const {
return vec;
}
/// isotrop valley characteristics are independent of coordinate system,
/// just returns vector in given coordinate system
std::array<T, 3> transformToDeviceCoord(SizeType /*idxSubValley*/,
const std::array<T, 3> &vec) const {
return vec;
}
};
#endif // EMC_PARABOLIC_ISOTROP_VALLEY_HPP