2015-04-02 4 views
0

Позвольте A быть частичной моделью и C, D быть моделями, которые распространяются A. С учетом моделиModelica массив частичной модели

partial model X 
    A a[3]; 
end X; 

Как я могу создать экземпляр X, например. что-то вдоль линий

A X.a = {C,D,C}; 

Update: Я пробовал 2 варианта. Одним из них является

package P 
    partial model A end A; 
    model B extends A; end B; 
    model C extends A; end C; 
    partial model X 
    A a[3]; 
    end X; 
    model Y extends X(a={c,b,c}); 
    B b; 
    C c; 
    end Y; 
end P; 

, который завершается с предупреждением «Может только набор входов, параметры и переменные с по умолчанию, но модифицировали.». Другой является

package P 
    partial model A end A; 
    model B extends A; end B; 
    model C extends A; end C; 
    partial model X 
    replaceable A a[3]; 
    end X; 
    model Y extends X; 
    redeclare A a={c,b,c}; 
    B b; 
    C c; 
    end Y; 
end P; 

, который завершается с ошибкой «Компонент А = {с, Ь, с}, но ранее а = < < Пустые >>. Компоненты не являются идентичными.»

Обратите внимание, что это возможно.

package P 
    partial model A end A; 
    model B extends A; end B; 
    model C extends A; end C; 
    partial model X 
    A a[3] = {a1,a2,a3}; 
    replaceable A a1,a2,a3; 
    end X; 
    model Y extends X; 
    redeclare B a1; 
    redeclare C a2; 
    redeclare B a3; 
    end Y; 
end P; 

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

package P 
    partial model A end A; 
    model B extends A; end B; 
    model C extends A; end C; 
    partial model X 
    parameter Integer N; 
    replaceable A a[N] = fill(ai,N); 
    A ai; 
    end X; 
    model Y extends X(N=3); 
    redeclare A a[3] = {b,c,b}; 
    B b; 
    C c; 
    end Y; 
end P; 
+0

Вам действительно нужно, чтобы 'A' был' partial'? Ваш последний пример компилируется, если вы удаляете ключевое слово 'partial' до' model A end A; '. Объявление 'A' как' partial', а затем инициализация его с помощью A A [...] 'является противоречием. – Tobias

+0

Вы правы, это противоречие. Тем не менее, я бы хотел, чтобы A был частичным, поскольку он должен действовать как абстрактный абстрактный тип, который не должен быть создан. У вас есть идея, как это сделать в Modelica? – Mathabc

ответ

1

AFAIKpartial ключевое слово означает, что ваша модель не может быть обработан, так что вам, возможно, придется extend X тоже.

2

Да. Неправомерно создавать экземпляр частичной модели, не расширяя ее из нелеченной модели. Что-то вроде этого могло бы работать:

model Y 
    extend X(a = {C, D, C}); 
end Y; 

Тогда Y.a - это то, что вы хотите.

+0

Я пробовал 2 варианта, как описано в моей публикации, но оба не работают. У вас есть идея, как это сделать правильно? – Mathabc

+0

Насколько я знаю, типы элементов массива должны быть одинаковыми, подтип там не применяется. Поэтому я не думаю, что вы можете назначать компоненты разных типов (даже через extends) для разных элементов массива. –

+0

Это было бы очень неудачно. Это основной элемент ориентации объекта. Знаете ли вы о каком-либо «трюке», как достичь того, что я хочу, а именно представляют собой набор элементов базового типа? – Mathabc

Смежные вопросы