ViennaSHE 1.3.0
Free open-source semiconductor device simulator using spherical harmonics expansions techniques.
impurity_scattering.hpp
Go to the documentation of this file.
1#ifndef VIENNASHE_SHE_SCATTERING_IMPURITY_SCATTERING_HPP
2#define VIENNASHE_SHE_SCATTERING_IMPURITY_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"
28
33namespace viennashe
34{
35 namespace she
36 {
37
38
43 template <typename DeviceType>
45 {
47 typedef typename base_type::FacetType FacetType;
48 typedef typename base_type::CellType CellType;
49
50 public:
53
54 explicit ionized_impurity_scattering(DeviceType const & device,
55 viennashe::config const & conf) : base_type(device, conf), params_(conf.scattering().ionized_impurity()) { }
56
58 double kinetic_energy,
60 {
61 return this->get(elem, kinetic_energy, ctype);
62 }
63
65 double kinetic_energy,
67 {
68 return this->get(elem, kinetic_energy, ctype);
69 }
70
72
73 private:
74
83 template <typename ElementType>
84 scatter_processes_type get(ElementType const & elem,
85 double kinetic_energy,
87 {
88 scatter_processes_type result(1);
89
90 // Final energy is always equal to initial energy:
91 result[0].initial_energy(kinetic_energy);
92 result[0].final_energy(kinetic_energy);
93 result[0].rate( getScatteringRate(elem, kinetic_energy, ctype) );
94 result[0].generation_rate(0);
95
96 return result;
97 }
98
99
100 template <typename ElementType>
101 double getScatteringRate(ElementType const & elem,
102 double kinetic_energy,
103 viennashe::carrier_type_id ctype) const
104 {
105 double ND = base_type::device_.get_doping_n(elem);
106 double NA = base_type::device_.get_doping_p(elem);
107 const double temp = base_type::device_.get_lattice_temperature(elem);
108
109 double NI = NA + ND;
110
111 return getScatteringRate(NI, kinetic_energy, temp, ctype);
112 }
113
114 double getScatteringRate(double NI,
115 double kinetic_energy, double T, viennashe::carrier_type_id ctype) const
116 {
117 const double kB = viennashe::physics::constants::kB;
118 const double hbar = viennashe::physics::constants::hbar;
119 const double q = viennashe::physics::constants::q;
120 const double eps = viennashe::materials::si::permittivity();
121 const double pi = viennashe::math::constants::pi;
122
123 const double prefactor = (2.0 * pi * NI * q * q * q * q) / (hbar * eps * eps);
124
125 const double norm_k = base_type::conf_.dispersion_relation(ctype).norm_k(kinetic_energy);
126
127 //avoid singularity in the following expression
128 if (norm_k <= 0.0)
129 return 0.0;
130
131 const double lambda_sq = (eps * kB * T) / (q * q * NI );
132 const double a = 4.0 * lambda_sq * norm_k * norm_k;
133
134 const double scattering_rate = prefactor
135 * 0.5 * (std::log(1.0 + a) - (a / (1.0 + a)) ) / 4.0 / std::pow(norm_k, 4.0);
136
137 if (scattering_rate < 0.0) //the above formula may in some corner cases become negative, so we truncate it
138 return 0.0;
139
140 return scattering_rate;
141 }
142
143 ionized_impurity_scattering_parameters params_;
144
145 };
146
147 } //namespace she
148} //namespace viennashe
149
150#endif
151
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 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
Ionized impurity scattering process.
base_type::scatter_processes_type scatter_processes_type
ionized_impurity_scattering(DeviceType const &device, viennashe::config const &conf)
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
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.
@ IMPURITY_SCATTERING
Definition: common.hpp:42
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.