diff --git a/OMCompiler/Compiler/NBackEnd/Classes/NBEquation.mo b/OMCompiler/Compiler/NBackEnd/Classes/NBEquation.mo index d9d59f1e38f..e85b8b99ab3 100644 --- a/OMCompiler/Compiler/NBackEnd/Classes/NBEquation.mo +++ b/OMCompiler/Compiler/NBackEnd/Classes/NBEquation.mo @@ -1283,7 +1283,9 @@ public case ALGORITHM() then eq; case IF_EQUATION() then eq; case FOR_EQUATION() then eq; - case WHEN_EQUATION() then eq; + case WHEN_EQUATION() algorithm + eq.body := WhenEquationBody.simplify(eq.body, name, indent); + then eq; case AUX_EQUATION() then eq; else algorithm Error.addMessage(Error.INTERNAL_ERROR,{getInstanceName() + " failed for: " + Equation.toString(eq)}); @@ -2467,6 +2469,29 @@ public bodies := listReverse(bodies); end split; + function simplify + input output WhenEquationBody body; + input String name = ""; + input String indent = ""; + algorithm + // simplify condition if it is an array with surplus false conditions + body.condition := match body.condition + local + Expression condition; + list conditions; + case condition as Expression.ARRAY() algorithm + conditions := list(elem for elem guard(not Expression.isFalse(elem)) in arrayList(condition.elements)); + body.condition := Expression.makeArrayCheckLiteral(Type.ARRAY(Type.BOOLEAN(), {Dimension.fromInteger(listLength(conditions))}), listArray(conditions)); + then body.condition; + else body.condition; + end match; + + // ToDo: add simplification of body! (WhenStatements) + + body.condition := SimplifyExp.simplifyDump(body.condition, true, name, indent); + body.else_when := Util.applyOption(body.else_when, function simplify(name = name, indent = indent)); + end simplify; + protected function collectForSplit "collects all discrete states and regular states for splitting up diff --git a/testsuite/simulation/modelica/NBackend/ScalableTestsuite/CombiTimeTable.mos b/testsuite/simulation/modelica/NBackend/ScalableTestsuite/CombiTimeTable.mos new file mode 100644 index 00000000000..ee84b783e48 --- /dev/null +++ b/testsuite/simulation/modelica/NBackend/ScalableTestsuite/CombiTimeTable.mos @@ -0,0 +1,27 @@ +// name: ScalableTestSuite.Elementary.Tables.Models.CombiTimeTable +// keywords: NewBackend +// status: correct +// cflags: --newBackend + +loadModel(ScalableTestSuite); getErrorString(); + +simulate(ScalableTestSuite.Elementary.Tables.Models.CombiTimeTable); getErrorString(); + +res := OpenModelica.Scripting.compareSimulationResults("ScalableTestSuite.Elementary.Tables.Models.CombiTimeTable_res.mat", + "ReferenceFiles/ScalableTestSuite.Elementary.Tables.Models.CombiTimeTable_res.mat", + "ScalableTestSuite.Elementary.Tables.Models.CombiTimeTable_diff.csv",0.01,0.0001, + {"combiTimeTable.y[1]"}); + +// Result: +// true +// "" +// record SimulationResult +// resultFile = "ScalableTestSuite.Elementary.Tables.Models.CombiTimeTable_res.mat", +// simulationOptions = "startTime = 0.0, stopTime = 1.0, numberOfIntervals = 1, tolerance = 1e-6, method = 'dassl', fileNamePrefix = 'ScalableTestSuite.Elementary.Tables.Models.CombiTimeTable', options = '', outputFormat = 'mat', variableFilter = '.*', cflags = '', simflags = ''", +// messages = "LOG_SUCCESS | info | The initialization finished successfully without homotopy method. +// LOG_SUCCESS | info | The simulation finished successfully. +// " +// end SimulationResult; +// "" +// {"Files Equal!"} +// endResult diff --git a/testsuite/simulation/modelica/NBackend/ScalableTestsuite/Makefile b/testsuite/simulation/modelica/NBackend/ScalableTestsuite/Makefile index 3cc30a2e02b..5a6d24322fa 100644 --- a/testsuite/simulation/modelica/NBackend/ScalableTestsuite/Makefile +++ b/testsuite/simulation/modelica/NBackend/ScalableTestsuite/Makefile @@ -27,6 +27,7 @@ SimpleAdvection.mos \ # test that currently fail. Move up when fixed. # Run make failingtest FAILINGTESTFILES = \ +CombiTimeTable.mos \ TransmissionLineEquations.mos \ # Dependency files that are not .mo .mos or Makefile diff --git a/testsuite/simulation/modelica/NBackend/ScalableTestsuite/ReferenceFiles/ScalableTestSuite.Elementary.Tables.Models.CombiTimeTable_res.mat b/testsuite/simulation/modelica/NBackend/ScalableTestsuite/ReferenceFiles/ScalableTestSuite.Elementary.Tables.Models.CombiTimeTable_res.mat new file mode 100644 index 00000000000..538b9e58742 Binary files /dev/null and b/testsuite/simulation/modelica/NBackend/ScalableTestsuite/ReferenceFiles/ScalableTestSuite.Elementary.Tables.Models.CombiTimeTable_res.mat differ