Библиотека Parametrised Modelica и возможность «отложить» настройку структурного параметра - часть 3 - PullRequest
2 голосов
/ 22 февраля 2020

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

Пример ниже является очень кратким примером, иллюстрирующим один из способов сделать это разделение кода. Здесь я позволю значению 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.

Итак, мои вопросы:

  1. Мне кажется, лучше оставить n c неопределенным, а затем убедиться, что значение установлено во время компиляции, в то время как Изменение константы во время компиляции выглядит сомнительным, но, возможно, (все еще) допускается в Modelica. В спецификации языка Modelica я могу видеть в Приложении A, что требованием к константе является (только), чтобы она была постоянной во время моделирования, т.е. не во время компиляции. В приложении E8.2 я вижу, что, возможно, следует выполнить начальное присвоение n c, но не уверен. Буду признателен за некоторые комментарии по этому поводу.
  2. Как могло случиться, что с несколько более крупными примерами компиляторов JModelica и OpenModelica выдают предупреждение и ошибку, соответственно?
  3. Что спецификация Modelica говорит о том, что здесь находится?

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

Ответы [ 2 ]

0 голосов
/ 26 февраля 2020

Теперь я получил подтверждение того, что мой опубликованный код действительно верный, и для частичного пакета (или модели) вы можете определить переменные, которые не имеют значений или векторов с неопределенным размером, при условии, что они во время компиляции полностью определены. Более сложный код с похожей структурой, который создал проблему, о которой я говорил, теперь также решается Код работает как на ночной сборке JModelica 2.14, так и на OpenModelica 1.16 ... b48. Интересно, что код не работает на версии 1.15 или более ранней. Благодаря моему контакту в Modelon, Маркус Олссон!

0 голосов
/ 24 февраля 2020

1) Теоретически я понимаю, что вы имеете в виду, но стандарт языка modelica требует, чтобы каждая модель (кроме коннекторов и частичных моделей) была действительной сама по себе. Похоже, что это не относится к вашему случаю, так как вы определили частичный пакет, проблема в том, что вы определили массив в той же области видимости, которая структурно зависит от этой переменной. Поэтому я настоятельно рекомендую указать значение по умолчанию, которое можно проверить.

2) Я действительно не могу воспроизвести проблему. С OpenModelica все работает нормально даже для nc=10000. Медленно, но это работает (в будущем мы работаем над ускорением работы с массивами / векторами). Я работаю с ночной сборкой (OpenModelica 1.16.0 ~ dev-102-g5c1a023).

3) См. 1). В общем, я могу просто добавить, что вы должны использовать Проверочную модель (одиночная галочка на зеленом круге вверху посередине) на самом компоненте индивидуально, чтобы проверить, все ли вы делаете, соответствует языку modelica. Вы также можете использовать кнопку создания рядом с ней, чтобы посмотреть на плоскую модель, которая будет сгенерирована из вашего кода.

Кроме того, я бы рекомендовал использовать флаг компиляции -d=newInst (при условии, что вы работаете над одной из более новых версий). При этом используется новый экземпляр, который является более строгим по спецификации modelica и гораздо более эффективным.

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