Garfield 0.3
Toolkit for the detailed simulation of particle detectors based on ionization 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 <array>
5#include <mutex>
6#include <string>
7#include <vector>
8
9#include "Garfield/Medium.hh"
10
11namespace Garfield {
13
14class MediumSilicon : public Medium {
15 public:
19 virtual ~MediumSilicon() {}
20
21 bool IsSemiconductor() const override { return true; }
22
24 void SetDoping(const char type, const double c);
26 void GetDoping(char& type, double& c) const;
27
29 void SetTrapCrossSection(const double ecs, const double hcs);
31 void SetTrapDensity(const double n);
33 void SetTrappingTime(const double etau, const double htau);
34
36 void SetLowFieldMobility(const double mue, const double muh);
43 void SetLatticeMobilityModel(const std::string& model);
50
55
57 void SetSaturationVelocity(const double vsate, const double vsath);
64
73 void SetHighFieldMobilityModel(const std::string& model);
82
90 void SetImpactIonisationModel(const std::string& model);
99
101 void SetDiffusionScaling(const double d) { m_diffScale = d; }
102
103 // Microscopic transport properties
104 bool SetMaxElectronEnergy(const double e);
105 double GetMaxElectronEnergy() const { return m_cb[2].eFinal; }
106
108
109 // When enabled, the scattering rates table is written to file
110 // when loaded into memory.
111 void EnableScatteringRateOutput(const bool on = true) { m_cfOutput = on; }
112 void EnableNonParabolicity(const bool on = true) { m_nonParabolic = on; }
113 void EnableFullBandDensityOfStates(const bool on = true) {
114 m_fullBandDos = on;
115 }
116 void EnableAnisotropy(const bool on = true) { m_anisotropic = on; }
117
118 // Electron transport parameters
119 bool ElectronVelocity(const double ex, const double ey, const double ez,
120 const double bx, const double by, const double bz,
121 double& vx, double& vy, double& vz) override;
122 bool ElectronTownsend(const double ex, const double ey, const double ez,
123 const double bx, const double by, const double bz,
124 double& alpha) override;
125 bool ElectronAttachment(const double ex, const double ey, const double ez,
126 const double bx, const double by, const double bz,
127 double& eta) override;
128 double ElectronMobility() override { return m_eMu; }
129
130 // Hole transport parameters
131 bool HoleVelocity(const double ex, const double ey, const double ez,
132 const double bx, const double by, const double bz,
133 double& vx, double& vy, double& vz) override;
134 bool HoleTownsend(const double ex, const double ey, const double ez,
135 const double bx, const double by, const double bz,
136 double& alpha) override;
137 bool HoleAttachment(const double ex, const double ey, const double ez,
138 const double bx, const double by, const double bz,
139 double& eta) override;
140 double HoleMobility() override { return m_hMu; }
141 // Get the electron energy (and its gradient)
142 // for a given (crystal) momentum
143 double GetElectronEnergy(const double px, const double py, const double pz,
144 double& vx, double& vy, double& vz,
145 const int band = 0) override;
146 // Get the electron (crystal) momentum for a given kinetic energy
147 void GetElectronMomentum(const double e, double& px, double& py, double& pz,
148 int& band) override;
149
150 // Get the null-collision rate [ns-1]
151 double GetElectronNullCollisionRate(const int band) override;
152 // Get the (real) collision rate [ns-1] at a given electron energy
153 double GetElectronCollisionRate(const double e, const int band) override;
154 // Sample the collision type
155 bool ElectronCollision(const double e, int& type, int& level, double& e1,
156 double& dx, double& dy, double& dz,
157 std::vector<Secondary>& secondaries,
158 int& band) override;
159
160 // Reset the collision counters
162 // Get the total number of electron collisions
163 unsigned int GetNumberOfElectronCollisions() const;
164 // Get number of scattering rate terms
165 unsigned int GetNumberOfLevels() const;
166 // Get number of collisions for a specific level
167 unsigned int GetNumberOfElectronCollisions(const unsigned int level) const;
168
169 unsigned int GetNumberOfElectronBands() const;
170 int GetElectronBandPopulation(const int band);
171
172 bool GetOpticalDataRange(double& emin, double& emax,
173 const unsigned int i = 0) override;
174 bool GetDielectricFunction(const double e, double& eps1, double& eps2,
175 const unsigned int i = 0) override;
176
177 void ComputeSecondaries(const double e0, double& ee, double& eh);
178
179 private:
181 enum class DopingMobility { Minimos = 0, Masetti };
185
186 std::mutex m_mutex;
187
188 // Diffusion scaling factor
189 double m_diffScale = 1.;
190
191 double m_bandGap = 1.12;
192 // Doping
193 char m_dopingType = 'i';
194 // Doping concentration
195 double m_cDop = 0.;
196
197 // Lattice mobility
198 double m_eMuLat = 1.35e-6;
199 double m_hMuLat = 0.45e-6;
200 // Low-field mobility
201 double m_eMu = 1.35e-6;
202 double m_hMu = 0.45e-6;
203 // High-field mobility parameters
204 double m_eBetaCanali = 1.109;
205 double m_hBetaCanali = 1.213;
206 double m_eBetaCanaliInv = 1. / 1.109;
207 double m_hBetaCanaliInv = 1. / 1.213;
208 // Saturation velocity
209 double m_eVs = 1.02e-2;
210 double m_hVs = 0.72e-2;
211 // Ratio between low-field mobility and saturation velocity
212 double m_eRs = 1.35e-6 / 1.02e-2;
213 double m_hRs = 0.45e-6 / 0.72e-2;
214 // Hall factor
215 double m_eHallFactor = 1.15;
216 double m_hHallFactor = 0.7;
217
218 // Trapping parameters
219 double m_eTrapCs = 1.e-15;
220 double m_hTrapCs = 1.e-15;
221 double m_eTrapDensity = 0.;
222 double m_hTrapDensity = 0.;
223 double m_eTrapTime = 0.;
224 double m_hTrapTime = 0.;
225 double m_eTrapRate = 0.;
226 double m_hTrapRate = 0.;
228
229 // Impact ionisation parameters
230 double m_eImpactA0 = 3.318e5;
231 double m_eImpactA1 = 0.703e6;
232 double m_eImpactA2 = 0.;
233 double m_eImpactB0 = 1.135e6;
234 double m_eImpactB1 = 1.231e6;
235 double m_eImpactB2 = 0.;
236 double m_hImpactA0 = 1.582e6;
237 double m_hImpactA1 = 0.671e6;
238 double m_hImpactB0 = 2.036e6;
239 double m_hImpactB1 = 1.693e6;
240
241 // Models
242 bool m_hasUserMobility = false;
249
250 // Options
251 bool m_cfOutput = false;
252 bool m_nonParabolic = true;
253 bool m_fullBandDos = false;
254 bool m_anisotropic = true;
255
256 struct Band {
257 int nEnergySteps = 2000;
258 double eStep = 0.;
259 double invStep = 0.;
260 // Energy range of scattering rates.
261 double eFinal;
262 // Energy offset [eV].
263 double eMin = 0.;
264 // Index corresponding to the energy offset.
265 int iMin = 0;
266 // Density of states.
267 std::vector<double> dos;
268 // Multiplicity (number of valleys).
269 int nValleys = 1;
270 // Longitudinal mass.
271 double mL = 1.;
272 // Transverse mass.
273 double mT = 1.;
274 // Conduction effective mass.
275 double mC = 1.;
276 // Non-parabolicity parameter [1/eV].
277 double alpha = 0.;
278 // Null-collision rate.
279 double cfNull;
280 // Total scattering rate.
281 std::vector<double> cfTot;
282 // Scattering rates.
283 std::vector<std::vector<double> > cf;
284 std::vector<double> energyLoss;
285 // Cross-section type.
286 std::vector<int> scatType;
287 // Number of scattering terms.
288 int nLevels = 0;
289 };
290
291 // Conduction bands.
292 std::array<Band, 3> m_cb;
293 std::vector<size_t> m_cbIndex;
294 // Valence band.
296
297 // Collision counters
298 unsigned int m_nCollElectronAcoustic = 0;
299 unsigned int m_nCollElectronOptical = 0;
301 unsigned int m_nCollElectronImpurity = 0;
303 std::vector<unsigned int> m_nCollElectronDetailed;
304 std::vector<unsigned int> m_nCollElectronBand;
305
306 // Density of states tables
307 double m_eStepDos = 0.;
308 double m_invStepDos = 0.;
309 std::vector<double> m_fbDosV;
310 std::vector<double> m_fbDosC;
312
313 // Optical data
314 std::string m_opticalDataFile = "OpticalData_Si.txt";
315 std::vector<double> m_egamma;
316 std::vector<double> m_eps1;
317 std::vector<double> m_eps2;
318
319 bool Update();
321
324
326
328
330
331 double ElectronMobility(const double e) const;
332 double ElectronAlpha(const double e) const;
333
334 double HoleMobility(const double e) const;
335 double HoleAlpha(const double e) const;
336
337 bool LoadOpticalData(const std::string& filename);
338
341 bool AcousticScatteringRates(const double rho, const double kbt,
342 const double dp, Band& band);
343 bool OpticalScatteringRates(const double rho, const double kbt,
344 const double dtk, const double eph, Band& band);
345 bool IntervalleyScatteringRates(const double rho, const double kbt,
346 const double dtk, const double eph,
347 Band& bndI, Band& bndF, const double zF,
348 const int collType);
349 bool IonisationRates(const std::vector<double>& p,
350 const std::vector<double>& eth,
351 const std::vector<double>& b, Band& band);
352 bool ImpurityScatteringRates(const double kbt, Band& band);
353
356};
357} // namespace Garfield
358
359#endif
HighFieldMobility m_highFieldMobilityModel
virtual ~MediumSilicon()
Destructor.
double HoleMobility(const double e) const
void SetHighFieldMobilityModel(const std::string &model)
Set the parameterisation to be used for the drift velocity as function of the electric field.
void EnableNonParabolicity(const bool on=true)
std::vector< double > m_eps1
void UpdateHighFieldMobilityCanali()
bool AcousticScatteringRates(const double rho, const double kbt, const double dp, Band &band)
bool GetDielectricFunction(const double e, double &eps1, double &eps2, const unsigned int i=0) override
double ElectronAlpha(const double e) const
SaturationVelocity m_saturationVelocityModel
void SetLatticeMobilityModelReggiani()
Calculate the lattice mobility using the Reggiani model.
std::vector< double > m_fbDosV
unsigned int m_nCollElectronAcoustic
std::vector< double > m_fbDosC
double HoleAlpha(const double e) const
void SetImpactIonisationModel(const std::string &model)
Set the parameterisation to be used for calculating the impact ionisation coefficient.
bool IonisationRates(const std::vector< double > &p, const std::vector< double > &eth, const std::vector< double > &b, Band &band)
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
void SetHighFieldMobilityModelReggiani()
Parameterize the high-field mobility using the Reggiani model.
double GetElectronCollisionRate(const double e, const int band) override
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
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
void SetDopingMobilityModelMasetti()
Use the Masetti model for the doping-dependence of the mobility (default).
std::vector< unsigned int > m_nCollElectronBand
void SetTrapDensity(const double n)
Trap density [cm-3], by default set to zero.
unsigned int m_nCollElectronIntervalley
bool LoadOpticalData(const std::string &filename)
std::vector< unsigned int > m_nCollElectronDetailed
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
void ComputeSecondaries(const double e0, double &ee, double &eh)
LatticeMobility m_latticeMobilityModel
double HoleMobility() override
void EnableAnisotropy(const bool on=true)
unsigned int m_nCollElectronIonisation
std::array< Band, 3 > m_cb
bool SetMaxElectronEnergy(const double e)
double ElectronMobility(const double e) const
bool HoleTownsend(const double ex, const double ey, const double ez, const double bx, const double by, const double bz, double &alpha) override
void SetHighFieldMobilityModelConstant()
Make the velocity proportional to the electric field (no saturation).
std::vector< double > m_eps2
std::vector< size_t > m_cbIndex
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
DopingMobility m_dopingMobilityModel
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.
bool ImpurityScatteringRates(const double kbt, Band &band)
bool ElectronCollision(const double e, int &type, int &level, double &e1, double &dx, double &dy, double &dz, std::vector< Secondary > &secondaries, int &band) override
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
std::vector< double > m_egamma
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
double ElectronMobility() override
unsigned int GetNumberOfElectronCollisions(const unsigned int level) const
unsigned int m_nCollElectronOptical
bool GetOpticalDataRange(double &emin, double &emax, const unsigned int i=0) override
double GetElectronNullCollisionRate(const int band) override
unsigned int m_nCollElectronImpurity
unsigned int GetNumberOfElectronCollisions() const
void SetLatticeMobilityModelMinimos()
Calculate the lattice mobility using the Minimos model.
bool IsSemiconductor() const override
ImpactIonisation m_impactIonisationModel
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 SetLatticeMobilityModel(const std::string &model)
Set the parameterisation to be used for calculating the lattice mobility model.
bool OpticalScatteringRates(const double rho, const double kbt, const double dtk, const double eph, Band &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
bool IntervalleyScatteringRates(const double rho, const double kbt, const double dtk, const double eph, Band &bndI, Band &bndF, const double zF, const int collType)
std::vector< double > energyLoss
std::vector< double > dos
std::vector< std::vector< double > > cf
std::vector< double > cfTot