<html><head><meta http-equiv="Content-Type" content="text/html; charset=us-ascii"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class=""><div class=""> </div><div class="">  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 <a href="http://www.fftw.org/faq/section3.html#centerorigin" class="">http://www.fftw.org/faq/section3.html#centerorigin</a></div><div class=""><br class=""></div>  <a href="https://stackoverflow.com/questions/5915125/fftshift-ifftshift-c-c-source-code" class="">https://stackoverflow.com/questions/5915125/fftshift-ifftshift-c-c-source-code</a><div class=""><br class=""></div><div class="">  <a href="https://www.dsprelated.com/showthread/comp.dsp/20790-1.php" class="">https://www.dsprelated.com/showthread/comp.dsp/20790-1.php</a></div><div class=""><br class=""></div><div class=""><br class=""><div><br class=""><blockquote type="cite" class=""><div class="">On May 18, 2021, at 9:48 AM, Roland Richter <<a href="mailto:roland.richter@ntnu.no" class="">roland.richter@ntnu.no</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><div class="">Dear all,<br class=""><br class="">I tried to implement the function fftshift from numpy (i.e. swap the<br class="">half-spaces of all axis) for row vectors in a matrix by using the<br class="">following code<br class=""><br class="">void fft_shift(Mat &fft_matrix) {<br class="">        PetscScalar *mat_ptr;<br class="">        MatDenseGetArray (fft_matrix, &mat_ptr);<br class="">        PetscInt r_0, r_1;<br class="">        MatGetOwnershipRange(fft_matrix, &r_0, &r_1);<br class="">        PetscInt local_row_num = r_1 - r_0;<br class="">        arma::cx_mat temp_mat(local_row_num, Ntime, arma::fill::zeros);<br class="">        for(int i = 0; i < Ntime; ++i) {<br class="">            const PetscInt row_shift = i * local_row_num;<br class="">            for(int j = 0; j < local_row_num; ++j) {<br class="">                const PetscInt cur_pos = j + row_shift;<br class="">                if(i < (int)(Ntime / 2))<br class="">                    temp_mat(j, i + int(Ntime / 2)) = *(mat_ptr + cur_pos);<br class="">                else<br class="">                    temp_mat(j, i - int(Ntime / 2)) = *(mat_ptr + cur_pos);<br class="">            }<br class="">        }<br class="">        for(int i = 0; i < Ntime; ++i) {<br class="">            const PetscInt row_shift = i * local_row_num;<br class="">            for(int j = 0; j < local_row_num; ++j) {<br class="">                const PetscInt cur_pos = j + row_shift;<br class="">                *(mat_ptr + cur_pos) = temp_mat(j, i);<br class="">            }<br class="">        }<br class="">        MatDenseRestoreArray (fft_matrix, &mat_ptr);<br class="">}<br class=""><br class="">but I do not like the approach of having a second matrix as temporary<br class="">storage space. Are there more efficient approaches possible using<br class="">PETSc-functions?<br class=""><br class="">Thanks!<br class=""><br class="">Regards,<br class=""><br class="">Roland Richter<br class=""><br class=""></div></div></blockquote></div><br class=""></div></body></html>