1#ifndef G_MEDIUM_SILICON_H 
    2#define G_MEDIUM_SILICON_H 
  120                        const double bx, 
const double by, 
const double bz,
 
  121                        double& vx, 
double& vy, 
double& vz) 
override;
 
  123                        const double bx, 
const double by, 
const double bz,
 
  124                        double& alpha) 
override;
 
  126                          const double bx, 
const double by, 
const double bz,
 
  127                          double& eta) 
override;
 
  132                    const double bx, 
const double by, 
const double bz,
 
  133                    double& vx, 
double& vy, 
double& vz) 
override;
 
  135                    const double bx, 
const double by, 
const double bz,
 
  136                    double& alpha) 
override;
 
  138                      const double bx, 
const double by, 
const double bz,
 
  139                      double& eta) 
override;
 
  144                           double& vx, 
double& vy, 
double& vz,
 
  145                           const int band = 0) 
override;
 
  156                         double& dx, 
double& dy, 
double& dz,
 
  157                         std::vector<Secondary>& secondaries,
 
  173                           const unsigned int i = 0) 
override;
 
  175                             const unsigned int i = 0) 
override;
 
  283    std::vector<std::vector<double> > 
cf;
 
 
  342                               const double dp, 
Band& band);
 
  344                              const double dtk, 
const double eph, 
Band& band);
 
  346                                  const double dtk, 
const double eph,
 
  347                                  Band& bndI, 
Band& bndF, 
const double zF,
 
  350                       const std::vector<double>& eth,
 
  351                       const std::vector<double>& b, 
