10 USE iso_c_binding,
ONLY: c_f_pointer,&
16#include "../../base/base_uses.f90"
22 INTEGER,
PARAMETER :: ctrig_length = 1024
23 INTEGER,
PARAMETER :: cache_size = 2048
43 SUBROUTINE mltfftsg(transa, transb, a, ldax, lday, b, ldbx, ldby, n, m, isign, scale)
45 CHARACTER(LEN=1),
INTENT(IN) :: transa, transb
46 INTEGER,
INTENT(IN) :: ldax, lday
47 COMPLEX(dp),
INTENT(INOUT) :: a(ldax, lday)
48 INTEGER,
INTENT(IN) :: ldbx, ldby
49 COMPLEX(dp),
INTENT(INOUT) :: b(ldbx, ldby)
50 INTEGER,
INTENT(IN) :: n, m, isign
51 REAL(
dp),
INTENT(IN) :: scale
53 COMPLEX(dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: z
54 INTEGER :: after(20), before(20), chunk, i, ic, id, &
55 iend, inzee, isig, istart, iterations, &
56 itr, length, lot, nfft, now(20), &
59 REAL(
dp) :: trig(2, 1024)
63 length = 2*(cache_size/4 + 1)
66 tscal = (abs(scale - 1._dp) > 1.e-12_dp)
67 CALL ctrig(n, trig, after, before, now, isig, ic)
68 lot = cache_size/(4*n)
69 lot = lot - mod(lot + 1, 2)
73 id = 0; num_threads = 1
82 ALLOCATE (z(length, 2, 0:num_threads - 1))
83 iterations = (m + lot - 1)/lot
84 chunk = lot*((iterations + num_threads - 1)/num_threads)
90 iend = min((id + 1)*chunk, m)
92 DO itr = istart, iend, lot
94 nfft = min(m - itr + 1, lot)
95 IF (transa ==
'N' .OR. transa ==
'n')
THEN
96 CALL fftpre_cmplx(nfft, nfft, ldax, lot, n, a(1, itr), z(1, 1, id), &
97 trig, now(1), after(1), before(1), isig)
99 CALL fftstp_cmplx(ldax, nfft, n, lot, n, a(itr, 1), z(1, 1, id), &
100 trig, now(1), after(1), before(1), isig)
103 IF (lot == nfft)
THEN
104 CALL scaled(2*lot*n, scale, z(1, 1, id))
107 CALL scaled(2*nfft, scale, z(lot*(i - 1) + 1, 1, id))
112 IF (transb ==
'N' .OR. transb ==
'n')
THEN
113 CALL zgetmo(z(1, 1, id), lot, nfft, n, b(1, itr), ldbx)
115 CALL matmov(nfft, n, z(1, 1, id), lot, b(itr, 1), ldbx)
120 CALL fftstp_cmplx(lot, nfft, n, lot, n, z(1, inzee, id), &
121 z(1, 3 - inzee, id), trig, now(i), after(i), &
125 IF (transb ==
'N' .OR. transb ==
'n')
THEN
126 CALL fftrot_cmplx(lot, nfft, n, nfft, ldbx, z(1, inzee, id), &
127 b(1, itr), trig, now(ic), after(ic), before(ic), isig)
129 CALL fftstp_cmplx(lot, nfft, n, ldbx, n, z(1, inzee, id), &
130 b(itr, 1), trig, now(ic), after(ic), before(ic), isig)
139 IF (transb ==
'N' .OR. transb ==
'n')
THEN
140 b(1:ldbx, m + 1:ldby) = cmplx(0._dp, 0._dp,
dp)
141 b(n + 1:ldbx, 1:m) = cmplx(0._dp, 0._dp,
dp)
143 b(1:ldbx, n + 1:ldby) = cmplx(0._dp, 0._dp,
dp)
144 b(m + 1:ldbx, 1:n) = cmplx(0._dp, 0._dp,
dp)
165 SUBROUTINE fftstp_cmplx(mm, nfft, m, nn, n, zin, zout, trig, now, after, before, isign)
167 INTEGER,
INTENT(IN) :: mm, nfft, m, nn, n
168 COMPLEX(dp),
DIMENSION(mm, m),
INTENT(IN),
TARGET :: zin
169 COMPLEX(dp),
DIMENSION(nn, n),
INTENT(INOUT), &
171 REAL(
dp),
DIMENSION(2, ctrig_length),
INTENT(IN) :: trig
172 INTEGER,
INTENT(IN) :: now, after, before, isign
174 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: zin_real, zout_real
176 CALL c_f_pointer(c_loc(zin), zin_real, [2, mm, m])
177 CALL c_f_pointer(c_loc(zout), zout_real, [2, nn, n])
178 CALL fftstp(mm, nfft, m, nn, n, zin_real, zout_real, trig, now, after, before, isign)
180 END SUBROUTINE fftstp_cmplx
197 SUBROUTINE fftpre_cmplx(mm, nfft, m, nn, n, zin, zout, trig, now, after, before, isign)
199 INTEGER,
INTENT(IN) :: mm, nfft, m, nn, n
200 COMPLEX(dp),
DIMENSION(m, mm),
INTENT(IN),
TARGET :: zin
201 COMPLEX(dp),
DIMENSION(nn, n),
INTENT(INOUT), &
203 REAL(
dp),
DIMENSION(2, ctrig_length),
INTENT(IN) :: trig
204 INTEGER,
INTENT(IN) :: now, after, before, isign
206 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: zin_real, zout_real
208 CALL c_f_pointer(c_loc(zin), zin_real, [2, mm, m])
209 CALL c_f_pointer(c_loc(zout), zout_real, [2, nn, n])
211 CALL fftpre(mm, nfft, m, nn, n, zin_real, zout_real, trig, now, after, before, isign)
213 END SUBROUTINE fftpre_cmplx
230 SUBROUTINE fftrot_cmplx(mm, nfft, m, nn, n, zin, zout, trig, now, after, before, isign)
233 INTEGER,
INTENT(IN) :: mm, nfft, m, nn, n
234 COMPLEX(dp),
DIMENSION(mm, m),
INTENT(IN),
TARGET :: zin
235 COMPLEX(dp),
DIMENSION(n, nn),
INTENT(INOUT), &
237 REAL(
dp),
DIMENSION(2, ctrig_length),
INTENT(IN) :: trig
238 INTEGER,
INTENT(IN) :: now, after, before, isign
240 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: zin_real, zout_real
242 CALL c_f_pointer(c_loc(zin), zin_real, [2, mm, m])
243 CALL c_f_pointer(c_loc(zout), zout_real, [2, nn, n])
245 CALL fftrot(mm, nfft, m, nn, n, zin_real, zout_real, trig, now, after, before, isign)
247 END SUBROUTINE fftrot_cmplx
275 SUBROUTINE fftrot(mm, nfft, m, nn, n, zin, zout, trig, now, after, before, isign)
278 INTEGER,
INTENT(IN) :: mm, nfft, m, nn, n
279 REAL(
dp),
DIMENSION(2, mm, m),
INTENT(IN) :: zin
280 REAL(
dp),
DIMENSION(2, n, nn),
INTENT(INOUT) :: zout
281 REAL(
dp),
DIMENSION(2, ctrig_length),
INTENT(IN) :: trig
282 INTEGER,
INTENT(IN) :: now, after, before, isign
284 REAL(
dp),
PARAMETER :: bb = 0.8660254037844387_dp, cos2 = 0.3090169943749474_dp, &
285 cos4 = -0.8090169943749474_dp, rt2i = 0.7071067811865475_dp, &
286 sin2p = 0.9510565162951536_dp, sin4p = 0.5877852522924731_dp
288 INTEGER :: atb, atn, ia, ias, ib, itrig, itt, j, &
289 nin1, nin2, nin3, nin4, nin5, nin6, &
290 nin7, nin8, nout1, nout2, nout3, &
291 nout4, nout5, nout6, nout7, nout8
292 REAL(
dp) :: am, ap, bbs, bm, bp, ci2, ci3, ci4, ci5, cm, cp, cr2, cr3, cr4, cr5, dbl, dm, r, &
293 r1, r2, r25, r3, r34, r4, r5, r6, r7, r8, s, s1, s2, s25, s3, s34, s4, s5, s6, s7, s8, &
294 sin2, sin4, ui1, ui2, ui3, ur1, ur2, ur3, vi1, vi2, vi3, vr1, vr2, vr3
318 nout2 = nout1 + after
319 nout3 = nout2 + after
320 nout4 = nout3 + after
332 zout(1, nout1, j) = r + s
333 zout(1, nout3, j) = r - s
336 zout(1, nout2, j) = r - s
337 zout(1, nout4, j) = r + s
340 zout(2, nout1, j) = r + s
341 zout(2, nout3, j) = r - s
344 zout(2, nout2, j) = r + s
345 zout(2, nout4, j) = r - s
350 IF (2*ias == after)
THEN
359 nout2 = nout1 + after
360 nout3 = nout2 + after
361 nout4 = nout3 + after
369 r3 = -zin(2, j, nin3)
377 zout(1, nout1, j) = r + s
378 zout(1, nout3, j) = r - s
381 zout(1, nout2, j) = r - s
382 zout(1, nout4, j) = r + s
385 zout(2, nout1, j) = r + s
386 zout(2, nout3, j) = r - s
389 zout(2, nout2, j) = r + s
390 zout(2, nout4, j) = r - s
412 nout2 = nout1 + after
413 nout3 = nout2 + after
414 nout4 = nout3 + after
432 zout(1, nout1, j) = r + s
433 zout(1, nout3, j) = r - s
436 zout(1, nout2, j) = r - s
437 zout(1, nout4, j) = r + s
440 zout(2, nout1, j) = r + s
441 zout(2, nout3, j) = r - s
444 zout(2, nout2, j) = r + s
445 zout(2, nout4, j) = r - s
460 nout2 = nout1 + after
461 nout3 = nout2 + after
462 nout4 = nout3 + after
474 zout(1, nout1, j) = r + s
475 zout(1, nout3, j) = r - s
478 zout(1, nout2, j) = r + s
479 zout(1, nout4, j) = r - s
482 zout(2, nout1, j) = r + s
483 zout(2, nout3, j) = r - s
486 zout(2, nout2, j) = r - s
487 zout(2, nout4, j) = r + s
492 IF (2*ias == after)
THEN
501 nout2 = nout1 + after
502 nout3 = nout2 + after
503 nout4 = nout3 + after
512 s3 = -zin(1, j, nin3)
519 zout(1, nout1, j) = r + s
520 zout(1, nout3, j) = r - s
523 zout(1, nout2, j) = r + s
524 zout(1, nout4, j) = r - s
527 zout(2, nout1, j) = r + s
528 zout(2, nout3, j) = r - s
531 zout(2, nout2, j) = r - s
532 zout(2, nout4, j) = r + s
554 nout2 = nout1 + after
555 nout3 = nout2 + after
556 nout4 = nout3 + after
574 zout(1, nout1, j) = r + s
575 zout(1, nout3, j) = r - s
578 zout(1, nout2, j) = r + s
579 zout(1, nout4, j) = r - s
582 zout(2, nout1, j) = r + s
583 zout(2, nout3, j) = r - s
586 zout(2, nout2, j) = r - s
587 zout(2, nout4, j) = r + s
593 ELSE IF (now == 8)
THEN
594 IF (isign == -1)
THEN
608 nout2 = nout1 + after
609 nout3 = nout2 + after
610 nout4 = nout3 + after
611 nout5 = nout4 + after
612 nout6 = nout5 + after
613 nout7 = nout6 + after
614 nout8 = nout7 + after
648 zout(1, nout1, j) = ap + bp
649 zout(2, nout1, j) = cp + dbl
650 zout(1, nout5, j) = ap - bp
651 zout(2, nout5, j) = cp - dbl
652 zout(1, nout3, j) = am + dm
653 zout(2, nout3, j) = cm - bm
654 zout(1, nout7, j) = am - dm
655 zout(2, nout7, j) = cm + bm
675 dbl = (cm - dbl)*rt2i
676 zout(1, nout2, j) = ap + r
677 zout(2, nout2, j) = bm + s
678 zout(1, nout6, j) = ap - r
679 zout(2, nout6, j) = bm - s
680 zout(1, nout4, j) = am + cp
681 zout(2, nout4, j) = bp + dbl
682 zout(1, nout8, j) = am - cp
683 zout(2, nout8, j) = bp - dbl
700 nout2 = nout1 + after
701 nout3 = nout2 + after
702 nout4 = nout3 + after
703 nout5 = nout4 + after
704 nout6 = nout5 + after
705 nout7 = nout6 + after
706 nout8 = nout7 + after
740 zout(1, nout1, j) = ap + bp
741 zout(2, nout1, j) = cp + dbl
742 zout(1, nout5, j) = ap - bp
743 zout(2, nout5, j) = cp - dbl
744 zout(1, nout3, j) = am - dm
745 zout(2, nout3, j) = cm + bm
746 zout(1, nout7, j) = am + dm
747 zout(2, nout7, j) = cm - bm
767 dbl = (-cm + dbl)*rt2i
768 zout(1, nout2, j) = ap + r
769 zout(2, nout2, j) = bm + s
770 zout(1, nout6, j) = ap - r
771 zout(2, nout6, j) = bm - s
772 zout(1, nout4, j) = am + cp
773 zout(2, nout4, j) = bp + dbl
774 zout(1, nout8, j) = am - cp
775 zout(2, nout8, j) = bp - dbl
779 ELSE IF (now == 3)
THEN
789 nout2 = nout1 + after
790 nout3 = nout2 + after
800 zout(1, nout1, j) = r + r1
801 zout(2, nout1, j) = s + s1
806 zout(1, nout2, j) = r1 - s2
807 zout(2, nout2, j) = s1 + r2
808 zout(1, nout3, j) = r1 + s2
809 zout(2, nout3, j) = s1 - r2
814 IF (4*ias == 3*after)
THEN
823 nout2 = nout1 + after
824 nout3 = nout2 + after
828 r2 = -zin(2, j, nin2)
830 r3 = -zin(1, j, nin3)
831 s3 = -zin(2, j, nin3)
834 zout(1, nout1, j) = r + r1
835 zout(2, nout1, j) = s + s1
840 zout(1, nout2, j) = r1 - s2
841 zout(2, nout2, j) = s1 + r2
842 zout(1, nout3, j) = r1 + s2
843 zout(2, nout3, j) = s1 - r2
854 nout2 = nout1 + after
855 nout3 = nout2 + after
860 s2 = -zin(1, j, nin2)
861 r3 = -zin(1, j, nin3)
862 s3 = -zin(2, j, nin3)
865 zout(1, nout1, j) = r + r1
866 zout(2, nout1, j) = s + s1
871 zout(1, nout2, j) = r1 - s2
872 zout(2, nout2, j) = s1 + r2
873 zout(1, nout3, j) = r1 + s2
874 zout(2, nout3, j) = s1 - r2
878 ELSE IF (8*ias == 3*after)
THEN
887 nout2 = nout1 + after
888 nout3 = nout2 + after
896 r3 = -zin(2, j, nin3)
900 zout(1, nout1, j) = r + r1
901 zout(2, nout1, j) = s + s1
906 zout(1, nout2, j) = r1 - s2
907 zout(2, nout2, j) = s1 + r2
908 zout(1, nout3, j) = r1 + s2
909 zout(2, nout3, j) = s1 - r2
920 nout2 = nout1 + after
921 nout3 = nout2 + after
930 s3 = -zin(1, j, nin3)
933 zout(1, nout1, j) = r + r1
934 zout(2, nout1, j) = s + s1
939 zout(1, nout2, j) = r1 - s2
940 zout(2, nout2, j) = s1 + r2
941 zout(1, nout3, j) = r1 + s2
942 zout(2, nout3, j) = s1 - r2
961 nout2 = nout1 + after
962 nout3 = nout2 + after
976 zout(1, nout1, j) = r + r1
977 zout(2, nout1, j) = s + s1
982 zout(1, nout2, j) = r1 - s2
983 zout(2, nout2, j) = s1 + r2
984 zout(1, nout3, j) = r1 + s2
985 zout(2, nout3, j) = s1 - r2
990 ELSE IF (now == 5)
THEN
1003 nout2 = nout1 + after
1004 nout3 = nout2 + after
1005 nout4 = nout3 + after
1006 nout5 = nout4 + after
1008 r1 = zin(1, j, nin1)
1009 s1 = zin(2, j, nin1)
1010 r2 = zin(1, j, nin2)
1011 s2 = zin(2, j, nin2)
1012 r3 = zin(1, j, nin3)
1013 s3 = zin(2, j, nin3)
1014 r4 = zin(1, j, nin4)
1015 s4 = zin(2, j, nin4)
1016 r5 = zin(1, j, nin5)
1017 s5 = zin(2, j, nin5)
1022 zout(1, nout1, j) = r1 + r25 + r34
1023 r = cos2*r25 + cos4*r34 + r1
1024 s = sin2*s25 + sin4*s34
1025 zout(1, nout2, j) = r - s
1026 zout(1, nout5, j) = r + s
1027 r = cos4*r25 + cos2*r34 + r1
1028 s = sin4*s25 - sin2*s34
1029 zout(1, nout3, j) = r - s
1030 zout(1, nout4, j) = r + s
1035 zout(2, nout1, j) = s1 + s25 + s34
1036 r = cos2*s25 + cos4*s34 + s1
1037 s = sin2*r25 + sin4*r34
1038 zout(2, nout2, j) = r + s
1039 zout(2, nout5, j) = r - s
1040 r = cos4*s25 + cos2*s34 + s1
1041 s = sin4*r25 - sin2*r34
1042 zout(2, nout3, j) = r + s
1043 zout(2, nout4, j) = r - s
1048 IF (8*ias == 5*after)
THEN
1049 IF (isign == 1)
THEN
1059 nout2 = nout1 + after
1060 nout3 = nout2 + after
1061 nout4 = nout3 + after
1062 nout5 = nout4 + after
1064 r1 = zin(1, j, nin1)
1065 s1 = zin(2, j, nin1)
1070 r3 = -zin(2, j, nin3)
1071 s3 = zin(1, j, nin3)
1076 r5 = -zin(1, j, nin5)
1077 s5 = -zin(2, j, nin5)
1082 zout(1, nout1, j) = r1 + r25 + r34
1083 r = cos2*r25 + cos4*r34 + r1
1084 s = sin2*s25 + sin4*s34
1085 zout(1, nout2, j) = r - s
1086 zout(1, nout5, j) = r + s
1087 r = cos4*r25 + cos2*r34 + r1
1088 s = sin4*s25 - sin2*s34
1089 zout(1, nout3, j) = r - s
1090 zout(1, nout4, j) = r + s
1095 zout(2, nout1, j) = s1 + s25 + s34
1096 r = cos2*s25 + cos4*s34 + s1
1097 s = sin2*r25 + sin4*r34
1098 zout(2, nout2, j) = r + s
1099 zout(2, nout5, j) = r - s
1100 r = cos4*s25 + cos2*s34 + s1
1101 s = sin4*r25 - sin2*r34
1102 zout(2, nout3, j) = r + s
1103 zout(2, nout4, j) = r - s
1116 nout2 = nout1 + after
1117 nout3 = nout2 + after
1118 nout4 = nout3 + after
1119 nout5 = nout4 + after
1121 r1 = zin(1, j, nin1)
1122 s1 = zin(2, j, nin1)
1127 r3 = zin(2, j, nin3)
1128 s3 = -zin(1, j, nin3)
1133 r5 = -zin(1, j, nin5)
1134 s5 = -zin(2, j, nin5)
1139 zout(1, nout1, j) = r1 + r25 + r34
1140 r = cos2*r25 + cos4*r34 + r1
1141 s = sin2*s25 + sin4*s34
1142 zout(1, nout2, j) = r - s
1143 zout(1, nout5, j) = r + s
1144 r = cos4*r25 + cos2*r34 + r1
1145 s = sin4*s25 - sin2*s34
1146 zout(1, nout3, j) = r - s
1147 zout(1, nout4, j) = r + s
1152 zout(2, nout1, j) = s1 + s25 + s34
1153 r = cos2*s25 + cos4*s34 + s1
1154 s = sin2*r25 + sin4*r34
1155 zout(2, nout2, j) = r + s
1156 zout(2, nout5, j) = r - s
1157 r = cos4*s25 + cos2*s34 + s1
1158 s = sin4*r25 - sin2*r34
1159 zout(2, nout3, j) = r + s
1160 zout(2, nout4, j) = r - s
1168 cr2 = trig(1, itrig)
1169 ci2 = trig(2, itrig)
1171 cr3 = trig(1, itrig)
1172 ci3 = trig(2, itrig)
1174 cr4 = trig(1, itrig)
1175 ci4 = trig(2, itrig)
1177 cr5 = trig(1, itrig)
1178 ci5 = trig(2, itrig)
1188 nout2 = nout1 + after
1189 nout3 = nout2 + after
1190 nout4 = nout3 + after
1191 nout5 = nout4 + after
1193 r1 = zin(1, j, nin1)
1194 s1 = zin(2, j, nin1)
1215 zout(1, nout1, j) = r1 + r25 + r34
1216 r = cos2*r25 + cos4*r34 + r1
1217 s = sin2*s25 + sin4*s34
1218 zout(1, nout2, j) = r - s
1219 zout(1, nout5, j) = r + s
1220 r = cos4*r25 + cos2*r34 + r1
1221 s = sin4*s25 - sin2*s34
1222 zout(1, nout3, j) = r - s
1223 zout(1, nout4, j) = r + s
1228 zout(2, nout1, j) = s1 + s25 + s34
1229 r = cos2*s25 + cos4*s34 + s1
1230 s = sin2*r25 + sin4*r34
1231 zout(2, nout2, j) = r + s
1232 zout(2, nout5, j) = r - s
1233 r = cos4*s25 + cos2*s34 + s1
1234 s = sin4*r25 - sin2*r34
1235 zout(2, nout3, j) = r + s
1236 zout(2, nout4, j) = r - s
1241 ELSE IF (now == 6)
THEN
1254 nout2 = nout1 + after
1255 nout3 = nout2 + after
1256 nout4 = nout3 + after
1257 nout5 = nout4 + after
1258 nout6 = nout5 + after
1260 r2 = zin(1, j, nin3)
1261 s2 = zin(2, j, nin3)
1262 r3 = zin(1, j, nin5)
1263 s3 = zin(2, j, nin5)
1266 r1 = zin(1, j, nin1)
1267 s1 = zin(2, j, nin1)
1279 r2 = zin(1, j, nin6)
1280 s2 = zin(2, j, nin6)
1281 r3 = zin(1, j, nin2)
1282 s3 = zin(2, j, nin2)
1285 r1 = zin(1, j, nin4)
1286 s1 = zin(2, j, nin4)
1298 zout(1, nout1, j) = ur1 + vr1
1299 zout(2, nout1, j) = ui1 + vi1
1300 zout(1, nout5, j) = ur2 + vr2
1301 zout(2, nout5, j) = ui2 + vi2
1302 zout(1, nout3, j) = ur3 + vr3
1303 zout(2, nout3, j) = ui3 + vi3
1304 zout(1, nout4, j) = ur1 - vr1
1305 zout(2, nout4, j) = ui1 - vi1
1306 zout(1, nout2, j) = ur2 - vr2
1307 zout(2, nout2, j) = ui2 - vi2
1308 zout(1, nout6, j) = ur3 - vr3
1309 zout(2, nout6, j) = ui3 - vi3
1313 cpabort(
'Error fftrot')
1318 END SUBROUTINE fftrot
1347 SUBROUTINE fftpre(mm, nfft, m, nn, n, zin, zout, trig, now, after, before, isign)
1349 INTEGER,
INTENT(IN) :: mm, nfft, m, nn, n
1350 REAL(dp),
DIMENSION(2, m, mm),
INTENT(IN) :: zin
1351 REAL(dp),
DIMENSION(2, nn, n),
INTENT(INOUT) :: zout
1352 REAL(dp),
DIMENSION(2, ctrig_length),
INTENT(IN) :: trig
1353 INTEGER,
INTENT(IN) :: now, after, before, isign
1355 REAL(dp),
PARAMETER :: bb = 0.8660254037844387_dp, cos2 = 0.3090169943749474_dp, &
1356 cos4 = -0.8090169943749474_dp, rt2i = 0.7071067811865475_dp, &
1357 sin2p = 0.9510565162951536_dp, sin4p = 0.5877852522924731_dp
1359 INTEGER :: atb, atn, ia, ias, ib, itrig, itt, j, &
1360 nin1, nin2, nin3, nin4, nin5, nin6, &
1361 nin7, nin8, nout1, nout2, nout3, &
1362 nout4, nout5, nout6, nout7, nout8
1363 REAL(dp) :: am, ap, bbs, bm, bp, ci2, ci3, ci4, ci5, cm, cp, cr2, cr3, cr4, cr5, dbl, dm, r, &
1364 r1, r2, r25, r3, r34, r4, r5, r6, r7, r8, s, s1, s2, s25, s3, s34, s4, s5, s6, s7, s8, &
1365 sin2, sin4, ui1, ui2, ui3, ur1, ur2, ur3, vi1, vi2, vi3, vr1, vr2, vr3
1379 IF (isign == 1)
THEN
1389 nout2 = nout1 + after
1390 nout3 = nout2 + after
1391 nout4 = nout3 + after
1393 r1 = zin(1, nin1, j)
1394 s1 = zin(2, nin1, j)
1395 r2 = zin(1, nin2, j)
1396 s2 = zin(2, nin2, j)
1397 r3 = zin(1, nin3, j)
1398 s3 = zin(2, nin3, j)
1399 r4 = zin(1, nin4, j)
1400 s4 = zin(2, nin4, j)
1403 zout(1, j, nout1) = r + s
1404 zout(1, j, nout3) = r - s
1407 zout(1, j, nout2) = r - s
1408 zout(1, j, nout4) = r + s
1411 zout(2, j, nout1) = r + s
1412 zout(2, j, nout3) = r - s
1415 zout(2, j, nout2) = r + s
1416 zout(2, j, nout4) = r - s
1421 IF (2*ias == after)
THEN
1430 nout2 = nout1 + after
1431 nout3 = nout2 + after
1432 nout4 = nout3 + after
1434 r1 = zin(1, nin1, j)
1435 s1 = zin(2, nin1, j)
1440 r3 = -zin(2, nin3, j)
1441 s3 = zin(1, nin3, j)
1448 zout(1, j, nout1) = r + s
1449 zout(1, j, nout3) = r - s
1452 zout(1, j, nout2) = r - s
1453 zout(1, j, nout4) = r + s
1456 zout(2, j, nout1) = r + s
1457 zout(2, j, nout3) = r - s
1460 zout(2, j, nout2) = r + s
1461 zout(2, j, nout4) = r - s
1467 cr2 = trig(1, itrig)
1468 ci2 = trig(2, itrig)
1470 cr3 = trig(1, itrig)
1471 ci3 = trig(2, itrig)
1473 cr4 = trig(1, itrig)
1474 ci4 = trig(2, itrig)
1483 nout2 = nout1 + after
1484 nout3 = nout2 + after
1485 nout4 = nout3 + after
1487 r1 = zin(1, nin1, j)
1488 s1 = zin(2, nin1, j)
1503 zout(1, j, nout1) = r + s
1504 zout(1, j, nout3) = r - s
1507 zout(1, j, nout2) = r - s
1508 zout(1, j, nout4) = r + s
1511 zout(2, j, nout1) = r + s
1512 zout(2, j, nout3) = r - s
1515 zout(2, j, nout2) = r + s
1516 zout(2, j, nout4) = r - s
1531 nout2 = nout1 + after
1532 nout3 = nout2 + after
1533 nout4 = nout3 + after
1535 r1 = zin(1, nin1, j)
1536 s1 = zin(2, nin1, j)
1537 r2 = zin(1, nin2, j)
1538 s2 = zin(2, nin2, j)
1539 r3 = zin(1, nin3, j)
1540 s3 = zin(2, nin3, j)
1541 r4 = zin(1, nin4, j)
1542 s4 = zin(2, nin4, j)
1545 zout(1, j, nout1) = r + s
1546 zout(1, j, nout3) = r - s
1549 zout(1, j, nout2) = r + s
1550 zout(1, j, nout4) = r - s
1553 zout(2, j, nout1) = r + s
1554 zout(2, j, nout3) = r - s
1557 zout(2, j, nout2) = r - s
1558 zout(2, j, nout4) = r + s
1563 IF (2*ias == after)
THEN
1572 nout2 = nout1 + after
1573 nout3 = nout2 + after
1574 nout4 = nout3 + after
1576 r1 = zin(1, nin1, j)
1577 s1 = zin(2, nin1, j)
1582 r3 = zin(2, nin3, j)
1583 s3 = -zin(1, nin3, j)
1590 zout(1, j, nout1) = r + s
1591 zout(1, j, nout3) = r - s
1594 zout(1, j, nout2) = r + s
1595 zout(1, j, nout4) = r - s
1598 zout(2, j, nout1) = r + s
1599 zout(2, j, nout3) = r - s
1602 zout(2, j, nout2) = r - s
1603 zout(2, j, nout4) = r + s
1609 cr2 = trig(1, itrig)
1610 ci2 = trig(2, itrig)
1612 cr3 = trig(1, itrig)
1613 ci3 = trig(2, itrig)
1615 cr4 = trig(1, itrig)
1616 ci4 = trig(2, itrig)
1625 nout2 = nout1 + after
1626 nout3 = nout2 + after
1627 nout4 = nout3 + after
1629 r1 = zin(1, nin1, j)
1630 s1 = zin(2, nin1, j)
1645 zout(1, j, nout1) = r + s
1646 zout(1, j, nout3) = r - s
1649 zout(1, j, nout2) = r + s
1650 zout(1, j, nout4) = r - s
1653 zout(2, j, nout1) = r + s
1654 zout(2, j, nout3) = r - s
1657 zout(2, j, nout2) = r - s
1658 zout(2, j, nout4) = r + s
1664 ELSE IF (now == 8)
THEN
1665 IF (isign == -1)
THEN
1679 nout2 = nout1 + after
1680 nout3 = nout2 + after
1681 nout4 = nout3 + after
1682 nout5 = nout4 + after
1683 nout6 = nout5 + after
1684 nout7 = nout6 + after
1685 nout8 = nout7 + after
1687 r1 = zin(1, nin1, j)
1688 s1 = zin(2, nin1, j)
1689 r2 = zin(1, nin2, j)
1690 s2 = zin(2, nin2, j)
1691 r3 = zin(1, nin3, j)
1692 s3 = zin(2, nin3, j)
1693 r4 = zin(1, nin4, j)
1694 s4 = zin(2, nin4, j)
1695 r5 = zin(1, nin5, j)
1696 s5 = zin(2, nin5, j)
1697 r6 = zin(1, nin6, j)
1698 s6 = zin(2, nin6, j)
1699 r7 = zin(1, nin7, j)
1700 s7 = zin(2, nin7, j)
1701 r8 = zin(1, nin8, j)
1702 s8 = zin(2, nin8, j)
1719 zout(1, j, nout1) = ap + bp
1720 zout(2, j, nout1) = cp + dbl
1721 zout(1, j, nout5) = ap - bp
1722 zout(2, j, nout5) = cp - dbl
1723 zout(1, j, nout3) = am + dm
1724 zout(2, j, nout3) = cm - bm
1725 zout(1, j, nout7) = am - dm
1726 zout(2, j, nout7) = cm + bm
1745 cp = (cm + dbl)*rt2i
1746 dbl = (cm - dbl)*rt2i
1747 zout(1, j, nout2) = ap + r
1748 zout(2, j, nout2) = bm + s
1749 zout(1, j, nout6) = ap - r
1750 zout(2, j, nout6) = bm - s
1751 zout(1, j, nout4) = am + cp
1752 zout(2, j, nout4) = bp + dbl
1753 zout(1, j, nout8) = am - cp
1754 zout(2, j, nout8) = bp - dbl
1771 nout2 = nout1 + after
1772 nout3 = nout2 + after
1773 nout4 = nout3 + after
1774 nout5 = nout4 + after
1775 nout6 = nout5 + after
1776 nout7 = nout6 + after
1777 nout8 = nout7 + after
1779 r1 = zin(1, nin1, j)
1780 s1 = zin(2, nin1, j)
1781 r2 = zin(1, nin2, j)
1782 s2 = zin(2, nin2, j)
1783 r3 = zin(1, nin3, j)
1784 s3 = zin(2, nin3, j)
1785 r4 = zin(1, nin4, j)
1786 s4 = zin(2, nin4, j)
1787 r5 = zin(1, nin5, j)
1788 s5 = zin(2, nin5, j)
1789 r6 = zin(1, nin6, j)
1790 s6 = zin(2, nin6, j)
1791 r7 = zin(1, nin7, j)
1792 s7 = zin(2, nin7, j)
1793 r8 = zin(1, nin8, j)
1794 s8 = zin(2, nin8, j)
1811 zout(1, j, nout1) = ap + bp
1812 zout(2, j, nout1) = cp + dbl
1813 zout(1, j, nout5) = ap - bp
1814 zout(2, j, nout5) = cp - dbl
1815 zout(1, j, nout3) = am - dm
1816 zout(2, j, nout3) = cm + bm
1817 zout(1, j, nout7) = am + dm
1818 zout(2, j, nout7) = cm - bm
1837 cp = (cm + dbl)*rt2i
1838 dbl = (-cm + dbl)*rt2i
1839 zout(1, j, nout2) = ap + r
1840 zout(2, j, nout2) = bm + s
1841 zout(1, j, nout6) = ap - r
1842 zout(2, j, nout6) = bm - s
1843 zout(1, j, nout4) = am + cp
1844 zout(2, j, nout4) = bp + dbl
1845 zout(1, j, nout8) = am - cp
1846 zout(2, j, nout8) = bp - dbl
1850 ELSE IF (now == 3)
THEN
1860 nout2 = nout1 + after
1861 nout3 = nout2 + after
1863 r1 = zin(1, nin1, j)
1864 s1 = zin(2, nin1, j)
1865 r2 = zin(1, nin2, j)
1866 s2 = zin(2, nin2, j)
1867 r3 = zin(1, nin3, j)
1868 s3 = zin(2, nin3, j)
1871 zout(1, j, nout1) = r + r1
1872 zout(2, j, nout1) = s + s1
1877 zout(1, j, nout2) = r1 - s2
1878 zout(2, j, nout2) = s1 + r2
1879 zout(1, j, nout3) = r1 + s2
1880 zout(2, j, nout3) = s1 - r2
1885 IF (4*ias == 3*after)
THEN
1886 IF (isign == 1)
THEN
1894 nout2 = nout1 + after
1895 nout3 = nout2 + after
1897 r1 = zin(1, nin1, j)
1898 s1 = zin(2, nin1, j)
1899 r2 = -zin(2, nin2, j)
1900 s2 = zin(1, nin2, j)
1901 r3 = -zin(1, nin3, j)
1902 s3 = -zin(2, nin3, j)
1905 zout(1, j, nout1) = r + r1
1906 zout(2, j, nout1) = s + s1
1911 zout(1, j, nout2) = r1 - s2
1912 zout(2, j, nout2) = s1 + r2
1913 zout(1, j, nout3) = r1 + s2
1914 zout(2, j, nout3) = s1 - r2
1925 nout2 = nout1 + after
1926 nout3 = nout2 + after
1928 r1 = zin(1, nin1, j)
1929 s1 = zin(2, nin1, j)
1930 r2 = zin(2, nin2, j)
1931 s2 = -zin(1, nin2, j)
1932 r3 = -zin(1, nin3, j)
1933 s3 = -zin(2, nin3, j)
1936 zout(1, j, nout1) = r + r1
1937 zout(2, j, nout1) = s + s1
1942 zout(1, j, nout2) = r1 - s2
1943 zout(2, j, nout2) = s1 + r2
1944 zout(1, j, nout3) = r1 + s2
1945 zout(2, j, nout3) = s1 - r2
1949 ELSE IF (8*ias == 3*after)
THEN
1950 IF (isign == 1)
THEN
1958 nout2 = nout1 + after
1959 nout3 = nout2 + after
1961 r1 = zin(1, nin1, j)
1962 s1 = zin(2, nin1, j)
1967 r3 = -zin(2, nin3, j)
1968 s3 = zin(1, nin3, j)
1971 zout(1, j, nout1) = r + r1
1972 zout(2, j, nout1) = s + s1
1977 zout(1, j, nout2) = r1 - s2
1978 zout(2, j, nout2) = s1 + r2
1979 zout(1, j, nout3) = r1 + s2
1980 zout(2, j, nout3) = s1 - r2
1991 nout2 = nout1 + after
1992 nout3 = nout2 + after
1994 r1 = zin(1, nin1, j)
1995 s1 = zin(2, nin1, j)
2000 r3 = zin(2, nin3, j)
2001 s3 = -zin(1, nin3, j)
2004 zout(1, j, nout1) = r + r1
2005 zout(2, j, nout1) = s + s1
2010 zout(1, j, nout2) = r1 - s2
2011 zout(2, j, nout2) = s1 + r2
2012 zout(1, j, nout3) = r1 + s2
2013 zout(2, j, nout3) = s1 - r2
2020 cr2 = trig(1, itrig)
2021 ci2 = trig(2, itrig)
2023 cr3 = trig(1, itrig)
2024 ci3 = trig(2, itrig)
2032 nout2 = nout1 + after
2033 nout3 = nout2 + after
2035 r1 = zin(1, nin1, j)
2036 s1 = zin(2, nin1, j)
2047 zout(1, j, nout1) = r + r1
2048 zout(2, j, nout1) = s + s1
2053 zout(1, j, nout2) = r1 - s2
2054 zout(2, j, nout2) = s1 + r2
2055 zout(1, j, nout3) = r1 + s2
2056 zout(2, j, nout3) = s1 - r2
2061 ELSE IF (now == 5)
THEN
2074 nout2 = nout1 + after
2075 nout3 = nout2 + after
2076 nout4 = nout3 + after
2077 nout5 = nout4 + after
2079 r1 = zin(1, nin1, j)
2080 s1 = zin(2, nin1, j)
2081 r2 = zin(1, nin2, j)
2082 s2 = zin(2, nin2, j)
2083 r3 = zin(1, nin3, j)
2084 s3 = zin(2, nin3, j)
2085 r4 = zin(1, nin4, j)
2086 s4 = zin(2, nin4, j)
2087 r5 = zin(1, nin5, j)
2088 s5 = zin(2, nin5, j)
2093 zout(1, j, nout1) = r1 + r25 + r34
2094 r = cos2*r25 + cos4*r34 + r1
2095 s = sin2*s25 + sin4*s34
2096 zout(1, j, nout2) = r - s
2097 zout(1, j, nout5) = r + s
2098 r = cos4*r25 + cos2*r34 + r1
2099 s = sin4*s25 - sin2*s34
2100 zout(1, j, nout3) = r - s
2101 zout(1, j, nout4) = r + s
2106 zout(2, j, nout1) = s1 + s25 + s34
2107 r = cos2*s25 + cos4*s34 + s1
2108 s = sin2*r25 + sin4*r34
2109 zout(2, j, nout2) = r + s
2110 zout(2, j, nout5) = r - s
2111 r = cos4*s25 + cos2*s34 + s1
2112 s = sin4*r25 - sin2*r34
2113 zout(2, j, nout3) = r + s
2114 zout(2, j, nout4) = r - s
2119 IF (8*ias == 5*after)
THEN
2120 IF (isign == 1)
THEN
2130 nout2 = nout1 + after
2131 nout3 = nout2 + after
2132 nout4 = nout3 + after
2133 nout5 = nout4 + after
2135 r1 = zin(1, nin1, j)
2136 s1 = zin(2, nin1, j)
2141 r3 = -zin(2, nin3, j)
2142 s3 = zin(1, nin3, j)
2147 r5 = -zin(1, nin5, j)
2148 s5 = -zin(2, nin5, j)
2153 zout(1, j, nout1) = r1 + r25 + r34
2154 r = cos2*r25 + cos4*r34 + r1
2155 s = sin2*s25 + sin4*s34
2156 zout(1, j, nout2) = r - s
2157 zout(1, j, nout5) = r + s
2158 r = cos4*r25 + cos2*r34 + r1
2159 s = sin4*s25 - sin2*s34
2160 zout(1, j, nout3) = r - s
2161 zout(1, j, nout4) = r + s
2166 zout(2, j, nout1) = s1 + s25 + s34
2167 r = cos2*s25 + cos4*s34 + s1
2168 s = sin2*r25 + sin4*r34
2169 zout(2, j, nout2) = r + s
2170 zout(2, j, nout5) = r - s
2171 r = cos4*s25 + cos2*s34 + s1
2172 s = sin4*r25 - sin2*r34
2173 zout(2, j, nout3) = r + s
2174 zout(2, j, nout4) = r - s
2187 nout2 = nout1 + after
2188 nout3 = nout2 + after
2189 nout4 = nout3 + after
2190 nout5 = nout4 + after
2192 r1 = zin(1, nin1, j)
2193 s1 = zin(2, nin1, j)
2198 r3 = zin(2, nin3, j)
2199 s3 = -zin(1, nin3, j)
2204 r5 = -zin(1, nin5, j)
2205 s5 = -zin(2, nin5, j)
2210 zout(1, j, nout1) = r1 + r25 + r34
2211 r = cos2*r25 + cos4*r34 + r1
2212 s = sin2*s25 + sin4*s34
2213 zout(1, j, nout2) = r - s
2214 zout(1, j, nout5) = r + s
2215 r = cos4*r25 + cos2*r34 + r1
2216 s = sin4*s25 - sin2*s34
2217 zout(1, j, nout3) = r - s
2218 zout(1, j, nout4) = r + s
2223 zout(2, j, nout1) = s1 + s25 + s34
2224 r = cos2*s25 + cos4*s34 + s1
2225 s = sin2*r25 + sin4*r34
2226 zout(2, j, nout2) = r + s
2227 zout(2, j, nout5) = r - s
2228 r = cos4*s25 + cos2*s34 + s1
2229 s = sin4*r25 - sin2*r34
2230 zout(2, j, nout3) = r + s
2231 zout(2, j, nout4) = r - s
2239 cr2 = trig(1, itrig)
2240 ci2 = trig(2, itrig)
2242 cr3 = trig(1, itrig)
2243 ci3 = trig(2, itrig)
2245 cr4 = trig(1, itrig)
2246 ci4 = trig(2, itrig)
2248 cr5 = trig(1, itrig)
2249 ci5 = trig(2, itrig)
2259 nout2 = nout1 + after
2260 nout3 = nout2 + after
2261 nout4 = nout3 + after
2262 nout5 = nout4 + after
2264 r1 = zin(1, nin1, j)
2265 s1 = zin(2, nin1, j)
2286 zout(1, j, nout1) = r1 + r25 + r34
2287 r = cos2*r25 + cos4*r34 + r1
2288 s = sin2*s25 + sin4*s34
2289 zout(1, j, nout2) = r - s
2290 zout(1, j, nout5) = r + s
2291 r = cos4*r25 + cos2*r34 + r1
2292 s = sin4*s25 - sin2*s34
2293 zout(1, j, nout3) = r - s
2294 zout(1, j, nout4) = r + s
2299 zout(2, j, nout1) = s1 + s25 + s34
2300 r = cos2*s25 + cos4*s34 + s1
2301 s = sin2*r25 + sin4*r34
2302 zout(2, j, nout2) = r + s
2303 zout(2, j, nout5) = r - s
2304 r = cos4*s25 + cos2*s34 + s1
2305 s = sin4*r25 - sin2*r34
2306 zout(2, j, nout3) = r + s
2307 zout(2, j, nout4) = r - s
2312 ELSE IF (now == 6)
THEN
2325 nout2 = nout1 + after
2326 nout3 = nout2 + after
2327 nout4 = nout3 + after
2328 nout5 = nout4 + after
2329 nout6 = nout5 + after
2331 r2 = zin(1, nin3, j)
2332 s2 = zin(2, nin3, j)
2333 r3 = zin(1, nin5, j)
2334 s3 = zin(2, nin5, j)
2337 r1 = zin(1, nin1, j)
2338 s1 = zin(2, nin1, j)
2350 r2 = zin(1, nin6, j)
2351 s2 = zin(2, nin6, j)
2352 r3 = zin(1, nin2, j)
2353 s3 = zin(2, nin2, j)
2356 r1 = zin(1, nin4, j)
2357 s1 = zin(2, nin4, j)
2369 zout(1, j, nout1) = ur1 + vr1
2370 zout(2, j, nout1) = ui1 + vi1
2371 zout(1, j, nout5) = ur2 + vr2
2372 zout(2, j, nout5) = ui2 + vi2
2373 zout(1, j, nout3) = ur3 + vr3
2374 zout(2, j, nout3) = ui3 + vi3
2375 zout(1, j, nout4) = ur1 - vr1
2376 zout(2, j, nout4) = ui1 - vi1
2377 zout(1, j, nout2) = ur2 - vr2
2378 zout(2, j, nout2) = ui2 - vi2
2379 zout(1, j, nout6) = ur3 - vr3
2380 zout(2, j, nout6) = ui3 - vi3
2384 cpabort(
'Error fftpre')
2389 END SUBROUTINE fftpre
2419 SUBROUTINE fftstp(mm, nfft, m, nn, n, zin, zout, trig, now, after, before, isign)
2421 INTEGER,
INTENT(IN) :: mm, nfft, m, nn, n
2422 REAL(dp),
DIMENSION(2, mm, m),
INTENT(IN) :: zin
2423 REAL(dp),
DIMENSION(2, nn, n),
INTENT(INOUT) :: zout
2424 REAL(dp),
DIMENSION(2, ctrig_length),
INTENT(IN) :: trig
2425 INTEGER,
INTENT(IN) :: now, after, before, isign
2427 REAL(dp),
PARAMETER :: bb = 0.8660254037844387_dp, cos2 = 0.3090169943749474_dp, &
2428 cos4 = -0.8090169943749474_dp, rt2i = 0.7071067811865475_dp, &
2429 sin2p = 0.9510565162951536_dp, sin4p = 0.5877852522924731_dp
2431 INTEGER :: atb, atn, ia, ias, ib, itrig, itt, j, &
2432 nin1, nin2, nin3, nin4, nin5, nin6, &
2433 nin7, nin8, nout1, nout2, nout3, &
2434 nout4, nout5, nout6, nout7, nout8
2435 REAL(dp) :: am, ap, bbs, bm, bp, ci2, ci3, ci4, ci5, cm, cp, cr2, cr3, cr4, cr5, dbl, dm, r, &
2436 r1, r2, r25, r3, r34, r4, r5, r6, r7, r8, s, s1, s2, s25, s3, s34, s4, s5, s6, s7, s8, &
2437 sin2, sin4, ui1, ui2, ui3, ur1, ur2, ur3, vi1, vi2, vi3, vr1, vr2, vr3
2451 IF (isign == 1)
THEN
2461 nout2 = nout1 + after
2462 nout3 = nout2 + after
2463 nout4 = nout3 + after
2465 r1 = zin(1, j, nin1)
2466 s1 = zin(2, j, nin1)
2467 r2 = zin(1, j, nin2)
2468 s2 = zin(2, j, nin2)
2469 r3 = zin(1, j, nin3)
2470 s3 = zin(2, j, nin3)
2471 r4 = zin(1, j, nin4)
2472 s4 = zin(2, j, nin4)
2475 zout(1, j, nout1) = r + s
2476 zout(1, j, nout3) = r - s
2479 zout(1, j, nout2) = r - s
2480 zout(1, j, nout4) = r + s
2483 zout(2, j, nout1) = r + s
2484 zout(2, j, nout3) = r - s
2487 zout(2, j, nout2) = r + s
2488 zout(2, j, nout4) = r - s
2493 IF (2*ias == after)
THEN
2502 nout2 = nout1 + after
2503 nout3 = nout2 + after
2504 nout4 = nout3 + after
2506 r1 = zin(1, j, nin1)
2507 s1 = zin(2, j, nin1)
2512 r3 = -zin(2, j, nin3)
2513 s3 = zin(1, j, nin3)
2520 zout(1, j, nout1) = r + s
2521 zout(1, j, nout3) = r - s
2524 zout(1, j, nout2) = r - s
2525 zout(1, j, nout4) = r + s
2528 zout(2, j, nout1) = r + s
2529 zout(2, j, nout3) = r - s
2532 zout(2, j, nout2) = r + s
2533 zout(2, j, nout4) = r - s
2539 cr2 = trig(1, itrig)
2540 ci2 = trig(2, itrig)
2542 cr3 = trig(1, itrig)
2543 ci3 = trig(2, itrig)
2545 cr4 = trig(1, itrig)
2546 ci4 = trig(2, itrig)
2555 nout2 = nout1 + after
2556 nout3 = nout2 + after
2557 nout4 = nout3 + after
2559 r1 = zin(1, j, nin1)
2560 s1 = zin(2, j, nin1)
2575 zout(1, j, nout1) = r + s
2576 zout(1, j, nout3) = r - s
2579 zout(1, j, nout2) = r - s
2580 zout(1, j, nout4) = r + s
2583 zout(2, j, nout1) = r + s
2584 zout(2, j, nout3) = r - s
2587 zout(2, j, nout2) = r + s
2588 zout(2, j, nout4) = r - s
2603 nout2 = nout1 + after
2604 nout3 = nout2 + after
2605 nout4 = nout3 + after
2607 r1 = zin(1, j, nin1)
2608 s1 = zin(2, j, nin1)
2609 r2 = zin(1, j, nin2)
2610 s2 = zin(2, j, nin2)
2611 r3 = zin(1, j, nin3)
2612 s3 = zin(2, j, nin3)
2613 r4 = zin(1, j, nin4)
2614 s4 = zin(2, j, nin4)
2617 zout(1, j, nout1) = r + s
2618 zout(1, j, nout3) = r - s
2621 zout(1, j, nout2) = r + s
2622 zout(1, j, nout4) = r - s
2625 zout(2, j, nout1) = r + s
2626 zout(2, j, nout3) = r - s
2629 zout(2, j, nout2) = r - s
2630 zout(2, j, nout4) = r + s
2635 IF (2*ias == after)
THEN
2644 nout2 = nout1 + after
2645 nout3 = nout2 + after
2646 nout4 = nout3 + after
2648 r1 = zin(1, j, nin1)
2649 s1 = zin(2, j, nin1)
2654 r3 = zin(2, j, nin3)
2655 s3 = -zin(1, j, nin3)
2662 zout(1, j, nout1) = r + s
2663 zout(1, j, nout3) = r - s
2666 zout(1, j, nout2) = r + s
2667 zout(1, j, nout4) = r - s
2670 zout(2, j, nout1) = r + s
2671 zout(2, j, nout3) = r - s
2674 zout(2, j, nout2) = r - s
2675 zout(2, j, nout4) = r + s
2681 cr2 = trig(1, itrig)
2682 ci2 = trig(2, itrig)
2684 cr3 = trig(1, itrig)
2685 ci3 = trig(2, itrig)
2687 cr4 = trig(1, itrig)
2688 ci4 = trig(2, itrig)
2697 nout2 = nout1 + after
2698 nout3 = nout2 + after
2699 nout4 = nout3 + after
2701 r1 = zin(1, j, nin1)
2702 s1 = zin(2, j, nin1)
2717 zout(1, j, nout1) = r + s
2718 zout(1, j, nout3) = r - s
2721 zout(1, j, nout2) = r + s
2722 zout(1, j, nout4) = r - s
2725 zout(2, j, nout1) = r + s
2726 zout(2, j, nout3) = r - s
2729 zout(2, j, nout2) = r - s
2730 zout(2, j, nout4) = r + s
2736 ELSE IF (now == 8)
THEN
2737 IF (isign == -1)
THEN
2751 nout2 = nout1 + after
2752 nout3 = nout2 + after
2753 nout4 = nout3 + after
2754 nout5 = nout4 + after
2755 nout6 = nout5 + after
2756 nout7 = nout6 + after
2757 nout8 = nout7 + after
2759 r1 = zin(1, j, nin1)
2760 s1 = zin(2, j, nin1)
2761 r2 = zin(1, j, nin2)
2762 s2 = zin(2, j, nin2)
2763 r3 = zin(1, j, nin3)
2764 s3 = zin(2, j, nin3)
2765 r4 = zin(1, j, nin4)
2766 s4 = zin(2, j, nin4)
2767 r5 = zin(1, j, nin5)
2768 s5 = zin(2, j, nin5)
2769 r6 = zin(1, j, nin6)
2770 s6 = zin(2, j, nin6)
2771 r7 = zin(1, j, nin7)
2772 s7 = zin(2, j, nin7)
2773 r8 = zin(1, j, nin8)
2774 s8 = zin(2, j, nin8)
2791 zout(1, j, nout1) = ap + bp
2792 zout(2, j, nout1) = cp + dbl
2793 zout(1, j, nout5) = ap - bp
2794 zout(2, j, nout5) = cp - dbl
2795 zout(1, j, nout3) = am + dm
2796 zout(2, j, nout3) = cm - bm
2797 zout(1, j, nout7) = am - dm
2798 zout(2, j, nout7) = cm + bm
2817 cp = (cm + dbl)*rt2i
2818 dbl = (cm - dbl)*rt2i
2819 zout(1, j, nout2) = ap + r
2820 zout(2, j, nout2) = bm + s
2821 zout(1, j, nout6) = ap - r
2822 zout(2, j, nout6) = bm - s
2823 zout(1, j, nout4) = am + cp
2824 zout(2, j, nout4) = bp + dbl
2825 zout(1, j, nout8) = am - cp
2826 zout(2, j, nout8) = bp - dbl
2843 nout2 = nout1 + after
2844 nout3 = nout2 + after
2845 nout4 = nout3 + after
2846 nout5 = nout4 + after
2847 nout6 = nout5 + after
2848 nout7 = nout6 + after
2849 nout8 = nout7 + after
2851 r1 = zin(1, j, nin1)
2852 s1 = zin(2, j, nin1)
2853 r2 = zin(1, j, nin2)
2854 s2 = zin(2, j, nin2)
2855 r3 = zin(1, j, nin3)
2856 s3 = zin(2, j, nin3)
2857 r4 = zin(1, j, nin4)
2858 s4 = zin(2, j, nin4)
2859 r5 = zin(1, j, nin5)
2860 s5 = zin(2, j, nin5)
2861 r6 = zin(1, j, nin6)
2862 s6 = zin(2, j, nin6)
2863 r7 = zin(1, j, nin7)
2864 s7 = zin(2, j, nin7)
2865 r8 = zin(1, j, nin8)
2866 s8 = zin(2, j, nin8)
2883 zout(1, j, nout1) = ap + bp
2884 zout(2, j, nout1) = cp + dbl
2885 zout(1, j, nout5) = ap - bp
2886 zout(2, j, nout5) = cp - dbl
2887 zout(1, j, nout3) = am - dm
2888 zout(2, j, nout3) = cm + bm
2889 zout(1, j, nout7) = am + dm
2890 zout(2, j, nout7) = cm - bm
2909 cp = (cm + dbl)*rt2i
2910 dbl = (-cm + dbl)*rt2i
2911 zout(1, j, nout2) = ap + r
2912 zout(2, j, nout2) = bm + s
2913 zout(1, j, nout6) = ap - r
2914 zout(2, j, nout6) = bm - s
2915 zout(1, j, nout4) = am + cp
2916 zout(2, j, nout4) = bp + dbl
2917 zout(1, j, nout8) = am - cp
2918 zout(2, j, nout8) = bp - dbl
2922 ELSE IF (now == 3)
THEN
2932 nout2 = nout1 + after
2933 nout3 = nout2 + after
2935 r1 = zin(1, j, nin1)
2936 s1 = zin(2, j, nin1)
2937 r2 = zin(1, j, nin2)
2938 s2 = zin(2, j, nin2)
2939 r3 = zin(1, j, nin3)
2940 s3 = zin(2, j, nin3)
2943 zout(1, j, nout1) = r + r1
2944 zout(2, j, nout1) = s + s1
2949 zout(1, j, nout2) = r1 - s2
2950 zout(2, j, nout2) = s1 + r2
2951 zout(1, j, nout3) = r1 + s2
2952 zout(2, j, nout3) = s1 - r2
2957 IF (4*ias == 3*after)
THEN
2958 IF (isign == 1)
THEN
2966 nout2 = nout1 + after
2967 nout3 = nout2 + after
2969 r1 = zin(1, j, nin1)
2970 s1 = zin(2, j, nin1)
2971 r2 = -zin(2, j, nin2)
2972 s2 = zin(1, j, nin2)
2973 r3 = -zin(1, j, nin3)
2974 s3 = -zin(2, j, nin3)
2977 zout(1, j, nout1) = r + r1
2978 zout(2, j, nout1) = s + s1
2983 zout(1, j, nout2) = r1 - s2
2984 zout(2, j, nout2) = s1 + r2
2985 zout(1, j, nout3) = r1 + s2
2986 zout(2, j, nout3) = s1 - r2
2997 nout2 = nout1 + after
2998 nout3 = nout2 + after
3000 r1 = zin(1, j, nin1)
3001 s1 = zin(2, j, nin1)
3002 r2 = zin(2, j, nin2)
3003 s2 = -zin(1, j, nin2)
3004 r3 = -zin(1, j, nin3)
3005 s3 = -zin(2, j, nin3)
3008 zout(1, j, nout1) = r + r1
3009 zout(2, j, nout1) = s + s1
3014 zout(1, j, nout2) = r1 - s2
3015 zout(2, j, nout2) = s1 + r2
3016 zout(1, j, nout3) = r1 + s2
3017 zout(2, j, nout3) = s1 - r2
3021 ELSE IF (8*ias == 3*after)
THEN
3022 IF (isign == 1)
THEN
3030 nout2 = nout1 + after
3031 nout3 = nout2 + after
3033 r1 = zin(1, j, nin1)
3034 s1 = zin(2, j, nin1)
3039 r3 = -zin(2, j, nin3)
3040 s3 = zin(1, j, nin3)
3043 zout(1, j, nout1) = r + r1
3044 zout(2, j, nout1) = s + s1
3049 zout(1, j, nout2) = r1 - s2
3050 zout(2, j, nout2) = s1 + r2
3051 zout(1, j, nout3) = r1 + s2
3052 zout(2, j, nout3) = s1 - r2
3063 nout2 = nout1 + after
3064 nout3 = nout2 + after
3066 r1 = zin(1, j, nin1)
3067 s1 = zin(2, j, nin1)
3072 r3 = zin(2, j, nin3)
3073 s3 = -zin(1, j, nin3)
3076 zout(1, j, nout1) = r + r1
3077 zout(2, j, nout1) = s + s1
3082 zout(1, j, nout2) = r1 - s2
3083 zout(2, j, nout2) = s1 + r2
3084 zout(1, j, nout3) = r1 + s2
3085 zout(2, j, nout3) = s1 - r2
3092 cr2 = trig(1, itrig)
3093 ci2 = trig(2, itrig)
3095 cr3 = trig(1, itrig)
3096 ci3 = trig(2, itrig)
3104 nout2 = nout1 + after
3105 nout3 = nout2 + after
3107 r1 = zin(1, j, nin1)
3108 s1 = zin(2, j, nin1)
3119 zout(1, j, nout1) = r + r1
3120 zout(2, j, nout1) = s + s1
3125 zout(1, j, nout2) = r1 - s2
3126 zout(2, j, nout2) = s1 + r2
3127 zout(1, j, nout3) = r1 + s2
3128 zout(2, j, nout3) = s1 - r2
3133 ELSE IF (now == 5)
THEN
3146 nout2 = nout1 + after
3147 nout3 = nout2 + after
3148 nout4 = nout3 + after
3149 nout5 = nout4 + after
3151 r1 = zin(1, j, nin1)
3152 s1 = zin(2, j, nin1)
3153 r2 = zin(1, j, nin2)
3154 s2 = zin(2, j, nin2)
3155 r3 = zin(1, j, nin3)
3156 s3 = zin(2, j, nin3)
3157 r4 = zin(1, j, nin4)
3158 s4 = zin(2, j, nin4)
3159 r5 = zin(1, j, nin5)
3160 s5 = zin(2, j, nin5)
3165 zout(1, j, nout1) = r1 + r25 + r34
3166 r = cos2*r25 + cos4*r34 + r1
3167 s = sin2*s25 + sin4*s34
3168 zout(1, j, nout2) = r - s
3169 zout(1, j, nout5) = r + s
3170 r = cos4*r25 + cos2*r34 + r1
3171 s = sin4*s25 - sin2*s34
3172 zout(1, j, nout3) = r - s
3173 zout(1, j, nout4) = r + s
3178 zout(2, j, nout1) = s1 + s25 + s34
3179 r = cos2*s25 + cos4*s34 + s1
3180 s = sin2*r25 + sin4*r34
3181 zout(2, j, nout2) = r + s
3182 zout(2, j, nout5) = r - s
3183 r = cos4*s25 + cos2*s34 + s1
3184 s = sin4*r25 - sin2*r34
3185 zout(2, j, nout3) = r + s
3186 zout(2, j, nout4) = r - s
3191 IF (8*ias == 5*after)
THEN
3192 IF (isign == 1)
THEN
3202 nout2 = nout1 + after
3203 nout3 = nout2 + after
3204 nout4 = nout3 + after
3205 nout5 = nout4 + after
3207 r1 = zin(1, j, nin1)
3208 s1 = zin(2, j, nin1)
3213 r3 = -zin(2, j, nin3)
3214 s3 = zin(1, j, nin3)
3219 r5 = -zin(1, j, nin5)
3220 s5 = -zin(2, j, nin5)
3225 zout(1, j, nout1) = r1 + r25 + r34
3226 r = cos2*r25 + cos4*r34 + r1
3227 s = sin2*s25 + sin4*s34
3228 zout(1, j, nout2) = r - s
3229 zout(1, j, nout5) = r + s
3230 r = cos4*r25 + cos2*r34 + r1
3231 s = sin4*s25 - sin2*s34
3232 zout(1, j, nout3) = r - s
3233 zout(1, j, nout4) = r + s
3238 zout(2, j, nout1) = s1 + s25 + s34
3239 r = cos2*s25 + cos4*s34 + s1
3240 s = sin2*r25 + sin4*r34
3241 zout(2, j, nout2) = r + s
3242 zout(2, j, nout5) = r - s
3243 r = cos4*s25 + cos2*s34 + s1
3244 s = sin4*r25 - sin2*r34
3245 zout(2, j, nout3) = r + s
3246 zout(2, j, nout4) = r - s
3259 nout2 = nout1 + after
3260 nout3 = nout2 + after
3261 nout4 = nout3 + after
3262 nout5 = nout4 + after
3264 r1 = zin(1, j, nin1)
3265 s1 = zin(2, j, nin1)
3270 r3 = zin(2, j, nin3)
3271 s3 = -zin(1, j, nin3)
3276 r5 = -zin(1, j, nin5)
3277 s5 = -zin(2, j, nin5)
3282 zout(1, j, nout1) = r1 + r25 + r34
3283 r = cos2*r25 + cos4*r34 + r1
3284 s = sin2*s25 + sin4*s34
3285 zout(1, j, nout2) = r - s
3286 zout(1, j, nout5) = r + s
3287 r = cos4*r25 + cos2*r34 + r1
3288 s = sin4*s25 - sin2*s34
3289 zout(1, j, nout3) = r - s
3290 zout(1, j, nout4) = r + s
3295 zout(2, j, nout1) = s1 + s25 + s34
3296 r = cos2*s25 + cos4*s34 + s1
3297 s = sin2*r25 + sin4*r34
3298 zout(2, j, nout2) = r + s
3299 zout(2, j, nout5) = r - s
3300 r = cos4*s25 + cos2*s34 + s1
3301 s = sin4*r25 - sin2*r34
3302 zout(2, j, nout3) = r + s
3303 zout(2, j, nout4) = r - s
3311 cr2 = trig(1, itrig)
3312 ci2 = trig(2, itrig)
3314 cr3 = trig(1, itrig)
3315 ci3 = trig(2, itrig)
3317 cr4 = trig(1, itrig)
3318 ci4 = trig(2, itrig)
3320 cr5 = trig(1, itrig)
3321 ci5 = trig(2, itrig)
3331 nout2 = nout1 + after
3332 nout3 = nout2 + after
3333 nout4 = nout3 + after
3334 nout5 = nout4 + after
3336 r1 = zin(1, j, nin1)
3337 s1 = zin(2, j, nin1)
3358 zout(1, j, nout1) = r1 + r25 + r34
3359 r = cos2*r25 + cos4*r34 + r1
3360 s = sin2*s25 + sin4*s34
3361 zout(1, j, nout2) = r - s
3362 zout(1, j, nout5) = r + s
3363 r = cos4*r25 + cos2*r34 + r1
3364 s = sin4*s25 - sin2*s34
3365 zout(1, j, nout3) = r - s
3366 zout(1, j, nout4) = r + s
3371 zout(2, j, nout1) = s1 + s25 + s34
3372 r = cos2*s25 + cos4*s34 + s1
3373 s = sin2*r25 + sin4*r34
3374 zout(2, j, nout2) = r + s
3375 zout(2, j, nout5) = r - s
3376 r = cos4*s25 + cos2*s34 + s1
3377 s = sin4*r25 - sin2*r34
3378 zout(2, j, nout3) = r + s
3379 zout(2, j, nout4) = r - s
3384 ELSE IF (now == 6)
THEN
3397 nout2 = nout1 + after
3398 nout3 = nout2 + after
3399 nout4 = nout3 + after
3400 nout5 = nout4 + after
3401 nout6 = nout5 + after
3403 r2 = zin(1, j, nin3)
3404 s2 = zin(2, j, nin3)
3405 r3 = zin(1, j, nin5)
3406 s3 = zin(2, j, nin5)
3409 r1 = zin(1, j, nin1)
3410 s1 = zin(2, j, nin1)
3422 r2 = zin(1, j, nin6)
3423 s2 = zin(2, j, nin6)
3424 r3 = zin(1, j, nin2)
3425 s3 = zin(2, j, nin2)
3428 r1 = zin(1, j, nin4)
3429 s1 = zin(2, j, nin4)
3441 zout(1, j, nout1) = ur1 + vr1
3442 zout(2, j, nout1) = ui1 + vi1
3443 zout(1, j, nout5) = ur2 + vr2
3444 zout(2, j, nout5) = ui2 + vi2
3445 zout(1, j, nout3) = ur3 + vr3
3446 zout(2, j, nout3) = ui3 + vi3
3447 zout(1, j, nout4) = ur1 - vr1
3448 zout(2, j, nout4) = ui1 - vi1
3449 zout(1, j, nout2) = ur2 - vr2
3450 zout(2, j, nout2) = ui2 - vi2
3451 zout(1, j, nout6) = ur3 - vr3
3452 zout(2, j, nout6) = ui3 - vi3
3456 cpabort(
'Error fftstp')
3461 END SUBROUTINE fftstp
3485 SUBROUTINE ctrig(n, trig, after, before, now, isign, ic)
3486 INTEGER,
INTENT(IN) :: n
3487 REAL(dp),
DIMENSION(2, ctrig_length),
INTENT(OUT) :: trig
3488 INTEGER,
DIMENSION(7),
INTENT(OUT) :: after, before, now
3489 INTEGER,
INTENT(IN) :: isign
3490 INTEGER,
INTENT(OUT) :: ic
3492 INTEGER,
PARAMETER :: nt = 82
3493 INTEGER,
DIMENSION(7, nt),
PARAMETER :: idata = reshape([3, 3, 1, 1, 1, 1, 1, 4, 4, 1, 1, 1, &
3494 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, &
3495 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&
3496 , 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, &
3497 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 &
3498 , 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, &
3499 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 &
3500 , 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&
3501 , 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 &
3502 , 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,&
3503 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&
3504 , 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, &
3505 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&
3506 , 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,&
3507 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&
3508 , 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,&
3509 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&
3510 , 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,&
3511 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&
3512 , 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,&
3513 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, &
3514 ctrig_length, 4, 4, 4, 4, 4, 1], [7, nt])
3516 INTEGER :: i, itt, j
3517 REAL(dp) :: angle, twopi
3520 IF (n == idata(1, i))
THEN
3523 itt = idata(1 + j, i)
3526 now(j) = idata(1 + j, i)
3534 WRITE (*,
'(A,i5,A)')
" Value of ", n, &
3535 " not allowed for fft, allowed values are:"
3536 WRITE (*,
'(15i5)') (idata(1, j), j=1, nt)
3544 after(i) = after(i - 1)*now(i - 1)
3545 before(ic - i + 1) = before(ic - i + 2)*now(ic - i + 2)
3548 twopi = 8._dp*atan(1._dp)
3549 angle = isign*twopi/real(n, dp)
3553 trig(1, i + 1) = cos(real(i, dp)*angle)
3554 trig(2, i + 1) = sin(real(i, dp)*angle)
3557 END SUBROUTINE ctrig
3568 SUBROUTINE matmov(n, m, a, lda, b, ldb)
3569 INTEGER :: n, m, lda
3570 COMPLEX(dp) :: a(lda, *)
3572 COMPLEX(dp) :: b(ldb, *)
3574 b(1:n, 1:m) = a(1:n, 1:m)
3575 END SUBROUTINE matmov
3586 SUBROUTINE zgetmo(a, lda, m, n, b, ldb)
3587 INTEGER :: lda, m, n
3588 COMPLEX(dp) :: a(lda, n)
3590 COMPLEX(dp) :: b(ldb, m)
3592 b(1:n, 1:m) = transpose(a(1:m, 1:n))
3593 END SUBROUTINE zgetmo
3601 SUBROUTINE scaled(n, sc, a)
3606 CALL dscal(n, sc, a, 1)
3608 END SUBROUTINE scaled
Defines the basic variable types.
integer, parameter, public dp