diff options
Diffstat (limited to 'plugins')
-rw-r--r-- | plugins/ZamTube/triode.cpp | 23 | ||||
-rw-r--r-- | plugins/ZamTube/triode.h | 6 |
2 files changed, 22 insertions, 7 deletions
diff --git a/plugins/ZamTube/triode.cpp b/plugins/ZamTube/triode.cpp index f725fd0..b40220f 100644 --- a/plugins/ZamTube/triode.cpp +++ b/plugins/ZamTube/triode.cpp @@ -89,21 +89,28 @@ T Triode::fgdash(T VG) { T Triode::ffp(T VP) { static bool prepared = false; - static double coeff[4]; if(!prepared) { //go go series expansion const double L2 = log(2.0); const double scale = pow(L2,gamma-2)/(8.0*pow(c,gamma)); - coeff[0] = 8.0*L2*L2*scale; - coeff[1] = gamma*c*L2*4*scale; - coeff[2] = (c*c*gamma*gamma+L2*c*c*gamma-c*c*gamma)*scale; - coeff[3] = 0.0; + ffp_raw[0] = 8.0*L2*L2*scale; + ffp_raw[1] = gamma*c*L2*4*scale; + ffp_raw[2] = (c*c*gamma*gamma+L2*c*c*gamma-c*c*gamma)*scale; prepared = true; } - double A = VP/mu+vg; - return (Pb+Pr*((g*(coeff[0]+coeff[1]*A+coeff[2]*A*A))+(Gb-vg)/Gr)-VP); + return ffp_coeff[0]+ffp_coeff[1]*VP+ffp_coeff[2]*VP*VP; +} + +void Triode::prepare(void) +{ + const double c0 = ffp_raw[0], + c1 = ffp_raw[1], + c2 = ffp_raw[2]; + ffp_coeff[0] = Pb + Pr*Gb/Gr + c2*Pr*vg*vg - Pr*vg/Gr + c1*Pr*vg + c0*Pr; + ffp_coeff[1] = 2.*c2*Pr*vg/mu + c1*Pr/mu - 1.; + ffp_coeff[2] = c2*Pr/(mu*mu); } T Triode::ffp_insane(T VP) { @@ -405,6 +412,8 @@ T Triode::zeroffp ( T a, T b, T t ) T sa; T sb; T tol; + + prepare(); // // Make local copies of A and B. // diff --git a/plugins/ZamTube/triode.h b/plugins/ZamTube/triode.h index e7a70fb..a3b50ba 100644 --- a/plugins/ZamTube/triode.h +++ b/plugins/ZamTube/triode.h @@ -67,6 +67,7 @@ public: Triode(); void compute(T Kbb, T Gbb, T Pbb); + void prepare(void); T getC(void); T getG(void); T getP(void); @@ -79,6 +80,11 @@ public: T zeroffp ( T a, T b, T t ); T zeroffp_insane ( T a, T b, T t ); T zeroffg ( T a, T b, T t ); + +private: + //Taylor series coefficients for fast calculations + double ffp_raw[3]; + double ffp_coeff[3]; }; #endif |