DiffEqOperators

Интерфейс AbstractDiffEqOperator представляет собой интерфейс для объявления частей дифференциального уравнения как линейных или аффинных. Это позволяет решателям использовать линейность для достижения максимальной производительности.

Использование DiffEqOperators

Операторы AbstractDiffEqOperator ведут себя как функции. Если определен, A имеет вызовы функций A(u,p,t) и A(du,u,p,t), которые действуют подобно A*u. Для обновления этих операторов используется функция update_coefficients!(A,u,p,t).

Конструкторы

Заключение массива в оболочку: DiffEqArrayOperator

DiffEqArrayOperator предназначен для определения оператора непосредственно из массива. Оператор имеет следующий вид:

для некоторого скаляра α и времени плюс, возможно, зависимость от состояния A. Конструктор имеет следующий вид.

DiffEqArrayOperator(A::AbstractMatrix{T}, update_func = DEFAULT_UPDATE_FUNC)

A является массивом операторов. update_func(A,u,p,t) — это функция, вызываемая с помощью update_coefficients!(A,u,p,t). Если оставить значение по умолчанию, функция update_func будет тривиальной, что означает, что A — константа.

AffineDiffEqOperator

Для As = (A1,A2,...,An) и Bs = (B1,B2,...,Bm), где каждый из Ai и Bi является оператором AbstractDiffEqOperator, используется следующий конструктор:

AffineDiffEqOperator{T}(As, Bs, u_cache = nothing)

строит оператор L = (A1 + A2 + ... An)*u + B1 + B2 + ... + Bm. Функция u_cache предназначена для обозначения типа внутреннего кэша для невыделяемого вычисления L(du,u,p,t). Если не задано, функция L(du,u,p,t) недоступна. Заметим, что в решениях, использующих эту структуру, вызов данной функции не требуется. Она используется только в качестве резервного варианта в решателях ODE, которые не были разработаны для этой структуры.

Формальные свойства DiffEqOperators

Это формальные свойства, которым должен удовлетворять оператор AbstractDiffEqOperator для работы в решателях.

Описание интерфейса AbstractDiffEqOperator

  1. Вызов и умножение функции: L(du,u,p,t) для выполнения на месте и du = L(u,p,t) для выполнения не на месте, что означает L*u и mul!.

  2. Если оператор не является константой, обновите его с помощью (u,p,t). Изменяемая форма, т. е. update_coefficients!(A,u,p,t), изменяющая внутренние коэффициенты, и форма не на месте B = update_coefficients(A,u,p,t).

  3. Признак isconstant(A), определяющий, является ли оператор константой или нет.

Описание интерфейса AbstractDiffEqLinearOperator

  1. AbstractDiffEqLinearOperator <: AbstractDiffEqOperator

  2. Может поглощать при умножении на скаляр. Во всех алгоритмах постоянно появляются вещи типа dt*L, поэтому линейный оператор должен быть способен поглощать такие константы.

  3. Признак isconstant(A), определяющий, является ли оператор константой или нет.

  4. Необязательно: признаки diagonal, symmetric и т. д. из LinearMaps.jl.

  5. Необязательно: exp(A). Требуется для простой экспоненциальной интеграции.

  6. Необязательно: expv(A,u,t) = exp(t*A)*u и expv!(v,A::DiffEqOperator,u,t). Требуются для простой экспоненциальной интеграции.

  7. Необязательно: разложения. ldiv!, factorize и др. Требуются только для алгоритмов, использующих разложение оператора (Кранк — Николсон), и только в случае применения линейного решателя по умолчанию.