1#ifndef VIENNASHE_SHE_SCATTERING_IMPACT_IONIZATION_SCATTERING_HPP
2#define VIENNASHE_SHE_SCATTERING_IMPACT_IONIZATION_SCATTERING_HPP
41 template <
typename DeviceType>
56 double kinetic_energy,
59 return get(elem, kinetic_energy, ctype);
63 double kinetic_energy,
66 return get(elem, kinetic_energy, ctype);
82 template <
typename ElementType>
84 double kinetic_energy,
100 result[0].initial_energy( kinetic_energy );
102 result[0].rate( getScatteringRate(kinetic_energy,
104 result[0].generation_rate(0.0);
108 result[1].final_energy( kinetic_energy );
111 result[1].generation_rate( get_secondary_carrier_generation_rate(kinetic_energy) );
117 double get_secondary_carrier_generation_rate(
const double kinetic_energy)
const
121 return approximated_scattering_factor_n(kinetic_energy)
122 + approximated_scattering_factor_p(kinetic_energy);
126 double approximated_scattering_factor_n(
const double kinetic_energy)
const
128 const double a_low = 1.49e11;
129 const double a_high = 1.13e12;
130 const double b_low = 1.128;
131 const double b_high = 1.572;
137 if ( 1.128 <= kinetic_energy_eV )
139 log::debug<log_impact_ionization_scattering>() <<
"kinetic_energy = " << kinetic_energy_eV <<
" eV " << std::endl;
141 if ( kinetic_energy_eV < 1.750)
143 scat = a_low * ( kinetic_energy_eV - b_low ) * ( kinetic_energy_eV - b_low ) * ( kinetic_energy_eV - b_low ) ;
147 scat = a_high * ( kinetic_energy_eV - b_high ) * ( kinetic_energy_eV - b_high ) ;
154 double approximated_scattering_factor_p(
const double kinetic_energy)
const
161 const double eth1 = 1.125;
162 const double eth2 = 1.45;
163 const double A = 0.002e12;
164 const double B = 1.0e12;
173 if ( kinetic_energy_eV > eth1)
175 scat = A * std::pow( (kinetic_energy_eV - eth1) , 6 );
177 if ( kinetic_energy_eV > eth2)
179 scat += B * std::pow( (kinetic_energy_eV - eth2) , 4);
186 double getScatteringRate(
const double kinetic_energy,
189 const double eps = kinetic_energy;
194 if (summed_dos <= 0.0)
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;
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;
210 impact_ionization_scattering_parameters params_;
The main SHE configuration class. To be adjusted by the user for his/her needs.
viennashe::physics::dispersion_proxy dispersion_relation(viennashe::carrier_type_id ctype) const
Returns the dispersion relation for electrons.
Defines the physical properties of a device, e.g. doping. This is the implementation for 2d and highe...
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)
Impact ionization scattering process.
scatter_processes_type operator()(CellType const &elem, double kinetic_energy, viennashe::carrier_type_id ctype) const
scatter_process_id id() const
scatter_processes_type operator()(FacetType const &elem, double kinetic_energy, viennashe::carrier_type_id ctype) const
base_type::scatter_processes_type scatter_processes_type
impact_ionization_scattering(DeviceType const &device, viennashe::config const &conf)
scatter_processes_type value_type
std::vector< scatter_process_descriptor > scatter_processes_type
viennagrid::result_of::cell< MeshType >::type CellType
viennagrid::result_of::facet< MeshType >::type FacetType
viennashe::config const & conf_
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
The main ViennaSHE namespace. All functionality resides inside this namespace.
carrier_type_id
Enumeration type for selecting the carrier type.
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 q
Elementary charge.
Defines the log keys used within the viennashe::she namespace.
Common classes for scattering operators.