Как соединить многомерные компоненты с многомерными соединителями в Modelica? - PullRequest
0 голосов
/ 22 марта 2020

Я попытался подключить массив 2-мерных компонентов к массиву 1-мерных компонентов, включающему в себя 1-мерные соединители, но при проверке модели возникает ошибка, показывающая несопоставимые размеры. Но я мог бы подключить одномерный массив компонентов к компоненту, включающему в себя одномерные соединители. Так почему же это не может работать в многомерных ситуациях? Я сделал это неправильно?

Я проверил код, кажется, я не могу использовать

connect(tubeWall.port_b,surface.q_port);

, но если я использую следующий код, он отлично работает.

for i in 1:x loop for j in 1:y loop connect(tubeWall[i].port_b[j], surface[i,j].q_port); end for; end for;

enter image description here

Я сделал больше теста, вот код теста, который работал нормально:

model Unnamed
  gain_1[3] gain_1_1
  Modelica.Blocks.Sources.Sine[3,3] sine
  Modelica.Blocks.Math.Cos[3,3] cos
equation 
  connect(sine.y, gain_1_1.u);
  connect(gain_1_1.y, cos.u);
end Unnamed;

model gain_1

  Modelica.Blocks.Math.Gain[3] gain
  Modelica.Blocks.Interfaces.RealOutput[3] y
  Modelica.Blocks.Interfaces.RealInput[3] u
equation 
  connect(gain.y, y)
  connect(u, gain.u)
end gain_1;

Вот скриншот соединений:

enter image description here

Так что, похоже, идея верна, но я не уверен, почему она не работает в моей модели. Надеюсь, что кто-то может дать подсказку или направление непревзойденной ошибки в моей модели.

Ответы [ 3 ]

4 голосов
/ 23 марта 2020

Цитирование Fritzon's Принципы объектно-ориентированного моделирования и моделирования с помощью Modelica 3.3 :

Конструкция connect может использоваться для прямого подключения массивов разъемов. Для таких соединений с массивом выполняется следующее:

  • Размеры массива подключенных массивов соединителей должны совпадать
  • Каждая соответствующая пара элементов соединяется в виде пары скалярных соединителей

То есть, ссылаясь на connect(tubeWall.port_b,surface.q_port);

  • , он не знает, какое измерение surface[:,:] переходит в tubeWall[:], а какое в port_b[:]
  • for for l oop работает, потому что вы берете на себя задачу подключения пары элементов в качестве скалярных соединителей

Мое предложение для вашей задачи моделирования состоит в том, что вы создаете интерфейсный блок для установите между surface и tubeWall, в которых вы реализуете поэлементные соединения так, как они должны быть. Тогда соединение между поверхностью и интерфейсом может выглядеть следующим образом:

  • connect(surface, interface.surfacePort);
1 голос
/ 26 марта 2020

Конструкция connect работает только в том случае, если размеры массива совпадают.

  • Можно указать индексы в окне создания соединения, чтобы установить соединение прямо между tubeWall и поверхностью. это именно то, что делает код.
  • Модель Unnammed работает, потому что gain_1_1.u - это разъем с размерами [3,3]. Если вы измените размер экземпляра gain_1, вы увидите разницу.

Поэтому вы можете либо подключить массивы одинакового размера, либо явно указать индексы во время соединения.

Надеюсь, это помогает.

1 голос
/ 26 марта 2020

