1#ifndef G_MEDIUM_SILICON_H
2#define G_MEDIUM_SILICON_H
23 void SetDoping(
const char type,
const double c);
25 void GetDoping(
char& type,
double& c)
const;
36 const double bx,
const double by,
const double bz,
37 double& vx,
double& vy,
double& vz)
override;
39 const double bx,
const double by,
const double bz,
40 double& alpha)
override;
42 const double bx,
const double by,
const double bz,
43 double& eta)
override;
46 bool HoleVelocity(
const double ex,
const double ey,
const double ez,
47 const double bx,
const double by,
const double bz,
48 double& vx,
double& vy,
double& vz)
override;
49 bool HoleTownsend(
const double ex,
const double ey,
const double ez,
50 const double bx,
const double by,
const double bz,
51 double& alpha)
override;
52 bool HoleAttachment(
const double ex,
const double ey,
const double ez,
53 const double bx,
const double by,
const double bz,
54 double& eta)
override;
117 double& vx,
double& vy,
double& vz,
118 const int band = 0)
override;
129 double& dx,
double& dy,
double& dz,
130 std::vector<std::pair<Particle, double> >& secondaries,
131 int& ndxc,
int& band)
override;
150 const unsigned int i = 0)
override;
152 const unsigned int i = 0)
override;
157 enum class LatticeMobility { Sentaurus = 0, Minimos, Reggiani };
158 enum class DopingMobility { Minimos = 0, Masetti };
159 enum class SaturationVelocity { Minimos = 0, Canali, Reggiani };
160 enum class HighFieldMobility { Minimos = 0, Canali, Reggiani, Constant };
161 enum class ImpactIonisation { VanOverstraeten = 0, Grant, Massey, Okuto };
166 double m_diffScale = 1.;
168 double m_bandGap = 1.12;
170 char m_dopingType =
'i';
171 double m_dopingConcentration = 0.;
175 double m_mLongX = 0.916;
176 double m_mTransX = 0.191;
178 double m_mLongL = 1.59;
179 double m_mTransL = 0.12;
181 double m_alphaX = 0.5;
182 double m_alphaL = 0.5;
184 double m_eLatticeMobility = 1.35e-6;
185 double m_hLatticeMobility = 0.45e-6;
187 double m_eMobility = 1.35e-6;
188 double m_hMobility = 0.45e-6;
190 double m_eBetaCanali = 1.109;
191 double m_hBetaCanali = 1.213;
192 double m_eBetaCanaliInv = 1. / 1.109;
193 double m_hBetaCanaliInv = 1. / 1.213;
195 double m_eSatVel = 1.02e-2;
196 double m_hSatVel = 0.72e-2;
198 double m_eHallFactor = 1.15;
199 double m_hHallFactor = 0.7;
202 double m_eTrapCs = 1.e-15;
203 double m_hTrapCs = 1.e-15;
204 double m_eTrapDensity = 0.;
205 double m_hTrapDensity = 0.;
206 double m_eTrapTime = 0.;
207 double m_hTrapTime = 0.;
208 int m_trappingModel = 0;
211 double m_eImpactA0 = 3.318e5;
212 double m_eImpactA1 = 0.703e6;
213 double m_eImpactA2 = 0.;
214 double m_eImpactB0 = 1.135e6;
215 double m_eImpactB1 = 1.231e6;
216 double m_eImpactB2 = 0.;
217 double m_hImpactA0 = 1.582e6;
218 double m_hImpactA1 = 0.671e6;
219 double m_hImpactB0 = 2.036e6;
220 double m_hImpactB1 = 1.693e6;
223 bool m_hasUserMobility =
false;
224 bool m_hasUserSaturationVelocity =
false;
225 LatticeMobility m_latticeMobilityModel = LatticeMobility::Sentaurus;
226 DopingMobility m_dopingMobilityModel = DopingMobility::Masetti;
227 SaturationVelocity m_saturationVelocityModel = SaturationVelocity::Canali;
228 HighFieldMobility m_highFieldMobilityModel = HighFieldMobility::Canali;
229 ImpactIonisation m_impactIonisationModel = ImpactIonisation::VanOverstraeten;
232 bool m_cfOutput =
false;
233 bool m_nonParabolic =
true;
234 bool m_fullBandDos =
true;
235 bool m_anisotropic =
true;
238 double m_eFinalXL = 4.;
240 double m_eFinalG = 10.;
242 double m_eFinalV = 8.5;
244 static const int nEnergyStepsXL = 2000;
245 static const int nEnergyStepsG = 2000;
246 static const int nEnergyStepsV = 2000;
257 double m_eMinL = 1.05;
258 double m_eMinG = 2.24;
263 double m_cfNullElectronsX = 0.;
264 double m_cfNullElectronsL = 0.;
265 double m_cfNullElectronsG = 0.;
266 std::vector<double> m_cfTotElectronsX;
267 std::vector<double> m_cfTotElectronsL;
268 std::vector<double> m_cfTotElectronsG;
269 std::vector<std::vector<double> > m_cfElectronsX;
270 std::vector<std::vector<double> > m_cfElectronsL;
271 std::vector<std::vector<double> > m_cfElectronsG;
272 std::vector<double> m_energyLossElectronsX;
273 std::vector<double> m_energyLossElectronsL;
274 std::vector<double> m_energyLossElectronsG;
276 std::vector<int> m_scatTypeElectronsX;
277 std::vector<int> m_scatTypeElectronsL;
278 std::vector<int> m_scatTypeElectronsG;
281 double m_cfNullHoles = 0.;
282 std::vector<double> m_cfTotHoles;
283 std::vector<std::vector<double> > m_cfHoles;
284 std::vector<double> m_energyLossHoles;
286 std::vector<int> m_scatTypeHoles;
289 unsigned int m_nCollElectronAcoustic = 0;
290 unsigned int m_nCollElectronOptical = 0;
291 unsigned int m_nCollElectronIntervalley = 0;
292 unsigned int m_nCollElectronImpurity = 0;
293 unsigned int m_nCollElectronIonisation = 0;
294 std::vector<unsigned int> m_nCollElectronDetailed;
295 std::vector<unsigned int> m_nCollElectronBand;
299 std::vector<double> m_fbDosValence;
300 std::vector<double> m_fbDosConduction;
301 double m_fbDosMaxV, m_fbDosMaxC;
304 std::string m_opticalDataFile =
"OpticalData_Si.txt";
305 std::vector<double> m_opticalDataEnergies;
306 std::vector<std::pair<double, double> > m_opticalDataEpsilon;
308 bool UpdateTransportParameters();
309 void UpdateLatticeMobility();
311 void UpdateDopingMobilityMinimos();
312 void UpdateDopingMobilityMasetti();
314 void UpdateSaturationVelocity();
316 void UpdateHighFieldMobilityCanali();
318 void UpdateImpactIonisation();
321 double ElectronAlpha(
const double e)
const;
324 double HoleAlpha(
const double e)
const;
326 bool LoadOpticalData(
const std::string& filename);
328 bool ElectronScatteringRates();
329 bool ElectronAcousticScatteringRates();
330 bool ElectronOpticalScatteringRates();
331 bool ElectronIntervalleyScatteringRatesXX();
332 bool ElectronIntervalleyScatteringRatesXL();
333 bool ElectronIntervalleyScatteringRatesLL();
334 bool ElectronIntervalleyScatteringRatesXGLG();
335 bool ElectronIonisationRatesXL();
336 bool ElectronIonisationRatesG();
337 bool ElectronImpurityScatteringRates();
339 bool HoleScatteringRates();
340 bool HoleAcousticScatteringRates();
341 bool HoleOpticalScatteringRates();
342 bool HoleIonisationRates();
345 void InitialiseDensityOfStates();
virtual ~MediumSilicon()
Destructor.
void EnableNonParabolicity(const bool on=true)
bool GetDielectricFunction(const double e, double &eps1, double &eps2, const unsigned int i=0) override
Get the complex dielectric function at a given energy.
void SetLatticeMobilityModelReggiani()
Calculate the lattice mobility using the Reggiani model.
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].
double GetValenceBandDensityOfStates(const double e, const int band=-1)
void SetDopingMobilityModelMasetti()
Use the Masetti model for the doping-dependence of the mobility (default).
void SetTrapDensity(const double n)
Trap density [cm-3], by default set to zero.
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 ComputeSecondaries(const double e0, double &ee, double &eh)
void ResetCollisionCounters()
double HoleMobility() override
Low-field mobility [cm2 V-1 ns-1].
void EnableAnisotropy(const bool on=true)
double GetConductionBandDensityOfStates(const double e, const int band=0)
bool ElectronCollision(const double e, int &type, int &level, double &e1, double &dx, double &dy, double &dz, std::vector< std::pair< Particle, double > > &secondaries, int &ndxc, int &band) override
Sample the collision type. Update energy and direction vector.
bool SetMaxElectronEnergy(const double e)
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).
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
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 SetSaturationVelocityModelMinimos()
Calculate the saturation velocities using the Minimos model.
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].
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].
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 GetNumberOfElectronCollisions() const
void SetLatticeMobilityModelMinimos()
Calculate the lattice mobility using the Minimos model.
bool IsSemiconductor() const override
Is this medium a semiconductor?
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 SetImpactIonisationModelGrant()
Calculate α using the Grant model.
void SetDopingMobilityModelMinimos()
Use the Minimos model for the doping-dependence of the mobility.
void EnableFullBandDensityOfStates(const bool on=true)
void SetImpactIonisationModelMassey()
Calculate α using the Massey model.
unsigned int GetNumberOfElectronBands() const