xref: /petsc/src/mat/impls/fft/fft.c (revision a623e290c7eaa252b385564179837fe27521fbac)
1 /*
2     Provides an interface to the FFT packages.
3 */
4 
5 #include <../src/mat/impls/fft/fft.h> /*I "petscmat.h" I*/
6 
MatDestroy_FFT(Mat A)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 /*@
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 @*/
MatCreateFFT(MPI_Comm comm,PetscInt ndim,const PetscInt dim[],MatType mattype,Mat * A)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