@@ -172,6 +172,7 @@ rfft_impl(char **args, npy_intp const *dimensions, npy_intp const *steps,
172
172
auto plan = pocketfft::detail::get_plan<pocketfft::detail::pocketfft_r<T>>(npts);
173
173
auto buffered = (step_out != sizeof (std::complex<T>));
174
174
pocketfft::detail::arr<std::complex<T>> buff (buffered ? nout : 0 );
175
+ auto nin_used = nin <= npts ? nin : npts;
175
176
for (size_t i = 0 ; i < n_outer; i++, ip += si, fp += sf, op += so) {
176
177
std::complex<T> *op_or_buff = buffered ? buff.data () : (std::complex<T> *)op;
177
178
/*
@@ -186,12 +187,9 @@ rfft_impl(char **args, npy_intp const *dimensions, npy_intp const *steps,
186
187
* create I0=0. Note that copy_input will zero the In component for
187
188
* even number of points.
188
189
*/
189
- copy_input (ip, step_in, nin , &((T *)op_or_buff)[1 ], nout*2 - 1 );
190
+ copy_input (ip, step_in, nin_used , &((T *)op_or_buff)[1 ], nout*2 - 1 );
190
191
plan->exec (&((T *)op_or_buff)[1 ], *(T *)fp, pocketfft::FORWARD);
191
192
op_or_buff[0 ] = op_or_buff[0 ].imag (); // I0->R0, I0=0
192
- if (!(npts & 1 )) {
193
- op_or_buff[nout - 1 ].imag (0.0 );
194
- }
195
193
if (buffered) {
196
194
copy_output (op_or_buff, op, step_out, nout);
197
195
}
0 commit comments