LMDZ
mod_fft_mkl.F90
Go to the documentation of this file.
1 MODULE mod_fft_mkl
2 #ifdef FFT_MKL
3 
4  USE mkl_dfti
5 
6  REAL,SAVE :: scale_factor
7  INTEGER,SAVE :: vsize
8  INTEGER,PARAMETER :: inc=1
9 
10 ! TYPE FFT_HANDLE
11 ! TYPE(DFTI_DESCRIPTOR), POINTER :: Pt
12 ! LOGICAL :: IsAllocated
13 ! END TYPE FFT_HANDLE
14 
15 ! TYPE(FFT_HANDLE),SAVE,ALLOCATABLE :: Forward_Handle(:)
16 ! TYPE(FFT_HANDLE),SAVE,ALLOCATABLE :: Backward_Handle(:)
17 !!$OMP THREADPRIVATE(Forward_Handle,Backward_Handle)
18 
19 CONTAINS
20 
21  SUBROUTINE init_fft(iim,nb_vect_max)
22  IMPLICIT NONE
23  INTEGER :: iim
24  INTEGER :: nb_vect_max
25  REAL :: rtmp=1.
26  COMPLEX :: ctmp
27  INTEGER :: itmp=1
28  INTEGER :: isign=0
29  INTEGER :: ierr
30 
31  vsize=iim
32  scale_factor=1./sqrt(1.*vsize)
33 ! ALLOCATE(Forward_Handle(nb_vect_max))
34 ! ALLOCATE(Backward_Handle(nb_vect_max))
35 
36 ! Forward_Handle(:)%IsAllocated=.FALSE.
37 ! Backward_Handle(:)%IsAllocated=.FALSE.
38 
39 ! ALLOCATE(Table_forward(2*vsize+64))
40 ! ALLOCATE(Table_backward(2*vsize+64))
41 !
42 ! CALL DZFFTM(isign,vsize,itmp,scale_factor,rtmp,vsize+inc,ctmp,vsize/2+1,table_forward,rtmp,ierr)
43 !
44 ! CALL ZDFFTM(isign,vsize,itmp,scale_factor,ctmp,vsize/2+1,rtmp,vsize+inc,table_backward,rtmp,ierr)
45 
46 ! ierr = DftiCreateDescriptor( FFT_Handle, DFTI_DOUBLE, DFTI_REAL, 1, vsize )
47 ! ierr = DftiSetValue(FFT_Handle,DFTI_NUMBER_OF_TRANSFORMS,nb_vect)
48 ! ierr = DftiSetValue(FFT_Handle,DFTI_FORWARD_SCALE,scale_factor)
49 ! ierr = DftiSetValue(FFT_Handle,DFTI_BACKWARD_SCALE,scale_factor)
50 ! ierr = DftiSetValue(FFT_Handle,DFTI_PLACEMENT,DFTI_NOT_INPLACE)
51 ! ierr = DftiSetValue(Desc_Handle, DFTI_INPUT_DISTANCE, vsize+inc)
52 ! ierr = DftiSetValue(Desc_Handle, DFTI_OUTPUT_DISTANCE, vsize)
53 ! ierr = DftiCommitDescriptor( FFT_HANDLE )
54 
55  END SUBROUTINE init_fft
56 
57 
58  SUBROUTINE fft_forward(vect,TF_vect,nb_vect)
59  IMPLICIT NONE
60  INTEGER,INTENT(IN) :: nb_vect
61  REAL,INTENT(IN) :: vect((vsize+inc)*nb_vect)
62  COMPLEX,INTENT(OUT) :: tf_vect((vsize/2+1)*nb_vect)
63  REAL :: work(4*vsize*nb_vect)
64  INTEGER :: ierr
65  INTEGER, PARAMETER :: isign=-1
66  REAL :: vect_out((vsize+inc)*nb_vect)
67  TYPE(dfti_descriptor), POINTER :: fft_handle
68 
69 ! IF ( .NOT. Forward_handle(nb_vect)%IsAllocated) THEN
70  ierr = dfticreatedescriptor( fft_handle, dfti_double, dfti_real, 1, vsize )
71  ierr = dftisetvalue(fft_handle,dfti_number_of_transforms,nb_vect)
72  ierr = dftisetvalue(fft_handle,dfti_forward_scale,scale_factor)
73  ierr = dftisetvalue(fft_handle,dfti_backward_scale,scale_factor)
74  ierr = dftisetvalue(fft_handle,dfti_placement,dfti_not_inplace)
75  ierr = dftisetvalue(fft_handle, dfti_input_distance, vsize+inc)
76  ierr = dftisetvalue(fft_handle, dfti_output_distance, (vsize/2+1)*2)
77  ierr = dfticommitdescriptor( fft_handle )
78 ! Forward_handle(nb_vect)%IsAllocated=.TRUE.
79 ! ENDIF
80 
81  ierr = dfticomputeforward( fft_handle, vect, tf_vect )
82 
83  ierr = dftifreedescriptor( fft_handle )
84 
85 ! ierr = DftiCreateDescriptor( FFT_Handle, DFTI_DOUBLE, DFTI_REAL, 1, vsize )
86 ! ierr = DftiSetValue(FFT_Handle,DFTI_NUMBER_OF_TRANSFORMS,nb_vect)
87 ! ierr = DftiSetValue(FFT_Handle,DFTI_FORWARD_SCALE,scale_factor)
88 ! ierr = DftiSetValue(FFT_Handle,DFTI_BACKWARD_SCALE,scale_factor)
89 ! ierr = DftiSetValue(FFT_Handle,DFTI_PLACEMENT,DFTI_NOT_INPLACE)
90 ! ierr = DftiSetValue(FFT_HANDLE, DFTI_INPUT_DISTANCE, vsize/2+1)
91 ! ierr = DftiSetValue(FFT_HANDLE, DFTI_OUTPUT_DISTANCE, vsize+inc)
92 ! ierr = DftiCommitDescriptor( FFT_HANDLE )
93 ! ierr = DftiComputeBackward( FFT_HANDLE, TF_vect, vect_out )
94 ! ierr = DftiFreeDescriptor( FFT_HANDLE )
95 
96 ! CALL DZFFTM(isign,vsize,nb_vect,scale_factor,vect,vsize+inc,TF_vect,vsize/2+1,table_forward,work,ierr)
97 
98  END SUBROUTINE fft_forward
99 
100  SUBROUTINE fft_backward(TF_vect,vect,nb_vect)
101  IMPLICIT NONE
102  INTEGER,INTENT(IN) :: nb_vect
103  REAL,INTENT(OUT) :: vect((vsize+inc)*nb_vect)
104  COMPLEX,INTENT(IN ) :: tf_vect((vsize/2+1)*nb_vect)
105  REAL :: work(4*vsize*nb_vect)
106  INTEGER :: ierr
107  INTEGER, PARAMETER :: isign=1
108  TYPE(dfti_descriptor),POINTER :: fft_handle
109 ! CALL ZDFFTM(isign,vsize,nb_vect,scale_factor,TF_vect,vsize/2+1,vect,vsize+inc,table_backward,work,ierr)
110 ! IF ( .NOT. Backward_handle(nb_vect)%IsAllocated) THEN
111  ierr = dfticreatedescriptor( fft_handle, dfti_double, dfti_real, 1, vsize )
112  ierr = dftisetvalue(fft_handle,dfti_number_of_transforms,nb_vect)
113  ierr = dftisetvalue(fft_handle,dfti_forward_scale,scale_factor)
114  ierr = dftisetvalue(fft_handle,dfti_backward_scale,scale_factor)
115  ierr = dftisetvalue(fft_handle,dfti_placement,dfti_not_inplace)
116  ierr = dftisetvalue(fft_handle, dfti_input_distance, (vsize/2+1)*2)
117  ierr = dftisetvalue(fft_handle, dfti_output_distance, vsize+inc)
118  ierr = dfticommitdescriptor( fft_handle )
119 ! Backward_handle(nb_vect)%IsAllocated=.TRUE.
120 ! ENDIF
121  ierr = dfticomputebackward( fft_handle, tf_vect, vect )
122  ierr = dftifreedescriptor( fft_handle)
123 
124  END SUBROUTINE fft_backward
125 
126 #endif
127 
128 END MODULE mod_fft_mkl
c c zjulian c cym CALL iim cym klev iim
Definition: ini_bilKP_ave.h:24