rumoca 0.7.28

Modelica compiler written in RUST
Documentation
// Test fixtures for size() function evaluation in balance checking
// Tests that size(array, dim) is correctly evaluated for parameter arrays
package SizeFunction
  // Simple model with size() in array dimension
  // a = {1,2,3}, so size(a,1) = 3, x[size(a,1)-1] = x[2]
  model SimpleSizeFunction
    parameter Real a[:] = {1, 2, 3} "Array parameter";
    Real x[size(a, 1) - 1] "Array with size-dependent dimension";
  equation
    for i in 1:size(a, 1) - 1 loop
      der(x[i]) = -x[i];
    end for;
  end SimpleSizeFunction;

  // Model with multiple size() calls
  // b = {1,2,3,4}, size(b,1) = 4
  // y[size(b,1)] = y[4], for i in 1:size(b,1) = 4 iterations
  model MultipleSizeCalls
    parameter Real b[:] = {1, 2, 3, 4};
    Real y[size(b, 1)];
  equation
    for i in 1:size(b, 1) loop
      der(y[i]) = -y[i];
    end for;
  end MultipleSizeCalls;

  // Model with nested size() in for-loop range
  // c = {1,2}, size(c,1) = 2
  model SizeInForLoop
    parameter Integer n = 3;
    parameter Real c[:] = {1, 2};
    Real z[n];
  equation
    // First size(c,1)=2 equations
    for i in 1:size(c, 1) loop
      der(z[i]) = -z[i];
    end for;
    // Remaining n - size(c,1) = 1 equation
    der(z[n]) = -z[n];
  end SizeInForLoop;

  // Model with size() of a 2D array
  // mat[2,3], size(mat,1)=2, size(mat,2)=3
  model Size2DArray
    parameter Real mat[2, 3] = {{1, 2, 3}, {4, 5, 6}};
    Real x[size(mat, 1)]; // x[2]
    Real y[size(mat, 2)]; // y[3]
  equation
    for i in 1:size(mat, 1) loop
      der(x[i]) = -x[i];
    end for;
    for j in 1:size(mat, 2) loop
      der(y[j]) = -y[j];
    end for;
  end Size2DArray;
end SizeFunction;