(git:374b731)
Loading...
Searching...
No Matches
mltfftsg_tools.F
Go to the documentation of this file.
1!--------------------------------------------------------------------------------------------------!
2! CP2K: A general program to perform molecular dynamics simulations !
3! Copyright 2000-2024 CP2K developers group <https://cp2k.org> !
4! !
5! SPDX-License-Identifier: GPL-2.0-or-later !
6!--------------------------------------------------------------------------------------------------!
7
8! **************************************************************************************************
10 USE iso_c_binding, ONLY: c_f_pointer,&
11 c_loc
12 USE fft_kinds, ONLY: dp
13
14!$ USE OMP_LIB, ONLY: omp_get_num_threads, omp_get_thread_num
15
16#include "../../base/base_uses.f90"
17
18 PRIVATE
19 INTEGER, PARAMETER :: ctrig_length = 1024
20 INTEGER, PARAMETER :: cache_size = 2048
21 PUBLIC :: mltfftsg
22
23CONTAINS
24
25! **************************************************************************************************
26!> \brief ...
27!> \param transa ...
28!> \param transb ...
29!> \param a ...
30!> \param ldax ...
31!> \param lday ...
32!> \param b ...
33!> \param ldbx ...
34!> \param ldby ...
35!> \param n ...
36!> \param m ...
37!> \param isign ...
38!> \param scale ...
39! **************************************************************************************************
40 SUBROUTINE mltfftsg(transa, transb, a, ldax, lday, b, ldbx, ldby, n, m, isign, scale)
41
42 CHARACTER(LEN=1), INTENT(IN) :: transa, transb
43 INTEGER, INTENT(IN) :: ldax, lday
44 COMPLEX(dp), INTENT(INOUT) :: a(ldax, lday)
45 INTEGER, INTENT(IN) :: ldbx, ldby
46 COMPLEX(dp), INTENT(INOUT) :: b(ldbx, ldby)
47 INTEGER, INTENT(IN) :: n, m, isign
48 REAL(dp), INTENT(IN) :: scale
49
50 COMPLEX(dp), ALLOCATABLE, DIMENSION(:, :, :) :: z
51 INTEGER :: after(20), before(20), chunk, i, ic, id, &
52 iend, inzee, isig, istart, iterations, &
53 itr, length, lot, nfft, now(20), &
54 num_threads
55 LOGICAL :: tscal
56 REAL(dp) :: trig(2, 1024)
57
58! Variables
59
60 length = 2*(cache_size/4 + 1)
61
62 isig = -isign
63 tscal = (abs(scale - 1._dp) > 1.e-12_dp)
64 CALL ctrig(n, trig, after, before, now, isig, ic)
65 lot = cache_size/(4*n)
66 lot = lot - mod(lot + 1, 2)
67 lot = max(1, lot)
68
69 ! initializations for serial mode
70 id = 0; num_threads = 1
71
72!$OMP PARALLEL &
73!$OMP PRIVATE ( id, istart, iend, nfft, i, inzee, itr) DEFAULT(NONE) &
74!$OMP SHARED (NUM_THREADS,z,iterations,chunk,LOT,length,m,transa,isig, &
75!$OMP before,after,now,trig,A,n,ldax,tscal,scale,ic,transb,ldbx,b)
76
77!$OMP SINGLE
78!$ num_threads = omp_get_num_threads()
79 ALLOCATE (z(length, 2, 0:num_threads - 1))
80 iterations = (m + lot - 1)/lot
81 chunk = lot*((iterations + num_threads - 1)/num_threads)
82!$OMP END SINGLE
83!$OMP BARRIER
84
85!$ id = omp_get_thread_num()
86 istart = id*chunk + 1
87 iend = min((id + 1)*chunk, m)
88
89 DO itr = istart, iend, lot
90
91 nfft = min(m - itr + 1, lot)
92 IF (transa == 'N' .OR. transa == 'n') THEN
93 CALL fftpre_cmplx(nfft, nfft, ldax, lot, n, a(1, itr), z(1, 1, id), &
94 trig, now(1), after(1), before(1), isig)
95 ELSE
96 CALL fftstp_cmplx(ldax, nfft, n, lot, n, a(itr, 1), z(1, 1, id), &
97 trig, now(1), after(1), before(1), isig)
98 END IF
99 IF (tscal) THEN
100 IF (lot == nfft) THEN
101 CALL scaled(2*lot*n, scale, z(1, 1, id))
102 ELSE
103 DO i = 1, n
104 CALL scaled(2*nfft, scale, z(lot*(i - 1) + 1, 1, id))
105 END DO
106 END IF
107 END IF
108 IF (ic .EQ. 1) THEN
109 IF (transb == 'N' .OR. transb == 'n') THEN
110 CALL zgetmo(z(1, 1, id), lot, nfft, n, b(1, itr), ldbx)
111 ELSE
112 CALL matmov(nfft, n, z(1, 1, id), lot, b(itr, 1), ldbx)
113 END IF
114 ELSE
115 inzee = 1
116 DO i = 2, ic - 1
117 CALL fftstp_cmplx(lot, nfft, n, lot, n, z(1, inzee, id), &
118 z(1, 3 - inzee, id), trig, now(i), after(i), &
119 before(i), isig)
120 inzee = 3 - inzee
121 END DO
122 IF (transb == 'N' .OR. transb == 'n') THEN
123 CALL fftrot_cmplx(lot, nfft, n, nfft, ldbx, z(1, inzee, id), &
124 b(1, itr), trig, now(ic), after(ic), before(ic), isig)
125 ELSE
126 CALL fftstp_cmplx(lot, nfft, n, ldbx, n, z(1, inzee, id), &
127 b(itr, 1), trig, now(ic), after(ic), before(ic), isig)
128 END IF
129 END IF
130 END DO
131
132!$OMP END PARALLEL
133
134 DEALLOCATE (z)
135
136 IF (transb == 'N' .OR. transb == 'n') THEN
137 b(1:ldbx, m + 1:ldby) = cmplx(0._dp, 0._dp, dp)
138 b(n + 1:ldbx, 1:m) = cmplx(0._dp, 0._dp, dp)
139 ELSE
140 b(1:ldbx, n + 1:ldby) = cmplx(0._dp, 0._dp, dp)
141 b(m + 1:ldbx, 1:n) = cmplx(0._dp, 0._dp, dp)
142 END IF
143
144 END SUBROUTINE mltfftsg
145
146! this formalizes what we have been assuming before, call with a complex(*) array, and passing to a real(2,*)
147! **************************************************************************************************
148!> \brief ...
149!> \param mm ...
150!> \param nfft ...
151!> \param m ...
152!> \param nn ...
153!> \param n ...
154!> \param zin ...
155!> \param zout ...
156!> \param trig ...
157!> \param now ...
158!> \param after ...
159!> \param before ...
160!> \param isign ...
161! **************************************************************************************************
162 SUBROUTINE fftstp_cmplx(mm, nfft, m, nn, n, zin, zout, trig, now, after, before, isign)
163
164 INTEGER, INTENT(IN) :: mm, nfft, m, nn, n
165 COMPLEX(dp), DIMENSION(mm, m), INTENT(IN), TARGET :: zin
166 COMPLEX(dp), DIMENSION(nn, n), INTENT(INOUT), &
167 TARGET :: zout
168 REAL(dp), DIMENSION(2, ctrig_length), INTENT(IN) :: trig
169 INTEGER, INTENT(IN) :: now, after, before, isign
170
171 REAL(dp), DIMENSION(:, :, :), POINTER :: zin_real, zout_real
172
173 CALL c_f_pointer(c_loc(zin), zin_real, (/2, mm, m/))
174 CALL c_f_pointer(c_loc(zout), zout_real, (/2, nn, n/))
175 CALL fftstp(mm, nfft, m, nn, n, zin_real, zout_real, trig, now, after, before, isign)
176
177 END SUBROUTINE
178
179! **************************************************************************************************
180!> \brief ...
181!> \param mm ...
182!> \param nfft ...
183!> \param m ...
184!> \param nn ...
185!> \param n ...
186!> \param zin ...
187!> \param zout ...
188!> \param trig ...
189!> \param now ...
190!> \param after ...
191!> \param before ...
192!> \param isign ...
193! **************************************************************************************************
194 SUBROUTINE fftpre_cmplx(mm, nfft, m, nn, n, zin, zout, trig, now, after, before, isign)
195
196 INTEGER, INTENT(IN) :: mm, nfft, m, nn, n
197 COMPLEX(dp), DIMENSION(m, mm), INTENT(IN), TARGET :: zin
198 COMPLEX(dp), DIMENSION(nn, n), INTENT(INOUT), &
199 TARGET :: zout
200 REAL(dp), DIMENSION(2, ctrig_length), INTENT(IN) :: trig
201 INTEGER, INTENT(IN) :: now, after, before, isign
202
203 REAL(dp), DIMENSION(:, :, :), POINTER :: zin_real, zout_real
204
205 CALL c_f_pointer(c_loc(zin), zin_real, (/2, mm, m/))
206 CALL c_f_pointer(c_loc(zout), zout_real, (/2, nn, n/))
207
208 CALL fftpre(mm, nfft, m, nn, n, zin_real, zout_real, trig, now, after, before, isign)
209
210 END SUBROUTINE
211
212! **************************************************************************************************
213!> \brief ...
214!> \param mm ...
215!> \param nfft ...
216!> \param m ...
217!> \param nn ...
218!> \param n ...
219!> \param zin ...
220!> \param zout ...
221!> \param trig ...
222!> \param now ...
223!> \param after ...
224!> \param before ...
225!> \param isign ...
226! **************************************************************************************************
227 SUBROUTINE fftrot_cmplx(mm, nfft, m, nn, n, zin, zout, trig, now, after, before, isign)
228
229 USE fft_kinds, ONLY: dp
230 INTEGER, INTENT(IN) :: mm, nfft, m, nn, n
231 COMPLEX(dp), DIMENSION(mm, m), INTENT(IN), TARGET :: zin
232 COMPLEX(dp), DIMENSION(n, nn), INTENT(INOUT), &
233 TARGET :: zout
234 REAL(dp), DIMENSION(2, ctrig_length), INTENT(IN) :: trig
235 INTEGER, INTENT(IN) :: now, after, before, isign
236
237 REAL(dp), DIMENSION(:, :, :), POINTER :: zin_real, zout_real
238
239 CALL c_f_pointer(c_loc(zin), zin_real, (/2, mm, m/))
240 CALL c_f_pointer(c_loc(zout), zout_real, (/2, nn, n/))
241
242 CALL fftrot(mm, nfft, m, nn, n, zin_real, zout_real, trig, now, after, before, isign)
243
244 END SUBROUTINE
245
246!-----------------------------------------------------------------------------!
247! Copyright (C) Stefan Goedecker, Lausanne, Switzerland, August 1, 1991
248! Copyright (C) Stefan Goedecker, Cornell University, Ithaca, USA, 1994
249! Copyright (C) Stefan Goedecker, MPI Stuttgart, Germany, 1999
250! This file is distributed under the terms of the
251! GNU General Public License version 2 (or later),
252! see http://www.gnu.org/copyleft/gpl.txt .
253!-----------------------------------------------------------------------------!
254! S. Goedecker: Rotating a three-dimensional array in optimal
255! positions for vector processing: Case study for a three-dimensional Fast
256! Fourier Transform, Comp. Phys. Commun. 76, 294 (1993)
257! **************************************************************************************************
258!> \brief ...
259!> \param mm ...
260!> \param nfft ...
261!> \param m ...
262!> \param nn ...
263!> \param n ...
264!> \param zin ...
265!> \param zout ...
266!> \param trig ...
267!> \param now ...
268!> \param after ...
269!> \param before ...
270!> \param isign ...
271! **************************************************************************************************
272 SUBROUTINE fftrot(mm, nfft, m, nn, n, zin, zout, trig, now, after, before, isign)
273
274 USE fft_kinds, ONLY: dp
275 INTEGER, INTENT(IN) :: mm, nfft, m, nn, n
276 REAL(dp), DIMENSION(2, mm, m), INTENT(IN) :: zin
277 REAL(dp), DIMENSION(2, n, nn), INTENT(INOUT) :: zout
278 REAL(dp), DIMENSION(2, ctrig_length), INTENT(IN) :: trig
279 INTEGER, INTENT(IN) :: now, after, before, isign
280
281 REAL(dp), PARAMETER :: bb = 0.8660254037844387_dp, cos2 = 0.3090169943749474_dp, &
282 cos4 = -0.8090169943749474_dp, rt2i = 0.7071067811865475_dp, &
283 sin2p = 0.9510565162951536_dp, sin4p = 0.5877852522924731_dp
284
285 INTEGER :: atb, atn, ia, ias, ib, itrig, itt, j, &
286 nin1, nin2, nin3, nin4, nin5, nin6, &
287 nin7, nin8, nout1, nout2, nout3, &
288 nout4, nout5, nout6, nout7, nout8
289 REAL(dp) :: am, ap, bbs, bm, bp, ci2, ci3, ci4, ci5, cm, cp, cr2, cr3, cr4, cr5, dbl, dm, r, &
290 r1, r2, r25, r3, r34, r4, r5, r6, r7, r8, s, s1, s2, s25, s3, s34, s4, s5, s6, s7, s8, &
291 sin2, sin4, ui1, ui2, ui3, ur1, ur2, ur3, vi1, vi2, vi3, vr1, vr2, vr3
292
293! sqrt(0.5)
294! sqrt(3)/2
295! cos(2*pi/5)
296! cos(4*pi/5)
297! sin(2*pi/5)
298! sin(4*pi/5)
299!-----------------------------------------------------------------------------!
300
301 atn = after*now
302 atb = after*before
303
304 IF (now == 4) THEN
305 IF (isign == 1) THEN
306 ia = 1
307 nin1 = ia - after
308 nout1 = ia - atn
309 DO ib = 1, before
310 nin1 = nin1 + after
311 nin2 = nin1 + atb
312 nin3 = nin2 + atb
313 nin4 = nin3 + atb
314 nout1 = nout1 + atn
315 nout2 = nout1 + after
316 nout3 = nout2 + after
317 nout4 = nout3 + after
318 DO j = 1, nfft
319 r1 = zin(1, j, nin1)
320 s1 = zin(2, j, nin1)
321 r2 = zin(1, j, nin2)
322 s2 = zin(2, j, nin2)
323 r3 = zin(1, j, nin3)
324 s3 = zin(2, j, nin3)
325 r4 = zin(1, j, nin4)
326 s4 = zin(2, j, nin4)
327 r = r1 + r3
328 s = r2 + r4
329 zout(1, nout1, j) = r + s
330 zout(1, nout3, j) = r - s
331 r = r1 - r3
332 s = s2 - s4
333 zout(1, nout2, j) = r - s
334 zout(1, nout4, j) = r + s
335 r = s1 + s3
336 s = s2 + s4
337 zout(2, nout1, j) = r + s
338 zout(2, nout3, j) = r - s
339 r = s1 - s3
340 s = r2 - r4
341 zout(2, nout2, j) = r + s
342 zout(2, nout4, j) = r - s
343 END DO
344 END DO
345 DO ia = 2, after
346 ias = ia - 1
347 IF (2*ias == after) THEN
348 nin1 = ia - after
349 nout1 = ia - atn
350 DO ib = 1, before
351 nin1 = nin1 + after
352 nin2 = nin1 + atb
353 nin3 = nin2 + atb
354 nin4 = nin3 + atb
355 nout1 = nout1 + atn
356 nout2 = nout1 + after
357 nout3 = nout2 + after
358 nout4 = nout3 + after
359 DO j = 1, nfft
360 r1 = zin(1, j, nin1)
361 s1 = zin(2, j, nin1)
362 r = zin(1, j, nin2)
363 s = zin(2, j, nin2)
364 r2 = (r - s)*rt2i
365 s2 = (r + s)*rt2i
366 r3 = -zin(2, j, nin3)
367 s3 = zin(1, j, nin3)
368 r = zin(1, j, nin4)
369 s = zin(2, j, nin4)
370 r4 = -(r + s)*rt2i
371 s4 = (r - s)*rt2i
372 r = r1 + r3
373 s = r2 + r4
374 zout(1, nout1, j) = r + s
375 zout(1, nout3, j) = r - s
376 r = r1 - r3
377 s = s2 - s4
378 zout(1, nout2, j) = r - s
379 zout(1, nout4, j) = r + s
380 r = s1 + s3
381 s = s2 + s4
382 zout(2, nout1, j) = r + s
383 zout(2, nout3, j) = r - s
384 r = s1 - s3
385 s = r2 - r4
386 zout(2, nout2, j) = r + s
387 zout(2, nout4, j) = r - s
388 END DO
389 END DO
390 ELSE
391 itt = ias*before
392 itrig = itt + 1
393 cr2 = trig(1, itrig)
394 ci2 = trig(2, itrig)
395 itrig = itrig + itt
396 cr3 = trig(1, itrig)
397 ci3 = trig(2, itrig)
398 itrig = itrig + itt
399 cr4 = trig(1, itrig)
400 ci4 = trig(2, itrig)
401 nin1 = ia - after
402 nout1 = ia - atn
403 DO ib = 1, before
404 nin1 = nin1 + after
405 nin2 = nin1 + atb
406 nin3 = nin2 + atb
407 nin4 = nin3 + atb
408 nout1 = nout1 + atn
409 nout2 = nout1 + after
410 nout3 = nout2 + after
411 nout4 = nout3 + after
412 DO j = 1, nfft
413 r1 = zin(1, j, nin1)
414 s1 = zin(2, j, nin1)
415 r = zin(1, j, nin2)
416 s = zin(2, j, nin2)
417 r2 = r*cr2 - s*ci2
418 s2 = r*ci2 + s*cr2
419 r = zin(1, j, nin3)
420 s = zin(2, j, nin3)
421 r3 = r*cr3 - s*ci3
422 s3 = r*ci3 + s*cr3
423 r = zin(1, j, nin4)
424 s = zin(2, j, nin4)
425 r4 = r*cr4 - s*ci4
426 s4 = r*ci4 + s*cr4
427 r = r1 + r3
428 s = r2 + r4
429 zout(1, nout1, j) = r + s
430 zout(1, nout3, j) = r - s
431 r = r1 - r3
432 s = s2 - s4
433 zout(1, nout2, j) = r - s
434 zout(1, nout4, j) = r + s
435 r = s1 + s3
436 s = s2 + s4
437 zout(2, nout1, j) = r + s
438 zout(2, nout3, j) = r - s
439 r = s1 - s3
440 s = r2 - r4
441 zout(2, nout2, j) = r + s
442 zout(2, nout4, j) = r - s
443 END DO
444 END DO
445 END IF
446 END DO
447 ELSE
448 ia = 1
449 nin1 = ia - after
450 nout1 = ia - atn
451 DO ib = 1, before
452 nin1 = nin1 + after
453 nin2 = nin1 + atb
454 nin3 = nin2 + atb
455 nin4 = nin3 + atb
456 nout1 = nout1 + atn
457 nout2 = nout1 + after
458 nout3 = nout2 + after
459 nout4 = nout3 + after
460 DO j = 1, nfft
461 r1 = zin(1, j, nin1)
462 s1 = zin(2, j, nin1)
463 r2 = zin(1, j, nin2)
464 s2 = zin(2, j, nin2)
465 r3 = zin(1, j, nin3)
466 s3 = zin(2, j, nin3)
467 r4 = zin(1, j, nin4)
468 s4 = zin(2, j, nin4)
469 r = r1 + r3
470 s = r2 + r4
471 zout(1, nout1, j) = r + s
472 zout(1, nout3, j) = r - s
473 r = r1 - r3
474 s = s2 - s4
475 zout(1, nout2, j) = r + s
476 zout(1, nout4, j) = r - s
477 r = s1 + s3
478 s = s2 + s4
479 zout(2, nout1, j) = r + s
480 zout(2, nout3, j) = r - s
481 r = s1 - s3
482 s = r2 - r4
483 zout(2, nout2, j) = r - s
484 zout(2, nout4, j) = r + s
485 END DO
486 END DO
487 DO ia = 2, after
488 ias = ia - 1
489 IF (2*ias == after) THEN
490 nin1 = ia - after
491 nout1 = ia - atn
492 DO ib = 1, before
493 nin1 = nin1 + after
494 nin2 = nin1 + atb
495 nin3 = nin2 + atb
496 nin4 = nin3 + atb
497 nout1 = nout1 + atn
498 nout2 = nout1 + after
499 nout3 = nout2 + after
500 nout4 = nout3 + after
501 DO j = 1, nfft
502 r1 = zin(1, j, nin1)
503 s1 = zin(2, j, nin1)
504 r = zin(1, j, nin2)
505 s = zin(2, j, nin2)
506 r2 = (r + s)*rt2i
507 s2 = (s - r)*rt2i
508 r3 = zin(2, j, nin3)
509 s3 = -zin(1, j, nin3)
510 r = zin(1, j, nin4)
511 s = zin(2, j, nin4)
512 r4 = (s - r)*rt2i
513 s4 = -(r + s)*rt2i
514 r = r1 + r3
515 s = r2 + r4
516 zout(1, nout1, j) = r + s
517 zout(1, nout3, j) = r - s
518 r = r1 - r3
519 s = s2 - s4
520 zout(1, nout2, j) = r + s
521 zout(1, nout4, j) = r - s
522 r = s1 + s3
523 s = s2 + s4
524 zout(2, nout1, j) = r + s
525 zout(2, nout3, j) = r - s
526 r = s1 - s3
527 s = r2 - r4
528 zout(2, nout2, j) = r - s
529 zout(2, nout4, j) = r + s
530 END DO
531 END DO
532 ELSE
533 itt = ias*before
534 itrig = itt + 1
535 cr2 = trig(1, itrig)
536 ci2 = trig(2, itrig)
537 itrig = itrig + itt
538 cr3 = trig(1, itrig)
539 ci3 = trig(2, itrig)
540 itrig = itrig + itt
541 cr4 = trig(1, itrig)
542 ci4 = trig(2, itrig)
543 nin1 = ia - after
544 nout1 = ia - atn
545 DO ib = 1, before
546 nin1 = nin1 + after
547 nin2 = nin1 + atb
548 nin3 = nin2 + atb
549 nin4 = nin3 + atb
550 nout1 = nout1 + atn
551 nout2 = nout1 + after
552 nout3 = nout2 + after
553 nout4 = nout3 + after
554 DO j = 1, nfft
555 r1 = zin(1, j, nin1)
556 s1 = zin(2, j, nin1)
557 r = zin(1, j, nin2)
558 s = zin(2, j, nin2)
559 r2 = r*cr2 - s*ci2
560 s2 = r*ci2 + s*cr2
561 r = zin(1, j, nin3)
562 s = zin(2, j, nin3)
563 r3 = r*cr3 - s*ci3
564 s3 = r*ci3 + s*cr3
565 r = zin(1, j, nin4)
566 s = zin(2, j, nin4)
567 r4 = r*cr4 - s*ci4
568 s4 = r*ci4 + s*cr4
569 r = r1 + r3
570 s = r2 + r4
571 zout(1, nout1, j) = r + s
572 zout(1, nout3, j) = r - s
573 r = r1 - r3
574 s = s2 - s4
575 zout(1, nout2, j) = r + s
576 zout(1, nout4, j) = r - s
577 r = s1 + s3
578 s = s2 + s4
579 zout(2, nout1, j) = r + s
580 zout(2, nout3, j) = r - s
581 r = s1 - s3
582 s = r2 - r4
583 zout(2, nout2, j) = r - s
584 zout(2, nout4, j) = r + s
585 END DO
586 END DO
587 END IF
588 END DO
589 END IF
590 ELSE IF (now == 8) THEN
591 IF (isign == -1) THEN
592 ia = 1
593 nin1 = ia - after
594 nout1 = ia - atn
595 DO ib = 1, before
596 nin1 = nin1 + after
597 nin2 = nin1 + atb
598 nin3 = nin2 + atb
599 nin4 = nin3 + atb
600 nin5 = nin4 + atb
601 nin6 = nin5 + atb
602 nin7 = nin6 + atb
603 nin8 = nin7 + atb
604 nout1 = nout1 + atn
605 nout2 = nout1 + after
606 nout3 = nout2 + after
607 nout4 = nout3 + after
608 nout5 = nout4 + after
609 nout6 = nout5 + after
610 nout7 = nout6 + after
611 nout8 = nout7 + after
612 DO j = 1, nfft
613 r1 = zin(1, j, nin1)
614 s1 = zin(2, j, nin1)
615 r2 = zin(1, j, nin2)
616 s2 = zin(2, j, nin2)
617 r3 = zin(1, j, nin3)
618 s3 = zin(2, j, nin3)
619 r4 = zin(1, j, nin4)
620 s4 = zin(2, j, nin4)
621 r5 = zin(1, j, nin5)
622 s5 = zin(2, j, nin5)
623 r6 = zin(1, j, nin6)
624 s6 = zin(2, j, nin6)
625 r7 = zin(1, j, nin7)
626 s7 = zin(2, j, nin7)
627 r8 = zin(1, j, nin8)
628 s8 = zin(2, j, nin8)
629 r = r1 + r5
630 s = r3 + r7
631 ap = r + s
632 am = r - s
633 r = r2 + r6
634 s = r4 + r8
635 bp = r + s
636 bm = r - s
637 r = s1 + s5
638 s = s3 + s7
639 cp = r + s
640 cm = r - s
641 r = s2 + s6
642 s = s4 + s8
643 dbl = r + s
644 dm = r - s
645 zout(1, nout1, j) = ap + bp
646 zout(2, nout1, j) = cp + dbl
647 zout(1, nout5, j) = ap - bp
648 zout(2, nout5, j) = cp - dbl
649 zout(1, nout3, j) = am + dm
650 zout(2, nout3, j) = cm - bm
651 zout(1, nout7, j) = am - dm
652 zout(2, nout7, j) = cm + bm
653 r = r1 - r5
654 s = s3 - s7
655 ap = r + s
656 am = r - s
657 r = s1 - s5
658 s = r3 - r7
659 bp = r + s
660 bm = r - s
661 r = s4 - s8
662 s = r2 - r6
663 cp = r + s
664 cm = r - s
665 r = s2 - s6
666 s = r4 - r8
667 dbl = r + s
668 dm = r - s
669 r = (cp + dm)*rt2i
670 s = (-cp + dm)*rt2i
671 cp = (cm + dbl)*rt2i
672 dbl = (cm - dbl)*rt2i
673 zout(1, nout2, j) = ap + r
674 zout(2, nout2, j) = bm + s
675 zout(1, nout6, j) = ap - r
676 zout(2, nout6, j) = bm - s
677 zout(1, nout4, j) = am + cp
678 zout(2, nout4, j) = bp + dbl
679 zout(1, nout8, j) = am - cp
680 zout(2, nout8, j) = bp - dbl
681 END DO
682 END DO
683 ELSE
684 ia = 1
685 nin1 = ia - after
686 nout1 = ia - atn
687 DO ib = 1, before
688 nin1 = nin1 + after
689 nin2 = nin1 + atb
690 nin3 = nin2 + atb
691 nin4 = nin3 + atb
692 nin5 = nin4 + atb
693 nin6 = nin5 + atb
694 nin7 = nin6 + atb
695 nin8 = nin7 + atb
696 nout1 = nout1 + atn
697 nout2 = nout1 + after
698 nout3 = nout2 + after
699 nout4 = nout3 + after
700 nout5 = nout4 + after
701 nout6 = nout5 + after
702 nout7 = nout6 + after
703 nout8 = nout7 + after
704 DO j = 1, nfft
705 r1 = zin(1, j, nin1)
706 s1 = zin(2, j, nin1)
707 r2 = zin(1, j, nin2)
708 s2 = zin(2, j, nin2)
709 r3 = zin(1, j, nin3)
710 s3 = zin(2, j, nin3)
711 r4 = zin(1, j, nin4)
712 s4 = zin(2, j, nin4)
713 r5 = zin(1, j, nin5)
714 s5 = zin(2, j, nin5)
715 r6 = zin(1, j, nin6)
716 s6 = zin(2, j, nin6)
717 r7 = zin(1, j, nin7)
718 s7 = zin(2, j, nin7)
719 r8 = zin(1, j, nin8)
720 s8 = zin(2, j, nin8)
721 r = r1 + r5
722 s = r3 + r7
723 ap = r + s
724 am = r - s
725 r = r2 + r6
726 s = r4 + r8
727 bp = r + s
728 bm = r - s
729 r = s1 + s5
730 s = s3 + s7
731 cp = r + s
732 cm = r - s
733 r = s2 + s6
734 s = s4 + s8
735 dbl = r + s
736 dm = r - s
737 zout(1, nout1, j) = ap + bp
738 zout(2, nout1, j) = cp + dbl
739 zout(1, nout5, j) = ap - bp
740 zout(2, nout5, j) = cp - dbl
741 zout(1, nout3, j) = am - dm
742 zout(2, nout3, j) = cm + bm
743 zout(1, nout7, j) = am + dm
744 zout(2, nout7, j) = cm - bm
745 r = r1 - r5
746 s = -s3 + s7
747 ap = r + s
748 am = r - s
749 r = s1 - s5
750 s = r7 - r3
751 bp = r + s
752 bm = r - s
753 r = -s4 + s8
754 s = r2 - r6
755 cp = r + s
756 cm = r - s
757 r = -s2 + s6
758 s = r4 - r8
759 dbl = r + s
760 dm = r - s
761 r = (cp + dm)*rt2i
762 s = (cp - dm)*rt2i
763 cp = (cm + dbl)*rt2i
764 dbl = (-cm + dbl)*rt2i
765 zout(1, nout2, j) = ap + r
766 zout(2, nout2, j) = bm + s
767 zout(1, nout6, j) = ap - r
768 zout(2, nout6, j) = bm - s
769 zout(1, nout4, j) = am + cp
770 zout(2, nout4, j) = bp + dbl
771 zout(1, nout8, j) = am - cp
772 zout(2, nout8, j) = bp - dbl
773 END DO
774 END DO
775 END IF
776 ELSE IF (now == 3) THEN
777 bbs = isign*bb
778 ia = 1
779 nin1 = ia - after
780 nout1 = ia - atn
781 DO ib = 1, before
782 nin1 = nin1 + after
783 nin2 = nin1 + atb
784 nin3 = nin2 + atb
785 nout1 = nout1 + atn
786 nout2 = nout1 + after
787 nout3 = nout2 + after
788 DO j = 1, nfft
789 r1 = zin(1, j, nin1)
790 s1 = zin(2, j, nin1)
791 r2 = zin(1, j, nin2)
792 s2 = zin(2, j, nin2)
793 r3 = zin(1, j, nin3)
794 s3 = zin(2, j, nin3)
795 r = r2 + r3
796 s = s2 + s3
797 zout(1, nout1, j) = r + r1
798 zout(2, nout1, j) = s + s1
799 r1 = r1 - 0.5_dp*r
800 s1 = s1 - 0.5_dp*s
801 r2 = bbs*(r2 - r3)
802 s2 = bbs*(s2 - s3)
803 zout(1, nout2, j) = r1 - s2
804 zout(2, nout2, j) = s1 + r2
805 zout(1, nout3, j) = r1 + s2
806 zout(2, nout3, j) = s1 - r2
807 END DO
808 END DO
809 DO ia = 2, after
810 ias = ia - 1
811 IF (4*ias == 3*after) THEN
812 IF (isign == 1) THEN
813 nin1 = ia - after
814 nout1 = ia - atn
815 DO ib = 1, before
816 nin1 = nin1 + after
817 nin2 = nin1 + atb
818 nin3 = nin2 + atb
819 nout1 = nout1 + atn
820 nout2 = nout1 + after
821 nout3 = nout2 + after
822 DO j = 1, nfft
823 r1 = zin(1, j, nin1)
824 s1 = zin(2, j, nin1)
825 r2 = -zin(2, j, nin2)
826 s2 = zin(1, j, nin2)
827 r3 = -zin(1, j, nin3)
828 s3 = -zin(2, j, nin3)
829 r = r2 + r3
830 s = s2 + s3
831 zout(1, nout1, j) = r + r1
832 zout(2, nout1, j) = s + s1
833 r1 = r1 - 0.5_dp*r
834 s1 = s1 - 0.5_dp*s
835 r2 = bbs*(r2 - r3)
836 s2 = bbs*(s2 - s3)
837 zout(1, nout2, j) = r1 - s2
838 zout(2, nout2, j) = s1 + r2
839 zout(1, nout3, j) = r1 + s2
840 zout(2, nout3, j) = s1 - r2
841 END DO
842 END DO
843 ELSE
844 nin1 = ia - after
845 nout1 = ia - atn
846 DO ib = 1, before
847 nin1 = nin1 + after
848 nin2 = nin1 + atb
849 nin3 = nin2 + atb
850 nout1 = nout1 + atn
851 nout2 = nout1 + after
852 nout3 = nout2 + after
853 DO j = 1, nfft
854 r1 = zin(1, j, nin1)
855 s1 = zin(2, j, nin1)
856 r2 = zin(2, j, nin2)
857 s2 = -zin(1, j, nin2)
858 r3 = -zin(1, j, nin3)
859 s3 = -zin(2, j, nin3)
860 r = r2 + r3
861 s = s2 + s3
862 zout(1, nout1, j) = r + r1
863 zout(2, nout1, j) = s + s1
864 r1 = r1 - 0.5_dp*r
865 s1 = s1 - 0.5_dp*s
866 r2 = bbs*(r2 - r3)
867 s2 = bbs*(s2 - s3)
868 zout(1, nout2, j) = r1 - s2
869 zout(2, nout2, j) = s1 + r2
870 zout(1, nout3, j) = r1 + s2
871 zout(2, nout3, j) = s1 - r2
872 END DO
873 END DO
874 END IF
875 ELSE IF (8*ias == 3*after) THEN
876 IF (isign == 1) THEN
877 nin1 = ia - after
878 nout1 = ia - atn
879 DO ib = 1, before
880 nin1 = nin1 + after
881 nin2 = nin1 + atb
882 nin3 = nin2 + atb
883 nout1 = nout1 + atn
884 nout2 = nout1 + after
885 nout3 = nout2 + after
886 DO j = 1, nfft
887 r1 = zin(1, j, nin1)
888 s1 = zin(2, j, nin1)
889 r = zin(1, j, nin2)
890 s = zin(2, j, nin2)
891 r2 = (r - s)*rt2i
892 s2 = (r + s)*rt2i
893 r3 = -zin(2, j, nin3)
894 s3 = zin(1, j, nin3)
895 r = r2 + r3
896 s = s2 + s3
897 zout(1, nout1, j) = r + r1
898 zout(2, nout1, j) = s + s1
899 r1 = r1 - 0.5_dp*r
900 s1 = s1 - 0.5_dp*s
901 r2 = bbs*(r2 - r3)
902 s2 = bbs*(s2 - s3)
903 zout(1, nout2, j) = r1 - s2
904 zout(2, nout2, j) = s1 + r2
905 zout(1, nout3, j) = r1 + s2
906 zout(2, nout3, j) = s1 - r2
907 END DO
908 END DO
909 ELSE
910 nin1 = ia - after
911 nout1 = ia - atn
912 DO ib = 1, before
913 nin1 = nin1 + after
914 nin2 = nin1 + atb
915 nin3 = nin2 + atb
916 nout1 = nout1 + atn
917 nout2 = nout1 + after
918 nout3 = nout2 + after
919 DO j = 1, nfft
920 r1 = zin(1, j, nin1)
921 s1 = zin(2, j, nin1)
922 r = zin(1, j, nin2)
923 s = zin(2, j, nin2)
924 r2 = (r + s)*rt2i
925 s2 = (-r + s)*rt2i
926 r3 = zin(2, j, nin3)
927 s3 = -zin(1, j, nin3)
928 r = r2 + r3
929 s = s2 + s3
930 zout(1, nout1, j) = r + r1
931 zout(2, nout1, j) = s + s1
932 r1 = r1 - 0.5_dp*r
933 s1 = s1 - 0.5_dp*s
934 r2 = bbs*(r2 - r3)
935 s2 = bbs*(s2 - s3)
936 zout(1, nout2, j) = r1 - s2
937 zout(2, nout2, j) = s1 + r2
938 zout(1, nout3, j) = r1 + s2
939 zout(2, nout3, j) = s1 - r2
940 END DO
941 END DO
942 END IF
943 ELSE
944 itt = ias*before
945 itrig = itt + 1
946 cr2 = trig(1, itrig)
947 ci2 = trig(2, itrig)
948 itrig = itrig + itt
949 cr3 = trig(1, itrig)
950 ci3 = trig(2, itrig)
951 nin1 = ia - after
952 nout1 = ia - atn
953 DO ib = 1, before
954 nin1 = nin1 + after
955 nin2 = nin1 + atb
956 nin3 = nin2 + atb
957 nout1 = nout1 + atn
958 nout2 = nout1 + after
959 nout3 = nout2 + after
960 DO j = 1, nfft
961 r1 = zin(1, j, nin1)
962 s1 = zin(2, j, nin1)
963 r = zin(1, j, nin2)
964 s = zin(2, j, nin2)
965 r2 = r*cr2 - s*ci2
966 s2 = r*ci2 + s*cr2
967 r = zin(1, j, nin3)
968 s = zin(2, j, nin3)
969 r3 = r*cr3 - s*ci3
970 s3 = r*ci3 + s*cr3
971 r = r2 + r3
972 s = s2 + s3
973 zout(1, nout1, j) = r + r1
974 zout(2, nout1, j) = s + s1
975 r1 = r1 - 0.5_dp*r
976 s1 = s1 - 0.5_dp*s
977 r2 = bbs*(r2 - r3)
978 s2 = bbs*(s2 - s3)
979 zout(1, nout2, j) = r1 - s2
980 zout(2, nout2, j) = s1 + r2
981 zout(1, nout3, j) = r1 + s2
982 zout(2, nout3, j) = s1 - r2
983 END DO
984 END DO
985 END IF
986 END DO
987 ELSE IF (now == 5) THEN
988 sin2 = isign*sin2p
989 sin4 = isign*sin4p
990 ia = 1
991 nin1 = ia - after
992 nout1 = ia - atn
993 DO ib = 1, before
994 nin1 = nin1 + after
995 nin2 = nin1 + atb
996 nin3 = nin2 + atb
997 nin4 = nin3 + atb
998 nin5 = nin4 + atb
999 nout1 = nout1 + atn
1000 nout2 = nout1 + after
1001 nout3 = nout2 + after
1002 nout4 = nout3 + after
1003 nout5 = nout4 + after
1004 DO j = 1, nfft
1005 r1 = zin(1, j, nin1)
1006 s1 = zin(2, j, nin1)
1007 r2 = zin(1, j, nin2)
1008 s2 = zin(2, j, nin2)
1009 r3 = zin(1, j, nin3)
1010 s3 = zin(2, j, nin3)
1011 r4 = zin(1, j, nin4)
1012 s4 = zin(2, j, nin4)
1013 r5 = zin(1, j, nin5)
1014 s5 = zin(2, j, nin5)
1015 r25 = r2 + r5
1016 r34 = r3 + r4
1017 s25 = s2 - s5
1018 s34 = s3 - s4
1019 zout(1, nout1, j) = r1 + r25 + r34
1020 r = cos2*r25 + cos4*r34 + r1
1021 s = sin2*s25 + sin4*s34
1022 zout(1, nout2, j) = r - s
1023 zout(1, nout5, j) = r + s
1024 r = cos4*r25 + cos2*r34 + r1
1025 s = sin4*s25 - sin2*s34
1026 zout(1, nout3, j) = r - s
1027 zout(1, nout4, j) = r + s
1028 r25 = r2 - r5
1029 r34 = r3 - r4
1030 s25 = s2 + s5
1031 s34 = s3 + s4
1032 zout(2, nout1, j) = s1 + s25 + s34
1033 r = cos2*s25 + cos4*s34 + s1
1034 s = sin2*r25 + sin4*r34
1035 zout(2, nout2, j) = r + s
1036 zout(2, nout5, j) = r - s
1037 r = cos4*s25 + cos2*s34 + s1
1038 s = sin4*r25 - sin2*r34
1039 zout(2, nout3, j) = r + s
1040 zout(2, nout4, j) = r - s
1041 END DO
1042 END DO
1043 DO ia = 2, after
1044 ias = ia - 1
1045 IF (8*ias == 5*after) THEN
1046 IF (isign == 1) THEN
1047 nin1 = ia - after
1048 nout1 = ia - atn
1049 DO ib = 1, before
1050 nin1 = nin1 + after
1051 nin2 = nin1 + atb
1052 nin3 = nin2 + atb
1053 nin4 = nin3 + atb
1054 nin5 = nin4 + atb
1055 nout1 = nout1 + atn
1056 nout2 = nout1 + after
1057 nout3 = nout2 + after
1058 nout4 = nout3 + after
1059 nout5 = nout4 + after
1060 DO j = 1, nfft
1061 r1 = zin(1, j, nin1)
1062 s1 = zin(2, j, nin1)
1063 r = zin(1, j, nin2)
1064 s = zin(2, j, nin2)
1065 r2 = (r - s)*rt2i
1066 s2 = (r + s)*rt2i
1067 r3 = -zin(2, j, nin3)
1068 s3 = zin(1, j, nin3)
1069 r = zin(1, j, nin4)
1070 s = zin(2, j, nin4)
1071 r4 = -(r + s)*rt2i
1072 s4 = (r - s)*rt2i
1073 r5 = -zin(1, j, nin5)
1074 s5 = -zin(2, j, nin5)
1075 r25 = r2 + r5
1076 r34 = r3 + r4
1077 s25 = s2 - s5
1078 s34 = s3 - s4
1079 zout(1, nout1, j) = r1 + r25 + r34
1080 r = cos2*r25 + cos4*r34 + r1
1081 s = sin2*s25 + sin4*s34
1082 zout(1, nout2, j) = r - s
1083 zout(1, nout5, j) = r + s
1084 r = cos4*r25 + cos2*r34 + r1
1085 s = sin4*s25 - sin2*s34
1086 zout(1, nout3, j) = r - s
1087 zout(1, nout4, j) = r + s
1088 r25 = r2 - r5
1089 r34 = r3 - r4
1090 s25 = s2 + s5
1091 s34 = s3 + s4
1092 zout(2, nout1, j) = s1 + s25 + s34
1093 r = cos2*s25 + cos4*s34 + s1
1094 s = sin2*r25 + sin4*r34
1095 zout(2, nout2, j) = r + s
1096 zout(2, nout5, j) = r - s
1097 r = cos4*s25 + cos2*s34 + s1
1098 s = sin4*r25 - sin2*r34
1099 zout(2, nout3, j) = r + s
1100 zout(2, nout4, j) = r - s
1101 END DO
1102 END DO
1103 ELSE
1104 nin1 = ia - after
1105 nout1 = ia - atn
1106 DO ib = 1, before
1107 nin1 = nin1 + after
1108 nin2 = nin1 + atb
1109 nin3 = nin2 + atb
1110 nin4 = nin3 + atb
1111 nin5 = nin4 + atb
1112 nout1 = nout1 + atn
1113 nout2 = nout1 + after
1114 nout3 = nout2 + after
1115 nout4 = nout3 + after
1116 nout5 = nout4 + after
1117 DO j = 1, nfft
1118 r1 = zin(1, j, nin1)
1119 s1 = zin(2, j, nin1)
1120 r = zin(1, j, nin2)
1121 s = zin(2, j, nin2)
1122 r2 = (r + s)*rt2i
1123 s2 = (-r + s)*rt2i
1124 r3 = zin(2, j, nin3)
1125 s3 = -zin(1, j, nin3)
1126 r = zin(1, j, nin4)
1127 s = zin(2, j, nin4)
1128 r4 = (s - r)*rt2i
1129 s4 = -(r + s)*rt2i
1130 r5 = -zin(1, j, nin5)
1131 s5 = -zin(2, j, nin5)
1132 r25 = r2 + r5
1133 r34 = r3 + r4
1134 s25 = s2 - s5
1135 s34 = s3 - s4
1136 zout(1, nout1, j) = r1 + r25 + r34
1137 r = cos2*r25 + cos4*r34 + r1
1138 s = sin2*s25 + sin4*s34
1139 zout(1, nout2, j) = r - s
1140 zout(1, nout5, j) = r + s
1141 r = cos4*r25 + cos2*r34 + r1
1142 s = sin4*s25 - sin2*s34
1143 zout(1, nout3, j) = r - s
1144 zout(1, nout4, j) = r + s
1145 r25 = r2 - r5
1146 r34 = r3 - r4
1147 s25 = s2 + s5
1148 s34 = s3 + s4
1149 zout(2, nout1, j) = s1 + s25 + s34
1150 r = cos2*s25 + cos4*s34 + s1
1151 s = sin2*r25 + sin4*r34
1152 zout(2, nout2, j) = r + s
1153 zout(2, nout5, j) = r - s
1154 r = cos4*s25 + cos2*s34 + s1
1155 s = sin4*r25 - sin2*r34
1156 zout(2, nout3, j) = r + s
1157 zout(2, nout4, j) = r - s
1158 END DO
1159 END DO
1160 END IF
1161 ELSE
1162 ias = ia - 1
1163 itt = ias*before
1164 itrig = itt + 1
1165 cr2 = trig(1, itrig)
1166 ci2 = trig(2, itrig)
1167 itrig = itrig + itt
1168 cr3 = trig(1, itrig)
1169 ci3 = trig(2, itrig)
1170 itrig = itrig + itt
1171 cr4 = trig(1, itrig)
1172 ci4 = trig(2, itrig)
1173 itrig = itrig + itt
1174 cr5 = trig(1, itrig)
1175 ci5 = trig(2, itrig)
1176 nin1 = ia - after
1177 nout1 = ia - atn
1178 DO ib = 1, before
1179 nin1 = nin1 + after
1180 nin2 = nin1 + atb
1181 nin3 = nin2 + atb
1182 nin4 = nin3 + atb
1183 nin5 = nin4 + atb
1184 nout1 = nout1 + atn
1185 nout2 = nout1 + after
1186 nout3 = nout2 + after
1187 nout4 = nout3 + after
1188 nout5 = nout4 + after
1189 DO j = 1, nfft
1190 r1 = zin(1, j, nin1)
1191 s1 = zin(2, j, nin1)
1192 r = zin(1, j, nin2)
1193 s = zin(2, j, nin2)
1194 r2 = r*cr2 - s*ci2
1195 s2 = r*ci2 + s*cr2
1196 r = zin(1, j, nin3)
1197 s = zin(2, j, nin3)
1198 r3 = r*cr3 - s*ci3
1199 s3 = r*ci3 + s*cr3
1200 r = zin(1, j, nin4)
1201 s = zin(2, j, nin4)
1202 r4 = r*cr4 - s*ci4
1203 s4 = r*ci4 + s*cr4
1204 r = zin(1, j, nin5)
1205 s = zin(2, j, nin5)
1206 r5 = r*cr5 - s*ci5
1207 s5 = r*ci5 + s*cr5
1208 r25 = r2 + r5
1209 r34 = r3 + r4
1210 s25 = s2 - s5
1211 s34 = s3 - s4
1212 zout(1, nout1, j) = r1 + r25 + r34
1213 r = cos2*r25 + cos4*r34 + r1
1214 s = sin2*s25 + sin4*s34
1215 zout(1, nout2, j) = r - s
1216 zout(1, nout5, j) = r + s
1217 r = cos4*r25 + cos2*r34 + r1
1218 s = sin4*s25 - sin2*s34
1219 zout(1, nout3, j) = r - s
1220 zout(1, nout4, j) = r + s
1221 r25 = r2 - r5
1222 r34 = r3 - r4
1223 s25 = s2 + s5
1224 s34 = s3 + s4
1225 zout(2, nout1, j) = s1 + s25 + s34
1226 r = cos2*s25 + cos4*s34 + s1
1227 s = sin2*r25 + sin4*r34
1228 zout(2, nout2, j) = r + s
1229 zout(2, nout5, j) = r - s
1230 r = cos4*s25 + cos2*s34 + s1
1231 s = sin4*r25 - sin2*r34
1232 zout(2, nout3, j) = r + s
1233 zout(2, nout4, j) = r - s
1234 END DO
1235 END DO
1236 END IF
1237 END DO
1238 ELSE IF (now == 6) THEN
1239 bbs = isign*bb
1240 ia = 1
1241 nin1 = ia - after
1242 nout1 = ia - atn
1243 DO ib = 1, before
1244 nin1 = nin1 + after
1245 nin2 = nin1 + atb
1246 nin3 = nin2 + atb
1247 nin4 = nin3 + atb
1248 nin5 = nin4 + atb
1249 nin6 = nin5 + atb
1250 nout1 = nout1 + atn
1251 nout2 = nout1 + after
1252 nout3 = nout2 + after
1253 nout4 = nout3 + after
1254 nout5 = nout4 + after
1255 nout6 = nout5 + after
1256 DO j = 1, nfft
1257 r2 = zin(1, j, nin3)
1258 s2 = zin(2, j, nin3)
1259 r3 = zin(1, j, nin5)
1260 s3 = zin(2, j, nin5)
1261 r = r2 + r3
1262 s = s2 + s3
1263 r1 = zin(1, j, nin1)
1264 s1 = zin(2, j, nin1)
1265 ur1 = r + r1
1266 ui1 = s + s1
1267 r1 = r1 - 0.5_dp*r
1268 s1 = s1 - 0.5_dp*s
1269 r = r2 - r3
1270 s = s2 - s3
1271 ur2 = r1 - s*bbs
1272 ui2 = s1 + r*bbs
1273 ur3 = r1 + s*bbs
1274 ui3 = s1 - r*bbs
1275
1276 r2 = zin(1, j, nin6)
1277 s2 = zin(2, j, nin6)
1278 r3 = zin(1, j, nin2)
1279 s3 = zin(2, j, nin2)
1280 r = r2 + r3
1281 s = s2 + s3
1282 r1 = zin(1, j, nin4)
1283 s1 = zin(2, j, nin4)
1284 vr1 = r + r1
1285 vi1 = s + s1
1286 r1 = r1 - 0.5_dp*r
1287 s1 = s1 - 0.5_dp*s
1288 r = r2 - r3
1289 s = s2 - s3
1290 vr2 = r1 - s*bbs
1291 vi2 = s1 + r*bbs
1292 vr3 = r1 + s*bbs
1293 vi3 = s1 - r*bbs
1294
1295 zout(1, nout1, j) = ur1 + vr1
1296 zout(2, nout1, j) = ui1 + vi1
1297 zout(1, nout5, j) = ur2 + vr2
1298 zout(2, nout5, j) = ui2 + vi2
1299 zout(1, nout3, j) = ur3 + vr3
1300 zout(2, nout3, j) = ui3 + vi3
1301 zout(1, nout4, j) = ur1 - vr1
1302 zout(2, nout4, j) = ui1 - vi1
1303 zout(1, nout2, j) = ur2 - vr2
1304 zout(2, nout2, j) = ui2 - vi2
1305 zout(1, nout6, j) = ur3 - vr3
1306 zout(2, nout6, j) = ui3 - vi3
1307 END DO
1308 END DO
1309 ELSE
1310 cpabort('Error fftrot')
1311 END IF
1312
1313!-----------------------------------------------------------------------------!
1314
1315 END SUBROUTINE fftrot
1316
1317!-----------------------------------------------------------------------------!
1318!-----------------------------------------------------------------------------!
1319! Copyright (C) Stefan Goedecker, Lausanne, Switzerland, August 1, 1991
1320! Copyright (C) Stefan Goedecker, Cornell University, Ithaca, USA, 1994
1321! Copyright (C) Stefan Goedecker, MPI Stuttgart, Germany, 1999
1322! This file is distributed under the terms of the
1323! GNU General Public License version 2 (or later),
1324! see http://www.gnu.org/copyleft/gpl.txt .
1325!-----------------------------------------------------------------------------!
1326! S. Goedecker: Rotating a three-dimensional array in optimal
1327! positions for vector processing: Case study for a three-dimensional Fast
1328! Fourier Transform, Comp. Phys. Commun. 76, 294 (1993)
1329! **************************************************************************************************
1330!> \brief ...
1331!> \param mm ...
1332!> \param nfft ...
1333!> \param m ...
1334!> \param nn ...
1335!> \param n ...
1336!> \param zin ...
1337!> \param zout ...
1338!> \param trig ...
1339!> \param now ...
1340!> \param after ...
1341!> \param before ...
1342!> \param isign ...
1343! **************************************************************************************************
1344 SUBROUTINE fftpre(mm, nfft, m, nn, n, zin, zout, trig, now, after, before, isign)
1345
1346 INTEGER, INTENT(IN) :: mm, nfft, m, nn, n
1347 REAL(dp), DIMENSION(2, m, mm), INTENT(IN) :: zin
1348 REAL(dp), DIMENSION(2, nn, n), INTENT(INOUT) :: zout
1349 REAL(dp), DIMENSION(2, ctrig_length), INTENT(IN) :: trig
1350 INTEGER, INTENT(IN) :: now, after, before, isign
1351
1352 REAL(dp), PARAMETER :: bb = 0.8660254037844387_dp, cos2 = 0.3090169943749474_dp, &
1353 cos4 = -0.8090169943749474_dp, rt2i = 0.7071067811865475_dp, &
1354 sin2p = 0.9510565162951536_dp, sin4p = 0.5877852522924731_dp
1355
1356 INTEGER :: atb, atn, ia, ias, ib, itrig, itt, j, &
1357 nin1, nin2, nin3, nin4, nin5, nin6, &
1358 nin7, nin8, nout1, nout2, nout3, &
1359 nout4, nout5, nout6, nout7, nout8
1360 REAL(dp) :: am, ap, bbs, bm, bp, ci2, ci3, ci4, ci5, cm, cp, cr2, cr3, cr4, cr5, dbl, dm, r, &
1361 r1, r2, r25, r3, r34, r4, r5, r6, r7, r8, s, s1, s2, s25, s3, s34, s4, s5, s6, s7, s8, &
1362 sin2, sin4, ui1, ui2, ui3, ur1, ur2, ur3, vi1, vi2, vi3, vr1, vr2, vr3
1363
1364! sqrt(0.5)
1365! sqrt(3)/2
1366! cos(2*pi/5)
1367! cos(4*pi/5)
1368! sin(2*pi/5)
1369! sin(4*pi/5)
1370!-----------------------------------------------------------------------------!
1371
1372 atn = after*now
1373 atb = after*before
1374
1375 IF (now == 4) THEN
1376 IF (isign == 1) THEN
1377 ia = 1
1378 nin1 = ia - after
1379 nout1 = ia - atn
1380 DO ib = 1, before
1381 nin1 = nin1 + after
1382 nin2 = nin1 + atb
1383 nin3 = nin2 + atb
1384 nin4 = nin3 + atb
1385 nout1 = nout1 + atn
1386 nout2 = nout1 + after
1387 nout3 = nout2 + after
1388 nout4 = nout3 + after
1389 DO j = 1, nfft
1390 r1 = zin(1, nin1, j)
1391 s1 = zin(2, nin1, j)
1392 r2 = zin(1, nin2, j)
1393 s2 = zin(2, nin2, j)
1394 r3 = zin(1, nin3, j)
1395 s3 = zin(2, nin3, j)
1396 r4 = zin(1, nin4, j)
1397 s4 = zin(2, nin4, j)
1398 r = r1 + r3
1399 s = r2 + r4
1400 zout(1, j, nout1) = r + s
1401 zout(1, j, nout3) = r - s
1402 r = r1 - r3
1403 s = s2 - s4
1404 zout(1, j, nout2) = r - s
1405 zout(1, j, nout4) = r + s
1406 r = s1 + s3
1407 s = s2 + s4
1408 zout(2, j, nout1) = r + s
1409 zout(2, j, nout3) = r - s
1410 r = s1 - s3
1411 s = r2 - r4
1412 zout(2, j, nout2) = r + s
1413 zout(2, j, nout4) = r - s
1414 END DO
1415 END DO
1416 DO ia = 2, after
1417 ias = ia - 1
1418 IF (2*ias == after) THEN
1419 nin1 = ia - after
1420 nout1 = ia - atn
1421 DO ib = 1, before
1422 nin1 = nin1 + after
1423 nin2 = nin1 + atb
1424 nin3 = nin2 + atb
1425 nin4 = nin3 + atb
1426 nout1 = nout1 + atn
1427 nout2 = nout1 + after
1428 nout3 = nout2 + after
1429 nout4 = nout3 + after
1430 DO j = 1, nfft
1431 r1 = zin(1, nin1, j)
1432 s1 = zin(2, nin1, j)
1433 r = zin(1, nin2, j)
1434 s = zin(2, nin2, j)
1435 r2 = (r - s)*rt2i
1436 s2 = (r + s)*rt2i
1437 r3 = -zin(2, nin3, j)
1438 s3 = zin(1, nin3, j)
1439 r = zin(1, nin4, j)
1440 s = zin(2, nin4, j)
1441 r4 = -(r + s)*rt2i
1442 s4 = (r - s)*rt2i
1443 r = r1 + r3
1444 s = r2 + r4
1445 zout(1, j, nout1) = r + s
1446 zout(1, j, nout3) = r - s
1447 r = r1 - r3
1448 s = s2 - s4
1449 zout(1, j, nout2) = r - s
1450 zout(1, j, nout4) = r + s
1451 r = s1 + s3
1452 s = s2 + s4
1453 zout(2, j, nout1) = r + s
1454 zout(2, j, nout3) = r - s
1455 r = s1 - s3
1456 s = r2 - r4
1457 zout(2, j, nout2) = r + s
1458 zout(2, j, nout4) = r - s
1459 END DO
1460 END DO
1461 ELSE
1462 itt = ias*before
1463 itrig = itt + 1
1464 cr2 = trig(1, itrig)
1465 ci2 = trig(2, itrig)
1466 itrig = itrig + itt
1467 cr3 = trig(1, itrig)
1468 ci3 = trig(2, itrig)
1469 itrig = itrig + itt
1470 cr4 = trig(1, itrig)
1471 ci4 = trig(2, itrig)
1472 nin1 = ia - after
1473 nout1 = ia - atn
1474 DO ib = 1, before
1475 nin1 = nin1 + after
1476 nin2 = nin1 + atb
1477 nin3 = nin2 + atb
1478 nin4 = nin3 + atb
1479 nout1 = nout1 + atn
1480 nout2 = nout1 + after
1481 nout3 = nout2 + after
1482 nout4 = nout3 + after
1483 DO j = 1, nfft
1484 r1 = zin(1, nin1, j)
1485 s1 = zin(2, nin1, j)
1486 r = zin(1, nin2, j)
1487 s = zin(2, nin2, j)
1488 r2 = r*cr2 - s*ci2
1489 s2 = r*ci2 + s*cr2
1490 r = zin(1, nin3, j)
1491 s = zin(2, nin3, j)
1492 r3 = r*cr3 - s*ci3
1493 s3 = r*ci3 + s*cr3
1494 r = zin(1, nin4, j)
1495 s = zin(2, nin4, j)
1496 r4 = r*cr4 - s*ci4
1497 s4 = r*ci4 + s*cr4
1498 r = r1 + r3
1499 s = r2 + r4
1500 zout(1, j, nout1) = r + s
1501 zout(1, j, nout3) = r - s
1502 r = r1 - r3
1503 s = s2 - s4
1504 zout(1, j, nout2) = r - s
1505 zout(1, j, nout4) = r + s
1506 r = s1 + s3
1507 s = s2 + s4
1508 zout(2, j, nout1) = r + s
1509 zout(2, j, nout3) = r - s
1510 r = s1 - s3
1511 s = r2 - r4
1512 zout(2, j, nout2) = r + s
1513 zout(2, j, nout4) = r - s
1514 END DO
1515 END DO
1516 END IF
1517 END DO
1518 ELSE
1519 ia = 1
1520 nin1 = ia - after
1521 nout1 = ia - atn
1522 DO ib = 1, before
1523 nin1 = nin1 + after
1524 nin2 = nin1 + atb
1525 nin3 = nin2 + atb
1526 nin4 = nin3 + atb
1527 nout1 = nout1 + atn
1528 nout2 = nout1 + after
1529 nout3 = nout2 + after
1530 nout4 = nout3 + after
1531 DO j = 1, nfft
1532 r1 = zin(1, nin1, j)
1533 s1 = zin(2, nin1, j)
1534 r2 = zin(1, nin2, j)
1535 s2 = zin(2, nin2, j)
1536 r3 = zin(1, nin3, j)
1537 s3 = zin(2, nin3, j)
1538 r4 = zin(1, nin4, j)
1539 s4 = zin(2, nin4, j)
1540 r = r1 + r3
1541 s = r2 + r4
1542 zout(1, j, nout1) = r + s
1543 zout(1, j, nout3) = r - s
1544 r = r1 - r3
1545 s = s2 - s4
1546 zout(1, j, nout2) = r + s
1547 zout(1, j, nout4) = r - s
1548 r = s1 + s3
1549 s = s2 + s4
1550 zout(2, j, nout1) = r + s
1551 zout(2, j, nout3) = r - s
1552 r = s1 - s3
1553 s = r2 - r4
1554 zout(2, j, nout2) = r - s
1555 zout(2, j, nout4) = r + s
1556 END DO
1557 END DO
1558 DO ia = 2, after
1559 ias = ia - 1
1560 IF (2*ias == after) THEN
1561 nin1 = ia - after
1562 nout1 = ia - atn
1563 DO ib = 1, before
1564 nin1 = nin1 + after
1565 nin2 = nin1 + atb
1566 nin3 = nin2 + atb
1567 nin4 = nin3 + atb
1568 nout1 = nout1 + atn
1569 nout2 = nout1 + after
1570 nout3 = nout2 + after
1571 nout4 = nout3 + after
1572 DO j = 1, nfft
1573 r1 = zin(1, nin1, j)
1574 s1 = zin(2, nin1, j)
1575 r = zin(1, nin2, j)
1576 s = zin(2, nin2, j)
1577 r2 = (r + s)*rt2i
1578 s2 = (s - r)*rt2i
1579 r3 = zin(2, nin3, j)
1580 s3 = -zin(1, nin3, j)
1581 r = zin(1, nin4, j)
1582 s = zin(2, nin4, j)
1583 r4 = (s - r)*rt2i
1584 s4 = -(r + s)*rt2i
1585 r = r1 + r3
1586 s = r2 + r4
1587 zout(1, j, nout1) = r + s
1588 zout(1, j, nout3) = r - s
1589 r = r1 - r3
1590 s = s2 - s4
1591 zout(1, j, nout2) = r + s
1592 zout(1, j, nout4) = r - s
1593 r = s1 + s3
1594 s = s2 + s4
1595 zout(2, j, nout1) = r + s
1596 zout(2, j, nout3) = r - s
1597 r = s1 - s3
1598 s = r2 - r4
1599 zout(2, j, nout2) = r - s
1600 zout(2, j, nout4) = r + s
1601 END DO
1602 END DO
1603 ELSE
1604 itt = ias*before
1605 itrig = itt + 1
1606 cr2 = trig(1, itrig)
1607 ci2 = trig(2, itrig)
1608 itrig = itrig + itt
1609 cr3 = trig(1, itrig)
1610 ci3 = trig(2, itrig)
1611 itrig = itrig + itt
1612 cr4 = trig(1, itrig)
1613 ci4 = trig(2, itrig)
1614 nin1 = ia - after
1615 nout1 = ia - atn
1616 DO ib = 1, before
1617 nin1 = nin1 + after
1618 nin2 = nin1 + atb
1619 nin3 = nin2 + atb
1620 nin4 = nin3 + atb
1621 nout1 = nout1 + atn
1622 nout2 = nout1 + after
1623 nout3 = nout2 + after
1624 nout4 = nout3 + after
1625 DO j = 1, nfft
1626 r1 = zin(1, nin1, j)
1627 s1 = zin(2, nin1, j)
1628 r = zin(1, nin2, j)
1629 s = zin(2, nin2, j)
1630 r2 = r*cr2 - s*ci2
1631 s2 = r*ci2 + s*cr2
1632 r = zin(1, nin3, j)
1633 s = zin(2, nin3, j)
1634 r3 = r*cr3 - s*ci3
1635 s3 = r*ci3 + s*cr3
1636 r = zin(1, nin4, j)
1637 s = zin(2, nin4, j)
1638 r4 = r*cr4 - s*ci4
1639 s4 = r*ci4 + s*cr4
1640 r = r1 + r3
1641 s = r2 + r4
1642 zout(1, j, nout1) = r + s
1643 zout(1, j, nout3) = r - s
1644 r = r1 - r3
1645 s = s2 - s4
1646 zout(1, j, nout2) = r + s
1647 zout(1, j, nout4) = r - s
1648 r = s1 + s3
1649 s = s2 + s4
1650 zout(2, j, nout1) = r + s
1651 zout(2, j, nout3) = r - s
1652 r = s1 - s3
1653 s = r2 - r4
1654 zout(2, j, nout2) = r - s
1655 zout(2, j, nout4) = r + s
1656 END DO
1657 END DO
1658 END IF
1659 END DO
1660 END IF
1661 ELSE IF (now == 8) THEN
1662 IF (isign == -1) THEN
1663 ia = 1
1664 nin1 = ia - after
1665 nout1 = ia - atn
1666 DO ib = 1, before
1667 nin1 = nin1 + after
1668 nin2 = nin1 + atb
1669 nin3 = nin2 + atb
1670 nin4 = nin3 + atb
1671 nin5 = nin4 + atb
1672 nin6 = nin5 + atb
1673 nin7 = nin6 + atb
1674 nin8 = nin7 + atb
1675 nout1 = nout1 + atn
1676 nout2 = nout1 + after
1677 nout3 = nout2 + after
1678 nout4 = nout3 + after
1679 nout5 = nout4 + after
1680 nout6 = nout5 + after
1681 nout7 = nout6 + after
1682 nout8 = nout7 + after
1683 DO j = 1, nfft
1684 r1 = zin(1, nin1, j)
1685 s1 = zin(2, nin1, j)
1686 r2 = zin(1, nin2, j)
1687 s2 = zin(2, nin2, j)
1688 r3 = zin(1, nin3, j)
1689 s3 = zin(2, nin3, j)
1690 r4 = zin(1, nin4, j)
1691 s4 = zin(2, nin4, j)
1692 r5 = zin(1, nin5, j)
1693 s5 = zin(2, nin5, j)
1694 r6 = zin(1, nin6, j)
1695 s6 = zin(2, nin6, j)
1696 r7 = zin(1, nin7, j)
1697 s7 = zin(2, nin7, j)
1698 r8 = zin(1, nin8, j)
1699 s8 = zin(2, nin8, j)
1700 r = r1 + r5
1701 s = r3 + r7
1702 ap = r + s
1703 am = r - s
1704 r = r2 + r6
1705 s = r4 + r8
1706 bp = r + s
1707 bm = r - s
1708 r = s1 + s5
1709 s = s3 + s7
1710 cp = r + s
1711 cm = r - s
1712 r = s2 + s6
1713 s = s4 + s8
1714 dbl = r + s
1715 dm = r - s
1716 zout(1, j, nout1) = ap + bp
1717 zout(2, j, nout1) = cp + dbl
1718 zout(1, j, nout5) = ap - bp
1719 zout(2, j, nout5) = cp - dbl
1720 zout(1, j, nout3) = am + dm
1721 zout(2, j, nout3) = cm - bm
1722 zout(1, j, nout7) = am - dm
1723 zout(2, j, nout7) = cm + bm
1724 r = r1 - r5
1725 s = s3 - s7
1726 ap = r + s
1727 am = r - s
1728 r = s1 - s5
1729 s = r3 - r7
1730 bp = r + s
1731 bm = r - s
1732 r = s4 - s8
1733 s = r2 - r6
1734 cp = r + s
1735 cm = r - s
1736 r = s2 - s6
1737 s = r4 - r8
1738 dbl = r + s
1739 dm = r - s
1740 r = (cp + dm)*rt2i
1741 s = (-cp + dm)*rt2i
1742 cp = (cm + dbl)*rt2i
1743 dbl = (cm - dbl)*rt2i
1744 zout(1, j, nout2) = ap + r
1745 zout(2, j, nout2) = bm + s
1746 zout(1, j, nout6) = ap - r
1747 zout(2, j, nout6) = bm - s
1748 zout(1, j, nout4) = am + cp
1749 zout(2, j, nout4) = bp + dbl
1750 zout(1, j, nout8) = am - cp
1751 zout(2, j, nout8) = bp - dbl
1752 END DO
1753 END DO
1754 ELSE
1755 ia = 1
1756 nin1 = ia - after
1757 nout1 = ia - atn
1758 DO ib = 1, before
1759 nin1 = nin1 + after
1760 nin2 = nin1 + atb
1761 nin3 = nin2 + atb
1762 nin4 = nin3 + atb
1763 nin5 = nin4 + atb
1764 nin6 = nin5 + atb
1765 nin7 = nin6 + atb
1766 nin8 = nin7 + atb
1767 nout1 = nout1 + atn
1768 nout2 = nout1 + after
1769 nout3 = nout2 + after
1770 nout4 = nout3 + after
1771 nout5 = nout4 + after
1772 nout6 = nout5 + after
1773 nout7 = nout6 + after
1774 nout8 = nout7 + after
1775 DO j = 1, nfft
1776 r1 = zin(1, nin1, j)
1777 s1 = zin(2, nin1, j)
1778 r2 = zin(1, nin2, j)
1779 s2 = zin(2, nin2, j)
1780 r3 = zin(1, nin3, j)
1781 s3 = zin(2, nin3, j)
1782 r4 = zin(1, nin4, j)
1783 s4 = zin(2, nin4, j)
1784 r5 = zin(1, nin5, j)
1785 s5 = zin(2, nin5, j)
1786 r6 = zin(1, nin6, j)
1787 s6 = zin(2, nin6, j)
1788 r7 = zin(1, nin7, j)
1789 s7 = zin(2, nin7, j)
1790 r8 = zin(1, nin8, j)
1791 s8 = zin(2, nin8, j)
1792 r = r1 + r5
1793 s = r3 + r7
1794 ap = r + s
1795 am = r - s
1796 r = r2 + r6
1797 s = r4 + r8
1798 bp = r + s
1799 bm = r - s
1800 r = s1 + s5
1801 s = s3 + s7
1802 cp = r + s
1803 cm = r - s
1804 r = s2 + s6
1805 s = s4 + s8
1806 dbl = r + s
1807 dm = r - s
1808 zout(1, j, nout1) = ap + bp
1809 zout(2, j, nout1) = cp + dbl
1810 zout(1, j, nout5) = ap - bp
1811 zout(2, j, nout5) = cp - dbl
1812 zout(1, j, nout3) = am - dm
1813 zout(2, j, nout3) = cm + bm
1814 zout(1, j, nout7) = am + dm
1815 zout(2, j, nout7) = cm - bm
1816 r = r1 - r5
1817 s = -s3 + s7
1818 ap = r + s
1819 am = r - s
1820 r = s1 - s5
1821 s = r7 - r3
1822 bp = r + s
1823 bm = r - s
1824 r = -s4 + s8
1825 s = r2 - r6
1826 cp = r + s
1827 cm = r - s
1828 r = -s2 + s6
1829 s = r4 - r8
1830 dbl = r + s
1831 dm = r - s
1832 r = (cp + dm)*rt2i
1833 s = (cp - dm)*rt2i
1834 cp = (cm + dbl)*rt2i
1835 dbl = (-cm + dbl)*rt2i
1836 zout(1, j, nout2) = ap + r
1837 zout(2, j, nout2) = bm + s
1838 zout(1, j, nout6) = ap - r
1839 zout(2, j, nout6) = bm - s
1840 zout(1, j, nout4) = am + cp
1841 zout(2, j, nout4) = bp + dbl
1842 zout(1, j, nout8) = am - cp
1843 zout(2, j, nout8) = bp - dbl
1844 END DO
1845 END DO
1846 END IF
1847 ELSE IF (now == 3) THEN
1848 ia = 1
1849 nin1 = ia - after
1850 nout1 = ia - atn
1851 bbs = isign*bb
1852 DO ib = 1, before
1853 nin1 = nin1 + after
1854 nin2 = nin1 + atb
1855 nin3 = nin2 + atb
1856 nout1 = nout1 + atn
1857 nout2 = nout1 + after
1858 nout3 = nout2 + after
1859 DO j = 1, nfft
1860 r1 = zin(1, nin1, j)
1861 s1 = zin(2, nin1, j)
1862 r2 = zin(1, nin2, j)
1863 s2 = zin(2, nin2, j)
1864 r3 = zin(1, nin3, j)
1865 s3 = zin(2, nin3, j)
1866 r = r2 + r3
1867 s = s2 + s3
1868 zout(1, j, nout1) = r + r1
1869 zout(2, j, nout1) = s + s1
1870 r1 = r1 - 0.5_dp*r
1871 s1 = s1 - 0.5_dp*s
1872 r2 = bbs*(r2 - r3)
1873 s2 = bbs*(s2 - s3)
1874 zout(1, j, nout2) = r1 - s2
1875 zout(2, j, nout2) = s1 + r2
1876 zout(1, j, nout3) = r1 + s2
1877 zout(2, j, nout3) = s1 - r2
1878 END DO
1879 END DO
1880 DO ia = 2, after
1881 ias = ia - 1
1882 IF (4*ias == 3*after) THEN
1883 IF (isign == 1) THEN
1884 nin1 = ia - after
1885 nout1 = ia - atn
1886 DO ib = 1, before
1887 nin1 = nin1 + after
1888 nin2 = nin1 + atb
1889 nin3 = nin2 + atb
1890 nout1 = nout1 + atn
1891 nout2 = nout1 + after
1892 nout3 = nout2 + after
1893 DO j = 1, nfft
1894 r1 = zin(1, nin1, j)
1895 s1 = zin(2, nin1, j)
1896 r2 = -zin(2, nin2, j)
1897 s2 = zin(1, nin2, j)
1898 r3 = -zin(1, nin3, j)
1899 s3 = -zin(2, nin3, j)
1900 r = r2 + r3
1901 s = s2 + s3
1902 zout(1, j, nout1) = r + r1
1903 zout(2, j, nout1) = s + s1
1904 r1 = r1 - 0.5_dp*r
1905 s1 = s1 - 0.5_dp*s
1906 r2 = bbs*(r2 - r3)
1907 s2 = bbs*(s2 - s3)
1908 zout(1, j, nout2) = r1 - s2
1909 zout(2, j, nout2) = s1 + r2
1910 zout(1, j, nout3) = r1 + s2
1911 zout(2, j, nout3) = s1 - r2
1912 END DO
1913 END DO
1914 ELSE
1915 nin1 = ia - after
1916 nout1 = ia - atn
1917 DO ib = 1, before
1918 nin1 = nin1 + after
1919 nin2 = nin1 + atb
1920 nin3 = nin2 + atb
1921 nout1 = nout1 + atn
1922 nout2 = nout1 + after
1923 nout3 = nout2 + after
1924 DO j = 1, nfft
1925 r1 = zin(1, nin1, j)
1926 s1 = zin(2, nin1, j)
1927 r2 = zin(2, nin2, j)
1928 s2 = -zin(1, nin2, j)
1929 r3 = -zin(1, nin3, j)
1930 s3 = -zin(2, nin3, j)
1931 r = r2 + r3
1932 s = s2 + s3
1933 zout(1, j, nout1) = r + r1
1934 zout(2, j, nout1) = s + s1
1935 r1 = r1 - 0.5_dp*r
1936 s1 = s1 - 0.5_dp*s
1937 r2 = bbs*(r2 - r3)
1938 s2 = bbs*(s2 - s3)
1939 zout(1, j, nout2) = r1 - s2
1940 zout(2, j, nout2) = s1 + r2
1941 zout(1, j, nout3) = r1 + s2
1942 zout(2, j, nout3) = s1 - r2
1943 END DO
1944 END DO
1945 END IF
1946 ELSE IF (8*ias == 3*after) THEN
1947 IF (isign == 1) THEN
1948 nin1 = ia - after
1949 nout1 = ia - atn
1950 DO ib = 1, before
1951 nin1 = nin1 + after
1952 nin2 = nin1 + atb
1953 nin3 = nin2 + atb
1954 nout1 = nout1 + atn
1955 nout2 = nout1 + after
1956 nout3 = nout2 + after
1957 DO j = 1, nfft
1958 r1 = zin(1, nin1, j)
1959 s1 = zin(2, nin1, j)
1960 r = zin(1, nin2, j)
1961 s = zin(2, nin2, j)
1962 r2 = (r - s)*rt2i
1963 s2 = (r + s)*rt2i
1964 r3 = -zin(2, nin3, j)
1965 s3 = zin(1, nin3, j)
1966 r = r2 + r3
1967 s = s2 + s3
1968 zout(1, j, nout1) = r + r1
1969 zout(2, j, nout1) = s + s1
1970 r1 = r1 - 0.5_dp*r
1971 s1 = s1 - 0.5_dp*s
1972 r2 = bbs*(r2 - r3)
1973 s2 = bbs*(s2 - s3)
1974 zout(1, j, nout2) = r1 - s2
1975 zout(2, j, nout2) = s1 + r2
1976 zout(1, j, nout3) = r1 + s2
1977 zout(2, j, nout3) = s1 - r2
1978 END DO
1979 END DO
1980 ELSE
1981 nin1 = ia - after
1982 nout1 = ia - atn
1983 DO ib = 1, before
1984 nin1 = nin1 + after
1985 nin2 = nin1 + atb
1986 nin3 = nin2 + atb
1987 nout1 = nout1 + atn
1988 nout2 = nout1 + after
1989 nout3 = nout2 + after
1990 DO j = 1, nfft
1991 r1 = zin(1, nin1, j)
1992 s1 = zin(2, nin1, j)
1993 r = zin(1, nin2, j)
1994 s = zin(2, nin2, j)
1995 r2 = (r + s)*rt2i
1996 s2 = (-r + s)*rt2i
1997 r3 = zin(2, nin3, j)
1998 s3 = -zin(1, nin3, j)
1999 r = r2 + r3
2000 s = s2 + s3
2001 zout(1, j, nout1) = r + r1
2002 zout(2, j, nout1) = s + s1
2003 r1 = r1 - 0.5_dp*r
2004 s1 = s1 - 0.5_dp*s
2005 r2 = bbs*(r2 - r3)
2006 s2 = bbs*(s2 - s3)
2007 zout(1, j, nout2) = r1 - s2
2008 zout(2, j, nout2) = s1 + r2
2009 zout(1, j, nout3) = r1 + s2
2010 zout(2, j, nout3) = s1 - r2
2011 END DO
2012 END DO
2013 END IF
2014 ELSE
2015 itt = ias*before
2016 itrig = itt + 1
2017 cr2 = trig(1, itrig)
2018 ci2 = trig(2, itrig)
2019 itrig = itrig + itt
2020 cr3 = trig(1, itrig)
2021 ci3 = trig(2, itrig)
2022 nin1 = ia - after
2023 nout1 = ia - atn
2024 DO ib = 1, before
2025 nin1 = nin1 + after
2026 nin2 = nin1 + atb
2027 nin3 = nin2 + atb
2028 nout1 = nout1 + atn
2029 nout2 = nout1 + after
2030 nout3 = nout2 + after
2031 DO j = 1, nfft
2032 r1 = zin(1, nin1, j)
2033 s1 = zin(2, nin1, j)
2034 r = zin(1, nin2, j)
2035 s = zin(2, nin2, j)
2036 r2 = r*cr2 - s*ci2
2037 s2 = r*ci2 + s*cr2
2038 r = zin(1, nin3, j)
2039 s = zin(2, nin3, j)
2040 r3 = r*cr3 - s*ci3
2041 s3 = r*ci3 + s*cr3
2042 r = r2 + r3
2043 s = s2 + s3
2044 zout(1, j, nout1) = r + r1
2045 zout(2, j, nout1) = s + s1
2046 r1 = r1 - 0.5_dp*r
2047 s1 = s1 - 0.5_dp*s
2048 r2 = bbs*(r2 - r3)
2049 s2 = bbs*(s2 - s3)
2050 zout(1, j, nout2) = r1 - s2
2051 zout(2, j, nout2) = s1 + r2
2052 zout(1, j, nout3) = r1 + s2
2053 zout(2, j, nout3) = s1 - r2
2054 END DO
2055 END DO
2056 END IF
2057 END DO
2058 ELSE IF (now == 5) THEN
2059 sin2 = isign*sin2p
2060 sin4 = isign*sin4p
2061 ia = 1
2062 nin1 = ia - after
2063 nout1 = ia - atn
2064 DO ib = 1, before
2065 nin1 = nin1 + after
2066 nin2 = nin1 + atb
2067 nin3 = nin2 + atb
2068 nin4 = nin3 + atb
2069 nin5 = nin4 + atb
2070 nout1 = nout1 + atn
2071 nout2 = nout1 + after
2072 nout3 = nout2 + after
2073 nout4 = nout3 + after
2074 nout5 = nout4 + after
2075 DO j = 1, nfft
2076 r1 = zin(1, nin1, j)
2077 s1 = zin(2, nin1, j)
2078 r2 = zin(1, nin2, j)
2079 s2 = zin(2, nin2, j)
2080 r3 = zin(1, nin3, j)
2081 s3 = zin(2, nin3, j)
2082 r4 = zin(1, nin4, j)
2083 s4 = zin(2, nin4, j)
2084 r5 = zin(1, nin5, j)
2085 s5 = zin(2, nin5, j)
2086 r25 = r2 + r5
2087 r34 = r3 + r4
2088 s25 = s2 - s5
2089 s34 = s3 - s4
2090 zout(1, j, nout1) = r1 + r25 + r34
2091 r = cos2*r25 + cos4*r34 + r1
2092 s = sin2*s25 + sin4*s34
2093 zout(1, j, nout2) = r - s
2094 zout(1, j, nout5) = r + s
2095 r = cos4*r25 + cos2*r34 + r1
2096 s = sin4*s25 - sin2*s34
2097 zout(1, j, nout3) = r - s
2098 zout(1, j, nout4) = r + s
2099 r25 = r2 - r5
2100 r34 = r3 - r4
2101 s25 = s2 + s5
2102 s34 = s3 + s4
2103 zout(2, j, nout1) = s1 + s25 + s34
2104 r = cos2*s25 + cos4*s34 + s1
2105 s = sin2*r25 + sin4*r34
2106 zout(2, j, nout2) = r + s
2107 zout(2, j, nout5) = r - s
2108 r = cos4*s25 + cos2*s34 + s1
2109 s = sin4*r25 - sin2*r34
2110 zout(2, j, nout3) = r + s
2111 zout(2, j, nout4) = r - s
2112 END DO
2113 END DO
2114 DO ia = 2, after
2115 ias = ia - 1
2116 IF (8*ias == 5*after) THEN
2117 IF (isign == 1) THEN
2118 nin1 = ia - after
2119 nout1 = ia - atn
2120 DO ib = 1, before
2121 nin1 = nin1 + after
2122 nin2 = nin1 + atb
2123 nin3 = nin2 + atb
2124 nin4 = nin3 + atb
2125 nin5 = nin4 + atb
2126 nout1 = nout1 + atn
2127 nout2 = nout1 + after
2128 nout3 = nout2 + after
2129 nout4 = nout3 + after
2130 nout5 = nout4 + after
2131 DO j = 1, nfft
2132 r1 = zin(1, nin1, j)
2133 s1 = zin(2, nin1, j)
2134 r = zin(1, nin2, j)
2135 s = zin(2, nin2, j)
2136 r2 = (r - s)*rt2i
2137 s2 = (r + s)*rt2i
2138 r3 = -zin(2, nin3, j)
2139 s3 = zin(1, nin3, j)
2140 r = zin(1, nin4, j)
2141 s = zin(2, nin4, j)
2142 r4 = -(r + s)*rt2i
2143 s4 = (r - s)*rt2i
2144 r5 = -zin(1, nin5, j)
2145 s5 = -zin(2, nin5, j)
2146 r25 = r2 + r5
2147 r34 = r3 + r4
2148 s25 = s2 - s5
2149 s34 = s3 - s4
2150 zout(1, j, nout1) = r1 + r25 + r34
2151 r = cos2*r25 + cos4*r34 + r1
2152 s = sin2*s25 + sin4*s34
2153 zout(1, j, nout2) = r - s
2154 zout(1, j, nout5) = r + s
2155 r = cos4*r25 + cos2*r34 + r1
2156 s = sin4*s25 - sin2*s34
2157 zout(1, j, nout3) = r - s
2158 zout(1, j, nout4) = r + s
2159 r25 = r2 - r5
2160 r34 = r3 - r4
2161 s25 = s2 + s5
2162 s34 = s3 + s4
2163 zout(2, j, nout1) = s1 + s25 + s34
2164 r = cos2*s25 + cos4*s34 + s1
2165 s = sin2*r25 + sin4*r34
2166 zout(2, j, nout2) = r + s
2167 zout(2, j, nout5) = r - s
2168 r = cos4*s25 + cos2*s34 + s1
2169 s = sin4*r25 - sin2*r34
2170 zout(2, j, nout3) = r + s
2171 zout(2, j, nout4) = r - s
2172 END DO
2173 END DO
2174 ELSE
2175 nin1 = ia - after
2176 nout1 = ia - atn
2177 DO ib = 1, before
2178 nin1 = nin1 + after
2179 nin2 = nin1 + atb
2180 nin3 = nin2 + atb
2181 nin4 = nin3 + atb
2182 nin5 = nin4 + atb
2183 nout1 = nout1 + atn
2184 nout2 = nout1 + after
2185 nout3 = nout2 + after
2186 nout4 = nout3 + after
2187 nout5 = nout4 + after
2188 DO j = 1, nfft
2189 r1 = zin(1, nin1, j)
2190 s1 = zin(2, nin1, j)
2191 r = zin(1, nin2, j)
2192 s = zin(2, nin2, j)
2193 r2 = (r + s)*rt2i
2194 s2 = (-r + s)*rt2i
2195 r3 = zin(2, nin3, j)
2196 s3 = -zin(1, nin3, j)
2197 r = zin(1, nin4, j)
2198 s = zin(2, nin4, j)
2199 r4 = (s - r)*rt2i
2200 s4 = -(r + s)*rt2i
2201 r5 = -zin(1, nin5, j)
2202 s5 = -zin(2, nin5, j)
2203 r25 = r2 + r5
2204 r34 = r3 + r4
2205 s25 = s2 - s5
2206 s34 = s3 - s4
2207 zout(1, j, nout1) = r1 + r25 + r34
2208 r = cos2*r25 + cos4*r34 + r1
2209 s = sin2*s25 + sin4*s34
2210 zout(1, j, nout2) = r - s
2211 zout(1, j, nout5) = r + s
2212 r = cos4*r25 + cos2*r34 + r1
2213 s = sin4*s25 - sin2*s34
2214 zout(1, j, nout3) = r - s
2215 zout(1, j, nout4) = r + s
2216 r25 = r2 - r5
2217 r34 = r3 - r4
2218 s25 = s2 + s5
2219 s34 = s3 + s4
2220 zout(2, j, nout1) = s1 + s25 + s34
2221 r = cos2*s25 + cos4*s34 + s1
2222 s = sin2*r25 + sin4*r34
2223 zout(2, j, nout2) = r + s
2224 zout(2, j, nout5) = r - s
2225 r = cos4*s25 + cos2*s34 + s1
2226 s = sin4*r25 - sin2*r34
2227 zout(2, j, nout3) = r + s
2228 zout(2, j, nout4) = r - s
2229 END DO
2230 END DO
2231 END IF
2232 ELSE
2233 ias = ia - 1
2234 itt = ias*before
2235 itrig = itt + 1
2236 cr2 = trig(1, itrig)
2237 ci2 = trig(2, itrig)
2238 itrig = itrig + itt
2239 cr3 = trig(1, itrig)
2240 ci3 = trig(2, itrig)
2241 itrig = itrig + itt
2242 cr4 = trig(1, itrig)
2243 ci4 = trig(2, itrig)
2244 itrig = itrig + itt
2245 cr5 = trig(1, itrig)
2246 ci5 = trig(2, itrig)
2247 nin1 = ia - after
2248 nout1 = ia - atn
2249 DO ib = 1, before
2250 nin1 = nin1 + after
2251 nin2 = nin1 + atb
2252 nin3 = nin2 + atb
2253 nin4 = nin3 + atb
2254 nin5 = nin4 + atb
2255 nout1 = nout1 + atn
2256 nout2 = nout1 + after
2257 nout3 = nout2 + after
2258 nout4 = nout3 + after
2259 nout5 = nout4 + after
2260 DO j = 1, nfft
2261 r1 = zin(1, nin1, j)
2262 s1 = zin(2, nin1, j)
2263 r = zin(1, nin2, j)
2264 s = zin(2, nin2, j)
2265 r2 = r*cr2 - s*ci2
2266 s2 = r*ci2 + s*cr2
2267 r = zin(1, nin3, j)
2268 s = zin(2, nin3, j)
2269 r3 = r*cr3 - s*ci3
2270 s3 = r*ci3 + s*cr3
2271 r = zin(1, nin4, j)
2272 s = zin(2, nin4, j)
2273 r4 = r*cr4 - s*ci4
2274 s4 = r*ci4 + s*cr4
2275 r = zin(1, nin5, j)
2276 s = zin(2, nin5, j)
2277 r5 = r*cr5 - s*ci5
2278 s5 = r*ci5 + s*cr5
2279 r25 = r2 + r5
2280 r34 = r3 + r4
2281 s25 = s2 - s5
2282 s34 = s3 - s4
2283 zout(1, j, nout1) = r1 + r25 + r34
2284 r = cos2*r25 + cos4*r34 + r1
2285 s = sin2*s25 + sin4*s34
2286 zout(1, j, nout2) = r - s
2287 zout(1, j, nout5) = r + s
2288 r = cos4*r25 + cos2*r34 + r1
2289 s = sin4*s25 - sin2*s34
2290 zout(1, j, nout3) = r - s
2291 zout(1, j, nout4) = r + s
2292 r25 = r2 - r5
2293 r34 = r3 - r4
2294 s25 = s2 + s5
2295 s34 = s3 + s4
2296 zout(2, j, nout1) = s1 + s25 + s34
2297 r = cos2*s25 + cos4*s34 + s1
2298 s = sin2*r25 + sin4*r34
2299 zout(2, j, nout2) = r + s
2300 zout(2, j, nout5) = r - s
2301 r = cos4*s25 + cos2*s34 + s1
2302 s = sin4*r25 - sin2*r34
2303 zout(2, j, nout3) = r + s
2304 zout(2, j, nout4) = r - s
2305 END DO
2306 END DO
2307 END IF
2308 END DO
2309 ELSE IF (now == 6) THEN
2310 bbs = isign*bb
2311 ia = 1
2312 nin1 = ia - after
2313 nout1 = ia - atn
2314 DO ib = 1, before
2315 nin1 = nin1 + after
2316 nin2 = nin1 + atb
2317 nin3 = nin2 + atb
2318 nin4 = nin3 + atb
2319 nin5 = nin4 + atb
2320 nin6 = nin5 + atb
2321 nout1 = nout1 + atn
2322 nout2 = nout1 + after
2323 nout3 = nout2 + after
2324 nout4 = nout3 + after
2325 nout5 = nout4 + after
2326 nout6 = nout5 + after
2327 DO j = 1, nfft
2328 r2 = zin(1, nin3, j)
2329 s2 = zin(2, nin3, j)
2330 r3 = zin(1, nin5, j)
2331 s3 = zin(2, nin5, j)
2332 r = r2 + r3
2333 s = s2 + s3
2334 r1 = zin(1, nin1, j)
2335 s1 = zin(2, nin1, j)
2336 ur1 = r + r1
2337 ui1 = s + s1
2338 r1 = r1 - 0.5_dp*r
2339 s1 = s1 - 0.5_dp*s
2340 r = r2 - r3
2341 s = s2 - s3
2342 ur2 = r1 - s*bbs
2343 ui2 = s1 + r*bbs
2344 ur3 = r1 + s*bbs
2345 ui3 = s1 - r*bbs
2346
2347 r2 = zin(1, nin6, j)
2348 s2 = zin(2, nin6, j)
2349 r3 = zin(1, nin2, j)
2350 s3 = zin(2, nin2, j)
2351 r = r2 + r3
2352 s = s2 + s3
2353 r1 = zin(1, nin4, j)
2354 s1 = zin(2, nin4, j)
2355 vr1 = r + r1
2356 vi1 = s + s1
2357 r1 = r1 - 0.5_dp*r
2358 s1 = s1 - 0.5_dp*s
2359 r = r2 - r3
2360 s = s2 - s3
2361 vr2 = r1 - s*bbs
2362 vi2 = s1 + r*bbs
2363 vr3 = r1 + s*bbs
2364 vi3 = s1 - r*bbs
2365
2366 zout(1, j, nout1) = ur1 + vr1
2367 zout(2, j, nout1) = ui1 + vi1
2368 zout(1, j, nout5) = ur2 + vr2
2369 zout(2, j, nout5) = ui2 + vi2
2370 zout(1, j, nout3) = ur3 + vr3
2371 zout(2, j, nout3) = ui3 + vi3
2372 zout(1, j, nout4) = ur1 - vr1
2373 zout(2, j, nout4) = ui1 - vi1
2374 zout(1, j, nout2) = ur2 - vr2
2375 zout(2, j, nout2) = ui2 - vi2
2376 zout(1, j, nout6) = ur3 - vr3
2377 zout(2, j, nout6) = ui3 - vi3
2378 END DO
2379 END DO
2380 ELSE
2381 cpabort('Error fftpre')
2382 END IF
2383
2384!-----------------------------------------------------------------------------!
2385
2386 END SUBROUTINE fftpre
2387
2388!-----------------------------------------------------------------------------!
2389
2390!-----------------------------------------------------------------------------!
2391! Copyright (C) Stefan Goedecker, Lausanne, Switzerland, August 1, 1991
2392! Copyright (C) Stefan Goedecker, Cornell University, Ithaca, USA, 1994
2393! Copyright (C) Stefan Goedecker, MPI Stuttgart, Germany, 1999
2394! This file is distributed under the terms of the
2395! GNU General Public License version 2 (or later),
2396! see http://www.gnu.org/copyleft/gpl.txt .
2397!-----------------------------------------------------------------------------!
2398! S. Goedecker: Rotating a three-dimensional array in optimal
2399! positions for vector processing: Case study for a three-dimensional Fast
2400! Fourier Transform, Comp. Phys. Commun. 76, 294 (1993)
2401! **************************************************************************************************
2402!> \brief ...
2403!> \param mm ...
2404!> \param nfft ...
2405!> \param m ...
2406!> \param nn ...
2407!> \param n ...
2408!> \param zin ...
2409!> \param zout ...
2410!> \param trig ...
2411!> \param now ...
2412!> \param after ...
2413!> \param before ...
2414!> \param isign ...
2415! **************************************************************************************************
2416 SUBROUTINE fftstp(mm, nfft, m, nn, n, zin, zout, trig, now, after, before, isign)
2417
2418 INTEGER, INTENT(IN) :: mm, nfft, m, nn, n
2419 REAL(dp), DIMENSION(2, mm, m), INTENT(IN) :: zin
2420 REAL(dp), DIMENSION(2, nn, n), INTENT(INOUT) :: zout
2421 REAL(dp), DIMENSION(2, ctrig_length), INTENT(IN) :: trig
2422 INTEGER, INTENT(IN) :: now, after, before, isign
2423
2424 REAL(dp), PARAMETER :: bb = 0.8660254037844387_dp, cos2 = 0.3090169943749474_dp, &
2425 cos4 = -0.8090169943749474_dp, rt2i = 0.7071067811865475_dp, &
2426 sin2p = 0.9510565162951536_dp, sin4p = 0.5877852522924731_dp
2427
2428 INTEGER :: atb, atn, ia, ias, ib, itrig, itt, j, &
2429 nin1, nin2, nin3, nin4, nin5, nin6, &
2430 nin7, nin8, nout1, nout2, nout3, &
2431 nout4, nout5, nout6, nout7, nout8
2432 REAL(dp) :: am, ap, bbs, bm, bp, ci2, ci3, ci4, ci5, cm, cp, cr2, cr3, cr4, cr5, dbl, dm, r, &
2433 r1, r2, r25, r3, r34, r4, r5, r6, r7, r8, s, s1, s2, s25, s3, s34, s4, s5, s6, s7, s8, &
2434 sin2, sin4, ui1, ui2, ui3, ur1, ur2, ur3, vi1, vi2, vi3, vr1, vr2, vr3
2435
2436! sqrt(0.5)
2437! sqrt(3)/2
2438! cos(2*pi/5)
2439! cos(4*pi/5)
2440! sin(2*pi/5)
2441! sin(4*pi/5)
2442!-----------------------------------------------------------------------------!
2443
2444 atn = after*now
2445 atb = after*before
2446
2447 IF (now == 4) THEN
2448 IF (isign == 1) THEN
2449 ia = 1
2450 nin1 = ia - after
2451 nout1 = ia - atn
2452 DO ib = 1, before
2453 nin1 = nin1 + after
2454 nin2 = nin1 + atb
2455 nin3 = nin2 + atb
2456 nin4 = nin3 + atb
2457 nout1 = nout1 + atn
2458 nout2 = nout1 + after
2459 nout3 = nout2 + after
2460 nout4 = nout3 + after
2461 DO j = 1, nfft
2462 r1 = zin(1, j, nin1)
2463 s1 = zin(2, j, nin1)
2464 r2 = zin(1, j, nin2)
2465 s2 = zin(2, j, nin2)
2466 r3 = zin(1, j, nin3)
2467 s3 = zin(2, j, nin3)
2468 r4 = zin(1, j, nin4)
2469 s4 = zin(2, j, nin4)
2470 r = r1 + r3
2471 s = r2 + r4
2472 zout(1, j, nout1) = r + s
2473 zout(1, j, nout3) = r - s
2474 r = r1 - r3
2475 s = s2 - s4
2476 zout(1, j, nout2) = r - s
2477 zout(1, j, nout4) = r + s
2478 r = s1 + s3
2479 s = s2 + s4
2480 zout(2, j, nout1) = r + s
2481 zout(2, j, nout3) = r - s
2482 r = s1 - s3
2483 s = r2 - r4
2484 zout(2, j, nout2) = r + s
2485 zout(2, j, nout4) = r - s
2486 END DO
2487 END DO
2488 DO ia = 2, after
2489 ias = ia - 1
2490 IF (2*ias == after) THEN
2491 nin1 = ia - after
2492 nout1 = ia - atn
2493 DO ib = 1, before
2494 nin1 = nin1 + after
2495 nin2 = nin1 + atb
2496 nin3 = nin2 + atb
2497 nin4 = nin3 + atb
2498 nout1 = nout1 + atn
2499 nout2 = nout1 + after
2500 nout3 = nout2 + after
2501 nout4 = nout3 + after
2502 DO j = 1, nfft
2503 r1 = zin(1, j, nin1)
2504 s1 = zin(2, j, nin1)
2505 r = zin(1, j, nin2)
2506 s = zin(2, j, nin2)
2507 r2 = (r - s)*rt2i
2508 s2 = (r + s)*rt2i
2509 r3 = -zin(2, j, nin3)
2510 s3 = zin(1, j, nin3)
2511 r = zin(1, j, nin4)
2512 s = zin(2, j, nin4)
2513 r4 = -(r + s)*rt2i
2514 s4 = (r - s)*rt2i
2515 r = r1 + r3
2516 s = r2 + r4
2517 zout(1, j, nout1) = r + s
2518 zout(1, j, nout3) = r - s
2519 r = r1 - r3
2520 s = s2 - s4
2521 zout(1, j, nout2) = r - s
2522 zout(1, j, nout4) = r + s
2523 r = s1 + s3
2524 s = s2 + s4
2525 zout(2, j, nout1) = r + s
2526 zout(2, j, nout3) = r - s
2527 r = s1 - s3
2528 s = r2 - r4
2529 zout(2, j, nout2) = r + s
2530 zout(2, j, nout4) = r - s
2531 END DO
2532 END DO
2533 ELSE
2534 itt = ias*before
2535 itrig = itt + 1
2536 cr2 = trig(1, itrig)
2537 ci2 = trig(2, itrig)
2538 itrig = itrig + itt
2539 cr3 = trig(1, itrig)
2540 ci3 = trig(2, itrig)
2541 itrig = itrig + itt
2542 cr4 = trig(1, itrig)
2543 ci4 = trig(2, itrig)
2544 nin1 = ia - after
2545 nout1 = ia - atn
2546 DO ib = 1, before
2547 nin1 = nin1 + after
2548 nin2 = nin1 + atb
2549 nin3 = nin2 + atb
2550 nin4 = nin3 + atb
2551 nout1 = nout1 + atn
2552 nout2 = nout1 + after
2553 nout3 = nout2 + after
2554 nout4 = nout3 + after
2555 DO j = 1, nfft
2556 r1 = zin(1, j, nin1)
2557 s1 = zin(2, j, nin1)
2558 r = zin(1, j, nin2)
2559 s = zin(2, j, nin2)
2560 r2 = r*cr2 - s*ci2
2561 s2 = r*ci2 + s*cr2
2562 r = zin(1, j, nin3)
2563 s = zin(2, j, nin3)
2564 r3 = r*cr3 - s*ci3
2565 s3 = r*ci3 + s*cr3
2566 r = zin(1, j, nin4)
2567 s = zin(2, j, nin4)
2568 r4 = r*cr4 - s*ci4
2569 s4 = r*ci4 + s*cr4
2570 r = r1 + r3
2571 s = r2 + r4
2572 zout(1, j, nout1) = r + s
2573 zout(1, j, nout3) = r - s
2574 r = r1 - r3
2575 s = s2 - s4
2576 zout(1, j, nout2) = r - s
2577 zout(1, j, nout4) = r + s
2578 r = s1 + s3
2579 s = s2 + s4
2580 zout(2, j, nout1) = r + s
2581 zout(2, j, nout3) = r - s
2582 r = s1 - s3
2583 s = r2 - r4
2584 zout(2, j, nout2) = r + s
2585 zout(2, j, nout4) = r - s
2586 END DO
2587 END DO
2588 END IF
2589 END DO
2590 ELSE
2591 ia = 1
2592 nin1 = ia - after
2593 nout1 = ia - atn
2594 DO ib = 1, before
2595 nin1 = nin1 + after
2596 nin2 = nin1 + atb
2597 nin3 = nin2 + atb
2598 nin4 = nin3 + atb
2599 nout1 = nout1 + atn
2600 nout2 = nout1 + after
2601 nout3 = nout2 + after
2602 nout4 = nout3 + after
2603 DO j = 1, nfft
2604 r1 = zin(1, j, nin1)
2605 s1 = zin(2, j, nin1)
2606 r2 = zin(1, j, nin2)
2607 s2 = zin(2, j, nin2)
2608 r3 = zin(1, j, nin3)
2609 s3 = zin(2, j, nin3)
2610 r4 = zin(1, j, nin4)
2611 s4 = zin(2, j, nin4)
2612 r = r1 + r3
2613 s = r2 + r4
2614 zout(1, j, nout1) = r + s
2615 zout(1, j, nout3) = r - s
2616 r = r1 - r3
2617 s = s2 - s4
2618 zout(1, j, nout2) = r + s
2619 zout(1, j, nout4) = r - s
2620 r = s1 + s3
2621 s = s2 + s4
2622 zout(2, j, nout1) = r + s
2623 zout(2, j, nout3) = r - s
2624 r = s1 - s3
2625 s = r2 - r4
2626 zout(2, j, nout2) = r - s
2627 zout(2, j, nout4) = r + s
2628 END DO
2629 END DO
2630 DO ia = 2, after
2631 ias = ia - 1
2632 IF (2*ias == after) THEN
2633 nin1 = ia - after
2634 nout1 = ia - atn
2635 DO ib = 1, before
2636 nin1 = nin1 + after
2637 nin2 = nin1 + atb
2638 nin3 = nin2 + atb
2639 nin4 = nin3 + atb
2640 nout1 = nout1 + atn
2641 nout2 = nout1 + after
2642 nout3 = nout2 + after
2643 nout4 = nout3 + after
2644 DO j = 1, nfft
2645 r1 = zin(1, j, nin1)
2646 s1 = zin(2, j, nin1)
2647 r = zin(1, j, nin2)
2648 s = zin(2, j, nin2)
2649 r2 = (r + s)*rt2i
2650 s2 = (s - r)*rt2i
2651 r3 = zin(2, j, nin3)
2652 s3 = -zin(1, j, nin3)
2653 r = zin(1, j, nin4)
2654 s = zin(2, j, nin4)
2655 r4 = (s - r)*rt2i
2656 s4 = -(r + s)*rt2i
2657 r = r1 + r3
2658 s = r2 + r4
2659 zout(1, j, nout1) = r + s
2660 zout(1, j, nout3) = r - s
2661 r = r1 - r3
2662 s = s2 - s4
2663 zout(1, j, nout2) = r + s
2664 zout(1, j, nout4) = r - s
2665 r = s1 + s3
2666 s = s2 + s4
2667 zout(2, j, nout1) = r + s
2668 zout(2, j, nout3) = r - s
2669 r = s1 - s3
2670 s = r2 - r4
2671 zout(2, j, nout2) = r - s
2672 zout(2, j, nout4) = r + s
2673 END DO
2674 END DO
2675 ELSE
2676 itt = ias*before
2677 itrig = itt + 1
2678 cr2 = trig(1, itrig)
2679 ci2 = trig(2, itrig)
2680 itrig = itrig + itt
2681 cr3 = trig(1, itrig)
2682 ci3 = trig(2, itrig)
2683 itrig = itrig + itt
2684 cr4 = trig(1, itrig)
2685 ci4 = trig(2, itrig)
2686 nin1 = ia - after
2687 nout1 = ia - atn
2688 DO ib = 1, before
2689 nin1 = nin1 + after
2690 nin2 = nin1 + atb
2691 nin3 = nin2 + atb
2692 nin4 = nin3 + atb
2693 nout1 = nout1 + atn
2694 nout2 = nout1 + after
2695 nout3 = nout2 + after
2696 nout4 = nout3 + after
2697 DO j = 1, nfft
2698 r1 = zin(1, j, nin1)
2699 s1 = zin(2, j, nin1)
2700 r = zin(1, j, nin2)
2701 s = zin(2, j, nin2)
2702 r2 = r*cr2 - s*ci2
2703 s2 = r*ci2 + s*cr2
2704 r = zin(1, j, nin3)
2705 s = zin(2, j, nin3)
2706 r3 = r*cr3 - s*ci3
2707 s3 = r*ci3 + s*cr3
2708 r = zin(1, j, nin4)
2709 s = zin(2, j, nin4)
2710 r4 = r*cr4 - s*ci4
2711 s4 = r*ci4 + s*cr4
2712 r = r1 + r3
2713 s = r2 + r4
2714 zout(1, j, nout1) = r + s
2715 zout(1, j, nout3) = r - s
2716 r = r1 - r3
2717 s = s2 - s4
2718 zout(1, j, nout2) = r + s
2719 zout(1, j, nout4) = r - s
2720 r = s1 + s3
2721 s = s2 + s4
2722 zout(2, j, nout1) = r + s
2723 zout(2, j, nout3) = r - s
2724 r = s1 - s3
2725 s = r2 - r4
2726 zout(2, j, nout2) = r - s
2727 zout(2, j, nout4) = r + s
2728 END DO
2729 END DO
2730 END IF
2731 END DO
2732 END IF
2733 ELSE IF (now == 8) THEN
2734 IF (isign == -1) THEN
2735 ia = 1
2736 nin1 = ia - after
2737 nout1 = ia - atn
2738 DO ib = 1, before
2739 nin1 = nin1 + after
2740 nin2 = nin1 + atb
2741 nin3 = nin2 + atb
2742 nin4 = nin3 + atb
2743 nin5 = nin4 + atb
2744 nin6 = nin5 + atb
2745 nin7 = nin6 + atb
2746 nin8 = nin7 + atb
2747 nout1 = nout1 + atn
2748 nout2 = nout1 + after
2749 nout3 = nout2 + after
2750 nout4 = nout3 + after
2751 nout5 = nout4 + after
2752 nout6 = nout5 + after
2753 nout7 = nout6 + after
2754 nout8 = nout7 + after
2755 DO j = 1, nfft
2756 r1 = zin(1, j, nin1)
2757 s1 = zin(2, j, nin1)
2758 r2 = zin(1, j, nin2)
2759 s2 = zin(2, j, nin2)
2760 r3 = zin(1, j, nin3)
2761 s3 = zin(2, j, nin3)
2762 r4 = zin(1, j, nin4)
2763 s4 = zin(2, j, nin4)
2764 r5 = zin(1, j, nin5)
2765 s5 = zin(2, j, nin5)
2766 r6 = zin(1, j, nin6)
2767 s6 = zin(2, j, nin6)
2768 r7 = zin(1, j, nin7)
2769 s7 = zin(2, j, nin7)
2770 r8 = zin(1, j, nin8)
2771 s8 = zin(2, j, nin8)
2772 r = r1 + r5
2773 s = r3 + r7
2774 ap = r + s
2775 am = r - s
2776 r = r2 + r6
2777 s = r4 + r8
2778 bp = r + s
2779 bm = r - s
2780 r = s1 + s5
2781 s = s3 + s7
2782 cp = r + s
2783 cm = r - s
2784 r = s2 + s6
2785 s = s4 + s8
2786 dbl = r + s
2787 dm = r - s
2788 zout(1, j, nout1) = ap + bp
2789 zout(2, j, nout1) = cp + dbl
2790 zout(1, j, nout5) = ap - bp
2791 zout(2, j, nout5) = cp - dbl
2792 zout(1, j, nout3) = am + dm
2793 zout(2, j, nout3) = cm - bm
2794 zout(1, j, nout7) = am - dm
2795 zout(2, j, nout7) = cm + bm
2796 r = r1 - r5
2797 s = s3 - s7
2798 ap = r + s
2799 am = r - s
2800 r = s1 - s5
2801 s = r3 - r7
2802 bp = r + s
2803 bm = r - s
2804 r = s4 - s8
2805 s = r2 - r6
2806 cp = r + s
2807 cm = r - s
2808 r = s2 - s6
2809 s = r4 - r8
2810 dbl = r + s
2811 dm = r - s
2812 r = (cp + dm)*rt2i
2813 s = (-cp + dm)*rt2i
2814 cp = (cm + dbl)*rt2i
2815 dbl = (cm - dbl)*rt2i
2816 zout(1, j, nout2) = ap + r
2817 zout(2, j, nout2) = bm + s
2818 zout(1, j, nout6) = ap - r
2819 zout(2, j, nout6) = bm - s
2820 zout(1, j, nout4) = am + cp
2821 zout(2, j, nout4) = bp + dbl
2822 zout(1, j, nout8) = am - cp
2823 zout(2, j, nout8) = bp - dbl
2824 END DO
2825 END DO
2826 ELSE
2827 ia = 1
2828 nin1 = ia - after
2829 nout1 = ia - atn
2830 DO ib = 1, before
2831 nin1 = nin1 + after
2832 nin2 = nin1 + atb
2833 nin3 = nin2 + atb
2834 nin4 = nin3 + atb
2835 nin5 = nin4 + atb
2836 nin6 = nin5 + atb
2837 nin7 = nin6 + atb
2838 nin8 = nin7 + atb
2839 nout1 = nout1 + atn
2840 nout2 = nout1 + after
2841 nout3 = nout2 + after
2842 nout4 = nout3 + after
2843 nout5 = nout4 + after
2844 nout6 = nout5 + after
2845 nout7 = nout6 + after
2846 nout8 = nout7 + after
2847 DO j = 1, nfft
2848 r1 = zin(1, j, nin1)
2849 s1 = zin(2, j, nin1)
2850 r2 = zin(1, j, nin2)
2851 s2 = zin(2, j, nin2)
2852 r3 = zin(1, j, nin3)
2853 s3 = zin(2, j, nin3)
2854 r4 = zin(1, j, nin4)
2855 s4 = zin(2, j, nin4)
2856 r5 = zin(1, j, nin5)
2857 s5 = zin(2, j, nin5)
2858 r6 = zin(1, j, nin6)
2859 s6 = zin(2, j, nin6)
2860 r7 = zin(1, j, nin7)
2861 s7 = zin(2, j, nin7)
2862 r8 = zin(1, j, nin8)
2863 s8 = zin(2, j, nin8)
2864 r = r1 + r5
2865 s = r3 + r7
2866 ap = r + s
2867 am = r - s
2868 r = r2 + r6
2869 s = r4 + r8
2870 bp = r + s
2871 bm = r - s
2872 r = s1 + s5
2873 s = s3 + s7
2874 cp = r + s
2875 cm = r - s
2876 r = s2 + s6
2877 s = s4 + s8
2878 dbl = r + s
2879 dm = r - s
2880 zout(1, j, nout1) = ap + bp
2881 zout(2, j, nout1) = cp + dbl
2882 zout(1, j, nout5) = ap - bp
2883 zout(2, j, nout5) = cp - dbl
2884 zout(1, j, nout3) = am - dm
2885 zout(2, j, nout3) = cm + bm
2886 zout(1, j, nout7) = am + dm
2887 zout(2, j, nout7) = cm - bm
2888 r = r1 - r5
2889 s = -s3 + s7
2890 ap = r + s
2891 am = r - s
2892 r = s1 - s5
2893 s = r7 - r3
2894 bp = r + s
2895 bm = r - s
2896 r = -s4 + s8
2897 s = r2 - r6
2898 cp = r + s
2899 cm = r - s
2900 r = -s2 + s6
2901 s = r4 - r8
2902 dbl = r + s
2903 dm = r - s
2904 r = (cp + dm)*rt2i
2905 s = (cp - dm)*rt2i
2906 cp = (cm + dbl)*rt2i
2907 dbl = (-cm + dbl)*rt2i
2908 zout(1, j, nout2) = ap + r
2909 zout(2, j, nout2) = bm + s
2910 zout(1, j, nout6) = ap - r
2911 zout(2, j, nout6) = bm - s
2912 zout(1, j, nout4) = am + cp
2913 zout(2, j, nout4) = bp + dbl
2914 zout(1, j, nout8) = am - cp
2915 zout(2, j, nout8) = bp - dbl
2916 END DO
2917 END DO
2918 END IF
2919 ELSE IF (now == 3) THEN
2920 bbs = isign*bb
2921 ia = 1
2922 nin1 = ia - after
2923 nout1 = ia - atn
2924 DO ib = 1, before
2925 nin1 = nin1 + after
2926 nin2 = nin1 + atb
2927 nin3 = nin2 + atb
2928 nout1 = nout1 + atn
2929 nout2 = nout1 + after
2930 nout3 = nout2 + after
2931 DO j = 1, nfft
2932 r1 = zin(1, j, nin1)
2933 s1 = zin(2, j, nin1)
2934 r2 = zin(1, j, nin2)
2935 s2 = zin(2, j, nin2)
2936 r3 = zin(1, j, nin3)
2937 s3 = zin(2, j, nin3)
2938 r = r2 + r3
2939 s = s2 + s3
2940 zout(1, j, nout1) = r + r1
2941 zout(2, j, nout1) = s + s1
2942 r1 = r1 - 0.5_dp*r
2943 s1 = s1 - 0.5_dp*s
2944 r2 = bbs*(r2 - r3)
2945 s2 = bbs*(s2 - s3)
2946 zout(1, j, nout2) = r1 - s2
2947 zout(2, j, nout2) = s1 + r2
2948 zout(1, j, nout3) = r1 + s2
2949 zout(2, j, nout3) = s1 - r2
2950 END DO
2951 END DO
2952 DO ia = 2, after
2953 ias = ia - 1
2954 IF (4*ias == 3*after) THEN
2955 IF (isign == 1) THEN
2956 nin1 = ia - after
2957 nout1 = ia - atn
2958 DO ib = 1, before
2959 nin1 = nin1 + after
2960 nin2 = nin1 + atb
2961 nin3 = nin2 + atb
2962 nout1 = nout1 + atn
2963 nout2 = nout1 + after
2964 nout3 = nout2 + after
2965 DO j = 1, nfft
2966 r1 = zin(1, j, nin1)
2967 s1 = zin(2, j, nin1)
2968 r2 = -zin(2, j, nin2)
2969 s2 = zin(1, j, nin2)
2970 r3 = -zin(1, j, nin3)
2971 s3 = -zin(2, j, nin3)
2972 r = r2 + r3
2973 s = s2 + s3
2974 zout(1, j, nout1) = r + r1
2975 zout(2, j, nout1) = s + s1
2976 r1 = r1 - 0.5_dp*r
2977 s1 = s1 - 0.5_dp*s
2978 r2 = bbs*(r2 - r3)
2979 s2 = bbs*(s2 - s3)
2980 zout(1, j, nout2) = r1 - s2
2981 zout(2, j, nout2) = s1 + r2
2982 zout(1, j, nout3) = r1 + s2
2983 zout(2, j, nout3) = s1 - r2
2984 END DO
2985 END DO
2986 ELSE
2987 nin1 = ia - after
2988 nout1 = ia - atn
2989 DO ib = 1, before
2990 nin1 = nin1 + after
2991 nin2 = nin1 + atb
2992 nin3 = nin2 + atb
2993 nout1 = nout1 + atn
2994 nout2 = nout1 + after
2995 nout3 = nout2 + after
2996 DO j = 1, nfft
2997 r1 = zin(1, j, nin1)
2998 s1 = zin(2, j, nin1)
2999 r2 = zin(2, j, nin2)
3000 s2 = -zin(1, j, nin2)
3001 r3 = -zin(1, j, nin3)
3002 s3 = -zin(2, j, nin3)
3003 r = r2 + r3
3004 s = s2 + s3
3005 zout(1, j, nout1) = r + r1
3006 zout(2, j, nout1) = s + s1
3007 r1 = r1 - 0.5_dp*r
3008 s1 = s1 - 0.5_dp*s
3009 r2 = bbs*(r2 - r3)
3010 s2 = bbs*(s2 - s3)
3011 zout(1, j, nout2) = r1 - s2
3012 zout(2, j, nout2) = s1 + r2
3013 zout(1, j, nout3) = r1 + s2
3014 zout(2, j, nout3) = s1 - r2
3015 END DO
3016 END DO
3017 END IF
3018 ELSE IF (8*ias == 3*after) THEN
3019 IF (isign == 1) THEN
3020 nin1 = ia - after
3021 nout1 = ia - atn
3022 DO ib = 1, before
3023 nin1 = nin1 + after
3024 nin2 = nin1 + atb
3025 nin3 = nin2 + atb
3026 nout1 = nout1 + atn
3027 nout2 = nout1 + after
3028 nout3 = nout2 + after
3029 DO j = 1, nfft
3030 r1 = zin(1, j, nin1)
3031 s1 = zin(2, j, nin1)
3032 r = zin(1, j, nin2)
3033 s = zin(2, j, nin2)
3034 r2 = (r - s)*rt2i
3035 s2 = (r + s)*rt2i
3036 r3 = -zin(2, j, nin3)
3037 s3 = zin(1, j, nin3)
3038 r = r2 + r3
3039 s = s2 + s3
3040 zout(1, j, nout1) = r + r1
3041 zout(2, j, nout1) = s + s1
3042 r1 = r1 - 0.5_dp*r
3043 s1 = s1 - 0.5_dp*s
3044 r2 = bbs*(r2 - r3)
3045 s2 = bbs*(s2 - s3)
3046 zout(1, j, nout2) = r1 - s2
3047 zout(2, j, nout2) = s1 + r2
3048 zout(1, j, nout3) = r1 + s2
3049 zout(2, j, nout3) = s1 - r2
3050 END DO
3051 END DO
3052 ELSE
3053 nin1 = ia - after
3054 nout1 = ia - atn
3055 DO ib = 1, before
3056 nin1 = nin1 + after
3057 nin2 = nin1 + atb
3058 nin3 = nin2 + atb
3059 nout1 = nout1 + atn
3060 nout2 = nout1 + after
3061 nout3 = nout2 + after
3062 DO j = 1, nfft
3063 r1 = zin(1, j, nin1)
3064 s1 = zin(2, j, nin1)
3065 r = zin(1, j, nin2)
3066 s = zin(2, j, nin2)
3067 r2 = (r + s)*rt2i
3068 s2 = (-r + s)*rt2i
3069 r3 = zin(2, j, nin3)
3070 s3 = -zin(1, j, nin3)
3071 r = r2 + r3
3072 s = s2 + s3
3073 zout(1, j, nout1) = r + r1
3074 zout(2, j, nout1) = s + s1
3075 r1 = r1 - 0.5_dp*r
3076 s1 = s1 - 0.5_dp*s
3077 r2 = bbs*(r2 - r3)
3078 s2 = bbs*(s2 - s3)
3079 zout(1, j, nout2) = r1 - s2
3080 zout(2, j, nout2) = s1 + r2
3081 zout(1, j, nout3) = r1 + s2
3082 zout(2, j, nout3) = s1 - r2
3083 END DO
3084 END DO
3085 END IF
3086 ELSE
3087 itt = ias*before
3088 itrig = itt + 1
3089 cr2 = trig(1, itrig)
3090 ci2 = trig(2, itrig)
3091 itrig = itrig + itt
3092 cr3 = trig(1, itrig)
3093 ci3 = trig(2, itrig)
3094 nin1 = ia - after
3095 nout1 = ia - atn
3096 DO ib = 1, before
3097 nin1 = nin1 + after
3098 nin2 = nin1 + atb
3099 nin3 = nin2 + atb
3100 nout1 = nout1 + atn
3101 nout2 = nout1 + after
3102 nout3 = nout2 + after
3103 DO j = 1, nfft
3104 r1 = zin(1, j, nin1)
3105 s1 = zin(2, j, nin1)
3106 r = zin(1, j, nin2)
3107 s = zin(2, j, nin2)
3108 r2 = r*cr2 - s*ci2
3109 s2 = r*ci2 + s*cr2
3110 r = zin(1, j, nin3)
3111 s = zin(2, j, nin3)
3112 r3 = r*cr3 - s*ci3
3113 s3 = r*ci3 + s*cr3
3114 r = r2 + r3
3115 s = s2 + s3
3116 zout(1, j, nout1) = r + r1
3117 zout(2, j, nout1) = s + s1
3118 r1 = r1 - 0.5_dp*r
3119 s1 = s1 - 0.5_dp*s
3120 r2 = bbs*(r2 - r3)
3121 s2 = bbs*(s2 - s3)
3122 zout(1, j, nout2) = r1 - s2
3123 zout(2, j, nout2) = s1 + r2
3124 zout(1, j, nout3) = r1 + s2
3125 zout(2, j, nout3) = s1 - r2
3126 END DO
3127 END DO
3128 END IF
3129 END DO
3130 ELSE IF (now == 5) THEN
3131 sin2 = isign*sin2p
3132 sin4 = isign*sin4p
3133 ia = 1
3134 nin1 = ia - after
3135 nout1 = ia - atn
3136 DO ib = 1, before
3137 nin1 = nin1 + after
3138 nin2 = nin1 + atb
3139 nin3 = nin2 + atb
3140 nin4 = nin3 + atb
3141 nin5 = nin4 + atb
3142 nout1 = nout1 + atn
3143 nout2 = nout1 + after
3144 nout3 = nout2 + after
3145 nout4 = nout3 + after
3146 nout5 = nout4 + after
3147 DO j = 1, nfft
3148 r1 = zin(1, j, nin1)
3149 s1 = zin(2, j, nin1)
3150 r2 = zin(1, j, nin2)
3151 s2 = zin(2, j, nin2)
3152 r3 = zin(1, j, nin3)
3153 s3 = zin(2, j, nin3)
3154 r4 = zin(1, j, nin4)
3155 s4 = zin(2, j, nin4)
3156 r5 = zin(1, j, nin5)
3157 s5 = zin(2, j, nin5)
3158 r25 = r2 + r5
3159 r34 = r3 + r4
3160 s25 = s2 - s5
3161 s34 = s3 - s4
3162 zout(1, j, nout1) = r1 + r25 + r34
3163 r = cos2*r25 + cos4*r34 + r1
3164 s = sin2*s25 + sin4*s34
3165 zout(1, j, nout2) = r - s
3166 zout(1, j, nout5) = r + s
3167 r = cos4*r25 + cos2*r34 + r1
3168 s = sin4*s25 - sin2*s34
3169 zout(1, j, nout3) = r - s
3170 zout(1, j, nout4) = r + s
3171 r25 = r2 - r5
3172 r34 = r3 - r4
3173 s25 = s2 + s5
3174 s34 = s3 + s4
3175 zout(2, j, nout1) = s1 + s25 + s34
3176 r = cos2*s25 + cos4*s34 + s1
3177 s = sin2*r25 + sin4*r34
3178 zout(2, j, nout2) = r + s
3179 zout(2, j, nout5) = r - s
3180 r = cos4*s25 + cos2*s34 + s1
3181 s = sin4*r25 - sin2*r34
3182 zout(2, j, nout3) = r + s
3183 zout(2, j, nout4) = r - s
3184 END DO
3185 END DO
3186 DO ia = 2, after
3187 ias = ia - 1
3188 IF (8*ias == 5*after) THEN
3189 IF (isign == 1) THEN
3190 nin1 = ia - after
3191 nout1 = ia - atn
3192 DO ib = 1, before
3193 nin1 = nin1 + after
3194 nin2 = nin1 + atb
3195 nin3 = nin2 + atb
3196 nin4 = nin3 + atb
3197 nin5 = nin4 + atb
3198 nout1 = nout1 + atn
3199 nout2 = nout1 + after
3200 nout3 = nout2 + after
3201 nout4 = nout3 + after
3202 nout5 = nout4 + after
3203 DO j = 1, nfft
3204 r1 = zin(1, j, nin1)
3205 s1 = zin(2, j, nin1)
3206 r = zin(1, j, nin2)
3207 s = zin(2, j, nin2)
3208 r2 = (r - s)*rt2i
3209 s2 = (r + s)*rt2i
3210 r3 = -zin(2, j, nin3)
3211 s3 = zin(1, j, nin3)
3212 r = zin(1, j, nin4)
3213 s = zin(2, j, nin4)
3214 r4 = -(r + s)*rt2i
3215 s4 = (r - s)*rt2i
3216 r5 = -zin(1, j, nin5)
3217 s5 = -zin(2, j, nin5)
3218 r25 = r2 + r5
3219 r34 = r3 + r4
3220 s25 = s2 - s5
3221 s34 = s3 - s4
3222 zout(1, j, nout1) = r1 + r25 + r34
3223 r = cos2*r25 + cos4*r34 + r1
3224 s = sin2*s25 + sin4*s34
3225 zout(1, j, nout2) = r - s
3226 zout(1, j, nout5) = r + s
3227 r = cos4*r25 + cos2*r34 + r1
3228 s = sin4*s25 - sin2*s34
3229 zout(1, j, nout3) = r - s
3230 zout(1, j, nout4) = r + s
3231 r25 = r2 - r5
3232 r34 = r3 - r4
3233 s25 = s2 + s5
3234 s34 = s3 + s4
3235 zout(2, j, nout1) = s1 + s25 + s34
3236 r = cos2*s25 + cos4*s34 + s1
3237 s = sin2*r25 + sin4*r34
3238 zout(2, j, nout2) = r + s
3239 zout(2, j, nout5) = r - s
3240 r = cos4*s25 + cos2*s34 + s1
3241 s = sin4*r25 - sin2*r34
3242 zout(2, j, nout3) = r + s
3243 zout(2, j, nout4) = r - s
3244 END DO
3245 END DO
3246 ELSE
3247 nin1 = ia - after
3248 nout1 = ia - atn
3249 DO ib = 1, before
3250 nin1 = nin1 + after
3251 nin2 = nin1 + atb
3252 nin3 = nin2 + atb
3253 nin4 = nin3 + atb
3254 nin5 = nin4 + atb
3255 nout1 = nout1 + atn
3256 nout2 = nout1 + after
3257 nout3 = nout2 + after
3258 nout4 = nout3 + after
3259 nout5 = nout4 + after
3260 DO j = 1, nfft
3261 r1 = zin(1, j, nin1)
3262 s1 = zin(2, j, nin1)
3263 r = zin(1, j, nin2)
3264 s = zin(2, j, nin2)
3265 r2 = (r + s)*rt2i
3266 s2 = (-r + s)*rt2i
3267 r3 = zin(2, j, nin3)
3268 s3 = -zin(1, j, nin3)
3269 r = zin(1, j, nin4)
3270 s = zin(2, j, nin4)
3271 r4 = (s - r)*rt2i
3272 s4 = -(r + s)*rt2i
3273 r5 = -zin(1, j, nin5)
3274 s5 = -zin(2, j, nin5)
3275 r25 = r2 + r5
3276 r34 = r3 + r4
3277 s25 = s2 - s5
3278 s34 = s3 - s4
3279 zout(1, j, nout1) = r1 + r25 + r34
3280 r = cos2*r25 + cos4*r34 + r1
3281 s = sin2*s25 + sin4*s34
3282 zout(1, j, nout2) = r - s
3283 zout(1, j, nout5) = r + s
3284 r = cos4*r25 + cos2*r34 + r1
3285 s = sin4*s25 - sin2*s34
3286 zout(1, j, nout3) = r - s
3287 zout(1, j, nout4) = r + s
3288 r25 = r2 - r5
3289 r34 = r3 - r4
3290 s25 = s2 + s5
3291 s34 = s3 + s4
3292 zout(2, j, nout1) = s1 + s25 + s34
3293 r = cos2*s25 + cos4*s34 + s1
3294 s = sin2*r25 + sin4*r34
3295 zout(2, j, nout2) = r + s
3296 zout(2, j, nout5) = r - s
3297 r = cos4*s25 + cos2*s34 + s1
3298 s = sin4*r25 - sin2*r34
3299 zout(2, j, nout3) = r + s
3300 zout(2, j, nout4) = r - s
3301 END DO
3302 END DO
3303 END IF
3304 ELSE
3305 ias = ia - 1
3306 itt = ias*before
3307 itrig = itt + 1
3308 cr2 = trig(1, itrig)
3309 ci2 = trig(2, itrig)
3310 itrig = itrig + itt
3311 cr3 = trig(1, itrig)
3312 ci3 = trig(2, itrig)
3313 itrig = itrig + itt
3314 cr4 = trig(1, itrig)
3315 ci4 = trig(2, itrig)
3316 itrig = itrig + itt
3317 cr5 = trig(1, itrig)
3318 ci5 = trig(2, itrig)
3319 nin1 = ia - after
3320 nout1 = ia - atn
3321 DO ib = 1, before
3322 nin1 = nin1 + after
3323 nin2 = nin1 + atb
3324 nin3 = nin2 + atb
3325 nin4 = nin3 + atb
3326 nin5 = nin4 + atb
3327 nout1 = nout1 + atn
3328 nout2 = nout1 + after
3329 nout3 = nout2 + after
3330 nout4 = nout3 + after
3331 nout5 = nout4 + after
3332 DO j = 1, nfft
3333 r1 = zin(1, j, nin1)
3334 s1 = zin(2, j, nin1)
3335 r = zin(1, j, nin2)
3336 s = zin(2, j, nin2)
3337 r2 = r*cr2 - s*ci2
3338 s2 = r*ci2 + s*cr2
3339 r = zin(1, j, nin3)
3340 s = zin(2, j, nin3)
3341 r3 = r*cr3 - s*ci3
3342 s3 = r*ci3 + s*cr3
3343 r = zin(1, j, nin4)
3344 s = zin(2, j, nin4)
3345 r4 = r*cr4 - s*ci4
3346 s4 = r*ci4 + s*cr4
3347 r = zin(1, j, nin5)
3348 s = zin(2, j, nin5)
3349 r5 = r*cr5 - s*ci5
3350 s5 = r*ci5 + s*cr5
3351 r25 = r2 + r5
3352 r34 = r3 + r4
3353 s25 = s2 - s5
3354 s34 = s3 - s4
3355 zout(1, j, nout1) = r1 + r25 + r34
3356 r = cos2*r25 + cos4*r34 + r1
3357 s = sin2*s25 + sin4*s34
3358 zout(1, j, nout2) = r - s
3359 zout(1, j, nout5) = r + s
3360 r = cos4*r25 + cos2*r34 + r1
3361 s = sin4*s25 - sin2*s34
3362 zout(1, j, nout3) = r - s
3363 zout(1, j, nout4) = r + s
3364 r25 = r2 - r5
3365 r34 = r3 - r4
3366 s25 = s2 + s5
3367 s34 = s3 + s4
3368 zout(2, j, nout1) = s1 + s25 + s34
3369 r = cos2*s25 + cos4*s34 + s1
3370 s = sin2*r25 + sin4*r34
3371 zout(2, j, nout2) = r + s
3372 zout(2, j, nout5) = r - s
3373 r = cos4*s25 + cos2*s34 + s1
3374 s = sin4*r25 - sin2*r34
3375 zout(2, j, nout3) = r + s
3376 zout(2, j, nout4) = r - s
3377 END DO
3378 END DO
3379 END IF
3380 END DO
3381 ELSE IF (now == 6) THEN
3382 bbs = isign*bb
3383 ia = 1
3384 nin1 = ia - after
3385 nout1 = ia - atn
3386 DO ib = 1, before
3387 nin1 = nin1 + after
3388 nin2 = nin1 + atb
3389 nin3 = nin2 + atb
3390 nin4 = nin3 + atb
3391 nin5 = nin4 + atb
3392 nin6 = nin5 + atb
3393 nout1 = nout1 + atn
3394 nout2 = nout1 + after
3395 nout3 = nout2 + after
3396 nout4 = nout3 + after
3397 nout5 = nout4 + after
3398 nout6 = nout5 + after
3399 DO j = 1, nfft
3400 r2 = zin(1, j, nin3)
3401 s2 = zin(2, j, nin3)
3402 r3 = zin(1, j, nin5)
3403 s3 = zin(2, j, nin5)
3404 r = r2 + r3
3405 s = s2 + s3
3406 r1 = zin(1, j, nin1)
3407 s1 = zin(2, j, nin1)
3408 ur1 = r + r1
3409 ui1 = s + s1
3410 r1 = r1 - 0.5_dp*r
3411 s1 = s1 - 0.5_dp*s
3412 r = r2 - r3
3413 s = s2 - s3
3414 ur2 = r1 - s*bbs
3415 ui2 = s1 + r*bbs
3416 ur3 = r1 + s*bbs
3417 ui3 = s1 - r*bbs
3418
3419 r2 = zin(1, j, nin6)
3420 s2 = zin(2, j, nin6)
3421 r3 = zin(1, j, nin2)
3422 s3 = zin(2, j, nin2)
3423 r = r2 + r3
3424 s = s2 + s3
3425 r1 = zin(1, j, nin4)
3426 s1 = zin(2, j, nin4)
3427 vr1 = r + r1
3428 vi1 = s + s1
3429 r1 = r1 - 0.5_dp*r
3430 s1 = s1 - 0.5_dp*s
3431 r = r2 - r3
3432 s = s2 - s3
3433 vr2 = r1 - s*bbs
3434 vi2 = s1 + r*bbs
3435 vr3 = r1 + s*bbs
3436 vi3 = s1 - r*bbs
3437
3438 zout(1, j, nout1) = ur1 + vr1
3439 zout(2, j, nout1) = ui1 + vi1
3440 zout(1, j, nout5) = ur2 + vr2
3441 zout(2, j, nout5) = ui2 + vi2
3442 zout(1, j, nout3) = ur3 + vr3
3443 zout(2, j, nout3) = ui3 + vi3
3444 zout(1, j, nout4) = ur1 - vr1
3445 zout(2, j, nout4) = ui1 - vi1
3446 zout(1, j, nout2) = ur2 - vr2
3447 zout(2, j, nout2) = ui2 - vi2
3448 zout(1, j, nout6) = ur3 - vr3
3449 zout(2, j, nout6) = ui3 - vi3
3450 END DO
3451 END DO
3452 ELSE
3453 cpabort('Error fftstp')
3454 END IF
3455
3456!-----------------------------------------------------------------------------!
3457
3458 END SUBROUTINE fftstp
3459
3460!-----------------------------------------------------------------------------!
3461!-----------------------------------------------------------------------------!
3462! Copyright (C) Stefan Goedecker, Lausanne, Switzerland, August 1, 1991
3463! Copyright (C) Stefan Goedecker, Cornell University, Ithaca, USA, 1994
3464! Copyright (C) Stefan Goedecker, MPI Stuttgart, Germany, 1999
3465! This file is distributed under the terms of the
3466! GNU General Public License version 2 (or later),
3467! see http://www.gnu.org/copyleft/gpl.txt .
3468!-----------------------------------------------------------------------------!
3469! S. Goedecker: Rotating a three-dimensional array in optimal
3470! positions for vector processing: Case study for a three-dimensional Fast
3471! Fourier Transform, Comp. Phys. Commun. 76, 294 (1993)
3472! **************************************************************************************************
3473!> \brief ...
3474!> \param n ...
3475!> \param trig ...
3476!> \param after ...
3477!> \param before ...
3478!> \param now ...
3479!> \param isign ...
3480!> \param ic ...
3481! **************************************************************************************************
3482 SUBROUTINE ctrig(n, trig, after, before, now, isign, ic)
3483 INTEGER, INTENT(IN) :: n
3484 REAL(dp), DIMENSION(2, ctrig_length), INTENT(OUT) :: trig
3485 INTEGER, DIMENSION(7), INTENT(OUT) :: after, before, now
3486 INTEGER, INTENT(IN) :: isign
3487 INTEGER, INTENT(OUT) :: ic
3488
3489 INTEGER, PARAMETER :: nt = 82
3490 INTEGER, DIMENSION(7, nt), PARAMETER :: idata = reshape((/3, 3, 1, 1, 1, 1, 1, 4, 4, 1, 1, 1,&
3491 1, 1, 5, 5, 1, 1, 1, 1, 1, 6, 6, 1, 1, 1, 1, 1, 8, 8, 1, 1, 1, 1, 1, 9, 3, 3, 1, 1, 1, 1, &
3492 12, 4, 3, 1, 1, 1, 1, 15, 5, 3, 1, 1, 1, 1, 16, 4, 4, 1, 1, 1, 1, 18, 6, 3, 1, 1, 1, 1, 20&
3493 , 5, 4, 1, 1, 1, 1, 24, 8, 3, 1, 1, 1, 1, 25, 5, 5, 1, 1, 1, 1, 27, 3, 3, 3, 1, 1, 1, 30, &
3494 6, 5, 1, 1, 1, 1, 32, 8, 4, 1, 1, 1, 1, 36, 4, 3, 3, 1, 1, 1, 40, 8, 5, 1, 1, 1, 1, 45, 5 &
3495 , 3, 3, 1, 1, 1, 48, 4, 4, 3, 1, 1, 1, 54, 6, 3, 3, 1, 1, 1, 60, 5, 4, 3, 1, 1, 1, 64, 4, &
3496 4, 4, 1, 1, 1, 72, 8, 3, 3, 1, 1, 1, 75, 5, 5, 3, 1, 1, 1, 80, 5, 4, 4, 1, 1, 1, 81, 3, 3 &
3497 , 3, 3, 1, 1, 90, 6, 5, 3, 1, 1, 1, 96, 8, 4, 3, 1, 1, 1, 100, 5, 5, 4, 1, 1, 1, 108, 4, 3&
3498 , 3, 3, 1, 1, 120, 8, 5, 3, 1, 1, 1, 125, 5, 5, 5, 1, 1, 1, 128, 8, 4, 4, 1, 1, 1, 135, 5 &
3499 , 3, 3, 3, 1, 1, 144, 4, 4, 3, 3, 1, 1, 150, 6, 5, 5, 1, 1, 1, 160, 8, 5, 4, 1, 1, 1, 162,&
3500 6, 3, 3, 3, 1, 1, 180, 5, 4, 3, 3, 1, 1, 192, 4, 4, 4, 3, 1, 1, 200, 8, 5, 5, 1, 1, 1, 216&
3501 , 8, 3, 3, 3, 1, 1, 225, 5, 5, 3, 3, 1, 1, 240, 5, 4, 4, 3, 1, 1, 243, 3, 3, 3, 3, 3, 1, &
3502 256, 4, 4, 4, 4, 1, 1, 270, 6, 5, 3, 3, 1, 1, 288, 8, 4, 3, 3, 1, 1, 300, 5, 5, 4, 3, 1, 1&
3503 , 320, 5, 4, 4, 4, 1, 1, 324, 4, 3, 3, 3, 3, 1, 360, 8, 5, 3, 3, 1, 1, 375, 5, 5, 5, 3, 1,&
3504 1, 384, 8, 4, 4, 3, 1, 1, 400, 5, 5, 4, 4, 1, 1, 405, 5, 3, 3, 3, 3, 1, 432, 4, 4, 3, 3, 3&
3505 , 1, 450, 6, 5, 5, 3, 1, 1, 480, 8, 5, 4, 3, 1, 1, 486, 6, 3, 3, 3, 3, 1, 500, 5, 5, 5, 4,&
3506 1, 1, 512, 8, 4, 4, 4, 1, 1, 540, 5, 4, 3, 3, 3, 1, 576, 4, 4, 4, 3, 3, 1, 600, 8, 5, 5, 3&
3507 , 1, 1, 625, 5, 5, 5, 5, 1, 1, 640, 8, 5, 4, 4, 1, 1, 648, 8, 3, 3, 3, 3, 1, 675, 5, 5, 3,&
3508 3, 3, 1, 720, 5, 4, 4, 3, 3, 1, 729, 3, 3, 3, 3, 3, 3, 750, 6, 5, 5, 5, 1, 1, 768, 4, 4, 4&
3509 , 4, 3, 1, 800, 8, 5, 5, 4, 1, 1, 810, 6, 5, 3, 3, 3, 1, 864, 8, 4, 3, 3, 3, 1, 900, 5, 5,&
3510 4, 3, 3, 1, 960, 5, 4, 4, 4, 3, 1, 972, 4, 3, 3, 3, 3, 3, 1000, 8, 5, 5, 5, 1, 1, &
3511 ctrig_length, 4, 4, 4, 4, 4, 1/), (/7, nt/))
3512
3513 INTEGER :: i, itt, j
3514 REAL(dp) :: angle, twopi
3515
3516 mloop: DO i = 1, nt
3517 IF (n == idata(1, i)) THEN
3518 ic = 0
3519 DO j = 1, 6
3520 itt = idata(1 + j, i)
3521 IF (itt > 1) THEN
3522 ic = ic + 1
3523 now(j) = idata(1 + j, i)
3524 ELSE
3525 EXIT mloop
3526 END IF
3527 END DO
3528 EXIT mloop
3529 END IF
3530 IF (i == nt) THEN
3531 WRITE (*, '(A,i5,A)') " Value of ", n, &
3532 " not allowed for fft, allowed values are:"
3533 WRITE (*, '(15i5)') (idata(1, j), j=1, nt)
3534 cpabort('ctrig')
3535 END IF
3536 END DO mloop
3537
3538 after(1) = 1
3539 before(ic) = 1
3540 DO i = 2, ic
3541 after(i) = after(i - 1)*now(i - 1)
3542 before(ic - i + 1) = before(ic - i + 2)*now(ic - i + 2)
3543 END DO
3544
3545 twopi = 8._dp*atan(1._dp)
3546 angle = isign*twopi/real(n, dp)
3547 trig(1, 1) = 1._dp
3548 trig(2, 1) = 0._dp
3549 DO i = 1, n - 1
3550 trig(1, i + 1) = cos(real(i, dp)*angle)
3551 trig(2, i + 1) = sin(real(i, dp)*angle)
3552 END DO
3553
3554 END SUBROUTINE ctrig
3555
3556! **************************************************************************************************
3557!> \brief ...
3558!> \param n ...
3559!> \param m ...
3560!> \param a ...
3561!> \param lda ...
3562!> \param b ...
3563!> \param ldb ...
3564! **************************************************************************************************
3565 SUBROUTINE matmov(n, m, a, lda, b, ldb)
3566 INTEGER :: n, m, lda
3567 COMPLEX(dp) :: a(lda, *)
3568 INTEGER :: ldb
3569 COMPLEX(dp) :: b(ldb, *)
3570
3571 b(1:n, 1:m) = a(1:n, 1:m)
3572 END SUBROUTINE matmov
3573
3574! **************************************************************************************************
3575!> \brief ...
3576!> \param a ...
3577!> \param lda ...
3578!> \param m ...
3579!> \param n ...
3580!> \param b ...
3581!> \param ldb ...
3582! **************************************************************************************************
3583 SUBROUTINE zgetmo(a, lda, m, n, b, ldb)
3584 INTEGER :: lda, m, n
3585 COMPLEX(dp) :: a(lda, n)
3586 INTEGER :: ldb
3587 COMPLEX(dp) :: b(ldb, m)
3588
3589 b(1:n, 1:m) = transpose(a(1:m, 1:n))
3590 END SUBROUTINE zgetmo
3591
3592! **************************************************************************************************
3593!> \brief ...
3594!> \param n ...
3595!> \param sc ...
3596!> \param a ...
3597! **************************************************************************************************
3598 SUBROUTINE scaled(n, sc, a)
3599 INTEGER :: n
3600 REAL(dp) :: sc
3601 COMPLEX(dp) :: a(n)
3602
3603 CALL dscal(n, sc, a, 1)
3604
3605 END SUBROUTINE scaled
3606
3607END MODULE mltfftsg_tools
Defines the basic variable types.
Definition fft_kinds.F:13
integer, parameter, public dp
Definition fft_kinds.F:18
subroutine, public mltfftsg(transa, transb, a, ldax, lday, b, ldbx, ldby, n, m, isign, scale)
...