void TakeStep(DAEProblem problem, double dt) { problem.TimeStep.SetValue(dt); problem.Time.AddDelta(dt); problem.Step(Solver); foreach (var dery in problem.DifferentialVariables) { var cury = problem.Mapping[dery]; var yt_1 = PreMap[cury]; var yt_2 = PreMap[yt_1]; yt_2.SetValue(yt_1.InternalValue); yt_1.SetValue(cury.InternalValue); } }
public List <TimeStep> Integrate(DAEProblem problem, ILogger logger) { var results = new List <TimeStep>(); TotalSteps = (int)((EndTime - StartTime) / StepSize); problem.Time.SetValue(StartTime); problem.TimeStep.SetValue(StepSize); if (UseDulmageMendelsohnSolver) { Solver = new DecompositionSolver(logger); } else { Solver = new BasicNewtonSolver(logger); } var x = problem.AlgebraicVariables.Select(v => v.InternalValue).ToArray(); var y = problem.DifferentialVariables.Select(v => v.InternalValue).ToArray(); var currentStep = new TimeStep() { Time = StartTime, AlgebraicStates = x, DifferentialStates = y }; results.Add(currentStep); var reportingInveral = TotalSteps / 100; for (int i = 0; i < TotalSteps; i++) { problem.Time.AddDelta(StepSize); problem.Step(Solver); foreach (var dery in problem.DifferentialVariables) { var cury = problem.Mapping[dery]; var yt_1 = PreMap[cury]; var yt_2 = PreMap[yt_1]; yt_2.SetValue(yt_1.InternalValue); yt_1.SetValue(cury.InternalValue); } x = problem.AlgebraicVariables.Select(v => v.InternalValue).ToArray(); y = problem.DifferentialVariables.Select(v => v.InternalValue).ToArray(); currentStep = new TimeStep() { Time = problem.Time.InternalValue, AlgebraicStates = x, DifferentialStates = y }; results.Add(currentStep); logger.Log(currentStep.ToString()); if (i % reportingInveral == 0) { OnIteration?.Invoke(problem.Time.InternalValue / EndTime); } //System.Threading.Thread.Sleep(2); } return(results); }
public List <TimeStep> Integrate(DAEProblem problem, ILogger logger) { var results = new List <TimeStep>(); int numSteps = (int)((EndTime - StartTime) / StepSize); double time = StartTime; problem.Time.SetValue(StartTime); problem.TimeStep.SetValue(StepSize); if (UseDulmageMendelsohnSolver) { Solver = new DecompositionSolver(logger); } else { Solver = new BasicNewtonSolver(logger); } var x = problem.AlgebraicVariables.Select(v => v.InternalValue).ToArray(); var y = problem.DifferentialVariables.Select(v => v.InternalValue).ToArray(); var currentStep = new TimeStep() { Time = time, AlgebraicStates = x, DifferentialStates = y }; results.Add(currentStep); for (int i = 0; i < numSteps; i++) { problem.Step(Solver); foreach (var dery in problem.DifferentialVariables) { var cury = problem.Mapping[dery]; cury.AddDelta(dery.InternalValue); } time += StepSize; problem.Time.AddDelta(StepSize); x = problem.AlgebraicVariables.Select(v => v.InternalValue).ToArray(); y = problem.DifferentialVariables.Select(v => v.InternalValue).ToArray(); currentStep = new TimeStep() { Time = time, AlgebraicStates = x, DifferentialStates = y }; results.Add(currentStep); logger.Log(currentStep.ToString()); } return(results); }