@@ -87,6 +87,7 @@ import SCode;
8787import SynchronousFeatures ;
8888import Tearing ;
8989import Types ;
90+ import UnorderedMap ;
9091import Util ;
9192import Values ;
9293
@@ -5777,6 +5778,8 @@ protected
57775778 Integer systemNumber= 0 , numberOfSystems;
57785779
57795780 list< Integer > eqIndLst, eqIndexLst = {};
5781+ UnorderedMap < DAE . ComponentRef , DAE . Exp > der_replacement;
5782+ BackendDAE . Var derVar;
57805783
57815784 constant Boolean debug = false ;
57825785algorithm
@@ -5897,8 +5900,21 @@ algorithm
58975900 if debug then print("No output variables in this system (" + intString(systemNumber)+ "/" + intString(numberOfSystems)+ ") \n " ); end if ;
58985901 end if ;
58995902
5903+ // make unneeded state derivatives and add them to unneeded vars
5904+ der_replacement := UnorderedMap . new< DAE . Exp > (ComponentReference . hashComponentRef, ComponentReference . crefEqual);
5905+ for state in BackendVariable . varList(vars) loop
5906+ if BackendVariable . isStateVar(state) then
5907+ derVar := BackendVariable . makeVar(ComponentReference . prependStringCref("$DER_REM_" , state. varName));
5908+ UnorderedMap . add(state. varName, Expression . crefExp(derVar. varName), der_replacement);
5909+ vars := BackendVariable . addVar(derVar, vars);
5910+ end if ;
5911+ end for ;
5912+
5913+ // replace unneeded der() calls with derivative crefs
5914+ eqs := BackendEquation . traverseEquationArray_WithUpdate(eqs, function BackendEquation . traverseExpsOfEquation(inFunc = replaceDerCallOutputsOnly), der_replacement);
5915+
59005916 // make unneeded vars parameters and equations initial equations
5901- (vars, _) := BackendVariable . traverseBackendDAEVarsWithUpdate(vars, BackendVariable . makeParamFixed , false );
5917+ (vars, _) := BackendVariable . traverseBackendDAEVarsWithUpdate(vars, BackendVariable . makeParamOutputsOnly , false );
59025918 (eqs, _) := BackendEquation . traverseEquationArray_WithUpdate(eqs,BackendEquation . setEquationKind, BackendDAE . INITIAL_EQUATION ());
59035919
59045920 // add unneeded variables and equations
@@ -5919,6 +5935,18 @@ algorithm
59195935 b := intLt(arrayGet(varArr,idx),0 );
59205936end stateVarIsNotVisited;
59215937
5938+ protected function replaceDerCallOutputsOnly
5939+ input output DAE . Exp exp;
5940+ input output UnorderedMap < DAE . ComponentRef , DAE . Exp > der_replacement;
5941+ algorithm
5942+ exp := match exp
5943+ local
5944+ DAE . ComponentRef cr;
5945+ case DAE . CALL (path = Absyn . IDENT ("der" ), expLst = {DAE . CREF (cr)})
5946+ then UnorderedMap . getOrDefault(cr, der_replacement, exp);
5947+ else exp;
5948+ end match;
5949+ end replaceDerCallOutputsOnly;
59225950
59235951// =============================================================================
59245952// section for initOptModule >>inlineHomotopy<<
0 commit comments