Skip to content

Commit 30f8910

Browse files
authored
BivariateFun right multiplication by operator (#249)
* bivariate right multiplication by operators * version bump to v0.7.27
1 parent 5430fcd commit 30f8910

File tree

3 files changed

+15
-9
lines changed

3 files changed

+15
-9
lines changed

Project.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
name = "ApproxFunBase"
22
uuid = "fbd15aa5-315a-5a7d-a8a4-24992e37be05"
3-
version = "0.7.26"
3+
version = "0.7.27"
44

55
[deps]
66
AbstractFFTs = "621f4979-c628-5d54-868e-fcf4e3e8185c"

src/PDE/KroneckerOperator.jl

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ KroneckerOperator(A::Fun,B::UniformScaling) = KroneckerOperator(Multiplication(A
3636
KroneckerOperator(A,B::Fun) = KroneckerOperator(A,Multiplication(B))
3737
KroneckerOperator(A::Fun,B) = KroneckerOperator(Multiplication(A),B)
3838

39-
39+
KroneckerOperator(K::KroneckerOperator) = K
40+
KroneckerOperator(T::TimesOperator) = mapfoldr(op -> KroneckerOperator(op), *, T.ops)
4041

4142
function promotedomainspace(K::KroneckerOperator,ds::TensorSpace)
4243
A=promotedomainspace(K.ops[1],ds.spaces[1])
@@ -143,10 +144,9 @@ function subblockbandwidths(K::KroneckerOperator)
143144
end
144145
end
145146

146-
147-
const Wrappers = Union{ConversionWrapper,MultiplicationWrapper,DerivativeWrapper,LaplacianWrapper,
148-
SpaceOperator,ConstantTimesOperator}
149-
147+
const WrapperList = (ConversionWrapper,MultiplicationWrapper,DerivativeWrapper,LaplacianWrapper,
148+
SpaceOperator,ConstantTimesOperator)
149+
const Wrappers = Union{WrapperList...}
150150

151151

152152
isbandedblockbanded(P::Union{PlusOperator,TimesOperator}) = all(isbandedblockbanded,P.ops)
@@ -172,6 +172,7 @@ for FUNC in (:blockbandwidths, :subblockbandwidths, :isbandedblockbanded,:domain
172172
@eval $FUNC(K::Wrappers) = $FUNC(K.op)
173173
end
174174

175+
KroneckerOperator(A::Wrappers) = KroneckerOperator(A.op)
175176

176177
domainspace(K::KroneckerOperator) = K.domainspace
177178
rangespace(K::KroneckerOperator) = K.rangespace
@@ -433,7 +434,7 @@ end
433434
Base.getindex(K::KroneckerOperator, B::ProductFun) = K[LowRankFun(B)]
434435

435436
for F in [:MultivariateFun, :ProductFun, :LowRankFun]
436-
for O in [:DerivativeWrapper, :DefiniteIntegralWrapper]
437+
for O in WrapperList
437438
@eval Base.getindex(K::$O{<:KroneckerOperator}, f::$F) = K.op[f]
438439
@eval (*)(A::$O{<:KroneckerOperator}, B::$F) = A.op * B
439440
@eval (*)(A::$F, B::$O{<:KroneckerOperator}) = A * B.op
@@ -466,5 +467,9 @@ function (*)(lrf::LowRankFun, ko::KroneckerOperator)
466467
end
467468
end
468469

469-
_mulop(P::Operator, ::BivariateSpace, B::ProductFun) = P * LowRankFun(B)
470+
_mulop(pf::ProductFun, ::BivariateSpace, O::Operator) = LowRankFun(pf) * O
471+
_mulop(O::Operator, ::BivariateSpace, pf::ProductFun) = O * LowRankFun(pf)
470472
(*)(P::PlusOperator, lrf::LowRankFun) = sum(op -> op*lrf, P.ops)
473+
(*)(lrf::LowRankFun, P::PlusOperator) = sum(op -> lrf*op, P.ops)
474+
(*)(lrf::LowRankFun, T::TimesOperator) = (lrf * T.ops[1]) * foldr(*, T.ops[2:end])
475+
(*)(T::TimesOperator, lrf::LowRankFun) = foldr(*, T.ops[1:end-1]) * (T.ops[end] * lrf)

src/PDE/PDE.jl

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,4 +69,5 @@ function _mulop(B::Operator, ::UnivariateSpace, f::ProductFun)
6969
end
7070
*(B::Operator,f::ProductFun) = _mulop(B, domainspace(B), f)
7171

72-
*(f::ProductFun,B::Operator) = transpose(B*(transpose(f)))
72+
_mulop(f::ProductFun, ::UnivariateSpace, B::Operator) = transpose(B*(transpose(f)))
73+
*(f::ProductFun,B::Operator) = _mulop(f, domainspace(B), B)

0 commit comments

Comments
 (0)