Garfield++ 3.0
A toolkit for the detailed simulation of particle detectors based on ionisation measurement in gases and semiconductors
Loading...
Searching...
No Matches
MediumSilicon.hh
Go to the documentation of this file.
1#ifndef G_MEDIUM_SILICON_H
2#define G_MEDIUM_SILICON_H
3
4#include "Medium.hh"
5
6namespace Garfield {
7/// %Solid crystalline silicon
8
9class MediumSilicon : public Medium {
10 public:
11 /// Constructor
13 /// Destructor
14 virtual ~MediumSilicon() {}
15
16 bool IsSemiconductor() const override { return true; }
17
18 /// Set doping concentration [cm-3] and type ('i', 'n', 'p').
19 void SetDoping(const char type, const double c);
20 /// Retrieve doping concentration.
21 void GetDoping(char& type, double& c) const;
22
23 /// Trapping cross-sections for electrons and holes.
24 void SetTrapCrossSection(const double ecs, const double hcs);
25 /// Trap density [cm-3], by default set to zero.
26 void SetTrapDensity(const double n);
27 /// Set time constant for trapping of electrons and holes [ns].
28 void SetTrappingTime(const double etau, const double htau);
29
30 // Electron transport parameters
31 bool ElectronVelocity(const double ex, const double ey, const double ez,
32 const double bx, const double by, const double bz,
33 double& vx, double& vy, double& vz) override;
34 bool ElectronTownsend(const double ex, const double ey, const double ez,
35 const double bx, const double by, const double bz,
36 double& alpha) override;
37 bool ElectronAttachment(const double ex, const double ey, const double ez,
38 const double bx, const double by, const double bz,
39 double& eta) override;
40 double ElectronMobility() override { return m_eMobility; }
41 // Hole transport parameters
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;
51 double HoleMobility() override { return m_hMobility; }
52 /// Specify the low field values of the electron and hole mobilities.
53 void SetLowFieldMobility(const double mue, const double muh);
54 /// Calculate the lattice mobility using the Minimos model.
56 /// Calculate the lattice mobility using the Sentaurus model (default).
58 /// Calculate the lattice mobility using the Reggiani model.
60 /// Use the Minimos model for the doping-dependence of the mobility.
62 /// Use the Masetti model for the doping-dependence of the mobility (default).
64
65 /// Specify the saturation velocities of electrons and holes.
66 void SetSaturationVelocity(const double vsate, const double vsath);
67 /// Calculate the saturation velocities using the Minimos model.
69 /// Calculate the saturation velocities using the Canali model (default).
71 /// Calculate the saturation velocities using the Reggiani model.
73
74 /// Parameterize the high-field mobility using the Minimos model.
76 /// Parameterize the high-field mobility using the Canali model (default).
78 /// Parameterize the high-field mobility using the Reggiani model.
80 /// Make the velocity proportional to the electric field (no saturation).
82
83 /// Calculate α using the van Overstraeten-de Man model (default).
85 /// Calculate α using the Grant model.
87 /// Calculate α using the Massey model.
89
90 /// Apply a scaling factor to the diffusion coefficients.
91 void SetDiffusionScaling(const double d) { m_diffScale = d; }
92
93 // Microscopic transport properties
94 bool SetMaxElectronEnergy(const double e);
95 double GetMaxElectronEnergy() const { return m_eFinalG; }
96
97 bool Initialise();
98
99 // When enabled, the scattering rates table is written to file
100 // when loaded into memory.
101 void EnableScatteringRateOutput(const bool on = true) { m_cfOutput = on; }
102 void EnableNonParabolicity(const bool on = true) { m_nonParabolic = on; }
103 void EnableFullBandDensityOfStates(const bool on = true) {
104 m_fullBandDos = on;
105 }
106 void EnableAnisotropy(const bool on = true) { m_anisotropic = on; }
107
108 // Get the electron energy (and its gradient)
109 // for a given (crystal) momentum
110 double GetElectronEnergy(const double px, const double py, const double pz,
111 double& vx, double& vy, double& vz,
112 const int band = 0) override;
113 // Get the electron (crystal) momentum for a given kinetic energy
114 void GetElectronMomentum(const double e, double& px, double& py, double& pz,
115 int& band) override;
116
117 // Get the null-collision rate [ns-1]
118 double GetElectronNullCollisionRate(const int band) override;
119 // Get the (real) collision rate [ns-1] at a given electron energy
120 double GetElectronCollisionRate(const double e, const int band) override;
121 // Sample the collision type
122 bool GetElectronCollision(const double e, int& type, int& level, double& e1,
123 double& dx, double& dy, double& dz,
124 std::vector<std::pair<int, double> >& secondaries,
125 int& ndxc, int& band) override;
126
127 // Density of states
128 double GetConductionBandDensityOfStates(const double e, const int band = 0);
129 double GetValenceBandDensityOfStates(const double e, const int band = -1);
130
131 // Reset the collision counters
133 // Get the total number of electron collisions
134 unsigned int GetNumberOfElectronCollisions() const;
135 // Get number of scattering rate terms
136 unsigned int GetNumberOfLevels() const;
137 // Get number of collisions for a specific level
138 unsigned int GetNumberOfElectronCollisions(const unsigned int level) const;
139
140 unsigned int GetNumberOfElectronBands() const;
141 int GetElectronBandPopulation(const int band);
142
143 bool GetOpticalDataRange(double& emin, double& emax,
144 const unsigned int i = 0) override;
145 bool GetDielectricFunction(const double e, double& eps1, double& eps2,
146 const unsigned int i = 0) override;
147
148 void ComputeSecondaries(const double e0, double& ee, double& eh);
149
150 private:
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 };
156
157 // Diffusion scaling factor
158 double m_diffScale = 1.;
159
160 double m_bandGap = 1.12;
161 // Doping
162 char m_dopingType = 'i';
163 double m_dopingConcentration = 0.;
164
165 // Effective masses
166 // X valleys
167 double m_mLongX = 0.916;
168 double m_mTransX = 0.191;
169 // L valleys
170 double m_mLongL = 1.59;
171 double m_mTransL = 0.12;
172 // Non-parabolicity parameters [1/eV]
173 double m_alphaX = 0.5;
174 double m_alphaL = 0.5;
175 // Lattice mobility
176 double m_eLatticeMobility = 1.35e-6;
177 double m_hLatticeMobility = 0.45e-6;
178 // Low-field mobility
179 double m_eMobility = 1.35e-6;
180 double m_hMobility = 0.45e-6;
181 // High-field mobility parameters
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;
186 // Saturation velocity
187 double m_eSatVel = 1.02e-2;
188 double m_hSatVel = 0.72e-2;
189 // Hall factor
190 double m_eHallFactor = 1.15;
191 double m_hHallFactor = 0.7;
192
193 // Trapping parameters
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;
201
202 // Impact ionisation parameters
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;
213
214 // Models
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;
222
223 // Options
224 bool m_cfOutput = false;
225 bool m_nonParabolic = true;
226 bool m_fullBandDos = true;
227 bool m_anisotropic = true;
228
229 // Energy range of scattering rates
230 double m_eFinalXL = 4.;
231 double m_eStepXL;
232 double m_eFinalG = 10.;
233 double m_eStepG;
234 double m_eFinalV = 8.5;
235 double m_eStepV;
236 static const int nEnergyStepsXL = 2000;
237 static const int nEnergyStepsG = 2000;
238 static const int nEnergyStepsV = 2000;
239
240 // Number of scattering terms
241 int m_nLevelsX = 0;
242 int m_nLevelsL = 0;
243 int m_nLevelsG = 0;
244 int m_nLevelsV = 0;
245 // Number of valleys
246 int m_nValleysX = 6;
247 int m_nValleysL = 8;
248 // Energy offset
249 double m_eMinL = 1.05;
250 double m_eMinG = 2.24;
251 int m_ieMinL = 0;
252 int m_ieMinG = 0;
253
254 // Electron scattering rates
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;
267 // Cross-section type
268 std::vector<int> m_scatTypeElectronsX;
269 std::vector<int> m_scatTypeElectronsL;
270 std::vector<int> m_scatTypeElectronsG;
271
272 // Hole scattering rates
273 double m_cfNullHoles;
274 std::vector<double> m_cfTotHoles;
275 std::vector<std::vector<double> > m_cfHoles;
276 std::vector<double> m_energyLossHoles;
277 // Cross-section type
278 std::vector<int> m_scatTypeHoles;
279
280 // Collision counters
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;
288
289 // Density of states tables
290 double m_eStepDos;
291 std::vector<double> m_fbDosValence;
292 std::vector<double> m_fbDosConduction;
293 double m_fbDosMaxV, m_fbDosMaxC;
294
295 // Optical data
296 std::string m_opticalDataFile = "OpticalData_Si.txt";
297 std::vector<double> m_opticalDataEnergies;
298 std::vector<std::pair<double, double> > m_opticalDataEpsilon;
299
300 bool UpdateTransportParameters();
301 void UpdateLatticeMobilityMinimos();
302 void UpdateLatticeMobilitySentaurus();
303 void UpdateLatticeMobilityReggiani();
304
305 void UpdateDopingMobilityMinimos();
306 void UpdateDopingMobilityMasetti();
307
308 void UpdateSaturationVelocityMinimos();
309 void UpdateSaturationVelocityCanali();
310 void UpdateSaturationVelocityReggiani();
311
312 void UpdateHighFieldMobilityCanali();
313
314 void UpdateImpactIonisationVanOverstraetenDeMan();
315 void UpdateImpactIonisationGrant();
316
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;
324
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;
332
333 bool LoadOpticalData(const std::string& filename);
334
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();
345
346 bool HoleScatteringRates();
347 bool HoleAcousticScatteringRates();
348 bool HoleOpticalScatteringRates();
349 bool HoleIonisationRates();
350
351 // void ComputeSecondaries(const double e0, double& ee, double& eh);
352 void InitialiseDensityOfStates();
353};
354}
355
356#endif
Solid crystalline silicon
Definition: MediumSilicon.hh:9
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)
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.
Definition: Medium.hh:13