MicroModelicaCCompiler  4.5.3
model_instance.hpp
Go to the documentation of this file.
1 /*****************************************************************************
2 
3  This file is part of QSS Solver.
4 
5  QSS Solver is free software: you can redistribute it and/or modify
6  it under the terms of the GNU General Public License as published by
7  the Free Software Foundation, either version 3 of the License, or
8  (at your option) any later version.
9 
10  QSS Solver is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU General Public License for more details.
14 
15  You should have received a copy of the GNU General Public License
16  along with QSS Solver. If not, see <http://www.gnu.org/licenses/>.
17 
18  ******************************************************************************/
19 
20 #pragma once
21 
22 #include <boost/variant/variant.hpp>
23 #include <sstream>
24 
25 #include <generator/writer.hpp>
26 #include <ir/class.hpp>
27 #include <util/compile_flags.hpp>
28 #include <util/graph.hpp>
29 #include <util/model_config.hpp>
30 #include <util/symbol_table.hpp>
31 #include <util/util_types.hpp>
32 
33 namespace MicroModelica {
34 namespace Generator {
35 
36 namespace MODEL_INSTANCE {
37 
38 enum class Component {
40  Model,
41  Deps,
45  Output,
46  Jacobian,
47  BdfModel,
48  CLC_Init,
49  QSS_Init
50 };
51 
52 enum class NodeType { SD, SZ, HD, HZ, DD };
53 
54 } // namespace MODEL_INSTANCE
55 
56 class ModelInstance {
57  public:
58  ModelInstance();
59  ModelInstance(IR::Model &model, Util::CompileFlags &flags, WriterPtr writer);
60  virtual ~ModelInstance() = default;
61  void include();
62  virtual void initializeDataStructures() = 0;
63  void zeroCrossing();
64  void handler();
65  void settings();
66  void inputs();
67  void output();
68  virtual Graph computationalGraph() { return Graph(0, 0); };
69  void initialCode();
70  virtual void header();
71  virtual void generate();
72  void jacobian();
73 
74  protected:
75  virtual void definition() = 0;
77  void allocateOutput();
78  void configOutput();
79  void configEvents();
80  void allocateVectors() const;
81  void freeVectors() const;
82  std::string allocateModel();
83  void allocateVector(std::string name, int size) const;
84  void freeVector(std::string name, int size) const;
85  template <class DM>
86  void initializeMatrix(DM vdm, WRITER::Section alloc, WRITER::Section init, int size)
87  {
88  _writer->write(vdm.alloc(), alloc);
89  if (!vdm.empty() && size > 0) {
90  std::stringstream buffer;
91  buffer << "cleanVector(" << vdm.accessVector() << ", 0, " << size << ");";
92  _writer->write(buffer.str(), init);
93  }
94  _writer->write(vdm.init(), init);
95  }
96  template <class Builder>
98  {
99  Builder model;
101  IR::FunctionPrinter printer;
102  model.build(eqs);
103  _writer->write(model.simpleDef(), simple);
104  _writer->write(model.genericDef(), generic);
105  _writer->write(Util::ModelConfig::instance().localSymbols(), model_def);
106  if (!_writer->isEmpty(simple)) {
107  _writer->write(printer.beginSwitch(), model_def);
108  _writer->write(printer.endSwitch(), simple);
109  }
110  }
111 
112  private:
116 };
117 
118 class QSSModelInstance : public ModelInstance {
119  public:
121  QSSModelInstance(IR::Model &model, Util::CompileFlags &flags, WriterPtr writer);
122  ~QSSModelInstance() override = default;
123  void initializeDataStructures() override;
124  Graph computationalGraph() override;
125  void generate() override;
126  void header() override;
127 
128  protected:
129  void definition() override;
130  void dependencies();
132 
133  private:
134  void initTime();
135  void allocateSolver();
136  std::string allocateModel();
137 
141 };
142 
143 class ClassicModelInstance : public ModelInstance {
144  public:
146  ~ClassicModelInstance() override = default;
147  void initializeDataStructures() override;
148  void generate() override;
149  void header() override;
150 
151  protected:
152  void definition() override;
153 
154  private:
155  void allocateSolver();
156  std::string allocateModel();
157 
161 };
162 
163 using ModelInstancePtr = std::shared_ptr<ModelInstance>;
164 
165 } // namespace Generator
166 } // namespace MicroModelica
MicroModelica::Generator::ModelInstance::initializeDataStructures
virtual void initializeDataStructures()=0
MicroModelica::Generator::ModelInstance
Definition: model_instance.hpp:90
MicroModelica::Generator::MODEL_INSTANCE::Component
Component
Definition: model_instance.hpp:89
MicroModelica::IR::FunctionPrinter
Definition: helpers.hpp:147
ModelTable< int, Equation >
MicroModelica::Generator::ModelInstance::inputs
void inputs()
Definition: model_instance.cpp:430
MicroModelica::Generator::ModelInstance::output
void output()
Definition: model_instance.cpp:186
MicroModelica::Generator::ModelInstance::allocateModel
std::string allocateModel()
Definition: model_instance.cpp:439
MicroModelica::Generator::MODEL_INSTANCE::Component::QSS_Init
@ QSS_Init
MicroModelica::Generator::MODEL_INSTANCE::Component::Output
@ Output
MicroModelica::Generator::ClassicModelInstance::ClassicModelInstance
ClassicModelInstance(IR::Model &model, Util::CompileFlags &flags, WriterPtr writer)
Definition: model_instance.cpp:725
MicroModelica::Generator::ModelInstance::zeroCrossing
void zeroCrossing()
Definition: model_instance.cpp:191
MicroModelica::Generator::ModelInstance::settings
void settings()
Definition: model_instance.cpp:233
MicroModelica::Generator::QSSModelInstance::QSSModelInstance
QSSModelInstance()
Definition: model_instance.cpp:555
MicroModelica::IR::FunctionPrinter::endSwitch
std::string endSwitch()
Definition: helpers.cpp:217
MicroModelica::Generator::MODEL_INSTANCE::Component::Jacobian
@ Jacobian
MicroModelica::Util::CompileFlags
Definition: compile_flags.hpp:65
symbol_table.hpp
writer.hpp
MicroModelica::Generator::ModelInstance::freeVector
void freeVector(std::string name, int size) const
Definition: model_instance.cpp:458
MicroModelica::Generator::ClassicModelInstance::_flags
Util::CompileFlags _flags
Definition: model_instance.hpp:193
MicroModelica::Generator::ClassicModelInstance::generate
void generate() override
Definition: model_instance.cpp:803
MicroModelica::Generator::MODEL_INSTANCE::NodeType::SD
@ SD
MicroModelica::Generator::MODEL_INSTANCE::NodeType::DD
@ DD
MicroModelica::Generator::QSSModelInstance::_model
IR::Model _model
Definition: model_instance.hpp:172
MicroModelica::Generator::ClassicModelInstance::definition
void definition() override
Definition: model_instance.cpp:730
model_config.hpp
MicroModelica::Generator::MODEL_INSTANCE::Component::Handler_Pos
@ Handler_Pos
MicroModelica::Generator::QSSModelInstance::allocateSolver
void allocateSolver()
Definition: model_instance.cpp:585
MicroModelica::Generator::MODEL_INSTANCE::NodeType::SZ
@ SZ
MicroModelica::Generator::QSSModelInstance::allocateModel
std::string allocateModel()
Definition: model_instance.cpp:602
MicroModelica::Generator::ModelInstance::generate
virtual void generate()
Definition: model_instance.cpp:502
MicroModelica::Generator::MODEL_INSTANCE::NodeType
NodeType
Definition: model_instance.hpp:103
MicroModelica::Generator::QSSModelInstance::~QSSModelInstance
~QSSModelInstance() override=default
MicroModelica::Generator::ClassicModelInstance::_writer
WriterPtr _writer
Definition: model_instance.hpp:194
MicroModelica::Generator::QSSModelInstance::_writer
WriterPtr _writer
Definition: model_instance.hpp:174
MicroModelica::Generator::ModelInstance::_model
IR::Model _model
Definition: model_instance.hpp:147
MicroModelica::Generator::ModelInstance::allocateOutput
void allocateOutput()
Definition: model_instance.cpp:116
util_types.hpp
MicroModelica::Generator::ModelInstance::componentDefinition
std::string componentDefinition(MODEL_INSTANCE::Component c)
Definition: model_instance.cpp:357
MicroModelica::Generator::ModelInstance::_writer
WriterPtr _writer
Definition: model_instance.hpp:149
MicroModelica::Generator::QSSModelInstance::initTime
void initTime()
Definition: model_instance.cpp:612
MicroModelica::Generator::MODEL_INSTANCE::Component::Zero_Crossing
@ Zero_Crossing
MicroModelica::Generator::MODEL_INSTANCE::NodeType::HZ
@ HZ
MicroModelica::Util::ModelConfig::instance
static ModelConfig & instance()
Definition: model_config.hpp:87
MicroModelica::Generator::QSSModelInstance::initializeDataStructures
void initializeDataStructures() override
Definition: model_instance.cpp:620
MicroModelica::Generator::ModelInstance::include
void include()
Definition: model_instance.cpp:90
MicroModelica::Generator::ModelInstance::ModelInstance
ModelInstance()
Definition: model_instance.cpp:86
MicroModelica::Generator::QSSModelInstance::bdfDefinition
void bdfDefinition()
Definition: model_instance.cpp:572
MicroModelica::IR::FunctionPrinter::beginSwitch
std::string beginSwitch()
Definition: helpers.cpp:210
MicroModelica::Generator::ModelInstance::allocateVectors
void allocateVectors() const
Definition: model_instance.cpp:467
compile_flags.hpp
MicroModelica::Generator::ModelInstance::initializeMatrix
void initializeMatrix(DM vdm, WRITER::Section alloc, WRITER::Section init, int size)
Definition: model_instance.hpp:120
MicroModelica::Generator::MODEL_INSTANCE::Component::Handler_Neg
@ Handler_Neg
MicroModelica::Generator::ClassicModelInstance::header
void header() override
Definition: model_instance.cpp:825
graph.hpp
MicroModelica::Generator::ClassicModelInstance::initializeDataStructures
void initializeDataStructures() override
Definition: model_instance.cpp:747
MicroModelica::Generator::ModelInstance::definition
virtual void definition()=0
MicroModelica::Generator::ModelInstance::handler
void handler()
Definition: model_instance.cpp:196
MicroModelica::Generator::ClassicModelInstance
Definition: model_instance.hpp:177
MicroModelica::Generator::QSSModelInstance::computationalGraph
Graph computationalGraph() override
Definition: model_instance.cpp:666
MicroModelica::Generator::ModelInstance::freeVectors
void freeVectors() const
Definition: model_instance.cpp:476
MicroModelica::Generator::MODEL_INSTANCE::Component::Deps
@ Deps
MicroModelica::Generator::QSSModelInstance::header
void header() override
Definition: model_instance.cpp:704
MicroModelica::Generator::ModelInstance::~ModelInstance
virtual ~ModelInstance()=default
MicroModelica
Definition: files.cpp:45
MicroModelica::Generator::ModelInstance::header
virtual void header()
Definition: model_instance.cpp:253
MicroModelica::Generator::ClassicModelInstance::~ClassicModelInstance
~ClassicModelInstance() override=default
MicroModelica::Generator::MODEL_INSTANCE::NodeType::HD
@ HD
MicroModelica::Generator::ClassicModelInstance::allocateModel
std::string allocateModel()
Definition: model_instance.cpp:794
MicroModelica::Generator::MODEL_INSTANCE::Component::CLC_Init
@ CLC_Init
MicroModelica::IR::Model
Definition: class.hpp:160
MicroModelica::Generator::ModelInstance::jacobian
void jacobian()
Definition: model_instance.cpp:485
MicroModelica::Generator::ModelInstance::computationalGraph
virtual Graph computationalGraph()
Definition: model_instance.hpp:102
MicroModelica::Generator::ModelInstance::generateDef
void generateDef(IR::EquationTable eqs, WRITER::Section model_def, WRITER::Section simple, WRITER::Section generic)
Definition: model_instance.hpp:131
MicroModelica::Generator::MODEL_INSTANCE::Component::Model_Settings
@ Model_Settings
MicroModelica::Generator::ClassicModelInstance::allocateSolver
void allocateSolver()
Definition: model_instance.cpp:777
MicroModelica::Generator::ModelInstance::configOutput
void configOutput()
Definition: model_instance.cpp:150
MicroModelica::Generator::MODEL_INSTANCE::Component::BdfModel
@ BdfModel
MicroModelica::Generator::QSSModelInstance::definition
void definition() override
Definition: model_instance.cpp:562
Graph
Definition: graph.hpp:30
MicroModelica::Generator::ModelInstance::initialCode
void initialCode()
Definition: model_instance.cpp:402
MicroModelica::Generator::ModelInstance::configEvents
void configEvents()
Definition: model_instance.cpp:224
MicroModelica::Generator::ModelInstance::allocateVector
void allocateVector(std::string name, int size) const
Definition: model_instance.cpp:449
MicroModelica::Generator::QSSModelInstance::dependencies
void dependencies()
Definition: model_instance.cpp:567
MicroModelica::Generator::QSSModelInstance::generate
void generate() override
Definition: model_instance.cpp:668
MicroModelica::Util::ModelConfig::clearLocalSymbols
void clearLocalSymbols()
Definition: model_config.hpp:136
MicroModelica::Generator::QSSModelInstance::_flags
Util::CompileFlags _flags
Definition: model_instance.hpp:173
MicroModelica::Generator::WriterPtr
std::shared_ptr< Writer > WriterPtr
Definition: writer.hpp:146
MicroModelica::Generator::ClassicModelInstance::_model
IR::Model _model
Definition: model_instance.hpp:192
MicroModelica::Generator::MODEL_INSTANCE::Component::Model
@ Model
class.hpp
MicroModelica::Generator::ModelInstance::_flags
Util::CompileFlags _flags
Definition: model_instance.hpp:148
MicroModelica::Generator::ModelInstancePtr
std::shared_ptr< ModelInstance > ModelInstancePtr
Definition: model_instance.hpp:197
MicroModelica::Generator::WRITER::Section
Section
Definition: writer.hpp:69