1#ifndef G_MEDIUM_SILICON_H
2#define G_MEDIUM_SILICON_H
19 void SetDoping(
const char type,
const double c);
21 void GetDoping(
char& type,
double& c)
const;
32 const double bx,
const double by,
const double bz,
33 double& vx,
double& vy,
double& vz)
override;
35 const double bx,
const double by,
const double bz,
36 double& alpha)
override;
38 const double bx,
const double by,
const double bz,
39 double& eta)
override;
42 bool HoleVelocity(
const double ex,
const double ey,
const double ez,
43 const double bx,
const double by,
const double bz,
44 double& vx,
double& vy,
double& vz)
override;
45 bool HoleTownsend(
const double ex,
const double ey,
const double ez,
46 const double bx,
const double by,
const double bz,
47 double& alpha)
override;
48 bool HoleAttachment(
const double ex,
const double ey,
const double ez,
49 const double bx,
const double by,
const double bz,
50 double& eta)
override;
111 double& vx,
double& vy,
double& vz,
112 const int band = 0)
override;
123 double& dx,
double& dy,
double& dz,
124 std::vector<std::pair<int, double> >& secondaries,
125 int& ndxc,
int& band)
override;
144 const unsigned int i = 0)
override;
146 const unsigned int i = 0)
override;
151 enum class LatticeMobility { Sentaurus = 0, Minimos, Reggiani };
152 enum class DopingMobility { Minimos = 0, Masetti };
153 enum class SaturationVelocity { Minimos = 0, Canali, Reggiani };
154 enum class HighFieldMobility { Minimos = 0, Canali, Reggiani, Constant };
155 enum class ImpactIonisation { VanOverstraeten = 0, Grant, Massey };
158 double m_diffScale = 1.;
160 double m_bandGap = 1.12;
162 char m_dopingType =
'i';
163 double m_dopingConcentration = 0.;
167 double m_mLongX = 0.916;
168 double m_mTransX = 0.191;
170 double m_mLongL = 1.59;
171 double m_mTransL = 0.12;
173 double m_alphaX = 0.5;
174 double m_alphaL = 0.5;
176 double m_eLatticeMobility = 1.35e-6;
177 double m_hLatticeMobility = 0.45e-6;
179 double m_eMobility = 1.35e-6;
180 double m_hMobility = 0.45e-6;
182 double m_eBetaCanali = 1.109;
183 double m_hBetaCanali = 1.213;
184 double m_eBetaCanaliInv = 1. / 1.109;
185 double m_hBetaCanaliInv = 1. / 1.213;
187 double m_eSatVel = 1.02e-2;
188 double m_hSatVel = 0.72e-2;
190 double m_eHallFactor = 1.15;
191 double m_hHallFactor = 0.7;
194 double m_eTrapCs = 1.e-15;
195 double m_hTrapCs = 1.e-15;
196 double m_eTrapDensity = 0.;
197 double m_hTrapDensity = 0.;
198 double m_eTrapTime = 0.;
199 double m_hTrapTime = 0.;
200 int m_trappingModel = 0;
203 double m_eImpactA0 = 3.318e5;
204 double m_eImpactA1 = 0.703e6;
205 double m_eImpactA2 = 0.;
206 double m_eImpactB0 = 1.135e6;
207 double m_eImpactB1 = 1.231e6;
208 double m_eImpactB2 = 0.;
209 double m_hImpactA0 = 1.582e6;
210 double m_hImpactA1 = 0.671e6;
211 double m_hImpactB0 = 2.036e6;
212 double m_hImpactB1 = 1.693e6;
215 bool m_hasUserMobility =
false;
216 bool m_hasUserSaturationVelocity =
false;
217 LatticeMobility m_latticeMobilityModel = LatticeMobility::Sentaurus;
218 DopingMobility m_dopingMobilityModel = DopingMobility::Masetti;
219 SaturationVelocity m_saturationVelocityModel = SaturationVelocity::Canali;
220 HighFieldMobility m_highFieldMobilityModel = HighFieldMobility::Canali;
221 ImpactIonisation m_impactIonisationModel = ImpactIonisation::VanOverstraeten;
224 bool m_cfOutput =
false;
225 bool m_nonParabolic =
true;
226 bool m_fullBandDos =
true;
227 bool m_anisotropic =
true;
230 double m_eFinalXL = 4.;
232 double m_eFinalG = 10.;
234 double m_eFinalV = 8.5;
236 static const int nEnergyStepsXL = 2000;
237 static const int nEnergyStepsG = 2000;
238 static const int nEnergyStepsV = 2000;
249 double m_eMinL = 1.05;
250 double m_eMinG = 2.24;
255 double m_cfNullElectronsX;
256 double m_cfNullElectronsL;
257 double m_cfNullElectronsG;
258 std::vector<double> m_cfTotElectronsX;
259 std::vector<double> m_cfTotElectronsL;
260 std::vector<double> m_cfTotElectronsG;
261 std::vector<std::vector<double> > m_cfElectronsX;
262 std::vector<std::vector<double> > m_cfElectronsL;
263 std::vector<std::vector<double> > m_cfElectronsG;
264 std::vector<double> m_energyLossElectronsX;
265 std::vector<double> m_energyLossElectronsL;
266 std::vector<double> m_energyLossElectronsG;
268 std::vector<int> m_scatTypeElectronsX;
269 std::vector<int> m_scatTypeElectronsL;
270 std::vector<int> m_scatTypeElectronsG;
273 double m_cfNullHoles;
274 std::vector<double> m_cfTotHoles;
275 std::vector<std::vector<double> > m_cfHoles;
276 std::vector<double> m_energyLossHoles;
278 std::vector<int> m_scatTypeHoles;
281 unsigned int m_nCollElectronAcoustic = 0;
282 unsigned int m_nCollElectronOptical = 0;
283 unsigned int m_nCollElectronIntervalley = 0;
284 unsigned int m_nCollElectronImpurity = 0;
285 unsigned int m_nCollElectronIonisation = 0;
286 std::vector<unsigned int> m_nCollElectronDetailed;
287 std::vector<unsigned int> m_nCollElectronBand;
291 std::vector<double> m_fbDosValence;
292 std::vector<double> m_fbDosConduction;
293 double m_fbDosMaxV, m_fbDosMaxC;
296 std::string m_opticalDataFile =
"OpticalData_Si.txt";
297 std::vector<double> m_opticalDataEnergies;
298 std::vector<std::pair<double, double> > m_opticalDataEpsilon;
300 bool UpdateTransportParameters();
301 void UpdateLatticeMobilityMinimos();
302 void UpdateLatticeMobilitySentaurus();
303 void UpdateLatticeMobilityReggiani();
305 void UpdateDopingMobilityMinimos();
306 void UpdateDopingMobilityMasetti();
308 void UpdateSaturationVelocityMinimos();
309 void UpdateSaturationVelocityCanali();
310 void UpdateSaturationVelocityReggiani();
312 void UpdateHighFieldMobilityCanali();
314 void UpdateImpactIonisationVanOverstraetenDeMan();
315 void UpdateImpactIonisationGrant();
317 bool ElectronMobilityMinimos(
const double e,
double& mu)
const;
318 bool ElectronMobilityCanali(
const double e,
double& mu)
const;
319 bool ElectronMobilityReggiani(
const double e,
double& mu)
const;
320 bool ElectronImpactIonisationVanOverstraetenDeMan(
const double e,
321 double& alpha)
const;
322 bool ElectronImpactIonisationGrant(
const double e,
double& alpha)
const;
323 bool ElectronImpactIonisationMassey(
const double e,
double& alpha)
const;
325 bool HoleMobilityMinimos(
const double e,
double& mu)
const;
326 bool HoleMobilityCanali(
const double e,
double& mu)
const;
327 bool HoleMobilityReggiani(
const double e,
double& mu)
const;
328 bool HoleImpactIonisationVanOverstraetenDeMan(
const double e,
329 double& alpha)
const;
330 bool HoleImpactIonisationGrant(
const double e,
double& alpha)
const;
331 bool HoleImpactIonisationMassey(
const double e,
double& alpha)
const;
333 bool LoadOpticalData(
const std::string& filename);
335 bool ElectronScatteringRates();
336 bool ElectronAcousticScatteringRates();
337 bool ElectronOpticalScatteringRates();
338 bool ElectronIntervalleyScatteringRatesXX();
339 bool ElectronIntervalleyScatteringRatesXL();
340 bool ElectronIntervalleyScatteringRatesLL();
341 bool ElectronIntervalleyScatteringRatesXGLG();
342 bool ElectronIonisationRatesXL();
343 bool ElectronIonisationRatesG();
344 bool ElectronImpurityScatteringRates();
346 bool HoleScatteringRates();
347 bool HoleAcousticScatteringRates();
348 bool HoleOpticalScatteringRates();
349 bool HoleIonisationRates();
352 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.