class
SushiDSP::PentodeEL34
Stateless Koren EL34 pentode: plate and screen currents plus Norman's grid law.
- Declared in
include/SushiDSP/circuits/models/PentodeEL34.hpp
Parameters are transcribed from docs/reference/spice/models/el34_koren.sub. The three branch voltages are v[0] = Vg1k, v[1] = Vg2k, v[2] = Vpk; the branch currents are i[0] = Ig1, i[1] = Ig2, i[2] = Ip. The atan(Vpk / KVB) factor makes the plate curve knee over instead of climbing like a triode's, and is where class-AB crossover behaviour comes from. current_and_jacobian() carries the physics and current()/jacobian() forward to it. Every entry point is allocation-free, throw-free and safe on the audio thread.
Static public attributes
static constexpr std::size_t kBranchCount = 3Branch 0 is the control grid, branch 1 the screen grid, branch 2 the plate.
static constexpr double kMu = 11.0Amplification factor MU (el34_koren.sub).
static constexpr double kKp = 60.0Koren's grid-drive sharpness KP (el34_koren.sub).
static constexpr double kKvb = 24.0Koren's plate-knee constant KVB (el34_koren.sub).
static constexpr double kKg1 = 650.0Koren's plate perveance divisor KG1 (el34_koren.sub).
static constexpr double kKg2 = 4500.0Koren's screen perveance divisor KG2 (el34_koren.sub).
static constexpr double kKx = 1.35Koren's current exponent KX, shared by the plate and screen laws (el34_koren.sub).
static constexpr double kGridCurrentScale = 1.0e-6Norman grid-current scale IG0, in amperes (el34_koren.sub).
static constexpr double kGridThresholdVolts = 0.5Norman grid-conduction threshold VGAMMA, in volts (el34_koren.sub).
static constexpr double kGridTransitionVolts = 0.15Norman grid-conduction transition width VTG, in volts (el34_koren.sub).
static constexpr double kScreenFloorVolts = 1.0e-3Lower bound applied to Vg2k before it is divided into, in volts.
Public member functions
void current_and_jacobian(const std::array< double, 3 > &v, std::array< double, 3 > &i, std::array< std::array< double, 3 >, 3 > &j) constEvaluates all three branch currents and the 3x3 Jacobian at one operating point.
The screen clamp, softplus, logistic, E1, the plate knee, z and the two (kx-1) powers are shared between the currents and their derivatives; E1^kx and z^kx are formed from those powers rather than by a second pow. current() and jacobian() forward here.
Parameters
vBranch voltages: v[0] = Vg1k, v[1] = Vg2k, v[2] = Vpk, in volts.
iReceives the branch currents: i[0] = Ig1, i[1] = Ig2, i[2] = Ip, in amperes.
jReceives the 3x3 Jacobian j[a][b] = d i_a / d v_b in siemens.
void current(const std::array< double, 3 > &v, std::array< double, 3 > &i) constEvaluates the three branch currents at one operating point.
Parameters
vBranch voltages: v[0] = Vg1k, v[1] = Vg2k, v[2] = Vpk, in volts.
iReceives the branch currents: i[0] = Ig1, i[1] = Ig2, i[2] = Ip, in amperes.
void jacobian(const std::array< double, 3 > &v, std::array< std::array< double, 3 >, 3 > &j) constEvaluates the branch-current Jacobian j[a][b] = d i_a / d v_b at one point.
Parameters
vBranch voltages: v[0] = Vg1k, v[1] = Vg2k, v[2] = Vpk, in volts.
jReceives the 3x3 Jacobian in siemens. The control-grid row has only a Vg1k entry, and the screen row has no Vpk entry, because neither current sees the plate voltage at all.

