void tline::initAC (void) { nr_double_t l = getPropertyDouble ("L"); if (l != 0.0) { setVoltageSources (0); allocMatrixMNA (); } else { setVoltageSources (1); allocMatrixMNA (); voltageSource (VSRC_1, NODE_1, NODE_2); } }
void twistedpair::initAC (void) { calcLength (); if (len != 0.0) { setVoltageSources (0); allocMatrixMNA (); } else { setVoltageSources (2); allocMatrixMNA (); voltageSource (VSRC_1, NODE_1, NODE_2); voltageSource (VSRC_2, NODE_3, NODE_4); } }
void opamp::initDC (void) { allocMatrixMNA (); setB (NODE_INP, VSRC_1, 0); setB (NODE_OUT, VSRC_1, 1); setB (NODE_INM, VSRC_1, 0); setC (VSRC_1, NODE_OUT, -1); setD (VSRC_1, VSRC_1, 0); setE (VSRC_1, 0); }
void iac::initAC (void) { nr_double_t a = getPropertyDouble ("I"); nr_double_t p = getPropertyDouble ("Phase"); nr_complex_t i = polar (a, rad (p)); allocMatrixMNA (); setI (NODE_1, +i); setI (NODE_2, -i); }
void vccs::initDC (void) { setISource (false); allocMatrixMNA (); nr_double_t g = getPropertyDouble ("G"); setY (NODE_2, NODE_1, +g); setY (NODE_3, NODE_4, +g); setY (NODE_3, NODE_1, -g); setY (NODE_2, NODE_4, -g); }
void hybrid::initAC (void) { nr_double_t k = 2.0 * M_SQRT2; nr_complex_t p = polar (1.0, rad (getPropertyDouble ("phi"))); nr_complex_t d = 2.0 * p * (p - 4.0) - 1.0; nr_complex_t y; setVoltageSources (0); allocMatrixMNA (); d *= getPropertyDouble ("Zref"); y = (-6.0*p*p + 8.0*p - 1.0) / d; setY (NODE_1, NODE_1, y); setY (NODE_3, NODE_3, y); y = (-2.0*p*p + 8.0*p - 5.0) / d; setY (NODE_2, NODE_2, y); setY (NODE_4, NODE_4, y); y = 2.0*k * (p * (p - 1.0) - 0.5) / d; setY (NODE_1, NODE_3, y); setY (NODE_3, NODE_1, y); y = k * (p - 2.0) / d; setY (NODE_2, NODE_4, y); setY (NODE_4, NODE_2, y); y = k * (-2.0*p + 1.0) / d; setY (NODE_1, NODE_4, y); setY (NODE_4, NODE_1, y); setY (NODE_2, NODE_3, y); setY (NODE_3, NODE_2, y); y = (4.0*p + 4.0) / d; setY (NODE_1, NODE_2, y); setY (NODE_2, NODE_1, y); setY (NODE_3, NODE_4, y); setY (NODE_4, NODE_3, y); }
void strafo::initDC (void) { setVoltageSources (3); allocMatrixMNA (); voltageSource (VSRC_1, NODE_1, NODE_6); voltageSource (VSRC_2, NODE_5, NODE_4); voltageSource (VSRC_3, NODE_2, NODE_3); }
void strafo::initAC (void) { nr_double_t t1 = getPropertyDouble ("T1"); nr_double_t t2 = getPropertyDouble ("T2"); setVoltageSources (2); allocMatrixMNA (); setB (NODE_1, VSRC_1, -1.0); setB (NODE_2, VSRC_1, + t1); setB (NODE_3, VSRC_1, - t1); setB (NODE_4, VSRC_1, +0.0); setB (NODE_5, VSRC_1, +0.0); setB (NODE_6, VSRC_1, +1.0); setB (NODE_1, VSRC_2, +0.0); setB (NODE_2, VSRC_2, + t2); setB (NODE_3, VSRC_2, - t2); setB (NODE_4, VSRC_2, +1.0); setB (NODE_5, VSRC_2, -1.0); setB (NODE_6, VSRC_2, +0.0); setC (VSRC_1, NODE_1, +1.0); setC (VSRC_1, NODE_2, - t1); setC (VSRC_1, NODE_3, + t1); setC (VSRC_1, NODE_4, +0.0); setC (VSRC_1, NODE_5, +0.0); setC (VSRC_1, NODE_6, -1.0); setC (VSRC_2, NODE_1, +0.0); setC (VSRC_2, NODE_2, - t2); setC (VSRC_2, NODE_3, + t2); setC (VSRC_2, NODE_4, -1.0); setC (VSRC_2, NODE_5, +1.0); setC (VSRC_2, NODE_6, +0.0); setD (VSRC_1, VSRC_1, 0); setD (VSRC_2, VSRC_2, 0); setD (VSRC_1, VSRC_2, 0); setD (VSRC_2, VSRC_1, 0); setE (VSRC_1, 0.0); setE (VSRC_2, 0.0); }
void hybrid::initDC (void) { setVoltageSources (2); setInternalVoltageSource (1); allocMatrixMNA (); voltageSource (VSRC_1, NODE_1, NODE_3); voltageSource (VSRC_2, NODE_2, NODE_4); }
void msmbend::initDC (void) { // a DC short (voltage source V = 0 volts) setVoltageSources (1); setInternalVoltageSource (1); allocMatrixMNA (); clearY (); voltageSource (VSRC_1, NODE_1, NODE_2); }
void pac::initHB (void) { setVoltageSources (1); allocMatrixMNA (); voltageSource (VSRC_1, NODE_1, NODE_2); nr_double_t g = 1.0 / getPropertyDouble ("Z"); setY (NODE_1, NODE_1, +g); setY (NODE_2, NODE_2, +g); setY (NODE_1, NODE_2, -g); setY (NODE_2, NODE_1, -g); }
void biastee::initAC (void) { setISource (false); setVoltageSources (1); allocMatrixMNA (); clearB (); clearC (); voltageSource (VSRC_1, NODE_2, NODE_1); }
// Initialize constant MNA entries for DC analysis. void digital::initDC (void) { initDigital (); allocMatrixMNA (); delay = false; setB (NODE_OUT, VSRC_1, +1); setC (VSRC_1, NODE_OUT, -1); setE (VSRC_1, 0); }
// Initialize computation of MNA matrix entries for HB. void resistor::initHB (void) { initModel (); nr_double_t r = getScaledProperty ("R"); setVoltageSources (1); setInternalVoltageSource (1); allocMatrixMNA (); voltageSource (VSRC_1, NODE_1, NODE_2); setD (VSRC_1, VSRC_1, -r); }
void tline::initTR (void) { nr_double_t l = getPropertyDouble ("L"); nr_double_t z = getPropertyDouble ("Z"); deleteHistory (); if (l > 0.0) { setVoltageSources (2); allocMatrixMNA (); setHistory (true); initHistory (l / C0); setB (NODE_1, VSRC_1, +1); setB (NODE_2, VSRC_2, +1); setC (VSRC_1, NODE_1, +1); setC (VSRC_2, NODE_2, +1); setD (VSRC_1, VSRC_1, -z); setD (VSRC_2, VSRC_2, -z); } else { setVoltageSources (1); allocMatrixMNA (); voltageSource (VSRC_1, NODE_1, NODE_2); } }
void mscross::initDC (void) { initModel (); setVoltageSources (5); allocMatrixMNA (); voltageSource (VSRC_1, NODE_1, NODE_5); voltageSource (VSRC_2, NODE_3, NODE_5); voltageSource (VSRC_3, NODE_2, NODE_6); voltageSource (VSRC_4, NODE_4, NODE_6); voltageSource (VSRC_5, NODE_5, NODE_6); }
void digisource::initDC (void) { char * init = getPropertyString ("init"); nr_double_t v = getPropertyDouble ("V"); bool lo = !strcmp (init, "low"); allocMatrixMNA (); setC (VSRC_1, NODE_1, 1.0); setB (NODE_1, VSRC_1, 1.0); setD (VSRC_1, VSRC_1, 0.0); setE (VSRC_1, lo ? 0 : v); }
void vcvs::initDC (void) { nr_double_t g = getPropertyDouble ("G"); allocMatrixMNA (); setC (VSRC_1, NODE_1, +g); setC (VSRC_1, NODE_2, -1.0); setC (VSRC_1, NODE_3, +1.0); setC (VSRC_1, NODE_4, -g); setB (NODE_1, VSRC_1, +0); setB (NODE_2, VSRC_1, -1.0); setB (NODE_3, VSRC_1, +1.0); setB (NODE_4, VSRC_1, +0); setD (VSRC_1, VSRC_1, 0.0); setE (VSRC_1, 0.0); }
void resistor::initDC (void) { initModel (); nr_double_t r = getScaledProperty ("R"); // for non-zero resistances usual MNA entries if (r != 0.0) { nr_double_t g = 1.0 / r; setVoltageSources (0); allocMatrixMNA (); setY (NODE_1, NODE_1, +g); setY (NODE_2, NODE_2, +g); setY (NODE_1, NODE_2, -g); setY (NODE_2, NODE_1, -g); } // for zero resistances create a zero voltage source else { setVoltageSources (1); setInternalVoltageSource (1); allocMatrixMNA (); voltageSource (VSRC_1, NODE_1, NODE_2); } }
void tline::initDC (void) { nr_double_t z = getPropertyDouble ("Z"); nr_double_t a = getPropertyDouble ("Alpha"); nr_double_t l = getPropertyDouble ("L"); a = log (a) / 2; if (a * l != 0.0) { setVoltageSources (0); allocMatrixMNA (); a = exp (a * l); nr_double_t f = 1 / z / (a - 1); nr_double_t y11 = +f * (a + 1); nr_double_t y21 = -f * 2 * sqrt (a); setY (NODE_1, NODE_1, y11); setY (NODE_2, NODE_2, y11); setY (NODE_1, NODE_2, y21); setY (NODE_2, NODE_1, y21); } else { setVoltageSources (1); allocMatrixMNA (); voltageSource (VSRC_1, NODE_1, NODE_2); } }
void cccs::initDC (void) { setISource (false); allocMatrixMNA (); nr_double_t g = getPropertyDouble ("G"); setC (VSRC_1, NODE_1, +1.0); setC (VSRC_1, NODE_2, +0.0); setC (VSRC_1, NODE_3, +0.0); setC (VSRC_1, NODE_4, -1.0); setB (NODE_1, VSRC_1, +1/g); setB (NODE_2, VSRC_1, +1.0); setB (NODE_3, VSRC_1, -1.0); setB (NODE_4, VSRC_1, -1/g); setD (VSRC_1, VSRC_1, 0.0); setE (VSRC_1, 0.0); }
void msvia::initDC (void) { nr_double_t r = calcResistance (); // for non-zero resistances usual MNA entries if (r != 0.0) { nr_double_t g = 1.0 / r; setVoltageSources (0); allocMatrixMNA (); setY (NODE_1, NODE_1, +g); setY (NODE_2, NODE_2, +g); setY (NODE_1, NODE_2, -g); setY (NODE_2, NODE_1, -g); } // for zero resistances create a zero voltage source else { setVoltageSources (1); setInternalVoltageSource (1); allocMatrixMNA (); clearY (); voltageSource (VSRC_1, NODE_1, NODE_2); } }
void cpwstep::initAC (void) { setVoltageSources (2); setInternalVoltageSource (true); allocMatrixMNA (); setB (NODE_1, VSRC_1, +1.0); setB (NODE_1, VSRC_2, +0.0); setB (NODE_2, VSRC_1, +0.0); setB (NODE_2, VSRC_2, +1.0); setC (VSRC_1, NODE_1, -1.0); setC (VSRC_1, NODE_2, +0.0); setC (VSRC_2, NODE_1, +0.0); setC (VSRC_2, NODE_2, -1.0); setE (VSRC_1, +0.0); setE (VSRC_2, +0.0); checkProperties (); }
void coaxline::initDC (void) { nr_double_t l = getPropertyDouble ("L"); nr_double_t d = getPropertyDouble ("d"); nr_double_t rho = getPropertyDouble ("rho"); if (d != 0.0 && rho != 0.0 && l != 0.0) { // a tiny resistance nr_double_t g = M_PI * sqr (d / 2) / rho / l; setVoltageSources (0); allocMatrixMNA (); setY (NODE_1, NODE_1, +g); setY (NODE_2, NODE_2, +g); setY (NODE_1, NODE_2, -g); setY (NODE_2, NODE_1, -g); } else { // a DC short setVoltageSources (1); setInternalVoltageSource (1); allocMatrixMNA (); voltageSource (VSRC_1, NODE_1, NODE_2); } }
void irect::initDC (void) { nr_double_t th = getPropertyDouble ("TH"); nr_double_t tl = getPropertyDouble ("TL"); nr_double_t tr = getPropertyDouble ("Tr"); nr_double_t tf = getPropertyDouble ("Tf"); if (tr > th) tr = th; if (tf > tl) tf = tl; nr_double_t a = (th + (tf - tr) / 2) / (th + tl); nr_double_t i = getPropertyDouble ("I") * a; allocMatrixMNA (); setI (NODE_1, +i); setI (NODE_2, -i); }
/*! DC model initialization. An ideal amplifier is characterized by the following Y-matrix: \f[ \begin{pmatrix} \dfrac{1}{Z_1} & 0 \\ \dfrac{-2}{\sqrt{Z_1\cdot Z_2}} & \dfrac{1}{Z_2} \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::initDC (void) { nr_double_t g = getPropertyDouble ("G"); nr_double_t z1 = getPropertyDouble ("Z1"); nr_double_t z2 = getPropertyDouble ("Z2"); allocMatrixMNA (); setY (NODE_1, NODE_1, 1 / z1); setY (NODE_1, NODE_2, 0); setY (NODE_2, NODE_1, -2 * g / sqrt (z1 * z2)); setY (NODE_2, NODE_2, 1 / z2); }
/*! DC model initialization. *! DC model of a bondwire is a resistance. */ void bondwire::initDC (void) { nr_double_t g; getProperties (); /* for non-zero resistances usual MNA entries */ if (rho != 0.0) { g = 1.0 / resistance (0); setVoltageSources (0); allocMatrixMNA (); setY (NODE_1, NODE_1, +g); setY (NODE_2, NODE_2, +g); setY (NODE_1, NODE_2, -g); setY (NODE_2, NODE_1, -g); } /* for zero resistances create a zero voltage source */ else { setVoltageSources (1); setInternalVoltageSource (1); allocMatrixMNA (); clearY (); voltageSource (VSRC_1, NODE_1, NODE_2); } }
void inductor::initAC (void) { nr_double_t l = getPropertyDouble ("L"); // for non-zero inductance usual MNA entries if (l != 0.0) { setVoltageSources (0); allocMatrixMNA (); } // for zero inductance create a zero voltage source else { initDC (); calcDC (); } }
void isolator::initDC (void) { nr_double_t z1 = getPropertyDouble ("Z1"); nr_double_t z2 = getPropertyDouble ("Z2"); #if AUGMENTED nr_double_t z21 = 2 * sqrt (z1 * z2); setVoltageSources (2); allocMatrixMNA (); setB (NODE_1, VSRC_1, +1.0); setB (NODE_1, VSRC_2, +0.0); setB (NODE_2, VSRC_1, +0.0); setB (NODE_2, VSRC_2, +1.0); setC (VSRC_1, NODE_1, -1.0); setC (VSRC_1, NODE_2, +0.0); setC (VSRC_2, NODE_1, +0.0); setC (VSRC_2, NODE_2, -1.0); setD (VSRC_1, VSRC_1, +z1); setD (VSRC_2, VSRC_2, +z2); setD (VSRC_1, VSRC_2, +0.0); setD (VSRC_2, VSRC_1, +z21); setE (VSRC_1, +0.0); setE (VSRC_2, +0.0); #else setVoltageSources (0); allocMatrixMNA (); setY (NODE_1, NODE_1, 1 / z1); setY (NODE_1, NODE_2, 0); setY (NODE_2, NODE_1, -2 / sqrt (z1 * z2)); setY (NODE_2, NODE_2, 1 / z2); #endif }
void twistedpair::initDC (void) { nr_double_t d = getPropertyDouble ("d"); nr_double_t rho = getPropertyDouble ("rho"); calcLength (); if (d != 0.0 && rho != 0.0 && len != 0.0) { // tiny resistances nr_double_t g1 = M_PI * sqr (d / 2) / rho / len; nr_double_t g2 = g1; setVoltageSources (0); allocMatrixMNA (); setY (NODE_1, NODE_1, +g1); setY (NODE_2, NODE_2, +g1); setY (NODE_1, NODE_2, -g1); setY (NODE_2, NODE_1, -g1); setY (NODE_3, NODE_3, +g2); setY (NODE_4, NODE_4, +g2); setY (NODE_3, NODE_4, -g2); setY (NODE_4, NODE_3, -g2); } else { // DC shorts setVoltageSources (2); allocMatrixMNA (); voltageSource (VSRC_1, NODE_1, NODE_2); voltageSource (VSRC_2, NODE_3, NODE_4); } }