1 2 /* 3 Provides an interface to the FFT packages. 4 */ 5 6 #include <../src/mat/impls/fft/fft.h> /*I "petscmat.h" I*/ 7 8 PetscErrorCode MatDestroy_FFT(Mat A) 9 { 10 PetscErrorCode ierr; 11 Mat_FFT *fft = (Mat_FFT*)A->data; 12 13 PetscFunctionBegin; 14 if (fft->matdestroy) { 15 ierr = (fft->matdestroy)(A);CHKERRQ(ierr); 16 } 17 ierr = PetscFree(fft->dim);CHKERRQ(ierr); 18 ierr = PetscFree(A->data);CHKERRQ(ierr); 19 ierr = PetscObjectChangeTypeName((PetscObject)A,0);CHKERRQ(ierr); 20 PetscFunctionReturn(0); 21 } 22 23 /*@C 24 MatCreateFFT - Creates a matrix object that provides FFT via an external package 25 26 Collective 27 28 Input Parameter: 29 + comm - MPI communicator 30 . ndim - the ndim-dimensional transform 31 . dim - array of size ndim, dim[i] contains the vector length in the i-dimension 32 - type - package type, e.g., FFTW or MATSEQCUFFT 33 34 Output Parameter: 35 . A - the matrix 36 37 Options Database Keys: 38 . -mat_fft_type - set FFT type fft or seqcufft 39 40 Note: this serves as a base class for all FFT marix classes, currently MATFFTW or MATSEQCUFFT 41 42 Level: intermediate 43 44 @*/ 45 PetscErrorCode MatCreateFFT(MPI_Comm comm,PetscInt ndim,const PetscInt dim[],MatType mattype,Mat *A) 46 { 47 PetscErrorCode ierr; 48 PetscMPIInt size; 49 Mat FFT; 50 PetscInt N,i; 51 Mat_FFT *fft; 52 53 PetscFunctionBegin; 54 if (ndim < 1) SETERRQ1(comm,PETSC_ERR_USER,"ndim %d must be > 0",ndim); 55 ierr = MPI_Comm_size(comm, &size);CHKERRQ(ierr); 56 57 ierr = MatCreate(comm,&FFT);CHKERRQ(ierr); 58 ierr = PetscNewLog(FFT,&fft);CHKERRQ(ierr); 59 FFT->data = (void*)fft; 60 N = 1; 61 for (i=0; i<ndim; i++) { 62 if (dim[i] < 1) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_USER,"dim[%d]=%d must be > 0",i,dim[i]); 63 N *= dim[i]; 64 } 65 66 ierr = PetscMalloc1(ndim,&fft->dim);CHKERRQ(ierr); 67 ierr = PetscArraycpy(fft->dim,dim,ndim);CHKERRQ(ierr); 68 69 fft->ndim = ndim; 70 fft->n = PETSC_DECIDE; 71 fft->N = N; 72 fft->data = NULL; 73 74 ierr = MatSetType(FFT,mattype);CHKERRQ(ierr); 75 76 FFT->ops->destroy = MatDestroy_FFT; 77 78 /* get runtime options */ 79 ierr = PetscOptionsBegin(PetscObjectComm((PetscObject)FFT),((PetscObject)FFT)->prefix,"FFT Options","Mat");CHKERRQ(ierr); 80 PetscOptionsEnd(); 81 82 *A = FFT; 83 PetscFunctionReturn(0); 84 } 85