Skip to content

Commit 93d2e58

Browse files
Generate code for tearing variables and solve loops.
1 parent ae2020a commit 93d2e58

2 files changed

Lines changed: 79 additions & 14 deletions

File tree

src/mmoc/generator/model_instance.cpp

Lines changed: 76 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include <ast/expression.hpp>
2727
#include <deps/builders/eq_graph_builder.hpp>
2828
#include <generator/macros.hpp>
29+
#include <generator/tearing.hpp>
2930
#include <ir/annotation.hpp>
3031
#include <ir/class.hpp>
3132
#include <ir/equation.hpp>
@@ -359,6 +360,10 @@ string ModelInstance::componentDefinition(MODEL_INSTANCE::Component c)
359360
return "void CLC_initializeDataStructs(CLC_simulator simulator)";
360361
case MODEL_INSTANCE::Component::QSS_Init:
361362
return "void QSS_initializeDataStructs(QSS_simulator simulator)";
363+
case MODEL_INSTANCE::Component::Tearing_Variables:
364+
return "void MOD_EvalTearingVars(double *x, double *d, double *a, double *t, double *dx, double *ret)";
365+
case MODEL_INSTANCE::Component::Tearing_Iteration:
366+
return "void MOD_AssignLoop(double *x, double *d, double *a, double *t, double *dx)";
362367
}
363368
return "";
364369
}
@@ -470,7 +475,9 @@ void ModelInstance::generate()
470475
handler();
471476
output();
472477
initialCode();
473-
jacobian();
478+
if (_model.annotations().generateJac()) {
479+
jacobian();
480+
}
474481
// Print generated Model Instance.
475482
_writer->print(WRITER::Include);
476483
_writer->print(componentDefinition(MODEL_INSTANCE::Component::Model_Settings));
@@ -585,7 +592,8 @@ void QSSModelInstance::initializeDataStructures()
585592
{
586593
stringstream buffer;
587594
ModelConfig::instance().setLocalInitSymbols();
588-
const bool PARALLEL = _model.annotations().parallel();
595+
ModelAnnotation annotations = _model.annotations();
596+
const bool PARALLEL = annotations.parallel();
589597
allocateSolver();
590598
allocateVectors();
591599
freeVectors();
@@ -595,8 +603,10 @@ void QSSModelInstance::initializeDataStructures()
595603
initializeMatrix(deps.DS(), WRITER::Alloc_Data, WRITER::Init_Data, _model.stateNbr());
596604
inputs();
597605

598-
// Initialize Jacobian matrices.
599-
initializeMatrix(deps.JAC(), WRITER::Alloc_Data, WRITER::Init_Data, 0);
606+
if (annotations.generateJac()) {
607+
// Initialize Jacobian matrices.
608+
initializeMatrix(deps.JAC(), WRITER::Alloc_Data, WRITER::Init_Data, 0);
609+
}
600610

601611
// Initialize Event Data Structures.
602612
initializeMatrix(deps.SZ(), WRITER::Alloc_Data, WRITER::Init_Data, _model.stateNbr());
@@ -614,7 +624,9 @@ void QSSModelInstance::initializeDataStructures()
614624
}
615625
configEvents();
616626
_writer->write("QSS_allocDataMatrix(modelData);", WRITER::Alloc_Data);
617-
_writer->write("SD_setupJacMatrices(modelData->jac_matrices);", WRITER::Init_Data);
627+
if (annotations.generateJac()) {
628+
_writer->write("SD_setupJacMatrices(modelData->jac_matrices);", WRITER::Init_Data);
629+
}
618630
// Initialize Output Data Structures.
619631
allocateOutput();
620632
initializeMatrix(deps.OS(), WRITER::Alloc_Output, WRITER::Init_Output, _model.outputNbr());
@@ -693,11 +705,43 @@ ClassicModelInstance::ClassicModelInstance(Model &model, CompileFlags &flags, Wr
693705

694706
void ClassicModelInstance::definition()
695707
{
696-
EquationTable derivatives = _model.derivatives();
697-
EquationTable algebraics = _model.algebraics();
708+
auto tearing = Tearing(_model.derivatives(), _model.algebraics());
709+
tearing.detect();
710+
EquationTable derivatives = tearing.derivatives();
711+
EquationTable algebraics = tearing.algebraics();
712+
EquationTable tearing_variables = tearing.variableEquations();
713+
EquationTable tearing_iteration = tearing.iterationEquations();
714+
698715
EquationTable::iterator it;
699716
VarSymbolTable symbols = _model.symbols();
700717
stringstream buffer;
718+
if (tearing.detected()) {
719+
ModelConfig::instance().clearLocalSymbols();
720+
int var_counter = 0;
721+
for (Equation eq = tearing_variables.begin(it); !tearing_variables.end(it); eq = tearing_variables.next(it)) {
722+
_writer->write(eq, WRITER::Tearing_Variables);
723+
buffer << "ret[" << var_counter++ << "] = " << eq.lhs() << ";" << endl;
724+
_writer->write(buffer, WRITER::Tearing_Variables);
725+
}
726+
_writer->write(ModelConfig::instance().localSymbols(), WRITER::Tearing_Variables_Def);
727+
728+
for (Equation eq = tearing_iteration.begin(it); !tearing_iteration.end(it); eq = tearing_iteration.next(it)) {
729+
_writer->write(eq, WRITER::Tearing_Iteration);
730+
}
731+
_writer->write(ModelConfig::instance().localSymbols(), WRITER::Tearing_Iteration_Def);
732+
733+
buffer << endl << "// Fordward declare tearing functions. " << endl;
734+
buffer << componentDefinition(MODEL_INSTANCE::Component::Tearing_Variables) << ";" << endl;
735+
buffer << componentDefinition(MODEL_INSTANCE::Component::Tearing_Iteration) << ";" << endl << endl;
736+
_writer->write(buffer, WRITER::Model_Header);
737+
738+
buffer << endl << "#include <common/solve_loop.h>" << endl;
739+
_writer->write(buffer, WRITER::Include);
740+
741+
buffer << "SVL_SolveLoop(x, d, a, &t, dx, " << tearing_variables.size() << ", MOD_AssignLoop, MOD_EvalTearingVars);" << endl;
742+
_writer->write(buffer, WRITER::Model_Simple);
743+
}
744+
701745
ModelConfig::instance().clearLocalSymbols();
702746
for (Equation alg = algebraics.begin(it); !algebraics.end(it); alg = algebraics.next(it)) {
703747
_writer->write(alg, WRITER::Model_Simple);
@@ -716,16 +760,25 @@ void ClassicModelInstance::initializeDataStructures()
716760
allocateVectors();
717761
freeVectors();
718762
ModelDependencies deps = _model.dependencies();
719-
// Initialize Solver Data Structures.
720-
initializeMatrix(deps.SD(), WRITER::Alloc_Data, WRITER::Init_Data, _model.stateNbr());
721-
initializeMatrix(deps.DS(), WRITER::Alloc_Data, WRITER::Init_Data, _model.stateNbr());
763+
ModelAnnotation annotations = _model.annotations();
764+
765+
if (annotations.generateJac()) {
766+
// Initialize Solver Data Structures.
767+
initializeMatrix(deps.SD(), WRITER::Alloc_Data, WRITER::Init_Data, _model.stateNbr());
768+
initializeMatrix(deps.DS(), WRITER::Alloc_Data, WRITER::Init_Data, _model.stateNbr());
769+
}
722770
configEvents();
723771
inputs();
724-
// Initialize Jacobian matrices.
725-
initializeMatrix(deps.JAC(), WRITER::Alloc_Data, WRITER::Init_Data, _model.stateNbr());
772+
if (annotations.generateJac()) {
773+
// Initialize Jacobian matrices.
774+
initializeMatrix(deps.JAC(), WRITER::Alloc_Data, WRITER::Init_Data, _model.stateNbr());
775+
}
726776

727777
_writer->write("CLC_allocDataMatrix(modelData);", WRITER::Alloc_Data);
728-
_writer->write("SD_setupJacMatrices(modelData->jac_matrices);", WRITER::Init_Data);
778+
779+
if (annotations.generateJac()) {
780+
_writer->write("SD_setupJacMatrices(modelData->jac_matrices);", WRITER::Init_Data);
781+
}
729782

730783
// Initialize Output Data Structures.
731784
allocateOutput();
@@ -769,6 +822,16 @@ void ClassicModelInstance::generate()
769822
definition();
770823
initializeDataStructures();
771824
ModelInstance::generate();
825+
_writer->print(componentDefinition(MODEL_INSTANCE::Component::Tearing_Variables));
826+
_writer->beginBlock();
827+
_writer->print(WRITER::Tearing_Variables_Def);
828+
_writer->print(WRITER::Tearing_Variables);
829+
_writer->endBlock();
830+
_writer->print(componentDefinition(MODEL_INSTANCE::Component::Tearing_Iteration));
831+
_writer->beginBlock();
832+
_writer->print(WRITER::Tearing_Iteration_Def);
833+
_writer->print(WRITER::Tearing_Iteration);
834+
_writer->endBlock();
772835
_writer->print(componentDefinition(MODEL_INSTANCE::Component::CLC_Init));
773836
_writer->beginBlock();
774837
_writer->print(WRITER::Prologue);

src/mmoc/generator/model_instance.hpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,9 @@ enum class Component {
4646
Jacobian,
4747
BdfModel,
4848
CLC_Init,
49-
QSS_Init
49+
QSS_Init,
50+
Tearing_Variables,
51+
Tearing_Iteration
5052
};
5153

5254
enum class NodeType { SD, SZ, HD, HZ, DD };

0 commit comments

Comments
 (0)