Merge commit 'e00596b0b0b822902b9432c5bbc129470acc0f4b' into pre-master-45
Fixed warning reported by @dwarning here: https://sourceforge.net/p/ngspice/ngspice/merge-requests/33/#1f6b
This commit is contained in:
commit
7e22a85331
|
|
@ -23,11 +23,11 @@ BUILD_EXEEXT = @BUILD_EXEEXT@
|
|||
INCLUDES = -I$(top_builddir)/src/include -I$(top_srcdir)/src/include
|
||||
|
||||
# CFLAGS to use here
|
||||
EXTRA_CFLAGS = -fPIC
|
||||
EXTRA_CFLAGS = -fPIC -Wshadow
|
||||
DEPFLAGS = -MD -MF
|
||||
ISMINGW = $(shell uname | grep -c "MINGW32")
|
||||
ifeq ($(ISMINGW), 1)
|
||||
EXTRA_CFLAGS =
|
||||
EXTRA_CFLAGS = -Wshadow
|
||||
endif
|
||||
ISCYGWIN = $(shell uname | grep -c "CYGWIN")
|
||||
ifeq ($(ISCYGWIN), 1)
|
||||
|
|
|
|||
|
|
@ -60,21 +60,6 @@ static DoubleComplex rdivide(double n1, DoubleComplex n2)
|
|||
//static cpline_state_t *state = NULL;
|
||||
static void cm_cpmline_callback(ARGS, Mif_Callback_Reason_t reason);
|
||||
|
||||
static void analyseQuasiStatic (double W, double h, double s,
|
||||
double t, double er,
|
||||
int SModel, double* Zle,
|
||||
double* Zlo, double* ErEffe,
|
||||
double* ErEffo);
|
||||
|
||||
static void analyseDispersion (double W, double h, double s,
|
||||
double t, double er, double Zle,
|
||||
double Zlo, double ErEffe,
|
||||
double ErEffo, double frequency,
|
||||
int DModel, double *ZleFreq,
|
||||
double *ZloFreq,
|
||||
double *ErEffeFreq,
|
||||
double *ErEffoFreq);
|
||||
|
||||
static void calcPropagation (double W, double s,
|
||||
double er, double h, double t, double tand, double rho, double D,
|
||||
int SModel, int DModel, double frequency)
|
||||
|
|
@ -82,11 +67,11 @@ static void calcPropagation (double W, double s,
|
|||
|
||||
// quasi-static analysis
|
||||
double Zle, ErEffe, Zlo, ErEffo;
|
||||
analyseQuasiStatic (W, h, s, t, er, SModel, &Zle, &Zlo, &ErEffe, &ErEffo);
|
||||
cpmslineAnalyseQuasiStatic (W, h, s, t, er, SModel, &Zle, &Zlo, &ErEffe, &ErEffo);
|
||||
|
||||
// analyse dispersion of Zl and Er
|
||||
double ZleFreq, ErEffeFreq, ZloFreq, ErEffoFreq;
|
||||
analyseDispersion (W, h, s, t, er, Zle, Zlo, ErEffe, ErEffo, frequency, DModel,
|
||||
cpmslineAnalyseDispersion (W, h, s, t, er, Zle, Zlo, ErEffe, ErEffo, frequency, DModel,
|
||||
&ZleFreq, &ZloFreq, &ErEffeFreq, &ErEffoFreq);
|
||||
|
||||
// analyse losses of line
|
||||
|
|
@ -110,288 +95,6 @@ static void calcPropagation (double W, double s,
|
|||
|
||||
|
||||
|
||||
/* The function calculates the quasi-static dielectric constants and
|
||||
characteristic impedances for the even and odd mode based upon the
|
||||
given line and substrate properties for parallel coupled microstrip
|
||||
lines. */
|
||||
static void analyseQuasiStatic (double W, double h, double s,
|
||||
double t, double er,
|
||||
int SModel, double* Zle,
|
||||
double* Zlo, double* ErEffe,
|
||||
double* ErEffo) {
|
||||
// initialize default return values
|
||||
*ErEffe = er; *ErEffo = er;
|
||||
*Zlo = 42.2; *Zle = 55.7;
|
||||
|
||||
// normalized width and gap
|
||||
double u = W / h;
|
||||
double g = s / h;
|
||||
|
||||
// HAMMERSTAD and JENSEN
|
||||
if (SModel == HAMMERSTAD) {
|
||||
double Zl1, Fe, Fo, a, b, fo, Mu, Alpha, Beta, ErEff;
|
||||
double Pe, Po, r, fo1, q, p, n, Psi, Phi, m, Theta;
|
||||
|
||||
// modifying equations for even mode
|
||||
m = 0.2175 + pow (4.113 + pow (20.36 / g, 6.), -0.251) +
|
||||
log (pow (g, 10.) / (1 + pow (g / 13.8, 10.))) / 323;
|
||||
Alpha = 0.5 * exp (-g);
|
||||
Psi = 1 + g / 1.45 + pow (g, 2.09) / 3.95;
|
||||
Phi = 0.8645 * pow (u, 0.172);
|
||||
Pe = Phi / (Psi * (Alpha * pow (u, m) + (1 - Alpha) * pow (u, -m)));
|
||||
// TODO: is this ... Psi * (Alpha ... or ... Psi / (Alpha ... ?
|
||||
|
||||
// modifying equations for odd mode
|
||||
n = (1 / 17.7 + exp (-6.424 - 0.76 * log (g) - pow (g / 0.23, 5.))) *
|
||||
log ((10 + 68.3 * sqr (g)) / (1 + 32.5 * pow (g, 3.093)));
|
||||
Beta = 0.2306 + log (pow (g, 10.) / (1 + pow (g / 3.73, 10.))) / 301.8 +
|
||||
log (1 + 0.646 * pow (g, 1.175)) / 5.3;
|
||||
Theta = 1.729 + 1.175 * log (1 + 0.627 / (g + 0.327 * pow (g, 2.17)));
|
||||
Po = Pe - Theta / Psi * exp (Beta * pow (u, -n) * log (u));
|
||||
|
||||
// further modifying equations
|
||||
r = 1 + 0.15 * (1 - exp (1 - sqr (er - 1) / 8.2) / (1 + pow (g, -6.)));
|
||||
fo1 = 1 - exp (-0.179 * pow (g, 0.15) -
|
||||
0.328 * pow (g, r) / log (M_E + pow (g / 7, 2.8)));
|
||||
q = exp (-1.366 - g);
|
||||
p = exp (-0.745 * pow (g, 0.295)) / cosh (pow (g, 0.68));
|
||||
fo = fo1 * exp (p * log (u) + q * sin (M_PI * log10 (u)));
|
||||
|
||||
Mu = g * exp (-g) + u * (20 + sqr (g)) / (10 + sqr (g));
|
||||
Hammerstad_ab (Mu, er, &a, &b);
|
||||
Fe = pow (1 + 10 / Mu, -a * b);
|
||||
Hammerstad_ab (u, er, &a, &b);
|
||||
Fo = fo * pow (1 + 10 / u, -a * b);
|
||||
|
||||
// finally compute effective dielectric constants and impedances
|
||||
*ErEffe = (er + 1) / 2 + (er - 1) / 2 * Fe;
|
||||
*ErEffo = (er + 1) / 2 + (er - 1) / 2 * Fo;
|
||||
|
||||
Hammerstad_er (u, er, a, b, &ErEff); // single microstrip
|
||||
|
||||
// first variant
|
||||
Zl1 = Z0 / (u + 1.98 * pow (u, 0.172));
|
||||
Zl1 /= sqrt (ErEff);
|
||||
|
||||
// second variant
|
||||
Hammerstad_zl (u, &Zl1);
|
||||
Zl1 /= sqrt (ErEff);
|
||||
|
||||
*Zle = Zl1 / (1 - Zl1 * Pe / Z0);
|
||||
*Zlo = Zl1 / (1 - Zl1 * Po / Z0);
|
||||
}
|
||||
// KIRSCHNING and JANSEN
|
||||
else if (SModel == KIRSCHING) {
|
||||
double a, b, ae, be, ao, bo, v, co, d, ErEff, Zl1;
|
||||
double q1, q2, q3, q4, q5, q6, q7, q8, q9, q10;
|
||||
|
||||
// consider effect of finite strip thickness (JANSEN only)
|
||||
double ue = u;
|
||||
double uo = u;
|
||||
if (t != 0 && s > 10 * (2 * t)) {
|
||||
double dW = 0;
|
||||
// SCHNEIDER, referred by JANSEN
|
||||
if (u >= M_1_PI / 2 && M_1_PI / 2 > 2 * t / h)
|
||||
dW = t * (1 + log (2 * h / t)) / M_PI;
|
||||
else if (W > 2 * t)
|
||||
dW = t * (1 + log (4 * M_PI * W / t)) / M_PI;
|
||||
// JANSEN
|
||||
double dt = 2 * t * h / s / er;
|
||||
double We = W + dW * (1 - 0.5 * exp (-0.69 * dW / dt));
|
||||
double Wo = We + dt;
|
||||
ue = We / h;
|
||||
uo = Wo / h;
|
||||
}
|
||||
|
||||
// even relative dielectric constant
|
||||
v = ue * (20 + sqr (g)) / (10 + sqr (g)) + g * exp (-g);
|
||||
Hammerstad_ab (v, er, &ae, &be);
|
||||
Hammerstad_er (v, er, ae, be, ErEffe);
|
||||
|
||||
// odd relative dielectric constant
|
||||
Hammerstad_ab (uo, er, &a, &b);
|
||||
Hammerstad_er (uo, er, a, b, &ErEff);
|
||||
d = 0.593 + 0.694 * exp (-0.562 * uo);
|
||||
bo = 0.747 * er / (0.15 + er);
|
||||
co = bo - (bo - 0.207) * exp (-0.414 * uo);
|
||||
ao = 0.7287 * (ErEff - (er + 1) / 2) * (1 - exp (-0.179 * uo));
|
||||
*ErEffo = ((er + 1) / 2 + ao - ErEff) * exp (-co * pow (g, d)) + ErEff;
|
||||
|
||||
// characteristic impedance of single line
|
||||
Hammerstad_zl (u, &Zl1);
|
||||
Zl1 /= sqrt (ErEff);
|
||||
|
||||
// even characteristic impedance
|
||||
q1 = 0.8695 * pow (ue, 0.194);
|
||||
q2 = 1 + 0.7519 * g + 0.189 * pow (g, 2.31);
|
||||
q3 = 0.1975 + pow (16.6 + pow (8.4 / g, 6.), -0.387) +
|
||||
log (pow (g, 10.) / (1 + pow (g / 3.4, 10.))) / 241;
|
||||
q4 = q1 / q2 * 2 /
|
||||
(exp (-g) * pow (ue, q3) + (2 - exp (-g)) * pow (ue, -q3));
|
||||
*Zle = sqrt (ErEff / *ErEffe) * Zl1 / (1 - Zl1 * sqrt (ErEff) * q4 / Z0);
|
||||
|
||||
// odd characteristic impedance
|
||||
q5 = 1.794 + 1.14 * log (1 + 0.638 / (g + 0.517 * pow (g, 2.43)));
|
||||
q6 = 0.2305 + log (pow (g, 10.) / (1 + pow (g / 5.8, 10.))) / 281.3 +
|
||||
log (1 + 0.598 * pow (g, 1.154)) / 5.1;
|
||||
q7 = (10 + 190 * sqr (g)) / (1 + 82.3 * cubic (g));
|
||||
q8 = exp (-6.5 - 0.95 * log (g) - pow (g / 0.15, 5.));
|
||||
q9 = log (q7) * (q8 + 1 / 16.5);
|
||||
q10 = (q2 * q4 - q5 * exp (log (uo) * q6 * pow (uo, -q9))) / q2;
|
||||
*Zlo = sqrt (ErEff / *ErEffo) * Zl1 / (1 - Zl1 * sqrt (ErEff) * q10 / Z0);
|
||||
}
|
||||
}
|
||||
|
||||
/* The function computes the dispersion effects on the dielectric
|
||||
constants and characteristic impedances for the even and odd mode
|
||||
of parallel coupled microstrip lines. */
|
||||
static void analyseDispersion (double W, double h, double s,
|
||||
double t, double er, double Zle,
|
||||
double Zlo, double ErEffe,
|
||||
double ErEffo, double frequency,
|
||||
int DModel, double *ZleFreq,
|
||||
double *ZloFreq,
|
||||
double *ErEffeFreq,
|
||||
double *ErEffoFreq) {
|
||||
|
||||
// initialize default return values
|
||||
*ZleFreq = Zle;
|
||||
*ErEffeFreq = ErEffe;
|
||||
*ZloFreq = Zlo;
|
||||
*ErEffoFreq = ErEffo;
|
||||
|
||||
// normalized width and gap
|
||||
double u = W / h;
|
||||
double g = s / h;
|
||||
double ue, uo;
|
||||
double B, dW, dt;
|
||||
|
||||
// compute u_odd, u_even
|
||||
if (t > 0.0) {
|
||||
if (u < 0.1592) {
|
||||
B = 2 * M_PI * W;
|
||||
} else {
|
||||
B = h;
|
||||
}
|
||||
dW = t * (1.0 + log(2 * B / t)) / M_PI;
|
||||
dt = t / (er * g);
|
||||
ue = (W + dW * (1.0 - 0.5 * exp( -0.69 * dW / dt ))) / h;
|
||||
uo = ue + dt / h;
|
||||
} else {
|
||||
ue = u;
|
||||
uo = u;
|
||||
}
|
||||
|
||||
// GETSINGER
|
||||
if (DModel == GETSINGER) {
|
||||
// even mode dispersion
|
||||
Getsinger_disp (h, er, ErEffe, Zle / 2,
|
||||
frequency, ErEffeFreq, ZleFreq);
|
||||
*ZleFreq *= 2;
|
||||
// odd mode dispersion
|
||||
Getsinger_disp (h, er, ErEffo, Zlo * 2,
|
||||
frequency, ErEffoFreq, ZloFreq);
|
||||
*ZloFreq /= 2;
|
||||
}
|
||||
// KIRSCHNING and JANSEN
|
||||
else if (DModel == DISP_KIRSCHING) {
|
||||
double p1, p2, p3, p4, p5, p6, p7, Fe;
|
||||
double fn = frequency * h * 1e-6;
|
||||
|
||||
// even relative dielectric constant dispersion
|
||||
p1 = 0.27488 * (0.6315 + 0.525 / pow (1 + 0.0157 * fn, 20.)) * ue -
|
||||
0.065683 * exp (-8.7513 * ue);
|
||||
p2 = 0.33622 * (1 - exp (-0.03442 * er));
|
||||
p3 = 0.0363 * exp (-4.6 * ue) * (1 - exp (- pow (fn / 38.7, 4.97)));
|
||||
p4 = 1 + 2.751 * (1 - exp (- pow (er / 15.916, 8.)));
|
||||
p5 = 0.334 * exp (-3.3 * cubic (er / 15)) + 0.746;
|
||||
p6 = p5 * exp (- pow (fn / 18, 0.368));
|
||||
p7 = 1 + 4.069 * p6 * pow (g, 0.479) *
|
||||
exp (-1.347 * pow (g, 0.595) - 0.17 * pow (g, 2.5));
|
||||
Fe = p1 * p2 * pow ((p3 * p4 + 0.1844 * p7) * fn, 1.5763);
|
||||
*ErEffeFreq = er - (er - ErEffe) / (1 + Fe);
|
||||
|
||||
// odd relative dielectric constant dispersion
|
||||
double p8, p9, p10, p11, p12, p13, p14, p15, Fo;
|
||||
p1 = 0.27488 * (0.6315 + 0.525 / pow (1 + 0.0157 * fn, 20.)) * uo -
|
||||
0.065683 * exp (-8.7513 * uo);
|
||||
p3 = 0.0363 * exp (-4.6 * uo) * (1 - exp (- pow (fn / 38.7, 4.97)));
|
||||
p8 = 0.7168 * (1 + 1.076 / (1 + 0.0576 * (er - 1)));
|
||||
p9 = p8 - 0.7913 * (1 - exp (- pow (fn / 20, 1.424))) *
|
||||
atan (2.481 * pow (er / 8, 0.946));
|
||||
p10 = 0.242 * pow (er - 1, 0.55);
|
||||
p11 = 0.6366 * (exp (-0.3401 * fn) - 1) *
|
||||
atan (1.263 * pow (uo / 3, 1.629));
|
||||
p12 = p9 + (1 - p9) / (1 + 1.183 * pow (uo, 1.376));
|
||||
p13 = 1.695 * p10 / (0.414 + 1.605 * p10);
|
||||
p14 = 0.8928 + 0.1072 * (1 - exp (-0.42 * pow (fn / 20, 3.215)));
|
||||
p15 = fabs (1 - 0.8928 * (1 + p11) *
|
||||
exp (-p13 * pow (g, 1.092)) * p12 / p14);
|
||||
Fo = p1 * p2 * pow ((p3 * p4 + 0.1844) * fn * p15, 1.5763);
|
||||
*ErEffoFreq = er - (er - ErEffo) / (1 + Fo);
|
||||
|
||||
// dispersion of even characteristic impedance
|
||||
double t, q11, q12, q13, q14, q15, q16, q17, q18, q19, q20, q21;
|
||||
q11 = 0.893 * (1 - 0.3 / (1 + 0.7 * (er - 1)));
|
||||
t = pow (fn / 20, 4.91);
|
||||
q12 = 2.121 * t / (1 + q11 * t) * exp (-2.87 * g) * pow (g, 0.902);
|
||||
q13 = 1 + 0.038 * pow (er / 8, 5.1);
|
||||
t = quadr (er / 15);
|
||||
q14 = 1 + 1.203 * t / (1 + t);
|
||||
q15 = 1.887 * exp (-1.5 * pow (g, 0.84)) * pow (g, q14) /
|
||||
(1 + 0.41 * pow (fn / 15, 3.) *
|
||||
pow (u, 2 / q13) / (0.125 + pow (u, 1.626 / q13)));
|
||||
q16 = q15 * (1 + 9 / (1 + 0.403 * sqr (er - 1)));
|
||||
q17 = 0.394 * (1 - exp (-1.47 * pow (u / 7, 0.672))) *
|
||||
(1 - exp (-4.25 * pow (fn / 20, 1.87)));
|
||||
q18 = 0.61 * (1 - exp (-2.31 * pow (u / 8, 1.593))) /
|
||||
(1 + 6.544 * pow (g, 4.17));
|
||||
q19 = 0.21 * quadr (g) / (1 + 0.18 * pow (g, 4.9)) / (1 + 0.1 * sqr (u)) /
|
||||
(1 + pow (fn / 24, 3.));
|
||||
q20 = q19 * (0.09 + 1 / (1 + 0.1 * pow (er - 1, 2.7)));
|
||||
t = pow (u, 2.5);
|
||||
q21 = fabs (1 - 42.54 * pow (g, 0.133) * exp (-0.812 * g) * t /
|
||||
(1 + 0.033 * t));
|
||||
|
||||
double re, qe, pe, de, Ce, q0, ZlFreq, ErEffFreq;
|
||||
Kirschning_er (u, fn, er, ErEffe, &ErEffFreq);
|
||||
Kirschning_zl (u, fn, er, ErEffe, ErEffFreq, Zle, &q0, &ZlFreq);
|
||||
re = pow (fn / 28.843, 12.);
|
||||
qe = 0.016 + pow (0.0514 * er * q21, 4.524);
|
||||
pe = 4.766 * exp (-3.228 * pow (u, 0.641));
|
||||
t = pow (er - 1, 6.);
|
||||
de = 5.086 * qe * re / (0.3838 + 0.386 * qe) *
|
||||
exp (-22.2 * pow (u, 1.92)) / (1 + 1.2992 * re) * t / (1 + 10 * t);
|
||||
Ce = 1 + 1.275 * (1 - exp (-0.004625 * pe * pow (er, 1.674) *
|
||||
pow (fn / 18.365, 2.745))) - q12 + q16 - q17 + q18 + q20;
|
||||
*ZleFreq = Zle * pow ((0.9408 * pow (ErEffFreq, Ce) - 0.9603) /
|
||||
((0.9408 - de) * pow (ErEffe, Ce) - 0.9603), q0);
|
||||
|
||||
// dispersion of odd characteristic impedance
|
||||
double q22, q23, q24, q25, q26, q27, q28, q29;
|
||||
Kirschning_er (u, fn, er, ErEffo, &ErEffFreq);
|
||||
Kirschning_zl (u, fn, er, ErEffo, ErEffFreq, Zlo, &q0, &ZlFreq);
|
||||
q29 = 15.16 / (1 + 0.196 * sqr (er - 1));
|
||||
t = sqr (er - 1);
|
||||
q25 = 0.3 * sqr (fn) / (10 + sqr (fn)) * (1 + 2.333 * t / (5 + t));
|
||||
t = pow ((er - 1) / 13, 12.);
|
||||
q26 = 30 - 22.2 * t / (1 + 3 * t) - q29;
|
||||
t = pow (er - 1, 1.5);
|
||||
q27 = 0.4 * pow (g, 0.84) * (1 + 2.5 * t / (5 + t));
|
||||
t = pow (er - 1, 3.);
|
||||
q28 = 0.149 * t / (94.5 + 0.038 * t);
|
||||
q22 = 0.925 * pow (fn / q26, 1.536) / (1 + 0.3 * pow (fn / 30, 1.536));
|
||||
q23 = 1 + 0.005 * fn * q27 / (1 + 0.812 * pow (fn / 15, 1.9)) /
|
||||
(1 + 0.025 * sqr (u));
|
||||
t = pow (u, 0.894);
|
||||
q24 = 2.506 * q28 * t / (3.575 + t) *
|
||||
pow ((1 + 1.3 * u) * fn / 99.25, 4.29);
|
||||
*ZloFreq = ZlFreq + (Zlo * pow (*ErEffoFreq / ErEffo, q22) - ZlFreq * q23) /
|
||||
(1 + q24 + pow (0.46 * g, 2.2) * q25);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
void cm_cpmline (ARGS)
|
||||
{
|
||||
Complex_t z11, z12, z13, z14;
|
||||
|
|
@ -497,7 +200,7 @@ void cm_cpmline (ARGS)
|
|||
}
|
||||
else if(ANALYSIS == TRANSIENT) {
|
||||
calcPropagation(W,s,er,h,t,tand,rho,D,SModel,DModel,0);
|
||||
double t = TIME;
|
||||
double time = TIME;
|
||||
double Vp[PORT_NUM];
|
||||
double Ip[PORT_NUM];
|
||||
Vp[0] = INPUT(p1s);
|
||||
|
|
@ -518,10 +221,10 @@ void cm_cpmline (ARGS)
|
|||
if (TIME < last_time) {
|
||||
delete_cpline_last_state((cpline_state_t **)sim_points);
|
||||
}
|
||||
append_cpline_state((cpline_state_t **)sim_points, t, Vp, Ip, 1.2*delay);
|
||||
append_cpline_state((cpline_state_t **)sim_points, time, Vp, Ip, 1.2*delay);
|
||||
}
|
||||
if (t > delay && TModel == TRAN_FULL) {
|
||||
cpline_state_t *pp = find_cpline_state(*(cpline_state_t **)sim_points, t - delay);
|
||||
if (time > delay && TModel == TRAN_FULL) {
|
||||
cpline_state_t *pp = find_cpline_state(*(cpline_state_t **)sim_points, time - delay);
|
||||
if (pp != NULL) {
|
||||
|
||||
double J1e = 0.5*(Ip[3] + Ip[0]);
|
||||
|
|
|
|||
|
|
@ -153,7 +153,7 @@ void cm_mlin (ARGS)
|
|||
else if(ANALYSIS == TRANSIENT) {
|
||||
calcPropagation(W,SModel,DModel,er,h,t,tand,rho,D,0);
|
||||
sim_points = &(STATIC_VAR(sim_points_data));
|
||||
double t = TIME;
|
||||
double time = TIME;
|
||||
double V1 = INPUT(V1sens);
|
||||
double V2 = INPUT(V2sens);
|
||||
double I1 = INPUT(port1);
|
||||
|
|
@ -169,10 +169,10 @@ void cm_mlin (ARGS)
|
|||
//fprintf(stderr,"Rollbacki time=%g\n",TIME);
|
||||
delete_tline_last_state((tline_state_t **)sim_points);
|
||||
}
|
||||
append_state((tline_state_t **)sim_points, t, V1, V2, I1, I2, 1.2*delay);
|
||||
append_state((tline_state_t **)sim_points, time, V1, V2, I1, I2, 1.2*delay);
|
||||
}
|
||||
if (t > delay && TModel == TRAN_FULL) {
|
||||
tline_state_t *pp = get_state(*(tline_state_t **)sim_points, t - delay);
|
||||
if (time > delay && TModel == TRAN_FULL) {
|
||||
tline_state_t *pp = get_state(*(tline_state_t **)sim_points, time - delay);
|
||||
if (pp != NULL) {
|
||||
double V2out = pp->V1 + zl*(pp->I1);
|
||||
double V1out = pp->V2 + zl*(pp->I2);
|
||||
|
|
|
|||
|
|
@ -347,3 +347,287 @@ void analyseLoss (double W, double t, double er,
|
|||
}
|
||||
}
|
||||
|
||||
/* The function calculates the quasi-static dielectric constants and
|
||||
characteristic impedances for the even and odd mode based upon the
|
||||
given line and substrate properties for parallel coupled microstrip
|
||||
lines. */
|
||||
void cpmslineAnalyseQuasiStatic (double W, double h, double s,
|
||||
double t, double er,
|
||||
int SModel, double* Zle,
|
||||
double* Zlo, double* ErEffe,
|
||||
double* ErEffo) {
|
||||
// initialize default return values
|
||||
*ErEffe = er; *ErEffo = er;
|
||||
*Zlo = 42.2; *Zle = 55.7;
|
||||
|
||||
// normalized width and gap
|
||||
double u = W / h;
|
||||
double g = s / h;
|
||||
|
||||
// HAMMERSTAD and JENSEN
|
||||
if (SModel == HAMMERSTAD) {
|
||||
double Zl1, Fe, Fo, a, b, fo, Mu, Alpha, Beta, ErEff;
|
||||
double Pe, Po, r, fo1, q, p, n, Psi, Phi, m, Theta;
|
||||
|
||||
// modifying equations for even mode
|
||||
m = 0.2175 + pow (4.113 + pow (20.36 / g, 6.), -0.251) +
|
||||
log (pow (g, 10.) / (1 + pow (g / 13.8, 10.))) / 323;
|
||||
Alpha = 0.5 * exp (-g);
|
||||
Psi = 1 + g / 1.45 + pow (g, 2.09) / 3.95;
|
||||
Phi = 0.8645 * pow (u, 0.172);
|
||||
Pe = Phi / (Psi * (Alpha * pow (u, m) + (1 - Alpha) * pow (u, -m)));
|
||||
// TODO: is this ... Psi * (Alpha ... or ... Psi / (Alpha ... ?
|
||||
|
||||
// modifying equations for odd mode
|
||||
n = (1 / 17.7 + exp (-6.424 - 0.76 * log (g) - pow (g / 0.23, 5.))) *
|
||||
log ((10 + 68.3 * sqr (g)) / (1 + 32.5 * pow (g, 3.093)));
|
||||
Beta = 0.2306 + log (pow (g, 10.) / (1 + pow (g / 3.73, 10.))) / 301.8 +
|
||||
log (1 + 0.646 * pow (g, 1.175)) / 5.3;
|
||||
Theta = 1.729 + 1.175 * log (1 + 0.627 / (g + 0.327 * pow (g, 2.17)));
|
||||
Po = Pe - Theta / Psi * exp (Beta * pow (u, -n) * log (u));
|
||||
|
||||
// further modifying equations
|
||||
r = 1 + 0.15 * (1 - exp (1 - sqr (er - 1) / 8.2) / (1 + pow (g, -6.)));
|
||||
fo1 = 1 - exp (-0.179 * pow (g, 0.15) -
|
||||
0.328 * pow (g, r) / log (M_E + pow (g / 7, 2.8)));
|
||||
q = exp (-1.366 - g);
|
||||
p = exp (-0.745 * pow (g, 0.295)) / cosh (pow (g, 0.68));
|
||||
fo = fo1 * exp (p * log (u) + q * sin (M_PI * log10 (u)));
|
||||
|
||||
Mu = g * exp (-g) + u * (20 + sqr (g)) / (10 + sqr (g));
|
||||
Hammerstad_ab (Mu, er, &a, &b);
|
||||
Fe = pow (1 + 10 / Mu, -a * b);
|
||||
Hammerstad_ab (u, er, &a, &b);
|
||||
Fo = fo * pow (1 + 10 / u, -a * b);
|
||||
|
||||
// finally compute effective dielectric constants and impedances
|
||||
*ErEffe = (er + 1) / 2 + (er - 1) / 2 * Fe;
|
||||
*ErEffo = (er + 1) / 2 + (er - 1) / 2 * Fo;
|
||||
|
||||
Hammerstad_er (u, er, a, b, &ErEff); // single microstrip
|
||||
|
||||
// first variant
|
||||
Zl1 = Z0 / (u + 1.98 * pow (u, 0.172));
|
||||
Zl1 /= sqrt (ErEff);
|
||||
|
||||
// second variant
|
||||
Hammerstad_zl (u, &Zl1);
|
||||
Zl1 /= sqrt (ErEff);
|
||||
|
||||
*Zle = Zl1 / (1 - Zl1 * Pe / Z0);
|
||||
*Zlo = Zl1 / (1 - Zl1 * Po / Z0);
|
||||
}
|
||||
// KIRSCHNING and JANSEN
|
||||
else if (SModel == KIRSCHING) {
|
||||
double a, b, ae, be, ao, bo, v, co, d, ErEff, Zl1;
|
||||
double q1, q2, q3, q4, q5, q6, q7, q8, q9, q10;
|
||||
|
||||
// consider effect of finite strip thickness (JANSEN only)
|
||||
double ue = u;
|
||||
double uo = u;
|
||||
if (t != 0 && s > 10 * (2 * t)) {
|
||||
double dW = 0;
|
||||
// SCHNEIDER, referred by JANSEN
|
||||
if (u >= M_1_PI / 2 && M_1_PI / 2 > 2 * t / h)
|
||||
dW = t * (1 + log (2 * h / t)) / M_PI;
|
||||
else if (W > 2 * t)
|
||||
dW = t * (1 + log (4 * M_PI * W / t)) / M_PI;
|
||||
// JANSEN
|
||||
double dt = 2 * t * h / s / er;
|
||||
double We = W + dW * (1 - 0.5 * exp (-0.69 * dW / dt));
|
||||
double Wo = We + dt;
|
||||
ue = We / h;
|
||||
uo = Wo / h;
|
||||
}
|
||||
|
||||
// even relative dielectric constant
|
||||
v = ue * (20 + sqr (g)) / (10 + sqr (g)) + g * exp (-g);
|
||||
Hammerstad_ab (v, er, &ae, &be);
|
||||
Hammerstad_er (v, er, ae, be, ErEffe);
|
||||
|
||||
// odd relative dielectric constant
|
||||
Hammerstad_ab (uo, er, &a, &b);
|
||||
Hammerstad_er (uo, er, a, b, &ErEff);
|
||||
d = 0.593 + 0.694 * exp (-0.562 * uo);
|
||||
bo = 0.747 * er / (0.15 + er);
|
||||
co = bo - (bo - 0.207) * exp (-0.414 * uo);
|
||||
ao = 0.7287 * (ErEff - (er + 1) / 2) * (1 - exp (-0.179 * uo));
|
||||
*ErEffo = ((er + 1) / 2 + ao - ErEff) * exp (-co * pow (g, d)) + ErEff;
|
||||
|
||||
// characteristic impedance of single line
|
||||
Hammerstad_zl (u, &Zl1);
|
||||
Zl1 /= sqrt (ErEff);
|
||||
|
||||
// even characteristic impedance
|
||||
q1 = 0.8695 * pow (ue, 0.194);
|
||||
q2 = 1 + 0.7519 * g + 0.189 * pow (g, 2.31);
|
||||
q3 = 0.1975 + pow (16.6 + pow (8.4 / g, 6.), -0.387) +
|
||||
log (pow (g, 10.) / (1 + pow (g / 3.4, 10.))) / 241;
|
||||
q4 = q1 / q2 * 2 /
|
||||
(exp (-g) * pow (ue, q3) + (2 - exp (-g)) * pow (ue, -q3));
|
||||
*Zle = sqrt (ErEff / *ErEffe) * Zl1 / (1 - Zl1 * sqrt (ErEff) * q4 / Z0);
|
||||
|
||||
// odd characteristic impedance
|
||||
q5 = 1.794 + 1.14 * log (1 + 0.638 / (g + 0.517 * pow (g, 2.43)));
|
||||
q6 = 0.2305 + log (pow (g, 10.) / (1 + pow (g / 5.8, 10.))) / 281.3 +
|
||||
log (1 + 0.598 * pow (g, 1.154)) / 5.1;
|
||||
q7 = (10 + 190 * sqr (g)) / (1 + 82.3 * cubic (g));
|
||||
q8 = exp (-6.5 - 0.95 * log (g) - pow (g / 0.15, 5.));
|
||||
q9 = log (q7) * (q8 + 1 / 16.5);
|
||||
q10 = (q2 * q4 - q5 * exp (log (uo) * q6 * pow (uo, -q9))) / q2;
|
||||
*Zlo = sqrt (ErEff / *ErEffo) * Zl1 / (1 - Zl1 * sqrt (ErEff) * q10 / Z0);
|
||||
}
|
||||
}
|
||||
|
||||
/* The function computes the dispersion effects on the dielectric
|
||||
constants and characteristic impedances for the even and odd mode
|
||||
of parallel coupled microstrip lines. */
|
||||
void cpmslineAnalyseDispersion (double W, double h, double s,
|
||||
double t, double er, double Zle,
|
||||
double Zlo, double ErEffe,
|
||||
double ErEffo, double frequency,
|
||||
int DModel, double *ZleFreq,
|
||||
double *ZloFreq,
|
||||
double *ErEffeFreq,
|
||||
double *ErEffoFreq) {
|
||||
|
||||
// initialize default return values
|
||||
*ZleFreq = Zle;
|
||||
*ErEffeFreq = ErEffe;
|
||||
*ZloFreq = Zlo;
|
||||
*ErEffoFreq = ErEffo;
|
||||
|
||||
// normalized width and gap
|
||||
double u = W / h;
|
||||
double g = s / h;
|
||||
double ue, uo;
|
||||
double B, dW, dt;
|
||||
|
||||
// compute u_odd, u_even
|
||||
if (t > 0.0) {
|
||||
if (u < 0.1592) {
|
||||
B = 2 * M_PI * W;
|
||||
} else {
|
||||
B = h;
|
||||
}
|
||||
dW = t * (1.0 + log(2 * B / t)) / M_PI;
|
||||
dt = t / (er * g);
|
||||
ue = (W + dW * (1.0 - 0.5 * exp( -0.69 * dW / dt ))) / h;
|
||||
uo = ue + dt / h;
|
||||
} else {
|
||||
ue = u;
|
||||
uo = u;
|
||||
}
|
||||
|
||||
// GETSINGER
|
||||
if (DModel == GETSINGER) {
|
||||
// even mode dispersion
|
||||
Getsinger_disp (h, er, ErEffe, Zle / 2,
|
||||
frequency, ErEffeFreq, ZleFreq);
|
||||
*ZleFreq *= 2;
|
||||
// odd mode dispersion
|
||||
Getsinger_disp (h, er, ErEffo, Zlo * 2,
|
||||
frequency, ErEffoFreq, ZloFreq);
|
||||
*ZloFreq /= 2;
|
||||
}
|
||||
// KIRSCHNING and JANSEN
|
||||
else if (DModel == DISP_KIRSCHING) {
|
||||
double p1, p2, p3, p4, p5, p6, p7, Fe;
|
||||
double fn = frequency * h * 1e-6;
|
||||
|
||||
// even relative dielectric constant dispersion
|
||||
p1 = 0.27488 * (0.6315 + 0.525 / pow (1 + 0.0157 * fn, 20.)) * ue -
|
||||
0.065683 * exp (-8.7513 * ue);
|
||||
p2 = 0.33622 * (1 - exp (-0.03442 * er));
|
||||
p3 = 0.0363 * exp (-4.6 * ue) * (1 - exp (- pow (fn / 38.7, 4.97)));
|
||||
p4 = 1 + 2.751 * (1 - exp (- pow (er / 15.916, 8.)));
|
||||
p5 = 0.334 * exp (-3.3 * cubic (er / 15)) + 0.746;
|
||||
p6 = p5 * exp (- pow (fn / 18, 0.368));
|
||||
p7 = 1 + 4.069 * p6 * pow (g, 0.479) *
|
||||
exp (-1.347 * pow (g, 0.595) - 0.17 * pow (g, 2.5));
|
||||
Fe = p1 * p2 * pow ((p3 * p4 + 0.1844 * p7) * fn, 1.5763);
|
||||
*ErEffeFreq = er - (er - ErEffe) / (1 + Fe);
|
||||
|
||||
// odd relative dielectric constant dispersion
|
||||
double p8, p9, p10, p11, p12, p13, p14, p15, Fo;
|
||||
p1 = 0.27488 * (0.6315 + 0.525 / pow (1 + 0.0157 * fn, 20.)) * uo -
|
||||
0.065683 * exp (-8.7513 * uo);
|
||||
p3 = 0.0363 * exp (-4.6 * uo) * (1 - exp (- pow (fn / 38.7, 4.97)));
|
||||
p8 = 0.7168 * (1 + 1.076 / (1 + 0.0576 * (er - 1)));
|
||||
p9 = p8 - 0.7913 * (1 - exp (- pow (fn / 20, 1.424))) *
|
||||
atan (2.481 * pow (er / 8, 0.946));
|
||||
p10 = 0.242 * pow (er - 1, 0.55);
|
||||
p11 = 0.6366 * (exp (-0.3401 * fn) - 1) *
|
||||
atan (1.263 * pow (uo / 3, 1.629));
|
||||
p12 = p9 + (1 - p9) / (1 + 1.183 * pow (uo, 1.376));
|
||||
p13 = 1.695 * p10 / (0.414 + 1.605 * p10);
|
||||
p14 = 0.8928 + 0.1072 * (1 - exp (-0.42 * pow (fn / 20, 3.215)));
|
||||
p15 = fabs (1 - 0.8928 * (1 + p11) *
|
||||
exp (-p13 * pow (g, 1.092)) * p12 / p14);
|
||||
Fo = p1 * p2 * pow ((p3 * p4 + 0.1844) * fn * p15, 1.5763);
|
||||
*ErEffoFreq = er - (er - ErEffo) / (1 + Fo);
|
||||
|
||||
// dispersion of even characteristic impedance
|
||||
double t, q11, q12, q13, q14, q15, q16, q17, q18, q19, q20, q21;
|
||||
q11 = 0.893 * (1 - 0.3 / (1 + 0.7 * (er - 1)));
|
||||
t = pow (fn / 20, 4.91);
|
||||
q12 = 2.121 * t / (1 + q11 * t) * exp (-2.87 * g) * pow (g, 0.902);
|
||||
q13 = 1 + 0.038 * pow (er / 8, 5.1);
|
||||
t = quadr (er / 15);
|
||||
q14 = 1 + 1.203 * t / (1 + t);
|
||||
q15 = 1.887 * exp (-1.5 * pow (g, 0.84)) * pow (g, q14) /
|
||||
(1 + 0.41 * pow (fn / 15, 3.) *
|
||||
pow (u, 2 / q13) / (0.125 + pow (u, 1.626 / q13)));
|
||||
q16 = q15 * (1 + 9 / (1 + 0.403 * sqr (er - 1)));
|
||||
q17 = 0.394 * (1 - exp (-1.47 * pow (u / 7, 0.672))) *
|
||||
(1 - exp (-4.25 * pow (fn / 20, 1.87)));
|
||||
q18 = 0.61 * (1 - exp (-2.31 * pow (u / 8, 1.593))) /
|
||||
(1 + 6.544 * pow (g, 4.17));
|
||||
q19 = 0.21 * quadr (g) / (1 + 0.18 * pow (g, 4.9)) / (1 + 0.1 * sqr (u)) /
|
||||
(1 + pow (fn / 24, 3.));
|
||||
q20 = q19 * (0.09 + 1 / (1 + 0.1 * pow (er - 1, 2.7)));
|
||||
t = pow (u, 2.5);
|
||||
q21 = fabs (1 - 42.54 * pow (g, 0.133) * exp (-0.812 * g) * t /
|
||||
(1 + 0.033 * t));
|
||||
|
||||
double re, qe, pe, de, Ce, q0, ZlFreq, ErEffFreq;
|
||||
Kirschning_er (u, fn, er, ErEffe, &ErEffFreq);
|
||||
Kirschning_zl (u, fn, er, ErEffe, ErEffFreq, Zle, &q0, &ZlFreq);
|
||||
re = pow (fn / 28.843, 12.);
|
||||
qe = 0.016 + pow (0.0514 * er * q21, 4.524);
|
||||
pe = 4.766 * exp (-3.228 * pow (u, 0.641));
|
||||
t = pow (er - 1, 6.);
|
||||
de = 5.086 * qe * re / (0.3838 + 0.386 * qe) *
|
||||
exp (-22.2 * pow (u, 1.92)) / (1 + 1.2992 * re) * t / (1 + 10 * t);
|
||||
Ce = 1 + 1.275 * (1 - exp (-0.004625 * pe * pow (er, 1.674) *
|
||||
pow (fn / 18.365, 2.745))) - q12 + q16 - q17 + q18 + q20;
|
||||
*ZleFreq = Zle * pow ((0.9408 * pow (ErEffFreq, Ce) - 0.9603) /
|
||||
((0.9408 - de) * pow (ErEffe, Ce) - 0.9603), q0);
|
||||
|
||||
// dispersion of odd characteristic impedance
|
||||
double q22, q23, q24, q25, q26, q27, q28, q29;
|
||||
Kirschning_er (u, fn, er, ErEffo, &ErEffFreq);
|
||||
Kirschning_zl (u, fn, er, ErEffo, ErEffFreq, Zlo, &q0, &ZlFreq);
|
||||
q29 = 15.16 / (1 + 0.196 * sqr (er - 1));
|
||||
t = sqr (er - 1);
|
||||
q25 = 0.3 * sqr (fn) / (10 + sqr (fn)) * (1 + 2.333 * t / (5 + t));
|
||||
t = pow ((er - 1) / 13, 12.);
|
||||
q26 = 30 - 22.2 * t / (1 + 3 * t) - q29;
|
||||
t = pow (er - 1, 1.5);
|
||||
q27 = 0.4 * pow (g, 0.84) * (1 + 2.5 * t / (5 + t));
|
||||
t = pow (er - 1, 3.);
|
||||
q28 = 0.149 * t / (94.5 + 0.038 * t);
|
||||
q22 = 0.925 * pow (fn / q26, 1.536) / (1 + 0.3 * pow (fn / 30, 1.536));
|
||||
q23 = 1 + 0.005 * fn * q27 / (1 + 0.812 * pow (fn / 15, 1.9)) /
|
||||
(1 + 0.025 * sqr (u));
|
||||
t = pow (u, 0.894);
|
||||
q24 = 2.506 * q28 * t / (3.575 + t) *
|
||||
pow ((1 + 1.3 * u) * fn / 99.25, 4.29);
|
||||
*ZloFreq = ZlFreq + (Zlo * pow (*ErEffoFreq / ErEffo, q22) - ZlFreq * q23) /
|
||||
(1 + q24 + pow (0.46 * g, 2.2) * q25);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -68,4 +68,20 @@ void analyseLoss (double, double, double, double,
|
|||
double, double, int,
|
||||
double*, double*);
|
||||
|
||||
void cpmslineAnalyseQuasiStatic (double W, double h, double s,
|
||||
double t, double er,
|
||||
int SModel, double* Zle,
|
||||
double* Zlo, double* ErEffe,
|
||||
double* ErEffo);
|
||||
|
||||
void cpmslineAnalyseDispersion (double W, double h, double s,
|
||||
double t, double er, double Zle,
|
||||
double Zlo, double ErEffe,
|
||||
double ErEffo, double frequency,
|
||||
int DModel, double *ZleFreq,
|
||||
double *ZloFreq,
|
||||
double *ErEffeFreq,
|
||||
double *ErEffoFreq);
|
||||
|
||||
|
||||
#endif
|
||||
|
|
|
|||
Loading…
Reference in New Issue