-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathvzfft3d.f
81 lines (81 loc) · 2.24 KB
/
vzfft3d.f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
C
C FFTE: A FAST FOURIER TRANSFORM PACKAGE
C
C (C) COPYRIGHT SOFTWARE, 2000-2004, 2008-2011, 2020
C ALL RIGHTS RESERVED
C BY
C DAISUKE TAKAHASHI
C CENTER FOR COMPUTATIONAL SCIENCES
C UNIVERSITY OF TSUKUBA
C 1-1-1 TENNODAI, TSUKUBA, IBARAKI 305-8577, JAPAN
C E-MAIL: daisuke@cs.tsukuba.ac.jp
C
C
C 3-D COMPLEX FFT ROUTINE (FOR VECTOR MACHINES)
C
C FORTRAN90 SOURCE PROGRAM
C
C CALL ZFFT3D(A,NX,NY,NZ,IOPT)
C
C A(NX,NY,NZ) IS COMPLEX INPUT/OUTPUT VECTOR (COMPLEX*16)
C NX IS THE LENGTH OF THE TRANSFORMS IN THE X-DIRECTION (INTEGER*4)
C NY IS THE LENGTH OF THE TRANSFORMS IN THE Y-DIRECTION (INTEGER*4)
C NZ IS THE LENGTH OF THE TRANSFORMS IN THE Z-DIRECTION (INTEGER*4)
C ------------------------------------
C NX = (2**IP) * (3**IQ) * (5**IR)
C NY = (2**JP) * (3**JQ) * (5**JR)
C NZ = (2**KP) * (3**KQ) * (5**KR)
C ------------------------------------
C IOPT = 0 FOR INITIALIZING THE COEFFICIENTS (INTEGER*4)
C = -1 FOR FORWARD TRANSFORM
C = +1 FOR INVERSE TRANSFORM
C
C WRITTEN BY DAISUKE TAKAHASHI
C
SUBROUTINE ZFFT3D(A,NX,NY,NZ,IOPT)
IMPLICIT REAL*8 (A-H,O-Z)
INCLUDE 'param.h'
COMPLEX*16 A(*)
COMPLEX*16 WX(NDA3),WY(NDA3),WZ(NDA3)
COMPLEX*16 B(:)
ALLOCATABLE :: B
!DIR$ ATTRIBUTES ALIGN : 16 :: B
DIMENSION LNX(3),LNY(3),LNZ(3)
SAVE WX,WY,WZ
C
IF (IOPT .EQ. 0) THEN
CALL SETTBL(WX,NX)
CALL SETTBL(WY,NY)
CALL SETTBL(WZ,NZ)
RETURN
END IF
C
IF (IOPT .EQ. 1) THEN
!DIR$ VECTOR ALIGNED
DO 10 I=1,NX*NY*NZ
A(I)=DCONJG(A(I))
10 CONTINUE
END IF
C
CALL FACTOR(NX,LNX)
CALL FACTOR(NY,LNY)
CALL FACTOR(NZ,LNZ)
C
ALLOCATE(B(NX*NY*NZ))
CALL MFFT235A(A,B,WZ,NX*NY,NZ,LNZ)
CALL ZTRANS(A,B,NX*NY,NZ)
CALL MFFT235A(B,A,WY,NZ*NX,NY,LNY)
CALL ZTRANS(B,A,NZ*NX,NY)
CALL MFFT235B(A,B,WX,NY*NZ,NX,LNX)
CALL ZTRANS(B,A,NY*NZ,NX)
DEALLOCATE(B)
C
IF (IOPT .EQ. 1) THEN
DN=1.0D0/(DBLE(NX)*DBLE(NY)*DBLE(NZ))
!DIR$ VECTOR ALIGNED
DO 20 I=1,NX*NY*NZ
A(I)=DCONJG(A(I))*DN
20 CONTINUE
END IF
RETURN
END