Ejemplo n.º 1
0
// -------------------------------------------------------------------
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;
}
Ejemplo n.º 2
0
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)));
}