1#ifndef VIENNASHE_MODELS_MOBILITY_MODEL_HPP
2#define VIENNASHE_MODELS_MOBILITY_MODEL_HPP
30#include "viennagrid/mesh/mesh.hpp"
31#include "viennagrid/algorithm/norm.hpp"
32#include "viennagrid/algorithm/centroid.hpp"
33#include "viennagrid/mesh/coboundary_iteration.hpp"
50 namespace mobility_detail
63 return this->calculateMobilityLatticeScattering(mu, T);
74 double calculateMobilityLatticeScattering(
double mu,
double T)
const
76 if ( _params.
T_ref == 0.0 )
79 return mu * pow(T / _params.
T_ref, -_params.
alpha);
93 return this->calculateMobilityIonizedImpurityScattering(mu, total_doping);
104 double calculateMobilityIonizedImpurityScattering(
double mu,
double total_doping)
const
106 if ( _params.
N_ref == 0.0 )
108 if ( _params.
mu_min < 0.0 )
110 if ( total_doping <= 0.0 )
113 double N_sum = 1.0 * total_doping;
116 double N_adjust = pow(N_sum / _params.
N_ref, _params.
alpha);
117 return _params.
mu_min + (mu - _params.
mu_min) / (1 + N_adjust);
127 double operator()(
double mu,
double distance_to_insulator,
double E_n)
const
131 return this->calculateMobilitySurfaceScattering(mu, distance_to_insulator, E_n);
142 double calculateMobilitySurfaceScattering(
double mu,
double distance_to_insulator,
double E_n)
const
146 if ( _params.
E_ref == 0.0 )
148 if ( _params.
mu_ref < 0.0 )
150 if ( distance_to_insulator < 0.0 )
153 double depth = distance_to_insulator;
156 double depth_dependence = 2.0 * exp(-pow(depth / _params.
depth_ref, 2)) / (1 + exp(-2.0 * pow(depth / _params.
depth_ref, 2)));
173 return this->calculateFieldDependentMobility(mu, T, E_n);
184 double get_saturation_velocity(
double T)
const
189 double calculateFieldDependentMobility(
double mu,
double T,
double E_n)
const
192 double v_sat = this->get_saturation_velocity(T);
193 double beta = _params.
beta;
200 double h = pow(pow(2.0 * F * mu / v_sat, beta) + 1.0, beta) + 1.0;
213 template <
typename DeviceType >
217 typedef typename DeviceType::mesh_type MeshType;
218 typedef typename viennagrid::result_of::point<MeshType>::type PointType;
219 typedef typename viennagrid::result_of::facet<MeshType>::type FacetType;
220 typedef typename viennagrid::result_of::cell<MeshType>::type CellType;
235 template <
typename PotentialAccessor >
238 typedef typename viennagrid::result_of::const_coboundary_range<MeshType, FacetType, CellType>::type CellOnFacetContainer;
239 typedef typename viennagrid::result_of::iterator<CellOnFacetContainer>::type CellOnFacetIterator;
241 CellOnFacetContainer cells_on_facet(_device.mesh(), viennagrid::handle(_device.mesh(), facet));
243 CellOnFacetIterator cofit = cells_on_facet.begin();
244 CellType
const & c1 = *cofit;
246 CellType
const & c2 = *cofit;
258 template <
typename PotentialAccessor >
266 const double TL = _device.get_lattice_temperature(c1);
267 const double total_doping_on_cell = (_device.get_doping_n(c1) + _device.get_doping_p(c1));
268 const double edge_len =
viennagrid::norm_2( viennagrid::centroid(c2) - viennagrid::centroid(c1) );
271 double mu = _params.mu0;
274 mu = lattice (mu, TL);
275 mu = impurity(mu, total_doping_on_cell );
289 mu = field (mu, TL, Emag);
296 const DeviceType & _device;
Defines the physical properties of a device, e.g. doping. This is the implementation for 2d and highe...
mobility_field_dependence(const field_dependence ¶ms)
double operator()(double mu, double T, double E_n) const
double operator()(double mu, double total_doping) const
mobility_impurity_scattering(const impurity_scattering ¶ms)
mobility_lattice_scattering(const lattice_scattering ¶ms)
double operator()(double mu, double T) const
double operator()(double mu, double distance_to_insulator, double E_n) const
mobility_surface_scattering(const surface_scattering ¶ms)
The main mobility model. Contains submodels for lattice, impurity, field and surface scattering relat...
value_type operator()(const CellType &c1, const CellType &c2, PotentialAccessor const &potential) const
Returns the mobility from a vertex to another vertex. Usage of the other, edge related,...
mobility(const mobility &mob)
value_type operator()(const FacetType &facet, PotentialAccessor const &potential) const
Returns the mobility along a facet.
mobility(const DeviceType &device, const mobility_paramters ¶ms)
Thrown whenever an invalid parameter to a model is given.
Contains forward declarations and definition of small classes that must be defined at an early stage.
Contains PODs for the mobility parameters of the mobility models.
Contains exceptions for viennashe::models.
VectorType::value_type norm_2(VectorType const &v)
The main ViennaSHE namespace. All functionality resides inside this namespace.
Provides a number of fundamental constants. All constants in SI units.
The combined POD for the mobility parameters.