Beispiel #1
0
// Setup constant S-parameter entries.
void digital::initSP (void) {
  allocMatrixS ();
  setS (NODE_OUT, NODE_OUT, -1);
  for (i = 0; i < getSize () - 1; i++) {
    setS (NODE_IN1 + i, NODE_IN1 + i, +1);
  }
}
Beispiel #2
0
void pac::calcSP (nr_double_t) {
  nr_double_t z = getPropertyDouble ("Z") / z0;
  setS (NODE_1, NODE_1, z / (z + 2));
  setS (NODE_2, NODE_2, z / (z + 2));
  setS (NODE_1, NODE_2, 2 / (z + 2));
  setS (NODE_2, NODE_1, 2 / (z + 2));
}
void iinoise::initSP (void) {
  allocMatrixS ();
  setS (NODE_I1P, NODE_I1P, 1.0);
  setS (NODE_I1N, NODE_I1N, 1.0);
  setS (NODE_I2P, NODE_I2P, 1.0);
  setS (NODE_I2N, NODE_I2N, 1.0);
}
Beispiel #4
0
void iac::initSP (void) {
  allocMatrixS ();
  setS (NODE_1, NODE_1, 1.0);
  setS (NODE_1, NODE_2, 0.0);
  setS (NODE_2, NODE_1, 0.0);
  setS (NODE_2, NODE_2, 1.0);
}
Beispiel #5
0
/*!\brief Compute S parameters 

  \f$S\f$ parameter are computed from admitance, therefore \f$S\f$
  matrix of a capacitor of capacitance \f$C\f$ is:
  \f[
  S=\begin{pmatrix}
  \frac{1}{1+4j\pi fCZ_0}            & \frac{4j\pi fCZ_0}{1+4j\pi fCZ_0} \\
  \frac{4j\pi fCZ_0}{1+4j\pi fCZ_0}  & \frac{1}{1+4j\pi fCZ_0}
  \end{pmatrix}
  \f]

  \param[in] frequency frequency for S parameters simulation
*/
void capacitor::calcSP (nr_double_t frequency) {
  nr_double_t c = getPropertyDouble ("C") * z0;
  nr_complex_t y = 2.0 * rect (0, 2.0 * M_PI * frequency * c);
  setS (NODE_1, NODE_1, 1.0 / (1.0 + y));
  setS (NODE_2, NODE_2, 1.0 / (1.0 + y));
  setS (NODE_1, NODE_2, y / (1.0 + y));
  setS (NODE_2, NODE_1, y / (1.0 + y));
}
Beispiel #6
0
void inductor::calcSP (nr_double_t frequency) {
  nr_double_t l = getPropertyDouble ("L") / z0;
  nr_complex_t z = rect (0, 2.0 * M_PI * frequency * l);
  setS (NODE_1, NODE_1, z / (z + 2.0));
  setS (NODE_2, NODE_2, z / (z + 2.0));
  setS (NODE_1, NODE_2, 2.0 / (z + 2.0));
  setS (NODE_2, NODE_1, 2.0 / (z + 2.0));
}
Beispiel #7
0
void resistor::calcSP (nr_double_t) {
  // calculate S-parameters
  nr_double_t z = getScaledProperty ("R") / z0;
  setS (NODE_1, NODE_1, z / (z + 2));
  setS (NODE_2, NODE_2, z / (z + 2));
  setS (NODE_1, NODE_2, 2 / (z + 2));
  setS (NODE_2, NODE_1, 2 / (z + 2));
}
void cpwstep::calcSP (nr_double_t frequency) {
  nr_complex_t z = 2.0 / calcY (frequency) / z0;
  nr_complex_t s11 = -1.0 / (z + 1.0);
  nr_complex_t s21 = +z / (z + 1.0);
  setS (NODE_1, NODE_1, s11);
  setS (NODE_2, NODE_2, s11);
  setS (NODE_1, NODE_2, s21);
  setS (NODE_2, NODE_1, s21);
}
Beispiel #9
0
void msvia::calcSP (nr_double_t frequency) {
  // calculate s-parameters
  Z = calcImpedance (frequency);
  nr_complex_t z = Z / z0;
  setS (NODE_1, NODE_1, z / (z + 2.0));
  setS (NODE_2, NODE_2, z / (z + 2.0));
  setS (NODE_1, NODE_2, 2.0 / (z + 2.0));
  setS (NODE_2, NODE_1, 2.0 / (z + 2.0));
}
Beispiel #10
0
void isolator::initSP (void) {
  nr_double_t z1 = getPropertyDouble ("Z1");
  nr_double_t z2 = getPropertyDouble ("Z2");
  nr_double_t s1 = (z1 - z0) / (z1 + z0);
  nr_double_t s2 = (z2 - z0) / (z2 + z0);
  allocMatrixS ();
  setS (NODE_1, NODE_1, s1);
  setS (NODE_2, NODE_2, s2);
  setS (NODE_1, NODE_2, 0);
  setS (NODE_2, NODE_1, sqrt (1 - s1 * s1) * sqrt (1 - s2 * s2));
}
Beispiel #11
0
/*! Initialize S-parameter simulation. 
    An ideal amplifier is characterized by the following 
    S-matrix 
    \f[  
      S=\begin{pmatrix}
         \dfrac{Z_1-Z_0}{Z_1+Z_0} & 0 \\
	  \dfrac{4\cdot Z_0\cdot\sqrt{Z_1\cdot Z_2}\cdot G}{(Z_1+Z_0)\cdot(Z_2+Z_0)}
          & \dfrac{Z_2-Z_0}{Z_2+Z_0}
        \end{pmatrix}
    \f]
    With \f$Z_1\f$ and \f$Z_2\f$ the impedance of the port 1 and 2 and 
    \f$G\f$ the gain.
*/
void amplifier::initSP (void) {
  nr_double_t g = getPropertyDouble ("G");
  nr_double_t z1 = getPropertyDouble ("Z1");
  nr_double_t z2 = getPropertyDouble ("Z2");

  allocMatrixS ();

  setS (NODE_1, NODE_1, (z1 - z0) / (z1 + z0));
  setS (NODE_1, NODE_2, 0);
  setS (NODE_2, NODE_2, (z2 - z0) / (z2 + z0));
  setS (NODE_2, NODE_1, 4 * z0 * sqrt (z1 * z2) * g / (z1 + z0) / (z2 + z0));
}
Beispiel #12
0
void phaseshifter::initSP (void) {
  nr_double_t p = rad (getPropertyDouble ("phi"));
  nr_double_t z = getPropertyDouble ("Zref");
  nr_double_t r = (z0 - z) / (z0 + z);
  nr_complex_t d = 1.0 - polar (r * r, 2 * p);
  nr_complex_t s11 = r * (polar (1.0, 2 * p) - 1.0) / d;
  nr_complex_t s21 = (1.0 - r * r) * polar (1.0, p) / d;
  allocMatrixS ();
  setS (NODE_1, NODE_1, s11);
  setS (NODE_2, NODE_2, s11);
  setS (NODE_1, NODE_2, s21);
  setS (NODE_2, NODE_1, s21);
}
Beispiel #13
0
void tline::calcSP (nr_double_t frequency) {
  nr_double_t l = getPropertyDouble ("L");
  nr_double_t z = getPropertyDouble ("Z");
  nr_double_t a = getPropertyDouble ("Alpha");
  nr_double_t r = (z - z0) / (z + z0);
  nr_double_t b = 2 * M_PI * frequency / C0;
  a = log (a) / 2;
  nr_complex_t p = exp (-l * rect (a, b));
  nr_complex_t s11 = r * (1.0 - p * p) / (1.0 - p * p * r * r);
  nr_complex_t s21 = p * (1.0 - r * r) / (1.0 - p * p * r * r);
  setS (NODE_1, NODE_1, s11); setS (NODE_2, NODE_2, s11);
  setS (NODE_1, NODE_2, s21); setS (NODE_2, NODE_1, s21);
}
void biastee::initSP (void) {
  allocMatrixS ();
  setS (NODE_1, NODE_1, 0.0);
  setS (NODE_1, NODE_2, 1.0);
  setS (NODE_1, NODE_3, 0.0);
  setS (NODE_2, NODE_1, 1.0);
  setS (NODE_2, NODE_2, 0.0);
  setS (NODE_2, NODE_3, 0.0);
  setS (NODE_3, NODE_1, 0.0);
  setS (NODE_3, NODE_2, 0.0);
  setS (NODE_3, NODE_3, 1.0);
}
Beispiel #15
0
void opamp::initSP (void) {
  allocMatrixS ();
  setS (NODE_INP, NODE_INP, 1);
  setS (NODE_INP, NODE_OUT, 0);
  setS (NODE_INP, NODE_INM, 0);
  setS (NODE_INM, NODE_INP, 0);
  setS (NODE_INM, NODE_OUT, 0);
  setS (NODE_INM, NODE_INM, 1);
  setS (NODE_OUT, NODE_INP, +4 * gv);
  setS (NODE_OUT, NODE_OUT, -1);
  setS (NODE_OUT, NODE_INM, -4 * gv);
}
Beispiel #16
0
Entity Block::getBlock()
{
    // set position
    auto pos = new CPosition;
    pos->setX(32);
    pos->setY(32);
    E.addComponent(std::type_index(typeid(CPosition)), pos);

    // set sprite from a spritesheet
    auto spr = new CSprite;
    spr->setSize(32);
    spr->setSprite(this->getSprite(0, 0)); // coordinates in spritesheet
    E.addComponent(std::type_index(typeid(CSprite)), spr);

    // set state (0 = moveable)
    auto sta = new CState;
    sta->setS(0);
    E.addComponent(std::type_index(typeid(CState)), sta);

    // set velocity
    auto vel = new CVelocity;
    vel->setVelX(32);
    vel->setVelY(32);
    E.addComponent(std::type_index(typeid(CVelocity)), vel);

    return E;
}
Beispiel #17
0
// Setup frequency dependent S-parameter entries.
void digital::calcSP (nr_double_t frequency) {
  nr_double_t t = getPropertyDouble ("t");
  for (i = 0; i < getSize () - 1; i++) {
    setS (NODE_OUT, NODE_IN1 + i,
	  4.0 * polar (g[i], - 2.0 * M_PI * frequency * t));
  }
}
Beispiel #18
0
void coaxline::calcSP (nr_double_t frequency) {
  nr_double_t l = getPropertyDouble ("L");

  // calculate propagation constants
  calcPropagation (frequency);

  // calculate S-parameters
  nr_double_t z = zl / z0;
  nr_double_t y = 1 / z;
  nr_complex_t g = rect (alpha, beta);
  nr_complex_t n = 2.0 * cosh (g * l) + (z + y) * sinh (g * l);
  nr_complex_t s11 = (z - y) * sinh (g * l) / n;
  nr_complex_t s21 = 2.0 / n;
  setS (NODE_1, NODE_1, s11); setS (NODE_2, NODE_2, s11);
  setS (NODE_1, NODE_2, s21); setS (NODE_2, NODE_1, s21);
}
Beispiel #19
0
void itrafo::initSP (void) {
  allocMatrixS ();
  nr_double_t z = getPropertyDouble ("Z");
  nr_double_t n = 2 * z0 + z;
  setS (NODE_1, NODE_1,  (2.0 * z0 - z) / n);
  setS (NODE_1, NODE_2,  (2.0 * sqrt (z0 * z)) / n);
  setS (NODE_1, NODE_3, -(2.0 * sqrt (z0 * z)) / n);
  setS (NODE_2, NODE_1,  (2.0 * sqrt (z0 * z)) / n);
  setS (NODE_2, NODE_2,  (z) / n);
  setS (NODE_2, NODE_3,  (2.0 * z0) / n);
  setS (NODE_3, NODE_1, -(2.0 * sqrt (z0 * z)) / n);
  setS (NODE_3, NODE_2,  (2.0 * z0) / n);
  setS (NODE_3, NODE_3,  (z) / n);
}
Beispiel #20
0
void circulator::calcSP (nr_double_t) {
  nr_double_t z1 = getPropertyDouble ("Z1");
  nr_double_t z2 = getPropertyDouble ("Z2");
  nr_double_t z3 = getPropertyDouble ("Z3");
  nr_double_t r1 = (z0 - z1) / (z0 + z1);
  nr_double_t r2 = (z0 - z2) / (z0 + z2);
  nr_double_t r3 = (z0 - z3) / (z0 + z3);
  nr_double_t d  = 1 - r1 * r2 * r3;
  setS (NODE_1, NODE_1, (r2 * r3 - r1) / d);
  setS (NODE_2, NODE_2, (r1 * r3 - r2) / d);
  setS (NODE_3, NODE_3, (r1 * r2 - r3) / d);
  setS (NODE_1, NODE_2, sqrt (z2 / z1) * (z1 + z0) /
	(z2 + z0) * r3 * (1 - r1 * r1) / d);
  setS (NODE_2, NODE_3, sqrt (z3 / z2) * (z2 + z0) /
	(z3 + z0) * r1 * (1 - r2 * r2) / d);
  setS (NODE_3, NODE_1, sqrt (z1 / z3) * (z3 + z0) /
	(z1 + z0) * r2 * (1 - r3 * r3) / d);
  setS (NODE_2, NODE_1, sqrt (z1 / z2) * (z2 + z0) /
	(z1 + z0) * (1 - r2 * r2) / d);
  setS (NODE_1, NODE_3, sqrt (z3 / z1) * (z1 + z0) /
	(z3 + z0) * (1 - r1 * r1) / d);
  setS (NODE_3, NODE_2, sqrt (z2 / z3) * (z3 + z0) /
	(z2 + z0) * (1 - r3 * r3) / d);
}
void tline4p::calcSP (nr_double_t frequency) {
  nr_double_t l = getPropertyDouble ("L");
  nr_double_t z = getPropertyDouble ("Z");
  nr_double_t a = getPropertyDouble ("Alpha");
  nr_double_t b = 2 * M_PI * frequency / C0;
  a = log (a) / 2;

  nr_complex_t g = rect (a, b);
  nr_double_t p = 2 * z0 + z;
  nr_double_t n = 2 * z0 - z;
  nr_complex_t e = exp (2.0 * g * l);
  nr_complex_t d = p * p * e - n * n;

  nr_complex_t s11 = z * (p * e + n) / d;
  nr_complex_t s14 = 1.0 - s11;
  nr_complex_t s12 = 4.0 * z * z0 * exp (g * l) / d;

  setS (NODE_1, NODE_1, +s11); setS (NODE_2, NODE_2, +s11);
  setS (NODE_3, NODE_3, +s11); setS (NODE_4, NODE_4, +s11);
  setS (NODE_1, NODE_4, +s14); setS (NODE_4, NODE_1, +s14);
  setS (NODE_2, NODE_3, +s14); setS (NODE_3, NODE_2, +s14);
  setS (NODE_1, NODE_2, +s12); setS (NODE_2, NODE_1, +s12);
  setS (NODE_3, NODE_4, +s12); setS (NODE_4, NODE_3, +s12);
  setS (NODE_1, NODE_3, -s12); setS (NODE_3, NODE_1, -s12);
  setS (NODE_2, NODE_4, -s12); setS (NODE_4, NODE_2, -s12);
}
Beispiel #22
0
void digisource::initSP (void) {
  allocMatrixS ();
  setS (NODE_1, NODE_1, -1.0);
}
Beispiel #23
0
void vcvs::calcSP (nr_double_t frequency) {

  nr_double_t g = getPropertyDouble ("G");
  nr_double_t t = getPropertyDouble ("T");

  nr_complex_t z1 = polar (g, M_PI - 2.0 * M_PI * frequency * t);
  nr_complex_t z2 = polar (g, - 2.0 * M_PI * frequency * t);

  setS (NODE_1, NODE_1, 1.0); setS (NODE_1, NODE_2, 0.0);
  setS (NODE_1, NODE_3, 0.0); setS (NODE_1, NODE_4, 0.0);
  setS (NODE_2, NODE_1, z2);  setS (NODE_2, NODE_2, 0.0);
  setS (NODE_2, NODE_3, 1.0); setS (NODE_2, NODE_4, z1);
  setS (NODE_3, NODE_1, z1);  setS (NODE_3, NODE_2, 1.0);
  setS (NODE_3, NODE_3, 0.0); setS (NODE_3, NODE_4, z2);
  setS (NODE_4, NODE_1, 0.0); setS (NODE_4, NODE_2, 0.0);
  setS (NODE_4, NODE_3, 0.0); setS (NODE_4, NODE_4, 1.0);
}
void strafo::initSP (void) {

  nr_double_t t1 = getPropertyDouble ("T1");
  nr_double_t t2 = getPropertyDouble ("T2");

  nr_double_t  d = t1 * t1 + t2 * t2 + 1.0;
  nr_double_t z1 = t1 * t1 / d;
  nr_double_t z2 = t2 * t2 / d;
  nr_double_t z3 = 1.0 / d;
  nr_double_t z4 = t1 / d;
  nr_double_t z5 = t2 / d;
  nr_double_t z6 = t1 * t2 / d;

  allocMatrixS ();

  setS (NODE_1, NODE_1,  z1);    setS (NODE_1, NODE_2, z4);
  setS (NODE_1, NODE_3, -z4);    setS (NODE_1, NODE_4, -z6);
  setS (NODE_1, NODE_5, z6);     setS (NODE_1, NODE_6, 1 - z1);
  setS (NODE_2, NODE_1,  z4);    setS (NODE_2, NODE_2, z3);
  setS (NODE_2, NODE_3, 1 - z3); setS (NODE_2, NODE_4, -z5);
  setS (NODE_2, NODE_5, z5);     setS (NODE_2, NODE_6, -z4);
  setS (NODE_3, NODE_1, -z4);    setS (NODE_3, NODE_2, 1 - z3);
  setS (NODE_3, NODE_3, z3);     setS (NODE_3, NODE_4,  z5);
  setS (NODE_3, NODE_5, -z5);    setS (NODE_3, NODE_6, z4);
  setS (NODE_4, NODE_1, -z6);    setS (NODE_4, NODE_2, -z5);
  setS (NODE_4, NODE_3, z5);     setS (NODE_4, NODE_4,  z2);
  setS (NODE_4, NODE_5, 1 - z2); setS (NODE_4, NODE_6, z6);
  setS (NODE_5, NODE_1,  z6);    setS (NODE_5, NODE_2, z5);
  setS (NODE_5, NODE_3, -z5);    setS (NODE_5, NODE_4, 1 - z2);
  setS (NODE_5, NODE_5, z2);     setS (NODE_5, NODE_6, -z6);
  setS (NODE_6, NODE_1, 1 - z1); setS (NODE_6, NODE_2, -z4);
  setS (NODE_6, NODE_3, z4);     setS (NODE_6, NODE_4, z6);
  setS (NODE_6, NODE_5, -z6);    setS (NODE_6, NODE_6, z1);
}
void twistedpair::calcSP (nr_double_t frequency) {
  calcPropagation (frequency);

  nr_complex_t g = rect (alpha, beta);
  nr_double_t p = 2 * z0 + zl;
  nr_double_t n = 2 * z0 - zl;
  nr_complex_t e = exp (2.0 * g * len);
  nr_complex_t d = p * p * e - n * n;

  nr_complex_t s11 = zl * (p * e + n) / d;
  nr_complex_t s14 = 1.0 - s11;
  nr_complex_t s12 = 4.0 * zl * z0 * exp (g * len) / d;

  setS (NODE_1, NODE_1, +s11); setS (NODE_2, NODE_2, +s11);
  setS (NODE_3, NODE_3, +s11); setS (NODE_4, NODE_4, +s11);
  setS (NODE_1, NODE_4, +s14); setS (NODE_4, NODE_1, +s14);
  setS (NODE_2, NODE_3, +s14); setS (NODE_3, NODE_2, +s14);
  setS (NODE_1, NODE_2, +s12); setS (NODE_2, NODE_1, +s12);
  setS (NODE_3, NODE_4, +s12); setS (NODE_4, NODE_3, +s12);
  setS (NODE_1, NODE_3, -s12); setS (NODE_3, NODE_1, -s12);
  setS (NODE_2, NODE_4, -s12); setS (NODE_4, NODE_2, -s12);
}
Beispiel #26
0
void msopen::calcSP (nr_double_t frequency) {
  setS (NODE_1, NODE_1, ztor (1.0 / calcY (frequency)));
}
Beispiel #27
0
void ctline::calcSP (nr_double_t frequency) {
    nr_double_t l   = getPropertyDouble ("L");
    nr_double_t ze  = getPropertyDouble ("Ze");
    nr_double_t zo  = getPropertyDouble ("Zo");
    nr_double_t ere = getPropertyDouble ("Ere");
    nr_double_t ero = getPropertyDouble ("Ero");
    nr_double_t ae  = getPropertyDouble ("Ae");
    nr_double_t ao  = getPropertyDouble ("Ao");
    nr_double_t o   = 2.0 * M_PI * frequency;

    nr_complex_t ge = rect (log (ae) / 2, o / C0 * sqrt (ere)) * l;
    nr_complex_t go = rect (log (ao) / 2, o / C0 * sqrt (ero)) * l;
    nr_complex_t xe = 2.0 * ze * z0 * cosh (ge) + (ze*ze + z0*z0) * sinh (ge);
    nr_complex_t xo = 2.0 * zo * z0 * cosh (go) + (zo*zo + z0*z0) * sinh (go);
    nr_complex_t ye = ze * z0 / xe;
    nr_complex_t yo = zo * z0 / xo;
    xe = (ze*ze - z0*z0) * sinh (ge) / 2.0 / xe;
    xo = (zo*zo - z0*z0) * sinh (go) / 2.0 / xo;

    setS (NODE_1, NODE_1, xe+xo);
    setS (NODE_2, NODE_2, xe+xo);
    setS (NODE_3, NODE_3, xe+xo);
    setS (NODE_4, NODE_4, xe+xo);
    setS (NODE_1, NODE_4, xe-xo);
    setS (NODE_4, NODE_1, xe-xo);
    setS (NODE_2, NODE_3, xe-xo);
    setS (NODE_3, NODE_2, xe-xo);
    setS (NODE_1, NODE_2, ye+yo);
    setS (NODE_2, NODE_1, ye+yo);
    setS (NODE_3, NODE_4, ye+yo);
    setS (NODE_4, NODE_3, ye+yo);
    setS (NODE_1, NODE_3, ye-yo);
    setS (NODE_3, NODE_1, ye-yo);
    setS (NODE_2, NODE_4, ye-yo);
    setS (NODE_4, NODE_2, ye-yo);
}
Beispiel #28
0
void hybrid::initSP (void) {
  nr_complex_t p = polar (1.0, rad (getPropertyDouble ("phi")));
  nr_double_t  k = M_SQRT2;

  allocMatrixS ();
  setS (NODE_1, NODE_1, 0.0); setS (NODE_2, NODE_2, 0.0);
  setS (NODE_3, NODE_3, 0.0); setS (NODE_4, NODE_4, 0.0);

  setS (NODE_1, NODE_2, 0.0); setS (NODE_2, NODE_1, 0.0);
  setS (NODE_3, NODE_4, 0.0); setS (NODE_4, NODE_3, 0.0);

  setS (NODE_1, NODE_3, k); setS (NODE_3, NODE_1, k);
  setS (NODE_1, NODE_4, k); setS (NODE_4, NODE_1, k);
  setS (NODE_2, NODE_3, k); setS (NODE_3, NODE_2, k);

  setS (NODE_2, NODE_4, k * p);
  setS (NODE_4, NODE_2, k * p);
}
void vam::initSP (void) {
  allocMatrixS ();
  setS (NODE_1, NODE_2, 1.0);
  setS (NODE_2, NODE_1, 1.0);
  setS (NODE_3, NODE_3, 1.0);
}
void mutual::calcSP (nr_double_t frequency) {
#if 0
    setMatrixS (ytos (calcMatrixY (frequency)));
#else
    nr_double_t l1 = getPropertyDouble ("L1");
    nr_double_t l2 = getPropertyDouble ("L2");
    nr_double_t k = getPropertyDouble ("k");
    nr_double_t o = 2 * M_PI * frequency;
    nr_double_t a = k * k - 1;
    nr_complex_t d = rect (o * o * l1 * l2 * a / 2 / z0 + 2 * z0, o * (l1 + l2));
    nr_complex_t r;
    r = rect (2 * z0, o * l2) / d;
    setS (NODE_1, NODE_4, r);
    setS (NODE_4, NODE_1, r);
    r = 1.0 - r;
    setS (NODE_1, NODE_1, r);
    setS (NODE_4, NODE_4, r);
    r = rect (2 * z0, o * l1) / d;
    setS (NODE_2, NODE_3, r);
    setS (NODE_3, NODE_2, r);
    r = 1.0 - r;
    setS (NODE_2, NODE_2, r);
    setS (NODE_3, NODE_3, r);
    r = rect (0, o * k * sqrt (l1 * l2)) / d;
    setS (NODE_1, NODE_2, r);
    setS (NODE_2, NODE_1, r);
    setS (NODE_3, NODE_4, r);
    setS (NODE_4, NODE_3, r);
    r = -r;
    setS (NODE_1, NODE_3, r);
    setS (NODE_3, NODE_1, r);
    setS (NODE_2, NODE_4, r);
    setS (NODE_4, NODE_2, r);
#endif
}