ViennaSHE 1.3.0
Free open-source semiconductor device simulator using spherical harmonics expansions techniques.
fixed_charge_scattering.hpp
Go to the documentation of this file.
1#ifndef VIENNASHE_FIXED_CHARGE_SCATTERING_HPP
2#define VIENNASHE_FIXED_CHARGE_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#include <limits>
19
20#include "viennagrid/mesh/coboundary_iteration.hpp"
21
22// viennashe
29
30#include "viennashe/log/log.hpp"
34
39namespace viennashe
40{
41 namespace she
42 {
43
47 template <typename DeviceType>
48 class fixed_charge_scattering : public scattering_base<DeviceType>
49 {
51 typedef typename base_type::FacetType FacetType;
52 typedef typename base_type::CellType CellType;
53
54 public:
57
58 explicit fixed_charge_scattering(DeviceType const & device,
59 viennashe::config const & conf)
60 : base_type(device, conf), params_(conf.scattering().fixed_charge())
61 { }
62
64 double kinetic_energy,
66 {
67 return get(elem, kinetic_energy, ctype);
68 }
69
71 double kinetic_energy,
73 {
74 return get(elem, kinetic_energy, ctype);
75 }
76
77 protected:
78
87 template <typename ElementType>
88 scatter_processes_type get(ElementType const & elem,
89 double kinetic_energy,
91 {
92 scatter_processes_type result(1);
93
94 // Final energy is always equal to initial energy:
95 result[0].initial_energy(kinetic_energy);
96 result[0].final_energy(kinetic_energy);
97 result[0].rate( getScatteringRate(elem, kinetic_energy, ctype) );
98
99 return result;
100 }
101
102
103 template <typename ElementType>
104 double getScatteringRate(ElementType const & elem,
105 double kinetic_energy,
106 viennashe::carrier_type_id ctype) const
107 {
108 const double temp = base_type::device_.get_lattice_temperature(elem);
109 const double NI = this->get_charged_trap_density(elem, ctype);
110
111 double rate = getScatteringRate(NI, kinetic_energy, temp, ctype);
112
113 // check if the rate is numerically zero
114 if ( std::abs(rate) < std::numeric_limits<double>::epsilon() ) rate = 0.0; // assign zero to ensure matrix sparsity
115
116 return rate;
117 }
118
119
122 {
124 return fixed_charge(vt);
125 }
126
127
129 viennashe::carrier_type_id ctype) const
130 {
131 typedef typename viennagrid::result_of::const_coboundary_range<typename base_type::MeshType, FacetType, CellType>::type CellOnFacetContainer;
132
133 CellOnFacetContainer cells_on_facet(base_type::device_.mesh(), viennagrid::handle(base_type::device_.mesh(), facet));
134
135 CellType const & c1 = *(cells_on_facet.begin());
136 CellType const *other_cell_ptr = viennashe::util::get_other_cell_of_facet(base_type::device_.mesh(), facet, c1);
137
138 if (!other_cell_ptr)
139 return this->get_charged_trap_density(c1, ctype);
140
141 return std::sqrt(this->get_charged_trap_density(c1, ctype) *
142 this->get_charged_trap_density(*other_cell_ptr, ctype));
143 }
144
145
146 double getScatteringRate(double NI, double kinetic_energy, double T, viennashe::carrier_type_id ctype) const
147 {
148 const double pi = viennashe::math::constants::pi;
149 const double kB = viennashe::physics::constants::kB;
150 const double hbar = viennashe::physics::constants::hbar;
151 const double q = viennashe::physics::constants::q;
152 const double eps = viennashe::materials::si::permittivity();
153 double lambda_sq = 0.0;
154 double scattering_rate = 0.0;
155
156 const double norm_k = base_type::conf_.dispersion_relation(ctype).norm_k(kinetic_energy);
157 //avoid singularity in the following expression
158 if (norm_k <= 0.0 || NI <= 0.0) return 0.0;
159
160 const double prefactor = (2.0 * pi * NI * q * q * q * q) / (hbar * eps * eps);
161
162 lambda_sq = (eps * kB * T) / (q * q * NI) ;
163
164 const double a = 4.0 * lambda_sq * norm_k * norm_k;
165
166 scattering_rate = prefactor * params_.get_fit_factor(ctype)
167 * 0.5 * (std::log(1.0 + a) - (a / (1.0 + a)) ) / 4.0 / std::pow(norm_k, 4.0);
168
169 return scattering_rate;
170 }
171
173
174 private:
175
177 };
178
179 } //namespace she
180} //namespace viennashe
181
182
183#endif
184
Contains the definition of per-device accessors (read-only!) for various quantities.
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
Accessor for fixed charges.
Definition: accessors.hpp:273
double norm_k(double ekin, double theta=0, double phi=0) const
Returns the norm of the k-vector as a function of energy (and angles, eventually)....
Definition: dispersion.hpp:89
double get_fit_factor(viennashe::carrier_type_id ctype) const
Definition: config.hpp:265
Trapped charge scattering process.
double getScatteringRate(ElementType 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
double getScatteringRate(double NI, double kinetic_energy, double T, viennashe::carrier_type_id ctype) const
base_type::scatter_processes_type scatter_processes_type
scatter_processes_type get(ElementType const &elem, double kinetic_energy, viennashe::carrier_type_id ctype) const
Returns all possible final scattering states for a carrier with initial kinetic energy 'kin_energy' f...
double get_charged_trap_density(FacetType const &facet, viennashe::carrier_type_id ctype) const
fixed_charge_scattering(DeviceType const &device, viennashe::config const &conf)
double get_charged_trap_density(CellType const &vt, viennashe::carrier_type_id) const
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
viennashe::config const & conf_
Definition: common.hpp:109
DeviceType const & device_
Definition: common.hpp:108
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.
Miscellaneous utilities.
@ FIXED_CHARGE_SCATTERING
Definition: common.hpp:40
CellT const * get_other_cell_of_facet(MeshT const &mesh, FacetT const &facet, CellT const &cell)
Helper function returning a const-pointer to the 'second cell' of a facet, or NULL if there is no sec...
Definition: misc.hpp:196
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 permittivity()
Definition: all.hpp:53
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.