summaryrefslogtreecommitdiff
path: root/plugins/ZamTube/wdf.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/ZamTube/wdf.cpp')
-rw-r--r--plugins/ZamTube/wdf.cpp133
1 files changed, 129 insertions, 4 deletions
diff --git a/plugins/ZamTube/wdf.cpp b/plugins/ZamTube/wdf.cpp
index 329d128..d2e2f9f 100644
--- a/plugins/ZamTube/wdf.cpp
+++ b/plugins/ZamTube/wdf.cpp
@@ -250,10 +250,11 @@ T Triode::ffp(T VP) {
double A = VP/mu+vg;
return (P.WD+P.PortRes*((g*(coeff[0]+coeff[1]*A+coeff[2]*A*A))+(G.WD-vg)/G.PortRes)-VP);
+}
- printf("%f\n", VP/mu+vg);
- return (P.WD+P.PortRes*((g*_pow(_log(1.0+_exp(c*(VP/mu+vg)))/c,gamma))+(G.WD-vg)/G.PortRes)-VP);
-} // ^
+T Triode::ffp_insane(T VP) {
+ return (P.WD+P.PortRes*((g*pow(log(1.0+exp(c*(VP/mu+vg)))/c,gamma))+(G.WD-vg)/G.PortRes)-VP);
+}
T Triode::fpdash(T VP) {
T a1 = exp(c*(vg+VP/mu));
@@ -402,6 +403,131 @@ T Triode::r8_sign ( T x )
return value;
}
+T Triode::zeroffp_insane ( T a, T b, T t )
+{
+ T c;
+ T d;
+ T e;
+ T fa;
+ T fb;
+ T fc;
+ T m;
+ T macheps;
+ T p;
+ T q;
+ T r;
+ T s;
+ T sa;
+ T sb;
+ T tol;
+//
+// Make local copies of A and B.
+//
+ sa = a;
+ sb = b;
+ fa = ffp_insane ( sa );
+ fb = ffp_insane ( sb );
+
+ c = sa;
+ fc = fa;
+ e = sb - sa;
+ d = e;
+
+ macheps = r8_epsilon;
+
+ for ( ; ; )
+ {
+ if ( abs ( fc ) < abs ( fb ) )
+ {
+ sa = sb;
+ sb = c;
+ c = sa;
+ fa = fb;
+ fb = fc;
+ fc = fa;
+ }
+
+ tol = 2.0 * macheps * abs ( sb ) + t;
+ m = 0.5 * ( c - sb );
+
+ if ( abs ( m ) <= tol || fb == 0.0 )
+ {
+ break;
+ }
+
+ if ( abs ( e ) < tol || abs ( fa ) <= abs ( fb ) )
+ {
+ e = m;
+ d = e;
+ }
+ else
+ {
+ s = fb / fa;
+
+ if ( sa == c )
+ {
+ p = 2.0 * m * s;
+ q = 1.0 - s;
+ }
+ else
+ {
+ q = fa / fc;
+ r = fb / fc;
+ p = s * ( 2.0 * m * q * ( q - r ) - ( sb - sa ) * ( r - 1.0 ) );
+ q = ( q - 1.0 ) * ( r - 1.0 ) * ( s - 1.0 );
+ }
+
+ if ( 0.0 < p )
+ {
+ q = - q;
+ }
+ else
+ {
+ p = - p;
+ }
+
+ s = e;
+ e = d;
+
+ if ( 2.0 * p < 3.0 * m * q - abs ( tol * q ) &&
+ p < abs ( 0.5 * s * q ) )
+ {
+ d = p / q;
+ }
+ else
+ {
+ e = m;
+ d = e;
+ }
+ }
+ sa = sb;
+ fa = fb;
+
+ if ( tol < abs ( d ) )
+ {
+ sb = sb + d;
+ }
+ else if ( 0.0 < m )
+ {
+ sb = sb + tol;
+ }
+ else
+ {
+ sb = sb - tol;
+ }
+
+ fb = ffp ( sb );
+
+ if ( ( 0.0 < fb && 0.0 < fc ) || ( fb <= 0.0 && fc <= 0.0 ) )
+ {
+ c = sa;
+ fc = fa;
+ e = sb - sa;
+ d = e;
+ }
+ }
+ return sb;
+}
T Triode::zeroffp ( T a, T b, T t )
{
@@ -654,4 +780,3 @@ T Triode::zeroffg ( T a, T b, T t )
}
return sb;
}
-