53 bool _isreal,
int it,
int dt) {
77 spfile::spfile () :
circuit () {
80 spara = FMIN = SOPT = RN = NULL;
81 interpolType = dataType = 0;
83 setVariableSized (
true);
88 if (spara)
delete[] spara;
90 if (FMIN)
delete FMIN;
91 if (SOPT)
delete SOPT;
98 if (data)
delete data;
104 if (spara == NULL || sfreq == NULL)
return;
117 for (
int r = 0; r <
getSize () - 1; r++) {
120 s.
set (r, c, spara[i].interpolate (frequency));
144 if (spara == NULL || nfreq == NULL)
return;
170 for (sa = 0, r = 0; r < ports - 1; r++)
171 for (c = 0; c < ports - 1; c++) sa += s.
get (r, c);
172 ss = (2 - g - ports + sa) / (1 - ports * g - sa);
173 res.
set (ports - 1, ports - 1, ss);
174 fr = (1.0 - g * ss) / (1.0 - g);
177 for (r = 0; r < ports - 1; r++) {
178 for (sc = 0, c = 0; c < ports - 1; c++) sc += s.
get (r, c);
179 res.
set (r, ports - 1, fr * (1.0 - sc));
183 for (c = 0; c < ports - 1; c++) {
184 for (sr = 0, r = 0; r < ports - 1; r++) sr += s.
get (r, c);
185 res.
set (ports - 1, c, fr * (1.0 - sr));
189 for (r = 0; r < ports - 1; r++) {
190 for (c = 0; c < ports - 1; c++) {
191 fr = g * res (r, ports - 1) * res (ports - 1, c) / (1.0 - g * ss);
192 res.
set (r, c, s.
get (r, c) - fr);
209 for (r = 0; r < ports - 1; r++) {
210 for (c = 0; c < ports - 1; c++) {
211 res.
set (r, c, s (r, c) + g * s (r, ports - 1) *
212 s (ports - 1, c) / (1.0 - g * s (ports - 1, ports - 1)));
231 matrix k (ports, ports - 1);
232 for (r = 0; r < ports - 1; r++) {
233 for (c = 0; c < ports - 1; c++) {
235 k.
set (r, c, 1.0 + g * (s.
get (r, ports - 1) - 1.0));
237 k.
set (r, c, g * s.
get (r, ports - 1));
240 for (c = 0; c < ports - 1; c++)
241 k.
set (ports - 1, c, g * s.
get (ports - 1, ports - 1) - 1.0);
245 for (r = 0; r < ports - 1; r++) d.
set (r, 0, s.
get (r, ports - 1));
246 d.
set (ports - 1, 0, s.
get (ports - 1, ports - 1) - 1.0);
268 matrix k (ports - 1, ports);
269 for (r = 0; r < ports - 1; r++) k.
set (r, r, 1);
270 for (r = 0; r < ports - 1; r++)
271 k.
set (r, ports - 1, g * s.
get (r, ports - 1) /
272 (1.0 - g * s.
get (ports - 1, ports - 1)));
276 for (r = 0; r < ports - 1; r++) d.
set (r, 0, s.
get (r, ports - 1));
289 if (!strcmp (type,
"rectangular")) {
293 else if (!strcmp (type,
"polar")) {
300 if (!strcmp (type,
"linear")) {
303 else if (!strcmp (type,
"cubic")) {
325 "requires a %d-port\n", file, ports,
getName (),
362 if ((n = v->
getName ()) != NULL) {
363 if (!strcmp (n,
"frequency")) sfreq = v;
364 else if (!strcmp (n,
"nfreq")) nfreq = v;
378 spara[
i].
prepare (v, sfreq,
false, interpolType, dataType);
382 if ((n = v->
getName ()) != NULL) {
384 if (!strcmp (n,
"Rn")) {
386 RN->
prepare (v, nfreq,
true, interpolType, dataType);
388 else if (!strcmp (n,
"Fmin")) {
390 FMIN->
prepare (v, nfreq,
true, interpolType, dataType);
392 else if (!strcmp (n,
"Sopt")) {
394 SOPT->
prepare (v, nfreq,
false, interpolType, dataType);
408 c.set (0, 0, (Fmin - 1) * (
norm (s.
get (0, 0)) - 1) +
409 Kx *
norm (1.0 - s.
get (0, 0) * Sopt));
410 c.set (1, 1,
norm (s.
get (1, 0)) * ((Fmin - 1) + Kx *
norm (Sopt)));
411 c.set (0, 1, s.
get (0, 0) / s.
get (1, 0) * c.get (1, 1) -
413 c.set (1, 0,
conj (c.get (0, 1)));
427 n2 = 2.0 * (c.
get (1, 1) * s.
get (0, 0) -
428 c.
get (0, 1) * s.
get (1, 0)) / (c.
get (1, 1) +
n1);
431 Sopt = 1 -
norm (n2);
432 if (
real (Sopt) < 0.0)
433 Sopt = (1.0 +
sqrt (Sopt)) / n2;
435 Sopt = (1.0 -
sqrt (Sopt)) / n2;
438 Fmin =
real (1.0 + (c.
get (1, 1) - n1 *
norm (Sopt)) /
442 Rn =
real ((c (0, 0) - 2.0 *
443 real (c (0, 1) *
conj ((1.0 + s (0, 0)) / s (1, 0))) +
444 c (1, 1) *
norm ((1.0 + s (0, 0)) / s (1, 0))) / 4.0);
456 if (!strcmp (dc,
"shortall")) {
457 int v,
n, lastnode =
getSize () - 1;
467 if (!strcmp (dc,
"short")) {
468 int v,
n, lastnode =
getSize () - 2;
478 else if (!strcmp (dc,
"open")) {
498 if (spara == NULL || sfreq == NULL)
return;
507 if (spara == NULL || nfreq == NULL)
return;
526 PROP_RNG_STR4 (
"open",
"short",
"shortall",
"unspecified") },