@@ -208,7 +208,8 @@ struct AnalyserInternalEquation
208208 bool variableOnRhs (const AnalyserInternalVariablePtr &variable);
209209 bool variableOnLhsOrRhs (const AnalyserInternalVariablePtr &variable);
210210
211- bool check (const AnalyserModelPtr &model, size_t &stateIndex, size_t &variableIndex, bool checkNlaSystems);
211+ bool check (const AnalyserModelPtr &model, size_t &stateIndex, size_t &constantIndex,
212+ size_t &computedConstantIndex, size_t &algebraicIndex, bool checkNlaSystems);
212213};
213214
214215AnalyserInternalEquationPtr AnalyserInternalEquation::create (const ComponentPtr &component)
@@ -321,7 +322,8 @@ bool AnalyserInternalEquation::variableOnLhsOrRhs(const AnalyserInternalVariable
321322}
322323
323324bool AnalyserInternalEquation::check (const AnalyserModelPtr &model,
324- size_t &stateIndex, size_t &variableIndex,
325+ size_t &stateIndex, size_t &constantIndex,
326+ size_t &computedConstantIndex, size_t &algebraicIndex,
325327 bool checkNlaSystems)
326328{
327329 // Nothing to check if the equation has a known type.
@@ -437,7 +439,12 @@ bool AnalyserInternalEquation::check(const AnalyserModelPtr &model,
437439 case AnalyserInternalVariable::Type::ALGEBRAIC:
438440 variable->mIndex = (variable->mType == AnalyserInternalVariable::Type::STATE) ?
439441 ++stateIndex :
440- ++variableIndex;
442+ (variable->mType == AnalyserInternalVariable::Type::CONSTANT) ?
443+ ++constantIndex :
444+ ((variable->mType == AnalyserInternalVariable::Type::COMPUTED_TRUE_CONSTANT)
445+ || (variable->mType == AnalyserInternalVariable::Type::COMPUTED_VARIABLE_BASED_CONSTANT)) ?
446+ ++computedConstantIndex :
447+ ++algebraicIndex;
441448
442449 mUnknownVariables .push_back (variable);
443450
@@ -2748,7 +2755,9 @@ void Analyser::AnalyserImpl::analyseModel(const ModelPtr &model)
27482755 // model valid).
27492756
27502757 auto stateIndex = MAX_SIZE_T;
2751- auto variableIndex = MAX_SIZE_T;
2758+ auto constantIndex = MAX_SIZE_T;
2759+ auto computedConstantIndex = MAX_SIZE_T;
2760+ auto algebraicIndex = MAX_SIZE_T;
27522761 auto loopNumber = 1 ;
27532762 bool relevantCheck;
27542763 auto checkNlaSystems = false ;
@@ -2757,7 +2766,8 @@ void Analyser::AnalyserImpl::analyseModel(const ModelPtr &model)
27572766 relevantCheck = false ;
27582767
27592768 for (const auto &internalEquation : mInternalEquations ) {
2760- relevantCheck = internalEquation->check (mModel , stateIndex, variableIndex, checkNlaSystems)
2769+ relevantCheck = internalEquation->check (mModel , stateIndex, constantIndex, computedConstantIndex,
2770+ algebraicIndex, checkNlaSystems)
27612771 || relevantCheck;
27622772 }
27632773
@@ -2802,7 +2812,7 @@ void Analyser::AnalyserImpl::analyseModel(const ModelPtr &model)
28022812 case AnalyserInternalVariable::Type::INITIALISED:
28032813 // The variable is (still) initialised so it has to be a constant.
28042814
2805- internalVariable->makeConstant (variableIndex );
2815+ internalVariable->makeConstant (constantIndex );
28062816
28072817 break ;
28082818 case AnalyserInternalVariable::Type::OVERCONSTRAINED:
@@ -3058,7 +3068,9 @@ void Analyser::AnalyserImpl::analyseModel(const ModelPtr &model)
30583068 std::map<VariablePtr, AnalyserVariablePtr> v2avMappings;
30593069
30603070 stateIndex = MAX_SIZE_T;
3061- variableIndex = MAX_SIZE_T;
3071+ constantIndex = MAX_SIZE_T;
3072+ computedConstantIndex = MAX_SIZE_T;
3073+ algebraicIndex = MAX_SIZE_T;
30623074
30633075 for (const auto &internalVariable : mInternalVariables ) {
30643076 // Determine the type of the variable.
@@ -3108,7 +3120,11 @@ void Analyser::AnalyserImpl::analyseModel(const ModelPtr &model)
31083120 variable->mPimpl ->populate (type,
31093121 (type == AnalyserVariable::Type::STATE) ?
31103122 ++stateIndex :
3111- ++variableIndex,
3123+ (type == AnalyserVariable::Type::CONSTANT) ?
3124+ ++constantIndex :
3125+ (type == AnalyserVariable::Type::COMPUTED_CONSTANT) ?
3126+ ++computedConstantIndex :
3127+ ++algebraicIndex,
31123128 (type == AnalyserVariable::Type::EXTERNAL) ?
31133129 nullptr :
31143130 internalVariable->mInitialisingVariable ,
0 commit comments