Я работаю над поиском хорошего способа разделения кода на две части: общую библиотеку и код приложения. Примеры, с которыми я работаю, обычно содержат жидкости, и я хочу сделать общую библиотеку независимой от количества компонентов в жидкости. , Идея состоит в том, что код приложения устанавливает используемую жидкую среду, а затем импортирует оборудование из общей библиотеки и адаптирует это оборудование к фактической среде.
Пример ниже является очень кратким примером, иллюстрирующим один из способов сделать это разделение кода. Здесь я позволю значению n c количества компонентов быть неопределенным в частичном пакете MediumBase. Позже, когда EquipmentLib адаптируется к фактической среде, тогда n c получит значение. Вот что я имею в виду под «задержкой» установки структурного параметра. Код хорошо работает как в 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 я получаю предупреждение, что «Константа n c не имеет выражения привязки»
- В OpenModelica я получаю ошибку, что «Не удалось оценить структурный параметр (или константу) .. n c, которая дает размеры массива c [ MediumBase.nc]. Размерность массива должна быть известна во время компиляции '
Это сообщение не имеет смысла для меня, так как n c известно во время компиляции, на уровне, где адаптируется EquipmentLib Эта проблема может быть на самом деле решена путем предоставления n c в MediumBase «фиктивного» значения nc = 1 в Medium Base, а затем, что n c изменится во время компиляции до значения, указанного при адаптации EquipmentLib.
Итак, мои вопросы:
- Мне кажется, лучше оставить n c неопределенным, а затем убедиться, что значение установлено во время компиляции, в то время как Изменение константы во время компиляции выглядит сомнительным, но, возможно, (все еще) допускается в Modelica. В спецификации языка Modelica я могу видеть в Приложении A, что требованием к константе является (только), чтобы она была постоянной во время моделирования, т.е. не во время компиляции. В приложении E8.2 я вижу, что, возможно, следует выполнить начальное присвоение n c, но не уверен. Буду признателен за некоторые комментарии по этому поводу.
- Как могло случиться, что с несколько более крупными примерами компиляторов JModelica и OpenModelica выдают предупреждение и ошибку, соответственно?
- Что спецификация Modelica говорит о том, что здесь находится?
При необходимости я могу привести более крупный пример, но я думаю, что здесь может быть более общий ответ.