98 SUBROUTINE multi_fft(time_series, value_series, result_series, omega_series, &
99 damping_opt, t0_opt, subtract_initial_opt)
100 REAL(kind=
dp),
DIMENSION(:) :: time_series
101 COMPLEX(kind=dp),
DIMENSION(:, :) :: value_series
102 COMPLEX(kind=dp),
ALLOCATABLE,
DIMENSION(:, :) :: result_series
103 REAL(kind=
dp),
DIMENSION(:),
OPTIONAL :: omega_series
104 REAL(kind=
dp),
OPTIONAL :: damping_opt, t0_opt
105 LOGICAL,
OPTIONAL :: subtract_initial_opt
107 CHARACTER(len=*),
PARAMETER :: routinen =
'multi_fft'
109 COMPLEX(kind=dp) :: subtract_value
110 COMPLEX(kind=dp),
CONTIGUOUS,
DIMENSION(:), &
111 POINTER :: ft_samples, samples, samples_input
112 INTEGER :: handle, i, i0, j, nsamples, nseries, stat
113 LOGICAL :: subtract_initial
114 REAL(kind=
dp) :: damping, t0, t_total
122 IF (
PRESENT(t0_opt)) t0 = t0_opt
125 DO i = 1,
SIZE(time_series)
126 IF (time_series(i) >= t0)
THEN
132 nsamples =
SIZE(time_series) - i0 + 1
134 t_total = time_series(
SIZE(time_series)) - time_series(i0)
136 damping = 4.0_dp/(t_total)
138 IF (
PRESENT(damping_opt))
THEN
139 IF (damping_opt > 0.0_dp)
THEN
140 damping = 1.0_dp/damping_opt
141 ELSE IF (damping_opt == 0.0_dp)
THEN
147 subtract_initial = .true.
148 subtract_value = 0.0_dp
149 IF (
PRESENT(subtract_initial_opt)) subtract_initial = subtract_initial_opt
152 nseries =
SIZE(value_series, 1)
154 IF (nsamples /=
SIZE(result_series, 2))
THEN
155 DEALLOCATE (result_series)
156 ALLOCATE (result_series(nseries, nsamples), source=cmplx(0.0, 0.0, kind=
dp))
160 IF (
PRESENT(omega_series))
THEN
161 CALL fft_freqs(nsamples, t_total, omega_series, fft_ordering_opt=.false.)
166 CALL timeset(routinen, handle)
168 NULLIFY (samples_input)
170 CALL fft_alloc(samples, [nsamples*nseries])
171 CALL fft_alloc(samples_input, [nsamples*nseries])
172 CALL fft_alloc(ft_samples, [nsamples*nseries])
177 IF (subtract_initial)
THEN
178 subtract_value = value_series(i, 1)
180 samples_input(j + (i - 1)*nsamples) = value_series(i, i0 + j - 1) - subtract_value
182 samples_input(j + (i - 1)*nsamples) = samples_input(j + (i - 1)*nsamples)* &
183 exp(-damping*(time_series(i0 + j - 1) - time_series(i0)))
190 CALL fft_1dm(
fft_plan, samples_input, ft_samples, time_series(2) - time_series(1), stat)
196 IF (subtract_initial)
THEN
197 subtract_value = value_series(i, 1)
199 CALL ft_simple(time_series(i0:
SIZE(time_series)), &
200 value_series(i, i0:
SIZE(value_series, 2)), result_series(i, 1:nsamples), &
201 damping, subtract_value)
206 CALL fft_shift(ft_samples((i - 1)*nsamples + 1:i*nsamples))
207 result_series(i, :) = ft_samples((i - 1)*nsamples + 1:i*nsamples)
211 CALL fft_dealloc(samples)
212 CALL fft_dealloc(ft_samples)
213 CALL fft_dealloc(samples_input)
215 CALL timestop(handle)
subroutine, public fft_create_plan_1dm(plan, fft_type, fsign, trans, n, m, zin, zout, plan_style)
...
subroutine, public multi_fft(time_series, value_series, result_series, omega_series, damping_opt, t0_opt, subtract_initial_opt)
Calculates the Fourier transform - couples to FFT libraries in CP2K, if available.