ViennaSHE 1.3.0
Free open-source semiconductor device simulator using spherical harmonics expansions techniques.
config.hpp
Go to the documentation of this file.
1#ifndef VIENNASHE_SHE_SCATTERING_CONFIG_HPP
2#define VIENNASHE_SHE_SCATTERING_CONFIG_HPP
3/* ============================================================================
4 Copyright (c) 2011-2022, Institute for Microelectronics,
5 Institute for Analysis and Scientific Computing,
6 TU Wien.
7
8 -----------------
9 ViennaSHE - The Vienna Spherical Harmonics Expansion Boltzmann Solver
10 -----------------
11
12 http://viennashe.sourceforge.net/
13
14 License: MIT (X11), see file LICENSE in the base directory
15=============================================================================== */
16
17
18#include <iostream>
19#include <algorithm>
20#include <cmath>
21
22#include "viennashe/forwards.h"
23#include "viennashe/log/log.hpp"
25
30namespace viennashe
31{
32
33 namespace she
34 {
35
38 {
39 public:
40 scattering_parameter_base(bool b) : enabled_(b) {}
41
42 bool enabled() const { return enabled_; }
43 void enabled(bool b) { enabled_ = b; }
44
45 private:
46 bool enabled_;
47 };
48
51 {
53
54 public:
55 acoustic_phonon_scattering_parameters() : base_type(true), fit_n_(1.05), fit_p_(0.875) {}
56
57 double get_mass_density(viennashe::carrier_type_id) const { return 2330.0; /* kg/m^3 */ }
58 double get_longitudinal_sound_velocity(viennashe::carrier_type_id) const { return 9040.0; /* m/s */ }
60 {
61 if (ctype == viennashe::ELECTRON_TYPE_ID)
62 return 8.9 * viennashe::physics::constants::q; /* Joule */
63 else
65 }
66
68 {
69 return (ctype == viennashe::ELECTRON_TYPE_ID) ? fit_n_ /* vecci: 0.48 */
70 : fit_p_; /* vecci: 0.9 */
71 }
72
74 {
75 if (ctype == viennashe::ELECTRON_TYPE_ID)
76 fit_n_ = value;
77 else
78 fit_p_ = value;
79 }
80
81 private:
82 double fit_n_;
83 double fit_p_;
84 };
85
86
89 {
91
92 public:
93 optical_phonon_scattering_parameters() : base_type(true), fit_n_(0.7), fit_p_(0.7) {}
94
95 double get_mass_density(viennashe::carrier_type_id) const { return 2330.0; /* kg/m^3 */ } // TODO: only for silicon (generalize)
96 double get_phonon_energy() const { return 1.24 * (viennashe::physics::constants::q/20.0); /* Joule */ }
98
100 {
101 return (ctype == viennashe::ELECTRON_TYPE_ID) ? fit_n_ /* vecci: 0.48 */
102 : fit_p_; /* vecci: 0.9 */
103 }
104
106 {
107 if (ctype == viennashe::ELECTRON_TYPE_ID)
108 fit_n_ = value;
109 else
110 fit_p_ = value;
111 }
112
113 private:
114 double fit_n_;
115 double fit_p_;
116 };
117
120 {
122
123 public:
125
126 double fit_factor(double NI, bool is_donor_dominated, viennashe::carrier_type_id ctype) const
127 {
128 if (ctype == viennashe::ELECTRON_TYPE_ID)
129 return fit_factor_n(NI, is_donor_dominated);
130 return fit_factor_p(NI, is_donor_dominated);
131 }
132
133 private:
135 double fit_factor_n(double NI, bool is_donor_dominated) const
136 {
137 double factor = 1.0;
138
139 const long i = static_cast<long>(std::log(NI/100/100/100)/std::log(10.0));
140
141 if (is_donor_dominated)
142 {
143 if (i <= 14) factor = 0.0479266894808;
144 else if (i <= 15) factor = 0.0143814762161;
145 else if (i <= 16) factor = 0.163014476723;
146 else if (i <= 17) factor = 1.27621982607;
147 else if (i <= 18) factor = 2.07841863841;
148 else if (i <= 19) factor = 2.66848494897;
149 else if (i <= 20) factor = 8.69553015708;
150 else factor = 71.4713817122;
151 }
152 else
153 {
154 if (i <= 14) factor = 0.0135170431921;
155 else if (i <= 15) factor = 0.110716650784;
156 else if (i <= 16) factor = 0.499715004949;
157 else if (i <= 17) factor = 1.4012436912;
158 else if (i <= 18) factor = 1.24925936014;
159 else if (i <= 19) factor = 1.0073534599;
160 else if (i <= 20) factor = 2.84325491032;
161 else factor = 22.5197987554;
162 }
163
164 return factor;
165 }
166
167 double fit_factor_p(double NI, bool is_donor_dominated) const
168 {
169 double factor = 1.0;
170
171 const long i = static_cast<long>(std::log(NI/100/100/100)/std::log(10.0));
172
173
174 if (is_donor_dominated)
175 {
176
177 if (i <= 14) factor = 0.0001;
178 else if (i <= 15) factor = 0.0229086958854;
179 else if (i <= 16) factor = 0.106259676639;
180 else if (i <= 17) factor = 0.492336240353;
181 else if (i <= 18) factor = 0.529652548279;
182 else if (i <= 19) factor = 0.336197331939; // TODO: check this
183 else if (i <= 20) factor = 0.512045950387;
184 else factor = 3.01287648798;
185
186 }
187 else
188 {
189
190 if (i <= 14) factor = 1.1566304323;
191 else if (i <= 15) factor = 0.324429154352; // TODO: check this
192 else if (i <= 16) factor = 0.253416326007; // TODO: check this
193 else if (i <= 17) factor = 0.718942981114; // TODO: check this
194 else if (i <= 18) factor = 1.22458439328;
195 else if (i <= 19) factor = 1.12207235068;
196 else if (i <= 20) factor = 1.69835752347;
197 else factor = 9.99694686735;
198
199 }
200
201 return factor;
202 }
203
204 };
205
206
208 {
210
211 public:
212 impact_ionization_scattering_parameters() : base_type(false), fit_n_(1.0), fit_p_(1.0) {}
213
215 {
216 return (ctype == viennashe::ELECTRON_TYPE_ID) ? fit_n_ : fit_p_;
217 }
218
220 {
221 if (ctype == viennashe::ELECTRON_TYPE_ID)
222 fit_n_ = value;
223 else
224 fit_p_ = value;
225 }
226
227 private:
228 double fit_n_;
229 double fit_p_;
230 };
231
232
234 {
236
237 public:
238 trapped_charge_scattering_parameters() : base_type(true), fit_n_(1.0), fit_p_(1.0) {}
239
241 {
242 return (ctype == viennashe::ELECTRON_TYPE_ID) ? fit_n_ : fit_p_;
243 }
244
246 {
247 if (ctype == viennashe::ELECTRON_TYPE_ID)
248 fit_n_ = value;
249 else
250 fit_p_ = value;
251 }
252
253 private:
254 double fit_n_;
255 double fit_p_;
256 };
257
259 {
261
262 public:
263 fixed_charge_scattering_parameters() : base_type(false), fit_n_(1.0), fit_p_(1.0) {}
264
266 {
267 return (ctype == viennashe::ELECTRON_TYPE_ID) ? fit_n_ : fit_p_;
268 }
269
271 {
272 if (ctype == viennashe::ELECTRON_TYPE_ID)
273 fit_n_ = value;
274 else
275 fit_p_ = value;
276 }
277
278 private:
279 double fit_n_;
280 double fit_p_;
281 };
282
283
285 {
287
288 public:
289 surface_scattering_parameters() : base_type(false), fit_n_(1.0), fit_p_(1.0) {}
290
291 // TODO: ... this is for electrons
292 double first_factor(viennashe::carrier_type_id) const { return 122238.00206847844; /* s V/m */ }
293
294 // TODO: ... this is for electrons
295 double second_factor(viennashe::carrier_type_id) const { return 2.5541436127255013; /* s V^1/3 * m^-1/3 */ }
296
297 // TODO: ... this is for electrons
298 double third_factor(viennashe::carrier_type_id) const { return 1.485497231030198e-12; /* m^2 * V^-2 s^-1 */ }
299
300 double cutoff_distance() const { return 10e-9 ; /* m */ }
301
303 {
304 return (ctype == viennashe::ELECTRON_TYPE_ID) ? fit_n_ : fit_p_;
305 }
306
308 {
309 if (ctype == viennashe::ELECTRON_TYPE_ID)
310 fit_n_ = value;
311 else
312 fit_p_ = value;
313 }
314
315 private:
316 double fit_n_;
317 double fit_p_;
318 };
319
320#ifdef VIENNASHE_USE_DISABLED_CODE
321 struct surface_roughness_scattering_parameters
322 {
323
324 // TODO: ... this is for electrons
325 double get_rms_height(viennashe::carrier_type_id) const { return 15e-10; /* m */ }
326
327 // TODO: ... this is for electrons
328 double get_correlation_length(viennashe::carrier_type_id) const { return 29e-10; /* m */ }
329
330 double get_fit_factor() const { return 1.0; }
331 };
332
333
334 struct surface_acoustic_phonon_scattering_parameters
335 {
336 double get_mass_density(viennashe::carrier_type_id) const { return 2330.0; /* kg/m^3 */ } // TODO: only for silicon (generalize)
337
338 double get_longitudinal_sound_velocity(viennashe::carrier_type_id) const { return 9040.0; /* m/s */ }
339
340 double get_deformation_potential(viennashe::carrier_type_id ctype) const
341 {
342 if (ctype == viennashe::ELECTRON_TYPE_ID)
343 return 8.9 * viennashe::physics::constants::q; /* Joule */
344 else
346 }
347
348 // TODO: holes ... this is for electrons
349 double get_potential_well_strength(viennashe::carrier_type_id) const { return 13.1; }
350
351 double get_fit_factor() const { return 1.0; }
352 };
353#endif
354
355
357
358
361 {
362 public:
363 scatter_config() : scatter_ee_(false) {}
364
365 // Scattering:
367 acoustic_phonon_scattering_parameters const & acoustic_phonon() const { return scatter_ac_; }
370
372 optical_phonon_scattering_parameters const & optical_phonon() const { return scatter_op_; }
375
377 ionized_impurity_scattering_parameters const & ionized_impurity() const { return scatter_imp_; }
380
382 impact_ionization_scattering_parameters const & impact_ionization() const { return scatter_impact_; }
385
387 bool electron_electron() const { return scatter_ee_; }
389 void electron_electron(bool b) { scatter_ee_ = b; }
390
392 fixed_charge_scattering_parameters const & fixed_charge() const { return scatter_fixed_charge_; }
394 fixed_charge_scattering_parameters & fixed_charge() { return scatter_fixed_charge_; }
395
397 trapped_charge_scattering_parameters const & trapped_charge() const { return scatter_trapped_charge_; }
399 trapped_charge_scattering_parameters & trapped_charge() { return scatter_trapped_charge_; }
400
402 surface_scattering_parameters const & surface() const { return scatter_surf_; }
404 surface_scattering_parameters & surface() { return scatter_surf_; }
405
406 private:
411 bool scatter_ee_; // electron-electron scattering, TODO: Add parameter class
412 fixed_charge_scattering_parameters scatter_fixed_charge_;
413 trapped_charge_scattering_parameters scatter_trapped_charge_;
414 surface_scattering_parameters scatter_surf_;
415 };
416
417
418
419 }
420
421
422}
423
424#endif
Parameters for elastic acoustic phonon scattering.
Definition: config.hpp:51
double get_fit_factor(viennashe::carrier_type_id ctype) const
Definition: config.hpp:67
double get_mass_density(viennashe::carrier_type_id) const
Definition: config.hpp:57
double get_longitudinal_sound_velocity(viennashe::carrier_type_id) const
Definition: config.hpp:58
double get_deformation_potential(viennashe::carrier_type_id ctype) const
Definition: config.hpp:59
void set_fit_factor(viennashe::carrier_type_id ctype, double value)
Definition: config.hpp:73
double get_fit_factor(viennashe::carrier_type_id ctype) const
Definition: config.hpp:265
void set_fit_factor(viennashe::carrier_type_id ctype, double value)
Definition: config.hpp:270
void set_fit_factor(viennashe::carrier_type_id ctype, double value)
Definition: config.hpp:219
double get_fit_factor(viennashe::carrier_type_id ctype) const
Definition: config.hpp:214
Parameters for ionized impurity scattering using an isotropic fit, cf. papers by Jungemann.
Definition: config.hpp:120
double fit_factor(double NI, bool is_donor_dominated, viennashe::carrier_type_id ctype) const
Definition: config.hpp:126
Parameters for inelastic optical phonon scattering in single valley approximation.
Definition: config.hpp:89
double get_mass_density(viennashe::carrier_type_id) const
Definition: config.hpp:95
double get_fit_factor(viennashe::carrier_type_id ctype) const
Definition: config.hpp:99
void set_fit_factor(viennashe::carrier_type_id ctype, double value)
Definition: config.hpp:105
double get_coupling_constant(viennashe::carrier_type_id) const
Definition: config.hpp:97
A configuration class for scattering mechanisms. Enable or disable scattering mechanisms here.
Definition: config.hpp:361
optical_phonon_scattering_parameters & optical_phonon()
Returns the parameters for optical phonon scattering. Non-const-version.
Definition: config.hpp:374
acoustic_phonon_scattering_parameters & acoustic_phonon()
Returns the parameters for acoustic phonon scattering. Non-const-version.
Definition: config.hpp:369
ionized_impurity_scattering_parameters const & ionized_impurity() const
Returns the parameters for ionized impurity scattering. Const-version.
Definition: config.hpp:377
fixed_charge_scattering_parameters & fixed_charge()
Returns the parameters for fixed charge scattering. Non-const-version.
Definition: config.hpp:394
impact_ionization_scattering_parameters const & impact_ionization() const
Returns the parameters for impact ionization scattering. Const-version.
Definition: config.hpp:382
surface_scattering_parameters const & surface() const
Returns the parameters for surface scattering. Const-version.
Definition: config.hpp:402
surface_scattering_parameters & surface()
Returns the parameters for surface scattering. Non-const-version.
Definition: config.hpp:404
void electron_electron(bool b)
Enables/Disables electron-electron scattering.
Definition: config.hpp:389
acoustic_phonon_scattering_parameters const & acoustic_phonon() const
Returns the parameters for acoustic phonon scattering. Const-version.
Definition: config.hpp:367
trapped_charge_scattering_parameters & trapped_charge()
Returns the parameters for fixed charge scattering. Non-const-version.
Definition: config.hpp:399
trapped_charge_scattering_parameters const & trapped_charge() const
Returns the parameters for fixed charge scattering. Const-version.
Definition: config.hpp:397
optical_phonon_scattering_parameters const & optical_phonon() const
Returns the parameters for optical phonon scattering. Const-version.
Definition: config.hpp:372
bool electron_electron() const
Returns true if electron-electron scattering is activated.
Definition: config.hpp:387
impact_ionization_scattering_parameters & impact_ionization()
Returns the parameters for impact ionization scattering. Non-const-version.
Definition: config.hpp:384
ionized_impurity_scattering_parameters & ionized_impurity()
Returns the parameters for ionized impurity scattering. Non-const-version.
Definition: config.hpp:379
fixed_charge_scattering_parameters const & fixed_charge() const
Returns the parameters for fixed charge scattering. Const-version.
Definition: config.hpp:392
Common base class for all scattering parameter classes. Provides enable/disable interface.
Definition: config.hpp:38
double second_factor(viennashe::carrier_type_id) const
Definition: config.hpp:295
void set_fit_factor(viennashe::carrier_type_id ctype, double value)
Definition: config.hpp:307
double first_factor(viennashe::carrier_type_id) const
Definition: config.hpp:292
double get_fit_factor(viennashe::carrier_type_id ctype) const
Definition: config.hpp:302
double third_factor(viennashe::carrier_type_id) const
Definition: config.hpp:298
double get_fit_factor(viennashe::carrier_type_id ctype) const
Definition: config.hpp:240
void set_fit_factor(viennashe::carrier_type_id ctype, double value)
Definition: config.hpp:245
Contains forward declarations and definition of small classes that must be defined at an early stage.
A logging facility providing fine-grained control over logging in ViennaSHE.
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.
static const double q
Elementary charge.
Definition: constants.hpp:44