コード例 #1
0
ファイル: Potentiometer.cs プロジェクト: vrosnet/SharpCircuit
 public override void stamp(Circuit sim)
 {
     resistance1 = maxResistance * position;
     resistance2 = maxResistance * (1 - position);
     sim.stampResistor(lead_node[0], lead_node[2], resistance1);
     sim.stampResistor(lead_node[2], lead_node[1], resistance2);
 }
コード例 #2
0
ファイル: TransLineElm.cs プロジェクト: vrosnet/SharpCircuit
 public override void stamp(Circuit sim)
 {
     sim.stampVoltageSource(lead_node[4], lead_node[0], voltSource1);
     sim.stampVoltageSource(lead_node[5], lead_node[1], voltSource2);
     sim.stampResistor(lead_node[2], lead_node[4], impedance);
     sim.stampResistor(lead_node[3], lead_node[5], impedance);
 }
コード例 #3
0
 public override void stamp(Circuit sim)
 {
     // stamp voltage divider to put ctl pin at 2/3 V
     sim.stampResistor(lead_node[N_VIN], lead_node[N_CTL], 5000);
     sim.stampResistor(lead_node[N_CTL], 0, 10000);
     // output pin
     sim.stampVoltageSource(0, lead_node[N_OUT], pins[N_OUT].voltSource);
     // discharge pin
     sim.stampNonLinear(lead_node[N_DIS]);
 }
コード例 #4
0
 public override void step(Circuit sim)
 {
     open       = (lead_volt[2] < 2.5);
     resistance = (open) ? r_off : r_on;
     sim.stampResistor(lead_node[3], lead_node[1], resistance);
     sim.updateVoltageSource(0, lead_node[3], voltSource, lead_volt[0] > 2.5 ? 5 : 0);
 }
コード例 #5
0
 public override void stamp(Circuit sim)
 {
     if (needsPullDown)
     {
         sim.stampResistor(lead_node[0], 0, 1E6);
     }
 }
コード例 #6
0
 public override void stamp(Circuit sim)
 {
     if (position == 0)
     {
         sim.stampResistor(lead_node[0], lead_node[1], _resistance);
     }
     //sim.stampVoltageSource(lead_node[0], lead_node[1], voltSource, 0);
 }
コード例 #7
0
ファイル: AnalogSwitch2.cs プロジェクト: vrosnet/SharpCircuit
 public override void step(Circuit sim)
 {
     open = (lead_volt[3] < 2.5);
     if (invert)
     {
         open = !open;
     }
     if (open)
     {
         sim.stampResistor(lead_node[0], lead_node[2], r_on);
         sim.stampResistor(lead_node[0], lead_node[1], r_off);
     }
     else
     {
         sim.stampResistor(lead_node[0], lead_node[1], r_on);
         sim.stampResistor(lead_node[0], lead_node[2], r_off);
     }
 }
コード例 #8
0
 public override void stamp(Circuit sim)
 {
     sim.stampNonLinear(lead_node[anode]);
     sim.stampNonLinear(lead_node[cnode]);
     sim.stampNonLinear(lead_node[gnode]);
     sim.stampNonLinear(lead_node[inode]);
     sim.stampResistor(lead_node[gnode], lead_node[cnode], cresistance);
     diode.stamp(sim, lead_node[inode], lead_node[gnode]);
 }
コード例 #9
0
ファイル: AnalogSwitch.cs プロジェクト: vrosnet/SharpCircuit
 public override void step(Circuit sim)
 {
     open = (lead_volt[2] < 2.5);
     if (invert)
     {
         open = !open;
     }
     resistance = (open) ? r_off : r_on;
     sim.stampResistor(lead_node[0], lead_node[1], resistance);
 }
コード例 #10
0
		public override void stamp(Circuit sim) {
			// output pin
			sim.stampVoltageSource(0, lead_node[1], pins[1].voltSource);
			// attach Vi to R1 pin so its current is proportional to Vi
			sim.stampVoltageSource(lead_node[0], lead_node[4], pins[4].voltSource, 0);
			// attach 5V to R2 pin so we get a current going
			sim.stampVoltageSource(0, lead_node[5], pins[5].voltSource, 5);
			// put resistor across cap pins to give current somewhere to go
			// in case cap is not connected
			sim.stampResistor(lead_node[2], lead_node[3], cResistance);
			sim.stampNonLinear(lead_node[2]);
			sim.stampNonLinear(lead_node[3]);
		}
コード例 #11
0
 public override void step(Circuit sim)
 {
     // if output is low, discharge pin 0. we use a small
     // resistor because it's easier, and sometimes people tie
     // the discharge pin to the trigger and threshold pins.
     // We check setOut to properly emulate the case where
     // trigger is low and threshold is high.
     if (!@out && !setOut)
     {
         sim.stampResistor(lead_node[N_DIS], 0, 10);
     }
     // output
     sim.updateVoltageSource(0, lead_node[N_OUT], pins[N_OUT].voltSource, @out ? lead_volt[N_VIN] : 0);
 }
コード例 #12
0
ファイル: InductorElm.cs プロジェクト: vrosnet/SharpCircuit
 public override void stamp(Circuit sim)
 {
     nodes[0] = lead_node[0];
     nodes[1] = lead_node[1];
     if (isTrapezoidal)
     {
         compResistance = 2 * inductance / sim.timeStep;
     }
     else
     {
         compResistance = inductance / sim.timeStep;                 // backward euler
     }
     sim.stampResistor(nodes[0], nodes[1], compResistance);
     sim.stampRightSide(nodes[0]);
     sim.stampRightSide(nodes[1]);
 }
