55 #include "components/ground.h"
58 #define USE_GROUNDS 1 // use extra grounds ?
59 #define USE_CROSSES 1 // use additional cross connectors ?
60 #define SORTED_LIST 1 // use sorted node list?
62 #define TINYS (NR_TINY * 1.235) // 'tiny' value for singularities
71 tees = crosses = opens = grounds = 0;
82 tees = crosses = opens = grounds = 0;
89 if (nlist)
delete nlist;
101 swp = n.swp ?
new sweep (*n.swp) : NULL;
102 nlist = n.nlist ?
new nodelist (*n.nlist) : NULL;
125 nr_double_t tiny1 = (d == 0) ? 1.0 -
TINYS : 1.0;
126 nr_double_t tiny2 = tiny1 * tiny1;
127 nr_double_t tiny3 = tiny1 * tiny2;
128 d = (1.0 - s->
getS (k, l) * tiny1) * (1.0 - s->
getS (l, k) * tiny1) -
129 s->
getS (k, k) * s->
getS (l, l) * tiny2;
138 for (j1 = 0; j1 < s->
getSize (); j1++) {
141 if (j1 == k || j1 == l)
continue;
147 for (i1 = 0; i1 < s->
getSize (); i1++) {
150 if (i1 == k || i1 == l)
continue;
153 p = s->
getS (i1, j1);
155 (s->
getS (k, j1) * s->
getS (i1, l) * (1.0 - s->
getS (l, k)) * tiny3 +
156 s->
getS (l, j1) * s->
getS (i1, k) * (1.0 - s->
getS (k, l)) * tiny3 +
157 s->
getS (k, j1) * s->
getS (l, l) * s->
getS (i1, k) * tiny3 +
158 s->
getS (l, j1) * s->
getS (k, k) * s->
getS (i1, l) * tiny3) / d;
159 result->
setS (i2++, j2, p);
187 nr_double_t tiny1 = (d == 0) ? 1.0 -
TINYS : 1.0;
188 nr_double_t tiny2 = tiny1 * tiny1;
189 nr_double_t tiny3 = tiny1 * tiny2;
190 d = 1.0 - s->
getS (k, k) * t->
getS (l, l) * tiny2;
199 for (j1 = 0; j1 < s->
getSize (); j1++) {
202 if (j1 == k)
continue;
208 for (i1 = 0; i1 < s->
getSize (); i1++) {
211 if (i1 == k)
continue;
214 p = s->
getS (i1, j1);
215 p += s->
getS (k, j1) * t->
getS (l, l) * s->
getS (i1, k) * tiny3 / d;
216 result->
setS (i2++, j2, p);
220 for (i1 = 0; i1 < t->
getSize (); i1++) {
223 if (i1 == l)
continue;
226 p = s->
getS (k, j1) * t->
getS (i1, l) * tiny2 / d;
227 result->
setS (i2++, j2, p);
234 for (j1 = 0; j1 < t->
getSize (); j1++) {
237 if (j1 == l)
continue;
243 for (i1 = 0; i1 < s->
getSize (); i1++) {
246 if (i1 == k)
continue;
249 p = t->
getS (l, j1) * s->
getS (i1, k) * tiny2 / d;
250 result->
setS (i2++, j2, p);
254 for (i1 = 0; i1 < t->
getSize (); i1++) {
257 if (i1 == l)
continue;
260 p = t->
getS (i1, j1);
261 p += t->
getS (l, j1) * s->
getS (k, k) * t->
getS (i1, l) * tiny3 / d;
262 result->
setS (i2++, j2, p);
288 nr_double_t tiny1 = (t == 0) ? 1.0 -
TINYS : 1.0;
289 nr_double_t tiny2 = tiny1 * tiny1;
290 t = (1.0 - c->
getS (k, l) * tiny1) * (1.0 - c->
getS (l, k) * tiny1) -
291 c->
getS (k, k) * c->
getS (l, l) * tiny2;
300 for (j1 = 0; j1 < c->
getSize (); j1++) {
303 if (j1 == k || j1 == l)
continue;
306 for (i1 = 0; i1 < c->
getSize (); i1++) {
309 if (i1 == k || i1 == l)
continue;
311 k1 = (c->
getS (i1, l) * (1.0 - c->
getS (l, k)) +
312 c->
getS (l, l) * c->
getS (i1, k)) * tiny2 / t;
313 k2 = (c->
getS (i1, k) * (1.0 - c->
getS (k, l)) +
314 c->
getS (k, k) * c->
getS (i1, l)) * tiny2 / t;
315 k3 = (c->
getS (j1, l) * (1.0 - c->
getS (l, k)) +
316 c->
getS (l, l) * c->
getS (j1, k)) * tiny2 / t;
317 k4 = (c->
getS (j1, k) * (1.0 - c->
getS (k, l)) +
318 c->
getS (k, k) * c->
getS (j1, l)) * tiny2 / t;
321 c->
getN (i1, j1) + c->
getN (k, j1) * k1 + c->
getN (l, j1) * k2 +
323 c->
getN (l, k) * k2) +
325 c->
getN (l, l) * k2);
326 result->
setN (i2, j2, p);
354 nr_double_t tiny1 = (t == 0) ? 1.0 -
TINYS : 1.0;
355 nr_double_t tiny2 = tiny1 * tiny1;
356 nr_double_t tiny3 = tiny1 * tiny2;
357 nr_double_t tiny4 = tiny1 * tiny3;
358 t = 1.0 - c->
getS (k, k) * d->
getS (l, l) * tiny2;
367 for (j1 = 0; j1 < c->
getSize (); j1++) {
370 if (j1 == k)
continue;
373 for (i1 = 0; i1 < c->
getSize (); i1++) {
376 if (i1 == k)
continue;
379 p = c->
getN (i1, j1) +
380 c->
getN (k, j1) * d->
getS (l, l) * c->
getS (i1, k) * tiny2 / t +
385 result->
setN (i2, j2, p);
400 for (j1 = 0; j1 < d->
getSize (); j1++) {
403 if (j1 == l)
continue;
406 for (i1 = 0; i1 < c->
getSize (); i1++) {
409 if (i1 == k)
continue;
412 p = (c->
getN (k, k) * d->
getS (l, l) +
415 d->
getN (l, j1) * c->
getS (i1, k) * tiny1 / t +
417 result->
setN (i2, j2, p);
423 for (i1 = 0; i1 < d->
getSize (); i1++) {
426 if (i1 == l)
continue;
429 p = d->
getN (i1, j1) +
433 d->
getN (l, j1) * c->
getS (k, k) * d->
getS (i1, l) * tiny2 /
t;
434 result->
setN (i2, j2, p);
451 if (noise)
c->calcNoiseSP (freq);
462 circuit * result, * cand1, * cand2;
469 circuit * result, * c1, * c2, * cand1, * cand2;
474 result = c1 = c2 = cand1 = cand2 = NULL;
475 n1 = n2 = cand = NULL;
482 if (
c->getPort ())
continue;
485 for (
int i = 0;
i <
c->getSize ();
i++) {
496 cand1 = c1; cand2 = c2; n1 = c1->
getNode (
i); n2 = cand;
501 if (c1->
getSize () - 2 < ports) {
503 cand1 = c1; cand2 = c2; n1 = c1->
getNode (
i); n2 = cand;
512 if (cand1 != NULL && cand2 != NULL) {
514 if (cand1 != cand2) {
530 result->setOriginal (0);
547 result->setOriginal (0);
557 if (
c->isNonLinear ())
c->calcOperatingPoints ();
559 if (noise)
c->initNoiseSP ();
625 delete nlist; nlist = NULL;
636 node * nodes[4], * _node;
641 if (!strcmp (_name,
"gnd"))
return;
649 for (
int i = 0;
i <
c->getSize ();
i++) {
650 _node =
c->getNode (
i);
651 if (!strcmp (_node->
getName (), _name)) {
655 nodes[++count] = _node;
704 nodes[1] = result->
getNode (0);
714 result =
new cross ();
735 nodes[1] = result->
getNode (0);
769 if (strcmp (n->
getName (),
"gnd") &&
839 tees = crosses = opens = grounds = 0;
864 getName (), tees, crosses, opens, grounds);
882 if (
c->getInserted () > inserted) {
883 inserted =
c->getInserted ();
907 }
while (cand != NULL);
926 result->
setNode (1,
c->getNode(0)->getName ());
927 result->
setNode (2,
c->getNode(1)->getName ());
931 c->getNode(1)->setName (
"PacGround");
971 node * sig_i, * sig_j;
982 f =
new vector (
"frequency");
990 if (!
c->getPort ()) {
992 for (
int i = 0;
i <
c->getSize ();
i++) {
993 for (
int j = 0; j <
c->getSize (); j++) {
1010 if ((res_i == ni || res_i == no) && (res_j == ni || res_j == no)) {
1015 ro = (res_i ==
ni) ? 0 : 1;
1016 co = (res_j ==
ni) ? 0 : 1;
1018 noise_c[co + ro * 2] =
c->getN (
i, j);
1019 noise_s[co + ro * 2] =
c->getS (
i, j);
1037 nr_double_t z0,
vector * f) {
1045 c11 *
norm (s21) - 2.0 *
real (c12 * s21 *
conj (s11)) +
1047 n2 = 2.0 * (c22 * s11 - c12 * s21) / (c22 + n1);
1050 Sopt = 1.0 -
norm (n2);
1051 if (
real (Sopt) < 0.0)
1052 Sopt = (1.0 +
sqrt (Sopt)) / n2;
1054 Sopt = (1.0 -
sqrt (Sopt)) / n2;
1057 Fmin =
real (1.0 + (c22 - n1 * norm (Sopt)) /
1058 norm (s21) / (1.0 + norm (Sopt)));
1061 Rn =
real ((c11 - 2.0 *
real (c12 *
conj ((1.0 + s11) / s21)) +
1062 c22 * norm ((1.0 + s11) / s21)) / 4.0);
1080 char * text = (
char *) malloc (strlen (c) + strlen (n) + 2);
1081 sprintf (text,
"%s.%s", c, n);
1093 c->saveCharacteristics (freq);
1094 if (
c->getSubcircuit () && !(saveCVs &
SAVE_ALL))
continue;
1095 c->calcCharacteristics (freq);