ViennaSHE 1.3.0
Free open-source semiconductor device simulator using spherical harmonics expansions techniques.
optical_phonon_scattering.hpp
Go to the documentation of this file.
1#ifndef VIENNASHE_SHE_SCATTERING_OPTICAL_PHONON_SCATTERING_HPP
2#define VIENNASHE_SHE_SCATTERING_OPTICAL_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// viennashe
24
25#include "viennashe/log/log.hpp"
27
28
33namespace viennashe
34{
35 namespace she
36 {
37
38
44 template <typename DeviceType>
45 class optical_phonon_scattering : public scattering_base<DeviceType>
46 {
48 typedef typename base_type::FacetType FacetType;
49 typedef typename base_type::CellType CellType;
50
51 public:
54
63 viennashe::config const & conf,
64 double energy_grid_spacing = 0)
65 : base_type(device, conf),
66 params_(conf.scattering().optical_phonon()),
67 hbaromega_(params_.get_phonon_energy())
68 {
69 // we have to map the phonon energy to multiples of the grid, otherwise there is an inconsistency with thermal equilibrium
70 if (energy_grid_spacing > 0)
71 {
72 std::size_t grid_steps = static_cast<std::size_t>(hbaromega_ / energy_grid_spacing);
73 double error_0 = hbaromega_ - grid_steps * energy_grid_spacing;
74 double error_1 = (grid_steps + 1.0) * energy_grid_spacing - hbaromega_;
75 if (error_1 < error_0)
76 ++grid_steps;
77
78 // Now set new parameters:
79 hbaromega_ = grid_steps * energy_grid_spacing;
80 }
81 }
82
84 double kinetic_energy,
86 {
87 return get(elem, kinetic_energy, ctype);
88 }
89
91 double kinetic_energy,
93 {
94 return get(elem, kinetic_energy, ctype);
95 }
96
98
99
101 double energy() const { return hbaromega_; }
102
107 void energy(double energy) { hbaromega_ = energy; }
108
110
111 private:
112
121 template <typename ElementType>
122 scatter_processes_type get(ElementType const & elem,
123 double kinetic_energy,
124 viennashe::carrier_type_id ctype) const
125 {
126 scatter_processes_type result(4);
127
128 // Update the optical phonon number
129 const double T = base_type::device_.get_lattice_temperature(elem);
130 const double N_op = viennashe::physics::get_optical_phonon_number(hbaromega_, T);
131
132 // Emit phonon
133 result[0].initial_energy(kinetic_energy);
134 result[0].final_energy(kinetic_energy - hbaromega_);
135 result[0].rate( getScatteringRate(ctype) * (N_op + 1.0) );
136 result[0].generation_rate(0);
137
138 result[1].initial_energy(kinetic_energy + hbaromega_);
139 result[1].final_energy(kinetic_energy);
140 result[1].rate( getScatteringRate(ctype) * (N_op + 1.0) );
141 result[1].generation_rate(0);
142
143 // Capture phonon
144 result[2].initial_energy(kinetic_energy);
145 result[2].final_energy(kinetic_energy + hbaromega_);
146 result[2].rate( getScatteringRate(ctype) * N_op );
147 result[2].generation_rate(0);
148
149 result[3].initial_energy(kinetic_energy - hbaromega_);
150 result[3].final_energy(kinetic_energy);
151 result[3].rate( getScatteringRate(ctype) * N_op );
152 result[3].generation_rate(0);
153
154 return result;
155 }
156
162 double getScatteringRate(viennashe::carrier_type_id ctype) const
163 {
164 const double hbar = viennashe::physics::constants::hbar;
165 const double pi = viennashe::math::constants::pi;
166 const double rho = params_.get_mass_density(ctype);
167
168 const double DtK = params_.get_coupling_constant(ctype);
169
170 const double scattering_rate = pi * DtK * DtK * hbar / (2.0 * rho * hbaromega_);
171
172 //MUST NOT include density of states and/or N_op
173
175 log::debug<log_optical_phonon_scattering>() << "optical phonon: " << scattering_rate << std::endl;
176
177 //return scattering_rate;
178 return params_.get_fit_factor(ctype) * scattering_rate;
179 }
180
181 optical_phonon_scattering_parameters params_;
182 double hbaromega_;
183 };
184
185
186 } //namespace she
187} //namespace viennashe
188
189
190#endif
191
The main SHE configuration class. To be adjusted by the user for his/her needs.
Definition: config.hpp:124
Defines the physical properties of a device, e.g. doping. This is the implementation for 2d and highe...
Definition: device.hpp:818
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
double get_coupling_constant(viennashe::carrier_type_id) const
Definition: config.hpp:97
base_type::scatter_processes_type scatter_processes_type
scatter_processes_type operator()(FacetType const &elem, double kinetic_energy, viennashe::carrier_type_id ctype) const
double energy() const
Inelastic energy that is either gained or lost at scattering.
optical_phonon_scattering(DeviceType const &device, viennashe::config const &conf, double energy_grid_spacing=0)
Constructs the optical phonon scattering object. Takes the phonon energy as parameter.
void energy(double energy)
Modifies/Sets the inelastic scattering energy lost or gained.
scatter_processes_type operator()(CellType const &elem, double kinetic_energy, viennashe::carrier_type_id ctype) const
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
DeviceType const & device_
Definition: common.hpp:108
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.
double get_optical_phonon_number(double eps_optical, double temperature=300.0)
Returns the optical phonon number for use with optical phonon scattering.
Definition: physics.hpp:71
@ OPTICAL_PHONON_SCATTERING
Definition: common.hpp:43
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 const double pi
Pi.
Definition: constants.hpp:34
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.