-
Notifications
You must be signed in to change notification settings - Fork 6
/
Copy pathparameterLi.hpp
177 lines (153 loc) · 8.04 KB
/
parameterLi.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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
#include <ScatterMechanisms/emcAcousticSingleLayerScatterMechanism.hpp>
#include <ScatterMechanisms/emcZeroOrderSingleLayerInterValleyScatterMechanism.hpp>
#include <ValleyTypes/emcNonParabolicAnisotropSingleLayerValley.hpp>
#include <ValleyTypes/emcNonParabolicIsotropSingleLayerValley.hpp>
#include <emcConstants.hpp>
/**
* @brief Parameters taken from Li et al.
*
* DOI of the paper: https://doi.org/10.1103/PhysRevB.87.115418
*
* The band structure of the material is approximated with the
* multi-valley approach within this simulation, the parameters for the
* valleys of interest (at K- and Q-points) are taken from the first
* paragraph of chapter III B.
*
* As scattering mechanisms, scattering with intrinsic phonons is
* implemented, with the deformation potentials described in
* chapter III C for MoS2.
*
* NOTE: This implementation is still in progress.
*/
namespace MoS2Li {
using NumType = double;
using SubValleyAssignmentType = std::vector<std::vector<SizeType>>;
using isotropValleyType = emcNonParabolicIsotropSingleLayerValley<NumType>;
using anisotropValleyType = emcNonParabolicAnisotropSingleLayerValley<NumType>;
using acScatterMech = emcAcousticSingleLayerMechanism<NumType>;
using iv0AbScatterMech =
emcZeroOrderSingleLayerInterValleyAbsorptionScatterMechanism<NumType>;
using iv0EmScatterMech =
emcZeroOrderSingleLayerInterValleyEmissionScatterMechanism<NumType>;
const NumType rho = 3.1e-6; // in kg / m2
const NumType energyQK = 0.07; // in eV
const NumType vSound = 6.6e3; // in m / s
// characteristics K-Valley (assume isotrop + parabolic)
const NumType relEffMassK = 0.5;
const SizeType degeneracyK = 6;
// characteristic Q-Valley (anisotrop + parabolic valley)
const NumType relLongEffMassQ = 1;
const NumType relTransEffMassQ = 0.62;
const SizeType degeneracyQ = 6;
const NumType angle60dg = constants::pi / 3.;
const std::vector<NumType> rotAngles = {
0, angle60dg, 2 * angle60dg, constants::pi, 4 * angle60dg, 5 * angle60dg};
// characteristics for intra- + intervalley scattering
// average over LA + TA at specific symmetry point
const NumType acPhonEnergyGamma = 0; // in eV
const NumType acPhonEnergyK = (23.1 + 29.1) / 2000.; // in eV
const NumType acPhonEnergyM = (19.2 + 29.2) / 2000.; // in eV
const NumType acPhonEnergyQ = (17.9 + 23.6) / 2000.; // in eV
// average over TO + LO + A1 at specific symmetry point
const NumType opPhonEnergyGamma = (48.6 + 48.9 + 50.9) / 3000.; // in eV
const NumType opPhonEnergyK = (46.4 + 42.2 + 51.9) / 3000.; // in eV
const NumType opPhonEnergyM = (48.2 + 44.3 + 50.1) / 3000.; // in eV
const NumType opPhonEnergyQ = (48.0 + 44.2 + 52.2) / 3000.; // in eV
// vectors that assign to each initial subvalley (first idx) the possible
// final subvalleys
const SubValleyAssignmentType toSameSub = {{0}, {1}, {2}, {3}, {4}, {5}};
const SubValleyAssignmentType toNextSub = {{1}, {2}, {3}, {4}, {5}, {0}};
const SubValleyAssignmentType toNbrSub = {{1, 5}, {0, 2}, {1, 3},
{2, 4}, {3, 5}, {4, 0}};
const SubValleyAssignmentType toNbrNbrSub = {{2, 4}, {3, 5}, {4, 0},
{5, 1}, {0, 2}, {1, 3}};
const SubValleyAssignmentType toOppositeSub = {{3}, {4}, {5}, {0}, {1}, {2}};
const SubValleyAssignmentType toSlashSub = {{1, 3, 5}, {0, 2, 4}, {1, 3, 5},
{0, 2, 4}, {1, 3, 5}, {0, 2, 4}};
const SubValleyAssignmentType toSameKindSub = {{0, 2, 4}, {1, 3, 5}, {0, 2, 4},
{1, 3, 5}, {0, 2, 4}, {0, 2, 4}};
template <class DerivedParticleType>
void addValleys(std::unique_ptr<DerivedParticleType> &particleType) {
// K - Valleys
particleType->addValley(std::make_unique<isotropValleyType>(
relEffMassK, particleType->getMass(), degeneracyK, 0));
// Q - Valleys
particleType->addValley(std::make_unique<anisotropValleyType>(
relTransEffMassQ, relLongEffMassQ, particleType->getMass(), degeneracyQ,
0, rotAngles, energyQK));
}
template <class DerivedParticleType>
void addAcousticScatterMechanisms(
std::unique_ptr<DerivedParticleType> &particleType,
const std::vector<int> &idxRegions, NumType temperature) {
particleType->addScatterMechanism(
idxRegions,
std::make_unique<acScatterMech>(0, 4.5, rho, vSound, temperature, "K"));
particleType->addScatterMechanism(
idxRegions,
std::make_unique<acScatterMech>(1, 2.8, rho, vSound, temperature, "Q"));
}
template <class DerivedParticleType, class... TParam>
void helperAddZeroOrderMech(std::unique_ptr<DerivedParticleType> &particleType,
const std::vector<int> &idxRegions,
TParam... param) {
// Absorption
particleType->addScatterMechanism(
idxRegions, std::make_unique<iv0AbScatterMech>(param...));
// Emission
particleType->addScatterMechanism(
idxRegions, std::make_unique<iv0EmScatterMech>(param...));
}
template <class DerivedParticleType>
void addZeroOrderIntervalleyScatterMechanisms(
std::unique_ptr<DerivedParticleType> &particleType,
const std::vector<int> &idxRegions, NumType temperature) {
// K -> K (Gamma - phonons)
helperAddZeroOrderMech(particleType, idxRegions, 0, 0, 5.8e10, rho,
temperature, opPhonEnergyGamma, toSameSub,
"KOpGammaToK");
// K -> K' (K-phonons)
helperAddZeroOrderMech(particleType, idxRegions, 0, 0, 1.4e10, rho,
temperature, acPhonEnergyK, toNextSub, "KAcKToKSlash");
helperAddZeroOrderMech(particleType, idxRegions, 0, 0, 2.0e10, rho,
temperature, opPhonEnergyK, toNextSub, "KOpKToKSlash");
// K -> Q (Q-phonons)
helperAddZeroOrderMech(particleType, idxRegions, 0, 1, 0.93e9, rho,
temperature, acPhonEnergyQ, toSameKindSub, "KAcQToQ");
helperAddZeroOrderMech(particleType, idxRegions, 0, 1, 1.9e10, rho,
temperature, opPhonEnergyQ, toSameKindSub, "KOpQToQ");
// K -> Q' (M-phonons)
helperAddZeroOrderMech(particleType, idxRegions, 0, 1, 4.4e10, rho,
temperature, acPhonEnergyM, toSlashSub, "KAcMToQ");
helperAddZeroOrderMech(particleType, idxRegions, 0, 1, 5.6e10, rho,
temperature, opPhonEnergyM, toSlashSub, "KOpMToQ");
// Q1 -> Q1 (Gamma - phonons)
helperAddZeroOrderMech(particleType, idxRegions, 1, 1, 7.1e10, rho,
temperature, opPhonEnergyGamma, toSameSub, "QOpQToQ1");
// Q1 -> Q2 / Q6 (Q - phonons)
helperAddZeroOrderMech(particleType, idxRegions, 1, 1, 2.1e10, rho,
temperature, acPhonEnergyQ, toNbrSub, "QAcQToQ2");
helperAddZeroOrderMech(particleType, idxRegions, 1, 1, 4.8e10, rho,
temperature, opPhonEnergyQ, toNbrSub, "QOpQToQ2");
// Q -> Q3 / Q5 (M - phonons)
helperAddZeroOrderMech(particleType, idxRegions, 1, 1, 2.0e10, rho,
temperature, acPhonEnergyM, toNbrNbrSub, "QAcMToQ3");
helperAddZeroOrderMech(particleType, idxRegions, 1, 1, 4.0e10, rho,
temperature, opPhonEnergyM, toNbrNbrSub, "QOpMToQ3");
// Q -> Q4 (K - phonons)
helperAddZeroOrderMech(particleType, idxRegions, 1, 1, 4.8e10, rho,
temperature, acPhonEnergyK, toOppositeSub, "QAcKToQ4");
helperAddZeroOrderMech(particleType, idxRegions, 1, 1, 6.5e10, rho,
temperature, opPhonEnergyK, toOppositeSub, "QOpKToQ4");
// Q -> K (Q - phonons)
helperAddZeroOrderMech(particleType, idxRegions, 1, 0, 1.5e10, rho,
temperature, acPhonEnergyQ, toSameSub, "QAcQToK");
helperAddZeroOrderMech(particleType, idxRegions, 1, 0, 2.4e10, rho,
temperature, opPhonEnergyQ, toSameSub, "QOpQToK");
// Q -> K' (M - phonons)
helperAddZeroOrderMech(particleType, idxRegions, 1, 0, 4.4e10, rho,
temperature, acPhonEnergyM, toNextSub, "QAcMToKSlash");
helperAddZeroOrderMech(particleType, idxRegions, 1, 0, 6.6e10, rho,
temperature, opPhonEnergyM, toNextSub, "QOpMToKSlash");
}
} // namespace MoS2Li