Garfield++ 3.0
A toolkit for the detailed simulation of particle detectors based on ionisation measurement in gases and semiconductors
Loading...
Searching...
No Matches
Medium.hh
Go to the documentation of this file.
1#ifndef G_MEDIUM_H
2#define G_MEDIUM_H
3
4#include <string>
5#include <vector>
6
8
9namespace Garfield {
10
11/// Abstract base class for media.
12
13class Medium {
14 public:
15 /// Constructor
16 Medium();
17 /// Destructor
18 virtual ~Medium();
19
20 /// Return the id number of the class instance.
21 int GetId() const { return m_id; }
22 /// Get the medium name/identifier.
23 const std::string& GetName() const { return m_name; }
24 /// Is this medium a gas?
25 virtual bool IsGas() const { return false; }
26 /// Is this medium a semiconductor?
27 virtual bool IsSemiconductor() const { return false; }
28 /// Is this medium a conductor?
29 virtual bool IsConductor() const { return false; }
30
31 /// Set the temperature [K].
32 void SetTemperature(const double t);
33 /// Get the temperature [K].
34 double GetTemperature() const { return m_temperature; }
35 // Set the pressure [Torr].
36 void SetPressure(const double p);
37 // Get the pressure [Torr].
38 double GetPressure() const { return m_pressure; }
39 /// Set the relative static dielectric constant.
40 void SetDielectricConstant(const double eps);
41 /// Get the relative static dielectric constant.
42 double GetDielectricConstant() const { return m_epsilon; }
43
44 /// Get number of components of the medium.
45 unsigned int GetNumberOfComponents() const { return m_nComponents; }
46 /// Get the name and fraction of a given component.
47 virtual void GetComponent(const unsigned int i, std::string& label,
48 double& f);
49 /// Set the effective atomic number.
50 virtual void SetAtomicNumber(const double z);
51 /// Get the effective atomic number.
52 virtual double GetAtomicNumber() const { return m_z; }
53 /// Set the effective atomic weight.
54 virtual void SetAtomicWeight(const double a);
55 /// Get the effective atomic weight.
56 virtual double GetAtomicWeight() const { return m_a; }
57 /// Set the number density [cm-3].
58 virtual void SetNumberDensity(const double n);
59 /// Get the number density [cm-3].
60 virtual double GetNumberDensity() const { return m_density; }
61 /// Set the mass density [g/cm3].
62 virtual void SetMassDensity(const double rho);
63 /// Get the mass density [g/cm3].
64 virtual double GetMassDensity() const;
65
66 /// Switch electron/ion/hole on/off.
67 virtual void EnableDrift(const bool on = true) { m_driftable = on; }
68 /// Make the medium ionisable or non-ionisable.
69 virtual void EnablePrimaryIonisation(const bool on = true) {
70 m_ionisable = on;
71 }
72
73 /// Is charge carrier transport enabled in this medium?
74 bool IsDriftable() const { return m_driftable; }
75 /// Does the medium have electron scattering rates?
76 bool IsMicroscopic() const { return m_microscopic; }
77 /// Is charge deposition by charged particles/photon enabled in this medium?
78 bool IsIonisable() const { return m_ionisable; }
79
80 /// Set the W value (average energy to produce an electron/ion or e/h pair).
81 void SetW(const double w) { m_w = w; }
82 /// Get the W value.
83 double GetW() { return m_w; }
84 /// Set the Fano factor.
85 void SetFanoFactor(const double f) { m_fano = f; }
86 /// Get the Fano factor.
87 double GetFanoFactor() { return m_fano; }
88
89 // Transport parameters for electrons
90 /// Drift velocity [cm / ns]
91 virtual bool ElectronVelocity(const double ex, const double ey,
92 const double ez, const double bx,
93 const double by, const double bz, double& vx,
94 double& vy, double& vz);
95 /// Longitudinal and transverse diffusion coefficients [cm1/2]
96 virtual bool ElectronDiffusion(const double ex, const double ey,
97 const double ez, const double bx,
98 const double by, const double bz, double& dl,
99 double& dt);
100 /// Diffusion tensor: diagonal elements are the diffusion
101 /// coefficients [cm] along e, btrans, e x b,
102 /// off-diagonal elements are the covariances
103 virtual bool ElectronDiffusion(const double ex, const double ey,
104 const double ez, const double bx,
105 const double by, const double bz,
106 double cov[3][3]);
107 /// Ionisation coefficient [cm-1]
108 virtual bool ElectronTownsend(const double ex, const double ey,
109 const double ez, const double bx,
110 const double by, const double bz,
111 double& alpha);
112 /// Attachment coefficient [cm-1]
113 virtual bool ElectronAttachment(const double ex, const double ey,
114 const double ez, const double bx,
115 const double by, const double bz,
116 double& eta);
117 /// Lorentz angle
118 virtual bool ElectronLorentzAngle(const double ex, const double ey,
119 const double ez, const double bx,
120 const double by, const double bz,
121 double& lor);
122 /// Low-field mobility [cm2 V-1 ns-1]
123 virtual double ElectronMobility();
124 // Microscopic electron transport properties
125
126 /// Dispersion relation (energy vs. wave vector)
127 virtual double GetElectronEnergy(const double px, const double py,
128 const double pz, double& vx, double& vy,
129 double& vz, const int band = 0);
130 /// Sample the momentum vector for a given energy
131 /// (only meaningful in semiconductors).
132 virtual void GetElectronMomentum(const double e, double& px, double& py,
133 double& pz, int& band);
134
135 /// Null-collision rate [ns-1]
136 virtual double GetElectronNullCollisionRate(const int band = 0);
137 /// Collision rate [ns-1] for given electron energy
138 virtual double GetElectronCollisionRate(const double e, const int band = 0);
139 /// Sample the collision type. Update energy and direction vector.
140 virtual bool GetElectronCollision(
141 const double e, int& type, int& level, double& e1, double& dx, double& dy,
142 double& dz, std::vector<std::pair<int, double> >& secondaries, int& ndxc,
143 int& band);
144 virtual unsigned int GetNumberOfDeexcitationProducts() const { return 0; }
145 virtual bool GetDeexcitationProduct(const unsigned int i, double& t,
146 double& s, int& type,
147 double& energy) const;
148
149 // Transport parameters for holes
150 /// Drift velocity [cm / ns]
151 virtual bool HoleVelocity(const double ex, const double ey, const double ez,
152 const double bx, const double by, const double bz,
153 double& vx, double& vy, double& vz);
154 /// Longitudinal and transverse diffusion coefficients [cm1/2]
155 virtual bool HoleDiffusion(const double ex, const double ey, const double ez,
156 const double bx, const double by, const double bz,
157 double& dl, double& dt);
158 /// Diffusion tensor
159 virtual bool HoleDiffusion(const double ex, const double ey, const double ez,
160 const double bx, const double by, const double bz,
161 double cov[3][3]);
162 /// Ionisation coefficient [cm-1]
163 virtual bool HoleTownsend(const double ex, const double ey, const double ez,
164 const double bx, const double by, const double bz,
165 double& alpha);
166 /// Attachment coefficient [cm-1]
167 virtual bool HoleAttachment(const double ex, const double ey, const double ez,
168 const double bx, const double by, const double bz,
169 double& eta);
170 /// Low-field mobility [cm2 V-1 ns-1]
171 virtual double HoleMobility();
172
173 // Transport parameters for ions
174 /// Drift velocity [cm / ns]
175 virtual bool IonVelocity(const double ex, const double ey, const double ez,
176 const double bx, const double by, const double bz,
177 double& vx, double& vy, double& vz);
178 /// Longitudinal and transverse diffusion coefficients [cm1/2]
179 virtual bool IonDiffusion(const double ex, const double ey, const double ez,
180 const double bx, const double by, const double bz,
181 double& dl, double& dt);
182 /// Dissociation coefficient
183 virtual bool IonDissociation(const double ex, const double ey,
184 const double ez, const double bx,
185 const double by, const double bz, double& diss);
186 /// Low-field mobility [cm2 V-1 ns-1]
187 virtual double IonMobility();
188
189 /// Set the range of fields to be covered by the transport tables.
190 void SetFieldGrid(double emin, double emax, const size_t ne, bool logE,
191 double bmin = 0., double bmax = 0., const size_t nb = 1,
192 double amin = HalfPi, double amax = HalfPi,
193 const size_t na = 1);
194 /// Set the fields and E-B angles to be used in the transport tables.
195 void SetFieldGrid(const std::vector<double>& efields,
196 const std::vector<double>& bfields,
197 const std::vector<double>& angles);
198 /// Get the fields and E-B angles used in the transport tables.
199 void GetFieldGrid(std::vector<double>& efields, std::vector<double>& bfields,
200 std::vector<double>& angles);
201
202 /// Set an entry in the table of drift speeds along E.
203 bool SetElectronVelocityE(const unsigned int ie, const unsigned int ib,
204 const unsigned int ia, const double v) {
205 return SetEntry(ie, ib, ia, "SetElectronVelocityE", m_eVelE, v);
206 }
207 /// Get an entry in the table of drift speeds along E.
208 bool GetElectronVelocityE(const unsigned int ie, const unsigned int ib,
209 const unsigned int ia, double& v) {
210 return GetEntry(ie, ib, ia, "GetElectronVelocityE", m_eVelE, v);
211 }
212 /// Set an entry in the table of drift speeds along ExB.
213 bool SetElectronVelocityExB(const unsigned int ie, const unsigned int ib,
214 const unsigned int ia, const double v) {
215 return SetEntry(ie, ib, ia, "SetElectronVelocityExB", m_eVelX, v);
216 }
217 /// Get an entry in the table of drift speeds along ExB.
218 bool GetElectronVelocityExB(const unsigned int ie, const unsigned int ib,
219 const unsigned int ia, double& v) {
220 return GetEntry(ie, ib, ia, "GetElectronVelocityExB", m_eVelX, v);
221 }
222 /// Set an entry in the table of drift speeds along Btrans.
223 bool SetElectronVelocityB(const unsigned int ie, const unsigned int ib,
224 const unsigned int ia, const double v) {
225 return SetEntry(ie, ib, ia, "SetElectronVelocityB", m_eVelB, v);
226 }
227 /// Get an entry in the table of drift speeds along Btrans.
228 bool GetElectronVelocityB(const unsigned int ie, const unsigned int ib,
229 const unsigned int ia, double& v) {
230 return GetEntry(ie, ib, ia, "GetElectronVelocityB", m_eVelB, v);
231 }
232 /// Set an entry in the table of longitudinal diffusion coefficients.
233 bool SetElectronLongitudinalDiffusion(const unsigned int ie,
234 const unsigned int ib,
235 const unsigned int ia,
236 const double dl) {
237 return SetEntry(ie, ib, ia, "SetElectronLongitudinalDiffusion",
238 m_eDifL, dl);
239 }
240 /// Get an entry in the table of longitudinal diffusion coefficients.
241 bool GetElectronLongitudinalDiffusion(const unsigned int ie,
242 const unsigned int ib,
243 const unsigned int ia, double& dl) {
244 return GetEntry(ie, ib, ia, "GetElectronLongitudinalDiffusion",
245 m_eDifL, dl);
246 }
247 /// Set an entry in the table of transverse diffusion coefficients.
248 bool SetElectronTransverseDiffusion(const unsigned int ie,
249 const unsigned int ib,
250 const unsigned int ia,
251 const double dt) {
252 return SetEntry(ie, ib, ia, "SetElectronTransverseDiffusion",
253 m_eDifT, dt);
254 }
255 /// Get an entry in the table of transverse diffusion coefficients.
256 bool GetElectronTransverseDiffusion(const unsigned int ie,
257 const unsigned int ib,
258 const unsigned int ia, double& dt) {
259 return GetEntry(ie, ib, ia, "GetElectronTransverseDiffusion",
260 m_eDifT, dt);
261 }
262 /// Set an entry in the table of Townsend coefficients.
263 bool SetElectronTownsend(const unsigned int ie, const unsigned int ib,
264 const unsigned int ia, const double alpha) {
265 return SetEntry(ie, ib, ia, "SetElectronTownsend", m_eAlp, alpha);
266 }
267 /// Get an entry in the table of Townsend coefficients.
268 bool GetElectronTownsend(const unsigned int ie, const unsigned int ib,
269 const unsigned int ia, double& alpha) {
270 return GetEntry(ie, ib, ia, "GetElectronTownsend", m_eAlp, alpha);
271 }
272 /// Set an entry in the table of attachment coefficients.
273 bool SetElectronAttachment(const unsigned int ie, const unsigned int ib,
274 const unsigned int ia, const double eta) {
275 return SetEntry(ie, ib, ia, "SetElectronAttachment", m_eAtt, eta);
276 }
277 /// Get an entry in the table of attachment coefficients.
278 bool GetElectronAttachment(const unsigned int ie, const unsigned int ib,
279 const unsigned int ia, double& eta) {
280 return GetEntry(ie, ib, ia, "GetElectronAttachment", m_eAtt, eta);
281 }
282
283 /// Set an entry in the table of Lorentz angles.
284 bool SetElectronLorentzAngle(const unsigned int ie, const unsigned int ib,
285 const unsigned int ia, const double lor) {
286 return SetEntry(ie, ib, ia, "SetElectronLorentzAngle", m_eLor, lor);
287 }
288 /// Get an entry in the table of Lorentz angles.
289 bool GetElectronLorentzAngle(const unsigned int ie, const unsigned int ib,
290 const unsigned int ia, double& lor) {
291 return GetEntry(ie, ib, ia, "GetElectronLorentzAngle", m_eLor, lor);
292 }
293
294 /// Set an entry in the table of drift speeds along E.
295 bool SetHoleVelocityE(const unsigned int ie, const unsigned int ib,
296 const unsigned int ia, const double v) {
297 return SetEntry(ie, ib, ia, "SetHoleVelocityE", m_hVelE, v);
298 }
299 /// Get an entry in the table of drift speeds along E.
300 bool GetHoleVelocityE(const unsigned int ie, const unsigned int ib,
301 const unsigned int ia, double& v) {
302 return GetEntry(ie, ib, ia, "GetHoleVelocityE", m_hVelE, v);
303 }
304 /// Set an entry in the table of drift speeds along ExB.
305 bool SetHoleVelocityExB(const unsigned int ie, const unsigned int ib,
306 const unsigned int ia, const double v) {
307 return SetEntry(ie, ib, ia, "SetHoleVelocityExB", m_hVelX, v);
308 }
309 /// Get an entry in the table of drift speeds along ExB.
310 bool GetHoleVelocityExB(const unsigned int ie, const unsigned int ib,
311 const unsigned int ia, double& v) {
312 return GetEntry(ie, ib, ia, "GetHoleVelocityExB", m_hVelX, v);
313 }
314 /// Set an entry in the table of drift speeds along Btrans.
315 bool SetHoleVelocityB(const unsigned int ie, const unsigned int ib,
316 const unsigned int ia, const double v) {
317 return SetEntry(ie, ib, ia, "SetHoleVelocityB", m_hVelB, v);
318 }
319 /// Get an entry in the table of drift speeds along Btrans.
320 bool GetHoleVelocityB(const unsigned int ie, const unsigned int ib,
321 const unsigned int ia, double& v) {
322 return GetEntry(ie, ib, ia, "GetHoleVelocityB", m_hVelB, v);
323 }
324
325 /// Set an entry in the table of longitudinal diffusion coefficients.
326 bool SetHoleLongitudinalDiffusion(const unsigned int ie,
327 const unsigned int ib,
328 const unsigned int ia, const double dl) {
329 return SetEntry(ie, ib, ia, "SetHoleLongitudinalDiffusion", m_hDifL, dl);
330 }
331 /// Get an entry in the table of longitudinal diffusion coefficients.
332 bool GetHoleLongitudinalDiffusion(const unsigned int ie,
333 const unsigned int ib,
334 const unsigned int ia, double& dl) {
335 return GetEntry(ie, ib, ia, "GetHoleLongitudinalDiffusion", m_hDifL, dl);
336 }
337 /// Set an entry in the table of transverse diffusion coefficients.
338 bool SetHoleTransverseDiffusion(const unsigned int ie,
339 const unsigned int ib,
340 const unsigned int ia, const double dt) {
341 return SetEntry(ie, ib, ia, "SetHoleTransverseDiffusion", m_hDifT, dt);
342 }
343 /// Get an entry in the table of transverse diffusion coefficients.
344 bool GetHoleTransverseDiffusion(const unsigned int ie, const unsigned int ib,
345 const unsigned int ia, double& dt) {
346 return GetEntry(ie, ib, ia, "GetHoleTransverseDiffusion", m_hDifT, dt);
347 }
348 /// Set an entry in the table of Townsend coefficients.
349 bool SetHoleTownsend(const unsigned int ie, const unsigned int ib,
350 const unsigned int ia, const double alpha) {
351 return SetEntry(ie, ib, ia, "SetHoleTownsend", m_hAlp, alpha);
352 }
353 /// Get an entry in the table of Townsend coefficients.
354 bool GetHoleTownsend(const unsigned int ie, const unsigned int ib,
355 const unsigned int ia, double& alpha) {
356 return GetEntry(ie, ib, ia, "GetHoleTownsend", m_hAlp, alpha);
357 }
358 /// Set an entry in the table of attachment coefficients.
359 bool SetHoleAttachment(const unsigned int ie, const unsigned int ib,
360 const unsigned int ia, const double eta) {
361 return SetEntry(ie, ib, ia, "SetHoleAttachment", m_hAtt, eta);
362 }
363 /// Get an entry in the table of attachment coefficients.
364 bool GetHoleAttachment(const unsigned int ie, const unsigned int ib,
365 const unsigned int ia, double& eta) {
366 return GetEntry(ie, ib, ia, "GetHoleAttachment", m_hAtt, eta);
367 }
368
369 /// Initialise the table of ion mobilities from a list of
370 /// electric fields and corresponding mobilities.
371 /// The mobilities will be interpolated at the electric fields
372 /// of the currently set grid.
373 bool SetIonMobility(const std::vector<double>& fields,
374 const std::vector<double>& mobilities);
375 /// Set an entry in the table of ion mobilities.
376 bool SetIonMobility(const unsigned int ie, const unsigned int ib,
377 const unsigned int ia, const double mu);
378 /// Get an entry in the table of ion mobilities.
379 bool GetIonMobility(const unsigned int ie, const unsigned int ib,
380 const unsigned int ia, double& mu) {
381 return GetEntry(ie, ib, ia, "GetIonMobility", m_iMob, mu);
382 }
383
384 /// Set an entry in the table of longitudinal diffusion coefficients.
385 bool SetIonLongitudinalDiffusion(const unsigned int ie, const unsigned int ib,
386 const unsigned int ia, const double dl) {
387 return SetEntry(ie, ib, ia, "SetIonLongitudinalDiffusion", m_iDifL, dl);
388 }
389 /// Get an entry in the table of longitudinal diffusion coefficients.
390 bool GetIonLongitudinalDiffusion(const unsigned int ie, const unsigned int ib,
391 const unsigned int ia, double& dl) {
392 return GetEntry(ie, ib, ia, "GetIonLongitudinalDiffusion", m_iDifL, dl);
393 }
394 /// Set an entry in the table of transverse diffusion coefficients.
395 bool SetIonTransverseDiffusion(const unsigned int ie, const unsigned int ib,
396 const unsigned int ia, const double dt) {
397 return SetEntry(ie, ib, ia, "SetIonTransverseDiffusion", m_iDifT, dt);
398 }
399 /// Get an entry in the table of transverse diffusion coefficients.
400 bool GetIonTransverseDiffusion(const unsigned int ie, const unsigned int ib,
401 const unsigned int ia, double& dt) {
402 return GetEntry(ie, ib, ia, "GetIonTransverseDiffusion", m_iDifT, dt);
403 }
404 /// Set an entry in the table of dissociation coefficients.
405 bool SetIonDissociation(const unsigned int ie, const unsigned int ib,
406 const unsigned int ia, const double diss) {
407 return SetEntry(ie, ib, ia, "SetIonDissociation", m_iDis, diss);
408 }
409 /// Get an entry in the table of dissociation coefficients.
410 bool GetIonDissociation(const unsigned int ie, const unsigned int ib,
411 const unsigned int ia, double& diss) {
412 return GetEntry(ie, ib, ia, "GetIonDissociation", m_iDis, diss);
413 }
414
415 /// Reset all tables of transport parameters.
416 virtual void ResetTables();
417
419 m_eVelE.clear();
420 m_eVelB.clear();
421 m_eVelX.clear();
422 }
424 m_eDifL.clear();
425 m_eDifT.clear();
426 m_eDifM.clear();
427 }
428 void ResetElectronTownsend() { m_eAlp.clear(); }
429 void ResetElectronAttachment() { m_eAtt.clear(); }
431
433 m_hVelE.clear();
434 m_hVelB.clear();
435 m_hVelX.clear();
436 }
438 m_hDifL.clear();
439 m_hDifT.clear();
440 m_hDifM.clear();
441 }
442 void ResetHoleTownsend() { m_hAlp.clear(); }
443 void ResetHoleAttachment() { m_hAtt.clear(); }
444
445 void ResetIonMobility() { m_iMob.clear(); }
447 m_iDifL.clear();
448 m_iDifT.clear();
449 }
450 void ResetIonDissociation() { m_iDis.clear(); }
451
452 /// Select the extrapolation method for fields below/above the table range.
453 /// Possible options are "constant", "linear", and "exponential".
454 void SetExtrapolationMethodVelocity(const std::string& extrLow,
455 const std::string& extrHigh);
456 void SetExtrapolationMethodDiffusion(const std::string& extrLow,
457 const std::string& extrHigh);
458 void SetExtrapolationMethodTownsend(const std::string& extrLow,
459 const std::string& extrHigh);
460 void SetExtrapolationMethodAttachment(const std::string& extrLow,
461 const std::string& extrHigh);
462 void SetExtrapolationMethodIonMobility(const std::string& extrLow,
463 const std::string& extrHigh);
464 void SetExtrapolationMethodIonDissociation(const std::string& extrLow,
465 const std::string& extrHigh);
466
467 /// Set the degree of polynomial interpolation (usually 2).
468 void SetInterpolationMethodVelocity(const unsigned int intrp);
469 void SetInterpolationMethodDiffusion(const unsigned int intrp);
470 void SetInterpolationMethodTownsend(const unsigned int intrp);
471 void SetInterpolationMethodAttachment(const unsigned int intrp);
472 void SetInterpolationMethodIonMobility(const unsigned int intrp);
473 void SetInterpolationMethodIonDissociation(const unsigned int intrp);
474
475 // Scaling of fields and transport parameters.
476 virtual double ScaleElectricField(const double e) const { return e; }
477 virtual double UnScaleElectricField(const double e) const { return e; }
478 virtual double ScaleVelocity(const double v) const { return v; }
479 virtual double ScaleDiffusion(const double d) const { return d; }
480 virtual double ScaleDiffusionTensor(const double d) const { return d; }
481 virtual double ScaleTownsend(const double alpha) const { return alpha; }
482 virtual double ScaleAttachment(const double eta) const { return eta; }
483 virtual double ScaleLorentzAngle(const double lor) const { return lor; }
484 virtual double ScaleDissociation(const double diss) const { return diss; }
485
486 // Optical properties
487 /// Get the energy range [eV] of the available optical data.
488 virtual bool GetOpticalDataRange(double& emin, double& emax,
489 const unsigned int i = 0);
490 /// Get the complex dielectric function at a given energy.
491 virtual bool GetDielectricFunction(const double e, double& eps1, double& eps2,
492 const unsigned int i = 0);
493 // Get the photoabsorption cross-section [cm2] at a given energy.
494 virtual bool GetPhotoAbsorptionCrossSection(const double e, double& sigma,
495 const unsigned int i = 0);
496 virtual double GetPhotonCollisionRate(const double e);
497 virtual bool GetPhotonCollision(const double e, int& type, int& level,
498 double& e1, double& ctheta, int& nsec,
499 double& esec);
500
501 /// Switch on/off debugging messages
502 void EnableDebugging() { m_debug = true; }
503 void DisableDebugging() { m_debug = false; }
504
505 protected:
506 std::string m_className = "Medium";
507
508 static int m_idCounter;
509
510 // Id number
511 int m_id;
512 // Name
513 std::string m_name = "";
514 // Temperature [K]
515 double m_temperature = 293.15;
516 // Pressure [Torr]
517 double m_pressure = 760.;
518 // Static dielectric constant
519 double m_epsilon = 1.;
520 // Number of components
521 unsigned int m_nComponents = 1;
522 // (Effective) atomic number Z
523 double m_z = 1.;
524 // Atomic weight A
525 double m_a = 0.;
526 // Number density [cm-3]
527 double m_density = 0.;
528
529 // Transport flags
530 bool m_driftable = false;
531 bool m_microscopic = false;
532 bool m_ionisable = false;
533
534 // W value
535 double m_w = 0.;
536 // Fano factor
537 double m_fano = 0.;
538
539 // Update flag
540 bool m_isChanged = true;
541
542 // Switch on/off debugging messages
543 bool m_debug = false;
544
545 // Field grids
546 std::vector<double> m_eFields;
547 std::vector<double> m_bFields;
548 std::vector<double> m_bAngles;
549
550 // Tables of transport parameters
551 bool m_tab2d = false;
552 // Electrons
553 std::vector<std::vector<std::vector<double> > > m_eVelE;
554 std::vector<std::vector<std::vector<double> > > m_eVelX;
555 std::vector<std::vector<std::vector<double> > > m_eVelB;
556 std::vector<std::vector<std::vector<double> > > m_eDifL;
557 std::vector<std::vector<std::vector<double> > > m_eDifT;
558 std::vector<std::vector<std::vector<double> > > m_eAlp;
559 std::vector<std::vector<std::vector<double> > > m_eAtt;
560 std::vector<std::vector<std::vector<double> > > m_eLor;
561
562 std::vector<std::vector<std::vector<std::vector<double> > > > m_eDifM;
563
564 // Holes
565 std::vector<std::vector<std::vector<double> > > m_hVelE;
566 std::vector<std::vector<std::vector<double> > > m_hVelX;
567 std::vector<std::vector<std::vector<double> > > m_hVelB;
568 std::vector<std::vector<std::vector<double> > > m_hDifL;
569 std::vector<std::vector<std::vector<double> > > m_hDifT;
570 std::vector<std::vector<std::vector<double> > > m_hAlp;
571 std::vector<std::vector<std::vector<double> > > m_hAtt;
572
573 std::vector<std::vector<std::vector<std::vector<double> > > > m_hDifM;
574
575 // Ions
576 std::vector<std::vector<std::vector<double> > > m_iMob;
577 std::vector<std::vector<std::vector<double> > > m_iDifL;
578 std::vector<std::vector<std::vector<double> > > m_iDifT;
579 std::vector<std::vector<std::vector<double> > > m_iDis;
580
581 // Thresholds for Townsend, attachment and dissociation coefficients.
582 unsigned int m_eThrAlp = 0;
583 unsigned int m_eThrAtt = 0;
584 unsigned int m_hThrAlp = 0;
585 unsigned int m_hThrAtt = 0;
586 unsigned int m_iThrDis = 0;
587
588 // Extrapolation methods (TODO: enum).
589 std::pair<unsigned int, unsigned int> m_extrVel = {0, 1};
590 std::pair<unsigned int, unsigned int> m_extrDif = {0, 1};
591 std::pair<unsigned int, unsigned int> m_extrAlp = {0, 1};
592 std::pair<unsigned int, unsigned int> m_extrAtt = {0, 1};
593 std::pair<unsigned int, unsigned int> m_extrLor = {0, 1};
594 std::pair<unsigned int, unsigned int> m_extrMob = {0, 1};
595 std::pair<unsigned int, unsigned int> m_extrDis = {0, 1};
596
597 // Interpolation methods
598 unsigned int m_intpVel = 2;
599 unsigned int m_intpDif = 2;
600 unsigned int m_intpAlp = 2;
601 unsigned int m_intpAtt = 2;
602 unsigned int m_intpLor = 2;
603 unsigned int m_intpMob = 2;
604 unsigned int m_intpDis = 2;
605
606 bool Velocity(const double ex, const double ey, const double ez,
607 const double bx, const double by, const double bz,
608 const std::vector<std::vector<std::vector<double> > >& velE,
609 const std::vector<std::vector<std::vector<double> > >& velB,
610 const std::vector<std::vector<std::vector<double> > >& velX,
611 const double q, double& vx, double& vy, double& vz) const;
612 bool Diffusion(const double ex, const double ey, const double ez,
613 const double bx, const double by, const double bz,
614 const std::vector<std::vector<std::vector<double> > >& difL,
615 const std::vector<std::vector<std::vector<double> > >& difT,
616 double& dl, double& dt) const;
617 bool Diffusion(const double ex, const double ey, const double ez,
618 const double bx, const double by, const double bz,
619 const std::vector<std::vector<std::vector<std::vector<double> > > >& diff,
620 double cov[3][3]) const;
621 bool Alpha(const double ex, const double ey, const double ez,
622 const double bx, const double by, const double bz,
623 const std::vector<std::vector<std::vector<double> > >& tab,
624 unsigned int intp, const unsigned int thr,
625 const std::pair<unsigned int, unsigned int>& extr,
626 double& alpha) const;
627 double GetAngle(const double ex, const double ey, const double ez,
628 const double bx, const double by, const double bz,
629 const double e, const double b) const;
630 bool Interpolate(const double e, const double b, const double a,
631 const std::vector<std::vector<std::vector<double> > >& table,
632 double& y, const unsigned int intp,
633 const std::pair<unsigned int, unsigned int>& extr) const;
634
635 double Interpolate1D(const double e, const std::vector<double>& table,
636 const std::vector<double>& fields,
637 const unsigned int intpMeth,
638 const std::pair<unsigned int, unsigned int>& extr) const;
639
640 bool SetEntry(const unsigned int i, const unsigned int j,
641 const unsigned int k, const std::string& fcn,
642 std::vector<std::vector<std::vector<double> > >& tab,
643 const double val);
644 bool GetEntry(const unsigned int i, const unsigned int j,
645 const unsigned int k, const std::string& fcn,
646 const std::vector<std::vector<std::vector<double> > >& tab,
647 double& val) const;
648
649 void SetExtrapolationMethod(const std::string& low, const std::string& high,
650 std::pair<unsigned int, unsigned int>& extr,
651 const std::string& fcn);
652 bool GetExtrapolationIndex(std::string str, unsigned int& nb) const;
653 unsigned int SetThreshold(
654 const std::vector<std::vector<std::vector<double> > >& tab) const;
655
656 void Clone(std::vector<std::vector<std::vector<double> > >& tab,
657 const std::vector<double>& efields,
658 const std::vector<double>& bfields,
659 const std::vector<double>& angles, const unsigned int intp,
660 const std::pair<unsigned int, unsigned int>& extr,
661 const double init, const std::string& label);
662 void Clone(
663 std::vector<std::vector<std::vector<std::vector<double> > > >& tab,
664 const unsigned int n, const std::vector<double>& efields,
665 const std::vector<double>& bfields, const std::vector<double>& angles,
666 const unsigned int intp,
667 const std::pair<unsigned int, unsigned int>& extr, const double init,
668 const std::string& label);
669
670 void Init(const size_t nE, const size_t nB, const size_t nA,
671 std::vector<std::vector<std::vector<double> > >& tab,
672 const double val);
673 void Init(
674 const size_t nE, const size_t nB, const size_t nA, const size_t nT,
675 std::vector<std::vector<std::vector<std::vector<double> > > >& tab,
676 const double val);
677};
678}
679
680#endif
Abstract base class for media.
Definition: Medium.hh:13
virtual double IonMobility()
Low-field mobility [cm2 V-1 ns-1].
Definition: Medium.cc:620
void ResetHoleAttachment()
Definition: Medium.hh:443
virtual void GetComponent(const unsigned int i, std::string &label, double &f)
Get the name and fraction of a given component.
Definition: Medium.cc:105
bool Interpolate(const double e, const double b, const double a, const std::vector< std::vector< std::vector< double > > > &table, double &y, const unsigned int intp, const std::pair< unsigned int, unsigned int > &extr) const
Definition: Medium.cc:1210
double m_density
Definition: Medium.hh:527
void ResetIonMobility()
Definition: Medium.hh:445
virtual bool GetPhotonCollision(const double e, int &type, int &level, double &e1, double &ctheta, int &nsec, double &esec)
Definition: Medium.cc:682
virtual double UnScaleElectricField(const double e) const
Definition: Medium.hh:477
virtual double ScaleVelocity(const double v) const
Definition: Medium.hh:478
void ResetElectronAttachment()
Definition: Medium.hh:429
virtual double GetMassDensity() const
Get the mass density [g/cm3].
Definition: Medium.cc:101
double GetFanoFactor()
Get the Fano factor.
Definition: Medium.hh:87
std::vector< double > m_bFields
Definition: Medium.hh:547
void ResetIonDiffusion()
Definition: Medium.hh:446
bool GetIonDissociation(const unsigned int ie, const unsigned int ib, const unsigned int ia, double &diss)
Get an entry in the table of dissociation coefficients.
Definition: Medium.hh:410
bool SetElectronTownsend(const unsigned int ie, const unsigned int ib, const unsigned int ia, const double alpha)
Set an entry in the table of Townsend coefficients.
Definition: Medium.hh:263
virtual void GetElectronMomentum(const double e, double &px, double &py, double &pz, int &band)
Definition: Medium.cc:473
bool IsMicroscopic() const
Does the medium have electron scattering rates?
Definition: Medium.hh:76
void SetTemperature(const double t)
Set the temperature [K].
Definition: Medium.cc:71
bool m_microscopic
Definition: Medium.hh:531
bool GetElectronVelocityB(const unsigned int ie, const unsigned int ib, const unsigned int ia, double &v)
Get an entry in the table of drift speeds along Btrans.
Definition: Medium.hh:228
bool GetElectronVelocityE(const unsigned int ie, const unsigned int ib, const unsigned int ia, double &v)
Get an entry in the table of drift speeds along E.
Definition: Medium.hh:208
void ResetElectronLorentzAngle()
Definition: Medium.hh:430
double m_pressure
Definition: Medium.hh:517
void SetFanoFactor(const double f)
Set the Fano factor.
Definition: Medium.hh:85
virtual bool HoleTownsend(const double ex, const double ey, const double ez, const double bx, const double by, const double bz, double &alpha)
Ionisation coefficient [cm-1].
Definition: Medium.cc:534
double m_fano
Definition: Medium.hh:537
bool SetIonDissociation(const unsigned int ie, const unsigned int ib, const unsigned int ia, const double diss)
Set an entry in the table of dissociation coefficients.
Definition: Medium.hh:405
double GetW()
Get the W value.
Definition: Medium.hh:83
unsigned int m_intpMob
Definition: Medium.hh:603
virtual double ScaleAttachment(const double eta) const
Definition: Medium.hh:482
void SetExtrapolationMethodIonDissociation(const std::string &extrLow, const std::string &extrHigh)
Definition: Medium.cc:1102
void SetInterpolationMethodIonDissociation(const unsigned int intrp)
Definition: Medium.cc:1190
double Interpolate1D(const double e, const std::vector< double > &table, const std::vector< double > &fields, const unsigned int intpMeth, const std::pair< unsigned int, unsigned int > &extr) const
Definition: Medium.cc:1230
double GetAngle(const double ex, const double ey, const double ez, const double bx, const double by, const double bz, const double e, const double b) const
Definition: Medium.cc:1194
virtual double ScaleDiffusion(const double d) const
Definition: Medium.hh:479
virtual double ElectronMobility()
Low-field mobility [cm2 V-1 ns-1].
Definition: Medium.cc:453
virtual double GetNumberDensity() const
Get the number density [cm-3].
Definition: Medium.hh:60
virtual unsigned int GetNumberOfDeexcitationProducts() const
Definition: Medium.hh:144
unsigned int SetThreshold(const std::vector< std::vector< std::vector< double > > > &tab) const
Definition: Medium.cc:1146
virtual 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)
Drift velocity [cm / ns].
Definition: Medium.cc:513
virtual double ScaleLorentzAngle(const double lor) const
Definition: Medium.hh:483
unsigned int m_intpDis
Definition: Medium.hh:604
virtual bool ElectronLorentzAngle(const double ex, const double ey, const double ez, const double bx, const double by, const double bz, double &lor)
Lorentz angle.
Definition: Medium.cc:429
bool GetIonLongitudinalDiffusion(const unsigned int ie, const unsigned int ib, const unsigned int ia, double &dl)
Get an entry in the table of longitudinal diffusion coefficients.
Definition: Medium.hh:390
bool Diffusion(const double ex, const double ey, const double ez, const double bx, const double by, const double bz, const std::vector< std::vector< std::vector< double > > > &difL, const std::vector< std::vector< std::vector< double > > > &difT, double &dl, double &dt) const
Definition: Medium.cc:269
bool GetHoleAttachment(const unsigned int ie, const unsigned int ib, const unsigned int ia, double &eta)
Get an entry in the table of attachment coefficients.
Definition: Medium.hh:364
bool GetHoleVelocityExB(const unsigned int ie, const unsigned int ib, const unsigned int ia, double &v)
Get an entry in the table of drift speeds along ExB.
Definition: Medium.hh:310
std::vector< std::vector< std::vector< double > > > m_eAlp
Definition: Medium.hh:558
void ResetHoleVelocity()
Definition: Medium.hh:432
std::vector< std::vector< std::vector< double > > > m_hAlp
Definition: Medium.hh:570
void ResetIonDissociation()
Definition: Medium.hh:450
bool GetElectronAttachment(const unsigned int ie, const unsigned int ib, const unsigned int ia, double &eta)
Get an entry in the table of attachment coefficients.
Definition: Medium.hh:278
virtual bool GetDielectricFunction(const double e, double &eps1, double &eps2, const unsigned int i=0)
Get the complex dielectric function at a given energy.
Definition: Medium.cc:636
virtual void EnableDrift(const bool on=true)
Switch electron/ion/hole on/off.
Definition: Medium.hh:67
double GetDielectricConstant() const
Get the relative static dielectric constant.
Definition: Medium.hh:42
virtual void SetNumberDensity(const double n)
Set the number density [cm-3].
Definition: Medium.cc:134
std::string m_name
Definition: Medium.hh:513
bool SetElectronVelocityB(const unsigned int ie, const unsigned int ib, const unsigned int ia, const double v)
Set an entry in the table of drift speeds along Btrans.
Definition: Medium.hh:223
double GetPressure() const
Definition: Medium.hh:38
unsigned int m_intpDif
Definition: Medium.hh:599
bool m_driftable
Definition: Medium.hh:530
virtual 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)
Drift velocity [cm / ns].
Definition: Medium.cc:379
virtual bool IonVelocity(const double ex, const double ey, const double ez, const double bx, const double by, const double bz, double &vx, double &vy, double &vz)
Drift velocity [cm / ns].
Definition: Medium.cc:565
virtual void EnablePrimaryIonisation(const bool on=true)
Make the medium ionisable or non-ionisable.
Definition: Medium.hh:69
std::pair< unsigned int, unsigned int > m_extrAtt
Definition: Medium.hh:592
int GetId() const
Return the id number of the class instance.
Definition: Medium.hh:21
bool GetIonMobility(const unsigned int ie, const unsigned int ib, const unsigned int ia, double &mu)
Get an entry in the table of ion mobilities.
Definition: Medium.hh:379
void SetExtrapolationMethodTownsend(const std::string &extrLow, const std::string &extrHigh)
Definition: Medium.cc:1087
virtual void SetAtomicNumber(const double z)
Set the effective atomic number.
Definition: Medium.cc:114
bool SetElectronTransverseDiffusion(const unsigned int ie, const unsigned int ib, const unsigned int ia, const double dt)
Set an entry in the table of transverse diffusion coefficients.
Definition: Medium.hh:248
bool SetHoleTransverseDiffusion(const unsigned int ie, const unsigned int ib, const unsigned int ia, const double dt)
Set an entry in the table of transverse diffusion coefficients.
Definition: Medium.hh:338
virtual double GetAtomicWeight() const
Get the effective atomic weight.
Definition: Medium.hh:56
bool SetHoleTownsend(const unsigned int ie, const unsigned int ib, const unsigned int ia, const double alpha)
Set an entry in the table of Townsend coefficients.
Definition: Medium.hh:349
virtual 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)
Sample the collision type. Update energy and direction vector.
Definition: Medium.cc:491
std::vector< std::vector< std::vector< double > > > m_iDifT
Definition: Medium.hh:578
bool GetEntry(const unsigned int i, const unsigned int j, const unsigned int k, const std::string &fcn, const std::vector< std::vector< std::vector< double > > > &tab, double &val) const
Definition: Medium.cc:888
void SetExtrapolationMethodIonMobility(const std::string &extrLow, const std::string &extrHigh)
Definition: Medium.cc:1097
unsigned int m_hThrAtt
Definition: Medium.hh:585
std::pair< unsigned int, unsigned int > m_extrVel
Definition: Medium.hh:589
virtual double ScaleElectricField(const double e) const
Definition: Medium.hh:476
bool SetEntry(const unsigned int i, const unsigned int j, const unsigned int k, const std::string &fcn, std::vector< std::vector< std::vector< double > > > &tab, const double val)
Definition: Medium.cc:872
virtual double ScaleDiffusionTensor(const double d) const
Definition: Medium.hh:480
unsigned int GetNumberOfComponents() const
Get number of components of the medium.
Definition: Medium.hh:45
std::vector< std::vector< std::vector< double > > > m_hDifL
Definition: Medium.hh:568
virtual double GetElectronNullCollisionRate(const int band=0)
Null-collision rate [ns-1].
Definition: Medium.cc:480
virtual double GetAtomicNumber() const
Get the effective atomic number.
Definition: Medium.hh:52
bool GetElectronTownsend(const unsigned int ie, const unsigned int ib, const unsigned int ia, double &alpha)
Get an entry in the table of Townsend coefficients.
Definition: Medium.hh:268
std::vector< std::vector< std::vector< double > > > m_eVelE
Definition: Medium.hh:553
std::vector< std::vector< std::vector< double > > > m_eVelX
Definition: Medium.hh:554
std::vector< std::vector< std::vector< double > > > m_eDifL
Definition: Medium.hh:556
void Init(const size_t nE, const size_t nB, const size_t nA, std::vector< std::vector< std::vector< double > > > &tab, const double val)
Definition: Medium.cc:1304
bool GetElectronLorentzAngle(const unsigned int ie, const unsigned int ib, const unsigned int ia, double &lor)
Get an entry in the table of Lorentz angles.
Definition: Medium.hh:289
virtual double ScaleTownsend(const double alpha) const
Definition: Medium.hh:481
unsigned int m_intpVel
Definition: Medium.hh:598
virtual double GetPhotonCollisionRate(const double e)
Definition: Medium.cc:675
void SetDielectricConstant(const double eps)
Set the relative static dielectric constant.
Definition: Medium.cc:91
virtual bool GetDeexcitationProduct(const unsigned int i, double &t, double &s, int &type, double &energy) const
Definition: Medium.cc:504
virtual double GetElectronCollisionRate(const double e, const int band=0)
Collision rate [ns-1] for given electron energy.
Definition: Medium.cc:485
bool GetHoleTownsend(const unsigned int ie, const unsigned int ib, const unsigned int ia, double &alpha)
Get an entry in the table of Townsend coefficients.
Definition: Medium.hh:354
bool GetExtrapolationIndex(std::string str, unsigned int &nb) const
Definition: Medium.cc:1127
void SetInterpolationMethodVelocity(const unsigned int intrp)
Set the degree of polynomial interpolation (usually 2).
Definition: Medium.cc:1170
virtual bool ElectronDiffusion(const double ex, const double ey, const double ez, const double bx, const double by, const double bz, double &dl, double &dt)
Longitudinal and transverse diffusion coefficients [cm1/2].
Definition: Medium.cc:387
void SetInterpolationMethodDiffusion(const unsigned int intrp)
Definition: Medium.cc:1174
bool SetElectronVelocityE(const unsigned int ie, const unsigned int ib, const unsigned int ia, const double v)
Set an entry in the table of drift speeds along E.
Definition: Medium.hh:203
double m_epsilon
Definition: Medium.hh:519
void SetExtrapolationMethodDiffusion(const std::string &extrLow, const std::string &extrHigh)
Definition: Medium.cc:1082
std::vector< double > m_eFields
Definition: Medium.hh:546
void GetFieldGrid(std::vector< double > &efields, std::vector< double > &bfields, std::vector< double > &angles)
Get the fields and E-B angles used in the transport tables.
Definition: Medium.cc:864
bool SetIonLongitudinalDiffusion(const unsigned int ie, const unsigned int ib, const unsigned int ia, const double dl)
Set an entry in the table of longitudinal diffusion coefficients.
Definition: Medium.hh:385
static int m_idCounter
Definition: Medium.hh:508
std::vector< std::vector< std::vector< double > > > m_hDifT
Definition: Medium.hh:569
void DisableDebugging()
Definition: Medium.hh:503
virtual bool ElectronTownsend(const double ex, const double ey, const double ez, const double bx, const double by, const double bz, double &alpha)
Ionisation coefficient [cm-1].
Definition: Medium.cc:403
void ResetElectronDiffusion()
Definition: Medium.hh:423
virtual bool IsSemiconductor() const
Is this medium a semiconductor?
Definition: Medium.hh:27
void SetFieldGrid(double emin, double emax, const size_t ne, bool logE, double bmin=0., double bmax=0., const size_t nb=1, double amin=HalfPi, double amax=HalfPi, const size_t na=1)
Set the range of fields to be covered by the transport tables.
Definition: Medium.cc:693
virtual bool GetOpticalDataRange(double &emin, double &emax, const unsigned int i=0)
Get the energy range [eV] of the available optical data.
Definition: Medium.cc:624
std::vector< std::vector< std::vector< double > > > m_eAtt
Definition: Medium.hh:559
virtual void SetMassDensity(const double rho)
Set the mass density [g/cm3].
Definition: Medium.cc:144
bool SetHoleVelocityE(const unsigned int ie, const unsigned int ib, const unsigned int ia, const double v)
Set an entry in the table of drift speeds along E.
Definition: Medium.hh:295
virtual double ScaleDissociation(const double diss) const
Definition: Medium.hh:484
bool GetElectronVelocityExB(const unsigned int ie, const unsigned int ib, const unsigned int ia, double &v)
Get an entry in the table of drift speeds along ExB.
Definition: Medium.hh:218
bool Alpha(const double ex, const double ey, const double ez, const double bx, const double by, const double bz, const std::vector< std::vector< std::vector< double > > > &tab, unsigned int intp, const unsigned int thr, const std::pair< unsigned int, unsigned int > &extr, double &alpha) const
Definition: Medium.cc:348
const std::string & GetName() const
Get the medium name/identifier.
Definition: Medium.hh:23
std::vector< double > m_bAngles
Definition: Medium.hh:548
Medium()
Constructor.
Definition: Medium.cc:60
std::vector< std::vector< std::vector< double > > > m_iDifL
Definition: Medium.hh:577
std::vector< std::vector< std::vector< double > > > m_hVelE
Definition: Medium.hh:565
virtual bool IsGas() const
Is this medium a gas?
Definition: Medium.hh:25
std::vector< std::vector< std::vector< double > > > m_eLor
Definition: Medium.hh:560
std::vector< std::vector< std::vector< double > > > m_eDifT
Definition: Medium.hh:557
bool GetElectronTransverseDiffusion(const unsigned int ie, const unsigned int ib, const unsigned int ia, double &dt)
Get an entry in the table of transverse diffusion coefficients.
Definition: Medium.hh:256
virtual double GetElectronEnergy(const double px, const double py, const double pz, double &vx, double &vy, double &vz, const int band=0)
Dispersion relation (energy vs. wave vector)
Definition: Medium.cc:458
void SetInterpolationMethodIonMobility(const unsigned int intrp)
Definition: Medium.cc:1186
unsigned int m_intpAtt
Definition: Medium.hh:601
void SetExtrapolationMethodVelocity(const std::string &extrLow, const std::string &extrHigh)
Definition: Medium.cc:1077
virtual bool ElectronAttachment(const double ex, const double ey, const double ez, const double bx, const double by, const double bz, double &eta)
Attachment coefficient [cm-1].
Definition: Medium.cc:416
virtual double HoleMobility()
Low-field mobility [cm2 V-1 ns-1].
Definition: Medium.cc:560
std::pair< unsigned int, unsigned int > m_extrDis
Definition: Medium.hh:595
std::vector< std::vector< std::vector< double > > > m_hAtt
Definition: Medium.hh:571
void SetPressure(const double p)
Definition: Medium.cc:81
void SetExtrapolationMethod(const std::string &low, const std::string &high, std::pair< unsigned int, unsigned int > &extr, const std::string &fcn)
Definition: Medium.cc:1107
bool GetHoleVelocityE(const unsigned int ie, const unsigned int ib, const unsigned int ia, double &v)
Get an entry in the table of drift speeds along E.
Definition: Medium.hh:300
std::pair< unsigned int, unsigned int > m_extrAlp
Definition: Medium.hh:591
void EnableDebugging()
Switch on/off debugging messages.
Definition: Medium.hh:502
std::vector< std::vector< std::vector< double > > > m_eVelB
Definition: Medium.hh:555
unsigned int m_eThrAtt
Definition: Medium.hh:583
bool GetHoleVelocityB(const unsigned int ie, const unsigned int ib, const unsigned int ia, double &v)
Get an entry in the table of drift speeds along Btrans.
Definition: Medium.hh:320
bool IsIonisable() const
Is charge deposition by charged particles/photon enabled in this medium?
Definition: Medium.hh:78
bool m_ionisable
Definition: Medium.hh:532
virtual void SetAtomicWeight(const double a)
Set the effective atomic weight.
Definition: Medium.cc:124
void SetExtrapolationMethodAttachment(const std::string &extrLow, const std::string &extrHigh)
Definition: Medium.cc:1092
std::pair< unsigned int, unsigned int > m_extrLor
Definition: Medium.hh:593
unsigned int m_nComponents
Definition: Medium.hh:521
virtual bool IsConductor() const
Is this medium a conductor?
Definition: Medium.hh:29
unsigned int m_intpLor
Definition: Medium.hh:602
bool SetHoleAttachment(const unsigned int ie, const unsigned int ib, const unsigned int ia, const double eta)
Set an entry in the table of attachment coefficients.
Definition: Medium.hh:359
std::string m_className
Definition: Medium.hh:506
bool GetHoleTransverseDiffusion(const unsigned int ie, const unsigned int ib, const unsigned int ia, double &dt)
Get an entry in the table of transverse diffusion coefficients.
Definition: Medium.hh:344
bool GetElectronLongitudinalDiffusion(const unsigned int ie, const unsigned int ib, const unsigned int ia, double &dl)
Get an entry in the table of longitudinal diffusion coefficients.
Definition: Medium.hh:241
std::pair< unsigned int, unsigned int > m_extrDif
Definition: Medium.hh:590
void SetInterpolationMethodAttachment(const unsigned int intrp)
Definition: Medium.cc:1182
virtual bool HoleDiffusion(const double ex, const double ey, const double ez, const double bx, const double by, const double bz, double &dl, double &dt)
Longitudinal and transverse diffusion coefficients [cm1/2].
Definition: Medium.cc:521
bool SetElectronLorentzAngle(const unsigned int ie, const unsigned int ib, const unsigned int ia, const double lor)
Set an entry in the table of Lorentz angles.
Definition: Medium.hh:284
double GetTemperature() const
Get the temperature [K].
Definition: Medium.hh:34
bool GetHoleLongitudinalDiffusion(const unsigned int ie, const unsigned int ib, const unsigned int ia, double &dl)
Get an entry in the table of longitudinal diffusion coefficients.
Definition: Medium.hh:332
unsigned int m_iThrDis
Definition: Medium.hh:586
virtual bool IonDissociation(const double ex, const double ey, const double ez, const double bx, const double by, const double bz, double &diss)
Dissociation coefficient.
Definition: Medium.cc:607
virtual void ResetTables()
Reset all tables of transport parameters.
Definition: Medium.cc:905
bool SetElectronVelocityExB(const unsigned int ie, const unsigned int ib, const unsigned int ia, const double v)
Set an entry in the table of drift speeds along ExB.
Definition: Medium.hh:213
bool SetHoleVelocityExB(const unsigned int ie, const unsigned int ib, const unsigned int ia, const double v)
Set an entry in the table of drift speeds along ExB.
Definition: Medium.hh:305
bool SetHoleLongitudinalDiffusion(const unsigned int ie, const unsigned int ib, const unsigned int ia, const double dl)
Set an entry in the table of longitudinal diffusion coefficients.
Definition: Medium.hh:326
std::vector< std::vector< std::vector< double > > > m_hVelX
Definition: Medium.hh:566
virtual ~Medium()
Destructor.
Definition: Medium.cc:69
std::pair< unsigned int, unsigned int > m_extrMob
Definition: Medium.hh:594
void Clone(std::vector< std::vector< std::vector< double > > > &tab, const std::vector< double > &efields, const std::vector< double > &bfields, const std::vector< double > &angles, const unsigned int intp, const std::pair< unsigned int, unsigned int > &extr, const double init, const std::string &label)
Definition: Medium.cc:922
bool SetHoleVelocityB(const unsigned int ie, const unsigned int ib, const unsigned int ia, const double v)
Set an entry in the table of drift speeds along Btrans.
Definition: Medium.hh:315
void ResetHoleDiffusion()
Definition: Medium.hh:437
std::vector< std::vector< std::vector< std::vector< double > > > > m_eDifM
Definition: Medium.hh:562
std::vector< std::vector< std::vector< double > > > m_hVelB
Definition: Medium.hh:567
bool m_isChanged
Definition: Medium.hh:540
bool Velocity(const double ex, const double ey, const double ez, const double bx, const double by, const double bz, const std::vector< std::vector< std::vector< double > > > &velE, const std::vector< std::vector< std::vector< double > > > &velB, const std::vector< std::vector< std::vector< double > > > &velX, const double q, double &vx, double &vy, double &vz) const
Definition: Medium.cc:160
std::vector< std::vector< std::vector< std::vector< double > > > > m_hDifM
Definition: Medium.hh:573
unsigned int m_hThrAlp
Definition: Medium.hh:584
void SetW(const double w)
Set the W value (average energy to produce an electron/ion or e/h pair).
Definition: Medium.hh:81
std::vector< std::vector< std::vector< double > > > m_iMob
Definition: Medium.hh:576
bool SetElectronAttachment(const unsigned int ie, const unsigned int ib, const unsigned int ia, const double eta)
Set an entry in the table of attachment coefficients.
Definition: Medium.hh:273
void ResetElectronTownsend()
Definition: Medium.hh:428
unsigned int m_eThrAlp
Definition: Medium.hh:582
virtual bool HoleAttachment(const double ex, const double ey, const double ez, const double bx, const double by, const double bz, double &eta)
Attachment coefficient [cm-1].
Definition: Medium.cc:547
bool IsDriftable() const
Is charge carrier transport enabled in this medium?
Definition: Medium.hh:74
void ResetHoleTownsend()
Definition: Medium.hh:442
void ResetElectronVelocity()
Definition: Medium.hh:418
void SetInterpolationMethodTownsend(const unsigned int intrp)
Definition: Medium.cc:1178
virtual bool GetPhotoAbsorptionCrossSection(const double e, double &sigma, const unsigned int i=0)
Definition: Medium.cc:654
virtual bool IonDiffusion(const double ex, const double ey, const double ez, const double bx, const double by, const double bz, double &dl, double &dt)
Longitudinal and transverse diffusion coefficients [cm1/2].
Definition: Medium.cc:600
double m_temperature
Definition: Medium.hh:515
bool SetElectronLongitudinalDiffusion(const unsigned int ie, const unsigned int ib, const unsigned int ia, const double dl)
Set an entry in the table of longitudinal diffusion coefficients.
Definition: Medium.hh:233
std::vector< std::vector< std::vector< double > > > m_iDis
Definition: Medium.hh:579
bool SetIonTransverseDiffusion(const unsigned int ie, const unsigned int ib, const unsigned int ia, const double dt)
Set an entry in the table of transverse diffusion coefficients.
Definition: Medium.hh:395
bool GetIonTransverseDiffusion(const unsigned int ie, const unsigned int ib, const unsigned int ia, double &dt)
Get an entry in the table of transverse diffusion coefficients.
Definition: Medium.hh:400
bool SetIonMobility(const std::vector< double > &fields, const std::vector< double > &mobilities)
Definition: Medium.cc:1044
unsigned int m_intpAlp
Definition: Medium.hh:600