Я поиграл, чтобы понять, смогу ли я понять это. Вот три момента, которые могут приблизить вас к каноническому ответу о том, почему существует разное поведение между физическими соединениями (тепловые, в вашем случае) и сигнальными соединениями (реальный вход / выход, в вашем случае):

  1. Реальный ввод / вывод является причинно-следственным и объявляется иначе, чем физические разъемы

    connector RealInput = input Real "'input Real' as connector" annotation (...);

    connector PhysConnector
      Real pt;
      flow Real flw;
      annotation (...);
    end PhysConnector;  
    
  2. Реальный ввод / вывод больше похож на функции, чем разъемы. Я предполагаю, что правило Размеры массивов подключенных массивов соединителей должны совпадать не применяется / не применяется для них. Я могу думать о разных причинах этого; два из них могут быть:

    • Существует общепринятая схема работы с таблицами, так же, как большинство из нас согласны с тем, что, глядя на географическую карту, верхний левый угол находится к северо-западу. Таким образом, соединения сортируются автоматически в соответствии с последовательностью: 1-й тусклый, 2-й тусклый, 3-й тусклый ... С другой стороны, многомерные физические соединения могут представлять все виды сценариев ios. Лучше оставить дизайнера модели ответственным за его правильное построение
    • Реальный ввод / вывод генерирует одно присваивание вместо набора уравнений, поэтому они не слишком запутываются в алгоритмах сортировки при выяснении причинности системы
  3. В конце концов я попытался проверить стандартный соединитель только с потенциальной переменной, чтобы выяснить, не связана ли проблема с двумя уравнениями, сгенерированными, когда переменная потока также подарок. Плоская модель показывает, что сгенерировано только одно уравнение (как и ожидалось), но соединение matrix[:,:],array[:].array[:] не разрешено.

    package MultidimConnections

        connector RealConnector
            Real r;
        annotation(Icon(coordinateSystem(preserveAspectRatio=false)),Diagram(coordinateSystem(preserveAspectRatio=false)));
        end RealConnector;

        partial model RealInterface
            RealConnector realConnector annotation(Placement(transformation(extent={{90,-10},{110,10}})));
        annotation(Icon(coordinateSystem(preserveAspectRatio=false),graphics={Rectangle(extent={{-100,100},{100,-100}},lineColor={28,108,200},fillColor={170,213,255},fillPattern=FillPattern.None)}),Diagram(coordinateSystem(preserveAspectRatio=false)));
        end RealInterface;

        model Source
            extends RealInterface;
            parameter Real k = 0;
        equation 
            k = realConnector.r;
        annotation(Icon(coordinateSystem(preserveAspectRatio=false),graphics={Rectangle(extent={{-80,80},{80,-60}},lineColor={28,108,200},fillColor={151,226,75},fillPattern=FillPattern.Solid), Text(extent={{-100,-60},{100,-100}},lineColor={28,108,200},fillColor={151,226,75},fillPattern=FillPattern.Solid,textString="%name")}),Diagram(coordinateSystem(preserveAspectRatio=false)));
        end Source;

        model User
            extends RealInterface;
            Real double;
        equation 
            double = 2*realConnector.r;
        annotation(Icon(coordinateSystem(preserveAspectRatio=false), graphics={Rectangle(extent={{-80,80},{80,-60}},lineColor={28,108,200},fillColor={85,170,255},fillPattern=FillPattern.Solid), Text(extent={{-100,-60},{100,-100}},lineColor={28,108,200},fillColor={85,170,255},fillPattern=FillPattern.Solid,textString="%name")}),Diagram(coordinateSystem(preserveAspectRatio=false)));
        end User;

        model User_multi
            MultidimConnections.User user annotation(Placement(transformation(extent={{-10,40},{10,60}})));
            MultidimConnections.User user1 annotation(Placement(transformation(extent={{-10,-10},{10,10}})));
            MultidimConnections.User user2 annotation(Placement(transformation(extent={{-10,-60},{10,-40}})));
            RealConnector realConnector[3] annotation(Placement(transformation(extent={{110,-10},{90,10}})));
        equation 
            connect(user.realConnector, realConnector[1]) annotation(Line(points={{10,50},{98,50},{98,-6.66667},{100,-6.66667}}, color={0,0,0}));
            connect(user1.realConnector, realConnector[2]) annotation(Line(points={{10,0},{98,0},{98,4.44089e-16},{100,4.44089e-16}}, color={0,0,0}));
            connect(user2.realConnector, realConnector[3]) annotation(Line(points={{10,-50},{98,-50},{98,6.66667},{100,6.66667}}, color={0,0,0}));
        annotation(Icon(coordinateSystem(preserveAspectRatio=false), graphics={Rectangle(extent={{-80,80},{80,40}},lineColor={28,108,200},fillColor={85,170,255},fillPattern=FillPattern.Solid),Text(extent={{-100,-60},{100,-100}},lineColor={28,108,200},fillColor={85,170,255},fillPattern=FillPattern.Solid,textString="%name"),Rectangle(extent={{-80,28},{80,-12}},lineColor={28,108,200},fillColor={85,170,255},fillPattern=FillPattern.Solid),Rectangle(extent={{-80,-20},{80,-60}},lineColor={28,108,200},fillColor={85,170,255},fillPattern=FillPattern.Solid),Rectangle(extent={{-100,100},{100,-102}}, lineColor={28,108,200})}),Diagram(coordinateSystem(preserveAspectRatio=false)));
        end User_multi;

        model TestCustomReal
            extends Modelica.Icons.Example;
            Source source(k=1) annotation(Placement(transformation(extent={{-60,40},{-40,60}})));
            User user annotation(Placement(transformation(extent={{60,40},{40,60}})));
            User_multi user_multi annotation(Placement(transformation(extent={{60,-10},{40,10}})));
            Source source_arr[3](k=1) annotation(Placement(transformation(extent={{-60,-10},{-40,10}})));
            User_multi user_multi_array[3] annotation(Placement(transformation(extent={{60,-60},{40,-40}})));
            Source source_mat[3,3](k=1) annotation(Placement(transformation(extent={{-60,-60},{-40,-40}})));
        equation 
            connect(source.realConnector, user.realConnector) annotation(Line(points={{-40,50},{40,50}}, color={0,0,0}));
            connect(source_arr.realConnector, user_multi.realConnector) annotation(Line(points={{-40,0},{40,0}}, color={0,0,0}));
            connect(source_mat.realConnector, user_multi_array.realConnector) annotation(Line(points={{-40,-50},{40,-50}}, color={0,0,0}));
        end TestCustomReal;

    annotation(uses(Modelica(version="3.2.3")));
    end MultidimConnections;
...