Skip to content

Commit 7e15273

Browse files
committed
repl. a with fct=a.copy(), so input is not changed
1 parent b27167a commit 7e15273

File tree

1 file changed

+43
-40
lines changed

1 file changed

+43
-40
lines changed

pyfftlog.py

Lines changed: 43 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -454,27 +454,28 @@ def fftl(a, xsave, rk=1, tdir=1):
454454
Transformed array Ã(k): a(j) is Ã(k_j) at k_j = k_c exp[(j-jc) dlnr].
455455
456456
"""
457+
fct = a.copy()
457458
q = xsave[0]
458459
dlnr = xsave[1]
459460
kr = xsave[2]
460461

461462
# centre point of array
462-
jc = np.array((a.size + 1)/2.0)
463-
j = np.arange(a.size)+1
463+
jc = np.array((fct.size + 1)/2.0)
464+
j = np.arange(fct.size)+1
464465

465466
# a(r) = A(r) (r/rc)^[-dir*(q-.5)]
466-
a *= np.exp(-tdir*(q - 0.5)*(j - jc)*dlnr)
467+
fct *= np.exp(-tdir*(q - 0.5)*(j - jc)*dlnr)
467468

468469
# transform a(r) -> ã(k)
469-
a = fhtq(a, xsave, tdir)
470+
fct = fhtq(fct, xsave, tdir)
470471

471472
# Ã(k) = ã(k) k^[-dir*(q+.5)] rc^[-dir*(q-.5)]
472473
# = ã(k) (k/kc)^[-dir*(q+.5)] (kc rc)^(-dir*q) (rc/kc)^(dir*.5)
473474
lnkr = np.log(kr)
474475
lnrk = np.log(rk)
475-
a *= np.exp(-tdir*((q + 0.5)*(j - jc)*dlnr + q*lnkr - lnrk/2.0))
476+
fct *= np.exp(-tdir*((q + 0.5)*(j - jc)*dlnr + q*lnkr - lnrk/2.0))
476477

477-
return a
478+
return fct
478479

479480

480481
def fht(a, xsave, tdir=1):
@@ -529,27 +530,28 @@ def fht(a, xsave, tdir=1):
529530
Transformed array Ã(k): a(j) is Ã(k_j) at k_j = k_c exp[(j-jc) dlnr].
530531
531532
"""
533+
fct = a.copy()
532534
q = xsave[0]
533535
dlnr = xsave[1]
534536
kr = xsave[2]
535537

536538
# a(r) = A(r) (r/rc)^(-dir*q)
537539
if q != 0:
538540
# centre point of array
539-
jc = np.array((a.size + 1)/2.0)
540-
j = np.arange(a.size)+1
541-
a *= np.exp(-tdir*q*(j - jc)*dlnr)
541+
jc = np.array((fct.size + 1)/2.0)
542+
j = np.arange(fct.size)+1
543+
fct *= np.exp(-tdir*q*(j - jc)*dlnr)
542544

543545
# transform a(r) -> ã(k)
544-
a = fhtq(a, xsave, tdir)
546+
fct = fhtq(fct, xsave, tdir)
545547

546548
# Ã(k) = ã(k) (k rc)^(-dir*q)
547549
# = ã(k) (k/kc)^(-dir*q) (kc rc)^(-dir*q)
548550
if q != 0:
549551
lnkr = np.log(kr)
550-
a *= np.exp(-tdir*q*((j - jc)*dlnr + lnkr))
552+
fct *= np.exp(-tdir*q*((j - jc)*dlnr + lnkr))
551553

552-
return a
554+
return fct
553555

554556

