/// <summary> /// Accepts the current simulation state as a valid timepoint. /// </summary> protected void Accept() { for (var i = 0; i < _acceptBehaviors.Count; i++) { _acceptBehaviors[i].Accept(this); } Method.Accept(this); TimeSimulationStatistics.Accepted++; }
/// <summary> /// Executes the simulation. /// </summary> /// <exception cref="SpiceSharp.CircuitException">{0}: transient terminated".FormatString(Name)</exception> protected override void Execute() { // First do temperature-dependent calculations and IC base.Execute(); var exportargs = new ExportDataEventArgs(this); var timeConfig = Configurations.Get <TimeConfiguration>(); // Start our statistics Statistics.TransientTime.Start(); var startIters = Statistics.Iterations; var startselapsed = Statistics.SolveTime.Elapsed; try { var newDelta = Math.Min(timeConfig.FinalTime / 50.0, timeConfig.Step) / 10.0; while (true) { // Accept the last evaluated time point for (var i = 0; i < _acceptBehaviors.Count; i++) { _acceptBehaviors[i].Accept(this); } Method.Accept(this); Statistics.Accepted++; // Export the current timepoint if (Method.Time >= timeConfig.InitTime) { OnExport(exportargs); } // Detect the end of the simulation if (Method.Time >= timeConfig.FinalTime) { // Keep our statistics Statistics.TransientTime.Stop(); Statistics.TransientIterations += Statistics.Iterations - startIters; Statistics.TransientSolveTime += Statistics.SolveTime.Elapsed - startselapsed; // Finished! return; } // Continue integration Method.Continue(this, ref newDelta); // Find a valid time point while (true) { // Probe the next time point Method.Probe(this, newDelta); // Try to solve the new point var converged = TimeIterate(timeConfig.TranMaxIterations); Statistics.TimePoints++; // Did we fail to converge to a solution? if (!converged) { Method.NonConvergence(this, out newDelta); Statistics.Rejected++; } else { // If our integration method approves of our solution, continue to the next timepoint if (Method.Evaluate(this, out newDelta)) { break; } Statistics.Rejected++; } } } } catch (CircuitException ex) { // Keep our statistics Statistics.TransientTime.Stop(); Statistics.TransientIterations += Statistics.Iterations - startIters; Statistics.TransientSolveTime += Statistics.SolveTime.Elapsed - startselapsed; throw new CircuitException("{0}: transient terminated".FormatString(Name), ex); } }