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;
115 double& vx,
double& vy,
double& vz,
116 const int band = 0)
override;
127 double& dx,
double& dy,
double& dz,
128 std::vector<std::pair<int, double> >& secondaries,
129 int& ndxc,
int& band)
override;
148 const unsigned int i = 0)
override;
150 const unsigned int i = 0)
override;
155 enum class LatticeMobility { Sentaurus = 0, Minimos, Reggiani };
156 enum class DopingMobility { Minimos = 0, Masetti };
157 enum class SaturationVelocity { Minimos = 0, Canali, Reggiani };
158 enum class HighFieldMobility { Minimos = 0, Canali, Reggiani, Constant };
159 enum class ImpactIonisation { VanOverstraeten = 0, Grant, Massey };
164 double m_diffScale = 1.;
166 double m_bandGap = 1.12;
168 char m_dopingType =
'i';
169 double m_dopingConcentration = 0.;
173 double m_mLongX = 0.916;
174 double m_mTransX = 0.191;
176 double m_mLongL = 1.59;
177 double m_mTransL = 0.12;
179 double m_alphaX = 0.5;
180 double m_alphaL = 0.5;
182 double m_eLatticeMobility = 1.35e-6;
183 double m_hLatticeMobility = 0.45e-6;
185 double m_eMobility = 1.35e-6;
186 double m_hMobility = 0.45e-6;
188 double m_eBetaCanali = 1.109;
189 double m_hBetaCanali = 1.213;
190 double m_eBetaCanaliInv = 1. / 1.109;
191 double m_hBetaCanaliInv = 1. / 1.213;
193 double m_eSatVel = 1.02e-2;
194 double m_hSatVel = 0.72e-2;
196 double m_eHallFactor = 1.15;
197 double m_hHallFactor = 0.7;
200 double m_eTrapCs = 1.e-15;
201 double m_hTrapCs = 1.e-15;
202 double m_eTrapDensity = 0.;
203 double m_hTrapDensity = 0.;
204 double m_eTrapTime = 0.;
205 double m_hTrapTime = 0.;
206 int m_trappingModel = 0;
209 double m_eImpactA0 = 3.318e5;
210 double m_eImpactA1 = 0.703e6;
211 double m_eImpactA2 = 0.;
212 double m_eImpactB0 = 1.135e6;
213 double m_eImpactB1 = 1.231e6;
214 double m_eImpactB2 = 0.;
215 double m_hImpactA0 = 1.582e6;
216 double m_hImpactA1 = 0.671e6;
217 double m_hImpactB0 = 2.036e6;
218 double m_hImpactB1 = 1.693e6;
221 bool m_hasUserMobility =
false;
222 bool m_hasUserSaturationVelocity =
false;
223 LatticeMobility m_latticeMobilityModel = LatticeMobility::Sentaurus;
224 DopingMobility m_dopingMobilityModel = DopingMobility::Masetti;
225 SaturationVelocity m_saturationVelocityModel = SaturationVelocity::Canali;
226 HighFieldMobility m_highFieldMobilityModel = HighFieldMobility::Canali;
227 ImpactIonisation m_impactIonisationModel = ImpactIonisation::VanOverstraeten;
230 bool m_cfOutput =
false;
231 bool m_nonParabolic =
true;
232 bool m_fullBandDos =
true;
233 bool m_anisotropic =
true;
236 double m_eFinalXL = 4.;
238 double m_eFinalG = 10.;
240 double m_eFinalV = 8.5;
242 static const int nEnergyStepsXL = 2000;
243 static const int nEnergyStepsG = 2000;
244 static const int nEnergyStepsV = 2000;
255 double m_eMinL = 1.05;
256 double m_eMinG = 2.24;
261 double m_cfNullElectronsX = 0.;
262 double m_cfNullElectronsL = 0.;
263 double m_cfNullElectronsG = 0.;
264 std::vector<double> m_cfTotElectronsX;
265 std::vector<double> m_cfTotElectronsL;
266 std::vector<double> m_cfTotElectronsG;
267 std::vector<std::vector<double> > m_cfElectronsX;
268 std::vector<std::vector<double> > m_cfElectronsL;
269 std::vector<std::vector<double> > m_cfElectronsG;
270 std::vector<double> m_energyLossElectronsX;
271 std::vector<double> m_energyLossElectronsL;
272 std::vector<double> m_energyLossElectronsG;
274 std::vector<int> m_scatTypeElectronsX;
275 std::vector<int> m_scatTypeElectronsL;
276 std::vector<int> m_scatTypeElectronsG;
279 double m_cfNullHoles = 0.;
280 std::vector<double> m_cfTotHoles;
281 std::vector<std::vector<double> > m_cfHoles;
282 std::vector<double> m_energyLossHoles;
284 std::vector<int> m_scatTypeHoles;
287 unsigned int m_nCollElectronAcoustic = 0;
288 unsigned int m_nCollElectronOptical = 0;
289 unsigned int m_nCollElectronIntervalley = 0;
290 unsigned int m_nCollElectronImpurity = 0;
291 unsigned int m_nCollElectronIonisation = 0;
292 std::vector<unsigned int> m_nCollElectronDetailed;
293 std::vector<unsigned int> m_nCollElectronBand;
297 std::vector<double> m_fbDosValence;
298 std::vector<double> m_fbDosConduction;
299 double m_fbDosMaxV, m_fbDosMaxC;
302 std::string m_opticalDataFile =
"OpticalData_Si.txt";
303 std::vector<double> m_opticalDataEnergies;
304 std::vector<std::pair<double, double> > m_opticalDataEpsilon;
306 bool UpdateTransportParameters();
307 void UpdateLatticeMobilityMinimos();
308 void UpdateLatticeMobilitySentaurus();
309 void UpdateLatticeMobilityReggiani();
311 void UpdateDopingMobilityMinimos();
312 void UpdateDopingMobilityMasetti();
314 void UpdateSaturationVelocityMinimos();
315 void UpdateSaturationVelocityCanali();
316 void UpdateSaturationVelocityReggiani();
318 void UpdateHighFieldMobilityCanali();
320 void UpdateImpactIonisationVanOverstraetenDeMan();
321 void UpdateImpactIonisationGrant();
323 bool ElectronMobilityMinimos(
const double e,
double& mu)
const;
324 bool ElectronMobilityCanali(
const double e,
double& mu)
const;
325 bool ElectronMobilityReggiani(
const double e,
double& mu)
const;
326 bool ElectronImpactIonisationVanOverstraetenDeMan(
const double e,
327 double& alpha)
const;
328 bool ElectronImpactIonisationGrant(
const double e,
double& alpha)
const;
329 bool ElectronImpactIonisationMassey(
const double e,
double& alpha)
const;
331 bool HoleMobilityMinimos(
const double e,
double& mu)
const;
332 bool HoleMobilityCanali(
const double e,
double& mu)
const;
333 bool HoleMobilityReggiani(
const double e,
double& mu)
const;
334 bool HoleImpactIonisationVanOverstraetenDeMan(
const double e,
335 double& alpha)
const;
336 bool HoleImpactIonisationGrant(
const double e,
double& alpha)
const;
337 bool HoleImpactIonisationMassey(
const double e,
double& alpha)
const;
339 bool LoadOpticalData(
const std::string& filename);
341 bool ElectronScatteringRates();
342 bool ElectronAcousticScatteringRates();
343 bool ElectronOpticalScatteringRates();
344 bool ElectronIntervalleyScatteringRatesXX();
345 bool ElectronIntervalleyScatteringRatesXL();
346 bool ElectronIntervalleyScatteringRatesLL();
347 bool ElectronIntervalleyScatteringRatesXGLG();
348 bool ElectronIonisationRatesXL();
349 bool ElectronIonisationRatesG();
350 bool ElectronImpurityScatteringRates();
352 bool HoleScatteringRates();
353 bool HoleAcousticScatteringRates();
354 bool HoleOpticalScatteringRates();
355 bool HoleIonisationRates();
358 void InitialiseDensityOfStates();
Solid crystalline silicon
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 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)
bool GetElectronCollision(const double e, int &type, int &level, double &e1, double &dx, double &dy, double &dz, std::vector< std::pair< int, double > > &secondaries, int &ndxc, int &band) override
Sample the collision type. Update energy and direction vector.
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 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
Abstract base class for media.