Я работаю над поиском хорошего способа разделить код на две части: общую библиотеку и код приложения. Примеры, с которыми я работаю, обычно содержат жидкости, и я хочу сделать общую библиотеку независимой от количества компонентов в жидкости. Идея состоит в том, что код приложения устанавливает используемую жидкую среду, а затем импортирует оборудование из общей библиотеки и адаптирует это оборудование к реальной среде.
Приведенный ниже пример представляет собой очень краткий пример, иллюстрирующий один из способов разделения кода. Здесь я позволил не определять число компонентов nc в частичном пакете MediumBase. Позже, когда EquipmentLib будет адаптирована к реальной среде, тогда nc получит значение. Это то, что я имею в виду под «задержкой» настройки структурного параметра. Код хорошо работает как в JModelica, так и в OpenModelica.
package DEMO_v30
// Author: Jan Peter Axelsson
// ---------------------------------------------------------------------------------------------
// Interfaces
// ---------------------------------------------------------------------------------------------
import Modelica.Blocks.Interfaces.RealInput;
import Modelica.Blocks.Interfaces.RealOutput;
partial package MediumBase
constant Integer nc "Number of components";
replaceable type Concentration = Real[nc] "Component conc";
end MediumBase;
package Medium3
extends MediumBase (nc=3);
end Medium3;
// ---------------------------------------------------------------------------------------------
// Equipment dependent on the medium
// ---------------------------------------------------------------------------------------------
package EquipmentLib
replaceable package Medium = MediumBase // formal parameter - EquipmentLib
constrainedby MediumBase;
model ReactorType
parameter Medium.Concentration c_0 = ones(Medium.nc) "Initial component conc";
Medium.Concentration c (start=c_0, each fixed=true) "Component conc";
equation
for i in 1:Medium.nc loop
der(c[i]) = -c[i];
end for;
end ReactorType;
end EquipmentLib;
// ---------------------------------------------------------------------------------------------
// Adaptation of package Equipment to Medium3
// ---------------------------------------------------------------------------------------------
package Equipment
import DEMO_v30.EquipmentLib;
extends EquipmentLib(redeclare package Medium=Medium3);
end Equipment;
// ---------------------------------------------------------------------------------------------
// Examples of systems
// ---------------------------------------------------------------------------------------------
model Test
Equipment.ReactorType reactor;
end Test;
end DEMO_v30;
Однако в немного более крупных примерах с той же структурой кода у меня возникают некоторые проблемы:
- В JModelica я получаю предупреждение о том, что «Константа nc не имеет выражения привязки»
- В OpenModelica я получаю сообщение об ошибке: «Не удалось оценить структурный параметр (или константу) .. nc, который дает размеры массива c [MediumBase.nc]. Размер массива должен быть известен во время компиляции '
Для меня это сообщение не имеет смысла, поскольку nc известен во время компиляции, на уровне адаптации EquipmentLib. На самом деле эту проблему можно решить, присвоив nc в MediumBase «фиктивное» значение nc = 1 в Medium Base, а затем изменив это значение nc во время компиляции на значение, предоставленное при адаптации EquipmentLib.
Итак, мои вопросы:
- На мой взгляд, лучше оставить nc undefined, а затем убедиться, что значение установлено во время компиляции, в то время как изменение константы во время компиляции выглядит сомнительным, но, возможно, (все еще) разрешенным в Modelica. В спецификации языка Modelica я вижу в Приложении A, что константа требуется (только), чтобы она была постоянной во время моделирования, то есть не во время компиляции. В приложении E8.2 я вижу, что, возможно, следует выполнить начальное назначение nc, но не уверен. Буду признателен за комментарий по этому поводу.
- Как могло случиться, что с несколько большим примером компиляторы JModelica и OpenModelica выдают предупреждение и ошибку, соответственно?
- Что в спецификации Modelica говорится о том, что находится прямо здесь?
При необходимости я могу привести более крупный пример, но я думаю, что здесь может быть более общий ответ.