Skip to content

Commit 8c71a98

Browse files
committed
improve sequence generation in airybi_levin
1 parent bc39976 commit 8c71a98

File tree

2 files changed

+44
-39
lines changed

2 files changed

+44
-39
lines changed

src/AiryFunctions/AiryFunctions.jl

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,4 +14,4 @@ export airybiprimex
1414
include("airy.jl")
1515
include("cairy.jl")
1616

17-
end
17+
end

src/AiryFunctions/cairy.jl

Lines changed: 43 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -378,17 +378,14 @@ end
378378

379379
t = GAMMA_ONE_SIXTH(T) * GAMMA_FIVE_SIXTHS(T) / 4
380380
t2 = 1 / t
381-
382381
a = @fastmath inv(4*xsqrx)
383382
a2 = 4 * xsqrx
384383

385384
s = zero(typeof(x))
386385
l = @ntuple $N i -> begin
387386
s += t
388-
389387
t *= -a * (3 * (i - 5//6) * (i - 1//6) / i)
390388
t2 *= -a2 * (i / (3 * (i - 5//6) * (i - 1//6)))
391-
392389
Vec{4, T}((reim(s * t2)..., reim(t2)...))
393390
end
394391
return levin_transform(l) / (T(π)^(3//2) * sqrt(xsqr))
@@ -403,17 +400,14 @@ end
403400

404401
t = -GAMMA_ONE_SIXTH(T) * GAMMA_FIVE_SIXTHS(T) / 4
405402
t2 = 1 / t
406-
407403
a = @fastmath inv(4*xsqrx)
408404
a2 = 4 * xsqrx
409405

410406
s = zero(typeof(x))
411407
l = @ntuple $N i -> begin
412408
s += t
413-
414409
t *= -a * (3 * (i - 7//6) * (i + 1//6) / i)
415410
t2 *= -a2 * (i / (3 * (i - 7//6) * (i + 1//6)))
416-
417411
Vec{4, T}((reim(s * t2)..., reim(t2)...))
418412
end
419413
return levin_transform(l) * sqrt(xsqr) / T(π)^(3//2)
@@ -424,27 +418,33 @@ end
424418
@generated function airybi_levin(x::Complex{T}, ::Val{N}) where {T <: Union{Float32, Float64}, N}
425419
:(
426420
begin
421+
427422
xsqr = sqrt(x)
428-
out = zero(typeof(x))
429-
t = GAMMA_ONE_SIXTH(T) * GAMMA_FIVE_SIXTHS(T) / 4
430-
a = T(0.25) / (xsqr*x)
423+
xsqrx = xsqr * x
431424

432-
l = @ntuple $N i -> begin
433-
out += t
434-
t *= -3 * a * (i - 5//6) * (i - 1//6) / i
435-
invt = @fastmath inv(t)
436-
Vec{4, T}((reim(out * invt)..., reim(invt)...))
437-
end
438-
out = zero(typeof(x))
439425
t = GAMMA_ONE_SIXTH(T) * GAMMA_FIVE_SIXTHS(T) / 4
440-
l2 = @ntuple $N i -> begin
441-
out += t
442-
t *= 3 * a * (i - 5//6) * (i - 1//6) / i
443-
invt = @fastmath inv(t)
444-
Vec{4, T}((reim(out * invt)..., reim(invt)...))
426+
t2 = 1 / t
427+
a = inv(4*xsqrx)
428+
a2 = 4 * xsqrx
429+
430+
s = zero(typeof(x))
431+
s2 = zero(typeof(x))
432+
m = 1
433+
@nexprs $N i -> begin
434+
s += t
435+
s2 += t * m
436+
t *= -a * (3 * (i - 5//6) * (i - 1//6) / i)
437+
t2 *= -a2 * (i / (3 * (i - 5//6) * (i - 1//6)))
438+
l_{i} = Vec{4, T}((reim(s * t2)..., reim(t2)...))
439+
w_{i} = Vec{4, T}((reim(s2 * t2 * m)..., reim(t2 * m)...))
440+
m *= -1
445441
end
442+
443+
l = @ntuple $N i -> l_{i}
444+
w = @ntuple $N i -> w_{i}
445+
446446
e = exp(-2/3 * x * sqrt(x))
447-
return @fastmath (e*im*levin_transform(l) + 2*levin_transform(l2)/e) / (sqrt(T(π)^3) * sqrt(xsqr))
447+
return @fastmath (e*im*levin_transform(l) + 2*levin_transform(w)/e) / (sqrt(T(π)^3) * sqrt(xsqr))
448448
end
449449
)
450450
end
@@ -453,26 +453,31 @@ end
453453
:(
454454
begin
455455
xsqr = sqrt(x)
456-
out = zero(typeof(x))
457-
t = GAMMA_ONE_SIXTH(T) * GAMMA_FIVE_SIXTHS(T) / 4
458-
a = T(0.25) / (xsqr*x)
456+
xsqrx = xsqr * x
459457

460-
l = @ntuple $N i -> begin
461-
out += t
462-
t *= -3 * a * (i - 7//6) * (i + 1//6) / i
463-
invt = @fastmath inv(t)
464-
Vec{4, T}((reim(out * invt)..., reim(invt)...))
465-
end
466-
out = zero(typeof(x))
467458
t = GAMMA_ONE_SIXTH(T) * GAMMA_FIVE_SIXTHS(T) / 4
468-
l2 = @ntuple $N i -> begin
469-
out += t
470-
t *= 3 * a * (i - 7//6) * (i + 1//6) / i
471-
invt = @fastmath inv(t)
472-
Vec{4, T}((reim(out * invt)..., reim(invt)...))
459+
t2 = 1 / t
460+
a = inv(4*xsqrx)
461+
a2 = 4 * xsqrx
462+
463+
s = zero(typeof(x))
464+
s2 = zero(typeof(x))
465+
m = 1
466+
@nexprs $N i -> begin
467+
s += t
468+
s2 += t * m
469+
t *= -a * (3 * (i - 7//6) * (i + 1//6) / i)
470+
t2 *= -a2 * (i / (3 * (i - 7//6) * (i + 1//6)))
471+
l_{i} = Vec{4, T}((reim(s * t2)..., reim(t2)...))
472+
w_{i} = Vec{4, T}((reim(s2 * t2 * m)..., reim(t2 * m)...))
473+
m *= -1
473474
end
475+
476+
l = @ntuple $N i -> l_{i}
477+
w = @ntuple $N i -> w_{i}
478+
474479
e = exp(-2/3 * x * sqrt(x))
475-
return @fastmath -(e*im*levin_transform(l) - 2*levin_transform(l2)/e) * sqrt(xsqr) / (sqrt(T(π)^3))
480+
return -(e*im*levin_transform(l) - 2*levin_transform(w)/e) * sqrt(xsqr) / (sqrt(T(π)^3))
476481
end
477482
)
478483
end

0 commit comments

Comments
 (0)