Garfield++ 4.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 <mutex>
5#include <string>
6#include <vector>
7
8#include "Medium.hh"
9
10namespace Garfield {
11/// %Solid crystalline silicon
12
13class MediumSilicon : public Medium {
14 public:
15 /// Constructor
17 /// Destructor
18 virtual ~MediumSilicon() {}
19
20 bool IsSemiconductor() const override { return true; }
21
22 /// Set doping concentration [cm-3] and type ('i', 'n', 'p').
23 void SetDoping(const char type, const double c);
24 /// Retrieve doping concentration.
25 void GetDoping(char& type, double& c) const;
26
27 /// Trapping cross-sections for electrons and holes.
28 void SetTrapCrossSection(const double ecs, const double hcs);
29 /// Trap density [cm-3], by default set to zero.
30 void SetTrapDensity(const double n);
31 /// Set time constant for trapping of electrons and holes [ns].
32 void SetTrappingTime(const double etau, const double htau);
33
34 // Electron transport parameters
35 bool ElectronVelocity(const double ex, const double ey, const double ez,
36 const double bx, const double by, const double bz,
37 double& vx, double& vy, double& vz) override;
38 bool ElectronTownsend(const double ex, const double ey, const double ez,
39 const double bx, const double by, const double bz,
40 double& alpha) override;
41 bool ElectronAttachment(const double ex, const double ey, const double ez,
42 const double bx, const double by, const double bz,
43 double& eta) override;
44 double ElectronMobility() override { return m_eMobility; }
45 // Hole transport parameters
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;
55 double HoleMobility() override { return m_hMobility; }
56 /// Specify the low field values of the electron and hole mobilities.
57 void SetLowFieldMobility(const double mue, const double muh);
58 /// Calculate the lattice mobility using the Minimos model.
60 /// Calculate the lattice mobility using the Sentaurus model (default).
62 /// Calculate the lattice mobility using the Reggiani model.
64 /// Use the Minimos model for the doping-dependence of the mobility.
66 /// Use the Masetti model for the doping-dependence of the mobility (default).
68
69 /// Specify the saturation velocities of electrons and holes.
70 void SetSaturationVelocity(const double vsate, const double vsath);
71 /// Calculate the saturation velocities using the Minimos model.
73 /// Calculate the saturation velocities using the Canali model (default).
75 /// Calculate the saturation velocities using the Reggiani model.
77
78 /// Parameterize the high-field mobility using the Minimos model.
80 /// Parameterize the high-field mobility using the Canali model (default).
82 /// Parameterize the high-field mobility using the Reggiani model.
84 /// Make the velocity proportional to the electric field (no saturation).
86
87 /// Calculate &alpha; using the van Overstraeten-de Man model (default).
89 /// Calculate &alpha; using the Grant model.
91 /// Calculate &alpha; using the Massey model.
93
94 /// Apply a scaling factor to the diffusion coefficients.
95 void SetDiffusionScaling(const double d) { m_diffScale = d; }
96
97 // Microscopic transport properties
98 bool SetMaxElectronEnergy(const double e);
99 double GetMaxElectronEnergy() const { return m_eFinalG; }
100
101 bool Initialise();
102
103 // When enabled, the scattering rates table is written to file
104 // when loaded into memory.
105 void EnableScatteringRateOutput(const bool on = true) { m_cfOutput = on; }
106 void EnableNonParabolicity(const bool on = true) { m_nonParabolic = on; }
107 void EnableFullBandDensityOfStates(const bool on = true) {
108 m_fullBandDos = on;
109 }
110 void EnableAnisotropy(const bool on = true) { m_anisotropic = on; }
111
112 // Get the electron energy (and its gradient)
113 // for a given (crystal) momentum
114 double GetElectronEnergy(const double px, const double py, const double pz,
115 double& vx, double& vy, double& vz,
116 const int band = 0) override;
117 // Get the electron (crystal) momentum for a given kinetic energy
118 void GetElectronMomentum(const double e, double& px, double& py, double& pz,
119 int& band) override;
120
121 // Get the null-collision rate [ns-1]
122 double GetElectronNullCollisionRate(const int band) override;
123 // Get the (real) collision rate [ns-1] at a given electron energy
124 double GetElectronCollisionRate(const double e, const int band) override;
125 // Sample the collision type
126 bool GetElectronCollision(const double e, int& type, int& level, double& e1,
127 double& dx, double& dy, double& dz,
128 std::vector<std::pair<int, double> >& secondaries,
129 int& ndxc, int& band) override;
130
131 // Density of states
132 double GetConductionBandDensityOfStates(const double e, const int band = 0);
133 double GetValenceBandDensityOfStates(const double e, const int band = -1);
134
135 // Reset the collision counters
137 // Get the total number of electron collisions
138 unsigned int GetNumberOfElectronCollisions() const;
139 // Get number of scattering rate terms
140 unsigned int GetNumberOfLevels() const;
141 // Get number of collisions for a specific level
142 unsigned int GetNumberOfElectronCollisions(const unsigned int level) const;
143
144 unsigned int GetNumberOfElectronBands() const;
145 int GetElectronBandPopulation(const int band);
146
147 bool GetOpticalDataRange(double& emin, double& emax,
148 const unsigned int i = 0) override;
149 bool GetDielectricFunction(const double e, double& eps1, double& eps2,
150 const unsigned int i = 0) override;
151
152 void ComputeSecondaries(const double e0, double& ee, double& eh);
153
154 private:
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 };
160
161 std::mutex m_mutex;
162
163 // Diffusion scaling factor
164 double m_diffScale = 1.;
165
166 double m_bandGap = 1.12;
167 // Doping
168 char m_dopingType = 'i';
169 double m_dopingConcentration = 0.;
170
171 // Effective masses
172 // X valleys
173 double m_mLongX = 0.916;
174 double m_mTransX = 0.191;
175 // L valleys
176 double m_mLongL = 1.59;
177 double m_mTransL = 0.12;
178 // Non-parabolicity parameters [1/eV]
179 double m_alphaX = 0.5;
180 double m_alphaL = 0.5;
181 // Lattice mobility
182 double m_eLatticeMobility = 1.35e-6;
183 double m_hLatticeMobility = 0.45e-6;
184 // Low-field mobility
185 double m_eMobility = 1.35e-6;
186 double m_hMobility = 0.45e-6;
187 // High-field mobility parameters
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;
192 // Saturation velocity
193 double m_eSatVel = 1.02e-2;
194 double m_hSatVel = 0.72e-2;
195 // Hall factor
196 double m_eHallFactor = 1.15;
197 double m_hHallFactor = 0.7;
198
199 // Trapping parameters
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;
207
208 // Impact ionisation parameters
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;
219
220 // Models
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;
228
229 // Options
230 bool m_cfOutput = false;
231 bool m_nonParabolic = true;
232 bool m_fullBandDos = true;
233 bool m_anisotropic = true;
234
235 // Energy range of scattering rates
236 double m_eFinalXL = 4.;
237 double m_eStepXL;
238 double m_eFinalG = 10.;
239 double m_eStepG;
240 double m_eFinalV = 8.5;
241 double m_eStepV;
242 static const int nEnergyStepsXL = 2000;
243 static const int nEnergyStepsG = 2000;
244 static const int nEnergyStepsV = 2000;
245
246 // Number of scattering terms
247 int m_nLevelsX = 0;
248 int m_nLevelsL = 0;
249 int m_nLevelsG = 0;
250 int m_nLevelsV = 0;
251 // Number of valleys
252 int m_nValleysX = 6;
253 int m_nValleysL = 8;
254 // Energy offset
255 double m_eMinL = 1.05;
256 double m_eMinG = 2.24;
257 int m_ieMinL = 0;
258 int m_ieMinG = 0;
259
260 // Electron scattering rates
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;
273 // Cross-section type
274 std::vector<int> m_scatTypeElectronsX;
275 std::vector<int> m_scatTypeElectronsL;
276 std::vector<int> m_scatTypeElectronsG;
277
278 // Hole scattering rates
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;
283 // Cross-section type
284 std::vector<int> m_scatTypeHoles;
285
286 // Collision counters
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;
294
295 // Density of states tables
296 double m_eStepDos;
297 std::vector<double> m_fbDosValence;
298 std::vector<double> m_fbDosConduction;
299 double m_fbDosMaxV, m_fbDosMaxC;
300
301 // Optical data
302 std::string m_opticalDataFile = "OpticalData_Si.txt";
303 std::vector<double> m_opticalDataEnergies;
304 std::vector<std::pair<double, double> > m_opticalDataEpsilon;
305
306 bool UpdateTransportParameters();
307 void UpdateLatticeMobilityMinimos();
308 void UpdateLatticeMobilitySentaurus();
309 void UpdateLatticeMobilityReggiani();
310
311 void UpdateDopingMobilityMinimos();
312 void UpdateDopingMobilityMasetti();
313
314 void UpdateSaturationVelocityMinimos();
315 void UpdateSaturationVelocityCanali();
316 void UpdateSaturationVelocityReggiani();
317
318 void UpdateHighFieldMobilityCanali();
319
320 void UpdateImpactIonisationVanOverstraetenDeMan();
321 void UpdateImpactIonisationGrant();
322
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;
330
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;
338
339 bool LoadOpticalData(const std::string& filename);
340
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();
351
352 bool HoleScatteringRates();
353 bool HoleAcousticScatteringRates();
354 bool HoleOpticalScatteringRates();
355 bool HoleIonisationRates();
356
357 // void ComputeSecondaries(const double e0, double& ee, double& eh);
358 void InitialiseDensityOfStates();
359};
360}
361
362#endif
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)
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