Previously, we’ve seen examples of modifications applied to variables. In some cases, these modifications are applied to Attributes of built-in types, e.g.,
Real x(start=2, min=1);
In other cases, they have been applied to model
instances to
change the values of parameters for that particular instance, e.g.,
StepVoltage Vs(V0=0, Vf=24, stepTime=0.5);
But it is also worth pointing out that such modifications can reach
down deeper into the hierarchy than simply one level. For example,
consider the previous example involving a StepVoltage
component.
We could also have made a modification to the min
attribute
associated with the Vf
parameter in the Vs
instance of the
StepVoltage
model as follows:
StepVoltage Vs(V0=0, Vf(min=0), stepTime=0.5);
But what if we wanted to change an attribute of the Vf
parameter
and give it a value? The syntax for such a modification is:
StepVoltage Vs(V0=0, Vf(min=0)=24, stepTime=0.5);
An important case worth discussion, with regards to modifications, is
how modifications are performed on arrays of components. Imagine
we had an array of StepVoltage
components declared as follows:
StepVoltage Vs[5];
As we saw in our discussion of Arrays of Component, this is
not only legal Modelica, but it can be useful to represent a
collection of components within a subsystem. If we want to give the
parameter Vf
a value, we have two choices. The first is to
specify an array of values, e.g.,
StepVoltage Vs[5](Vf={24,26,28,30,32});
This assigns the values in the vector {24,26,28,30,32}
to
Vs[1].Vf
, Vs[2].Vf
, Vs[3].Vf
, Vs[4].Vf
and
Vs[5].Vf
, respectively. The other choice we have is to give the
same value to every element in the array. We could use this same
array initialization syntax, e.g.,
StepVoltage Vs[5](Vf={24,24,24,24,24});
The problem comes when the number of elements in an array is defined
by a parameter
, e.g.,
parameter Integer n;
StepVoltage Vs[n](Vf=/* ??? */);
If we tried to initialize Vf
with a literal array (e.g.,
{24,24,24}
), then it won’t adapt to changes in n
. To address
this situation, we could use the fill function:
parameter Integer n;
StepVoltage Vs[n](Vf=fill(24, n));
This is an acceptable solution. But imagine if we wanted to modify
both the value of Vf
and the min
attribute inside Vf
?
We’d end up with something like this:
parameter Integer n;
StepVoltage Vs[n](Vf(min=fill(0,n))=fill(24, n));
With nested modifications, this kind of thing can get complicated
quickly. Fortunately, Modelica includes a feature to deal with such
situations. By placing the each
keyword in front of a
modification, that modification is applied to every instance, e.g.,
parameter Integer n;
StepVoltage Vs[n](each Vf(min=0)=24);
Modifications are an essential part of modeling because they allow us to modify the parameter values down through the hierarchy. As you can see from the examples in this section, Modelica provides many features to make applying modifications to hierarchies simple and powerful.