10 USE iso_c_binding,
ONLY: c_f_pointer,&
17#include "../../base/base_uses.f90"
23 INTEGER,
PARAMETER :: ctrig_length = 1024
24 INTEGER,
PARAMETER :: cache_size = 2048
44 SUBROUTINE mltfftsg(transa, transb, a, ldax, lday, b, ldbx, ldby, n, m, isign, scale)
46 LOGICAL,
INTENT(IN) :: transa, transb
47 INTEGER,
INTENT(IN) :: ldax, lday
48 COMPLEX(dp),
INTENT(INOUT) :: a(ldax, lday)
49 INTEGER,
INTENT(IN) :: ldbx, ldby
50 COMPLEX(dp),
INTENT(INOUT) :: b(ldbx, ldby)
51 INTEGER,
INTENT(IN) :: n, m, isign
52 REAL(
dp),
INTENT(IN) :: scale
54 COMPLEX(dp),
ALLOCATABLE,
DIMENSION(:, :, :) :: z
55 INTEGER :: after(20), before(20), chunk, i, ic, id, &
56 iend, inzee, isig, istart, iterations, &
57 itr, length, lot, nfft, now(20), &
60 REAL(
dp) :: trig(2, 1024)
64 length = 2*(cache_size/4 + 1)
67 tscal = (abs(scale - 1._dp) > 1.e-12_dp)
68 CALL ctrig(n, trig, after, before, now, isig, ic)
69 lot = cache_size/(4*n)
70 lot = lot - mod(lot + 1, 2)
74 id = 0; num_threads = 1
83 ALLOCATE (z(length, 2, 0:num_threads - 1))
84 iterations = (m + lot - 1)/lot
85 chunk = lot*((iterations + num_threads - 1)/num_threads)
91 iend = min((id + 1)*chunk, m)
93 DO itr = istart, iend, lot
95 nfft = min(m - itr + 1, lot)
96 IF (.NOT. transa)
THEN
97 CALL fftpre_cmplx(nfft, nfft, ldax, lot, n, a(1, itr), z(1, 1, id), &
98 trig, now(1), after(1), before(1), isig)
100 CALL fftstp_cmplx(ldax, nfft, n, lot, n, a(itr, 1), z(1, 1, id), &
101 trig, now(1), after(1), before(1), isig)
104 IF (lot == nfft)
THEN
105 CALL scaled(2*lot*n, scale, z(1, 1, id))
108 CALL scaled(2*nfft, scale, z(lot*(i - 1) + 1, 1, id))
113 IF (.NOT. transb)
THEN
114 CALL zgetmo(z(1, 1, id), lot, nfft, n, b(1, itr), ldbx)
116 CALL matmov(nfft, n, z(1, 1, id), lot, b(itr, 1), ldbx)
121 CALL fftstp_cmplx(lot, nfft, n, lot, n, z(1, inzee, id), &
122 z(1, 3 - inzee, id), trig, now(i), after(i), &
126 IF (.NOT. transb)
THEN
127 CALL fftrot_cmplx(lot, nfft, n, nfft, ldbx, z(1, inzee, id), &
128 b(1, itr), trig, now(ic), after(ic), before(ic), isig)
130 CALL fftstp_cmplx(lot, nfft, n, ldbx, n, z(1, inzee, id), &
131 b(itr, 1), trig, now(ic), after(ic), before(ic), isig)
140 IF (.NOT. transb)
THEN
141 b(1:ldbx, m + 1:ldby) = cmplx(0._dp, 0._dp,
dp)
142 b(n + 1:ldbx, 1:m) = cmplx(0._dp, 0._dp,
dp)
144 b(1:ldbx, n + 1:ldby) = cmplx(0._dp, 0._dp,
dp)
145 b(m + 1:ldbx, 1:n) = cmplx(0._dp, 0._dp,
dp)
166 SUBROUTINE fftstp_cmplx(mm, nfft, m, nn, n, zin, zout, trig, now, after, before, isign)
168 INTEGER,
INTENT(IN) :: mm, nfft, m, nn, n
169 COMPLEX(dp),
DIMENSION(mm, m),
INTENT(IN),
TARGET :: zin
170 COMPLEX(dp),
DIMENSION(nn, n),
INTENT(INOUT), &
172 REAL(
dp),
DIMENSION(2, ctrig_length),
INTENT(IN) :: trig
173 INTEGER,
INTENT(IN) :: now, after, before, isign
175 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: zin_real, zout_real
177 CALL c_f_pointer(c_loc(zin), zin_real, [2, mm, m])
178 CALL c_f_pointer(c_loc(zout), zout_real, [2, nn, n])
179 CALL fftstp(mm, nfft, m, nn, n, zin_real, zout_real, trig, now, after, before, isign)
181 END SUBROUTINE fftstp_cmplx
198 SUBROUTINE fftpre_cmplx(mm, nfft, m, nn, n, zin, zout, trig, now, after, before, isign)
200 INTEGER,
INTENT(IN) :: mm, nfft, m, nn, n
201 COMPLEX(dp),
DIMENSION(m, mm),
INTENT(IN),
TARGET :: zin
202 COMPLEX(dp),
DIMENSION(nn, n),
INTENT(INOUT), &
204 REAL(
dp),
DIMENSION(2, ctrig_length),
INTENT(IN) :: trig
205 INTEGER,
INTENT(IN) :: now, after, before, isign
207 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: zin_real, zout_real
209 CALL c_f_pointer(c_loc(zin), zin_real, [2, mm, m])
210 CALL c_f_pointer(c_loc(zout), zout_real, [2, nn, n])
212 CALL fftpre(mm, nfft, m, nn, n, zin_real, zout_real, trig, now, after, before, isign)
214 END SUBROUTINE fftpre_cmplx
231 SUBROUTINE fftrot_cmplx(mm, nfft, m, nn, n, zin, zout, trig, now, after, before, isign)
234 INTEGER,
INTENT(IN) :: mm, nfft, m, nn, n
235 COMPLEX(dp),
DIMENSION(mm, m),
INTENT(IN),
TARGET :: zin
236 COMPLEX(dp),
DIMENSION(n, nn),
INTENT(INOUT), &
238 REAL(
dp),
DIMENSION(2, ctrig_length),
INTENT(IN) :: trig
239 INTEGER,
INTENT(IN) :: now, after, before, isign
241 REAL(
dp),
DIMENSION(:, :, :),
POINTER :: zin_real, zout_real
243 CALL c_f_pointer(c_loc(zin), zin_real, [2, mm, m])
244 CALL c_f_pointer(c_loc(zout), zout_real, [2, nn, n])
246 CALL fftrot(mm, nfft, m, nn, n, zin_real, zout_real, trig, now, after, before, isign)
248 END SUBROUTINE fftrot_cmplx
276 SUBROUTINE fftrot(mm, nfft, m, nn, n, zin, zout, trig, now, after, before, isign)
279 INTEGER,
INTENT(IN) :: mm, nfft, m, nn, n
280 REAL(
dp),
DIMENSION(2, mm, m),
INTENT(IN) :: zin
281 REAL(
dp),
DIMENSION(2, n, nn),
INTENT(INOUT) :: zout
282 REAL(
dp),
DIMENSION(2, ctrig_length),
INTENT(IN) :: trig
283 INTEGER,
INTENT(IN) :: now, after, before, isign
285 REAL(
dp),
PARAMETER :: bb = 0.8660254037844387_dp, cos2 = 0.3090169943749474_dp, &
286 cos4 = -0.8090169943749474_dp, rt2i = 0.7071067811865475_dp, &
287 sin2p = 0.9510565162951536_dp, sin4p = 0.5877852522924731_dp
289 INTEGER :: atb, atn, ia, ias, ib, itrig, itt, j, &
290 nin1, nin2, nin3, nin4, nin5, nin6, &
291 nin7, nin8, nout1, nout2, nout3, &
292 nout4, nout5, nout6, nout7, nout8
293 REAL(
dp) :: am, ap, bbs, bm, bp, ci2, ci3, ci4, ci5, cm, cp, cr2, cr3, cr4, cr5, dbl, dm, r, &
294 r1, r2, r25, r3, r34, r4, r5, r6, r7, r8, s, s1, s2, s25, s3, s34, s4, s5, s6, s7, s8, &
295 sin2, sin4, ui1, ui2, ui3, ur1, ur2, ur3, vi1, vi2, vi3, vr1, vr2, vr3
319 nout2 = nout1 + after
320 nout3 = nout2 + after
321 nout4 = nout3 + after
333 zout(1, nout1, j) = r + s
334 zout(1, nout3, j) = r - s
337 zout(1, nout2, j) = r - s
338 zout(1, nout4, j) = r + s
341 zout(2, nout1, j) = r + s
342 zout(2, nout3, j) = r - s
345 zout(2, nout2, j) = r + s
346 zout(2, nout4, j) = r - s
351 IF (2*ias == after)
THEN
360 nout2 = nout1 + after
361 nout3 = nout2 + after
362 nout4 = nout3 + after
370 r3 = -zin(2, j, nin3)
378 zout(1, nout1, j) = r + s
379 zout(1, nout3, j) = r - s
382 zout(1, nout2, j) = r - s
383 zout(1, nout4, j) = r + s
386 zout(2, nout1, j) = r + s
387 zout(2, nout3, j) = r - s
390 zout(2, nout2, j) = r + s
391 zout(2, nout4, j) = r - s
413 nout2 = nout1 + after
414 nout3 = nout2 + after
415 nout4 = nout3 + after
433 zout(1, nout1, j) = r + s
434 zout(1, nout3, j) = r - s
437 zout(1, nout2, j) = r - s
438 zout(1, nout4, j) = r + s
441 zout(2, nout1, j) = r + s
442 zout(2, nout3, j) = r - s
445 zout(2, nout2, j) = r + s
446 zout(2, nout4, j) = r - s
461 nout2 = nout1 + after
462 nout3 = nout2 + after
463 nout4 = nout3 + after
475 zout(1, nout1, j) = r + s
476 zout(1, nout3, j) = r - s
479 zout(1, nout2, j) = r + s
480 zout(1, nout4, j) = r - s
483 zout(2, nout1, j) = r + s
484 zout(2, nout3, j) = r - s
487 zout(2, nout2, j) = r - s
488 zout(2, nout4, j) = r + s
493 IF (2*ias == after)
THEN
502 nout2 = nout1 + after
503 nout3 = nout2 + after
504 nout4 = nout3 + after
513 s3 = -zin(1, j, nin3)
520 zout(1, nout1, j) = r + s
521 zout(1, nout3, j) = r - s
524 zout(1, nout2, j) = r + s
525 zout(1, nout4, j) = r - s
528 zout(2, nout1, j) = r + s
529 zout(2, nout3, j) = r - s
532 zout(2, nout2, j) = r - s
533 zout(2, nout4, j) = r + s
555 nout2 = nout1 + after
556 nout3 = nout2 + after
557 nout4 = nout3 + after
575 zout(1, nout1, j) = r + s
576 zout(1, nout3, j) = r - s
579 zout(1, nout2, j) = r + s
580 zout(1, nout4, j) = r - s
583 zout(2, nout1, j) = r + s
584 zout(2, nout3, j) = r - s
587 zout(2, nout2, j) = r - s
588 zout(2, nout4, j) = r + s
594 ELSE IF (now == 8)
THEN
595 IF (isign == -1)
THEN
609 nout2 = nout1 + after
610 nout3 = nout2 + after
611 nout4 = nout3 + after
612 nout5 = nout4 + after
613 nout6 = nout5 + after
614 nout7 = nout6 + after
615 nout8 = nout7 + after
649 zout(1, nout1, j) = ap + bp
650 zout(2, nout1, j) = cp + dbl
651 zout(1, nout5, j) = ap - bp
652 zout(2, nout5, j) = cp - dbl
653 zout(1, nout3, j) = am + dm
654 zout(2, nout3, j) = cm - bm
655 zout(1, nout7, j) = am - dm
656 zout(2, nout7, j) = cm + bm
676 dbl = (cm - dbl)*rt2i
677 zout(1, nout2, j) = ap + r
678 zout(2, nout2, j) = bm + s
679 zout(1, nout6, j) = ap - r
680 zout(2, nout6, j) = bm - s
681 zout(1, nout4, j) = am + cp
682 zout(2, nout4, j) = bp + dbl
683 zout(1, nout8, j) = am - cp
684 zout(2, nout8, j) = bp - dbl
701 nout2 = nout1 + after
702 nout3 = nout2 + after
703 nout4 = nout3 + after
704 nout5 = nout4 + after
705 nout6 = nout5 + after
706 nout7 = nout6 + after
707 nout8 = nout7 + after
741 zout(1, nout1, j) = ap + bp
742 zout(2, nout1, j) = cp + dbl
743 zout(1, nout5, j) = ap - bp
744 zout(2, nout5, j) = cp - dbl
745 zout(1, nout3, j) = am - dm
746 zout(2, nout3, j) = cm + bm
747 zout(1, nout7, j) = am + dm
748 zout(2, nout7, j) = cm - bm
768 dbl = (-cm + dbl)*rt2i
769 zout(1, nout2, j) = ap + r
770 zout(2, nout2, j) = bm + s
771 zout(1, nout6, j) = ap - r
772 zout(2, nout6, j) = bm - s
773 zout(1, nout4, j) = am + cp
774 zout(2, nout4, j) = bp + dbl
775 zout(1, nout8, j) = am - cp
776 zout(2, nout8, j) = bp - dbl
780 ELSE IF (now == 3)
THEN
790 nout2 = nout1 + after
791 nout3 = nout2 + after
801 zout(1, nout1, j) = r + r1
802 zout(2, nout1, j) = s + s1
807 zout(1, nout2, j) = r1 - s2
808 zout(2, nout2, j) = s1 + r2
809 zout(1, nout3, j) = r1 + s2
810 zout(2, nout3, j) = s1 - r2
815 IF (4*ias == 3*after)
THEN
824 nout2 = nout1 + after
825 nout3 = nout2 + after
829 r2 = -zin(2, j, nin2)
831 r3 = -zin(1, j, nin3)
832 s3 = -zin(2, j, nin3)
835 zout(1, nout1, j) = r + r1
836 zout(2, nout1, j) = s + s1
841 zout(1, nout2, j) = r1 - s2
842 zout(2, nout2, j) = s1 + r2
843 zout(1, nout3, j) = r1 + s2
844 zout(2, nout3, j) = s1 - r2
855 nout2 = nout1 + after
856 nout3 = nout2 + after
861 s2 = -zin(1, j, nin2)
862 r3 = -zin(1, j, nin3)
863 s3 = -zin(2, j, nin3)
866 zout(1, nout1, j) = r + r1
867 zout(2, nout1, j) = s + s1
872 zout(1, nout2, j) = r1 - s2
873 zout(2, nout2, j) = s1 + r2
874 zout(1, nout3, j) = r1 + s2
875 zout(2, nout3, j) = s1 - r2
879 ELSE IF (8*ias == 3*after)
THEN
888 nout2 = nout1 + after
889 nout3 = nout2 + after
897 r3 = -zin(2, j, nin3)
901 zout(1, nout1, j) = r + r1
902 zout(2, nout1, j) = s + s1
907 zout(1, nout2, j) = r1 - s2
908 zout(2, nout2, j) = s1 + r2
909 zout(1, nout3, j) = r1 + s2
910 zout(2, nout3, j) = s1 - r2
921 nout2 = nout1 + after
922 nout3 = nout2 + after
931 s3 = -zin(1, j, nin3)
934 zout(1, nout1, j) = r + r1
935 zout(2, nout1, j) = s + s1
940 zout(1, nout2, j) = r1 - s2
941 zout(2, nout2, j) = s1 + r2
942 zout(1, nout3, j) = r1 + s2
943 zout(2, nout3, j) = s1 - r2
962 nout2 = nout1 + after
963 nout3 = nout2 + after
977 zout(1, nout1, j) = r + r1
978 zout(2, nout1, j) = s + s1
983 zout(1, nout2, j) = r1 - s2
984 zout(2, nout2, j) = s1 + r2
985 zout(1, nout3, j) = r1 + s2
986 zout(2, nout3, j) = s1 - r2
991 ELSE IF (now == 5)
THEN
1004 nout2 = nout1 + after
1005 nout3 = nout2 + after
1006 nout4 = nout3 + after
1007 nout5 = nout4 + after
1009 r1 = zin(1, j, nin1)
1010 s1 = zin(2, j, nin1)
1011 r2 = zin(1, j, nin2)
1012 s2 = zin(2, j, nin2)
1013 r3 = zin(1, j, nin3)
1014 s3 = zin(2, j, nin3)
1015 r4 = zin(1, j, nin4)
1016 s4 = zin(2, j, nin4)
1017 r5 = zin(1, j, nin5)
1018 s5 = zin(2, j, nin5)
1023 zout(1, nout1, j) = r1 + r25 + r34
1024 r = cos2*r25 + cos4*r34 + r1
1025 s = sin2*s25 + sin4*s34
1026 zout(1, nout2, j) = r - s
1027 zout(1, nout5, j) = r + s
1028 r = cos4*r25 + cos2*r34 + r1
1029 s = sin4*s25 - sin2*s34
1030 zout(1, nout3, j) = r - s
1031 zout(1, nout4, j) = r + s
1036 zout(2, nout1, j) = s1 + s25 + s34
1037 r = cos2*s25 + cos4*s34 + s1
1038 s = sin2*r25 + sin4*r34
1039 zout(2, nout2, j) = r + s
1040 zout(2, nout5, j) = r - s
1041 r = cos4*s25 + cos2*s34 + s1
1042 s = sin4*r25 - sin2*r34
1043 zout(2, nout3, j) = r + s
1044 zout(2, nout4, j) = r - s
1049 IF (8*ias == 5*after)
THEN
1050 IF (isign == 1)
THEN
1060 nout2 = nout1 + after
1061 nout3 = nout2 + after
1062 nout4 = nout3 + after
1063 nout5 = nout4 + after
1065 r1 = zin(1, j, nin1)
1066 s1 = zin(2, j, nin1)
1071 r3 = -zin(2, j, nin3)
1072 s3 = zin(1, j, nin3)
1077 r5 = -zin(1, j, nin5)
1078 s5 = -zin(2, j, nin5)
1083 zout(1, nout1, j) = r1 + r25 + r34
1084 r = cos2*r25 + cos4*r34 + r1
1085 s = sin2*s25 + sin4*s34
1086 zout(1, nout2, j) = r - s
1087 zout(1, nout5, j) = r + s
1088 r = cos4*r25 + cos2*r34 + r1
1089 s = sin4*s25 - sin2*s34
1090 zout(1, nout3, j) = r - s
1091 zout(1, nout4, j) = r + s
1096 zout(2, nout1, j) = s1 + s25 + s34
1097 r = cos2*s25 + cos4*s34 + s1
1098 s = sin2*r25 + sin4*r34
1099 zout(2, nout2, j) = r + s
1100 zout(2, nout5, j) = r - s
1101 r = cos4*s25 + cos2*s34 + s1
1102 s = sin4*r25 - sin2*r34
1103 zout(2, nout3, j) = r + s
1104 zout(2, nout4, j) = r - s
1117 nout2 = nout1 + after
1118 nout3 = nout2 + after
1119 nout4 = nout3 + after
1120 nout5 = nout4 + after
1122 r1 = zin(1, j, nin1)
1123 s1 = zin(2, j, nin1)
1128 r3 = zin(2, j, nin3)
1129 s3 = -zin(1, j, nin3)
1134 r5 = -zin(1, j, nin5)
1135 s5 = -zin(2, j, nin5)
1140 zout(1, nout1, j) = r1 + r25 + r34
1141 r = cos2*r25 + cos4*r34 + r1
1142 s = sin2*s25 + sin4*s34
1143 zout(1, nout2, j) = r - s
1144 zout(1, nout5, j) = r + s
1145 r = cos4*r25 + cos2*r34 + r1
1146 s = sin4*s25 - sin2*s34
1147 zout(1, nout3, j) = r - s
1148 zout(1, nout4, j) = r + s
1153 zout(2, nout1, j) = s1 + s25 + s34
1154 r = cos2*s25 + cos4*s34 + s1
1155 s = sin2*r25 + sin4*r34
1156 zout(2, nout2, j) = r + s
1157 zout(2, nout5, j) = r - s
1158 r = cos4*s25 + cos2*s34 + s1
1159 s = sin4*r25 - sin2*r34
1160 zout(2, nout3, j) = r + s
1161 zout(2, nout4, j) = r - s
1169 cr2 = trig(1, itrig)
1170 ci2 = trig(2, itrig)
1172 cr3 = trig(1, itrig)
1173 ci3 = trig(2, itrig)
1175 cr4 = trig(1, itrig)
1176 ci4 = trig(2, itrig)
1178 cr5 = trig(1, itrig)
1179 ci5 = trig(2, itrig)
1189 nout2 = nout1 + after
1190 nout3 = nout2 + after
1191 nout4 = nout3 + after
1192 nout5 = nout4 + after
1194 r1 = zin(1, j, nin1)
1195 s1 = zin(2, j, nin1)
1216 zout(1, nout1, j) = r1 + r25 + r34
1217 r = cos2*r25 + cos4*r34 + r1
1218 s = sin2*s25 + sin4*s34
1219 zout(1, nout2, j) = r - s
1220 zout(1, nout5, j) = r + s
1221 r = cos4*r25 + cos2*r34 + r1
1222 s = sin4*s25 - sin2*s34
1223 zout(1, nout3, j) = r - s
1224 zout(1, nout4, j) = r + s
1229 zout(2, nout1, j) = s1 + s25 + s34
1230 r = cos2*s25 + cos4*s34 + s1
1231 s = sin2*r25 + sin4*r34
1232 zout(2, nout2, j) = r + s
1233 zout(2, nout5, j) = r - s
1234 r = cos4*s25 + cos2*s34 + s1
1235 s = sin4*r25 - sin2*r34
1236 zout(2, nout3, j) = r + s
1237 zout(2, nout4, j) = r - s
1242 ELSE IF (now == 6)
THEN
1255 nout2 = nout1 + after
1256 nout3 = nout2 + after
1257 nout4 = nout3 + after
1258 nout5 = nout4 + after
1259 nout6 = nout5 + after
1261 r2 = zin(1, j, nin3)
1262 s2 = zin(2, j, nin3)
1263 r3 = zin(1, j, nin5)
1264 s3 = zin(2, j, nin5)
1267 r1 = zin(1, j, nin1)
1268 s1 = zin(2, j, nin1)
1280 r2 = zin(1, j, nin6)
1281 s2 = zin(2, j, nin6)
1282 r3 = zin(1, j, nin2)
1283 s3 = zin(2, j, nin2)
1286 r1 = zin(1, j, nin4)
1287 s1 = zin(2, j, nin4)
1299 zout(1, nout1, j) = ur1 + vr1
1300 zout(2, nout1, j) = ui1 + vi1
1301 zout(1, nout5, j) = ur2 + vr2
1302 zout(2, nout5, j) = ui2 + vi2
1303 zout(1, nout3, j) = ur3 + vr3
1304 zout(2, nout3, j) = ui3 + vi3
1305 zout(1, nout4, j) = ur1 - vr1
1306 zout(2, nout4, j) = ui1 - vi1
1307 zout(1, nout2, j) = ur2 - vr2
1308 zout(2, nout2, j) = ui2 - vi2
1309 zout(1, nout6, j) = ur3 - vr3
1310 zout(2, nout6, j) = ui3 - vi3
1314 cpabort(
'Error fftrot')
1319 END SUBROUTINE fftrot
1348 SUBROUTINE fftpre(mm, nfft, m, nn, n, zin, zout, trig, now, after, before, isign)
1350 INTEGER,
INTENT(IN) :: mm, nfft, m, nn, n
1351 REAL(dp),
DIMENSION(2, m, mm),
INTENT(IN) :: zin
1352 REAL(dp),
DIMENSION(2, nn, n),
INTENT(INOUT) :: zout
1353 REAL(dp),
DIMENSION(2, ctrig_length),
INTENT(IN) :: trig
1354 INTEGER,
INTENT(IN) :: now, after, before, isign
1356 REAL(dp),
PARAMETER :: bb = 0.8660254037844387_dp, cos2 = 0.3090169943749474_dp, &
1357 cos4 = -0.8090169943749474_dp, rt2i = 0.7071067811865475_dp, &
1358 sin2p = 0.9510565162951536_dp, sin4p = 0.5877852522924731_dp
1360 INTEGER :: atb, atn, ia, ias, ib, itrig, itt, j, &
1361 nin1, nin2, nin3, nin4, nin5, nin6, &
1362 nin7, nin8, nout1, nout2, nout3, &
1363 nout4, nout5, nout6, nout7, nout8
1364 REAL(dp) :: am, ap, bbs, bm, bp, ci2, ci3, ci4, ci5, cm, cp, cr2, cr3, cr4, cr5, dbl, dm, r, &
1365 r1, r2, r25, r3, r34, r4, r5, r6, r7, r8, s, s1, s2, s25, s3, s34, s4, s5, s6, s7, s8, &
1366 sin2, sin4, ui1, ui2, ui3, ur1, ur2, ur3, vi1, vi2, vi3, vr1, vr2, vr3
1380 IF (isign == 1)
THEN
1390 nout2 = nout1 + after
1391 nout3 = nout2 + after
1392 nout4 = nout3 + after
1394 r1 = zin(1, nin1, j)
1395 s1 = zin(2, nin1, j)
1396 r2 = zin(1, nin2, j)
1397 s2 = zin(2, nin2, j)
1398 r3 = zin(1, nin3, j)
1399 s3 = zin(2, nin3, j)
1400 r4 = zin(1, nin4, j)
1401 s4 = zin(2, nin4, j)
1404 zout(1, j, nout1) = r + s
1405 zout(1, j, nout3) = r - s
1408 zout(1, j, nout2) = r - s
1409 zout(1, j, nout4) = r + s
1412 zout(2, j, nout1) = r + s
1413 zout(2, j, nout3) = r - s
1416 zout(2, j, nout2) = r + s
1417 zout(2, j, nout4) = r - s
1422 IF (2*ias == after)
THEN
1431 nout2 = nout1 + after
1432 nout3 = nout2 + after
1433 nout4 = nout3 + after
1435 r1 = zin(1, nin1, j)
1436 s1 = zin(2, nin1, j)
1441 r3 = -zin(2, nin3, j)
1442 s3 = zin(1, nin3, j)
1449 zout(1, j, nout1) = r + s
1450 zout(1, j, nout3) = r - s
1453 zout(1, j, nout2) = r - s
1454 zout(1, j, nout4) = r + s
1457 zout(2, j, nout1) = r + s
1458 zout(2, j, nout3) = r - s
1461 zout(2, j, nout2) = r + s
1462 zout(2, j, nout4) = r - s
1468 cr2 = trig(1, itrig)
1469 ci2 = trig(2, itrig)
1471 cr3 = trig(1, itrig)
1472 ci3 = trig(2, itrig)
1474 cr4 = trig(1, itrig)
1475 ci4 = trig(2, itrig)
1484 nout2 = nout1 + after
1485 nout3 = nout2 + after
1486 nout4 = nout3 + after
1488 r1 = zin(1, nin1, j)
1489 s1 = zin(2, nin1, j)
1504 zout(1, j, nout1) = r + s
1505 zout(1, j, nout3) = r - s
1508 zout(1, j, nout2) = r - s
1509 zout(1, j, nout4) = r + s
1512 zout(2, j, nout1) = r + s
1513 zout(2, j, nout3) = r - s
1516 zout(2, j, nout2) = r + s
1517 zout(2, j, nout4) = r - s
1532 nout2 = nout1 + after
1533 nout3 = nout2 + after
1534 nout4 = nout3 + after
1536 r1 = zin(1, nin1, j)
1537 s1 = zin(2, nin1, j)
1538 r2 = zin(1, nin2, j)
1539 s2 = zin(2, nin2, j)
1540 r3 = zin(1, nin3, j)
1541 s3 = zin(2, nin3, j)
1542 r4 = zin(1, nin4, j)
1543 s4 = zin(2, nin4, j)
1546 zout(1, j, nout1) = r + s
1547 zout(1, j, nout3) = r - s
1550 zout(1, j, nout2) = r + s
1551 zout(1, j, nout4) = r - s
1554 zout(2, j, nout1) = r + s
1555 zout(2, j, nout3) = r - s
1558 zout(2, j, nout2) = r - s
1559 zout(2, j, nout4) = r + s
1564 IF (2*ias == after)
THEN
1573 nout2 = nout1 + after
1574 nout3 = nout2 + after
1575 nout4 = nout3 + after
1577 r1 = zin(1, nin1, j)
1578 s1 = zin(2, nin1, j)
1583 r3 = zin(2, nin3, j)
1584 s3 = -zin(1, nin3, j)
1591 zout(1, j, nout1) = r + s
1592 zout(1, j, nout3) = r - s
1595 zout(1, j, nout2) = r + s
1596 zout(1, j, nout4) = r - s
1599 zout(2, j, nout1) = r + s
1600 zout(2, j, nout3) = r - s
1603 zout(2, j, nout2) = r - s
1604 zout(2, j, nout4) = r + s
1610 cr2 = trig(1, itrig)
1611 ci2 = trig(2, itrig)
1613 cr3 = trig(1, itrig)
1614 ci3 = trig(2, itrig)
1616 cr4 = trig(1, itrig)
1617 ci4 = trig(2, itrig)
1626 nout2 = nout1 + after
1627 nout3 = nout2 + after
1628 nout4 = nout3 + after
1630 r1 = zin(1, nin1, j)
1631 s1 = zin(2, nin1, j)
1646 zout(1, j, nout1) = r + s
1647 zout(1, j, nout3) = r - s
1650 zout(1, j, nout2) = r + s
1651 zout(1, j, nout4) = r - s
1654 zout(2, j, nout1) = r + s
1655 zout(2, j, nout3) = r - s
1658 zout(2, j, nout2) = r - s
1659 zout(2, j, nout4) = r + s
1665 ELSE IF (now == 8)
THEN
1666 IF (isign == -1)
THEN
1680 nout2 = nout1 + after
1681 nout3 = nout2 + after
1682 nout4 = nout3 + after
1683 nout5 = nout4 + after
1684 nout6 = nout5 + after
1685 nout7 = nout6 + after
1686 nout8 = nout7 + after
1688 r1 = zin(1, nin1, j)
1689 s1 = zin(2, nin1, j)
1690 r2 = zin(1, nin2, j)
1691 s2 = zin(2, nin2, j)
1692 r3 = zin(1, nin3, j)
1693 s3 = zin(2, nin3, j)
1694 r4 = zin(1, nin4, j)
1695 s4 = zin(2, nin4, j)
1696 r5 = zin(1, nin5, j)
1697 s5 = zin(2, nin5, j)
1698 r6 = zin(1, nin6, j)
1699 s6 = zin(2, nin6, j)
1700 r7 = zin(1, nin7, j)
1701 s7 = zin(2, nin7, j)
1702 r8 = zin(1, nin8, j)
1703 s8 = zin(2, nin8, j)
1720 zout(1, j, nout1) = ap + bp
1721 zout(2, j, nout1) = cp + dbl
1722 zout(1, j, nout5) = ap - bp
1723 zout(2, j, nout5) = cp - dbl
1724 zout(1, j, nout3) = am + dm
1725 zout(2, j, nout3) = cm - bm
1726 zout(1, j, nout7) = am - dm
1727 zout(2, j, nout7) = cm + bm
1746 cp = (cm + dbl)*rt2i
1747 dbl = (cm - dbl)*rt2i
1748 zout(1, j, nout2) = ap + r
1749 zout(2, j, nout2) = bm + s
1750 zout(1, j, nout6) = ap - r
1751 zout(2, j, nout6) = bm - s
1752 zout(1, j, nout4) = am + cp
1753 zout(2, j, nout4) = bp + dbl
1754 zout(1, j, nout8) = am - cp
1755 zout(2, j, nout8) = bp - dbl
1772 nout2 = nout1 + after
1773 nout3 = nout2 + after
1774 nout4 = nout3 + after
1775 nout5 = nout4 + after
1776 nout6 = nout5 + after
1777 nout7 = nout6 + after
1778 nout8 = nout7 + after
1780 r1 = zin(1, nin1, j)
1781 s1 = zin(2, nin1, j)
1782 r2 = zin(1, nin2, j)
1783 s2 = zin(2, nin2, j)
1784 r3 = zin(1, nin3, j)
1785 s3 = zin(2, nin3, j)
1786 r4 = zin(1, nin4, j)
1787 s4 = zin(2, nin4, j)
1788 r5 = zin(1, nin5, j)
1789 s5 = zin(2, nin5, j)
1790 r6 = zin(1, nin6, j)
1791 s6 = zin(2, nin6, j)
1792 r7 = zin(1, nin7, j)
1793 s7 = zin(2, nin7, j)
1794 r8 = zin(1, nin8, j)
1795 s8 = zin(2, nin8, j)
1812 zout(1, j, nout1) = ap + bp
1813 zout(2, j, nout1) = cp + dbl
1814 zout(1, j, nout5) = ap - bp
1815 zout(2, j, nout5) = cp - dbl
1816 zout(1, j, nout3) = am - dm
1817 zout(2, j, nout3) = cm + bm
1818 zout(1, j, nout7) = am + dm
1819 zout(2, j, nout7) = cm - bm
1838 cp = (cm + dbl)*rt2i
1839 dbl = (-cm + dbl)*rt2i
1840 zout(1, j, nout2) = ap + r
1841 zout(2, j, nout2) = bm + s
1842 zout(1, j, nout6) = ap - r
1843 zout(2, j, nout6) = bm - s
1844 zout(1, j, nout4) = am + cp
1845 zout(2, j, nout4) = bp + dbl
1846 zout(1, j, nout8) = am - cp
1847 zout(2, j, nout8) = bp - dbl
1851 ELSE IF (now == 3)
THEN
1861 nout2 = nout1 + after
1862 nout3 = nout2 + after
1864 r1 = zin(1, nin1, j)
1865 s1 = zin(2, nin1, j)
1866 r2 = zin(1, nin2, j)
1867 s2 = zin(2, nin2, j)
1868 r3 = zin(1, nin3, j)
1869 s3 = zin(2, nin3, j)
1872 zout(1, j, nout1) = r + r1
1873 zout(2, j, nout1) = s + s1
1878 zout(1, j, nout2) = r1 - s2
1879 zout(2, j, nout2) = s1 + r2
1880 zout(1, j, nout3) = r1 + s2
1881 zout(2, j, nout3) = s1 - r2
1886 IF (4*ias == 3*after)
THEN
1887 IF (isign == 1)
THEN
1895 nout2 = nout1 + after
1896 nout3 = nout2 + after
1898 r1 = zin(1, nin1, j)
1899 s1 = zin(2, nin1, j)
1900 r2 = -zin(2, nin2, j)
1901 s2 = zin(1, nin2, j)
1902 r3 = -zin(1, nin3, j)
1903 s3 = -zin(2, nin3, j)
1906 zout(1, j, nout1) = r + r1
1907 zout(2, j, nout1) = s + s1
1912 zout(1, j, nout2) = r1 - s2
1913 zout(2, j, nout2) = s1 + r2
1914 zout(1, j, nout3) = r1 + s2
1915 zout(2, j, nout3) = s1 - r2
1926 nout2 = nout1 + after
1927 nout3 = nout2 + after
1929 r1 = zin(1, nin1, j)
1930 s1 = zin(2, nin1, j)
1931 r2 = zin(2, nin2, j)
1932 s2 = -zin(1, nin2, j)
1933 r3 = -zin(1, nin3, j)
1934 s3 = -zin(2, nin3, j)
1937 zout(1, j, nout1) = r + r1
1938 zout(2, j, nout1) = s + s1
1943 zout(1, j, nout2) = r1 - s2
1944 zout(2, j, nout2) = s1 + r2
1945 zout(1, j, nout3) = r1 + s2
1946 zout(2, j, nout3) = s1 - r2
1950 ELSE IF (8*ias == 3*after)
THEN
1951 IF (isign == 1)
THEN
1959 nout2 = nout1 + after
1960 nout3 = nout2 + after
1962 r1 = zin(1, nin1, j)
1963 s1 = zin(2, nin1, j)
1968 r3 = -zin(2, nin3, j)
1969 s3 = zin(1, nin3, j)
1972 zout(1, j, nout1) = r + r1
1973 zout(2, j, nout1) = s + s1
1978 zout(1, j, nout2) = r1 - s2
1979 zout(2, j, nout2) = s1 + r2
1980 zout(1, j, nout3) = r1 + s2
1981 zout(2, j, nout3) = s1 - r2
1992 nout2 = nout1 + after
1993 nout3 = nout2 + after
1995 r1 = zin(1, nin1, j)
1996 s1 = zin(2, nin1, j)
2001 r3 = zin(2, nin3, j)
2002 s3 = -zin(1, nin3, j)
2005 zout(1, j, nout1) = r + r1
2006 zout(2, j, nout1) = s + s1
2011 zout(1, j, nout2) = r1 - s2
2012 zout(2, j, nout2) = s1 + r2
2013 zout(1, j, nout3) = r1 + s2
2014 zout(2, j, nout3) = s1 - r2
2021 cr2 = trig(1, itrig)
2022 ci2 = trig(2, itrig)
2024 cr3 = trig(1, itrig)
2025 ci3 = trig(2, itrig)
2033 nout2 = nout1 + after
2034 nout3 = nout2 + after
2036 r1 = zin(1, nin1, j)
2037 s1 = zin(2, nin1, j)
2048 zout(1, j, nout1) = r + r1
2049 zout(2, j, nout1) = s + s1
2054 zout(1, j, nout2) = r1 - s2
2055 zout(2, j, nout2) = s1 + r2
2056 zout(1, j, nout3) = r1 + s2
2057 zout(2, j, nout3) = s1 - r2
2062 ELSE IF (now == 5)
THEN
2075 nout2 = nout1 + after
2076 nout3 = nout2 + after
2077 nout4 = nout3 + after
2078 nout5 = nout4 + after
2080 r1 = zin(1, nin1, j)
2081 s1 = zin(2, nin1, j)
2082 r2 = zin(1, nin2, j)
2083 s2 = zin(2, nin2, j)
2084 r3 = zin(1, nin3, j)
2085 s3 = zin(2, nin3, j)
2086 r4 = zin(1, nin4, j)
2087 s4 = zin(2, nin4, j)
2088 r5 = zin(1, nin5, j)
2089 s5 = zin(2, nin5, j)
2094 zout(1, j, nout1) = r1 + r25 + r34
2095 r = cos2*r25 + cos4*r34 + r1
2096 s = sin2*s25 + sin4*s34
2097 zout(1, j, nout2) = r - s
2098 zout(1, j, nout5) = r + s
2099 r = cos4*r25 + cos2*r34 + r1
2100 s = sin4*s25 - sin2*s34
2101 zout(1, j, nout3) = r - s
2102 zout(1, j, nout4) = r + s
2107 zout(2, j, nout1) = s1 + s25 + s34
2108 r = cos2*s25 + cos4*s34 + s1
2109 s = sin2*r25 + sin4*r34
2110 zout(2, j, nout2) = r + s
2111 zout(2, j, nout5) = r - s
2112 r = cos4*s25 + cos2*s34 + s1
2113 s = sin4*r25 - sin2*r34
2114 zout(2, j, nout3) = r + s
2115 zout(2, j, nout4) = r - s
2120 IF (8*ias == 5*after)
THEN
2121 IF (isign == 1)
THEN
2131 nout2 = nout1 + after
2132 nout3 = nout2 + after
2133 nout4 = nout3 + after
2134 nout5 = nout4 + after
2136 r1 = zin(1, nin1, j)
2137 s1 = zin(2, nin1, j)
2142 r3 = -zin(2, nin3, j)
2143 s3 = zin(1, nin3, j)
2148 r5 = -zin(1, nin5, j)
2149 s5 = -zin(2, nin5, j)
2154 zout(1, j, nout1) = r1 + r25 + r34
2155 r = cos2*r25 + cos4*r34 + r1
2156 s = sin2*s25 + sin4*s34
2157 zout(1, j, nout2) = r - s
2158 zout(1, j, nout5) = r + s
2159 r = cos4*r25 + cos2*r34 + r1
2160 s = sin4*s25 - sin2*s34
2161 zout(1, j, nout3) = r - s
2162 zout(1, j, nout4) = r + s
2167 zout(2, j, nout1) = s1 + s25 + s34
2168 r = cos2*s25 + cos4*s34 + s1
2169 s = sin2*r25 + sin4*r34
2170 zout(2, j, nout2) = r + s
2171 zout(2, j, nout5) = r - s
2172 r = cos4*s25 + cos2*s34 + s1
2173 s = sin4*r25 - sin2*r34
2174 zout(2, j, nout3) = r + s
2175 zout(2, j, nout4) = r - s
2188 nout2 = nout1 + after
2189 nout3 = nout2 + after
2190 nout4 = nout3 + after
2191 nout5 = nout4 + after
2193 r1 = zin(1, nin1, j)
2194 s1 = zin(2, nin1, j)
2199 r3 = zin(2, nin3, j)
2200 s3 = -zin(1, nin3, j)
2205 r5 = -zin(1, nin5, j)
2206 s5 = -zin(2, nin5, j)
2211 zout(1, j, nout1) = r1 + r25 + r34
2212 r = cos2*r25 + cos4*r34 + r1
2213 s = sin2*s25 + sin4*s34
2214 zout(1, j, nout2) = r - s
2215 zout(1, j, nout5) = r + s
2216 r = cos4*r25 + cos2*r34 + r1
2217 s = sin4*s25 - sin2*s34
2218 zout(1, j, nout3) = r - s
2219 zout(1, j, nout4) = r + s
2224 zout(2, j, nout1) = s1 + s25 + s34
2225 r = cos2*s25 + cos4*s34 + s1
2226 s = sin2*r25 + sin4*r34
2227 zout(2, j, nout2) = r + s
2228 zout(2, j, nout5) = r - s
2229 r = cos4*s25 + cos2*s34 + s1
2230 s = sin4*r25 - sin2*r34
2231 zout(2, j, nout3) = r + s
2232 zout(2, j, nout4) = r - s
2240 cr2 = trig(1, itrig)
2241 ci2 = trig(2, itrig)
2243 cr3 = trig(1, itrig)
2244 ci3 = trig(2, itrig)
2246 cr4 = trig(1, itrig)
2247 ci4 = trig(2, itrig)
2249 cr5 = trig(1, itrig)
2250 ci5 = trig(2, itrig)
2260 nout2 = nout1 + after
2261 nout3 = nout2 + after
2262 nout4 = nout3 + after
2263 nout5 = nout4 + after
2265 r1 = zin(1, nin1, j)
2266 s1 = zin(2, nin1, j)
2287 zout(1, j, nout1) = r1 + r25 + r34
2288 r = cos2*r25 + cos4*r34 + r1
2289 s = sin2*s25 + sin4*s34
2290 zout(1, j, nout2) = r - s
2291 zout(1, j, nout5) = r + s
2292 r = cos4*r25 + cos2*r34 + r1
2293 s = sin4*s25 - sin2*s34
2294 zout(1, j, nout3) = r - s
2295 zout(1, j, nout4) = r + s
2300 zout(2, j, nout1) = s1 + s25 + s34
2301 r = cos2*s25 + cos4*s34 + s1
2302 s = sin2*r25 + sin4*r34
2303 zout(2, j, nout2) = r + s
2304 zout(2, j, nout5) = r - s
2305 r = cos4*s25 + cos2*s34 + s1
2306 s = sin4*r25 - sin2*r34
2307 zout(2, j, nout3) = r + s
2308 zout(2, j, nout4) = r - s
2313 ELSE IF (now == 6)
THEN
2326 nout2 = nout1 + after
2327 nout3 = nout2 + after
2328 nout4 = nout3 + after
2329 nout5 = nout4 + after
2330 nout6 = nout5 + after
2332 r2 = zin(1, nin3, j)
2333 s2 = zin(2, nin3, j)
2334 r3 = zin(1, nin5, j)
2335 s3 = zin(2, nin5, j)
2338 r1 = zin(1, nin1, j)
2339 s1 = zin(2, nin1, j)
2351 r2 = zin(1, nin6, j)
2352 s2 = zin(2, nin6, j)
2353 r3 = zin(1, nin2, j)
2354 s3 = zin(2, nin2, j)
2357 r1 = zin(1, nin4, j)
2358 s1 = zin(2, nin4, j)
2370 zout(1, j, nout1) = ur1 + vr1
2371 zout(2, j, nout1) = ui1 + vi1
2372 zout(1, j, nout5) = ur2 + vr2
2373 zout(2, j, nout5) = ui2 + vi2
2374 zout(1, j, nout3) = ur3 + vr3
2375 zout(2, j, nout3) = ui3 + vi3
2376 zout(1, j, nout4) = ur1 - vr1
2377 zout(2, j, nout4) = ui1 - vi1
2378 zout(1, j, nout2) = ur2 - vr2
2379 zout(2, j, nout2) = ui2 - vi2
2380 zout(1, j, nout6) = ur3 - vr3
2381 zout(2, j, nout6) = ui3 - vi3
2385 cpabort(
'Error fftpre')
2390 END SUBROUTINE fftpre
2420 SUBROUTINE fftstp(mm, nfft, m, nn, n, zin, zout, trig, now, after, before, isign)
2422 INTEGER,
INTENT(IN) :: mm, nfft, m, nn, n
2423 REAL(dp),
DIMENSION(2, mm, m),
INTENT(IN) :: zin
2424 REAL(dp),
DIMENSION(2, nn, n),
INTENT(INOUT) :: zout
2425 REAL(dp),
DIMENSION(2, ctrig_length),
INTENT(IN) :: trig
2426 INTEGER,
INTENT(IN) :: now, after, before, isign
2428 REAL(dp),
PARAMETER :: bb = 0.8660254037844387_dp, cos2 = 0.3090169943749474_dp, &
2429 cos4 = -0.8090169943749474_dp, rt2i = 0.7071067811865475_dp, &
2430 sin2p = 0.9510565162951536_dp, sin4p = 0.5877852522924731_dp
2432 INTEGER :: atb, atn, ia, ias, ib, itrig, itt, j, &
2433 nin1, nin2, nin3, nin4, nin5, nin6, &
2434 nin7, nin8, nout1, nout2, nout3, &
2435 nout4, nout5, nout6, nout7, nout8
2436 REAL(dp) :: am, ap, bbs, bm, bp, ci2, ci3, ci4, ci5, cm, cp, cr2, cr3, cr4, cr5, dbl, dm, r, &
2437 r1, r2, r25, r3, r34, r4, r5, r6, r7, r8, s, s1, s2, s25, s3, s34, s4, s5, s6, s7, s8, &
2438 sin2, sin4, ui1, ui2, ui3, ur1, ur2, ur3, vi1, vi2, vi3, vr1, vr2, vr3
2452 IF (isign == 1)
THEN
2462 nout2 = nout1 + after
2463 nout3 = nout2 + after
2464 nout4 = nout3 + after
2466 r1 = zin(1, j, nin1)
2467 s1 = zin(2, j, nin1)
2468 r2 = zin(1, j, nin2)
2469 s2 = zin(2, j, nin2)
2470 r3 = zin(1, j, nin3)
2471 s3 = zin(2, j, nin3)
2472 r4 = zin(1, j, nin4)
2473 s4 = zin(2, j, nin4)
2476 zout(1, j, nout1) = r + s
2477 zout(1, j, nout3) = r - s
2480 zout(1, j, nout2) = r - s
2481 zout(1, j, nout4) = r + s
2484 zout(2, j, nout1) = r + s
2485 zout(2, j, nout3) = r - s
2488 zout(2, j, nout2) = r + s
2489 zout(2, j, nout4) = r - s
2494 IF (2*ias == after)
THEN
2503 nout2 = nout1 + after
2504 nout3 = nout2 + after
2505 nout4 = nout3 + after
2507 r1 = zin(1, j, nin1)
2508 s1 = zin(2, j, nin1)
2513 r3 = -zin(2, j, nin3)
2514 s3 = zin(1, j, nin3)
2521 zout(1, j, nout1) = r + s
2522 zout(1, j, nout3) = r - s
2525 zout(1, j, nout2) = r - s
2526 zout(1, j, nout4) = r + s
2529 zout(2, j, nout1) = r + s
2530 zout(2, j, nout3) = r - s
2533 zout(2, j, nout2) = r + s
2534 zout(2, j, nout4) = r - s
2540 cr2 = trig(1, itrig)
2541 ci2 = trig(2, itrig)
2543 cr3 = trig(1, itrig)
2544 ci3 = trig(2, itrig)
2546 cr4 = trig(1, itrig)
2547 ci4 = trig(2, itrig)
2556 nout2 = nout1 + after
2557 nout3 = nout2 + after
2558 nout4 = nout3 + after
2560 r1 = zin(1, j, nin1)
2561 s1 = zin(2, j, nin1)
2576 zout(1, j, nout1) = r + s
2577 zout(1, j, nout3) = r - s
2580 zout(1, j, nout2) = r - s
2581 zout(1, j, nout4) = r + s
2584 zout(2, j, nout1) = r + s
2585 zout(2, j, nout3) = r - s
2588 zout(2, j, nout2) = r + s
2589 zout(2, j, nout4) = r - s
2604 nout2 = nout1 + after
2605 nout3 = nout2 + after
2606 nout4 = nout3 + after
2608 r1 = zin(1, j, nin1)
2609 s1 = zin(2, j, nin1)
2610 r2 = zin(1, j, nin2)
2611 s2 = zin(2, j, nin2)
2612 r3 = zin(1, j, nin3)
2613 s3 = zin(2, j, nin3)
2614 r4 = zin(1, j, nin4)
2615 s4 = zin(2, j, nin4)
2618 zout(1, j, nout1) = r + s
2619 zout(1, j, nout3) = r - s
2622 zout(1, j, nout2) = r + s
2623 zout(1, j, nout4) = r - s
2626 zout(2, j, nout1) = r + s
2627 zout(2, j, nout3) = r - s
2630 zout(2, j, nout2) = r - s
2631 zout(2, j, nout4) = r + s
2636 IF (2*ias == after)
THEN
2645 nout2 = nout1 + after
2646 nout3 = nout2 + after
2647 nout4 = nout3 + after
2649 r1 = zin(1, j, nin1)
2650 s1 = zin(2, j, nin1)
2655 r3 = zin(2, j, nin3)
2656 s3 = -zin(1, j, nin3)
2663 zout(1, j, nout1) = r + s
2664 zout(1, j, nout3) = r - s
2667 zout(1, j, nout2) = r + s
2668 zout(1, j, nout4) = r - s
2671 zout(2, j, nout1) = r + s
2672 zout(2, j, nout3) = r - s
2675 zout(2, j, nout2) = r - s
2676 zout(2, j, nout4) = r + s
2682 cr2 = trig(1, itrig)
2683 ci2 = trig(2, itrig)
2685 cr3 = trig(1, itrig)
2686 ci3 = trig(2, itrig)
2688 cr4 = trig(1, itrig)
2689 ci4 = trig(2, itrig)
2698 nout2 = nout1 + after
2699 nout3 = nout2 + after
2700 nout4 = nout3 + after
2702 r1 = zin(1, j, nin1)
2703 s1 = zin(2, j, nin1)
2718 zout(1, j, nout1) = r + s
2719 zout(1, j, nout3) = r - s
2722 zout(1, j, nout2) = r + s
2723 zout(1, j, nout4) = r - s
2726 zout(2, j, nout1) = r + s
2727 zout(2, j, nout3) = r - s
2730 zout(2, j, nout2) = r - s
2731 zout(2, j, nout4) = r + s
2737 ELSE IF (now == 8)
THEN
2738 IF (isign == -1)
THEN
2752 nout2 = nout1 + after
2753 nout3 = nout2 + after
2754 nout4 = nout3 + after
2755 nout5 = nout4 + after
2756 nout6 = nout5 + after
2757 nout7 = nout6 + after
2758 nout8 = nout7 + after
2760 r1 = zin(1, j, nin1)
2761 s1 = zin(2, j, nin1)
2762 r2 = zin(1, j, nin2)
2763 s2 = zin(2, j, nin2)
2764 r3 = zin(1, j, nin3)
2765 s3 = zin(2, j, nin3)
2766 r4 = zin(1, j, nin4)
2767 s4 = zin(2, j, nin4)
2768 r5 = zin(1, j, nin5)
2769 s5 = zin(2, j, nin5)
2770 r6 = zin(1, j, nin6)
2771 s6 = zin(2, j, nin6)
2772 r7 = zin(1, j, nin7)
2773 s7 = zin(2, j, nin7)
2774 r8 = zin(1, j, nin8)
2775 s8 = zin(2, j, nin8)
2792 zout(1, j, nout1) = ap + bp
2793 zout(2, j, nout1) = cp + dbl
2794 zout(1, j, nout5) = ap - bp
2795 zout(2, j, nout5) = cp - dbl
2796 zout(1, j, nout3) = am + dm
2797 zout(2, j, nout3) = cm - bm
2798 zout(1, j, nout7) = am - dm
2799 zout(2, j, nout7) = cm + bm
2818 cp = (cm + dbl)*rt2i
2819 dbl = (cm - dbl)*rt2i
2820 zout(1, j, nout2) = ap + r
2821 zout(2, j, nout2) = bm + s
2822 zout(1, j, nout6) = ap - r
2823 zout(2, j, nout6) = bm - s
2824 zout(1, j, nout4) = am + cp
2825 zout(2, j, nout4) = bp + dbl
2826 zout(1, j, nout8) = am - cp
2827 zout(2, j, nout8) = bp - dbl
2844 nout2 = nout1 + after
2845 nout3 = nout2 + after
2846 nout4 = nout3 + after
2847 nout5 = nout4 + after
2848 nout6 = nout5 + after
2849 nout7 = nout6 + after
2850 nout8 = nout7 + after
2852 r1 = zin(1, j, nin1)
2853 s1 = zin(2, j, nin1)
2854 r2 = zin(1, j, nin2)
2855 s2 = zin(2, j, nin2)
2856 r3 = zin(1, j, nin3)
2857 s3 = zin(2, j, nin3)
2858 r4 = zin(1, j, nin4)
2859 s4 = zin(2, j, nin4)
2860 r5 = zin(1, j, nin5)
2861 s5 = zin(2, j, nin5)
2862 r6 = zin(1, j, nin6)
2863 s6 = zin(2, j, nin6)
2864 r7 = zin(1, j, nin7)
2865 s7 = zin(2, j, nin7)
2866 r8 = zin(1, j, nin8)
2867 s8 = zin(2, j, nin8)
2884 zout(1, j, nout1) = ap + bp
2885 zout(2, j, nout1) = cp + dbl
2886 zout(1, j, nout5) = ap - bp
2887 zout(2, j, nout5) = cp - dbl
2888 zout(1, j, nout3) = am - dm
2889 zout(2, j, nout3) = cm + bm
2890 zout(1, j, nout7) = am + dm
2891 zout(2, j, nout7) = cm - bm
2910 cp = (cm + dbl)*rt2i
2911 dbl = (-cm + dbl)*rt2i
2912 zout(1, j, nout2) = ap + r
2913 zout(2, j, nout2) = bm + s
2914 zout(1, j, nout6) = ap - r
2915 zout(2, j, nout6) = bm - s
2916 zout(1, j, nout4) = am + cp
2917 zout(2, j, nout4) = bp + dbl
2918 zout(1, j, nout8) = am - cp
2919 zout(2, j, nout8) = bp - dbl
2923 ELSE IF (now == 3)
THEN
2933 nout2 = nout1 + after
2934 nout3 = nout2 + after
2936 r1 = zin(1, j, nin1)
2937 s1 = zin(2, j, nin1)
2938 r2 = zin(1, j, nin2)
2939 s2 = zin(2, j, nin2)
2940 r3 = zin(1, j, nin3)
2941 s3 = zin(2, j, nin3)
2944 zout(1, j, nout1) = r + r1
2945 zout(2, j, nout1) = s + s1
2950 zout(1, j, nout2) = r1 - s2
2951 zout(2, j, nout2) = s1 + r2
2952 zout(1, j, nout3) = r1 + s2
2953 zout(2, j, nout3) = s1 - r2
2958 IF (4*ias == 3*after)
THEN
2959 IF (isign == 1)
THEN
2967 nout2 = nout1 + after
2968 nout3 = nout2 + after
2970 r1 = zin(1, j, nin1)
2971 s1 = zin(2, j, nin1)
2972 r2 = -zin(2, j, nin2)
2973 s2 = zin(1, j, nin2)
2974 r3 = -zin(1, j, nin3)
2975 s3 = -zin(2, j, nin3)
2978 zout(1, j, nout1) = r + r1
2979 zout(2, j, nout1) = s + s1
2984 zout(1, j, nout2) = r1 - s2
2985 zout(2, j, nout2) = s1 + r2
2986 zout(1, j, nout3) = r1 + s2
2987 zout(2, j, nout3) = s1 - r2
2998 nout2 = nout1 + after
2999 nout3 = nout2 + after
3001 r1 = zin(1, j, nin1)
3002 s1 = zin(2, j, nin1)
3003 r2 = zin(2, j, nin2)
3004 s2 = -zin(1, j, nin2)
3005 r3 = -zin(1, j, nin3)
3006 s3 = -zin(2, j, nin3)
3009 zout(1, j, nout1) = r + r1
3010 zout(2, j, nout1) = s + s1
3015 zout(1, j, nout2) = r1 - s2
3016 zout(2, j, nout2) = s1 + r2
3017 zout(1, j, nout3) = r1 + s2
3018 zout(2, j, nout3) = s1 - r2
3022 ELSE IF (8*ias == 3*after)
THEN
3023 IF (isign == 1)
THEN
3031 nout2 = nout1 + after
3032 nout3 = nout2 + after
3034 r1 = zin(1, j, nin1)
3035 s1 = zin(2, j, nin1)
3040 r3 = -zin(2, j, nin3)
3041 s3 = zin(1, j, nin3)
3044 zout(1, j, nout1) = r + r1
3045 zout(2, j, nout1) = s + s1
3050 zout(1, j, nout2) = r1 - s2
3051 zout(2, j, nout2) = s1 + r2
3052 zout(1, j, nout3) = r1 + s2
3053 zout(2, j, nout3) = s1 - r2
3064 nout2 = nout1 + after
3065 nout3 = nout2 + after
3067 r1 = zin(1, j, nin1)
3068 s1 = zin(2, j, nin1)
3073 r3 = zin(2, j, nin3)
3074 s3 = -zin(1, j, nin3)
3077 zout(1, j, nout1) = r + r1
3078 zout(2, j, nout1) = s + s1
3083 zout(1, j, nout2) = r1 - s2
3084 zout(2, j, nout2) = s1 + r2
3085 zout(1, j, nout3) = r1 + s2
3086 zout(2, j, nout3) = s1 - r2
3093 cr2 = trig(1, itrig)
3094 ci2 = trig(2, itrig)
3096 cr3 = trig(1, itrig)
3097 ci3 = trig(2, itrig)
3105 nout2 = nout1 + after
3106 nout3 = nout2 + after
3108 r1 = zin(1, j, nin1)
3109 s1 = zin(2, j, nin1)
3120 zout(1, j, nout1) = r + r1
3121 zout(2, j, nout1) = s + s1
3126 zout(1, j, nout2) = r1 - s2
3127 zout(2, j, nout2) = s1 + r2
3128 zout(1, j, nout3) = r1 + s2
3129 zout(2, j, nout3) = s1 - r2
3134 ELSE IF (now == 5)
THEN
3147 nout2 = nout1 + after
3148 nout3 = nout2 + after
3149 nout4 = nout3 + after
3150 nout5 = nout4 + after
3152 r1 = zin(1, j, nin1)
3153 s1 = zin(2, j, nin1)
3154 r2 = zin(1, j, nin2)
3155 s2 = zin(2, j, nin2)
3156 r3 = zin(1, j, nin3)
3157 s3 = zin(2, j, nin3)
3158 r4 = zin(1, j, nin4)
3159 s4 = zin(2, j, nin4)
3160 r5 = zin(1, j, nin5)
3161 s5 = zin(2, j, nin5)
3166 zout(1, j, nout1) = r1 + r25 + r34
3167 r = cos2*r25 + cos4*r34 + r1
3168 s = sin2*s25 + sin4*s34
3169 zout(1, j, nout2) = r - s
3170 zout(1, j, nout5) = r + s
3171 r = cos4*r25 + cos2*r34 + r1
3172 s = sin4*s25 - sin2*s34
3173 zout(1, j, nout3) = r - s
3174 zout(1, j, nout4) = r + s
3179 zout(2, j, nout1) = s1 + s25 + s34
3180 r = cos2*s25 + cos4*s34 + s1
3181 s = sin2*r25 + sin4*r34
3182 zout(2, j, nout2) = r + s
3183 zout(2, j, nout5) = r - s
3184 r = cos4*s25 + cos2*s34 + s1
3185 s = sin4*r25 - sin2*r34
3186 zout(2, j, nout3) = r + s
3187 zout(2, j, nout4) = r - s
3192 IF (8*ias == 5*after)
THEN
3193 IF (isign == 1)
THEN
3203 nout2 = nout1 + after
3204 nout3 = nout2 + after
3205 nout4 = nout3 + after
3206 nout5 = nout4 + after
3208 r1 = zin(1, j, nin1)
3209 s1 = zin(2, j, nin1)
3214 r3 = -zin(2, j, nin3)
3215 s3 = zin(1, j, nin3)
3220 r5 = -zin(1, j, nin5)
3221 s5 = -zin(2, j, nin5)
3226 zout(1, j, nout1) = r1 + r25 + r34
3227 r = cos2*r25 + cos4*r34 + r1
3228 s = sin2*s25 + sin4*s34
3229 zout(1, j, nout2) = r - s
3230 zout(1, j, nout5) = r + s
3231 r = cos4*r25 + cos2*r34 + r1
3232 s = sin4*s25 - sin2*s34
3233 zout(1, j, nout3) = r - s
3234 zout(1, j, nout4) = r + s
3239 zout(2, j, nout1) = s1 + s25 + s34
3240 r = cos2*s25 + cos4*s34 + s1
3241 s = sin2*r25 + sin4*r34
3242 zout(2, j, nout2) = r + s
3243 zout(2, j, nout5) = r - s
3244 r = cos4*s25 + cos2*s34 + s1
3245 s = sin4*r25 - sin2*r34
3246 zout(2, j, nout3) = r + s
3247 zout(2, j, nout4) = r - s
3260 nout2 = nout1 + after
3261 nout3 = nout2 + after
3262 nout4 = nout3 + after
3263 nout5 = nout4 + after
3265 r1 = zin(1, j, nin1)
3266 s1 = zin(2, j, nin1)
3271 r3 = zin(2, j, nin3)
3272 s3 = -zin(1, j, nin3)
3277 r5 = -zin(1, j, nin5)
3278 s5 = -zin(2, j, nin5)
3283 zout(1, j, nout1) = r1 + r25 + r34
3284 r = cos2*r25 + cos4*r34 + r1
3285 s = sin2*s25 + sin4*s34
3286 zout(1, j, nout2) = r - s
3287 zout(1, j, nout5) = r + s
3288 r = cos4*r25 + cos2*r34 + r1
3289 s = sin4*s25 - sin2*s34
3290 zout(1, j, nout3) = r - s
3291 zout(1, j, nout4) = r + s
3296 zout(2, j, nout1) = s1 + s25 + s34
3297 r = cos2*s25 + cos4*s34 + s1
3298 s = sin2*r25 + sin4*r34
3299 zout(2, j, nout2) = r + s
3300 zout(2, j, nout5) = r - s
3301 r = cos4*s25 + cos2*s34 + s1
3302 s = sin4*r25 - sin2*r34
3303 zout(2, j, nout3) = r + s
3304 zout(2, j, nout4) = r - s
3312 cr2 = trig(1, itrig)
3313 ci2 = trig(2, itrig)
3315 cr3 = trig(1, itrig)
3316 ci3 = trig(2, itrig)
3318 cr4 = trig(1, itrig)
3319 ci4 = trig(2, itrig)
3321 cr5 = trig(1, itrig)
3322 ci5 = trig(2, itrig)
3332 nout2 = nout1 + after
3333 nout3 = nout2 + after
3334 nout4 = nout3 + after
3335 nout5 = nout4 + after
3337 r1 = zin(1, j, nin1)
3338 s1 = zin(2, j, nin1)
3359 zout(1, j, nout1) = r1 + r25 + r34
3360 r = cos2*r25 + cos4*r34 + r1
3361 s = sin2*s25 + sin4*s34
3362 zout(1, j, nout2) = r - s
3363 zout(1, j, nout5) = r + s
3364 r = cos4*r25 + cos2*r34 + r1
3365 s = sin4*s25 - sin2*s34
3366 zout(1, j, nout3) = r - s
3367 zout(1, j, nout4) = r + s
3372 zout(2, j, nout1) = s1 + s25 + s34
3373 r = cos2*s25 + cos4*s34 + s1
3374 s = sin2*r25 + sin4*r34
3375 zout(2, j, nout2) = r + s
3376 zout(2, j, nout5) = r - s
3377 r = cos4*s25 + cos2*s34 + s1
3378 s = sin4*r25 - sin2*r34
3379 zout(2, j, nout3) = r + s
3380 zout(2, j, nout4) = r - s
3385 ELSE IF (now == 6)
THEN
3398 nout2 = nout1 + after
3399 nout3 = nout2 + after
3400 nout4 = nout3 + after
3401 nout5 = nout4 + after
3402 nout6 = nout5 + after
3404 r2 = zin(1, j, nin3)
3405 s2 = zin(2, j, nin3)
3406 r3 = zin(1, j, nin5)
3407 s3 = zin(2, j, nin5)
3410 r1 = zin(1, j, nin1)
3411 s1 = zin(2, j, nin1)
3423 r2 = zin(1, j, nin6)
3424 s2 = zin(2, j, nin6)
3425 r3 = zin(1, j, nin2)
3426 s3 = zin(2, j, nin2)
3429 r1 = zin(1, j, nin4)
3430 s1 = zin(2, j, nin4)
3442 zout(1, j, nout1) = ur1 + vr1
3443 zout(2, j, nout1) = ui1 + vi1
3444 zout(1, j, nout5) = ur2 + vr2
3445 zout(2, j, nout5) = ui2 + vi2
3446 zout(1, j, nout3) = ur3 + vr3
3447 zout(2, j, nout3) = ui3 + vi3
3448 zout(1, j, nout4) = ur1 - vr1
3449 zout(2, j, nout4) = ui1 - vi1
3450 zout(1, j, nout2) = ur2 - vr2
3451 zout(2, j, nout2) = ui2 - vi2
3452 zout(1, j, nout6) = ur3 - vr3
3453 zout(2, j, nout6) = ui3 - vi3
3457 cpabort(
'Error fftstp')
3462 END SUBROUTINE fftstp
3486 SUBROUTINE ctrig(n, trig, after, before, now, isign, ic)
3487 INTEGER,
INTENT(IN) :: n
3488 REAL(dp),
DIMENSION(2, ctrig_length),
INTENT(OUT) :: trig
3489 INTEGER,
DIMENSION(7),
INTENT(OUT) :: after, before, now
3490 INTEGER,
INTENT(IN) :: isign
3491 INTEGER,
INTENT(OUT) :: ic
3493 INTEGER,
PARAMETER :: nt = 82
3494 INTEGER,
DIMENSION(7, nt),
PARAMETER :: idata = reshape([3, 3, 1, 1, 1, 1, 1, 4, 4, 1, 1, 1, &
3495 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, &
3496 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&
3497 , 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, &
3498 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 &
3499 , 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, &
3500 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 &
3501 , 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&
3502 , 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 &
3503 , 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,&
3504 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&
3505 , 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, &
3506 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&
3507 , 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,&
3508 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&
3509 , 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,&
3510 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&
3511 , 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,&
3512 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&
3513 , 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,&
3514 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, &
3515 ctrig_length, 4, 4, 4, 4, 4, 1], [7, nt])
3517 INTEGER :: i, itt, j
3521 IF (n == idata(1, i))
THEN
3524 itt = idata(1 + j, i)
3527 now(j) = idata(1 + j, i)
3538 CALL cp_abort(__location__, &
3539 "Value of n not supported for ctrig in mltfftsg")
3546 after(i) = after(i - 1)*now(i - 1)
3547 before(ic - i + 1) = before(ic - i + 2)*now(ic - i + 2)
3550 angle = isign*
twopi/real(n, dp)
3554 trig(1, i + 1) = cos(real(i, dp)*angle)
3555 trig(2, i + 1) = sin(real(i, dp)*angle)
3558 END SUBROUTINE ctrig
3569 SUBROUTINE matmov(n, m, a, lda, b, ldb)
3570 INTEGER :: n, m, lda
3571 COMPLEX(dp) :: a(lda, *)
3573 COMPLEX(dp) :: b(ldb, *)
3575 b(1:n, 1:m) = a(1:n, 1:m)
3576 END SUBROUTINE matmov
3587 SUBROUTINE zgetmo(a, lda, m, n, b, ldb)
3588 INTEGER :: lda, m, n
3589 COMPLEX(dp) :: a(lda, n)
3591 COMPLEX(dp) :: b(ldb, m)
3593 b(1:n, 1:m) = transpose(a(1:m, 1:n))
3594 END SUBROUTINE zgetmo
3602 SUBROUTINE scaled(n, sc, a)
3607 CALL dscal(n, sc, a, 1)
3609 END SUBROUTINE scaled
Defines the basic variable types.
integer, parameter, public dp
Definition of mathematical constants and functions.
real(kind=dp), parameter, public twopi