Пример #1
0
        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);
            }
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
        }