
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.