49 const double ez,
const double bx,
50 const double by,
const double bz,
double& vx,
51 double& vy,
double& vz) {
54 UpdateTransportParameters();
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;
76 const double muH = m_eHallFactor * mu;
77 const double mu2 = muH * muH;
78 const double eb = bx * ex + by * ey + bz * ez;
79 const double f = muH / (1. + mu2 * b2);
81 vx = f * (ex + muH * (ey * bz - ez * by) + mu2 * bx * eb);
82 vy = f * (ey + muH * (ez * bx - ex * bz) + mu2 * by * eb);
83 vz = f * (ez + muH * (ex * by - ey * bx) + mu2 * bz * eb);
89 const double ez,
const double bx,
90 const double by,
const double bz,
94 UpdateTransportParameters();
101 const double emag = sqrt(ex * ex + ey * ey + ez * ez);
103 alpha = m_eImpactA * exp(-m_eImpactB / emag);
109 const double ez,
const double bx,
110 const double by,
const double bz,
121 const double bx,
const double by,
const double bz,
122 double& vx,
double& vy,
double& vz) {
125 UpdateTransportParameters();
133 const double emag = sqrt(ex * ex + ey * ey + ez * ez);
135 constexpr double vsat = 7.e-3;
136 constexpr double beta = 0.725;
137 constexpr double invbeta = 1. / beta;
138 const double r = m_hMobility * emag / vsat;
139 const double mu = m_hMobility / pow(1. + pow(r, beta), invbeta);
140 const double b2 = bx * bx + by * by + bz * bz;
147 const double muH = m_hHallFactor * mu;
148 const double mu2 = muH * muH;
149 const double eb = bx * ex + by * ey + bz * ez;
150 const double f = mu / (1. + mu2 * b2);
152 vx = f * (ex + muH * (ey * bz - ez * by) + mu2 * bx * eb);
153 vy = f * (ey + muH * (ez * bx - ex * bz) + mu2 * by * eb);
154 vz = f * (ez + muH * (ex * by - ey * bx) + mu2 * bz * eb);
160 const double bx,
const double by,
const double bz,
164 UpdateTransportParameters();
171 const double emag = sqrt(ex * ex + ey * ey + ez * ez);
173 alpha = m_hImpactA * exp(-m_hImpactB / emag);
179 const double ez,
const double bx,
180 const double by,
const double bz,
double& eta) {
192 std::cerr <<
m_className <<
"::SetElectronConcentration:\n"
193 <<
" Concentration cannot be negative.\n";
201 if (mue <= 0. || muh <= 0.) {
202 std::cerr <<
m_className <<
"::SetLowFieldMobility:\n"
203 <<
" Mobility must be greater than zero.\n";
208 m_userMobility =
true;
213 m_userMobility =
false;
217void MediumGaN::UpdateTransportParameters() {
219 if (m_userMobility)
return;
225 const double eMuMin = 0.080e-6 * pow(t, -0.2);
226 const double eMuMax = 1.405e-6 * pow(t, -2.85);
227 const double cRef = 7.78e16 * pow(t, 1.3);
228 const double alpha = 0.71 * pow(t, 0.31);
229 const double den = 1. + pow(m_eDensity / cRef, alpha);
230 m_eMobility = eMuMin + (eMuMax - eMuMin) / den;
234 m_hMobility = 0.170e-6 * pow(t, -5.);
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].
void GetComponent(const unsigned int i, std::string &label, double &f) override
Get the name and fraction of a given component.
void SetElectronConcentration(const double c)
Set the electron concentration [cm-3].
void SetLowFieldMobility(const double mue, const double muh)
Set the low-field mobility values [cm2 / (V ns)] explicitly.
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].
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 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 UnsetLowFieldMobility()
Use the default mobility models.
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 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].
Abstract base class for media.
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 void EnableDrift(const bool on=true)
Switch electron/ion/hole on/off.
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 EnablePrimaryIonisation(const bool on=true)
Make the medium ionisable or non-ionisable.
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].