@@ -144,8 +144,15 @@ function _conversion_shiftordersbyone(L::Jacobi, M::Jacobi)
144
144
# Conversion(J, M) = Conversion(Jacobi(M.b, L.a, dm), Jacobi(M.b, M.a, dm))
145
145
CLJ = [ConcreteConversion (Jacobi (b- 1 ,L. a,dm), Jacobi (b, L. a, dm)) for b in M. b: - 1 : L. b+ 1 ]
146
146
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)
149
156
end
150
157
151
158
# # Conversion
@@ -162,28 +169,60 @@ function Conversion(L::Jacobi,M::Jacobi)
162
169
dm= domain (M)
163
170
dl= domain (L)
164
171
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))
170
180
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)
177
202
else
178
203
return _conversion_shiftordersbyone (L, M)
179
204
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)
187
226
end
188
227
end
189
228
@@ -264,7 +303,7 @@ function Conversion(A::Jacobi, B::Chebyshev)
264
303
ConversionWrapper (SpaceOperator (ConcreteConversion (Ultraspherical (A), B), A, B))
265
304
elseif A. a == A. b
266
305
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)
268
307
else
269
308
J = Jacobi (B)
270
309
ConcreteConversion (J,B)* Conversion (A,J)
@@ -279,7 +318,7 @@ function Conversion(A::Chebyshev, B::Jacobi)
279
318
ConversionWrapper (SpaceOperator (ConcreteConversion (A, Ultraspherical (B)), A, B))
280
319
elseif B. a == B. b
281
320
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)
283
322
else
284
323
J = Jacobi (A)
285
324
Conversion (J,B)* ConcreteConversion (A,J)
@@ -291,16 +330,16 @@ end
291
330
@assert domain (A) == domain (B)
292
331
if isequalminhalf (A. a) && isequalminhalf (A. b)
293
332
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)
296
335
elseif isequalminhalf (A. a - order (B)) && isequalminhalf (A. b - order (B))
297
336
ConcreteConversion (A,B)
298
337
elseif A. a == A. b == 0
299
338
ConversionWrapper (SpaceOperator (Conversion (Ultraspherical (A), B), A, B))
300
339
elseif A. a == A. b
301
340
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)
304
343
else
305
344
J = Jacobi (B)
306
345
ConcreteConversion (J,B)* Conversion (A,J)
@@ -311,16 +350,16 @@ end
311
350
@assert domain (A) == domain (B)
312
351
if isequalminhalf (B. a) && isequalminhalf (B. b)
313
352
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)
316
355
elseif isequalminhalf (B. a - order (A)) && isequalminhalf (B. b - order (A))
317
356
ConcreteConversion (A,B)
318
357
elseif B. a == B. b == 0
319
358
ConversionWrapper (SpaceOperator (Conversion (A, Ultraspherical (B)), A, B))
320
359
elseif B. a == B. b
321
360
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)
324
363
else
325
364
J = Jacobi (A)
326
365
Conversion (J,B)* ConcreteConversion (A,J)
0 commit comments