Skip to content

Commit 172df11

Browse files
authored
Parameterize operator in LowRankOperator (#436)
1 parent 0ce2b6a commit 172df11

File tree

1 file changed

+14
-15
lines changed

1 file changed

+14
-15
lines changed

src/Operators/almostbanded/LowRankOperator.jl

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@ export AbstractLowRankOperator, LowRankOperator
22

33
abstract type AbstractLowRankOperator{T} <: Operator{T} end
44

5-
struct LowRankOperator{S<:Space,T} <: AbstractLowRankOperator{T}
5+
struct LowRankOperator{S<:Space,T,O<:Operator{T}} <: AbstractLowRankOperator{T}
66
U::Vector{VFun{S,T}}
7-
V::Vector{Operator{T}}
7+
V::Vector{O}
88

9-
function LowRankOperator{S,T}(U::Vector{VFun{S,T}},V::Vector{Operator{T}}) where {S,T}
9+
function LowRankOperator{S,T}(U::Vector{VFun{S,T}}, V::Vector{O}) where {S,T,O<:Operator{T}}
1010
@assert all(isafunctional,V)
1111

1212
@assert length(U) == length(V)
@@ -19,19 +19,18 @@ struct LowRankOperator{S<:Space,T} <: AbstractLowRankOperator{T}
1919
for k=2:length(U)
2020
@assert space(U[k])==rs
2121
end
22-
new{S,T}(U,V)
22+
new{S,T,O}(U,V)
2323
end
2424
end
2525

2626

2727

28-
LowRankOperator(U::Vector{VFun{S,T}},V::Vector{Operator{T}}) where {S,T} = LowRankOperator{S,T}(U,V)
29-
LowRankOperator(U::Vector{VFun{S,T1}},V::Vector{Operator{T2}}) where {S,T1,T2} =
30-
LowRankOperator(strictconvert(Vector{VFun{S,promote_type(T1,T2)}},U),
31-
strictconvert(Vector{Operator{promote_type(T1,T2)}},V))
32-
LowRankOperator(U::Vector{FF},V::Vector{FT}) where {FF<:Fun,FT<:Operator} =
33-
LowRankOperator(U,strictconvert(Vector{Operator{eltype(FT)}},V))
34-
28+
LowRankOperator(U::Vector{VFun{S,T}}, V::Vector{<:Operator{T}}) where {S,T} = LowRankOperator{S,T}(U,V)
29+
function LowRankOperator(U::Vector{VFun{S,T1}}, V::Vector{<:Operator}) where {S,T1}
30+
T2 = eltype(eltype(v))
31+
T = promote_type(T1,T2)
32+
LowRankOperator(strictconvert(Vector{VFun{S,T}},U), map(Operator{T}, V))
33+
end
3534

3635

3736
LowRankOperator(B::AbstractVector,S...) = LowRankOperator(strictconvert(Vector{Operator{Float64}},B),S...)
@@ -54,11 +53,11 @@ rangespace(L::LowRankOperator) = space(first(L.U))
5453
promoterangespace(L::LowRankOperator,sp::Space) = LowRankOperator(map(u->Fun(u,sp),L.U),L.V)
5554
promotedomainspace(L::LowRankOperator,sp::Space) = LowRankOperator(L.U,map(v->promotedomainspace(v,sp),L.V))
5655

57-
function Base.getindex(L::LowRankOperator,k::Integer,j::Integer)
56+
function Base.getindex(L::LowRankOperator, k::Integer,j::Integer)
5857
ret=zero(eltype(L))
59-
for p=1:length(L.U)
60-
if kncoefficients(L.U[p])
61-
ret+=L.U[p].coefficients[k]*L.V[p][j]
58+
for p in eachindex(L.U)
59+
if k ncoefficients(L.U[p])
60+
ret += coefficient(L.U[p], k) * L.V[p][j]
6261
end
6362
end
6463
ret

0 commit comments

Comments
 (0)