@@ -36,7 +36,8 @@ KroneckerOperator(A::Fun,B::UniformScaling) = KroneckerOperator(Multiplication(A
36
36
KroneckerOperator (A,B:: Fun ) = KroneckerOperator (A,Multiplication (B))
37
37
KroneckerOperator (A:: Fun ,B) = KroneckerOperator (Multiplication (A),B)
38
38
39
-
39
+ KroneckerOperator (K:: KroneckerOperator ) = K
40
+ KroneckerOperator (T:: TimesOperator ) = mapfoldr (op -> KroneckerOperator (op), * , T. ops)
40
41
41
42
function promotedomainspace (K:: KroneckerOperator ,ds:: TensorSpace )
42
43
A= promotedomainspace (K. ops[1 ],ds. spaces[1 ])
@@ -143,10 +144,9 @@ function subblockbandwidths(K::KroneckerOperator)
143
144
end
144
145
end
145
146
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... }
150
150
151
151
152
152
isbandedblockbanded (P:: Union{PlusOperator,TimesOperator} ) = all (isbandedblockbanded,P. ops)
@@ -172,6 +172,7 @@ for FUNC in (:blockbandwidths, :subblockbandwidths, :isbandedblockbanded,:domain
172
172
@eval $ FUNC (K:: Wrappers ) = $ FUNC (K. op)
173
173
end
174
174
175
+ KroneckerOperator (A:: Wrappers ) = KroneckerOperator (A. op)
175
176
176
177
domainspace (K:: KroneckerOperator ) = K. domainspace
177
178
rangespace (K:: KroneckerOperator ) = K. rangespace
433
434
Base. getindex (K:: KroneckerOperator , B:: ProductFun ) = K[LowRankFun (B)]
434
435
435
436
for F in [:MultivariateFun , :ProductFun , :LowRankFun ]
436
- for O in [ :DerivativeWrapper , :DefiniteIntegralWrapper ]
437
+ for O in WrapperList
437
438
@eval Base. getindex (K:: $O{<:KroneckerOperator} , f:: $F ) = K. op[f]
438
439
@eval (* )(A:: $O{<:KroneckerOperator} , B:: $F ) = A. op * B
439
440
@eval (* )(A:: $F , B:: $O{<:KroneckerOperator} ) = A * B. op
@@ -466,5 +467,9 @@ function (*)(lrf::LowRankFun, ko::KroneckerOperator)
466
467
end
467
468
end
468
469
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)
470
472
(* )(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)
0 commit comments