예제 #1
0
        public List <double> SimulateFor(LargeSignalCircuitModel model, double time, double timestep)
        {
            var voltages = new List <double>();

            Output.WriteLine("Voltages:");
            Output.WriteLine(
                $"Time      |{string.Join("|", Enumerable.Range(0, model.NodeCount).Select(c => c.ToString().PadLeft(10)))}");
            var elapsed = 0.0;

            model.EstablishDcBias();
            while (true)
            {
                Output.WriteLine(
                    $"{elapsed,10:G4}|{string.Join("|", model.NodeVoltages.Select(c => c.ToString("F").PadLeft(10)))}");
                voltages.Add(model.NodeVoltages[1]);

                if (elapsed > time)
                {
                    break;
                }

                model.AdvanceInTime(timestep);
                elapsed += timestep;
            }

            return(voltages);
        }
예제 #2
0
        protected new void Parse(string netlist)
        {
            Result = base.Parse(netlist);

            Assert.Empty(Result.Errors);

            Model = Result.CircuitDefinition.GetLargeSignalModel();
        }
예제 #3
0
 protected void PrintStatistics(LargeSignalCircuitModel model, SpiceNetlistParserResult result)
 {
     Output.WriteLine($"Iterations: {model.LastNonLinearIterationCount}");
     for (var i = 0; i < result.NodeNames.Count; i++)
     {
         Output.WriteLine($"V({result.NodeNames[i]}) = {model.NodeVoltages[i]}");
     }
 }
예제 #4
0
        private static void PrintStats(LargeSignalCircuitModel model, double time, params double[] vals)
        {
            //            Console.WriteLine($"{(time * 1e6),+20:#0.## 'us'}|{string.Join("|", model.NodeVoltages.Select(v => $"{v,20:G10}"))}|{-val,20:G10}");
//            Console.WriteLine($"{time} {-val}");
            Console.WriteLine(
                $"{time} {model.NodeVoltages[2]} {model.NodeVoltages[2] - model.NodeVoltages[3]} {string.Join(" ", vals.Select(v => v.ToString(CultureInfo.InvariantCulture)))}");
//            Console.WriteLine(model.IterationCount);
//            Console.WriteLine($"{model.NodeVoltages[1]} {-val}");
        }
 public static void PrintCircuitStats(this ITestOutputHelper output, LargeSignalCircuitModel model)
 {
     output.WriteLine($"Iterations: {model.LastNonLinearIterationCount}");
     output.WriteLine($"Iterations total: {model.TotalNonLinearIterationCount}");
     output.WriteLine("Voltages:");
     for (var id = 0; id < model.NodeVoltages.Length; id++)
     {
         output.WriteLine($"[{id}]:\t{model.NodeVoltages[id]}");
     }
     output.WriteLine("");
 }
예제 #6
0
        private void PrintValues(LargeSignalCircuitModel model, List <PrintStatement <LargeSignalCircuitModel> > printers,
                                 TextWriter output)
        {
            output.Write(model.CurrentTimePoint);
            foreach (var printer in printers)
            {
                output.Write(" ");
                printer.PrintValue(output);
            }

            output.WriteLine();
        }
예제 #7
0
        private void PrintHeader(LargeSignalCircuitModel model, List <PrintStatement <LargeSignalCircuitModel> > printers,
                                 TextWriter output)
        {
            output.Write("Time");
            foreach (var printer in printers)
            {
                output.Write(" ");
                output.Write(printer.Header);
            }

            output.WriteLine();
        }
예제 #8
0
        private void GetPrintersForAll(LargeSignalCircuitModel model,
                                       List <PrintStatement <LargeSignalCircuitModel> > printers)
        {
            // get printers for all nodes and two terminal devices

            for (var i = 1; i < model.NodeCount; i++)             // no need to print ground voltage
            {
                printers.Add(new NodeVoltagePrintStatement(nodeNames[i], i));
            }

            foreach (var device in model.Devices)
            {
                printers.AddRange(device.GetDeviceStateProviders()
                                  .Select(pr => new DevicePrintStatement(pr.Name, device.DefinitionDevice.Tag as string, new Token())));
            }
        }
예제 #9
0
        private static void SimulateAndPrint(LargeSignalCircuitModel model, double time, double step)
        {
            var elapsed = 0.0;

            //model.EstablishDcBias();
            //            Console.WriteLine("Voltages:");
            //            Console.WriteLine($"Time                |{string.Join("|", Enumerable.Range(0, model.NodeCount).Select(i => $"{i,20}"))}|Il");
            //            Console.WriteLine("-------------------------------------------------------------------------------------------------");
            var voltageSource = model.Devices.OfType <LargeSignalVoltageSource>()
                                .Single(d => d.DefinitionDevice.Tag as string == "VS");
            var device = model.Devices.OfType <LargeSignalDiode>().Single(d => d.DefinitionDevice.Tag as string == "D1");

//            var device2 = model.Devices.OfType<LargeSignalDiodeModel>().Single(d => d.Name == "D2");
//            var device = model.Devices.OfType<LargeSignalCapacitorModel>().Single();

            //            PrintStats(model, elapsed, device.Current);
            while (elapsed < time)
            {
                model.AdvanceInTime(step);
                elapsed += step;
                PrintStats(model, elapsed, voltageSource.Voltage, device.Current);
                //                PrintStats(model, elapsed, device.Voltage);
            }
        }
예제 #10
0
        private void LoadCircuit()
        {
            var result = SpiceNetlistParser.WithDefaults().Parse(new StreamReader(path + simulation.circuit + suffix));

            model = result.CircuitDefinition.GetLargeSignalModel();
        }