/// <summary> /// Generate a capacitor /// </summary> /// <param name="name">Name</param> /// <param name="parameters">Parameters</param> /// <param name="netlist">Netlist</param> /// <returns></returns> protected ICircuitObject GenerateCap(CircuitIdentifier name, List <Token> parameters, Netlist netlist) { Capacitor cap = new Capacitor(name); cap.ReadNodes(netlist.Path, parameters); // Search for a parameter IC, which is common for both types of capacitors for (int i = 3; i < parameters.Count; i++) { if (parameters[i].kind == ASSIGNMENT) { AssignmentToken at = parameters[i] as AssignmentToken; if (at.Name.image.ToLower() == "ic") { double ic = netlist.ParseDouble(at.Value); cap.CAPinitCond.Set(ic); parameters.RemoveAt(i); break; } } } // The rest is just dependent on the number of parameters if (parameters.Count == 3) { cap.CAPcapac.Set(netlist.ParseDouble(parameters[2])); } else { cap.SetModel(netlist.FindModel <CapacitorModel>(parameters[2])); switch (parameters[2].kind) { case WORD: case IDENTIFIER: cap.SetModel(netlist.Path.FindModel <CapacitorModel>(netlist.Circuit.Objects, new CircuitIdentifier(parameters[2].image))); break; default: throw new ParseException(parameters[2], "Model name expected"); } netlist.ReadParameters(cap, parameters, 2); if (!cap.CAPlength.Given) { throw new ParseException(parameters[1], "L needs to be specified", false); } } return(cap); }
public void When_CapacitorIsTemperatureDependent_Expect_Reference() { /* * A test for a lowpass RC circuit (DC voltage, resistor, capacitor) * The initial voltage on capacitor is 0V. The result should be an exponential converging to dcVoltage. * TC1 and TC2 of capacitor is 0. * Temperature is 30 degrees. */ double dcVoltage = 10; var resistorResistance = 10e3; // 10000; double factor = (1.0 + 3.0 * 1.1 + 3.0 * 3.0 * 2.1); var capacitance = 1e-6; var capacitanceAfterTemperature = capacitance * factor; var tau = resistorResistance * capacitanceAfterTemperature; var capacitor = new Capacitor("C1", "OUT", "0", capacitance); var model = new CapacitorModel("C1"); model.ParameterSets.Get <ModelBaseParameters>().TemperatureCoefficient1.Value = 1.1; model.ParameterSets.Get <ModelBaseParameters>().TemperatureCoefficient2.Value = 2.1; capacitor.SetModel(model); // Build circuit var ckt = new Circuit( capacitor, new Resistor("R1", "IN", "OUT", resistorResistance), new VoltageSource("V1", "IN", "0", dcVoltage)); // Create simulation, exports and references var tran = new Transient("tran", 1e-8, 10e-6); tran.Configurations.Get <TimeConfiguration>().InitialConditions["OUT"] = 0.0; tran.BeforeTemperature += (sender, args) => { ((BaseSimulationState)args.State).Temperature = Circuit.CelsiusKelvin + 30.0; }; Export <double>[] exports = { new RealPropertyExport(tran, "C1", "v") }; Func <double, double>[] references = { t => dcVoltage * (1.0 - Math.Exp(-t / tau)) }; // Run AnalyzeTransient(tran, ckt, exports, references); }