[1] | 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 |
---|