Garfield++ 5.0
A toolkit for the detailed simulation of particle detectors based on ionisation measurement in gases and semiconductors
Loading...
Searching...
No Matches
MediumGaAs.cc
Go to the documentation of this file.
1#include <algorithm>
2#include <cmath>
3#include <fstream>
4#include <iostream>
5#include <sstream>
6
10#include "Garfield/Random.hh"
11
12namespace Garfield {
13
15 m_className = "MediumGaAs";
16 m_name = "GaAs";
17
18 SetTemperature(300.);
23
24 m_driftable = true;
25 m_ionisable = true;
26 m_microscopic = false;
27
28 m_w = 4.35;
29 m_fano = 0.1;
30}
31
32void MediumGaAs::GetComponent(const unsigned int i, std::string& label,
33 double& f) {
34 if (i == 0) {
35 label = "Ga";
36 f = 0.5;
37 } else if (i == 1) {
38 label = "As";
39 f = 0.5;
40 }
41}
42
43bool MediumGaAs::ElectronVelocity(const double ex, const double ey,
44 const double ez, const double bx,
45 const double by, const double bz, double& vx,
46 double& vy, double& vz) {
47 vx = vy = vz = 0.;
48 if (m_isChanged) {
49 UpdateTransportParameters();
50 m_isChanged = false;
51 }
52 if (!m_eVelE.empty()) {
53 // Interpolation in user table.
54 return Medium::ElectronVelocity(ex, ey, ez, bx, by, bz, vx, vy, vz);
55 }
56 // Calculate the mobility.
57 // - J. J. Barnes, R. J. Lomax, G. I. Haddad,
58 // IEEE Trans. Electron Devices ED-23 (1976), 1042.
59 const double e2 = ex * ex + ey * ey + ez * ez;
60 // Inverse of the critical field.
61 constexpr double r = 1. / 4000.;
62 constexpr double r4 = r * r * r * r;
63 const double er4 = e2 * e2 * r4;
64 const double mu = -(m_eMobility + er4 * m_eSatVel / sqrt(e2)) / (1. + er4);
65 const double b2 = bx * bx + by * by + bz * bz;
66 if (b2 < Small) {
67 vx = mu * ex;
68 vy = mu * ey;
69 vz = mu * ez;
70 } else {
71 Langevin(ex, ey, ez, bx, by, bz, mu, m_eHallFactor * mu, vx, vy, vz);
72 }
73 return true;
74}
75
76bool MediumGaAs::ElectronTownsend(const double ex, const double ey,
77 const double ez, const double bx,
78 const double by, const double bz,
79 double& alpha) {
80 alpha = 0.;
81 if (m_isChanged) {
82 UpdateTransportParameters();
83 m_isChanged = false;
84 }
85 if (!m_eAlp.empty()) {
86 // Interpolation in user table.
87 return Medium::ElectronTownsend(ex, ey, ez, bx, by, bz, alpha);
88 }
89 const double emag = sqrt(ex * ex + ey * ey + ez * ez);
90 if (emag > Small) {
91 alpha = m_eImpactA * exp(-pow(m_eImpactB / emag, 1.82));
92 }
93 return true;
94}
95
96bool MediumGaAs::ElectronAttachment(const double ex, const double ey,
97 const double ez, const double bx,
98 const double by, const double bz,
99 double& eta) {
100 eta = 0.;
101 if (!m_eAtt.empty()) {
102 // Interpolation in user table.
103 return Medium::ElectronAttachment(ex, ey, ez, bx, by, bz, eta);
104 }
105 return true;
106}
107
108bool MediumGaAs::HoleVelocity(const double ex, const double ey, const double ez,
109 const double bx, const double by, const double bz,
110 double& vx, double& vy, double& vz) {
111 vx = vy = vz = 0.;
112 if (m_isChanged) {
113 UpdateTransportParameters();
114 m_isChanged = false;
115 }
116 if (!m_hVelE.empty()) {
117 // Interpolation in user table.
118 return Medium::HoleVelocity(ex, ey, ez, bx, by, bz, vx, vy, vz);
119 }
120 // Calculate the mobility.
121 // - J. J. Barnes, R. J. Lomax, G. I. Haddad,
122 // IEEE Trans. Electron Devices ED-23 (1976), 1042–1048.
123 const double emag = sqrt(ex * ex + ey * ey + ez * ez);
124 // Inverse of the critical field.
125 constexpr double r = 1. / 4000.;
126 const double mu = (m_hMobility + m_hSatVel * r) / (1. + emag * r);
127 const double b2 = bx * bx + by * by + bz * bz;
128 if (b2 < Small) {
129 vx = mu * ex;
130 vy = mu * ey;
131 vz = mu * ez;
132 } else {
133 Langevin(ex, ey, ez, bx, by, bz, mu, m_hHallFactor * mu, vx, vy, vz);
134 }
135 return true;
136}
137
138bool MediumGaAs::HoleTownsend(const double ex, const double ey, const double ez,
139 const double bx, const double by, const double bz,
140 double& alpha) {
141 alpha = 0.;
142 if (m_isChanged) {
143 UpdateTransportParameters();
144 m_isChanged = false;
145 }
146 if (!m_hAlp.empty()) {
147 // Interpolation in user table.
148 return Medium::HoleTownsend(ex, ey, ez, bx, by, bz, alpha);
149 }
150 const double emag = sqrt(ex * ex + ey * ey + ez * ez);
151 if (emag > Small) {
152 // alpha = m_hImpactA * exp(-m_hImpactB / emag);
153 alpha = m_hImpactA * exp(-pow(m_hImpactB / emag, 1.75));
154 }
155 return true;
156}
157
158bool MediumGaAs::HoleAttachment(const double ex, const double ey,
159 const double ez, const double bx,
160 const double by, const double bz, double& eta) {
161 eta = 0.;
162 if (!m_hAtt.empty()) {
163 // Interpolation in user table.
164 return Medium::HoleAttachment(ex, ey, ez, bx, by, bz, eta);
165 }
166 return true;
167}
168
169void MediumGaAs::SetLowFieldMobility(const double mue, const double muh) {
170
171 if (mue <= 0. || muh <= 0.) {
172 std::cerr << m_className << "::SetLowFieldMobility:\n"
173 << " Mobility must be greater than zero.\n";
174 return;
175 }
176 m_eMobility = mue;
177 m_hMobility = muh;
178 m_userMobility = true;
179 m_isChanged = true;
180}
181
183 m_userMobility = false;
184 m_isChanged = true;
185}
186
187void MediumGaAs::UpdateTransportParameters() {
188
189 const double t = m_temperature / 300.;
190 // Update the low field lattice mobility.
191 if (!m_userMobility) {
192 // Temperature dependence as in Sentaurus Device and Silvaco Atlas.
193 constexpr double eMu0 = 8.0e-6;
194 constexpr double hMu0 = 0.4e-6;
195 m_eMobility = eMu0 / t;
196 m_hMobility = hMu0 * pow(t, -2.1);
197 }
198 // - J. S. Blakemore, Journal of Applied Physics 53, R123 (1982)
199 // https://doi.org/10.1063/1.331665
200 // m_eMobility = 8.0e-6 * pow(t, -2.3);
201
202 // Update the saturation velocity.
203 // - M. J. Littlejohn, J. R. Hauser, T. H. Glisson,
204 // J. Appl. Phys. 48 (1977), 4587
205 m_eSatVel = m_hSatVel = std::max(1.13e-2 - 3.6e-3 * t, 5.e-4);
206
207 // Update the impact ionization parameters.
208 // Selberherr model parameters from Silvaco Atlas.
209 m_eImpactA = 1.889e5 * (1. + 0.588 * (t - 1));
210 m_hImpactA = 2.215e5 * (1. + 0.588 * (t - 1));
211 m_eImpactB = 5.75e5 * (1. + 0.248 * (t - 1));
212 m_hImpactB = 6.57e5 * (1. + 0.248 * (t - 1));
213}
214}
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].
Definition MediumGaAs.cc:96
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].
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].
Definition MediumGaAs.cc:76
MediumGaAs()
Constructor.
Definition MediumGaAs.cc:14
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 GetComponent(const unsigned int i, std::string &label, double &f) override
Get the name and fraction of a given component.
Definition MediumGaAs.cc:32
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].
Definition MediumGaAs.cc:43
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].
void SetLowFieldMobility(const double mue, const double muh)
void SetTemperature(const double t)
Set the temperature [K].
Definition Medium.cc:72
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:599
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:578
std::vector< std::vector< std::vector< double > > > m_eAlp
Definition Medium.hh:582
std::vector< std::vector< std::vector< double > > > m_hAlp
Definition Medium.hh:594
std::string m_name
Definition Medium.hh:538
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:444
virtual void SetAtomicNumber(const double z)
Set the effective atomic number.
Definition Medium.cc:115
std::vector< std::vector< std::vector< double > > > m_eVelE
Definition Medium.hh:577
void SetDielectricConstant(const double eps)
Set the relative static dielectric constant.
Definition Medium.cc:92
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:468
std::vector< std::vector< std::vector< double > > > m_eAtt
Definition Medium.hh:583
virtual void SetMassDensity(const double rho)
Set the mass density [g/cm3].
Definition Medium.cc:145
Medium()
Constructor.
Definition Medium.cc:61
std::vector< std::vector< std::vector< double > > > m_hVelE
Definition Medium.hh:589
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:481
std::vector< std::vector< std::vector< double > > > m_hAtt
Definition Medium.hh:595
virtual void SetAtomicWeight(const double a)
Set the effective atomic weight.
Definition Medium.cc:125
std::string m_className
Definition Medium.hh:529
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:612
double m_temperature
Definition Medium.hh:540
static void Langevin(const double ex, const double ey, const double ez, double bx, double by, double bz, const double mu, double &vx, double &vy, double &vz)
Definition Medium.cc:301