@@ -144,8 +144,15 @@ function _conversion_shiftordersbyone(L::Jacobi, M::Jacobi)
144144 # Conversion(J, M) = Conversion(Jacobi(M.b, L.a, dm), Jacobi(M.b, M.a, dm))
145145 CLJ = [ConcreteConversion (Jacobi (b- 1 ,L. a,dm), Jacobi (b, L. a, dm)) for b in M. b: - 1 : L. b+ 1 ]
146146 CJM = [ConcreteConversion (Jacobi (M. b,a- 1 ,dm), Jacobi (M. b, a, dm)) for a in M. a: - 1 : L. a+ 1 ]
147- C = [CJM; CLJ]
148- return ConversionWrapper (TimesOperator (C), L, M)
147+ bw = bandwidthssum (bandwidths, CLJ) .+ bandwidthssum (bandwidths, CJM)
148+ bbw = bandwidthssum (blockbandwidths, CLJ) .+ bandwidthssum (blockbandwidths, CJM)
149+ sbbw = bandwidthssum (subblockbandwidths, CLJ) .+ bandwidthssum (subblockbandwidths, CJM)
150+ op1 = isempty (CJM) ? CLJ[1 ] : CJM[1 ]
151+ opend = isempty (CLJ) ? CJM[end ] : CLJ[end ]
152+ ts = (size (op1, 1 ), size (opend, 2 ))
153+ # we deliberately use Operator{T} to improve type-stability in Conversion
154+ C = Operator{eltype (eltype (CLJ))}[CJM; CLJ]
155+ return ConversionWrapper (TimesOperator (C, bw, ts, bbw, sbbw), L, M)
149156end
150157
151158# # Conversion
@@ -162,28 +169,60 @@ function Conversion(L::Jacobi,M::Jacobi)
162169 dm= domain (M)
163170 dl= domain (L)
164171
165- if isapproxinteger (L. a- M. a) && isapproxinteger (L. b- M. b) && M. b >= L. b && M. a >= L. a
166- if isapprox (L. a,M. a) && isapprox (L. b,M. b)
167- return ConversionWrapper (Operator (I,L))
168- elseif (isapprox (L. b+ 1 ,M. b) && isapprox (L. a,M. a)) ||
169- (isapprox (L. b,M. b) && isapprox (L. a+ 1 ,M. a))
172+ La, Lb = L. a, L. b
173+ Ma, Mb = M. a, M. b
174+
175+ if isapproxinteger (La- Ma) && isapproxinteger (Lb- Mb) && Mb >= Lb && Ma >= La
176+ if isapprox (La,Ma) && isapprox (Lb,Mb)
177+ return ConversionWrapper (Operator (I,L), L, M)
178+ elseif (isapprox (Lb+ 1 ,Mb) && isapprox (La,Ma)) ||
179+ (isapprox (Lb,Mb) && isapprox (La+ 1 ,Ma))
170180 return ConcreteConversion (L,M)
171- elseif L. a ≈ L. b && isapproxminhalf (L. a) && M. a ≈ M. b
172- return Conversion (L,Chebyshev (dl),Ultraspherical (M),M)
173- elseif L. a ≈ L. b && M. a ≈ M. b && isapproxminhalf (M. a)
174- return Conversion (L,Ultraspherical (L),Chebyshev (dm),M)
175- elseif L. a ≈ L. b && M. a ≈ M. b
176- return Conversion (L,Ultraspherical (L),Ultraspherical (M),M)
181+ elseif La ≈ Lb && isapproxminhalf (La) && Ma ≈ Mb
182+ C = Chebyshev (dl)
183+ Conv_LC = ConcreteConversion (L, C)
184+ U = Ultraspherical (M)
185+ Conv_UM = ConcreteConversion (U, M)
186+ return ConversionWrapper (Conv_UM * Conversion (C, U) * Conv_LC, L, M)
187+ # return Conversion(L,Chebyshev(dl),Ultraspherical(M),M)
188+ # elseif La ≈ Lb && Ma ≈ Mb && isapproxminhalf(Ma)
189+ # C = Chebyshev(dm)
190+ # Conv_CM = ConcreteConversion(C, M)
191+ # U = Ultraspherical(L)
192+ # Conv_LU = ConcreteConversion(L, U)
193+ # return ConversionWrapper(Conv_CM * Conversion(U, C) * Conv_LU, L, M)
194+ # # return Conversion(L,Ultraspherical(L),Chebyshev(dm),M)
195+ elseif La ≈ Lb && Ma ≈ Mb && ! isapproxminhalf (Ma)
196+ UL = Ultraspherical (L)
197+ Conv_LU = ConcreteConversion (L, UL)
198+ UM = Ultraspherical (M)
199+ Conv_UM = ConcreteConversion (UM, M)
200+ return ConversionWrapper (Conv_UM * ultraconv_nonequal (UL, UM) * Conv_LU, L, M)
201+ # return Conversion(L,Ultraspherical(L),Ultraspherical(M),M)
177202 else
178203 return _conversion_shiftordersbyone (L, M)
179204 end
180- elseif isapproxhalfoddinteger (L. a - M. a) && isapproxhalfoddinteger (L. b - M. b)
181- if L. a ≈ L. b && M. a ≈ M. b && isapproxminhalf (M. a)
182- return Conversion (L,Ultraspherical (L),Chebyshev (dm),M)
183- elseif L. a ≈ L. b && isapproxminhalf (L. a) && M. a ≈ M. b && M. a >= L. a
184- return Conversion (L,Chebyshev (dl),Ultraspherical (M),M)
185- elseif L. a ≈ L. b && M. a ≈ M. b && M. a >= L. a
186- return Conversion (L,Ultraspherical (L),Ultraspherical (M),M)
205+ elseif isapproxhalfoddinteger (La - Ma) && isapproxhalfoddinteger (Lb - Mb)
206+ if La ≈ Lb && Ma ≈ Mb && isapproxminhalf (Ma)
207+ C = Chebyshev (dm)
208+ Conv_CM = ConcreteConversion (C, M)
209+ U = Ultraspherical (L)
210+ Conv_LU = ConcreteConversion (L, U)
211+ return ConversionWrapper (Conv_CM * Conversion (U, C) * Conv_LU, L, M)
212+ # return Conversion(L,Ultraspherical(L),Chebyshev(dm),M)
213+ elseif La ≈ Lb && isapproxminhalf (La) && Ma ≈ Mb && Ma >= La
214+ C = Chebyshev (dl)
215+ Conv_LC = ConcreteConversion (L, C)
216+ U = Ultraspherical (M)
217+ Conv_UM = ConcreteConversion (U, M)
218+ return ConversionWrapper (Conv_UM * Conversion (C, U) * Conv_LC, L, M)
219+ # return Conversion(L,Chebyshev(dl),Ultraspherical(M),M)
220+ elseif La ≈ Lb && Ma ≈ Mb && Ma >= La
221+ UL = Ultraspherical (L)
222+ Conv_LU = ConcreteConversion (L, UL)
223+ UM = Ultraspherical (M)
224+ Conv_UM = ConcreteConversion (UM, M)
225+ return ConversionWrapper (Conv_UM * Conversion (UL, UM) * Conv_LU, L, M)
187226 end
188227 end
189228
@@ -264,7 +303,7 @@ function Conversion(A::Jacobi, B::Chebyshev)
264303 ConversionWrapper (SpaceOperator (ConcreteConversion (Ultraspherical (A), B), A, B))
265304 elseif A. a == A. b
266305 US = Ultraspherical (A)
267- ConversionWrapper (SpaceOperator ( TimesOperator (Conversion (US,B), ConcreteConversion (A,US)), A, B) )
306+ ConversionWrapper (TimesOperator (Conversion (US,B), ConcreteConversion (A,US)), A, B)
268307 else
269308 J = Jacobi (B)
270309 ConcreteConversion (J,B)* Conversion (A,J)
@@ -279,7 +318,7 @@ function Conversion(A::Chebyshev, B::Jacobi)
279318 ConversionWrapper (SpaceOperator (ConcreteConversion (A, Ultraspherical (B)), A, B))
280319 elseif B. a == B. b
281320 US = Ultraspherical (B)
282- ConversionWrapper (SpaceOperator ( TimesOperator (ConcreteConversion (US,B), Conversion (A,US)), A, B) )
321+ ConversionWrapper (TimesOperator (ConcreteConversion (US,B), Conversion (A,US)), A, B)
283322 else
284323 J = Jacobi (A)
285324 Conversion (J,B)* ConcreteConversion (A,J)
@@ -291,16 +330,16 @@ end
291330 @assert domain (A) == domain (B)
292331 if isequalminhalf (A. a) && isequalminhalf (A. b)
293332 C = Chebyshev (domain (A))
294- ConversionWrapper (SpaceOperator (
295- TimesOperator (Conversion (C,B), ConcreteConversion (A,C)), A, B))
333+ ConversionWrapper (
334+ TimesOperator (Conversion (C,B), ConcreteConversion (A,C)), A, B)
296335 elseif isequalminhalf (A. a - order (B)) && isequalminhalf (A. b - order (B))
297336 ConcreteConversion (A,B)
298337 elseif A. a == A. b == 0
299338 ConversionWrapper (SpaceOperator (Conversion (Ultraspherical (A), B), A, B))
300339 elseif A. a == A. b
301340 US = Ultraspherical (A)
302- ConversionWrapper (SpaceOperator (
303- TimesOperator (Conversion (US,B), ConcreteConversion (A,US)), A, B))
341+ ConversionWrapper (
342+ TimesOperator (Conversion (US,B), ConcreteConversion (A,US)), A, B)
304343 else
305344 J = Jacobi (B)
306345 ConcreteConversion (J,B)* Conversion (A,J)
@@ -311,16 +350,16 @@ end
311350 @assert domain (A) == domain (B)
312351 if isequalminhalf (B. a) && isequalminhalf (B. b)
313352 C = Chebyshev (domain (B))
314- ConversionWrapper (SpaceOperator (
315- TimesOperator (ConcreteConversion (C, B), Conversion (A, C)), A, B))
353+ ConversionWrapper (
354+ TimesOperator (ConcreteConversion (C, B), Conversion (A, C)), A, B)
316355 elseif isequalminhalf (B. a - order (A)) && isequalminhalf (B. b - order (A))
317356 ConcreteConversion (A,B)
318357 elseif B. a == B. b == 0
319358 ConversionWrapper (SpaceOperator (Conversion (A, Ultraspherical (B)), A, B))
320359 elseif B. a == B. b
321360 US = Ultraspherical (B)
322- ConversionWrapper (SpaceOperator (
323- TimesOperator (ConcreteConversion (US,B), Conversion (A,US)), A, B))
361+ ConversionWrapper (
362+ TimesOperator (ConcreteConversion (US,B), Conversion (A,US)), A, B)
324363 else
325364 J = Jacobi (A)
326365 Conversion (J,B)* ConcreteConversion (A,J)
0 commit comments