コード例 #1
0
        public bool Check(string sourceCode)
        {
            var status = parser.TryParseProgram(sourceCode, out var prog, out var internalerror, out var position);


            if (!status)
            {
                _eventAggregator.PublishOnUIThreadAsync(new UpdateSolverStatusMessage(internalerror, SolverStatus.Error));
            }
            else
            {
                if (prog.ClassDefinitions.Count == 1)
                {
                    var translator      = new ModelTranslatorV1();
                    var printer         = new ModelicaTreePrinter();
                    var pretty          = new ModelicaPrettyPrinter();
                    var instancePrinter = new InstancePrinter();
                    var flattening      = new Flattening();

                    var        astText    = printer.Transform(prog);
                    var        prettyTest = pretty.Transform(prog);
                    DAEProblem model      = null;

                    string prettyflat = "";

                    try
                    {
                        var flatModel = flattening.Transform(prog.ClassDefinitions.First());
                        prettyflat = instancePrinter.Transform(flatModel);
                        //model = translator.Translate(flatModel);
                    }
                    catch (Exception e)
                    {
                        _eventAggregator.PublishOnUIThreadAsync(new UpdateSolverStatusMessage($"{e.Message}", SolverStatus.Error));
                        return(false);
                    }


                    _eventAggregator.PublishOnUIThreadAsync(new UpdateModelAnalysisMessage()
                    {
                        SyntaxTree = astText, FlattenedModel = prettyflat, CalculationModel = model
                    });
                    _eventAggregator.PublishOnUIThreadAsync(new UpdateSolverStatusMessage("Model OK", SolverStatus.OK));
                }
                else
                {
                    throw new InvalidOperationException("Multiple class definitions detected. Flattening can only resolve one class.");
                }
            }

            return(status);
        }
コード例 #2
0
        static void Parse(string input)
        {
            var parser  = new ModelicaParser();
            var printer = new ModelicaTreePrinter();


            var status = parser.TryParseProgram(input, out var prog, out var error, out var position);

            if (status)
            {
                var ast = printer.Transform(prog);
                Console.WriteLine(ast);
            }
            else
            {
                Console.WriteLine(error);
            }
        }
コード例 #3
0
        static void Simulate(string input, double step, double end)
        {
            var parser     = new ModelicaParser();
            var printer    = new ModelicaTreePrinter();
            var translator = new ModelTranslatorV1();

            var status = parser.TryParseProgram(input, out var prog, out var error, out var position);

            if (status)
            {
                var ast = printer.Transform(prog);
                Console.WriteLine(ast);
                var logger = new ColoredConsoleLogger();
                var model  = translator.Translate(prog.ClassDefinitions.Last());

                var integrator = new ImplicitEuler();
                integrator.Discretize(model);
                integrator.StepSize = step;
                integrator.EndTime  = end;
                model.Initialize(new NoLogger());

                Stopwatch w = new Stopwatch();
                w.Start();
                var results = integrator.Integrate(model, logger);
                w.Stop();
                Console.WriteLine("Integration took " + w.ElapsedMilliseconds + "ms");

                using (var sw = new StreamWriter(Environment.CurrentDirectory + "\\results.csv"))
                {
                    sw.WriteLine("time;" + string.Join("; ", model.AlgebraicVariables.Select(v => v.Name)));

                    foreach (var result in results)
                    {
                        sw.WriteLine(result.ToString());
                    }
                }
            }
            else
            {
                Console.WriteLine(error);
            }
        }
コード例 #4
0
        static void LotkaVolterraParsed()
        {
            string input =
                @"class LotkaVolterra
                    Real N1 = 10;
                    Real N2 = 5;
                    parameter Real e1 = 0.09;
                    parameter Real g1 = 0.01;
                    parameter Real e2 = 0.04;
                    parameter Real g2 = 0.01;
                    equation
                        der(N1) = N1*(e1-g1*N2);
                        der(N2) = -N2*(e2-g2*N1);                        
                 end LotkaVolterra;
                 ";

            var parser = new ModelicaParser();



            var printer    = new ModelicaTreePrinter();
            var translator = new ModelTranslatorV1();

            var status = parser.TryParseProgram(input, out var prog, out var error, out var position);

            if (status)
            {
                var ast = printer.Transform(prog);
                // Console.WriteLine(ast);
                var logger = new NoLogger();
                var model  = translator.Translate(prog.ClassDefinitions.Last());

                var integrator = new ExplicitEuler();
                integrator.Discretize(model);
                integrator.StepSize = 1;
                integrator.EndTime  = 800;
                model.Initialize(new NoLogger());

                Stopwatch w = new Stopwatch();
                w.Start();
                var results = integrator.Integrate(model, logger);
                w.Stop();
                Console.WriteLine("Integration took " + w.ElapsedMilliseconds + "ms");

                using (var sw = new StreamWriter(Environment.CurrentDirectory + "\\results.csv"))
                {
                    sw.WriteLine("time;" + string.Join("; ", model.AlgebraicVariables.Select(v => v.Name)));

                    foreach (var result in results)
                    {
                        sw.WriteLine(result.ToString());
                        // Console.WriteLine(result.ToString());
                    }
                }
            }
            else
            {
                Console.WriteLine(error);
            }
            //}
            //catch (Exception e)
            //{
            //    Console.WriteLine(e.Message);
            //}
        }