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:
Holger Vogt 2025-08-13 20:08:33 +02:00
commit 7e22a85331
5 changed files with 312 additions and 309 deletions

View File

@ -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)

View File

@ -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]);

View File

@ -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);

View File

@ -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);
}
}

View File

@ -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