Документация Engee

Подкомпоненты и наследование языка физического моделирования 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(…​) решает две задачи:

  1. Соединяет подкомпоненты между собой;

  2. Соединяет порт подкомпонента с портом основного компонента.

@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