ViennaSHE 1.3.0
Free open-source semiconductor device simulator using spherical harmonics expansions techniques.
surface_acoustic_phonon_scattering.hpp
Go to the documentation of this file.
1#ifndef VIENNASHE_SHE_SCATTERING_SURFACE_ACOUSTIC_PHONON_SCATTERING_HPP
2#define VIENNASHE_SHE_SCATTERING_SURFACE_ACOUSTIC_PHONON_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#ifdef VIENNASHE_USE_DISABLED_CODE
19
20// viennashe
26
28
29#include "viennashe/log/log.hpp"
32
33// viennagrid
34#include "viennagrid/forwards.h"
35#include "viennagrid/algorithm/inner_prod.hpp"
36#include "viennagrid/algorithm/norm.hpp"
37
42namespace viennashe
43{
44 namespace she
45 {
46
51 template <typename DeviceType, typename ControllerType, typename ElectricFieldAccessor>
52 class surface_acoustic_phonon_scattering : public scattering_base<DeviceType, ControllerType>
53 {
54 typedef scattering_base<DeviceType, ControllerType> base_type;
55 typedef typename base_type::FacetType FacetType;
56 typedef typename base_type::CellType CellType;
57
58 public:
59 typedef typename base_type::scatter_processes_type scatter_processes_type;
60 typedef scatter_processes_type value_type;
61
62 explicit surface_acoustic_phonon_scattering(const viennashe::materials::surface_acoustic_phonon_scattering_parameters & params,
63 ElectricFieldAccessor const & Efield)
64 : _params(params), _Efield(Efield) { }
65
66
67 scatter_processes_type operator()(DeviceType const & device,
68 ControllerType const & controller,
69 VertexType const & elem,
70 double kinetic_energy,
72 {
73 return get(device, controller, elem, kinetic_energy, ctype);
74 }
75
76 scatter_processes_type operator()(DeviceType const & device,
77 ControllerType const & controller,
78 EdgeType const & elem,
79 double kinetic_energy,
81 {
82 return get(device, controller, elem, kinetic_energy, ctype);
83 }
84
86
87 protected:
88
100 template <typename ElementType>
101 scatter_processes_type get(DeviceType const & device,
102 ControllerType const & controller,
103 ElementType const & elem,
104 double kinetic_energy,
105 viennashe::carrier_type_id ctype) const
106 {
107 scatter_processes_type result(1);
108
109 // Final energy is always equal to initial energy:
110 result[0].initial_energy(kinetic_energy);
111 result[0].final_energy(kinetic_energy);
112 result[0].rate(getScatteringRate(device, controller, elem, kinetic_energy, ctype));
113
114 return result;
115 }
116
117 template <typename DeviceType, typename ControllerType, typename ElementType>
118 double getScatteringRate(DeviceType const & device,
119 ControllerType const & controller,
120 ElementType const & elem,
121 double kinetic_energy,
122 viennashe::carrier_type_id ctype) const
123 {
124 const double temp = device.get_lattice_temperature(elem);
125 const double Ep = this->get_electric_field_n(device, elem);
126
127 double rate = this->getScatteringRate(temp, Ep, ctype);
128
129 // check if the rate is numerically zero
130 if ( std::abs(rate) < std::numeric_limits<double>::epsilon() ) rate = 0.0; // assign zero to ensure matrix sparsity
131
132 return rate;
133 }
134
135 template < typename DeviceType >
136 double get_electric_field_n(DeviceType const & device,
137 typename viennagrid::result_of::ncell<typename DeviceType::mesh_type::config_type, 0 > ::type const & vt) const
138 {
139 typedef typename DeviceType::mesh_type MeshType;
140 typedef typename MeshType::config_type Config;
141 typedef typename Config::cell_tag CellTag;
142 typedef typename viennagrid::result_of::point<Config>::type PointType;
143
144 PointType E;
145 typename ElectricFieldAccessor::value_type Eacc = _Efield(vt);
146 for ( std::size_t i = 0; i < PointType::dim; i++) E[i] = Eacc[i];
147
148 PointType n = device.vector_to_next_insulator(vt);
149 const double distance = viennagrid::norm_2(n);
150 if ( distance > 0) n /= distance; // normalise
151
152 return viennagrid::inner_prod(E, n); // projection on the vector towards the interface
153 }
154
155 template < typename DeviceType >
156 double get_electric_field_n(DeviceType const & device,
157 typename viennagrid::result_of::ncell<typename DeviceType::mesh_type::config_type, 1 > ::type const & edge) const
158 {
159 typedef typename DeviceType::mesh_type MeshType;
160 typedef typename MeshType::config_type Config;
161 typedef typename Config::cell_tag CellTag;
162 typedef typename viennagrid::result_of::point<Config>::type PointType;
163 typedef typename viennagrid::result_of::ncell<typename DeviceType::mesh_type::config_type, 0 > ::type VertexType;
164
165 const double Emag = _Efield(edge); // field along the edge
166 VertexType const & vt1 = viennagrid::ncells < 0 > (edge)[0];
167 VertexType const & vt2 = viennagrid::ncells < 0 > (edge)[1];
168
169 PointType n = 0.5 * ( device.vector_to_next_insulator(vt1) + device.vector_to_next_insulator(vt2) );
170 const double distance = viennagrid::norm_2(n);
171 if ( distance > 0) n /= distance; // normalise
172
173 PointType E = (vt2.point() - vt1.point()) ;
174 if (viennagrid::norm_2(E) > 0) E /= viennagrid::norm_2(E);
175 E *= Emag;
176 return viennagrid::inner_prod(E, n); // projection on the vector towards the interface
177 }
178
179 double getSurfaceInversionLayerWidth(const double T, const double Ep, viennashe::carrier_type_id ctype) const
180 {
181 const double q = viennashe::physics::constants::q;
182 const double kB = viennashe::physics::constants::kB;
183 const double delta = _params.get_potential_well_strength(ctype);
184 const double hbar = viennashe::physics::constants::hbar;
185 const double mstar = viennashe::materials::si::dos_effective_mass(ctype);
186
187 if (Ep == 0.0) return 0.0; // avoid division by zero ... in the limit of Ep -> 0 this is 0 anyway
188 return q / (3.0 * kB * T / (2.0 * Ep) + delta * std::pow((hbar * q * hbar * q) / (mstar * Ep), 1.0 / 3.0)); // 1/m
189 }
190
191 double getScatteringRate(const double T, const double Ep, viennashe::carrier_type_id ctype) const
192 {
193 const double kB = viennashe::physics::constants::kB;
194 const double hbar = viennashe::physics::constants::hbar;
195 const double ul = _params.get_longitudinal_sound_velocity(ctype);
196 const double E1 = _params.get_deformation_potential(ctype);
197 const double rho = _params.get_mass_density(ctype);
198 const double pi = viennashe::math::constants::pi;
199
200 if (Ep == 0.0) return 0.0; // avoid division by zero
201
202 // MUST NOT include density of states and/or N_op
203 double scattering_rate = 2.0 * pi * kB * T * E1 * E1 / (hbar * ul * ul * rho);
204 scattering_rate = scattering_rate * this->getSurfaceInversionLayerWidth(T, Ep, ctype);
205
206 //log::debug<log_acoustic_phonon_scattering>() << "acoustical phonon: " << scattering_rate << std::endl;
207
208 return _params.get_fit_factor() * scattering_rate;
209 }
210
211 private:
212
213 viennashe::materials::surface_acoustic_phonon_scattering_parameters _params;
214 ElectricFieldAccessor const & _Efield;
215
216
217 };
218
219 } //namespace she
220} //namespace viennashe
221
222
223#endif
224
225#endif
Contains the definition of per-device accessors (read-only!) for various quantities.
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.
Provides a number of fundamental math constants.
VectorType::value_type norm_2(VectorType const &v)
Definition: linalg_util.hpp:37
@ SURFACE_ACOUSTIC_PHONON_SCATTERING
Definition: common.hpp:44
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
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 dos_effective_mass(viennashe::carrier_type_id ctype)
Definition: all.hpp:58
static const double pi
Pi.
Definition: constants.hpp:34
static const double q
Elementary charge.
Definition: constants.hpp:44
static const double kB
Boltzmann constant.
Definition: constants.hpp:46
static const double hbar
Modified Planck constant.
Definition: constants.hpp:50
Defines the log keys used within the viennashe::she namespace.
Common classes for scattering operators.