From 1aab0b117fe0288091490b264970b1b22c1a1b18 Mon Sep 17 00:00:00 2001 From: Damien Zammit Date: Sat, 18 Aug 2018 20:58:24 +1000 Subject: ZamTube: Fix Taylor expansion as per original zamvalve optimization by fundamental --- plugins/ZamTube/triode.cpp | 23 ++++++++++++++++------- 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 -- cgit v1.2.3