コード例 #13
0
        public override void step(Circuit sim)
        {
            double vac = lead_volt[anode] - lead_volt[cnode];             // typically negative
            double vag = lead_volt[anode] - lead_volt[gnode];             // typically positive

            if (Math.Abs(vac - lastvac) > 0.01 || Math.Abs(vag - lastvag) > .01)
            {
                sim.converged = false;
            }
            lastvac = vac;
            lastvag = vag;
            diode.doStep(sim, lead_volt[inode] - lead_volt[gnode]);
            double icmult = 1 / triggerI;
            double iamult = 1 / holdingI - icmult;

            aresistance = (-icmult * ic + ia * iamult > 1) ? 0.0105 : 10E5;
            sim.stampResistor(lead_node[anode], lead_node[inode], aresistance);
        }
コード例 #14
0
ファイル: CapacitorElm.cs プロジェクト: vrosnet/SharpCircuit
 public override void stamp(Circuit sim)
 {
     // Capacitor companion model using trapezoidal approximation
     // (Norton equivalent) consists of a current source in
     // parallel with a resistor. Trapezoidal is more accurate
     // than backward euler but can cause oscillatory behavior
     // if RC is small relative to the timestep.
     if (isTrapezoidal)
     {
         compResistance = sim.timeStep / (2 * capacitance);
     }
     else
     {
         compResistance = sim.timeStep / capacitance;
     }
     sim.stampResistor(lead_node[0], lead_node[1], compResistance);
     sim.stampRightSide(lead_node[0]);
     sim.stampRightSide(lead_node[1]);
 }
コード例 #15
0
ファイル: Inductor.cs プロジェクト: vrosnet/SharpCircuit
 public void stamp(Circuit sim, double deltaTime, int n0, int n1)
 {
     // inductor companion model using trapezoidal or backward euler
     // approximations (Norton equivalent) consists of a current
     // source in parallel with a resistor. Trapezoidal is more
     // accurate than backward euler but can cause oscillatory behavior.
     // The oscillation is a real problem in circuits with switches.
     nodes[0] = n0;
     nodes[1] = n1;
     if (isTrapezoidal)
     {
         compResistance = 2 * inductance / deltaTime;
     }
     else
     {
         compResistance = inductance / deltaTime;                 // backward euler
     }
     sim.stampResistor(nodes[0], nodes[1], compResistance);
     sim.stampRightSide(nodes[0]);
     sim.stampRightSide(nodes[1]);
 }
コード例 #16
0
ファイル: Triode.cs プロジェクト: vrosnet/SharpCircuit
        /*public override double getPower() {
         *      return (lead_volt[0] - lead_volt[2]) * current;
         * }*/

        public override void step(Circuit sim)
        {
            double[] vs = new double[3];
            vs[0] = lead_volt[0];
            vs[1] = lead_volt[1];
            vs[2] = lead_volt[2];
            if (vs[1] > lastv1 + 0.5)
            {
                vs[1] = lastv1 + 0.5;
            }
            if (vs[1] < lastv1 - 0.5)
            {
                vs[1] = lastv1 - 0.5;
            }
            if (vs[2] > lastv2 + 0.5)
            {
                vs[2] = lastv2 + 0.5;
            }
            if (vs[2] < lastv2 - 0.5)
            {
                vs[2] = lastv2 - 0.5;
            }
            int    grid  = 1;
            int    cath  = 2;
            int    plate = 0;
            double vgk   = vs[grid] - vs[cath];
            double vpk   = vs[plate] - vs[cath];

            if (Math.Abs(lastv0 - vs[0]) > 0.01 || Math.Abs(lastv1 - vs[1]) > 0.01 || Math.Abs(lastv2 - vs[2]) > 0.01)
            {
                sim.converged = false;
            }
            lastv0 = vs[0];
            lastv1 = vs[1];
            lastv2 = vs[2];
            double ids  = 0;
            double gm   = 0;
            double Gds  = 0;
            double ival = vgk + vpk / mu;

            currentg = 0;
            if (vgk > .01)
            {
                sim.stampResistor(lead_node[grid], lead_node[cath], gridCurrentR);
                currentg = vgk / gridCurrentR;
            }
            if (ival < 0)
            {
                // should be all zero, but that causes a singular matrix,
                // so instead we treat it as a large resistor
                Gds = 1E-8;
                ids = vpk * Gds;
            }
            else
            {
                ids = Math.Pow(ival, 1.5) / kg1;
                double q = 1.5 * Math.Sqrt(ival) / kg1;
                // gm = dids/dgk;
                // Gds = dids/dpk;
                Gds = q;
                gm  = q / mu;
            }
            currentp = ids;
            currentc = ids + currentg;
            double rs = -ids + Gds * vpk + gm * vgk;

            sim.stampMatrix(lead_node[plate], lead_node[plate], Gds);
            sim.stampMatrix(lead_node[plate], lead_node[cath], -Gds - gm);
            sim.stampMatrix(lead_node[plate], lead_node[grid], gm);

            sim.stampMatrix(lead_node[cath], lead_node[plate], -Gds);
            sim.stampMatrix(lead_node[cath], lead_node[cath], Gds + gm);
            sim.stampMatrix(lead_node[cath], lead_node[grid], -gm);

            sim.stampRightSide(lead_node[plate], rs);
            sim.stampRightSide(lead_node[cath], -rs);
        }
コード例 #17
0
ファイル: Resistor.cs プロジェクト: vrosnet/SharpCircuit
 public override void stamp(Circuit sim)
 {
     sim.stampResistor(lead_node[0], lead_node[1], resistance);
 }
コード例 #18
0
ファイル: SparkGap.cs プロジェクト: vrosnet/SharpCircuit
 public override void step(Circuit sim)
 {
     resistance = (state) ? onresistance : offresistance;
     sim.stampResistor(lead_node[0], lead_node[1], resistance);
 }