Skip to content

Commit 66152f7

Browse files
authored
preserve spaces in tensorspace Conversion (#308)
* preserve spaces in tensorspace Conversion * spaces in mul for kronprodop
1 parent 826a9ee commit 66152f7

File tree

2 files changed

+23
-12
lines changed

2 files changed

+23
-12
lines changed

src/Operators/general/algebra.jl

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -334,8 +334,9 @@ end
334334
op = op2 : domainspace(op1) rangespace(op2)
335335
return [op], bandwidths(op)
336336
else
337-
op1_dsp = op1:rangespace(op2)
338-
return [op1_dsp, op2], bandwidthssum((op1_dsp, op2))
337+
op2_dsp = op2:dsp
338+
op1_dsp = op1:rangespace(op2_dsp)
339+
return [op1_dsp, op2_dsp], bandwidthssum((op1_dsp, op2_dsp))
339340
end
340341
end
341342

@@ -549,14 +550,15 @@ collateops(op, As::Operator...) = collateops(op, Val(anyplustimes(op, As...)), A
549550
collateops(op, ::Val{true}, As...) = mapreduce(x -> _extractops(x, op), vcat, As)
550551
collateops(op, ::Val{false}, As...) = As
551552

552-
function *(A::Operator,B::Operator)
553+
*(A::Operator,B::Operator) = A_mul_B(A, B)
554+
function A_mul_B(A::Operator, B::Operator; dspB = domainspace(B), rspA = rangespace(A))
553555
if isconstop(A)
554-
promoterangespace(strictconvert(Number,A)*B,rangespace(A))
556+
promoterangespace(strictconvert(Number,A)*B, rspA)
555557
elseif isconstop(B)
556-
promotedomainspace(strictconvert(Number,B)*A,domainspace(B))
558+
promotedomainspace(strictconvert(Number,B)*A, dspB)
557559
else
558560
promotetimes(collateops(*, A, B),
559-
domainspace(B), _timessize((A,B)), false)
561+
dspB, _timessize((A,B)), false)
560562
end
561563
end
562564

src/PDE/KroneckerOperator.jl

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -208,8 +208,15 @@ function getindex(KO::KroneckerOperator,k::Integer)
208208
end
209209

210210

211-
*(A::KroneckerOperator,B::KroneckerOperator) =
212-
KroneckerOperator(A.ops[1]*B.ops[1],A.ops[2]*B.ops[2])
211+
function *(A::KroneckerOperator, B::KroneckerOperator)
212+
dspB = domainspace(B)
213+
rspA = rangespace(A)
214+
A1, A2 = A.ops
215+
B1, B2 = B.ops
216+
AB1 = A_mul_B(A1, B1; dspB = factor(dspB,1), rspA = factor(rspA,1))
217+
AB2 = A_mul_B(A2, B2; dspB = factor(dspB,2), rspA = factor(rspA,2))
218+
KroneckerOperator(AB1, AB2, dspB, rspA)
219+
end
213220

214221

215222

@@ -390,10 +397,12 @@ ConcreteConversion(a::BivariateSpace,b::BivariateSpace) =
390397
ConcreteConversion{typeof(a),typeof(b),
391398
promote_type(prectype(a),prectype(b))}(a,b)
392399

393-
Conversion(a::TensorSpace,b::TensorSpace) = ConversionWrapper(promote_type(prectype(a),prectype(b)),
394-
KroneckerOperator(Conversion(a.spaces[1],b.spaces[1]),Conversion(a.spaces[2],b.spaces[2])))
395-
396-
400+
function Conversion(a::TensorSpace2D,b::TensorSpace2D)
401+
C1 = Conversion(a.spaces[1],b.spaces[1])
402+
C2 = Conversion(a.spaces[2],b.spaces[2])
403+
K = KroneckerOperator(C1, C2, a, b)
404+
ConversionWrapper(promote_type(prectype(a),prectype(b)), K)
405+
end
397406

398407
function Multiplication(f::Fun{<:TensorSpace}, S::TensorSpace)
399408
lr = LowRankFun(f)

0 commit comments

Comments
 (0)