Opened 11 years ago
Closed 9 years ago
#3211 closed defect (fixed)
Inconsistent handling of final attribute
| Reported by: | Owned by: | Patrick Täuber | |
|---|---|---|---|
| Priority: | high | Milestone: | Future |
| Component: | *unknown* | Version: | trunk |
| Keywords: | Cc: | Martin Sjölund, Lennart Ochel |
Description
In the following example, the protected parameter b does not get updated when parameter a is updated.
My interpretation of the Modelica spec is that protected variables are like local variables and can only be modified/accessed locally but shouldn't prevent the intended behavior here (correct me if I'm wrong).
loadString("
model protectedbug
parameter Real a = 0.24;
Real x(start = 1.0, fixed = true);
protected
parameter Real b = 2.0 * a;
equation
der(x)=-b*x;
end protectedbug;
");
// Value of b is 0.48, x is 0.61878
simulate(protectedbug);
val(b,1.0);
val(x,1.0);
// Override of a does not change b, value of b should b 1.0, x should be 0.13534
simulate(protectedbug, simflags="-override a=1.0");
val(b,1.0);
val(x,1.0);
Tested in r24986.
Change History (10)
comment:1 by , 11 years ago
comment:2 by , 11 years ago
| Owner: | changed from to |
|---|---|
| Status: | new → accepted |
It should work now (r25012). Not sure if my fix breaks anything … we will see.
comment:4 by , 11 years ago
Replying to crupp@…:
18 minutes to fix this, impressive!!!
Well, not really. It broke some models. I will have a closer look tomorrow.
comment:5 by , 11 years ago
| Cc: | added |
|---|
Evaluation of protected parameters was introduced in r20675. Martin, why get those parameters evaluated during compilation?
comment:6 by , 11 years ago
Probably the correct properties is sent somewhere which causes a parameter to be evaluated
comment:7 by , 9 years ago
| Cc: | added |
|---|---|
| Owner: | changed from to |
| Status: | accepted → assigned |
The problem is the inconsistent handling of the final attribute. The protected parameter "b" which is considered to be final is dependent on "a", which is not declared to be final but used to evaluate "b". So if you change "a" after compilation "b" is not evaluated again.
Things to discuss about are:
Should protected parameters be considered as final?
How to handle the final attribute? Is "a" implicitly final? Then it must not be possible to change "a" after compilation. Or is only the binding of a parameter "final". In this case you could change the value of "a" after compilation and "b" would always be "2*a".
I will open a ticket at the Modelica trac about this to get to know how to handle the latter.
comment:8 by , 9 years ago
| Summary: | Protected secondary parameters don't get updated → Inconsistent handling of final attribute |
|---|
comment:9 by , 9 years ago
The attribute final primarily means that the parameter must not be modified anymore. This is of interest during flattening in the frontend. The backend should consider final parameters like bound parameters.
comment:10 by , 9 years ago
| Resolution: | → fixed |
|---|---|
| Status: | assigned → closed |
Since d75f648 parameters are handled in a consistent way.

This happens in pre-optimization module
evaluateReplaceProtectedFinalEvaluateParameters.