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
694706void 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);
0 commit comments