Repeat equations or statements a specific number of times
for clauses are mostly used in algorithm sections, such as
parameter Integer np=10; Real p[np], x, y; algorithm y := p[1]; for i in 2:np loop // i shall not be declared y := y*x + p[i]; end for;
Other forms of the for condition:
for i in 1:10 loop // i takes the values 1,2,3,...,10 for r in 1.0 : 1.5 : 5.5 loop // r takes the values 1.0, 2.5, 4.0, 5.5 for i in {1,3,6,7} loop // i takes the values 1, 3, 6, 7
In equation sections, for clauses are expanded at translation time in order that symbolic transformations can be applied. Typically, a for clause in an equation section is used on component arrays, e.g., to connect elements of an array of components together:
parameter Integer nR=10 "Number of resistances"; Modelica.Electrical.Analog.Basic.Resistor R[nR]; equation for i in 1:nR-1 loop connect(R[i].p R[i+1].n); // 9 connect equations end for;
In equation sections:
for for_indices loop { equation ";" } end for; for_indices : for_index {"," for_index} for_index : IDENT [ in expression ]
In algorithm sections:
for for_indices loop { algorithm ";" } end for; for_indices : for_index {"," for_index} for_index : IDENT [ in expression ]
A clause
for IDENT in expression loop
is one example of a for clause.
The expression of a for clause shall be a vector expression. It is evaluated once for each for clause, and is evaluated in the scope immediately enclosing the for clause. In an equation section, the expression of a for clause shall be a parameter expression (in order that the for clause can be expanded into equations during translation). The loop-variable is in scope inside the loop-construct and shall not be assigned to.
[Example:
The loop-variable may hide other variables as in the following example. Using another name for the loop-variable is, however, strongly recommended.
constant Integer j=4; Real x[j]; equation for j in 1:j loop // The loop-variable j takes the values 1,2,3,4 x[j]=j; // Uses the loop-variable j end for;
]
The notation with several iterators is a shorthand notation for
nested for-clauses (or reduction-expressions). For for-clauses it
can be expanded into the usual form by replacing each "," by
'loop for'
and adding extra 'end for'
.
For reduction-expressions it can be expanded into the usual form by
replacing each ',' by ') for'
and prepending the
reduction-expression with 'function-name('
.
[Example:
Real x[4,3]; equation for j, i in 1:2 loop // The loop-variable j takes the values 1,2,3,4 (due to use) // The loop-variable i takes the values 1,2 (given range) x[j,i]=j+i; end for;
]