// ------------------------------------------------------------------- void COPLANAR::calc() { skindepth = skin_depth(); // other local variables (quasi-static constants) double k1, kk1, kpk1, k2, k3, q1, q2, q3 = 0, qz, er0 = 0; double zl_factor; // compute the necessary quasi-static approx. (K1, K3, er(0) and Z(0)) k1 = w / (w + s + s); kk1 = ellipk( k1 ); kpk1 = ellipk( sqrt( 1 - k1 * k1 ) ); q1 = kk1 / kpk1; // backside is metal if( backMetal ) { k3 = tanh( (M_PI / 4) * (w / h) ) / tanh( (M_PI / 4) * (w + s + s) / h ); q3 = ellipk( k3 ) / ellipk( sqrt( 1 - k3 * k3 ) ); qz = 1 / (q1 + q3); er0 = 1 + q3 * qz * (er - 1); zl_factor = ZF0 / 2 * qz; } // backside is air else { k2 = sinh( (M_PI / 4) * (w / h) ) / sinh( (M_PI / 4) * (w + s + s) / h ); q2 = ellipk( k2 ) / ellipk( sqrt( 1 - k2 * k2 ) ); er0 = 1 + (er - 1) / 2 * q2 / q1; zl_factor = ZF0 / 4 / q1; } // adds effect of strip thickness if( t > 0 ) { double d, se, We, ke, qe; d = (t * 1.25 / M_PI) * ( 1 + log( 4 * M_PI * w / t ) ); se = s - d; We = w + d; // modifies k1 accordingly (k1 = ke) ke = We / (We + se + se); // ke = k1 + (1 - k1 * k1) * d / 2 / s; qe = ellipk( ke ) / ellipk( sqrt( 1 - ke * ke ) ); // backside is metal if( backMetal ) { qz = 1 / (qe + q3); er0 = 1 + q3 * qz * (er - 1); zl_factor = ZF0 / 2 * qz; } // backside is air else { zl_factor = ZF0 / 4 / qe; } // modifies er0 as well er0 = er0 - (0.7 * (er0 - 1) * t / s) / ( q1 + (0.7 * t / s) ); } // pre-compute square roots double sr_er = sqrt( er ); double sr_er0 = sqrt( er0 ); // cut-off frequency of the TE0 mode double fte = (C0 / 4) / ( h * sqrt( er - 1 ) ); // dispersion factor G double p = log( w / h ); double u = 0.54 - (0.64 - 0.015 * p) * p; double v = 0.43 - (0.86 - 0.54 * p) * p; double G = exp( u * log( w / s ) + v ); // loss constant factors (computed only once for efficency sake) double ac = 0; if( t > 0 ) { // equations by GHIONE double n = (1 - k1) * 8 * M_PI / ( t * (1 + k1) ); double a = w / 2; double b = a + s; ac = ( M_PI + log( n * a ) ) / a + ( M_PI + log( n * b ) ) / b; } double ac_factor = ac / ( 4 * ZF0 * kk1 * kpk1 * (1 - k1 * k1) ); double ad_factor = ( er / (er - 1) ) * tand * M_PI / C0; // .................................................... double sr_er_f = sr_er0; // add the dispersive effects to er0 sr_er_f += (sr_er - sr_er0) / ( 1 + G * pow( f / fte, -1.8 ) ); // for now, the loss are limited to strip losses (no radiation // losses yet) losses in neper/length atten_cond = 20.0 / log( 10.0 ) * len * ac_factor * sr_er0 * sqrt( M_PI * MU0 * f / sigma ); atten_dielectric = 20.0 / log( 10.0 ) * len * ad_factor * f * (sr_er_f * sr_er_f - 1) / sr_er_f; ang_l = 2.0 * M_PI * len * sr_er_f * f / C0; /* in radians */ er_eff = sr_er_f * sr_er_f; Z0 = zl_factor / sr_er_f; }
double coplanar::KoverKp(double k) { if ((k < 0.0) || (k >= 1.0)) return std::numeric_limits<double>::quiet_NaN(); return (ellipk(k) / ellipk(sqrt(1-k*k))); }