Подкомпоненты и наследование языка физического моделирования Engee
|
Страница в процессе разработки. |
В этой статье разберем, как с помощью языка физического моделирования Engee можно строить более сложные модели за счет сборки из подкомпонентов. Этот механизм позволяет организовывать иерархию элементов, делать модели переиспользуемыми и более компактными.
Наследование компонентов
Иногда новый компонент очень похож на уже существующий, и нет смысла переписывать все заново. Для этого в языке физического моделирования Engee используется конструкция @extend, которая позволяет наследовать переменные и уравнения из другого физического компонента.
@extend Branch
@extend Branch(i = 0)
Все параметры/переменные/подкомпоненты с access=Public из Branch будут автоматически видимы в наследующемся компоненте.
Применять @extend можно только один раз внутри одного компонента.
|
Подкомпоненты
Подкомпоненты — это обычные физические компоненты, которые мы встраиваем внутрь других физических компонентов. Они создаются с помощью конструкции @components.
@components begin
diode = EngeePhysicalFoundation.Electrical.Elements.PieceWiseLinearDiode(v_forward = 0.6, R_on = 0.3, G_off = 1e-8)
capacitor = EngeePhysicalFoundation.Electrical.Elements.Capacitor(C = 1e-4)
end
Здесь в новый компонент добавлены два подкомпонента: диод и конденсатор. В аргументах конструктора подкомпонента можно сразу задать параметры (v_forward, R_on, C и т.д.).
Пример с передачей значений
В качестве значений параметров подкомпонентов можно использовать параметры основного компонента, при этом единицы измерения указывать не нужно.
@engeemodel A begin
@variables begin
a = 1
b[:] = [1, 2]
end
@parameters begin
c = 3
d[:] = [3, 4]
end
@equations begin
a^2 ~ 2
b[1] * b[2] ~ 5
b[1]^2 ~ 12
end
end
@engeemodel B begin
@components begin
a1 = A(a = 2, b = [3, 4.0], c = 1, d = [5, 6])
a2 = A(a = e, b = f*2, c = sin(e), d = f .+ 2)
end
@parameters begin
e = 3
f[:] = [3,4]
end
end
В этом примере:
-
Для
a1значения передаются напрямую: числами и массивами; -
Для
a2используются параметры компонентаB:e,f; -
При передаче значений можно использовать выражения:
f*2,sin(e),f .+ 2; -
Единицы измерения указывать не нужно — Engee автоматически использует единицы из объявления параметров в компоненте
A.
Массивы подкомпонентов
Подкомпоненты можно задавать не только по одному, но и массивами.
@engeemodel ArrayExample begin
@components begin
res = [EngeePhysicalFoundation.Electrical.Elements.Resistor() for i in 1:5]
cap = [EngeePhysicalFoundation.Electrical.Elements.Capacitor() for i in 1:3]
end
end
Особенности:
-
Обращение к подкомпонентам выполняется как к обычным массивам Julia. Пример:
connect(diode[1].p, capacitor[3].p). -
Имена элементов для внешнего использования будут вида
diode_1,diode_2, … иcapacitor_1,capacitor_2, …
Это удобно, если нужно подключить сразу группу одинаковых элементов (например, несколько диодов или конденсаторов).
Соединения подкомпонентов
Функция connect(…) решает две задачи:
-
Соединяет подкомпоненты между собой;
-
Соединяет порт подкомпонента с портом основного компонента.
@engeemodel RC begin
@nodes begin
p = EngeePhysicalFoundation.Electrical.Pin
n = EngeePhysicalFoundation.Electrical.Pin
end
@components begin
r = EngeePhysicalFoundation.Electrical.Elements.Resistor(R = 1000)
c = EngeePhysicalFoundation.Electrical.Elements.Capacitor(C = 1e-6)
end
@equations begin
connect(r.n, c.p) # (1) соединяем подкомпоненты между собой
connect(p, r.p) # (2) соединяем порт r.p с внешним портом p
connect(c.n, n) # (2) соединяем порт c.n с внешним портом n
end
end