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