555557
def fhtq(a, xsave, tdir=1):
@@ -592,47 +594,48 @@ def fhtq(a, xsave, tdir=1):
592594
dlnr].
593595
594596
"""
597+
fct = a.copy()
595598
q = xsave[0]
596-
n = a.size
599+
n = fct.size
597600

598601
# normal FFT
599-
# a = rfft(a)
600-
# _raw_fft(a, n, -1, 1, 1, _fftpack.drfft)
601-
a = drfft(a, n, 1, 0)
602+
# fct = rfft(fct)
603+
# _raw_fft(fct, n, -1, 1, 1, _fftpack.drfft)
604+
fct = drfft(fct, n, 1, 0)
602605

603606
m = np.arange(1, n/2, dtype=int) # index variable
604607
if q == 0: # unbiased (q = 0) transform
605608
# multiply by (kr)^[- i 2 m pi/(n dlnr)] U_mu[i 2 m pi/(n dlnr)]
606-
ar = a[2*m-1]
607-
ai = a[2*m]
608-
a[2*m-1] = ar*xsave[2*m+1] - ai*xsave[2*m+2]
609-
a[2*m] = ar*xsave[2*m+2] + ai*xsave[2*m+1]
609+
ar = fct[2*m-1]
610+
ai = fct[2*m]
611+
fct[2*m-1] = ar*xsave[2*m+1] - ai*xsave[2*m+2]
612+
fct[2*m] = ar*xsave[2*m+2] + ai*xsave[2*m+1]
610613
# problem(2*m)atical last element, for even n
611614
if np.mod(n, 2) == 0:
612615
ar = xsave[-2]
613616
if (tdir == 1): # forward transform: multiply by real part
614617
# Why? See http://casa.colorado.edu/~ajsh/FFTLog/index.html#ure
615-
a[-1] *= ar
618+
fct[-1] *= ar
616619
elif (tdir == -1): # backward transform: divide by real part
617620
# Real part ar can be zero for maximally bad choice of kr.
618621
# This is unlikely to happen by chance, but if it does, policy
619622
# is to let it happen. For low-ringing kr, imaginary part ai
620623
# is zero by construction, and real part ar is guaranteed
621624
# nonzero.
622-
a[-1] /= ar
625+
fct[-1] /= ar
623626

624627
else: # biased (q != 0) transform
625628
# multiply by (kr)^[- i 2 m pi/(n dlnr)] U_mu[q + i 2 m pi/(n dlnr)]
626629
# phase
627-
ar = a[2*m-1]
628-
ai = a[2*m]
629-
a[2*m-1] = ar*xsave[3*m+2] - ai*xsave[3*m+3]
630-
a[2*m] = ar*xsave[3*m+3] + ai*xsave[3*m+2]
630+
ar = fct[2*m-1]
631+
ai = fct[2*m]
632+
fct[2*m-1] = ar*xsave[3*m+2] - ai*xsave[3*m+3]
633+
fct[2*m] = ar*xsave[3*m+3] + ai*xsave[3*m+2]
631634

632635
if tdir == 1: # forward transform: multiply by amplitude
633-
a[0] *= xsave[3]
634-
a[2*m-1] *= xsave[3*m+1]
635-
a[2*m] *= xsave[3*m+1]
636+
fct[0] *= xsave[3]
637+
fct[2*m-1] *= xsave[3*m+1]
638+
fct[2*m] *= xsave[3*m+1]
636639

637640
elif tdir == -1: # backward transform: divide by amplitude
638641
# amplitude of m=0 element
@@ -641,38 +644,38 @@ def fhtq(a, xsave, tdir=1):
641644
# Amplitude of m=0 element can be zero for some mu, q
642645
# combinations (singular inverse); policy is to drop
643646
# potentially infinite constant.
644-
a[0] = 0
647+
fct[0] = 0
645648
else:
646-
a[0] /= ar
649+
fct[0] /= ar
647650

648651
# remaining amplitudes should never be zero
649-
a[2*m-1] /= xsave[3*m+1]
650-
a[2*m] /= xsave[3*m+1]
652+
fct[2*m-1] /= xsave[3*m+1]
653+
fct[2*m] /= xsave[3*m+1]
651654

652655
# problematical last element, for even n
653656
if np.mod(n, 2) == 0:
654657
m = int(n/2)
655658
ar = xsave[3*m+2]*xsave[3*m+1]
656659
if tdir == 1: # forward transform: multiply by real part
657-
a[-1] *= ar
660+
fct[-1] *= ar
658661
elif (tdir == -1): # backward transform: divide by real part
659662
# Real part ar can be zero for maximally bad choice of kr.
660663
# This is unlikely to happen by chance, but if it does, policy
661664
# is to let it happen. For low-ringing kr, imaginary part ai
662665
# is zero by construction, and real part ar is guaranteed
663666
# nonzero.
664-
a[-1] /= ar
667+
fct[-1] /= ar
665668

666669
# normal FFT back
667-
# a = irfft(a)
668-
# _raw_fft(a, n, -1, -1, 1, _fftpack.drfft)
669-
a = drfft(a, n, -1, 1)
670+
# fct = irfft(fct)
671+
# _raw_fft(fct, n, -1, -1, 1, _fftpack.drfft)
672+
fct = drfft(fct, n, -1, 1)
670673

671674
# reverse the array and at the same time undo the FFTs' multiplication by n
672675
# => Just reverse the array, the rest is already done in drfft.
673-
a = a[::-1]
676+
fct = fct[::-1]
674677

675-
return a
678+
return fct
676679

677680

678681
def krgood(mu, q, dlnr, kr):

0 commit comments

Comments
 (0)