[petsc-users] Efficient FFTShift-implementation for vectors/matrices
Barry Smith
bsmith at petsc.dev
Tue May 18 11:44:36 CDT 2021
I found a variety of things on the web, below. I don't understand this but for the even case it seems one simply modifies the input matrix before the FFT http://www.fftw.org/faq/section3.html#centerorigin
https://stackoverflow.com/questions/5915125/fftshift-ifftshift-c-c-source-code <https://stackoverflow.com/questions/5915125/fftshift-ifftshift-c-c-source-code>
https://www.dsprelated.com/showthread/comp.dsp/20790-1.php <https://www.dsprelated.com/showthread/comp.dsp/20790-1.php>
> On May 18, 2021, at 9:48 AM, Roland Richter <roland.richter at ntnu.no> wrote:
>
> Dear all,
>
> I tried to implement the function fftshift from numpy (i.e. swap the
> half-spaces of all axis) for row vectors in a matrix by using the
> following code
>
> void fft_shift(Mat &fft_matrix) {
> PetscScalar *mat_ptr;
> MatDenseGetArray (fft_matrix, &mat_ptr);
> PetscInt r_0, r_1;
> MatGetOwnershipRange(fft_matrix, &r_0, &r_1);
> PetscInt local_row_num = r_1 - r_0;
> arma::cx_mat temp_mat(local_row_num, Ntime, arma::fill::zeros);
> for(int i = 0; i < Ntime; ++i) {
> const PetscInt row_shift = i * local_row_num;
> for(int j = 0; j < local_row_num; ++j) {
> const PetscInt cur_pos = j + row_shift;
> if(i < (int)(Ntime / 2))
> temp_mat(j, i + int(Ntime / 2)) = *(mat_ptr + cur_pos);
> else
> temp_mat(j, i - int(Ntime / 2)) = *(mat_ptr + cur_pos);
> }
> }
> for(int i = 0; i < Ntime; ++i) {
> const PetscInt row_shift = i * local_row_num;
> for(int j = 0; j < local_row_num; ++j) {
> const PetscInt cur_pos = j + row_shift;
> *(mat_ptr + cur_pos) = temp_mat(j, i);
> }
> }
> MatDenseRestoreArray (fft_matrix, &mat_ptr);
> }
>
> but I do not like the approach of having a second matrix as temporary
> storage space. Are there more efficient approaches possible using
> PETSc-functions?
>
> Thanks!
>
> Regards,
>
> Roland Richter
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.mcs.anl.gov/pipermail/petsc-users/attachments/20210518/b8710455/attachment.html>
More information about the petsc-users
mailing list