private void UpdateSimulation(bool Rebuild) { int id = Interlocked.Increment(ref update); new Task(() => { ComputerAlgebra.Expression h = (ComputerAlgebra.Expression) 1 / (stream.SampleRate * Oversample); Circuit.TransientSolution s = Circuit.TransientSolution.Solve(circuit.Analyze(), h, Rebuild ? (ILog)Log : new NullLog()); lock (sync) { if (id > clock) { if (Rebuild) { simulation = new Circuit.Simulation(s) { Log = Log, Input = inputs.Keys, Output = probes.Select(i => i.V).Concat(OutputChannels.Select(i => i.Signal)), Oversample = Oversample, Iterations = Iterations, }; } else { simulation.Solution = s; clock = id; } } } }).Start(scheduler); }
private void RebuildSolution() { lock (sync) { simulation = null; ProgressDialog.RunAsync(this, "Building circuit solution...", () => { try { ComputerAlgebra.Expression h = (ComputerAlgebra.Expression) 1 / (stream.SampleRate * Oversample); Circuit.TransientSolution solution = Circuit.TransientSolution.Solve(circuit.Analyze(), h, Log); simulation = new Circuit.Simulation(solution) { Log = Log, Input = inputs.Keys, Output = probes.Select(i => i.V).Concat(OutputChannels.Select(i => i.Signal)), Oversample = Oversample, Iterations = Iterations, }; } catch (Exception Ex) { Log.WriteException(Ex); } }); } }