Я думал о функции, которую было бы неплохо иметь в языке Modelica (я использую OpenModelica 1.14.1).
Функция автоматически добавит уравнение, представляющее сумму желаемых значений.
Значение, представляющее сумму, будет объявлено в компоненте global
, созданном на верхнем уровне модели.
Каждый вклад компонента более низкого уровня (возможно, вложенного) будет представлен connect
оператор.
Для этого можно использовать класс connector
с переменной flow
, поскольку он генерирует правильные уравнения. Ключевые слова inner
и outer
могут сделать это возможным. Я попытался закодировать пример этого следующим образом:
package global_sum_test
connector X_sum
flow Real x;
end X_sum;
model Global
X_sum x_sum;
Real x = x_sum.x "Variable representing the sum";
end Global;
model Local
parameter Real x=1 "Local contribution to the sum";
outer Global global "Reference to the Global instance";
X_sum x_sum;
equation
x_sum.x = -x "negative sign makes x flowing flom local into global";
connect(x_sum, global.x_sum) "Pushing local x into global sum";
end Local;
model Local_nested
parameter Real x=1 "Local contribution to the sum";
outer Global global "Reference to the global";
X_sum x_sum;
Local local "Component within another component to test nesting";
equation
x_sum.x = -x "Negative sign makes x flowing flom local into global";
connect(global.x_sum, x_sum) "Pushing local x into global sum";
end Local_nested;
model test_model
inner Global global "Instance of Global that is available to lower-level components";
Local local1 "Instance of Local";
Local_nested local2 "Instance of Local_nested with one more Local in it";
end test_model;
end global_sum_test;
Это, к сожалению, не работает. Когда я создаю экземпляр test_model
, он дает следующий вывод (который я соответствующим образом прокомментировал):
class global_sum_test.test_model
Real global.x_sum.x;
Real global.x = global.x_sum.x "Variable representing the sum";
parameter Real local1.x = 1.0 "Local contribution to the sum";
Real local1.x_sum.x;
parameter Real local2.x = 1.0 "Local contribution to the sum";
Real local2.x_sum.x;
parameter Real local2.local.x = 1.0 "Local contribution to the sum";
Real local2.local.x_sum.x;
equation
local1.x_sum.x = -local1.x "negative sign makes x flowing flom local into global";
local2.local.x_sum.x = -local2.local.x "negative sign makes x flowing flom local into global";
local2.x_sum.x = -local2.x "Negative sign makes x flowing flom local into global";
global.x_sum.x + (-local1.x_sum.x) + (-local2.x_sum.x) + (-local2.local.x_sum.x) = 0.0; // <- this is correct
local1.x_sum.x = 0.0; // <- this line should not be generated and makes system over-determined.
local2.x_sum.x = 0.0; // <- this line should not be generated and makes system over-determined.
local2.local.x_sum.x = 0.0; // <- this line should not be generated and makes system over-determined.
end global_sum_test.test_model;
Три строки, сгенерированные в конце, вызывают переопределение системы. Если бы не эти три строки, они бы работали точно так, как мне нужно.
Вопросы:
Это ожидаемое поведение? Не вызваны ли дополнительные строки использованием открытого компилятора Modelica?
Есть ли способ улучшить мой код таким образом, чтобы три дополнительные строки не генерировались?
Может кто-нибудь проверить это global_sum_test.test_model
в Dymola, чтобы убедиться, что эта проблема не указана c только для OpenModelica?
Есть ли другой способ получить сумму автоматически?