Garfield++ 5.0
A toolkit for the detailed simulation of particle detectors based on ionisation measurement in gases and semiconductors
Loading...
Searching...
No Matches
MediumGaN.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 = "MediumGaN";
16 m_name = "GaN";
17
18 // J. Wang et al.,
19 // Review of using gallium nitride for ionizing radiation detection,
20 // Appl. Phys. Rev. 2 (2015),
21 // http://dx.doi.org/10.1063/1.4929913
22
23 SetTemperature(300.);
28
29 m_driftable = true;
30 m_ionisable = true;
31 m_microscopic = false;
32
33 m_w = 8.9;
34 m_fano = 0.1;
35}
36
37void MediumGaN::GetComponent(const unsigned int i, std::string& label,
38 double& f) {
39 if (i == 0) {
40 label = "Ga";
41 f = 0.5;
42 } else if (i == 1) {
43 label = "N";
44 f = 0.5;
45 }
46}
47
48bool MediumGaN::ElectronVelocity(const double ex, const double ey,
49 const double ez, const double bx,
50 const double by, const double bz, double& vx,
51 double& vy, double& vz) {
52 vx = vy = vz = 0.;
53 if (m_isChanged) {
54 UpdateTransportParameters();
55 m_isChanged = false;
56 }
57 if (!m_eVelE.empty()) {
58 // Interpolation in user table.
59 return Medium::ElectronVelocity(ex, ey, ez, bx, by, bz, vx, vy, vz);
60 }
61 // Calculate the mobility.
62 const double emag = sqrt(ex * ex + ey * ey + ez * ez);
63 constexpr double vsat = 1.27e-2;
64 constexpr double ec = 172.e3;
65 const double e0 = emag / ec;
66 const double e1 = pow(e0, 4.19);
67 const double den = 1. + e1 + 3.24 * pow(e0, 0.885);
68 const double mu = -(m_eMobility + vsat * e1 / emag) / den;
69 const double b2 = bx * bx + by * by + bz * bz;
70 if (b2 < Small) {
71 vx = mu * ex;
72 vy = mu * ey;
73 vz = mu * ez;
74 } else {
75 Langevin(ex, ey, ez, bx, by, bz, mu, m_eHallFactor * mu, vx, vy, vz);
76 }
77 return true;
78}
79
80bool MediumGaN::ElectronTownsend(const double ex, const double ey,
81 const double ez, const double bx,
82 const double by, const double bz,
83 double& alpha) {
84 alpha = 0.;
85 if (m_isChanged) {
86 UpdateTransportParameters();
87 m_isChanged = false;
88 }
89 if (!m_eAlp.empty()) {
90 // Interpolation in user table.
91 return Medium::ElectronTownsend(ex, ey, ez, bx, by, bz, alpha);
92 }
93 const double emag = sqrt(ex * ex + ey * ey + ez * ez);
94 if (emag > Small) {
95 alpha = m_eImpactA * exp(-m_eImpactB / emag);
96 }
97 return true;
98}
99
100bool MediumGaN::ElectronAttachment(const double ex, const double ey,
101 const double ez, const double bx,
102 const double by, const double bz,
103 double& eta) {
104 eta = 0.;
105 if (!m_eAtt.empty()) {
106 // Interpolation in user table.
107 return Medium::ElectronAttachment(ex, ey, ez, bx, by, bz, eta);
108 }
109 return true;
110}
111
112bool MediumGaN::HoleVelocity(const double ex, const double ey, const double ez,
113 const double bx, const double by, const double bz,
114 double& vx, double& vy, double& vz) {
115 vx = vy = vz = 0.;
116 if (m_isChanged) {
117 UpdateTransportParameters();
118 m_isChanged = false;
119 }
120 if (!m_hVelE.empty()) {
121 // Interpolation in user table.
122 return Medium::HoleVelocity(ex, ey, ez, bx, by, bz, vx, vy, vz);
123 }
124 // Calculate the mobility.
125 const double emag = sqrt(ex * ex + ey * ey + ez * ez);
126 // Values for saturation velocity and exponent from Sentaurus Synopsys.
127 constexpr double vsat = 7.e-3;
128 constexpr double beta = 0.725;
129 constexpr double invbeta = 1. / beta;
130 const double r = m_hMobility * emag / vsat;
131 const double mu = m_hMobility / pow(1. + pow(r, beta), invbeta);
132 const double b2 = bx * bx + by * by + bz * bz;
133 if (b2 < Small) {
134 vx = mu * ex;
135 vy = mu * ey;
136 vz = mu * ez;
137 } else {
138 Langevin(ex, ey, ez, bx, by, bz, mu, m_hHallFactor * mu, vx, vy, vz);
139 }
140 return true;
141}
142
143bool MediumGaN::HoleTownsend(const double ex, const double ey, const double ez,
144 const double bx, const double by, const double bz,
145 double& alpha) {
146 alpha = 0.;
147 if (m_isChanged) {
148 UpdateTransportParameters();
149 m_isChanged = false;
150 }
151 if (!m_hAlp.empty()) {
152 // Interpolation in user table.
153 return Medium::HoleTownsend(ex, ey, ez, bx, by, bz, alpha);
154 }
155 const double emag = sqrt(ex * ex + ey * ey + ez * ez);
156 if (emag > Small) {
157 alpha = m_hImpactA * exp(-m_hImpactB / emag);
158 }
159 return true;
160}
161
162bool MediumGaN::HoleAttachment(const double ex, const double ey,
163 const double ez, const double bx,
164 const double by, const double bz, double& eta) {
165 eta = 0.;
166 if (!m_hAtt.empty()) {
167 // Interpolation in user table.
168 return Medium::HoleAttachment(ex, ey, ez, bx, by, bz, eta);
169 }
170 return true;
171}
172
174
175 if (c < 0.) {
176 std::cerr << m_className << "::SetElectronConcentration:\n"
177 << " Concentration cannot be negative.\n";
178 return;
179 }
180 m_eDensity = c;
181}
182
183void MediumGaN::SetLowFieldMobility(const double mue, const double muh) {
184
185 if (mue <= 0. || muh <= 0.) {
186 std::cerr << m_className << "::SetLowFieldMobility:\n"
187 << " Mobility must be greater than zero.\n";
188 return;
189 }
190 m_eMobility = mue;
191 m_hMobility = muh;
192 m_userMobility = true;
193 m_isChanged = true;
194}
195
197 m_userMobility = false;
198 m_isChanged = true;
199}
200
201void MediumGaN::UpdateTransportParameters() {
202
203 if (m_userMobility) return;
204 const double t = m_temperature / 300.;
205
206 // Electron low field mobility.
207 // - F. Schwierz, Solid-State Electronics 49 (2005), 889
208 // https://doi.org/10.1016/j.sse.2005.03.006
209 const double eMuMin = 0.080e-6 * pow(t, -0.2);
210 const double eMuMax = 1.405e-6 * pow(t, -2.85);
211 const double cRef = 7.78e16 * pow(t, 1.3);
212 const double alpha = 0.71 * pow(t, 0.31);
213 const double den = 1. + pow(m_eDensity / cRef, alpha);
214 m_eMobility = eMuMin + (eMuMax - eMuMin) / den;
215 // Low-field mobility for holes (using only the lattice mobility).
216 // - T. TMnatsakanov et al., Solid-State Electronics 47 (2003), 111
217 // https://doi.org/10.1016/S0038-1101(02)00256-3
218 m_hMobility = 0.170e-6 * pow(t, -5.);
219
220}
221}
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].
Definition MediumGaN.cc:112
void GetComponent(const unsigned int i, std::string &label, double &f) override
Get the name and fraction of a given component.
Definition MediumGaN.cc:37
void SetElectronConcentration(const double c)
Set the electron concentration [cm-3].
Definition MediumGaN.cc:173
void SetLowFieldMobility(const double mue, const double muh)
Set the low-field mobility values [cm2 / (V ns)] explicitly.
Definition MediumGaN.cc:183
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].
Definition MediumGaN.cc:143
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 MediumGaN.cc:80
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].
Definition MediumGaN.cc:162
MediumGaN()
Constructor.
Definition MediumGaN.cc:14
void UnsetLowFieldMobility()
Use the default mobility models.
Definition MediumGaN.cc:196
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 MediumGaN.cc:100
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 MediumGaN.cc:48
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