-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathminifftw.h
80 lines (63 loc) · 2.15 KB
/
minifftw.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
/*
* Copyright 2020, 2021 Philipp Stanner, <[email protected]>
*
* This file is part of Minifftw.
* Minifftw is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Minifftw is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
* You should have received a copy of the GNU General Public License
* along with Minifftw. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef MINIFFTW
#define MINIFFTW
#define PY_SSIZE_T_CLEAN
#include <Python.h>
#include <stdbool.h>
/*
* Importing complex.h /before/ any fftw header enforces full binary compatiblity
* between fftw-complex and C-complex.
* According to the numpy docu
* https://numpy.org/doc/stable/user/basics.types.html?highlight=complex128
* this is identical to numpy-complex128 which allows us to easily convert
* between the types, without iterating over huge arrays.
*/
#include <complex.h>
#ifdef MFFTW_MPI
#include <fftw3-mpi.h>
#else
#include <fftw3.h>
#endif /* MFFTW_MPI */
#define MFFTW_REAL 0
#define MFFTW_IMAG 1
struct array_meta {
ptrdiff_t local;
ptrdiff_t local_ni, local_i_start;
ptrdiff_t local_no, local_o_start;
};
struct mfftw_mpi_info {
int rank;
int nr_of_procs;
struct array_meta *arrmeta;
};
struct mfftw_plan {
Py_ssize_t data_len;
fftw_plan plan;
PyArrayObject *in_arr, *out_arr;
struct mfftw_mpi_info *info;
};
PyObject *
mfftw_encapsulate_plan(fftw_plan, PyArrayObject*, PyArrayObject*,
struct mfftw_mpi_info *);
struct mfftw_plan* mfftw_unwrap_capsule(PyObject *);
void mfftw_data_from_npy_to_fftw(PyArrayObject *, fftw_complex *, Py_ssize_t);
void mfftw_data_from_fftw_to_npy(PyArrayObject *, fftw_complex *, Py_ssize_t);
long long check_array_and_get_length(PyArrayObject *);
fftw_complex* reinterpret_numpy_to_fftw_arr(PyArrayObject *np);
char** check_get_str_array(PyObject *, int);
#endif /* MINIFFTW */