Band& band);
 
 
HighFieldMobility m_highFieldMobilityModel
virtual ~MediumSilicon()
Destructor.
double HoleMobility(const double e) const
void SetHighFieldMobilityModel(const std::string &model)
Set the parameterisation to be used for the drift velocity as function of the electric field.
void EnableNonParabolicity(const bool on=true)
std::vector< double > m_eps1
void UpdateHighFieldMobilityCanali()
bool AcousticScatteringRates(const double rho, const double kbt, const double dp, Band &band)
bool GetDielectricFunction(const double e, double &eps1, double &eps2, const unsigned int i=0) override
Get the complex dielectric function at a given energy.
double ElectronAlpha(const double e) const
SaturationVelocity m_saturationVelocityModel
void SetLatticeMobilityModelReggiani()
Calculate the lattice mobility using the Reggiani model.
std::vector< double > m_fbDosV
unsigned int m_nCollElectronAcoustic
std::vector< double > m_fbDosC
double HoleAlpha(const double e) const
bool ElectronScatteringRates()
void SetImpactIonisationModel(const std::string &model)
Set the parameterisation to be used for calculating the impact ionisation coefficient.
bool IonisationRates(const std::vector< double > &p, const std::vector< double > ð, const std::vector< double > &b, Band &band)
void SetDoping(const char type, const double c)
Set doping concentration [cm-3] and type ('i', 'n', 'p').
void SetImpactIonisationModelOkutoCrowell()
Calculate α using the Okuto-Crowell model.
void GetDoping(char &type, double &c) const
Retrieve doping concentration.
bool ElectronTownsend(const double ex, const double ey, const double ez, const double bx, const double by, const double bz, double &alpha) override
Ionisation coefficient [cm-1].
void SetHighFieldMobilityModelReggiani()
Parameterize the high-field mobility using the Reggiani model.
double GetElectronCollisionRate(const double e, const int band) override
Collision rate [ns-1] for given electron energy.
bool HoleVelocity(const double ex, const double ey, const double ez, const double bx, const double by, const double bz, double &vx, double &vy, double &vz) override
Drift velocity [cm / ns].
unsigned int GetNumberOfLevels() const
void SetSaturationVelocityModelReggiani()
Calculate the saturation velocities using the Reggiani model.
bool ElectronAttachment(const double ex, const double ey, const double ez, const double bx, const double by, const double bz, double &eta) override
Attachment coefficient [cm-1].
bool m_hasUserSaturationVelocity
void SetDopingMobilityModelMasetti()
Use the Masetti model for the doping-dependence of the mobility (default).
std::vector< unsigned int > m_nCollElectronBand
void SetTrapDensity(const double n)
Trap density [cm-3], by default set to zero.
unsigned int m_nCollElectronIntervalley
bool LoadOpticalData(const std::string &filename)
std::vector< unsigned int > m_nCollElectronDetailed
void SetHighFieldMobilityModelMinimos()
Parameterize the high-field mobility using the Minimos model.
MediumSilicon()
Constructor.
void SetSaturationVelocity(const double vsate, const double vsath)
Specify the saturation velocities of electrons and holes.
bool ElectronVelocity(const double ex, const double ey, const double ez, const double bx, const double by, const double bz, double &vx, double &vy, double &vz) override
Drift velocity [cm / ns].
void UpdateSaturationVelocity()
void ComputeSecondaries(const double e0, double &ee, double &eh)
void ResetCollisionCounters()
LatticeMobility m_latticeMobilityModel
double HoleMobility() override
Low-field mobility [cm2 V-1 ns-1].
void EnableAnisotropy(const bool on=true)
bool HoleScatteringRates()
unsigned int m_nCollElectronIonisation
std::string m_opticalDataFile
std::array< Band, 3 > m_cb
bool SetMaxElectronEnergy(const double e)
double ElectronMobility(const double e) const
bool HoleTownsend(const double ex, const double ey, const double ez, const double bx, const double by, const double bz, double &alpha) override
Ionisation coefficient [cm-1].
void SetHighFieldMobilityModelConstant()
Make the velocity proportional to the electric field (no saturation).
std::vector< double > m_eps2
std::vector< size_t > m_cbIndex
void SetLatticeMobilityModelSentaurus()
Calculate the lattice mobility using the Sentaurus model (default).
void SetSaturationVelocityModelCanali()
Calculate the saturation velocities using the Canali model (default).
void SetHighFieldMobilityModelCanali()
Parameterize the high-field mobility using the Canali model (default).
void GetElectronMomentum(const double e, double &px, double &py, double &pz, int &band) override
Sample the momentum vector for a given energy (only meaningful in semiconductors).
DopingMobility m_dopingMobilityModel
void SetImpactIonisationModelVanOverstraetenDeMan()
Calculate α using the van Overstraeten-de Man model (default).
void SetTrappingTime(const double etau, const double htau)
Set time constant for trapping of electrons and holes [ns].
void UpdateDopingMobilityMasetti()
void SetSaturationVelocityModelMinimos()
Calculate the saturation velocities using the Minimos model.
bool ImpurityScatteringRates(const double kbt, Band &band)
bool ElectronCollision(const double e, int &type, int &level, double &e1, double &dx, double &dy, double &dz, std::vector< Secondary > &secondaries, int &band) override
Sample the collision type. Update energy and direction vector.
void SetLowFieldMobility(const double mue, const double muh)
Specify the low field values of the electron and hole mobilities.
bool HoleAttachment(const double ex, const double ey, const double ez, const double bx, const double by, const double bz, double &eta) override
Attachment coefficient [cm-1].
std::vector< double > m_egamma
double GetMaxElectronEnergy() const
double GetElectronEnergy(const double px, const double py, const double pz, double &vx, double &vy, double &vz, const int band=0) override
Dispersion relation (energy vs. wave vector)
double ElectronMobility() override
Low-field mobility [cm2 V-1 ns-1].
void UpdateLatticeMobility()
unsigned int GetNumberOfElectronCollisions(const unsigned int level) const
unsigned int m_nCollElectronOptical
bool GetOpticalDataRange(double &emin, double &emax, const unsigned int i=0) override
Get the energy range [eV] of the available optical data.
double GetElectronNullCollisionRate(const int band) override
Null-collision rate [ns-1].
unsigned int m_nCollElectronImpurity
unsigned int GetNumberOfElectronCollisions() const
void SetLatticeMobilityModelMinimos()
Calculate the lattice mobility using the Minimos model.
bool IsSemiconductor() const override
Is this medium a semiconductor?
ImpactIonisation m_impactIonisationModel
void SetTrapCrossSection(const double ecs, const double hcs)
Trapping cross-sections for electrons and holes.
void EnableScatteringRateOutput(const bool on=true)
void SetDiffusionScaling(const double d)
Apply a scaling factor to the diffusion coefficients.
int GetElectronBandPopulation(const int band)
void SetLatticeMobilityModel(const std::string &model)
Set the parameterisation to be used for calculating the lattice mobility model.
bool OpticalScatteringRates(const double rho, const double kbt, const double dtk, const double eph, Band &band)
void SetImpactIonisationModelGrant()
Calculate α using the Grant model.
void SetDopingMobilityModelMinimos()
Use the Minimos model for the doping-dependence of the mobility.
void UpdateDopingMobilityMinimos()
void EnableFullBandDensityOfStates(const bool on=true)
void SetImpactIonisationModelMassey()
Calculate α using the Massey model.
unsigned int GetNumberOfElectronBands() const
void UpdateImpactIonisation()
bool IntervalleyScatteringRates(const double rho, const double kbt, const double dtk, const double eph, Band &bndI, Band &bndF, const double zF, const int collType)
std::vector< int > scatType
std::vector< double > energyLoss
std::vector< double > dos
std::vector< std::vector< double > > cf
std::vector< double > cfTot