|
2 | 2 | # derivative) using arithmetic or other operator compositions. The composite |
3 | 3 | # operator types are lazy and maintain the structure used to build them. |
4 | 4 |
|
5 | | -# Recursive routines that use `getops` |
6 | | -function update_coefficients!(L::AbstractDiffEqCompositeOperator,u,p,t) |
7 | | - for op in getops(L) |
8 | | - update_coefficients!(op,u,p,t) |
9 | | - end |
10 | | - L |
11 | | -end |
12 | | -isconstant(L::AbstractDiffEqCompositeOperator) = all(isconstant, getops(L)) |
13 | | - |
14 | | -# Scaled operator (α * A) |
15 | | -struct DiffEqScaledOperator{T,F,OpType<:AbstractDiffEqLinearOperator{T}} <: AbstractDiffEqCompositeOperator{T} |
16 | | - coeff::DiffEqScalar{T,F} |
17 | | - op::OpType |
18 | | -end |
19 | | -*(α::DiffEqScalar{T,F}, L::AbstractDiffEqLinearOperator{T}) where {T,F} = DiffEqScaledOperator(α, L) |
20 | | -*(α::Number, L::AbstractDiffEqLinearOperator{T}) where T = DiffEqScaledOperator(DiffEqScalar(convert(T,α)), L) |
21 | | --(L::AbstractDiffEqLinearOperator{T}) where {T} = DiffEqScalar(-one(T)) * L |
22 | | -getops(L::DiffEqScaledOperator) = (L.coeff, L.op) |
23 | | -Matrix(L::DiffEqScaledOperator) = L.coeff * Matrix(L.op) |
24 | | -convert(::Type{AbstractMatrix}, L::DiffEqScaledOperator) = L.coeff * convert(AbstractMatrix, L.op) |
25 | | - |
26 | | -size(L::DiffEqScaledOperator, args...) = size(L.op, args...) |
27 | | -opnorm(L::DiffEqScaledOperator, p::Real=2) = abs(L.coeff) * opnorm(L.op, p) |
28 | | -getindex(L::DiffEqScaledOperator, i::Int) = L.coeff * L.op[i] |
29 | | -getindex(L::DiffEqScaledOperator, I::Vararg{Int, N}) where {N} = |
30 | | - L.coeff * L.op[I...] |
31 | | -*(L::DiffEqScaledOperator, x::AbstractArray) = L.coeff * (L.op * x) |
32 | | -*(x::AbstractArray, L::DiffEqScaledOperator) = (L.op * x) * L.coeff |
33 | | -/(L::DiffEqScaledOperator, x::AbstractArray) = L.coeff * (L.op / x) |
34 | | -/(x::AbstractArray, L::DiffEqScaledOperator) = 1/L.coeff * (x / L.op) |
35 | | -\(L::DiffEqScaledOperator, x::AbstractArray) = 1/L.coeff * (L.op \ x) |
36 | | -\(x::AbstractArray, L::DiffEqScaledOperator) = L.coeff * (x \ L) |
37 | | -for N in (2,3) |
38 | | - @eval begin |
39 | | - mul!(Y::AbstractArray{T,$N}, L::DiffEqScaledOperator{T}, B::AbstractArray{T,$N}) where {T} = |
40 | | - lmul!(Y, L.coeff, mul!(Y, L.op, B)) |
41 | | - end |
42 | | -end |
43 | | -ldiv!(Y::AbstractArray, L::DiffEqScaledOperator, B::AbstractArray) = |
44 | | - lmul!(1/L.coeff, ldiv!(Y, L.op, B)) |
45 | | -factorize(L::DiffEqScaledOperator) = L.coeff * factorize(L.op) |
46 | | -for fact in (:lu, :lu!, :qr, :qr!, :cholesky, :cholesky!, :ldlt, :ldlt!, |
47 | | - :bunchkaufman, :bunchkaufman!, :lq, :lq!, :svd, :svd!) |
48 | | - @eval LinearAlgebra.$fact(L::DiffEqScaledOperator, args...) = |
49 | | - L.coeff * fact(L.op, args...) |
50 | | -end |
51 | 5 |
|
52 | 6 | # Linear Combination |
53 | 7 | struct DiffEqOperatorCombination{T,O<:Tuple{Vararg{AbstractDiffEqLinearOperator{T}}}, |
|
0 commit comments