1
subroutine fftstp(mm,n1dfft,m,nn,n,zin,zout,trig,after,now,before,isign)
3
! RESTRICTIONS on USAGE
4
! Copyright (C) 2002-2007 Stefan Goedecker, CEA Grenoble
5
! This file is distributed under the terms of the
6
! GNU General Public License, see http://www.gnu.org/copyleft/gpl.txt .
10
implicit real(dp) (a-h,o-z)
11
!Arguments ------------------------------------
12
integer after,before,atn,atb
13
integer :: mm,n1dfft,m,nn,n,now,isign
14
real(dp) :: zin,zout,trig
15
dimension trig(2,2048),zin(2,mm,m),zout(2,nn,n)
16
!Local variables-------------------------------
18
! *************************************************************************
38
zout(1,j,nout1)= r2 + r1
39
zout(2,j,nout1)= s2 + s1
40
zout(1,j,nout2)= r1 - r2
41
zout(2,j,nout2)= s1 - s2
45
if (2*ias.eq.after) then
59
zout(1,j,nout1)= r1 - r2
60
zout(2,j,nout1)= s2 + s1
61
zout(1,j,nout2)= r2 + r1
62
zout(2,j,nout2)= s1 - s2
77
zout(1,j,nout1)= r2 + r1
78
zout(2,j,nout1)= s1 - s2
79
zout(1,j,nout2)= r1 - r2
80
zout(2,j,nout2)= s2 + s1
83
else if (4*ias.eq.after) then
99
zout(1,j,nout1)= r2 + r1
100
zout(2,j,nout1)= s2 + s1
101
zout(1,j,nout2)= r1 - r2
102
zout(2,j,nout2)= s1 - s2
119
zout(1,j,nout1)= r2 + r1
120
zout(2,j,nout1)= s2 + s1
121
zout(1,j,nout2)= r1 - r2
122
zout(2,j,nout2)= s1 - s2
125
else if (4*ias.eq.3*after) then
141
zout(1,j,nout1)= r1 - r2
142
zout(2,j,nout1)= s2 + s1
143
zout(1,j,nout2)= r2 + r1
144
zout(2,j,nout2)= s1 - s2
161
zout(1,j,nout1)= r2 + r1
162
zout(2,j,nout1)= s1 - s2
163
zout(1,j,nout2)= r1 - r2
164
zout(2,j,nout2)= s2 + s1
185
zout(1,j,nout1)= r2 + r1
186
zout(2,j,nout1)= s2 + s1
187
zout(1,j,nout2)= r1 - r2
188
zout(2,j,nout2)= s1 - s2
192
else if (now.eq.4) then
217
zout(1,j,nout1) = r + s
218
zout(1,j,nout3) = r - s
221
zout(1,j,nout2) = r - s
222
zout(1,j,nout4) = r + s
225
zout(2,j,nout1) = r + s
226
zout(2,j,nout3) = r - s
229
zout(2,j,nout2) = r + s
230
zout(2,j,nout4) = r - s
234
if (2*ias.eq.after) then
261
zout(1,j,nout1) = r + s
262
zout(1,j,nout3) = r - s
265
zout(1,j,nout2) = r - s
266
zout(1,j,nout4) = r + s
269
zout(2,j,nout1) = r + s
270
zout(2,j,nout3) = r - s
273
zout(2,j,nout2) = r + s
274
zout(2,j,nout4) = r - s
315
zout(1,j,nout1) = r + s
316
zout(1,j,nout3) = r - s
319
zout(1,j,nout2) = r - s
320
zout(1,j,nout4) = r + s
323
zout(2,j,nout1) = r + s
324
zout(2,j,nout3) = r - s
327
zout(2,j,nout2) = r + s
328
zout(2,j,nout4) = r - s
356
zout(1,j,nout1) = r + s
357
zout(1,j,nout3) = r - s
360
zout(1,j,nout2) = r + s
361
zout(1,j,nout4) = r - s
364
zout(2,j,nout1) = r + s
365
zout(2,j,nout3) = r - s
368
zout(2,j,nout2) = r - s
369
zout(2,j,nout4) = r + s
373
if (2*ias.eq.after) then
400
zout(1,j,nout1) = r + s
401
zout(1,j,nout3) = r - s
404
zout(1,j,nout2) = r + s
405
zout(1,j,nout4) = r - s
408
zout(2,j,nout1) = r + s
409
zout(2,j,nout3) = r - s
412
zout(2,j,nout2) = r - s
413
zout(2,j,nout4) = r + s
454
zout(1,j,nout1) = r + s
455
zout(1,j,nout3) = r - s
458
zout(1,j,nout2) = r + s
459
zout(1,j,nout4) = r - s
462
zout(2,j,nout1) = r + s
463
zout(2,j,nout3) = r - s
466
zout(2,j,nout2) = r - s
467
zout(2,j,nout4) = r + s
472
else if (now.eq.8) then
473
if (isign.eq.-1) then
527
zout(1,j,nout1) = ap + bp
528
zout(2,j,nout1) = cp + dpp
529
zout(1,j,nout5) = ap - bp
530
zout(2,j,nout5) = cp - dpp
531
zout(1,j,nout3) = am + dm
532
zout(2,j,nout3) = cm - bm
533
zout(1,j,nout7) = am - dm
534
zout(2,j,nout7) = cm + bm
554
dpp = ( cm - dpp)*rt2i
555
zout(1,j,nout2) = ap + r
556
zout(2,j,nout2) = bm + s
557
zout(1,j,nout6) = ap - r
558
zout(2,j,nout6) = bm - s
559
zout(1,j,nout4) = am + cp
560
zout(2,j,nout4) = bp + dpp
561
zout(1,j,nout8) = am - cp
562
zout(2,j,nout8) = bp - dpp
654
zout(1,j,nout1) = ap + bp
655
zout(2,j,nout1) = cp + dpp
656
zout(1,j,nout5) = ap - bp
657
zout(2,j,nout5) = cp - dpp
658
zout(1,j,nout3) = am + dm
659
zout(2,j,nout3) = cm - bm
660
zout(1,j,nout7) = am - dm
661
zout(2,j,nout7) = cm + bm
681
dpp = ( cm - dpp)*rt2i
682
zout(1,j,nout2) = ap + r
683
zout(2,j,nout2) = bm + s
684
zout(1,j,nout6) = ap - r
685
zout(2,j,nout6) = bm - s
686
zout(1,j,nout4) = am + cp
687
zout(2,j,nout4) = bp + dpp
688
zout(1,j,nout8) = am - cp
689
zout(2,j,nout8) = bp - dpp
748
zout(1,j,nout1) = ap + bp
749
zout(2,j,nout1) = cp + dpp
750
zout(1,j,nout5) = ap - bp
751
zout(2,j,nout5) = cp - dpp
752
zout(1,j,nout3) = am - dm
753
zout(2,j,nout3) = cm + bm
754
zout(1,j,nout7) = am + dm
755
zout(2,j,nout7) = cm - bm
775
dpp= ( dpp - cm)*rt2i
776
zout(1,j,nout2) = ap + r
777
zout(2,j,nout2) = bm + s
778
zout(1,j,nout6) = ap - r
779
zout(2,j,nout6) = bm - s
780
zout(1,j,nout4) = am + cp
781
zout(2,j,nout4) = bp + dpp
782
zout(1,j,nout8) = am - cp
783
zout(2,j,nout8) = bp - dpp
876
zout(1,j,nout1) = ap + bp
877
zout(2,j,nout1) = cp + dpp
878
zout(1,j,nout5) = ap - bp
879
zout(2,j,nout5) = cp - dpp
880
zout(1,j,nout3) = am - dm
881
zout(2,j,nout3) = cm + bm
882
zout(1,j,nout7) = am + dm
883
zout(2,j,nout7) = cm - bm
903
dpp= ( dpp - cm)*rt2i
904
zout(1,j,nout2) = ap + r
905
zout(2,j,nout2) = bm + s
906
zout(1,j,nout6) = ap - r
907
zout(2,j,nout6) = bm - s
908
zout(1,j,nout4) = am + cp
909
zout(2,j,nout4) = bp + dpp
910
zout(1,j,nout8) = am - cp
911
zout(2,j,nout8) = bp - dpp
916
else if (now.eq.3) then
918
bb=isign*0.8660254037844387d0
938
zout(1,j,nout1) = r + r1
939
zout(2,j,nout1) = s + s1
944
zout(1,j,nout2) = r1 - s2
945
zout(2,j,nout2) = s1 + r2
946
zout(1,j,nout3) = r1 + s2
947
zout(2,j,nout3) = s1 - r2
951
if (4*ias.eq.3*after) then
971
zout(1,j,nout1) = r1 - r
972
zout(2,j,nout1) = s + s1
977
zout(1,j,nout2) = r1 - s2
978
zout(2,j,nout2) = s1 - r2
979
zout(1,j,nout3) = r1 + s2
980
zout(2,j,nout3) = s1 + r2
1001
zout(1,j,nout1) = r + r1
1002
zout(2,j,nout1) = s1 - s
1007
zout(1,j,nout2) = r1 + s2
1008
zout(2,j,nout2) = s1 + r2
1009
zout(1,j,nout3) = r1 - s2
1010
zout(2,j,nout3) = s1 - r2
1013
else if (8*ias.eq.3*after) then
1014
if (isign.eq.1) then
1035
zout(1,j,nout1) = r + r1
1036
zout(2,j,nout1) = s + s1
1041
zout(1,j,nout2) = r1 - s2
1042
zout(2,j,nout2) = s1 + r2
1043
zout(1,j,nout3) = r1 + s2
1044
zout(2,j,nout3) = s1 - r2
1067
zout(1,j,nout1) = r + r1
1068
zout(2,j,nout1) = s + s1
1073
zout(1,j,nout2) = r1 - s2
1074
zout(2,j,nout2) = s1 + r2
1075
zout(1,j,nout3) = r1 + s2
1076
zout(2,j,nout3) = s1 - r2
1109
zout(1,j,nout1) = r + r1
1110
zout(2,j,nout1) = s + s1
1115
zout(1,j,nout2) = r1 - s2
1116
zout(2,j,nout2) = s1 + r2
1117
zout(1,j,nout3) = r1 + s2
1118
zout(2,j,nout3) = s1 - r2
1122
else if (now.eq.5) then
1124
cos2=0.3090169943749474d0
1126
cos4=-0.8090169943749474d0
1128
sin2=isign*0.9510565162951536d0
1130
sin4=isign*0.5877852522924731d0
1160
zout(1,j,nout1) = r1 + r25 + r34
1161
r = r1 + cos2*r25 + cos4*r34
1162
s = sin2*s25 + sin4*s34
1163
zout(1,j,nout2) = r - s
1164
zout(1,j,nout5) = r + s
1165
r = r1 + cos4*r25 + cos2*r34
1166
s = sin4*s25 - sin2*s34
1167
zout(1,j,nout3) = r - s
1168
zout(1,j,nout4) = r + s
1173
zout(2,j,nout1) = s1 + s25 + s34
1174
r = s1 + cos2*s25 + cos4*s34
1175
s = sin2*r25 + sin4*r34
1176
zout(2,j,nout2) = r + s
1177
zout(2,j,nout5) = r - s
1178
r = s1 + cos4*s25 + cos2*s34
1179
s = sin4*r25 - sin2*r34
1180
zout(2,j,nout3) = r + s
1181
zout(2,j,nout4) = r - s
1185
if (8*ias.eq.5*after) then
1186
if (isign.eq.1) then
1219
zout(1,j,nout1) = r1 + r25 - r34
1220
r = r1 + cos2*r25 - cos4*r34
1221
s = sin2*s25 + sin4*s34
1222
zout(1,j,nout2) = r - s
1223
zout(1,j,nout5) = r + s
1224
r = r1 + cos4*r25 - cos2*r34
1225
s = sin4*s25 - sin2*s34
1226
zout(1,j,nout3) = r - s
1227
zout(1,j,nout4) = r + s
1232
zout(2,j,nout1) = s1 + s25 + s34
1233
r = s1 + cos2*s25 + cos4*s34
1234
s = sin2*r25 + sin4*r34
1235
zout(2,j,nout2) = r + s
1236
zout(2,j,nout5) = r - s
1237
r = s1 + cos4*s25 + cos2*s34
1238
s = sin4*r25 - sin2*r34
1239
zout(2,j,nout3) = r + s
1240
zout(2,j,nout4) = r - s
1275
zout(1,j,nout1) = r1 + r25 + r34
1276
r = r1 + cos2*r25 + cos4*r34
1277
s = sin2*s25 + sin4*s34
1278
zout(1,j,nout2) = r - s
1279
zout(1,j,nout5) = r + s
1280
r = r1 + cos4*r25 + cos2*r34
1281
s = sin4*s25 - sin2*s34
1282
zout(1,j,nout3) = r - s
1283
zout(1,j,nout4) = r + s
1288
zout(2,j,nout1) = s1 + s25 - s34
1289
r = s1 + cos2*s25 - cos4*s34
1290
s = sin2*r25 + sin4*r34
1291
zout(2,j,nout2) = r + s
1292
zout(2,j,nout5) = r - s
1293
r = s1 + cos4*s25 - cos2*s34
1294
s = sin4*r25 - sin2*r34
1295
zout(2,j,nout3) = r + s
1296
zout(2,j,nout4) = r - s
1350
zout(1,j,nout1) = r1 + r25 + r34
1351
r = r1 + cos2*r25 + cos4*r34
1352
s = sin2*s25 + sin4*s34
1353
zout(1,j,nout2) = r - s
1354
zout(1,j,nout5) = r + s
1355
r = r1 + cos4*r25 + cos2*r34
1356
s = sin4*s25 - sin2*s34
1357
zout(1,j,nout3) = r - s
1358
zout(1,j,nout4) = r + s
1363
zout(2,j,nout1) = s1 + s25 + s34
1364
r = s1 + cos2*s25 + cos4*s34
1365
s = sin2*r25 + sin4*r34
1366
zout(2,j,nout2) = r + s
1367
zout(2,j,nout5) = r - s
1368
r = s1 + cos4*s25 + cos2*s34
1369
s = sin4*r25 - sin2*r34
1370
zout(2,j,nout3) = r + s
1371
zout(2,j,nout4) = r - s
1375
else if (now.eq.6) then
1377
bb=isign*0.8660254037844387d0
1434
zout(1,j,nout1)=ur1+vr1
1435
zout(2,j,nout1)=ui1+vi1
1436
zout(1,j,nout5)=ur2+vr2
1437
zout(2,j,nout5)=ui2+vi2
1438
zout(1,j,nout3)=ur3+vr3
1439
zout(2,j,nout3)=ui3+vi3
1440
zout(1,j,nout4)=ur1-vr1
1441
zout(2,j,nout4)=ui1-vi1
1442
zout(1,j,nout2)=ur2-vr2
1443
zout(2,j,nout2)=ui2-vi2
1444
zout(1,j,nout6)=ur3-vr3
1445
zout(2,j,nout6)=ui3-vi3
1453
end subroutine fftstp