1dedccee8SHong Zhang /* 2dedccee8SHong Zhang Provides an interface to the FFT packages. 3dedccee8SHong Zhang */ 4dedccee8SHong Zhang 5c6db04a5SJed Brown #include <../src/mat/impls/fft/fft.h> /*I "petscmat.h" I*/ 6dedccee8SHong Zhang 7dedccee8SHong Zhang PetscErrorCode MatDestroy_FFT(Mat A) 8dedccee8SHong Zhang { 9dedccee8SHong Zhang Mat_FFT *fft = (Mat_FFT*)A->data; 10dedccee8SHong Zhang 11dedccee8SHong Zhang PetscFunctionBegin; 12*5f80ce2aSJacob Faibussowitsch if (fft->matdestroy) CHKERRQ((fft->matdestroy)(A)); 13*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree(fft->dim)); 14*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree(A->data)); 15*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectChangeTypeName((PetscObject)A,NULL)); 16dedccee8SHong Zhang PetscFunctionReturn(0); 17dedccee8SHong Zhang } 18dedccee8SHong Zhang 190a9977b2SMatthew G. Knepley /*@C 20dedccee8SHong Zhang MatCreateFFT - Creates a matrix object that provides FFT via an external package 21dedccee8SHong Zhang 22d083f849SBarry Smith Collective 23dedccee8SHong Zhang 24d8d19677SJose E. Roman Input Parameters: 25dedccee8SHong Zhang + comm - MPI communicator 26dedccee8SHong Zhang . ndim - the ndim-dimensional transform 27dedccee8SHong Zhang . dim - array of size ndim, dim[i] contains the vector length in the i-dimension 2875f45d78SBarry Smith - type - package type, e.g., FFTW or MATSEQCUFFT 29dedccee8SHong Zhang 30dedccee8SHong Zhang Output Parameter: 31dedccee8SHong Zhang . A - the matrix 32dedccee8SHong Zhang 33dedccee8SHong Zhang Options Database Keys: 3475f45d78SBarry Smith . -mat_fft_type - set FFT type fft or seqcufft 3575f45d78SBarry Smith 3675f45d78SBarry Smith Note: this serves as a base class for all FFT marix classes, currently MATFFTW or MATSEQCUFFT 37dedccee8SHong Zhang 38dedccee8SHong Zhang Level: intermediate 39dedccee8SHong Zhang 405e4d437fSMatthew Knepley .seealso: MatCreateVecsFFTW() 41dedccee8SHong Zhang @*/ 4219fd82e9SBarry Smith PetscErrorCode MatCreateFFT(MPI_Comm comm,PetscInt ndim,const PetscInt dim[],MatType mattype,Mat *A) 43dedccee8SHong Zhang { 44dedccee8SHong Zhang PetscErrorCode ierr; 45dedccee8SHong Zhang PetscMPIInt size; 46dedccee8SHong Zhang Mat FFT; 47dedccee8SHong Zhang PetscInt N,i; 48dedccee8SHong Zhang Mat_FFT *fft; 49dedccee8SHong Zhang 50dedccee8SHong Zhang PetscFunctionBegin; 51c0aa6a63SJacob Faibussowitsch PetscValidIntPointer(dim,3); 52c0aa6a63SJacob Faibussowitsch PetscValidPointer(A,5); 53*5f80ce2aSJacob Faibussowitsch PetscCheck(ndim >= 1,comm,PETSC_ERR_USER,"ndim %" PetscInt_FMT " must be > 0",ndim); 54*5f80ce2aSJacob Faibussowitsch CHKERRMPI(MPI_Comm_size(comm, &size)); 55dedccee8SHong Zhang 56*5f80ce2aSJacob Faibussowitsch CHKERRQ(MatCreate(comm,&FFT)); 57*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscNewLog(FFT,&fft)); 58dedccee8SHong Zhang FFT->data = (void*)fft; 59dedccee8SHong Zhang N = 1; 60dedccee8SHong Zhang for (i=0; i<ndim; i++) { 61*5f80ce2aSJacob Faibussowitsch PetscCheck(dim[i] >= 1,PETSC_COMM_SELF,PETSC_ERR_USER,"dim[%" PetscInt_FMT "]=%" PetscInt_FMT " must be > 0",i,dim[i]); 62dedccee8SHong Zhang N *= dim[i]; 63dedccee8SHong Zhang } 64dedccee8SHong Zhang 65*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscMalloc1(ndim,&fft->dim)); 66*5f80ce2aSJacob Faibussowitsch CHKERRQ(PetscArraycpy(fft->dim,dim,ndim)); 67dedccee8SHong Zhang 68dedccee8SHong Zhang fft->ndim = ndim; 69dedccee8SHong Zhang fft->n = PETSC_DECIDE; 70dedccee8SHong Zhang fft->N = N; 710298fd71SBarry Smith fft->data = NULL; 72dedccee8SHong Zhang 73*5f80ce2aSJacob Faibussowitsch CHKERRQ(MatSetType(FFT,mattype)); 7426fbe8dcSKarl Rupp 75dedccee8SHong Zhang FFT->ops->destroy = MatDestroy_FFT; 76dedccee8SHong Zhang 77*5f80ce2aSJacob Faibussowitsch /* get runtime options... what options? */ 78*5f80ce2aSJacob Faibussowitsch ierr = PetscObjectOptionsBegin((PetscObject)FFT);CHKERRQ(ierr); 79*5f80ce2aSJacob Faibussowitsch ierr = PetscOptionsEnd();CHKERRQ(ierr); 80dedccee8SHong Zhang 81dedccee8SHong Zhang *A = FFT; 82dedccee8SHong Zhang PetscFunctionReturn(0); 83dedccee8SHong Zhang } 84