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;
75 Langevin(ex, ey, ez, bx, by, bz, mu, m_eHallFactor * mu, vx, vy, vz);
81 const double ez,
const double bx,
82 const double by,
const double bz,
86 UpdateTransportParameters();
93 const double emag = sqrt(ex * ex + ey * ey + ez * ez);
95 alpha = m_eImpactA * exp(-m_eImpactB / emag);
101 const double ez,
const double bx,
102 const double by,
const double bz,
113 const double bx,
const double by,
const double bz,
114 double& vx,
double& vy,
double& vz) {
117 UpdateTransportParameters();
125 const double emag = sqrt(ex * ex + ey * ey + ez * ez);
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;
138 Langevin(ex, ey, ez, bx, by, bz, mu, m_hHallFactor * mu, vx, vy, vz);
144 const double bx,
const double by,
const double bz,
148 UpdateTransportParameters();
155 const double emag = sqrt(ex * ex + ey * ey + ez * ez);
157 alpha = m_hImpactA * exp(-m_hImpactB / emag);
163 const double ez,
const double bx,
164 const double by,
const double bz,
double& eta) {
176 std::cerr <<
m_className <<
"::SetElectronConcentration:\n"
177 <<
" Concentration cannot be negative.\n";
185 if (mue <= 0. || muh <= 0.) {
186 std::cerr <<
m_className <<
"::SetLowFieldMobility:\n"
187 <<
" Mobility must be greater than zero.\n";
192 m_userMobility =
true;
197 m_userMobility =
false;
201void MediumGaN::UpdateTransportParameters() {
203 if (m_userMobility)
return;
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;
218 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].
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)