10 USE iso_c_binding,
ONLY: c_f_pointer,&
16#include "../../base/base_uses.f90"
19 INTEGER,
PARAMETER :: ctrig_length = 1024
20 INTEGER,
PARAMETER :: cache_size = 2048
40 SUBROUTINE mltfftsg(transa, transb, a, ldax, lday, b, ldbx, ldby, n, m, isign, scale)
42 CHARACTER(LEN=1),
INTENT(IN) :: transa, transb
43 INTEGER,
INTENT(IN) :: ldax, lday
44 COMPLEX(dp),
INTENT(INOUT) :: a(ldax, lday)
45 INTEGER,
INTENT(IN) :: ldbx, ldby
46 COMPLEX(dp),
INTENT(INOUT) :: b(ldbx, ldby)
47 INTEGER,
INTENT(IN) :: n, m, isign
48 REAL(
dp),
INTENT(IN) :: scale
50 COMPLEX(dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: z
51 INTEGER :: after(20), before(20), chunk, i, ic, id, &
52 iend, inzee, isig, istart, iterations, &
53 itr, length, lot, nfft, now(20), &
56 REAL(
dp) :: trig(2, 1024)
60 length = 2*(cache_size/4 + 1)
63 tscal = (abs(scale - 1._dp) > 1.e-12_dp)
64 CALL ctrig(n, trig, after, before, now, isig, ic)
65 lot = cache_size/(4*n)
66 lot = lot - mod(lot + 1, 2)
70 id = 0; num_threads = 1
79 ALLOCATE (z(length, 2, 0:num_threads - 1))
80 iterations = (m + lot - 1)/lot
81 chunk = lot*((iterations + num_threads - 1)/num_threads)
87 iend = min((id + 1)*chunk, m)
89 DO itr = istart, iend, lot
91 nfft = min(m - itr + 1, lot)
92 IF (transa ==
'N' .OR. transa ==
'n')
THEN
93 CALL fftpre_cmplx(nfft, nfft, ldax, lot, n, a(1, itr), z(1, 1, id), &
94 trig, now(1), after(1), before(1), isig)
96 CALL fftstp_cmplx(ldax, nfft, n, lot, n, a(itr, 1), z(1, 1, id), &
97 trig, now(1), after(1), before(1), isig)
100 IF (lot == nfft)
THEN
101 CALL scaled(2*lot*n, scale, z(1, 1, id))
104 CALL scaled(2*nfft, scale, z(lot*(i - 1) + 1, 1, id))
109 IF (transb ==
'N' .OR. transb ==
'n')
THEN
110 CALL zgetmo(z(1, 1, id), lot, nfft, n, b(1, itr), ldbx)
112 CALL matmov(nfft, n, z(1, 1, id), lot, b(itr, 1), ldbx)
117 CALL fftstp_cmplx(lot, nfft, n, lot, n, z(1, inzee, id), &
118 z(1, 3 - inzee, id), trig, now(i), after(i), &
122 IF (transb ==
'N' .OR. transb ==
'n')
THEN
123 CALL fftrot_cmplx(lot, nfft, n, nfft, ldbx, z(1, inzee, id), &
124 b(1, itr), trig, now(ic), after(ic), before(ic), isig)
126 CALL fftstp_cmplx(lot, nfft, n, ldbx, n, z(1, inzee, id), &
127 b(itr, 1), trig, now(ic), after(ic), before(ic), isig)
136 IF (transb ==
'N' .OR. transb ==
'n')
THEN
137 b(1:ldbx, m + 1:ldby) = cmplx(0._dp, 0._dp,
dp)
138 b(n + 1:ldbx, 1:m) = cmplx(0._dp, 0._dp,
dp)
140 b(1:ldbx, n + 1:ldby) = cmplx(0._dp, 0._dp,
dp)
141 b(m + 1:ldbx, 1:n) = cmplx(0._dp, 0._dp,
dp)
162 SUBROUTINE fftstp_cmplx(mm, nfft, m, nn, n, zin, zout, trig, now, after, before, isign)
164 INTEGER,
INTENT(IN) :: mm, nfft, m, nn, n
165 COMPLEX(dp),
DIMENSION(mm, m),
INTENT(IN),
TARGET :: zin
166 COMPLEX(dp),
DIMENSION(nn, n),
INTENT(INOUT), &
168 REAL(
dp),
DIMENSION(2, ctrig_length),
INTENT(IN) :: trig
169 INTEGER,
INTENT(IN) :: now, after, before, isign
171 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: zin_real, zout_real
173 CALL c_f_pointer(c_loc(zin), zin_real, (/2, mm, m/))
174 CALL c_f_pointer(c_loc(zout), zout_real, (/2, nn, n/))
175 CALL fftstp(mm, nfft, m, nn, n, zin_real, zout_real, trig, now, after, before, isign)
194 SUBROUTINE fftpre_cmplx(mm, nfft, m, nn, n, zin, zout, trig, now, after, before, isign)
196 INTEGER,
INTENT(IN) :: mm, nfft, m, nn, n
197 COMPLEX(dp),
DIMENSION(m, mm),
INTENT(IN),
TARGET :: zin
198 COMPLEX(dp),
DIMENSION(nn, n),
INTENT(INOUT), &
200 REAL(
dp),
DIMENSION(2, ctrig_length),
INTENT(IN) :: trig
201 INTEGER,
INTENT(IN) :: now, after, before, isign
203 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: zin_real, zout_real
205 CALL c_f_pointer(c_loc(zin), zin_real, (/2, mm, m/))
206 CALL c_f_pointer(c_loc(zout), zout_real, (/2, nn, n/))
208 CALL fftpre(mm, nfft, m, nn, n, zin_real, zout_real, trig, now, after, before, isign)
227 SUBROUTINE fftrot_cmplx(mm, nfft, m, nn, n, zin, zout, trig, now, after, before, isign)
230 INTEGER,
INTENT(IN) :: mm, nfft, m, nn, n
231 COMPLEX(dp),
DIMENSION(mm, m),
INTENT(IN),
TARGET :: zin
232 COMPLEX(dp),
DIMENSION(n, nn),
INTENT(INOUT), &
234 REAL(
dp),
DIMENSION(2, ctrig_length),
INTENT(IN) :: trig
235 INTEGER,
INTENT(IN) :: now, after, before, isign
237 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: zin_real, zout_real
239 CALL c_f_pointer(c_loc(zin), zin_real, (/2, mm, m/))
240 CALL c_f_pointer(c_loc(zout), zout_real, (/2, nn, n/))
242 CALL fftrot(mm, nfft, m, nn, n, zin_real, zout_real, trig, now, after, before, isign)
272 SUBROUTINE fftrot(mm, nfft, m, nn, n, zin, zout, trig, now, after, before, isign)
275 INTEGER,
INTENT(IN) :: mm, nfft, m, nn, n
276 REAL(
dp),
DIMENSION(2, mm, m),
INTENT(IN) :: zin
277 REAL(
dp),
DIMENSION(2, n, nn),
INTENT(INOUT) :: zout
278 REAL(
dp),
DIMENSION(2, ctrig_length),
INTENT(IN) :: trig
279 INTEGER,
INTENT(IN) :: now, after, before, isign
281 REAL(
dp),
PARAMETER :: bb = 0.8660254037844387_dp, cos2 = 0.3090169943749474_dp, &
282 cos4 = -0.8090169943749474_dp, rt2i = 0.7071067811865475_dp, &
283 sin2p = 0.9510565162951536_dp, sin4p = 0.5877852522924731_dp
285 INTEGER :: atb, atn, ia, ias, ib, itrig, itt, j, &
286 nin1, nin2, nin3, nin4, nin5, nin6, &
287 nin7, nin8, nout1, nout2, nout3, &
288 nout4, nout5, nout6, nout7, nout8
289 REAL(
dp) :: am, ap, bbs, bm, bp, ci2, ci3, ci4, ci5, cm, cp, cr2, cr3, cr4, cr5, dbl, dm, r, &
290 r1, r2, r25, r3, r34, r4, r5, r6, r7, r8, s, s1, s2, s25, s3, s34, s4, s5, s6, s7, s8, &
291 sin2, sin4, ui1, ui2, ui3, ur1, ur2, ur3, vi1, vi2, vi3, vr1, vr2, vr3
315 nout2 = nout1 + after
316 nout3 = nout2 + after
317 nout4 = nout3 + after
329 zout(1, nout1, j) = r + s
330 zout(1, nout3, j) = r - s
333 zout(1, nout2, j) = r - s
334 zout(1, nout4, j) = r + s
337 zout(2, nout1, j) = r + s
338 zout(2, nout3, j) = r - s
341 zout(2, nout2, j) = r + s
342 zout(2, nout4, j) = r - s
347 IF (2*ias == after)
THEN
356 nout2 = nout1 + after
357 nout3 = nout2 + after
358 nout4 = nout3 + after
366 r3 = -zin(2, j, nin3)
374 zout(1, nout1, j) = r + s
375 zout(1, nout3, j) = r - s
378 zout(1, nout2, j) = r - s
379 zout(1, nout4, j) = r + s
382 zout(2, nout1, j) = r + s
383 zout(2, nout3, j) = r - s
386 zout(2, nout2, j) = r + s
387 zout(2, nout4, j) = r - s
409 nout2 = nout1 + after
410 nout3 = nout2 + after
411 nout4 = nout3 + after
429 zout(1, nout1, j) = r + s
430 zout(1, nout3, j) = r - s
433 zout(1, nout2, j) = r - s
434 zout(1, nout4, j) = r + s
437 zout(2, nout1, j) = r + s
438 zout(2, nout3, j) = r - s
441 zout(2, nout2, j) = r + s
442 zout(2, nout4, j) = r - s
457 nout2 = nout1 + after
458 nout3 = nout2 + after
459 nout4 = nout3 + after
471 zout(1, nout1, j) = r + s
472 zout(1, nout3, j) = r - s
475 zout(1, nout2, j) = r + s
476 zout(1, nout4, j) = r - s
479 zout(2, nout1, j) = r + s
480 zout(2, nout3, j) = r - s
483 zout(2, nout2, j) = r - s
484 zout(2, nout4, j) = r + s
489 IF (2*ias == after)
THEN
498 nout2 = nout1 + after
499 nout3 = nout2 + after
500 nout4 = nout3 + after
509 s3 = -zin(1, j, nin3)
516 zout(1, nout1, j) = r + s
517 zout(1, nout3, j) = r - s
520 zout(1, nout2, j) = r + s
521 zout(1, nout4, j) = r - s
524 zout(2, nout1, j) = r + s
525 zout(2, nout3, j) = r - s
528 zout(2, nout2, j) = r - s
529 zout(2, nout4, j) = r + s
551 nout2 = nout1 + after
552 nout3 = nout2 + after
553 nout4 = nout3 + after
571 zout(1, nout1, j) = r + s
572 zout(1, nout3, j) = r - s
575 zout(1, nout2, j) = r + s
576 zout(1, nout4, j) = r - s
579 zout(2, nout1, j) = r + s
580 zout(2, nout3, j) = r - s
583 zout(2, nout2, j) = r - s
584 zout(2, nout4, j) = r + s
590 ELSE IF (now == 8)
THEN
591 IF (isign == -1)
THEN
605 nout2 = nout1 + after
606 nout3 = nout2 + after
607 nout4 = nout3 + after
608 nout5 = nout4 + after
609 nout6 = nout5 + after
610 nout7 = nout6 + after
611 nout8 = nout7 + after
645 zout(1, nout1, j) = ap + bp
646 zout(2, nout1, j) = cp + dbl
647 zout(1, nout5, j) = ap - bp
648 zout(2, nout5, j) = cp - dbl
649 zout(1, nout3, j) = am + dm
650 zout(2, nout3, j) = cm - bm
651 zout(1, nout7, j) = am - dm
652 zout(2, nout7, j) = cm + bm
672 dbl = (cm - dbl)*rt2i
673 zout(1, nout2, j) = ap + r
674 zout(2, nout2, j) = bm + s
675 zout(1, nout6, j) = ap - r
676 zout(2, nout6, j) = bm - s
677 zout(1, nout4, j) = am + cp
678 zout(2, nout4, j) = bp + dbl
679 zout(1, nout8, j) = am - cp
680 zout(2, nout8, j) = bp - dbl
697 nout2 = nout1 + after
698 nout3 = nout2 + after
699 nout4 = nout3 + after
700 nout5 = nout4 + after
701 nout6 = nout5 + after
702 nout7 = nout6 + after
703 nout8 = nout7 + after
737 zout(1, nout1, j) = ap + bp
738 zout(2, nout1, j) = cp + dbl
739 zout(1, nout5, j) = ap - bp
740 zout(2, nout5, j) = cp - dbl
741 zout(1, nout3, j) = am - dm
742 zout(2, nout3, j) = cm + bm
743 zout(1, nout7, j) = am + dm
744 zout(2, nout7, j) = cm - bm
764 dbl = (-cm + dbl)*rt2i
765 zout(1, nout2, j) = ap + r
766 zout(2, nout2, j) = bm + s
767 zout(1, nout6, j) = ap - r
768 zout(2, nout6, j) = bm - s
769 zout(1, nout4, j) = am + cp
770 zout(2, nout4, j) = bp + dbl
771 zout(1, nout8, j) = am - cp
772 zout(2, nout8, j) = bp - dbl
776 ELSE IF (now == 3)
THEN
786 nout2 = nout1 + after
787 nout3 = nout2 + after
797 zout(1, nout1, j) = r + r1
798 zout(2, nout1, j) = s + s1
803 zout(1, nout2, j) = r1 - s2
804 zout(2, nout2, j) = s1 + r2
805 zout(1, nout3, j) = r1 + s2
806 zout(2, nout3, j) = s1 - r2
811 IF (4*ias == 3*after)
THEN
820 nout2 = nout1 + after
821 nout3 = nout2 + after
825 r2 = -zin(2, j, nin2)
827 r3 = -zin(1, j, nin3)
828 s3 = -zin(2, j, nin3)
831 zout(1, nout1, j) = r + r1
832 zout(2, nout1, j) = s + s1
837 zout(1, nout2, j) = r1 - s2
838 zout(2, nout2, j) = s1 + r2
839 zout(1, nout3, j) = r1 + s2
840 zout(2, nout3, j) = s1 - r2
851 nout2 = nout1 + after
852 nout3 = nout2 + after
857 s2 = -zin(1, j, nin2)
858 r3 = -zin(1, j, nin3)
859 s3 = -zin(2, j, nin3)
862 zout(1, nout1, j) = r + r1
863 zout(2, nout1, j) = s + s1
868 zout(1, nout2, j) = r1 - s2
869 zout(2, nout2, j) = s1 + r2
870 zout(1, nout3, j) = r1 + s2
871 zout(2, nout3, j) = s1 - r2
875 ELSE IF (8*ias == 3*after)
THEN
884 nout2 = nout1 + after
885 nout3 = nout2 + after
893 r3 = -zin(2, j, nin3)
897 zout(1, nout1, j) = r + r1
898 zout(2, nout1, j) = s + s1
903 zout(1, nout2, j) = r1 - s2
904 zout(2, nout2, j) = s1 + r2
905 zout(1, nout3, j) = r1 + s2
906 zout(2, nout3, j) = s1 - r2
917 nout2 = nout1 + after
918 nout3 = nout2 + after
927 s3 = -zin(1, j, nin3)
930 zout(1, nout1, j) = r + r1
931 zout(2, nout1, j) = s + s1
936 zout(1, nout2, j) = r1 - s2
937 zout(2, nout2, j) = s1 + r2
938 zout(1, nout3, j) = r1 + s2
939 zout(2, nout3, j) = s1 - r2
958 nout2 = nout1 + after
959 nout3 = nout2 + after
973 zout(1, nout1, j) = r + r1
974 zout(2, nout1, j) = s + s1
979 zout(1, nout2, j) = r1 - s2
980 zout(2, nout2, j) = s1 + r2
981 zout(1, nout3, j) = r1 + s2
982 zout(2, nout3, j) = s1 - r2
987 ELSE IF (now == 5)
THEN
1000 nout2 = nout1 + after
1001 nout3 = nout2 + after
1002 nout4 = nout3 + after
1003 nout5 = nout4 + after
1005 r1 = zin(1, j, nin1)
1006 s1 = zin(2, j, nin1)
1007 r2 = zin(1, j, nin2)
1008 s2 = zin(2, j, nin2)
1009 r3 = zin(1, j, nin3)
1010 s3 = zin(2, j, nin3)
1011 r4 = zin(1, j, nin4)
1012 s4 = zin(2, j, nin4)
1013 r5 = zin(1, j, nin5)
1014 s5 = zin(2, j, nin5)
1019 zout(1, nout1, j) = r1 + r25 + r34
1020 r = cos2*r25 + cos4*r34 + r1
1021 s = sin2*s25 + sin4*s34
1022 zout(1, nout2, j) = r - s
1023 zout(1, nout5, j) = r + s
1024 r = cos4*r25 + cos2*r34 + r1
1025 s = sin4*s25 - sin2*s34
1026 zout(1, nout3, j) = r - s
1027 zout(1, nout4, j) = r + s
1032 zout(2, nout1, j) = s1 + s25 + s34
1033 r = cos2*s25 + cos4*s34 + s1
1034 s = sin2*r25 + sin4*r34
1035 zout(2, nout2, j) = r + s
1036 zout(2, nout5, j) = r - s
1037 r = cos4*s25 + cos2*s34 + s1
1038 s = sin4*r25 - sin2*r34
1039 zout(2, nout3, j) = r + s
1040 zout(2, nout4, j) = r - s
1045 IF (8*ias == 5*after)
THEN
1046 IF (isign == 1)
THEN
1056 nout2 = nout1 + after
1057 nout3 = nout2 + after
1058 nout4 = nout3 + after
1059 nout5 = nout4 + after
1061 r1 = zin(1, j, nin1)
1062 s1 = zin(2, j, nin1)
1067 r3 = -zin(2, j, nin3)
1068 s3 = zin(1, j, nin3)
1073 r5 = -zin(1, j, nin5)
1074 s5 = -zin(2, j, nin5)
1079 zout(1, nout1, j) = r1 + r25 + r34
1080 r = cos2*r25 + cos4*r34 + r1
1081 s = sin2*s25 + sin4*s34
1082 zout(1, nout2, j) = r - s
1083 zout(1, nout5, j) = r + s
1084 r = cos4*r25 + cos2*r34 + r1
1085 s = sin4*s25 - sin2*s34
1086 zout(1, nout3, j) = r - s
1087 zout(1, nout4, j) = r + s
1092 zout(2, nout1, j) = s1 + s25 + s34
1093 r = cos2*s25 + cos4*s34 + s1
1094 s = sin2*r25 + sin4*r34
1095 zout(2, nout2, j) = r + s
1096 zout(2, nout5, j) = r - s
1097 r = cos4*s25 + cos2*s34 + s1
1098 s = sin4*r25 - sin2*r34
1099 zout(2, nout3, j) = r + s
1100 zout(2, nout4, j) = r - s
1113 nout2 = nout1 + after
1114 nout3 = nout2 + after
1115 nout4 = nout3 + after
1116 nout5 = nout4 + after
1118 r1 = zin(1, j, nin1)
1119 s1 = zin(2, j, nin1)
1124 r3 = zin(2, j, nin3)
1125 s3 = -zin(1, j, nin3)
1130 r5 = -zin(1, j, nin5)
1131 s5 = -zin(2, j, nin5)
1136 zout(1, nout1, j) = r1 + r25 + r34
1137 r = cos2*r25 + cos4*r34 + r1
1138 s = sin2*s25 + sin4*s34
1139 zout(1, nout2, j) = r - s
1140 zout(1, nout5, j) = r + s
1141 r = cos4*r25 + cos2*r34 + r1
1142 s = sin4*s25 - sin2*s34
1143 zout(1, nout3, j) = r - s
1144 zout(1, nout4, j) = r + s
1149 zout(2, nout1, j) = s1 + s25 + s34
1150 r = cos2*s25 + cos4*s34 + s1
1151 s = sin2*r25 + sin4*r34
1152 zout(2, nout2, j) = r + s
1153 zout(2, nout5, j) = r - s
1154 r = cos4*s25 + cos2*s34 + s1
1155 s = sin4*r25 - sin2*r34
1156 zout(2, nout3, j) = r + s
1157 zout(2, nout4, j) = r - s
1165 cr2 = trig(1, itrig)
1166 ci2 = trig(2, itrig)
1168 cr3 = trig(1, itrig)
1169 ci3 = trig(2, itrig)
1171 cr4 = trig(1, itrig)
1172 ci4 = trig(2, itrig)
1174 cr5 = trig(1, itrig)
1175 ci5 = trig(2, itrig)
1185 nout2 = nout1 + after
1186 nout3 = nout2 + after
1187 nout4 = nout3 + after
1188 nout5 = nout4 + after
1190 r1 = zin(1, j, nin1)
1191 s1 = zin(2, j, nin1)
1212 zout(1, nout1, j) = r1 + r25 + r34
1213 r = cos2*r25 + cos4*r34 + r1
1214 s = sin2*s25 + sin4*s34
1215 zout(1, nout2, j) = r - s
1216 zout(1, nout5, j) = r + s
1217 r = cos4*r25 + cos2*r34 + r1
1218 s = sin4*s25 - sin2*s34
1219 zout(1, nout3, j) = r - s
1220 zout(1, nout4, j) = r + s
1225 zout(2, nout1, j) = s1 + s25 + s34
1226 r = cos2*s25 + cos4*s34 + s1
1227 s = sin2*r25 + sin4*r34
1228 zout(2, nout2, j) = r + s
1229 zout(2, nout5, j) = r - s
1230 r = cos4*s25 + cos2*s34 + s1
1231 s = sin4*r25 - sin2*r34
1232 zout(2, nout3, j) = r + s
1233 zout(2, nout4, j) = r - s
1238 ELSE IF (now == 6)
THEN
1251 nout2 = nout1 + after
1252 nout3 = nout2 + after
1253 nout4 = nout3 + after
1254 nout5 = nout4 + after
1255 nout6 = nout5 + after
1257 r2 = zin(1, j, nin3)
1258 s2 = zin(2, j, nin3)
1259 r3 = zin(1, j, nin5)
1260 s3 = zin(2, j, nin5)
1263 r1 = zin(1, j, nin1)
1264 s1 = zin(2, j, nin1)
1276 r2 = zin(1, j, nin6)
1277 s2 = zin(2, j, nin6)
1278 r3 = zin(1, j, nin2)
1279 s3 = zin(2, j, nin2)
1282 r1 = zin(1, j, nin4)
1283 s1 = zin(2, j, nin4)
1295 zout(1, nout1, j) = ur1 + vr1
1296 zout(2, nout1, j) = ui1 + vi1
1297 zout(1, nout5, j) = ur2 + vr2
1298 zout(2, nout5, j) = ui2 + vi2
1299 zout(1, nout3, j) = ur3 + vr3
1300 zout(2, nout3, j) = ui3 + vi3
1301 zout(1, nout4, j) = ur1 - vr1
1302 zout(2, nout4, j) = ui1 - vi1
1303 zout(1, nout2, j) = ur2 - vr2
1304 zout(2, nout2, j) = ui2 - vi2
1305 zout(1, nout6, j) = ur3 - vr3
1306 zout(2, nout6, j) = ui3 - vi3
1310 cpabort(
'Error fftrot')
1315 END SUBROUTINE fftrot
1344 SUBROUTINE fftpre(mm, nfft, m, nn, n, zin, zout, trig, now, after, before, isign)
1346 INTEGER,
INTENT(IN) :: mm, nfft, m, nn, n
1347 REAL(dp),
DIMENSION(2, m, mm),
INTENT(IN) :: zin
1348 REAL(dp),
DIMENSION(2, nn, n),
INTENT(INOUT) :: zout
1349 REAL(dp),
DIMENSION(2, ctrig_length),
INTENT(IN) :: trig
1350 INTEGER,
INTENT(IN) :: now, after, before, isign
1352 REAL(dp),
PARAMETER :: bb = 0.8660254037844387_dp, cos2 = 0.3090169943749474_dp, &
1353 cos4 = -0.8090169943749474_dp, rt2i = 0.7071067811865475_dp, &
1354 sin2p = 0.9510565162951536_dp, sin4p = 0.5877852522924731_dp
1356 INTEGER :: atb, atn, ia, ias, ib, itrig, itt, j, &
1357 nin1, nin2, nin3, nin4, nin5, nin6, &
1358 nin7, nin8, nout1, nout2, nout3, &
1359 nout4, nout5, nout6, nout7, nout8
1360 REAL(dp) :: am, ap, bbs, bm, bp, ci2, ci3, ci4, ci5, cm, cp, cr2, cr3, cr4, cr5, dbl, dm, r, &
1361 r1, r2, r25, r3, r34, r4, r5, r6, r7, r8, s, s1, s2, s25, s3, s34, s4, s5, s6, s7, s8, &
1362 sin2, sin4, ui1, ui2, ui3, ur1, ur2, ur3, vi1, vi2, vi3, vr1, vr2, vr3
1376 IF (isign == 1)
THEN
1386 nout2 = nout1 + after
1387 nout3 = nout2 + after
1388 nout4 = nout3 + after
1390 r1 = zin(1, nin1, j)
1391 s1 = zin(2, nin1, j)
1392 r2 = zin(1, nin2, j)
1393 s2 = zin(2, nin2, j)
1394 r3 = zin(1, nin3, j)
1395 s3 = zin(2, nin3, j)
1396 r4 = zin(1, nin4, j)
1397 s4 = zin(2, nin4, j)
1400 zout(1, j, nout1) = r + s
1401 zout(1, j, nout3) = r - s
1404 zout(1, j, nout2) = r - s
1405 zout(1, j, nout4) = r + s
1408 zout(2, j, nout1) = r + s
1409 zout(2, j, nout3) = r - s
1412 zout(2, j, nout2) = r + s
1413 zout(2, j, nout4) = r - s
1418 IF (2*ias == after)
THEN
1427 nout2 = nout1 + after
1428 nout3 = nout2 + after
1429 nout4 = nout3 + after
1431 r1 = zin(1, nin1, j)
1432 s1 = zin(2, nin1, j)
1437 r3 = -zin(2, nin3, j)
1438 s3 = zin(1, nin3, j)
1445 zout(1, j, nout1) = r + s
1446 zout(1, j, nout3) = r - s
1449 zout(1, j, nout2) = r - s
1450 zout(1, j, nout4) = r + s
1453 zout(2, j, nout1) = r + s
1454 zout(2, j, nout3) = r - s
1457 zout(2, j, nout2) = r + s
1458 zout(2, j, nout4) = r - s
1464 cr2 = trig(1, itrig)
1465 ci2 = trig(2, itrig)
1467 cr3 = trig(1, itrig)
1468 ci3 = trig(2, itrig)
1470 cr4 = trig(1, itrig)
1471 ci4 = trig(2, itrig)
1480 nout2 = nout1 + after
1481 nout3 = nout2 + after
1482 nout4 = nout3 + after
1484 r1 = zin(1, nin1, j)
1485 s1 = zin(2, nin1, j)
1500 zout(1, j, nout1) = r + s
1501 zout(1, j, nout3) = r - s
1504 zout(1, j, nout2) = r - s
1505 zout(1, j, nout4) = r + s
1508 zout(2, j, nout1) = r + s
1509 zout(2, j, nout3) = r - s
1512 zout(2, j, nout2) = r + s
1513 zout(2, j, nout4) = r - s
1528 nout2 = nout1 + after
1529 nout3 = nout2 + after
1530 nout4 = nout3 + after
1532 r1 = zin(1, nin1, j)
1533 s1 = zin(2, nin1, j)
1534 r2 = zin(1, nin2, j)
1535 s2 = zin(2, nin2, j)
1536 r3 = zin(1, nin3, j)
1537 s3 = zin(2, nin3, j)
1538 r4 = zin(1, nin4, j)
1539 s4 = zin(2, nin4, j)
1542 zout(1, j, nout1) = r + s
1543 zout(1, j, nout3) = r - s
1546 zout(1, j, nout2) = r + s
1547 zout(1, j, nout4) = r - s
1550 zout(2, j, nout1) = r + s
1551 zout(2, j, nout3) = r - s
1554 zout(2, j, nout2) = r - s
1555 zout(2, j, nout4) = r + s
1560 IF (2*ias == after)
THEN
1569 nout2 = nout1 + after
1570 nout3 = nout2 + after
1571 nout4 = nout3 + after
1573 r1 = zin(1, nin1, j)
1574 s1 = zin(2, nin1, j)
1579 r3 = zin(2, nin3, j)
1580 s3 = -zin(1, nin3, j)
1587 zout(1, j, nout1) = r + s
1588 zout(1, j, nout3) = r - s
1591 zout(1, j, nout2) = r + s
1592 zout(1, j, nout4) = r - s
1595 zout(2, j, nout1) = r + s
1596 zout(2, j, nout3) = r - s
1599 zout(2, j, nout2) = r - s
1600 zout(2, j, nout4) = r + s
1606 cr2 = trig(1, itrig)
1607 ci2 = trig(2, itrig)
1609 cr3 = trig(1, itrig)
1610 ci3 = trig(2, itrig)
1612 cr4 = trig(1, itrig)
1613 ci4 = trig(2, itrig)
1622 nout2 = nout1 + after
1623 nout3 = nout2 + after
1624 nout4 = nout3 + after
1626 r1 = zin(1, nin1, j)
1627 s1 = zin(2, nin1, j)
1642 zout(1, j, nout1) = r + s
1643 zout(1, j, nout3) = r - s
1646 zout(1, j, nout2) = r + s
1647 zout(1, j, nout4) = r - s
1650 zout(2, j, nout1) = r + s
1651 zout(2, j, nout3) = r - s
1654 zout(2, j, nout2) = r - s
1655 zout(2, j, nout4) = r + s
1661 ELSE IF (now == 8)
THEN
1662 IF (isign == -1)
THEN
1676 nout2 = nout1 + after
1677 nout3 = nout2 + after
1678 nout4 = nout3 + after
1679 nout5 = nout4 + after
1680 nout6 = nout5 + after
1681 nout7 = nout6 + after
1682 nout8 = nout7 + after
1684 r1 = zin(1, nin1, j)
1685 s1 = zin(2, nin1, j)
1686 r2 = zin(1, nin2, j)
1687 s2 = zin(2, nin2, j)
1688 r3 = zin(1, nin3, j)
1689 s3 = zin(2, nin3, j)
1690 r4 = zin(1, nin4, j)
1691 s4 = zin(2, nin4, j)
1692 r5 = zin(1, nin5, j)
1693 s5 = zin(2, nin5, j)
1694 r6 = zin(1, nin6, j)
1695 s6 = zin(2, nin6, j)
1696 r7 = zin(1, nin7, j)
1697 s7 = zin(2, nin7, j)
1698 r8 = zin(1, nin8, j)
1699 s8 = zin(2, nin8, j)
1716 zout(1, j, nout1) = ap + bp
1717 zout(2, j, nout1) = cp + dbl
1718 zout(1, j, nout5) = ap - bp
1719 zout(2, j, nout5) = cp - dbl
1720 zout(1, j, nout3) = am + dm
1721 zout(2, j, nout3) = cm - bm
1722 zout(1, j, nout7) = am - dm
1723 zout(2, j, nout7) = cm + bm
1742 cp = (cm + dbl)*rt2i
1743 dbl = (cm - dbl)*rt2i
1744 zout(1, j, nout2) = ap + r
1745 zout(2, j, nout2) = bm + s
1746 zout(1, j, nout6) = ap - r
1747 zout(2, j, nout6) = bm - s
1748 zout(1, j, nout4) = am + cp
1749 zout(2, j, nout4) = bp + dbl
1750 zout(1, j, nout8) = am - cp
1751 zout(2, j, nout8) = bp - dbl
1768 nout2 = nout1 + after
1769 nout3 = nout2 + after
1770 nout4 = nout3 + after
1771 nout5 = nout4 + after
1772 nout6 = nout5 + after
1773 nout7 = nout6 + after
1774 nout8 = nout7 + after
1776 r1 = zin(1, nin1, j)
1777 s1 = zin(2, nin1, j)
1778 r2 = zin(1, nin2, j)
1779 s2 = zin(2, nin2, j)
1780 r3 = zin(1, nin3, j)
1781 s3 = zin(2, nin3, j)
1782 r4 = zin(1, nin4, j)
1783 s4 = zin(2, nin4, j)
1784 r5 = zin(1, nin5, j)
1785 s5 = zin(2, nin5, j)
1786 r6 = zin(1, nin6, j)
1787 s6 = zin(2, nin6, j)
1788 r7 = zin(1, nin7, j)
1789 s7 = zin(2, nin7, j)
1790 r8 = zin(1, nin8, j)
1791 s8 = zin(2, nin8, j)
1808 zout(1, j, nout1) = ap + bp
1809 zout(2, j, nout1) = cp + dbl
1810 zout(1, j, nout5) = ap - bp
1811 zout(2, j, nout5) = cp - dbl
1812 zout(1, j, nout3) = am - dm
1813 zout(2, j, nout3) = cm + bm
1814 zout(1, j, nout7) = am + dm
1815 zout(2, j, nout7) = cm - bm
1834 cp = (cm + dbl)*rt2i
1835 dbl = (-cm + dbl)*rt2i
1836 zout(1, j, nout2) = ap + r
1837 zout(2, j, nout2) = bm + s
1838 zout(1, j, nout6) = ap - r
1839 zout(2, j, nout6) = bm - s
1840 zout(1, j, nout4) = am + cp
1841 zout(2, j, nout4) = bp + dbl
1842 zout(1, j, nout8) = am - cp
1843 zout(2, j, nout8) = bp - dbl
1847 ELSE IF (now == 3)
THEN
1857 nout2 = nout1 + after
1858 nout3 = nout2 + after
1860 r1 = zin(1, nin1, j)
1861 s1 = zin(2, nin1, j)
1862 r2 = zin(1, nin2, j)
1863 s2 = zin(2, nin2, j)
1864 r3 = zin(1, nin3, j)
1865 s3 = zin(2, nin3, j)
1868 zout(1, j, nout1) = r + r1
1869 zout(2, j, nout1) = s + s1
1874 zout(1, j, nout2) = r1 - s2
1875 zout(2, j, nout2) = s1 + r2
1876 zout(1, j, nout3) = r1 + s2
1877 zout(2, j, nout3) = s1 - r2
1882 IF (4*ias == 3*after)
THEN
1883 IF (isign == 1)
THEN
1891 nout2 = nout1 + after
1892 nout3 = nout2 + after
1894 r1 = zin(1, nin1, j)
1895 s1 = zin(2, nin1, j)
1896 r2 = -zin(2, nin2, j)
1897 s2 = zin(1, nin2, j)
1898 r3 = -zin(1, nin3, j)
1899 s3 = -zin(2, nin3, j)
1902 zout(1, j, nout1) = r + r1
1903 zout(2, j, nout1) = s + s1
1908 zout(1, j, nout2) = r1 - s2
1909 zout(2, j, nout2) = s1 + r2
1910 zout(1, j, nout3) = r1 + s2
1911 zout(2, j, nout3) = s1 - r2
1922 nout2 = nout1 + after
1923 nout3 = nout2 + after
1925 r1 = zin(1, nin1, j)
1926 s1 = zin(2, nin1, j)
1927 r2 = zin(2, nin2, j)
1928 s2 = -zin(1, nin2, j)
1929 r3 = -zin(1, nin3, j)
1930 s3 = -zin(2, nin3, j)
1933 zout(1, j, nout1) = r + r1
1934 zout(2, j, nout1) = s + s1
1939 zout(1, j, nout2) = r1 - s2
1940 zout(2, j, nout2) = s1 + r2
1941 zout(1, j, nout3) = r1 + s2
1942 zout(2, j, nout3) = s1 - r2
1946 ELSE IF (8*ias == 3*after)
THEN
1947 IF (isign == 1)
THEN
1955 nout2 = nout1 + after
1956 nout3 = nout2 + after
1958 r1 = zin(1, nin1, j)
1959 s1 = zin(2, nin1, j)
1964 r3 = -zin(2, nin3, j)
1965 s3 = zin(1, nin3, j)
1968 zout(1, j, nout1) = r + r1
1969 zout(2, j, nout1) = s + s1
1974 zout(1, j, nout2) = r1 - s2
1975 zout(2, j, nout2) = s1 + r2
1976 zout(1, j, nout3) = r1 + s2
1977 zout(2, j, nout3) = s1 - r2
1988 nout2 = nout1 + after
1989 nout3 = nout2 + after
1991 r1 = zin(1, nin1, j)
1992 s1 = zin(2, nin1, j)
1997 r3 = zin(2, nin3, j)
1998 s3 = -zin(1, nin3, j)
2001 zout(1, j, nout1) = r + r1
2002 zout(2, j, nout1) = s + s1
2007 zout(1, j, nout2) = r1 - s2
2008 zout(2, j, nout2) = s1 + r2
2009 zout(1, j, nout3) = r1 + s2
2010 zout(2, j, nout3) = s1 - r2
2017 cr2 = trig(1, itrig)
2018 ci2 = trig(2, itrig)
2020 cr3 = trig(1, itrig)
2021 ci3 = trig(2, itrig)
2029 nout2 = nout1 + after
2030 nout3 = nout2 + after
2032 r1 = zin(1, nin1, j)
2033 s1 = zin(2, nin1, j)
2044 zout(1, j, nout1) = r + r1
2045 zout(2, j, nout1) = s + s1
2050 zout(1, j, nout2) = r1 - s2
2051 zout(2, j, nout2) = s1 + r2
2052 zout(1, j, nout3) = r1 + s2
2053 zout(2, j, nout3) = s1 - r2
2058 ELSE IF (now == 5)
THEN
2071 nout2 = nout1 + after
2072 nout3 = nout2 + after
2073 nout4 = nout3 + after
2074 nout5 = nout4 + after
2076 r1 = zin(1, nin1, j)
2077 s1 = zin(2, nin1, j)
2078 r2 = zin(1, nin2, j)
2079 s2 = zin(2, nin2, j)
2080 r3 = zin(1, nin3, j)
2081 s3 = zin(2, nin3, j)
2082 r4 = zin(1, nin4, j)
2083 s4 = zin(2, nin4, j)
2084 r5 = zin(1, nin5, j)
2085 s5 = zin(2, nin5, j)
2090 zout(1, j, nout1) = r1 + r25 + r34
2091 r = cos2*r25 + cos4*r34 + r1
2092 s = sin2*s25 + sin4*s34
2093 zout(1, j, nout2) = r - s
2094 zout(1, j, nout5) = r + s
2095 r = cos4*r25 + cos2*r34 + r1
2096 s = sin4*s25 - sin2*s34
2097 zout(1, j, nout3) = r - s
2098 zout(1, j, nout4) = r + s
2103 zout(2, j, nout1) = s1 + s25 + s34
2104 r = cos2*s25 + cos4*s34 + s1
2105 s = sin2*r25 + sin4*r34
2106 zout(2, j, nout2) = r + s
2107 zout(2, j, nout5) = r - s
2108 r = cos4*s25 + cos2*s34 + s1
2109 s = sin4*r25 - sin2*r34
2110 zout(2, j, nout3) = r + s
2111 zout(2, j, nout4) = r - s
2116 IF (8*ias == 5*after)
THEN
2117 IF (isign == 1)
THEN
2127 nout2 = nout1 + after
2128 nout3 = nout2 + after
2129 nout4 = nout3 + after
2130 nout5 = nout4 + after
2132 r1 = zin(1, nin1, j)
2133 s1 = zin(2, nin1, j)
2138 r3 = -zin(2, nin3, j)
2139 s3 = zin(1, nin3, j)
2144 r5 = -zin(1, nin5, j)
2145 s5 = -zin(2, nin5, j)
2150 zout(1, j, nout1) = r1 + r25 + r34
2151 r = cos2*r25 + cos4*r34 + r1
2152 s = sin2*s25 + sin4*s34
2153 zout(1, j, nout2) = r - s
2154 zout(1, j, nout5) = r + s
2155 r = cos4*r25 + cos2*r34 + r1
2156 s = sin4*s25 - sin2*s34
2157 zout(1, j, nout3) = r - s
2158 zout(1, j, nout4) = r + s
2163 zout(2, j, nout1) = s1 + s25 + s34
2164 r = cos2*s25 + cos4*s34 + s1
2165 s = sin2*r25 + sin4*r34
2166 zout(2, j, nout2) = r + s
2167 zout(2, j, nout5) = r - s
2168 r = cos4*s25 + cos2*s34 + s1
2169 s = sin4*r25 - sin2*r34
2170 zout(2, j, nout3) = r + s
2171 zout(2, j, nout4) = r - s
2184 nout2 = nout1 + after
2185 nout3 = nout2 + after
2186 nout4 = nout3 + after
2187 nout5 = nout4 + after
2189 r1 = zin(1, nin1, j)
2190 s1 = zin(2, nin1, j)
2195 r3 = zin(2, nin3, j)
2196 s3 = -zin(1, nin3, j)
2201 r5 = -zin(1, nin5, j)
2202 s5 = -zin(2, nin5, j)
2207 zout(1, j, nout1) = r1 + r25 + r34
2208 r = cos2*r25 + cos4*r34 + r1
2209 s = sin2*s25 + sin4*s34
2210 zout(1, j, nout2) = r - s
2211 zout(1, j, nout5) = r + s
2212 r = cos4*r25 + cos2*r34 + r1
2213 s = sin4*s25 - sin2*s34
2214 zout(1, j, nout3) = r - s
2215 zout(1, j, nout4) = r + s
2220 zout(2, j, nout1) = s1 + s25 + s34
2221 r = cos2*s25 + cos4*s34 + s1
2222 s = sin2*r25 + sin4*r34
2223 zout(2, j, nout2) = r + s
2224 zout(2, j, nout5) = r - s
2225 r = cos4*s25 + cos2*s34 + s1
2226 s = sin4*r25 - sin2*r34
2227 zout(2, j, nout3) = r + s
2228 zout(2, j, nout4) = r - s
2236 cr2 = trig(1, itrig)
2237 ci2 = trig(2, itrig)
2239 cr3 = trig(1, itrig)
2240 ci3 = trig(2, itrig)
2242 cr4 = trig(1, itrig)
2243 ci4 = trig(2, itrig)
2245 cr5 = trig(1, itrig)
2246 ci5 = trig(2, itrig)
2256 nout2 = nout1 + after
2257 nout3 = nout2 + after
2258 nout4 = nout3 + after
2259 nout5 = nout4 + after
2261 r1 = zin(1, nin1, j)
2262 s1 = zin(2, nin1, j)
2283 zout(1, j, nout1) = r1 + r25 + r34
2284 r = cos2*r25 + cos4*r34 + r1
2285 s = sin2*s25 + sin4*s34
2286 zout(1, j, nout2) = r - s
2287 zout(1, j, nout5) = r + s
2288 r = cos4*r25 + cos2*r34 + r1
2289 s = sin4*s25 - sin2*s34
2290 zout(1, j, nout3) = r - s
2291 zout(1, j, nout4) = r + s
2296 zout(2, j, nout1) = s1 + s25 + s34
2297 r = cos2*s25 + cos4*s34 + s1
2298 s = sin2*r25 + sin4*r34
2299 zout(2, j, nout2) = r + s
2300 zout(2, j, nout5) = r - s
2301 r = cos4*s25 + cos2*s34 + s1
2302 s = sin4*r25 - sin2*r34
2303 zout(2, j, nout3) = r + s
2304 zout(2, j, nout4) = r - s
2309 ELSE IF (now == 6)
THEN
2322 nout2 = nout1 + after
2323 nout3 = nout2 + after
2324 nout4 = nout3 + after
2325 nout5 = nout4 + after
2326 nout6 = nout5 + after
2328 r2 = zin(1, nin3, j)
2329 s2 = zin(2, nin3, j)
2330 r3 = zin(1, nin5, j)
2331 s3 = zin(2, nin5, j)
2334 r1 = zin(1, nin1, j)
2335 s1 = zin(2, nin1, j)
2347 r2 = zin(1, nin6, j)
2348 s2 = zin(2, nin6, j)
2349 r3 = zin(1, nin2, j)
2350 s3 = zin(2, nin2, j)
2353 r1 = zin(1, nin4, j)
2354 s1 = zin(2, nin4, j)
2366 zout(1, j, nout1) = ur1 + vr1
2367 zout(2, j, nout1) = ui1 + vi1
2368 zout(1, j, nout5) = ur2 + vr2
2369 zout(2, j, nout5) = ui2 + vi2
2370 zout(1, j, nout3) = ur3 + vr3
2371 zout(2, j, nout3) = ui3 + vi3
2372 zout(1, j, nout4) = ur1 - vr1
2373 zout(2, j, nout4) = ui1 - vi1
2374 zout(1, j, nout2) = ur2 - vr2
2375 zout(2, j, nout2) = ui2 - vi2
2376 zout(1, j, nout6) = ur3 - vr3
2377 zout(2, j, nout6) = ui3 - vi3
2381 cpabort(
'Error fftpre')
2386 END SUBROUTINE fftpre
2416 SUBROUTINE fftstp(mm, nfft, m, nn, n, zin, zout, trig, now, after, before, isign)
2418 INTEGER,
INTENT(IN) :: mm, nfft, m, nn, n
2419 REAL(dp),
DIMENSION(2, mm, m),
INTENT(IN) :: zin
2420 REAL(dp),
DIMENSION(2, nn, n),
INTENT(INOUT) :: zout
2421 REAL(dp),
DIMENSION(2, ctrig_length),
INTENT(IN) :: trig
2422 INTEGER,
INTENT(IN) :: now, after, before, isign
2424 REAL(dp),
PARAMETER :: bb = 0.8660254037844387_dp, cos2 = 0.3090169943749474_dp, &
2425 cos4 = -0.8090169943749474_dp, rt2i = 0.7071067811865475_dp, &
2426 sin2p = 0.9510565162951536_dp, sin4p = 0.5877852522924731_dp
2428 INTEGER :: atb, atn, ia, ias, ib, itrig, itt, j, &
2429 nin1, nin2, nin3, nin4, nin5, nin6, &
2430 nin7, nin8, nout1, nout2, nout3, &
2431 nout4, nout5, nout6, nout7, nout8
2432 REAL(dp) :: am, ap, bbs, bm, bp, ci2, ci3, ci4, ci5, cm, cp, cr2, cr3, cr4, cr5, dbl, dm, r, &
2433 r1, r2, r25, r3, r34, r4, r5, r6, r7, r8, s, s1, s2, s25, s3, s34, s4, s5, s6, s7, s8, &
2434 sin2, sin4, ui1, ui2, ui3, ur1, ur2, ur3, vi1, vi2, vi3, vr1, vr2, vr3
2448 IF (isign == 1)
THEN
2458 nout2 = nout1 + after
2459 nout3 = nout2 + after
2460 nout4 = nout3 + after
2462 r1 = zin(1, j, nin1)
2463 s1 = zin(2, j, nin1)
2464 r2 = zin(1, j, nin2)
2465 s2 = zin(2, j, nin2)
2466 r3 = zin(1, j, nin3)
2467 s3 = zin(2, j, nin3)
2468 r4 = zin(1, j, nin4)
2469 s4 = zin(2, j, nin4)
2472 zout(1, j, nout1) = r + s
2473 zout(1, j, nout3) = r - s
2476 zout(1, j, nout2) = r - s
2477 zout(1, j, nout4) = r + s
2480 zout(2, j, nout1) = r + s
2481 zout(2, j, nout3) = r - s
2484 zout(2, j, nout2) = r + s
2485 zout(2, j, nout4) = r - s
2490 IF (2*ias == after)
THEN
2499 nout2 = nout1 + after
2500 nout3 = nout2 + after
2501 nout4 = nout3 + after
2503 r1 = zin(1, j, nin1)
2504 s1 = zin(2, j, nin1)
2509 r3 = -zin(2, j, nin3)
2510 s3 = zin(1, j, nin3)
2517 zout(1, j, nout1) = r + s
2518 zout(1, j, nout3) = r - s
2521 zout(1, j, nout2) = r - s
2522 zout(1, j, nout4) = r + s
2525 zout(2, j, nout1) = r + s
2526 zout(2, j, nout3) = r - s
2529 zout(2, j, nout2) = r + s
2530 zout(2, j, nout4) = r - s
2536 cr2 = trig(1, itrig)
2537 ci2 = trig(2, itrig)
2539 cr3 = trig(1, itrig)
2540 ci3 = trig(2, itrig)
2542 cr4 = trig(1, itrig)
2543 ci4 = trig(2, itrig)
2552 nout2 = nout1 + after
2553 nout3 = nout2 + after
2554 nout4 = nout3 + after
2556 r1 = zin(1, j, nin1)
2557 s1 = zin(2, j, nin1)
2572 zout(1, j, nout1) = r + s
2573 zout(1, j, nout3) = r - s
2576 zout(1, j, nout2) = r - s
2577 zout(1, j, nout4) = r + s
2580 zout(2, j, nout1) = r + s
2581 zout(2, j, nout3) = r - s
2584 zout(2, j, nout2) = r + s
2585 zout(2, j, nout4) = r - s
2600 nout2 = nout1 + after
2601 nout3 = nout2 + after
2602 nout4 = nout3 + after
2604 r1 = zin(1, j, nin1)
2605 s1 = zin(2, j, nin1)
2606 r2 = zin(1, j, nin2)
2607 s2 = zin(2, j, nin2)
2608 r3 = zin(1, j, nin3)
2609 s3 = zin(2, j, nin3)
2610 r4 = zin(1, j, nin4)
2611 s4 = zin(2, j, nin4)
2614 zout(1, j, nout1) = r + s
2615 zout(1, j, nout3) = r - s
2618 zout(1, j, nout2) = r + s
2619 zout(1, j, nout4) = r - s
2622 zout(2, j, nout1) = r + s
2623 zout(2, j, nout3) = r - s
2626 zout(2, j, nout2) = r - s
2627 zout(2, j, nout4) = r + s
2632 IF (2*ias == after)
THEN
2641 nout2 = nout1 + after
2642 nout3 = nout2 + after
2643 nout4 = nout3 + after
2645 r1 = zin(1, j, nin1)
2646 s1 = zin(2, j, nin1)
2651 r3 = zin(2, j, nin3)
2652 s3 = -zin(1, j, nin3)
2659 zout(1, j, nout1) = r + s
2660 zout(1, j, nout3) = r - s
2663 zout(1, j, nout2) = r + s
2664 zout(1, j, nout4) = r - s
2667 zout(2, j, nout1) = r + s
2668 zout(2, j, nout3) = r - s
2671 zout(2, j, nout2) = r - s
2672 zout(2, j, nout4) = r + s
2678 cr2 = trig(1, itrig)
2679 ci2 = trig(2, itrig)
2681 cr3 = trig(1, itrig)
2682 ci3 = trig(2, itrig)
2684 cr4 = trig(1, itrig)
2685 ci4 = trig(2, itrig)
2694 nout2 = nout1 + after
2695 nout3 = nout2 + after
2696 nout4 = nout3 + after
2698 r1 = zin(1, j, nin1)
2699 s1 = zin(2, j, nin1)
2714 zout(1, j, nout1) = r + s
2715 zout(1, j, nout3) = r - s
2718 zout(1, j, nout2) = r + s
2719 zout(1, j, nout4) = r - s
2722 zout(2, j, nout1) = r + s
2723 zout(2, j, nout3) = r - s
2726 zout(2, j, nout2) = r - s
2727 zout(2, j, nout4) = r + s
2733 ELSE IF (now == 8)
THEN
2734 IF (isign == -1)
THEN
2748 nout2 = nout1 + after
2749 nout3 = nout2 + after
2750 nout4 = nout3 + after
2751 nout5 = nout4 + after
2752 nout6 = nout5 + after
2753 nout7 = nout6 + after
2754 nout8 = nout7 + after
2756 r1 = zin(1, j, nin1)
2757 s1 = zin(2, j, nin1)
2758 r2 = zin(1, j, nin2)
2759 s2 = zin(2, j, nin2)
2760 r3 = zin(1, j, nin3)
2761 s3 = zin(2, j, nin3)
2762 r4 = zin(1, j, nin4)
2763 s4 = zin(2, j, nin4)
2764 r5 = zin(1, j, nin5)
2765 s5 = zin(2, j, nin5)
2766 r6 = zin(1, j, nin6)
2767 s6 = zin(2, j, nin6)
2768 r7 = zin(1, j, nin7)
2769 s7 = zin(2, j, nin7)
2770 r8 = zin(1, j, nin8)
2771 s8 = zin(2, j, nin8)
2788 zout(1, j, nout1) = ap + bp
2789 zout(2, j, nout1) = cp + dbl
2790 zout(1, j, nout5) = ap - bp
2791 zout(2, j, nout5) = cp - dbl
2792 zout(1, j, nout3) = am + dm
2793 zout(2, j, nout3) = cm - bm
2794 zout(1, j, nout7) = am - dm
2795 zout(2, j, nout7) = cm + bm
2814 cp = (cm + dbl)*rt2i
2815 dbl = (cm - dbl)*rt2i
2816 zout(1, j, nout2) = ap + r
2817 zout(2, j, nout2) = bm + s
2818 zout(1, j, nout6) = ap - r
2819 zout(2, j, nout6) = bm - s
2820 zout(1, j, nout4) = am + cp
2821 zout(2, j, nout4) = bp + dbl
2822 zout(1, j, nout8) = am - cp
2823 zout(2, j, nout8) = bp - dbl
2840 nout2 = nout1 + after
2841 nout3 = nout2 + after
2842 nout4 = nout3 + after
2843 nout5 = nout4 + after
2844 nout6 = nout5 + after
2845 nout7 = nout6 + after
2846 nout8 = nout7 + after
2848 r1 = zin(1, j, nin1)
2849 s1 = zin(2, j, nin1)
2850 r2 = zin(1, j, nin2)
2851 s2 = zin(2, j, nin2)
2852 r3 = zin(1, j, nin3)
2853 s3 = zin(2, j, nin3)
2854 r4 = zin(1, j, nin4)
2855 s4 = zin(2, j, nin4)
2856 r5 = zin(1, j, nin5)
2857 s5 = zin(2, j, nin5)
2858 r6 = zin(1, j, nin6)
2859 s6 = zin(2, j, nin6)
2860 r7 = zin(1, j, nin7)
2861 s7 = zin(2, j, nin7)
2862 r8 = zin(1, j, nin8)
2863 s8 = zin(2, j, nin8)
2880 zout(1, j, nout1) = ap + bp
2881 zout(2, j, nout1) = cp + dbl
2882 zout(1, j, nout5) = ap - bp
2883 zout(2, j, nout5) = cp - dbl
2884 zout(1, j, nout3) = am - dm
2885 zout(2, j, nout3) = cm + bm
2886 zout(1, j, nout7) = am + dm
2887 zout(2, j, nout7) = cm - bm
2906 cp = (cm + dbl)*rt2i
2907 dbl = (-cm + dbl)*rt2i
2908 zout(1, j, nout2) = ap + r
2909 zout(2, j, nout2) = bm + s
2910 zout(1, j, nout6) = ap - r
2911 zout(2, j, nout6) = bm - s
2912 zout(1, j, nout4) = am + cp
2913 zout(2, j, nout4) = bp + dbl
2914 zout(1, j, nout8) = am - cp
2915 zout(2, j, nout8) = bp - dbl
2919 ELSE IF (now == 3)
THEN
2929 nout2 = nout1 + after
2930 nout3 = nout2 + after
2932 r1 = zin(1, j, nin1)
2933 s1 = zin(2, j, nin1)
2934 r2 = zin(1, j, nin2)
2935 s2 = zin(2, j, nin2)
2936 r3 = zin(1, j, nin3)
2937 s3 = zin(2, j, nin3)
2940 zout(1, j, nout1) = r + r1
2941 zout(2, j, nout1) = s + s1
2946 zout(1, j, nout2) = r1 - s2
2947 zout(2, j, nout2) = s1 + r2
2948 zout(1, j, nout3) = r1 + s2
2949 zout(2, j, nout3) = s1 - r2
2954 IF (4*ias == 3*after)
THEN
2955 IF (isign == 1)
THEN
2963 nout2 = nout1 + after
2964 nout3 = nout2 + after
2966 r1 = zin(1, j, nin1)
2967 s1 = zin(2, j, nin1)
2968 r2 = -zin(2, j, nin2)
2969 s2 = zin(1, j, nin2)
2970 r3 = -zin(1, j, nin3)
2971 s3 = -zin(2, j, nin3)
2974 zout(1, j, nout1) = r + r1
2975 zout(2, j, nout1) = s + s1
2980 zout(1, j, nout2) = r1 - s2
2981 zout(2, j, nout2) = s1 + r2
2982 zout(1, j, nout3) = r1 + s2
2983 zout(2, j, nout3) = s1 - r2
2994 nout2 = nout1 + after
2995 nout3 = nout2 + after
2997 r1 = zin(1, j, nin1)
2998 s1 = zin(2, j, nin1)
2999 r2 = zin(2, j, nin2)
3000 s2 = -zin(1, j, nin2)
3001 r3 = -zin(1, j, nin3)
3002 s3 = -zin(2, j, nin3)
3005 zout(1, j, nout1) = r + r1
3006 zout(2, j, nout1) = s + s1
3011 zout(1, j, nout2) = r1 - s2
3012 zout(2, j, nout2) = s1 + r2
3013 zout(1, j, nout3) = r1 + s2
3014 zout(2, j, nout3) = s1 - r2
3018 ELSE IF (8*ias == 3*after)
THEN
3019 IF (isign == 1)
THEN
3027 nout2 = nout1 + after
3028 nout3 = nout2 + after
3030 r1 = zin(1, j, nin1)
3031 s1 = zin(2, j, nin1)
3036 r3 = -zin(2, j, nin3)
3037 s3 = zin(1, j, nin3)
3040 zout(1, j, nout1) = r + r1
3041 zout(2, j, nout1) = s + s1
3046 zout(1, j, nout2) = r1 - s2
3047 zout(2, j, nout2) = s1 + r2
3048 zout(1, j, nout3) = r1 + s2
3049 zout(2, j, nout3) = s1 - r2
3060 nout2 = nout1 + after
3061 nout3 = nout2 + after
3063 r1 = zin(1, j, nin1)
3064 s1 = zin(2, j, nin1)
3069 r3 = zin(2, j, nin3)
3070 s3 = -zin(1, j, nin3)
3073 zout(1, j, nout1) = r + r1
3074 zout(2, j, nout1) = s + s1
3079 zout(1, j, nout2) = r1 - s2
3080 zout(2, j, nout2) = s1 + r2
3081 zout(1, j, nout3) = r1 + s2
3082 zout(2, j, nout3) = s1 - r2
3089 cr2 = trig(1, itrig)
3090 ci2 = trig(2, itrig)
3092 cr3 = trig(1, itrig)
3093 ci3 = trig(2, itrig)
3101 nout2 = nout1 + after
3102 nout3 = nout2 + after
3104 r1 = zin(1, j, nin1)
3105 s1 = zin(2, j, nin1)
3116 zout(1, j, nout1) = r + r1
3117 zout(2, j, nout1) = s + s1
3122 zout(1, j, nout2) = r1 - s2
3123 zout(2, j, nout2) = s1 + r2
3124 zout(1, j, nout3) = r1 + s2
3125 zout(2, j, nout3) = s1 - r2
3130 ELSE IF (now == 5)
THEN
3143 nout2 = nout1 + after
3144 nout3 = nout2 + after
3145 nout4 = nout3 + after
3146 nout5 = nout4 + after
3148 r1 = zin(1, j, nin1)
3149 s1 = zin(2, j, nin1)
3150 r2 = zin(1, j, nin2)
3151 s2 = zin(2, j, nin2)
3152 r3 = zin(1, j, nin3)
3153 s3 = zin(2, j, nin3)
3154 r4 = zin(1, j, nin4)
3155 s4 = zin(2, j, nin4)
3156 r5 = zin(1, j, nin5)
3157 s5 = zin(2, j, nin5)
3162 zout(1, j, nout1) = r1 + r25 + r34
3163 r = cos2*r25 + cos4*r34 + r1
3164 s = sin2*s25 + sin4*s34
3165 zout(1, j, nout2) = r - s
3166 zout(1, j, nout5) = r + s
3167 r = cos4*r25 + cos2*r34 + r1
3168 s = sin4*s25 - sin2*s34
3169 zout(1, j, nout3) = r - s
3170 zout(1, j, nout4) = r + s
3175 zout(2, j, nout1) = s1 + s25 + s34
3176 r = cos2*s25 + cos4*s34 + s1
3177 s = sin2*r25 + sin4*r34
3178 zout(2, j, nout2) = r + s
3179 zout(2, j, nout5) = r - s
3180 r = cos4*s25 + cos2*s34 + s1
3181 s = sin4*r25 - sin2*r34
3182 zout(2, j, nout3) = r + s
3183 zout(2, j, nout4) = r - s
3188 IF (8*ias == 5*after)
THEN
3189 IF (isign == 1)
THEN
3199 nout2 = nout1 + after
3200 nout3 = nout2 + after
3201 nout4 = nout3 + after
3202 nout5 = nout4 + after
3204 r1 = zin(1, j, nin1)
3205 s1 = zin(2, j, nin1)
3210 r3 = -zin(2, j, nin3)
3211 s3 = zin(1, j, nin3)
3216 r5 = -zin(1, j, nin5)
3217 s5 = -zin(2, j, nin5)
3222 zout(1, j, nout1) = r1 + r25 + r34
3223 r = cos2*r25 + cos4*r34 + r1
3224 s = sin2*s25 + sin4*s34
3225 zout(1, j, nout2) = r - s
3226 zout(1, j, nout5) = r + s
3227 r = cos4*r25 + cos2*r34 + r1
3228 s = sin4*s25 - sin2*s34
3229 zout(1, j, nout3) = r - s
3230 zout(1, j, nout4) = r + s
3235 zout(2, j, nout1) = s1 + s25 + s34
3236 r = cos2*s25 + cos4*s34 + s1
3237 s = sin2*r25 + sin4*r34
3238 zout(2, j, nout2) = r + s
3239 zout(2, j, nout5) = r - s
3240 r = cos4*s25 + cos2*s34 + s1
3241 s = sin4*r25 - sin2*r34
3242 zout(2, j, nout3) = r + s
3243 zout(2, j, nout4) = r - s
3256 nout2 = nout1 + after
3257 nout3 = nout2 + after
3258 nout4 = nout3 + after
3259 nout5 = nout4 + after
3261 r1 = zin(1, j, nin1)
3262 s1 = zin(2, j, nin1)
3267 r3 = zin(2, j, nin3)
3268 s3 = -zin(1, j, nin3)
3273 r5 = -zin(1, j, nin5)
3274 s5 = -zin(2, j, nin5)
3279 zout(1, j, nout1) = r1 + r25 + r34
3280 r = cos2*r25 + cos4*r34 + r1
3281 s = sin2*s25 + sin4*s34
3282 zout(1, j, nout2) = r - s
3283 zout(1, j, nout5) = r + s
3284 r = cos4*r25 + cos2*r34 + r1
3285 s = sin4*s25 - sin2*s34
3286 zout(1, j, nout3) = r - s
3287 zout(1, j, nout4) = r + s
3292 zout(2, j, nout1) = s1 + s25 + s34
3293 r = cos2*s25 + cos4*s34 + s1
3294 s = sin2*r25 + sin4*r34
3295 zout(2, j, nout2) = r + s
3296 zout(2, j, nout5) = r - s
3297 r = cos4*s25 + cos2*s34 + s1
3298 s = sin4*r25 - sin2*r34
3299 zout(2, j, nout3) = r + s
3300 zout(2, j, nout4) = r - s
3308 cr2 = trig(1, itrig)
3309 ci2 = trig(2, itrig)
3311 cr3 = trig(1, itrig)
3312 ci3 = trig(2, itrig)
3314 cr4 = trig(1, itrig)
3315 ci4 = trig(2, itrig)
3317 cr5 = trig(1, itrig)
3318 ci5 = trig(2, itrig)
3328 nout2 = nout1 + after
3329 nout3 = nout2 + after
3330 nout4 = nout3 + after
3331 nout5 = nout4 + after
3333 r1 = zin(1, j, nin1)
3334 s1 = zin(2, j, nin1)
3355 zout(1, j, nout1) = r1 + r25 + r34
3356 r = cos2*r25 + cos4*r34 + r1
3357 s = sin2*s25 + sin4*s34
3358 zout(1, j, nout2) = r - s
3359 zout(1, j, nout5) = r + s
3360 r = cos4*r25 + cos2*r34 + r1
3361 s = sin4*s25 - sin2*s34
3362 zout(1, j, nout3) = r - s
3363 zout(1, j, nout4) = r + s
3368 zout(2, j, nout1) = s1 + s25 + s34
3369 r = cos2*s25 + cos4*s34 + s1
3370 s = sin2*r25 + sin4*r34
3371 zout(2, j, nout2) = r + s
3372 zout(2, j, nout5) = r - s
3373 r = cos4*s25 + cos2*s34 + s1
3374 s = sin4*r25 - sin2*r34
3375 zout(2, j, nout3) = r + s
3376 zout(2, j, nout4) = r - s
3381 ELSE IF (now == 6)
THEN
3394 nout2 = nout1 + after
3395 nout3 = nout2 + after
3396 nout4 = nout3 + after
3397 nout5 = nout4 + after
3398 nout6 = nout5 + after
3400 r2 = zin(1, j, nin3)
3401 s2 = zin(2, j, nin3)
3402 r3 = zin(1, j, nin5)
3403 s3 = zin(2, j, nin5)
3406 r1 = zin(1, j, nin1)
3407 s1 = zin(2, j, nin1)
3419 r2 = zin(1, j, nin6)
3420 s2 = zin(2, j, nin6)
3421 r3 = zin(1, j, nin2)
3422 s3 = zin(2, j, nin2)
3425 r1 = zin(1, j, nin4)
3426 s1 = zin(2, j, nin4)
3438 zout(1, j, nout1) = ur1 + vr1
3439 zout(2, j, nout1) = ui1 + vi1
3440 zout(1, j, nout5) = ur2 + vr2
3441 zout(2, j, nout5) = ui2 + vi2
3442 zout(1, j, nout3) = ur3 + vr3
3443 zout(2, j, nout3) = ui3 + vi3
3444 zout(1, j, nout4) = ur1 - vr1
3445 zout(2, j, nout4) = ui1 - vi1
3446 zout(1, j, nout2) = ur2 - vr2
3447 zout(2, j, nout2) = ui2 - vi2
3448 zout(1, j, nout6) = ur3 - vr3
3449 zout(2, j, nout6) = ui3 - vi3
3453 cpabort(
'Error fftstp')
3458 END SUBROUTINE fftstp
3482 SUBROUTINE ctrig(n, trig, after, before, now, isign, ic)
3483 INTEGER,
INTENT(IN) :: n
3484 REAL(dp),
DIMENSION(2, ctrig_length),
INTENT(OUT) :: trig
3485 INTEGER,
DIMENSION(7),
INTENT(OUT) :: after, before, now
3486 INTEGER,
INTENT(IN) :: isign
3487 INTEGER,
INTENT(OUT) :: ic
3489 INTEGER,
PARAMETER :: nt = 82
3490 INTEGER,
DIMENSION(7, nt),
PARAMETER :: idata = reshape((/3, 3, 1, 1, 1, 1, 1, 4, 4, 1, 1, 1,&
3491 1, 1, 5, 5, 1, 1, 1, 1, 1, 6, 6, 1, 1, 1, 1, 1, 8, 8, 1, 1, 1, 1, 1, 9, 3, 3, 1, 1, 1, 1, &
3492 12, 4, 3, 1, 1, 1, 1, 15, 5, 3, 1, 1, 1, 1, 16, 4, 4, 1, 1, 1, 1, 18, 6, 3, 1, 1, 1, 1, 20&
3493 , 5, 4, 1, 1, 1, 1, 24, 8, 3, 1, 1, 1, 1, 25, 5, 5, 1, 1, 1, 1, 27, 3, 3, 3, 1, 1, 1, 30, &
3494 6, 5, 1, 1, 1, 1, 32, 8, 4, 1, 1, 1, 1, 36, 4, 3, 3, 1, 1, 1, 40, 8, 5, 1, 1, 1, 1, 45, 5 &
3495 , 3, 3, 1, 1, 1, 48, 4, 4, 3, 1, 1, 1, 54, 6, 3, 3, 1, 1, 1, 60, 5, 4, 3, 1, 1, 1, 64, 4, &
3496 4, 4, 1, 1, 1, 72, 8, 3, 3, 1, 1, 1, 75, 5, 5, 3, 1, 1, 1, 80, 5, 4, 4, 1, 1, 1, 81, 3, 3 &
3497 , 3, 3, 1, 1, 90, 6, 5, 3, 1, 1, 1, 96, 8, 4, 3, 1, 1, 1, 100, 5, 5, 4, 1, 1, 1, 108, 4, 3&
3498 , 3, 3, 1, 1, 120, 8, 5, 3, 1, 1, 1, 125, 5, 5, 5, 1, 1, 1, 128, 8, 4, 4, 1, 1, 1, 135, 5 &
3499 , 3, 3, 3, 1, 1, 144, 4, 4, 3, 3, 1, 1, 150, 6, 5, 5, 1, 1, 1, 160, 8, 5, 4, 1, 1, 1, 162,&
3500 6, 3, 3, 3, 1, 1, 180, 5, 4, 3, 3, 1, 1, 192, 4, 4, 4, 3, 1, 1, 200, 8, 5, 5, 1, 1, 1, 216&
3501 , 8, 3, 3, 3, 1, 1, 225, 5, 5, 3, 3, 1, 1, 240, 5, 4, 4, 3, 1, 1, 243, 3, 3, 3, 3, 3, 1, &
3502 256, 4, 4, 4, 4, 1, 1, 270, 6, 5, 3, 3, 1, 1, 288, 8, 4, 3, 3, 1, 1, 300, 5, 5, 4, 3, 1, 1&
3503 , 320, 5, 4, 4, 4, 1, 1, 324, 4, 3, 3, 3, 3, 1, 360, 8, 5, 3, 3, 1, 1, 375, 5, 5, 5, 3, 1,&
3504 1, 384, 8, 4, 4, 3, 1, 1, 400, 5, 5, 4, 4, 1, 1, 405, 5, 3, 3, 3, 3, 1, 432, 4, 4, 3, 3, 3&
3505 , 1, 450, 6, 5, 5, 3, 1, 1, 480, 8, 5, 4, 3, 1, 1, 486, 6, 3, 3, 3, 3, 1, 500, 5, 5, 5, 4,&
3506 1, 1, 512, 8, 4, 4, 4, 1, 1, 540, 5, 4, 3, 3, 3, 1, 576, 4, 4, 4, 3, 3, 1, 600, 8, 5, 5, 3&
3507 , 1, 1, 625, 5, 5, 5, 5, 1, 1, 640, 8, 5, 4, 4, 1, 1, 648, 8, 3, 3, 3, 3, 1, 675, 5, 5, 3,&
3508 3, 3, 1, 720, 5, 4, 4, 3, 3, 1, 729, 3, 3, 3, 3, 3, 3, 750, 6, 5, 5, 5, 1, 1, 768, 4, 4, 4&
3509 , 4, 3, 1, 800, 8, 5, 5, 4, 1, 1, 810, 6, 5, 3, 3, 3, 1, 864, 8, 4, 3, 3, 3, 1, 900, 5, 5,&
3510 4, 3, 3, 1, 960, 5, 4, 4, 4, 3, 1, 972, 4, 3, 3, 3, 3, 3, 1000, 8, 5, 5, 5, 1, 1, &
3511 ctrig_length, 4, 4, 4, 4, 4, 1/), (/7, nt/))
3513 INTEGER :: i, itt, j
3514 REAL(dp) :: angle, twopi
3517 IF (n == idata(1, i))
THEN
3520 itt = idata(1 + j, i)
3523 now(j) = idata(1 + j, i)
3531 WRITE (*,
'(A,i5,A)')
" Value of ", n, &
3532 " not allowed for fft, allowed values are:"
3533 WRITE (*,
'(15i5)') (idata(1, j), j=1, nt)
3541 after(i) = after(i - 1)*now(i - 1)
3542 before(ic - i + 1) = before(ic - i + 2)*now(ic - i + 2)
3545 twopi = 8._dp*atan(1._dp)
3546 angle = isign*twopi/real(n, dp)
3550 trig(1, i + 1) = cos(real(i, dp)*angle)
3551 trig(2, i + 1) = sin(real(i, dp)*angle)
3554 END SUBROUTINE ctrig
3565 SUBROUTINE matmov(n, m, a, lda, b, ldb)
3566 INTEGER :: n, m, lda
3567 COMPLEX(dp) :: a(lda, *)
3569 COMPLEX(dp) :: b(ldb, *)
3571 b(1:n, 1:m) = a(1:n, 1:m)
3572 END SUBROUTINE matmov
3583 SUBROUTINE zgetmo(a, lda, m, n, b, ldb)
3584 INTEGER :: lda, m, n
3585 COMPLEX(dp) :: a(lda, n)
3587 COMPLEX(dp) :: b(ldb, m)
3589 b(1:n, 1:m) = transpose(a(1:m, 1:n))
3590 END SUBROUTINE zgetmo
3598 SUBROUTINE scaled(n, sc, a)
3603 CALL dscal(n, sc, a, 1)
3605 END SUBROUTINE scaled
Defines the basic variable types.
integer, parameter, public dp