Как использовать операторы «connect» для автоматического получения суммы спецификаций c «Real», объявленных для набора компонентов в modelica? - PullRequest
1 голос
/ 08 февраля 2020

Я думал о функции, которую было бы неплохо иметь в языке 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?

Есть ли другой способ получить сумму автоматически?

Ответы [ 2 ]

2 голосов
/ 08 февраля 2020

Позвольте мне ответить на мой собственный вопрос, разместив измененную версию кода:

package global_sum_test
  connector X_sum
    flow Real x;
  end X_sum;

  model Global
    X_sum x_sum;
    Real x = x_sum.x;
  end Global;

  model Local
    parameter Real x = 1;
    outer Global global;
    outer X_sum x_sum "Added outer key word here";
  equation
    x_sum.x = x "Removed the negative sign from here";
    connect(x_sum, global.x_sum);
  end Local;

  model Local_nested
    parameter Real x = 1;
    outer Global global;
    outer X_sum x_sum "Added outer key word here";
    Local local;
  equation
    x_sum.x = x "Removed the negative sign from here";
    connect(global.x_sum, x_sum) ;
  end Local_nested;

  model test_model
    inner Global global;
    Local local1;
    Local_nested local2;
  end test_model;
end global_sum_test;

Это правильно создает:

class global_sum_test.test_model
  Real global.x_sum.x;
  Real global.x = global.x_sum.x;
  parameter Real local1.x = 1.0;
  Real local1.x_sum.x;
  parameter Real local2.x = 1.0;
  Real local2.x_sum.x;
  parameter Real local2.local.x = 1.0;
  Real local2.local.x_sum.x;
equation
  local1.x_sum.x = local1.x "Removed the negative sign from here";
  local2.local.x_sum.x = local2.local.x "Removed the negative sign from here";
  local2.x_sum.x = local2.x "Removed the negative sign from here";
  global.x_sum.x + (-local1.x_sum.x) + (-local2.local.x_sum.x) + (-local2.x_sum.x) = 0.0;
end global_sum_test.test_model;

Теперь он работает, как и ожидалось, и дает ответ global.x = 3.0.

1 голос
/ 10 февраля 2020

Итак, я отправил билет на https://trac.openmodelica.org/OpenModelica/ticket/5834 и получил отличный ответ.

Есть очень хорошее объяснение того, что происходит и как очень аккуратно делать эти суммы ( и правильно) с минимальным рабочим примером.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...