diff --git a/Compiler/BackEnd/BackendDAEOptimize.mo b/Compiler/BackEnd/BackendDAEOptimize.mo index dfc445b4081..a832dde8a3d 100644 --- a/Compiler/BackEnd/BackendDAEOptimize.mo +++ b/Compiler/BackEnd/BackendDAEOptimize.mo @@ -3991,6 +3991,109 @@ algorithm end matchcontinue; end updateStatesVars; +// ============================================================================= +// section for addedScaledVars +// +// ============================================================================= + +public function addedScaledVars +" added var_norm = var/nominal, + where var is state. +" + input BackendDAE.BackendDAE inDAE; + output BackendDAE.BackendDAE outDAE; +algorithm + outDAE := if Flags.isSet(Flags.ADD_SCALED_VARS) then + addedScaledVarsWork(inDAE) + else + inDAE; +end addedScaledVars; + +protected function addedScaledVarsWork + input BackendDAE.BackendDAE inDAE; + output BackendDAE.BackendDAE outDAE; +protected + list systlst; + list osystlst = {}; + BackendDAE.EqSystem osyst; + + Option m, mT; + BackendDAE.Variables vars; + BackendDAE.EquationArray eqns; + BackendDAE.Matching matching; + BackendDAE.StateSets stateSets; + BackendDAE.BaseClockPartitionKind partitionKind; + + BackendDAE.Variables vars; + BackendDAE.Variables knvars; + list varlst, kvarlst, lst_states, lst_inputs, lst_normv, lst_new_var = {}; + BackendDAE.Var tmpv; + DAE.ComponentRef cref; + DAE.Exp norm, y_norm, y, lhs; + BackendDAE.Equation eqn; + BackendDAE.Shared oshared ; + +algorithm + + BackendDAE.DAE(systlst, oshared) := inDAE; + BackendDAE.SHARED(knownVars=knvars) := oshared; + kvarlst := BackendVariable.varList(knvars); + lst_inputs := List.select(kvarlst, BackendVariable.isVarOnTopLevelAndInputNoDerInput); + + for syst in systlst loop + BackendDAE.EQSYSTEM(vars, eqns, m, mT, matching, stateSets, partitionKind) := syst; + varlst := BackendVariable.varList(vars); + // get vars + lst_states := List.select(varlst, BackendVariable.isStateVar); + //BackendDump.printVarList(lst_states); + for v in lst_states loop + cref := BackendVariable.varCref(v); + tmpv := BackendVariable.createVar(cref, "__OMC$scaled_state"); + y := Expression.crefExp(cref); + norm := BackendVariable.getVarNominalValue(v); + y_norm := Expression.expDiv(y,norm); + (y_norm,_) := ExpressionSimplify.simplify(y_norm); + + // lhs + cref := BackendVariable.varCref(tmpv); + lhs := Expression.crefExp(cref); + eqn := BackendDAE.EQUATION(lhs, y_norm, DAE.emptyElementSource, BackendDAE.EQ_ATTR_DEFAULT_DYNAMIC); + + //print("\n" + BackendDump.equationString(eqn)); + eqns := BackendEquation.addEquation(eqn, eqns); + vars := BackendVariable.addVar(tmpv, vars); + + end for; + osyst := BackendDAE.EQSYSTEM(vars, eqns, NONE(), NONE(), BackendDAE.NO_MATCHING(), stateSets, partitionKind); + osystlst := osyst::osystlst; + end for; + + // inputs + //BackendDump.printVarList(lst_inputs); + for v in lst_inputs loop + cref := BackendVariable.varCref(v); + tmpv := BackendVariable.createVar(cref, "__OMC$scaled_input"); + y := Expression.crefExp(cref); + norm := BackendVariable.getVarNominalValue(v); + y_norm := Expression.expDiv(y,norm); + (y_norm,_) := ExpressionSimplify.simplify(y_norm); + + // lhs + cref := BackendVariable.varCref(tmpv); + lhs := Expression.crefExp(cref); + eqn := BackendDAE.EQUATION(lhs, y_norm, DAE.emptyElementSource, BackendDAE.EQ_ATTR_DEFAULT_DYNAMIC); + //print("\n" + BackendDump.equationString(eqn)); + + eqns := BackendEquation.addEquation(eqn, eqns); + vars := BackendVariable.addVar(tmpv, vars); + + end for; + + outDAE := BackendDAE.DAE(osystlst, oshared); +end addedScaledVarsWork; + + + // ============================================================================= // section for introduceDerAlias // diff --git a/Compiler/BackEnd/BackendDAEUtil.mo b/Compiler/BackEnd/BackendDAEUtil.mo index 7a66d928979..e9a5f369b51 100644 --- a/Compiler/BackEnd/BackendDAEUtil.mo +++ b/Compiler/BackEnd/BackendDAEUtil.mo @@ -7710,6 +7710,7 @@ algorithm (SymbolicJacobian.inputDerivativesUsed, "inputDerivativesUsed", false), (BackendDAEOptimize.simplifysemiLinear, "simplifysemiLinear", false), (BackendDAEOptimize.removeConstants, "removeConstants", false), + (BackendDAEOptimize.addedScaledVars, "addScaledVars", false), (ExpressionSolve.solveSimpleEquations, "solveSimpleEquations", false), (SymbolicJacobian.detectSparsePatternODE, "detectJacobianSparsePattern", false), (Tearing.tearingSystem, "tearingSystem", false), diff --git a/Compiler/BackEnd/BackendVariable.mo b/Compiler/BackEnd/BackendVariable.mo index 0313b0db6b4..9ece24943cf 100644 --- a/Compiler/BackEnd/BackendVariable.mo +++ b/Compiler/BackEnd/BackendVariable.mo @@ -1673,6 +1673,19 @@ algorithm NONE(), NONE(), DAE.NON_CONNECTOR(), DAE.NOT_INNER_OUTER(), false); end createAliasDerVar; +public function createVar +"Creates a variable with as cref" + input DAE.ComponentRef inCref; + input String prependStringCref; + output BackendDAE.Var outVar; +protected + BackendDAE.Var var; + DAE.ComponentRef cr; +algorithm + cr := ComponentReference.appendStringLastIdent(prependStringCref, inCref); + outVar := makeVar(cr); +end createVar; + public function createDummyVar "Creates variable with $dummy." output BackendDAE.Var outVar; diff --git a/Compiler/Util/Flags.mo b/Compiler/Util/Flags.mo index 968f62f3a55..64b86b95105 100644 --- a/Compiler/Util/Flags.mo +++ b/Compiler/Util/Flags.mo @@ -436,6 +436,9 @@ constant DebugFlag REDUCE_DYN_OPT = DEBUG_FLAG(133, "reduceDynOpt", false, Util.gettext("remove eqs which not need for the calculations of cost and constraints")); constant DebugFlag VISUAL_XML = DEBUG_FLAG(134, "visxml", false, Util.gettext("Outputs a xml-file that contains information for visualization.")); +constant DebugFlag ADD_SCALED_VARS = DEBUG_FLAG(135, "addScaledVars", false, + Util.gettext("Adds an alias equation var_nrom = var/nominal where var is state")); + // This is a list of all debug flags, to keep track of which flags are used. A // flag can not be used unless it's in this list, and the list is checked at @@ -576,7 +579,8 @@ constant list allDebugFlags = { CONSTJAC, EXTENDS_DYN_OPT, REDUCE_DYN_OPT, - VISUAL_XML + VISUAL_XML, + ADD_SCALED_VARS }; public @@ -733,6 +737,7 @@ constant ConfigFlag POST_OPT_MODULES = CONFIG_FLAG(16, "postOptModules", "constantLinearSystem", "simplifysemiLinear", "solveLinearSystem", + "addScaledVars", "removeSimpleEquations", "encapsulateWhenConditions", // must called after remove simple equations "reshufflePost",