Garfield++ 5.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 /// Calculate &alpha; using the Okuto-Crowell model.
95
96 /// Apply a scaling factor to the diffusion coefficients.
97 void SetDiffusionScaling(const double d) { m_diffScale = d; }
98
99 // Microscopic transport properties
100 bool SetMaxElectronEnergy(const double e);
101 double GetMaxElectronEnergy() const { return m_eFinalG; }
102
103 bool Initialise();
104
105 // When enabled, the scattering rates table is written to file
106 // when loaded into memory.
107 void EnableScatteringRateOutput(const bool on = true) { m_cfOutput = on; }
108 void EnableNonParabolicity(const bool on = true) { m_nonParabolic = on; }
109 void EnableFullBandDensityOfStates(const bool on = true) {
110 m_fullBandDos = on;
111 }
112 void EnableAnisotropy(const bool on = true) { m_anisotropic = on; }
113
114 // Get the electron energy (and its gradient)
115 // for a given (crystal) momentum
116 double GetElectronEnergy(const double px, const double py, const double pz,
117 double& vx, double& vy, double& vz,
118 const int band = 0) override;
119 // Get the electron (crystal) momentum for a given kinetic energy
120 void GetElectronMomentum(const double e, double& px, double& py, double& pz,
121 int& band) override;
122
123 // Get the null-collision rate [ns-1]
124 double GetElectronNullCollisionRate(const int band) override;
125 // Get the (real) collision rate [ns-1] at a given electron energy
126 double GetElectronCollisionRate(const double e, const int band) override;
127 // Sample the collision type
128 bool ElectronCollision(const double e, int& type, int& level, double& e1,
129 double& dx, double& dy, double& dz,
130 std::vector<std::pair<Particle, double> >& secondaries,
131 int& ndxc, int& band) override;
132
133 // Density of states
134 double GetConductionBandDensityOfStates(const double e, const int band = 0);
135 double GetValenceBandDensityOfStates(const double e, const int band = -1);
136
137 // Reset the collision counters
139 // Get the total number of electron collisions
140 unsigned int GetNumberOfElectronCollisions() const;
141 // Get number of scattering rate terms
142 unsigned int GetNumberOfLevels() const;
143 // Get number of collisions for a specific level
144 unsigned int GetNumberOfElectronCollisions(const unsigned int level) const;
145
146 unsigned int GetNumberOfElectronBands() const;
147 int GetElectronBandPopulation(const int band);
148
149 bool GetOpticalDataRange(double& emin, double& emax,
150 const unsigned int i = 0) override;
151 bool GetDielectricFunction(const double e, double& eps1, double& eps2,
152 const unsigned int i = 0) override;
153
154 void ComputeSecondaries(const double e0, double& ee, double& eh);
155
156 private:
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 };
162
163 std::mutex m_mutex;
164
165 // Diffusion scaling factor
166 double m_diffScale = 1.;
167
168 double m_bandGap = 1.12;
169 // Doping
170 char m_dopingType = 'i';
171 double m_dopingConcentration = 0.;
172
173 // Effective masses
174 // X valleys
175 double m_mLongX = 0.916;
176 double m_mTransX = 0.191;
177 // L valleys
178 double m_mLongL = 1.59;
179 double m_mTransL = 0.12;
180 // Non-parabolicity parameters [1/eV]
181 double m_alphaX = 0.5;
182 double m_alphaL = 0.5;
183 // Lattice mobility
184 double m_eLatticeMobility = 1.35e-6;
185 double m_hLatticeMobility = 0.45e-6;
186 // Low-field mobility
187 double m_eMobility = 1.35e-6;
188 double m_hMobility = 0.45e-6;
189 // High-field mobility parameters
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;
194 // Saturation velocity
195 double m_eSatVel = 1.02e-2;
196 double m_hSatVel = 0.72e-2;
197 // Hall factor
198 double m_eHallFactor = 1.15;
199 double m_hHallFactor = 0.7;
200
201 // Trapping parameters
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;
209
210 // Impact ionisation parameters
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;
221
222 // Models
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;
230
231 // Options
232 bool m_cfOutput = false;
233 bool m_nonParabolic = true;
234 bool m_fullBandDos = true;
235 bool m_anisotropic = true;
236
237 // Energy range of scattering rates
238 double m_eFinalXL = 4.;
239 double m_eStepXL;
240 double m_eFinalG = 10.;
241 double m_eStepG;
242 double m_eFinalV = 8.5;
243 double m_eStepV;
244 static const int nEnergyStepsXL = 2000;
245 static const int nEnergyStepsG = 2000;
246 static const int nEnergyStepsV = 2000;
247
248 // Number of scattering terms
249 int m_nLevelsX = 0;
250 int m_nLevelsL = 0;
251 int m_nLevelsG = 0;
252 int m_nLevelsV = 0;
253 // Number of valleys
254 int m_nValleysX = 6;
255 int m_nValleysL = 8;
256 // Energy offset
257 double m_eMinL = 1.05;
258 double m_eMinG = 2.24;
259 int m_ieMinL = 0;
260 int m_ieMinG = 0;
261
262 // Electron scattering rates
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;
275 // Cross-section type
276 std::vector<int> m_scatTypeElectronsX;
277 std::vector<int> m_scatTypeElectronsL;
278 std::vector<int> m_scatTypeElectronsG;
279
280 // Hole scattering rates
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;
285 // Cross-section type
286 std::vector<int> m_scatTypeHoles;
287
288 // Collision counters
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;
296
297 // Density of states tables
298 double m_eStepDos;
299 std::vector<double> m_fbDosValence;
300 std::vector<double> m_fbDosConduction;
301 double m_fbDosMaxV, m_fbDosMaxC;
302
303 // Optical data
304 std::string m_opticalDataFile = "OpticalData_Si.txt";
305 std::vector<double> m_opticalDataEnergies;
306 std::vector<std::pair<double, double> > m_opticalDataEpsilon;
307
308 bool UpdateTransportParameters();
309 void UpdateLatticeMobility();
310
311 void UpdateDopingMobilityMinimos();
312 void UpdateDopingMobilityMasetti();
313
314 void UpdateSaturationVelocity();
315
316 void UpdateHighFieldMobilityCanali();
317
318 void UpdateImpactIonisation();
319
320 double ElectronMobility(const double e) const;
321 double ElectronAlpha(const double e) const;
322
323 double HoleMobility(const double e) const;
324 double HoleAlpha(const double e) const;
325
326 bool LoadOpticalData(const std::string& filename);
327
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();
338
339 bool HoleScatteringRates();
340 bool HoleAcousticScatteringRates();
341 bool HoleOpticalScatteringRates();
342 bool HoleIonisationRates();
343
344 // void ComputeSecondaries(const double e0, double& ee, double& eh);
345 void InitialiseDensityOfStates();
346};
347}
348
349#endif
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)
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
Medium()
Constructor.
Definition Medium.cc:61