From a6ec77a6c00b5c0a5164dc21c8f6482ea24fd06d Mon Sep 17 00:00:00 2001 From: rfranke Date: Mon, 21 Jun 2021 15:46:56 +0200 Subject: [PATCH] Fix size of result of multiply_array in Cpp runtime (#7588) Closes #7582 --- .../cpp/Core/Math/ArrayOperations.cpp | 11 ++++- testsuite/openmodelica/cppruntime/Makefile | 1 + .../cppruntime/arrayOperationsTest.mos | 46 +++++++++++++++++++ 3 files changed, 57 insertions(+), 1 deletion(-) create mode 100644 testsuite/openmodelica/cppruntime/arrayOperationsTest.mos diff --git a/OMCompiler/SimulationRuntime/cpp/Core/Math/ArrayOperations.cpp b/OMCompiler/SimulationRuntime/cpp/Core/Math/ArrayOperations.cpp index c210b76d4ac..bb70af16eaa 100644 --- a/OMCompiler/SimulationRuntime/cpp/Core/Math/ArrayOperations.cpp +++ b/OMCompiler/SimulationRuntime/cpp/Core/Math/ArrayOperations.cpp @@ -272,12 +272,14 @@ void multiply_array(const BaseArray &leftArray, const BaseArray &rightArra size_t leftNumDims = leftArray.getNumDims(); size_t rightNumDims = rightArray.getNumDims(); size_t matchDim = rightArray.getDim(1); - resultArray.setDims(leftArray.getDims()); if (leftArray.getDim(leftNumDims) != matchDim) throw ModelicaSimulationError(MODEL_ARRAY_FUNCTION, "Wrong sizes in multiply_array"); if (leftNumDims == 1 && rightNumDims == 2) { size_t rightDim = rightArray.getDim(2); + vector dims; + dims.push_back(rightDim); + resultArray.setDims(dims); for (size_t j = 1; j <= rightDim; j++) { T val = T(); for (size_t k = 1; k <= matchDim; k++) @@ -287,6 +289,9 @@ void multiply_array(const BaseArray &leftArray, const BaseArray &rightArra } else if (leftNumDims == 2 && rightNumDims == 1) { size_t leftDim = leftArray.getDim(1); + vector dims; + dims.push_back(leftDim); + resultArray.setDims(dims); for (size_t i = 1; i <= leftDim; i++) { T val = T(); for (size_t k = 1; k <= matchDim; k++) @@ -297,6 +302,10 @@ void multiply_array(const BaseArray &leftArray, const BaseArray &rightArra else if (leftNumDims == 2 && rightNumDims == 2) { size_t leftDim = leftArray.getDim(1); size_t rightDim = rightArray.getDim(2); + vector dims; + dims.push_back(leftDim); + dims.push_back(rightDim); + resultArray.setDims(dims); for (size_t i = 1; i <= leftDim; i++) { for (size_t j = 1; j <= rightDim; j++) { T val = T(); diff --git a/testsuite/openmodelica/cppruntime/Makefile b/testsuite/openmodelica/cppruntime/Makefile index fea2279c1d4..e197fbef081 100644 --- a/testsuite/openmodelica/cppruntime/Makefile +++ b/testsuite/openmodelica/cppruntime/Makefile @@ -5,6 +5,7 @@ tearnonlin1.mos \ WhenStatement1.mos \ WhenTuple.mos \ BouncingBall.mos \ +arrayOperationsTest.mos \ arraySliceTest.mos \ clockedAlgloopTest.mos \ clockedEventTest.mos \ diff --git a/testsuite/openmodelica/cppruntime/arrayOperationsTest.mos b/testsuite/openmodelica/cppruntime/arrayOperationsTest.mos new file mode 100644 index 00000000000..b4a6d7c126f --- /dev/null +++ b/testsuite/openmodelica/cppruntime/arrayOperationsTest.mos @@ -0,0 +1,46 @@ +// name: arrayOperationsTest +// keywords: array operations +// status: correct +// teardown_command: rm -f *ArrayOperations.Test* +// cflags: -d=-newInst + +setCommandLineOptions("+simCodeTarget=Cpp"); + +loadString(" +package ArrayOperations +model Test + input Real u = 0; + Real y = f({u + 1, u + 2, u + 3}); + annotation(experiment(StopTime = 0)); +end Test; +function f + input Real[:] v; + output Real y; +protected + Real[:,:] m; +algorithm + // see e.g. Modelica.Mechanics.MultiBody.Examples.Rotational3DEffects.MovingActuatedDrive + m := matrix(v) * transpose(matrix(v)); + y := m[3,1]; +end f; +end ArrayOperations; +"); +getErrorString(); + +simulate(ArrayOperations.Test); +getErrorString(); + +val(y, 0); + +// Result: +// true +// true +// "" +// record SimulationResult +// resultFile = "ArrayOperations.Test_res.mat", +// simulationOptions = "startTime = 0.0, stopTime = 0.0, numberOfIntervals = 500, tolerance = 1e-06, method = 'dassl', fileNamePrefix = 'ArrayOperations.Test', options = '', outputFormat = 'mat', variableFilter = '.*', cflags = '', simflags = ''", +// messages = "" +// end SimulationResult; +// "" +// 3.0 +// endResult