Opened 7 years ago

Closed 7 years ago

#4865 closed defect (fixed)

Issue with scalar*array products in functions with NF

Reported by: Francesco Casella Owned by: Per Östlund
Priority: high Milestone: 2.0.0
Component: New Instantiation Version:
Keywords: Cc:

Description

Please check Modelica.Blocks.Examples.Filter. The following error is reported:

Modelica_3.2.2_Modelica.Blocks.Examples.Filter_functions.c:3071:18: error: 
invalid operands to binary expression ('modelica_real' (aka 'double')
and 'real_array' (aka 'struct base_array_s'))
  _cr = (_w_cut) * (_cr_in);
        ~~~~~~~~ ^ ~~~~~~~~

This expression is found in function Modelica.Blocks.Continuous.Internal.Filter.coefficients.lowPass. When flattening the model with the NF, the function is

function Modelica.Blocks.Continuous.Internal.Filter.coefficients.lowPass "Return low pass filter coefficients at given cut-off frequency"
  input Real[:] cr_in "Coefficients of real poles";
  input Real[:] c0_in "Coefficients of s^0 term if conjugate complex pole";
  input Real[size(c0_in, 1)] c1_in "Coefficients of s^1 term if conjugate complex pole";
  input Real f_cut(quantity = "Frequency", unit = "Hz") "Cut-off frequency";
  output Real[size(cr_in, 1)] cr "Coefficient of real pole";
  output Real[size(c0_in, 1)] c0 "Coefficients of s^0 term if conjugate complex pole";
  output Real[size(c0_in, 1)] c1 "Coefficients of s^1 term if conjugate complex pole";
  protected Real w_cut(quantity = "AngularVelocity", unit = "rad/s") = 2.0 * 3.141592653589793 * f_cut "Cut-off angular frequency";
  protected Real w_cut2 = w_cut * w_cut;
algorithm
  assert(f_cut > 0.0, "Cut-off frequency f_cut must be positive");
  cr := w_cut * cr_in;
  c1 := w_cut * c1_in;
  c0 := w_cut2 * c0_in;
end Modelica.Blocks.Continuous.Internal.Filter.coefficients.lowPass;

while the old FE gives

function Modelica.Blocks.Continuous.Internal.Filter.coefficients.lowPass "Return low pass filter coefficients at given cut-off frequency"
  input Real[:] cr_in "Coefficients of real poles";
  input Real[:] c0_in "Coefficients of s^0 term if conjugate complex pole";
  input Real[size(c0_in, 1)] c1_in "Coefficients of s^1 term if conjugate complex pole";
  input Real f_cut(quantity = "Frequency", unit = "Hz") "Cut-off frequency";
  output Real[size(cr_in, 1)] cr "Coefficient of real pole";
  output Real[size(c0_in, 1)] c0 "Coefficients of s^0 term if conjugate complex pole";
  output Real[size(c0_in, 1)] c1 "Coefficients of s^1 term if conjugate complex pole";
  protected Real w_cut(quantity = "AngularVelocity", unit = "rad/s") = 6.283185307179586 * f_cut "Cut-off angular frequency";
  protected Real w_cut2 = w_cut ^ 2.0;
algorithm
  assert(f_cut > 0.0, "Cut-off frequency f_cut must be positive");
  cr := cr_in * w_cut;
  c1 := c1_in * w_cut;
  c0 := c0_in * w_cut2;
end Modelica.Blocks.Continuous.Internal.Filter.coefficients.lowPass;

All variable declarationa are equivalent. For some reason, the old FE swaps the order of the scalar*array product to an array*scalar product, while the NF keeps the expression as in the source code. Both expressions are allowed by the specification and should give the same result.

Maybe the current code generation assumes to only array*scalar? In that case, when creating the DAE structure we should swap those products as in the old FE.

Change History (1)

comment:1 by Francesco Casella, 7 years ago

Resolution: fixed
Status: newclosed

This problem is now fixed after PR #2350, even though the model compilation fails later because of another issue

Note: See TracTickets for help on using tickets.