ViennaSHE 1.3.0
Free open-source semiconductor device simulator using spherical harmonics expansions techniques.
impact_ionization_scattering.hpp
Go to the documentation of this file.
1#ifndef VIENNASHE_SHE_SCATTERING_IMPACT_IONIZATION_SCATTERING_HPP
2#define VIENNASHE_SHE_SCATTERING_IMPACT_IONIZATION_SCATTERING_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
18// viennashe
23
24#include "viennashe/log/log.hpp"
27
32namespace viennashe
33{
34 namespace she
35 {
36
41 template <typename DeviceType>
43 {
45 typedef typename base_type::FacetType FacetType;
46 typedef typename base_type::CellType CellType;
47
48 public:
51
53 viennashe::config const & conf) : base_type(device, conf), params_(conf.scattering().impact_ionization()) {}
54
56 double kinetic_energy,
58 {
59 return get(elem, kinetic_energy, ctype);
60 }
61
63 double kinetic_energy,
65 {
66 return get(elem, kinetic_energy, ctype);
67 }
68
70
71 private:
72
82 template <typename ElementType>
83 scatter_processes_type get(ElementType const & /*elem*/,
84 double kinetic_energy,
86 {
87 scatter_processes_type result(2);
88
89 // What is II?
90 // An electron (primary) in the CB scatters with an electron (secondary) in the VB.
91 // The primary electron looses energy (from eps to (eps-e_gap)/3 and stays in the CB.
92 // The secondary electron is lifted from the VB over the bandgap into the CB: energy = (eps-e_gap)/3 (same as primary!).
93 // When the secondary electron is lifted to the CB a hole is left behind in the VB.
94 // This is the secondary hole. Its energy is (eps-e_gap)/3 (same as primary!)
95 // Of course we'd need also to account for the momentum (k-vector) conservation, but it turned out that the
96 // (eps-e_gap)/3 rule is a good approximation [Jungemann et al.].
97 // Thus we need to generate both carrier types and scatter the primary carrier!
98
99 // out-scattering:
100 result[0].initial_energy( kinetic_energy );
101 result[0].final_energy( (kinetic_energy - viennashe::materials::si::band_gap()) / 3.0 );
102 result[0].rate( getScatteringRate(kinetic_energy,
103 ctype) );
104 result[0].generation_rate(0.0);
105
106 // in-scattering (generates new carriers):
107 result[1].initial_energy( 3.0 * kinetic_energy + viennashe::materials::si::band_gap() );
108 result[1].final_energy( kinetic_energy );
109 result[1].rate( getScatteringRate(3.0 * kinetic_energy + viennashe::materials::si::band_gap(),
110 ctype) );
111 result[1].generation_rate( get_secondary_carrier_generation_rate(kinetic_energy) );
112
113 return result;
114 }
115
116
117 double get_secondary_carrier_generation_rate(const double kinetic_energy) const
118 {
119 // This makes the approximation apparent ... after scattering all three carriers have the same energy.
120
121 return approximated_scattering_factor_n(kinetic_energy) // from electron => electron + hole
122 + approximated_scattering_factor_p(kinetic_energy); // from hole => hole + electron
123 }
124
126 double approximated_scattering_factor_n(const double kinetic_energy) const
127 {
128 const double a_low = 1.49e11; // 1/s
129 const double a_high = 1.13e12; // 1/s
130 const double b_low = 1.128; // eV
131 const double b_high = 1.572; // eV
132
133 const double kinetic_energy_eV = kinetic_energy / viennashe::physics::constants::q; // Joule => eV
134
135 double scat = 0.0;
136
137 if ( 1.128 <= kinetic_energy_eV )
138 {
139 log::debug<log_impact_ionization_scattering>() << "kinetic_energy = " << kinetic_energy_eV << " eV " << std::endl;
140
141 if ( kinetic_energy_eV < 1.750)
142 {
143 scat = a_low * ( kinetic_energy_eV - b_low ) * ( kinetic_energy_eV - b_low ) * ( kinetic_energy_eV - b_low ) ;
144 }
145 else
146 {
147 scat = a_high * ( kinetic_energy_eV - b_high ) * ( kinetic_energy_eV - b_high ) ;
148 }
149 }
150 return scat;
151 }
152
154 double approximated_scattering_factor_p(const double kinetic_energy) const
155 {
156 double scat = 0;
157
158 const double kinetic_energy_eV = kinetic_energy / viennashe::physics::constants::q; // Joule => eV
159
160 // Fischetti
161 const double eth1 = 1.125; // eV
162 const double eth2 = 1.45; // eV
163 const double A = 0.002e12; // 1/s
164 const double B = 1.0e12; // 1/s
165
166 // from MONJU
167 //const double eth1 = 1.125; // eV
168 //const double eth2 = 1.45; // eV
169 //const double A = 0.5970318495776689; // 1/s // CHECK THIS
170 //const double B = 446661.31082650006; // 1/s // CHECK THIS
171
172 // Note that in the following the energy is in eV and everything in std::pow is normed to 1 eV
173 if ( kinetic_energy_eV > eth1)
174 {
175 scat = A * std::pow( (kinetic_energy_eV - eth1) /* / 1 eV */, 6 );
176 }
177 if ( kinetic_energy_eV > eth2)
178 {
179 scat += B * std::pow( (kinetic_energy_eV - eth2) /* / 1 eV */, 4);
180 }
181
182 return scat;
183 }
184
185
186 double getScatteringRate(const double kinetic_energy,
187 viennashe::carrier_type_id ctype) const
188 {
189 const double eps = kinetic_energy;
190
191 const double summed_dos = base_type::conf_.dispersion_relation(ctype).density_of_states(eps);// TODO: Sum DOS over ALL bands !!
192
193 //avoid singularity in the following expression
194 if (summed_dos <= 0.0)
195 {
196 //log::warn<log_impact_ionization_scattering>() << " Summed DOS <= 0.0 ## eps = " << eps << std::endl;
197 return 0.0;
198 }
199
200 if (ctype == ELECTRON_TYPE_ID)
201 {
202 log::debug<log_impact_ionization_scattering>() << " approximated_scattering_factor(kinetic_energy) / summed_dos = " << approximated_scattering_factor_n(kinetic_energy) / summed_dos << std::endl;
203 return approximated_scattering_factor_n(kinetic_energy) / summed_dos;
204 }
205
206 log::debug<log_impact_ionization_scattering>() << " approximated_scattering_factor(kinetic_energy) / summed_dos = " << approximated_scattering_factor_p(kinetic_energy) / summed_dos << std::endl;
207 return approximated_scattering_factor_p(kinetic_energy) / summed_dos;
208 }
209
210 impact_ionization_scattering_parameters params_;
211 };
212
213 } //namespace she
214} //namespace viennashe
215
216#endif
217
The main SHE configuration class. To be adjusted by the user for his/her needs.
Definition: config.hpp:124
viennashe::physics::dispersion_proxy dispersion_relation(viennashe::carrier_type_id ctype) const
Returns the dispersion relation for electrons.
Definition: config.hpp:266
Defines the physical properties of a device, e.g. doping. This is the implementation for 2d and highe...
Definition: device.hpp:818
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
scatter_processes_type operator()(CellType const &elem, double kinetic_energy, viennashe::carrier_type_id ctype) const
scatter_processes_type operator()(FacetType const &elem, double kinetic_energy, viennashe::carrier_type_id ctype) const
impact_ionization_scattering(DeviceType const &device, viennashe::config const &conf)
std::vector< scatter_process_descriptor > scatter_processes_type
Definition: common.hpp:90
viennagrid::result_of::cell< MeshType >::type CellType
Definition: common.hpp:87
viennagrid::result_of::facet< MeshType >::type FacetType
Definition: common.hpp:86
viennashe::config const & conf_
Definition: common.hpp:109
Contains the dispersion relations for different materials and different polarities.
A logging facility providing fine-grained control over logging in ViennaSHE.
A very simple material database. Needs to be replaced by something more versatile soon.
@ IMPACT_IONIZATION_SCATTERING
Definition: common.hpp:41
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 double band_gap()
Definition: all.hpp:99
static const double q
Elementary charge.
Definition: constants.hpp:44
Defines the log keys used within the viennashe::she namespace.
Common classes for scattering operators.