44 const double ez,
const double bx,
45 const double by,
const double bz,
double& vx,
46 double& vy,
double& vz) {
49 UpdateTransportParameters();
59 const double e2 = ex * ex + ey * ey + ez * ez;
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;
71 Langevin(ex, ey, ez, bx, by, bz, mu, m_eHallFactor * mu, vx, vy, vz);
77 const double ez,
const double bx,
78 const double by,
const double bz,
82 UpdateTransportParameters();
89 const double emag = sqrt(ex * ex + ey * ey + ez * ez);
91 alpha = m_eImpactA * exp(-pow(m_eImpactB / emag, 1.82));
97 const double ez,
const double bx,
98 const double by,
const double bz,
109 const double bx,
const double by,
const double bz,
110 double& vx,
double& vy,
double& vz) {
113 UpdateTransportParameters();
123 const double emag = sqrt(ex * ex + ey * ey + ez * ez);
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;
133 Langevin(ex, ey, ez, bx, by, bz, mu, m_hHallFactor * mu, vx, vy, vz);
139 const double bx,
const double by,
const double bz,
143 UpdateTransportParameters();
150 const double emag = sqrt(ex * ex + ey * ey + ez * ez);
153 alpha = m_hImpactA * exp(-pow(m_hImpactB / emag, 1.75));
159 const double ez,
const double bx,
160 const double by,
const double bz,
double& eta) {
171 if (mue <= 0. || muh <= 0.) {
172 std::cerr <<
m_className <<
"::SetLowFieldMobility:\n"
173 <<
" Mobility must be greater than zero.\n";
178 m_userMobility =
true;
183 m_userMobility =
false;
187void MediumGaAs::UpdateTransportParameters() {
191 if (!m_userMobility) {
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);
205 m_eSatVel = m_hSatVel = std::max(1.13e-2 - 3.6e-3 * t, 5.e-4);
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));
void UnsetLowFieldMobility()
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].
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].
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.
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].
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].
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].
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].
std::vector< std::vector< std::vector< double > > > m_eAlp
std::vector< std::vector< std::vector< double > > > m_hAlp
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].
virtual void SetAtomicNumber(const double z)
Set the effective atomic number.
std::vector< std::vector< std::vector< double > > > m_eVelE
void SetDielectricConstant(const double eps)
Set the relative static dielectric constant.
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].
std::vector< std::vector< std::vector< double > > > m_eAtt
virtual void SetMassDensity(const double rho)
Set the mass density [g/cm3].
std::vector< std::vector< std::vector< double > > > m_hVelE
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].
std::vector< std::vector< std::vector< double > > > m_hAtt
virtual void SetAtomicWeight(const double a)
Set the effective atomic weight.
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].
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)