File indexing completed on 2024-05-18 08:29:51
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047 #ifndef FFTW3_H
0048 #define FFTW3_H
0049
0050 #include <stdio.h>
0051
0052 #ifdef __cplusplus
0053 extern "C"
0054 {
0055 #endif
0056
0057
0058
0059 #if !defined(FFTW_NO_Complex) && defined(_Complex_I) && defined(complex) && defined(I)
0060 # define FFTW_DEFINE_COMPLEX(R, C) typedef R _Complex C
0061 #else
0062 # define FFTW_DEFINE_COMPLEX(R, C) typedef R C[2]
0063 #endif
0064
0065 #define FFTW_CONCAT(prefix, name) prefix ## name
0066 #define FFTW_MANGLE_DOUBLE(name) FFTW_CONCAT(fftw_, name)
0067 #define FFTW_MANGLE_FLOAT(name) FFTW_CONCAT(fftwf_, name)
0068 #define FFTW_MANGLE_LONG_DOUBLE(name) FFTW_CONCAT(fftwl_, name)
0069 #define FFTW_MANGLE_QUAD(name) FFTW_CONCAT(fftwq_, name)
0070
0071
0072
0073
0074
0075
0076
0077
0078 #if defined(FFTW_DLL) && (defined(_WIN32) || defined(__WIN32__))
0079
0080 # if defined(COMPILING_FFTW)
0081 # define FFTW_EXTERN extern __declspec(dllexport)
0082 # else
0083 # define FFTW_EXTERN extern __declspec(dllimport)
0084 # endif
0085 #else
0086 # define FFTW_EXTERN extern
0087 #endif
0088
0089
0090 #if defined(_WIN32) || defined(__WIN32__)
0091 # define FFTW_CDECL __cdecl
0092 #else
0093 # define FFTW_CDECL
0094 #endif
0095
0096 enum fftw_r2r_kind_do_not_use_me {
0097 FFTW_R2HC=0, FFTW_HC2R=1, FFTW_DHT=2,
0098 FFTW_REDFT00=3, FFTW_REDFT01=4, FFTW_REDFT10=5, FFTW_REDFT11=6,
0099 FFTW_RODFT00=7, FFTW_RODFT01=8, FFTW_RODFT10=9, FFTW_RODFT11=10
0100 };
0101
0102 struct fftw_iodim_do_not_use_me {
0103 int n;
0104 int is;
0105 int os;
0106 };
0107
0108 #include <stddef.h> /* for ptrdiff_t */
0109 struct fftw_iodim64_do_not_use_me {
0110 ptrdiff_t n;
0111 ptrdiff_t is;
0112 ptrdiff_t os;
0113 };
0114
0115 typedef void (FFTW_CDECL *fftw_write_char_func_do_not_use_me)(char c, void *);
0116 typedef int (FFTW_CDECL *fftw_read_char_func_do_not_use_me)(void *);
0117
0118
0119
0120
0121
0122
0123
0124
0125
0126
0127 #define FFTW_DEFINE_API(X, R, C) \
0128 \
0129 FFTW_DEFINE_COMPLEX(R, C); \
0130 \
0131 typedef struct X(plan_s) *X(plan); \
0132 \
0133 typedef struct fftw_iodim_do_not_use_me X(iodim); \
0134 typedef struct fftw_iodim64_do_not_use_me X(iodim64); \
0135 \
0136 typedef enum fftw_r2r_kind_do_not_use_me X(r2r_kind); \
0137 \
0138 typedef fftw_write_char_func_do_not_use_me X(write_char_func); \
0139 typedef fftw_read_char_func_do_not_use_me X(read_char_func); \
0140 \
0141 FFTW_EXTERN void \
0142 FFTW_CDECL X(execute)(const X(plan) p); \
0143 \
0144 FFTW_EXTERN X(plan) \
0145 FFTW_CDECL X(plan_dft)(int rank, const int *n, \
0146 C *in, C *out, int sign, unsigned flags); \
0147 \
0148 FFTW_EXTERN X(plan) \
0149 FFTW_CDECL X(plan_dft_1d)(int n, C *in, C *out, int sign, \
0150 unsigned flags); \
0151 FFTW_EXTERN X(plan) \
0152 FFTW_CDECL X(plan_dft_2d)(int n0, int n1, \
0153 C *in, C *out, int sign, unsigned flags); \
0154 FFTW_EXTERN X(plan) \
0155 FFTW_CDECL X(plan_dft_3d)(int n0, int n1, int n2, \
0156 C *in, C *out, int sign, unsigned flags); \
0157 \
0158 FFTW_EXTERN X(plan) \
0159 FFTW_CDECL X(plan_many_dft)(int rank, const int *n, \
0160 int howmany, \
0161 C *in, const int *inembed, \
0162 int istride, int idist, \
0163 C *out, const int *onembed, \
0164 int ostride, int odist, \
0165 int sign, unsigned flags); \
0166 \
0167 FFTW_EXTERN X(plan) \
0168 FFTW_CDECL X(plan_guru_dft)(int rank, const X(iodim) *dims, \
0169 int howmany_rank, \
0170 const X(iodim) *howmany_dims, \
0171 C *in, C *out, \
0172 int sign, unsigned flags); \
0173 FFTW_EXTERN X(plan) \
0174 FFTW_CDECL X(plan_guru_split_dft)(int rank, const X(iodim) *dims, \
0175 int howmany_rank, \
0176 const X(iodim) *howmany_dims, \
0177 R *ri, R *ii, R *ro, R *io, \
0178 unsigned flags); \
0179 \
0180 FFTW_EXTERN X(plan) \
0181 FFTW_CDECL X(plan_guru64_dft)(int rank, \
0182 const X(iodim64) *dims, \
0183 int howmany_rank, \
0184 const X(iodim64) *howmany_dims, \
0185 C *in, C *out, \
0186 int sign, unsigned flags); \
0187 FFTW_EXTERN X(plan) \
0188 FFTW_CDECL X(plan_guru64_split_dft)(int rank, \
0189 const X(iodim64) *dims, \
0190 int howmany_rank, \
0191 const X(iodim64) *howmany_dims, \
0192 R *ri, R *ii, R *ro, R *io, \
0193 unsigned flags); \
0194 \
0195 FFTW_EXTERN void \
0196 FFTW_CDECL X(execute_dft)(const X(plan) p, C *in, C *out); \
0197 \
0198 FFTW_EXTERN void \
0199 FFTW_CDECL X(execute_split_dft)(const X(plan) p, R *ri, R *ii, \
0200 R *ro, R *io); \
0201 \
0202 FFTW_EXTERN X(plan) \
0203 FFTW_CDECL X(plan_many_dft_r2c)(int rank, const int *n, \
0204 int howmany, \
0205 R *in, const int *inembed, \
0206 int istride, int idist, \
0207 C *out, const int *onembed, \
0208 int ostride, int odist, \
0209 unsigned flags); \
0210 \
0211 FFTW_EXTERN X(plan) \
0212 FFTW_CDECL X(plan_dft_r2c)(int rank, const int *n, \
0213 R *in, C *out, unsigned flags); \
0214 \
0215 FFTW_EXTERN X(plan) \
0216 FFTW_CDECL X(plan_dft_r2c_1d)(int n,R *in,C *out,unsigned flags); \
0217 \
0218 FFTW_EXTERN X(plan) \
0219 FFTW_CDECL X(plan_dft_r2c_2d)(int n0, int n1, \
0220 R *in, C *out, unsigned flags); \
0221 \
0222 FFTW_EXTERN X(plan) \
0223 FFTW_CDECL X(plan_dft_r2c_3d)(int n0, int n1, \
0224 int n2, \
0225 R *in, C *out, unsigned flags); \
0226 \
0227 FFTW_EXTERN X(plan) \
0228 FFTW_CDECL X(plan_many_dft_c2r)(int rank, const int *n, \
0229 int howmany, \
0230 C *in, const int *inembed, \
0231 int istride, int idist, \
0232 R *out, const int *onembed, \
0233 int ostride, int odist, \
0234 unsigned flags); \
0235 \
0236 FFTW_EXTERN X(plan) \
0237 FFTW_CDECL X(plan_dft_c2r)(int rank, const int *n, \
0238 C *in, R *out, unsigned flags); \
0239 \
0240 FFTW_EXTERN X(plan) \
0241 FFTW_CDECL X(plan_dft_c2r_1d)(int n,C *in,R *out,unsigned flags); \
0242 \
0243 FFTW_EXTERN X(plan) \
0244 FFTW_CDECL X(plan_dft_c2r_2d)(int n0, int n1, \
0245 C *in, R *out, unsigned flags); \
0246 \
0247 FFTW_EXTERN X(plan) \
0248 FFTW_CDECL X(plan_dft_c2r_3d)(int n0, int n1, \
0249 int n2, \
0250 C *in, R *out, unsigned flags); \
0251 \
0252 FFTW_EXTERN X(plan) \
0253 FFTW_CDECL X(plan_guru_dft_r2c)(int rank, const X(iodim) *dims, \
0254 int howmany_rank, \
0255 const X(iodim) *howmany_dims, \
0256 R *in, C *out, \
0257 unsigned flags); \
0258 \
0259 FFTW_EXTERN X(plan) \
0260 FFTW_CDECL X(plan_guru_dft_c2r)(int rank, const X(iodim) *dims, \
0261 int howmany_rank, \
0262 const X(iodim) *howmany_dims, \
0263 C *in, R *out, \
0264 unsigned flags); \
0265 \
0266 FFTW_EXTERN X(plan) \
0267 FFTW_CDECL X(plan_guru_split_dft_r2c)(int rank, const X(iodim) *dims, \
0268 int howmany_rank, \
0269 const X(iodim) *howmany_dims, \
0270 R *in, R *ro, R *io, \
0271 unsigned flags); \
0272 \
0273 FFTW_EXTERN X(plan) \
0274 FFTW_CDECL X(plan_guru_split_dft_c2r)(int rank, const X(iodim) *dims, \
0275 int howmany_rank, \
0276 const X(iodim) *howmany_dims, \
0277 R *ri, R *ii, R *out, \
0278 unsigned flags); \
0279 \
0280 FFTW_EXTERN X(plan) \
0281 FFTW_CDECL X(plan_guru64_dft_r2c)(int rank, \
0282 const X(iodim64) *dims, \
0283 int howmany_rank, \
0284 const X(iodim64) *howmany_dims, \
0285 R *in, C *out, \
0286 unsigned flags); \
0287 \
0288 FFTW_EXTERN X(plan) \
0289 FFTW_CDECL X(plan_guru64_dft_c2r)(int rank, \
0290 const X(iodim64) *dims, \
0291 int howmany_rank, \
0292 const X(iodim64) *howmany_dims, \
0293 C *in, R *out, \
0294 unsigned flags); \
0295 \
0296 FFTW_EXTERN X(plan) \
0297 FFTW_CDECL X(plan_guru64_split_dft_r2c)(int rank, const X(iodim64) *dims, \
0298 int howmany_rank, \
0299 const X(iodim64) *howmany_dims, \
0300 R *in, R *ro, R *io, \
0301 unsigned flags); \
0302 FFTW_EXTERN X(plan) \
0303 FFTW_CDECL X(plan_guru64_split_dft_c2r)(int rank, const X(iodim64) *dims, \
0304 int howmany_rank, \
0305 const X(iodim64) *howmany_dims, \
0306 R *ri, R *ii, R *out, \
0307 unsigned flags); \
0308 \
0309 FFTW_EXTERN void \
0310 FFTW_CDECL X(execute_dft_r2c)(const X(plan) p, R *in, C *out); \
0311 \
0312 FFTW_EXTERN void \
0313 FFTW_CDECL X(execute_dft_c2r)(const X(plan) p, C *in, R *out); \
0314 \
0315 FFTW_EXTERN void \
0316 FFTW_CDECL X(execute_split_dft_r2c)(const X(plan) p, \
0317 R *in, R *ro, R *io); \
0318 \
0319 FFTW_EXTERN void \
0320 FFTW_CDECL X(execute_split_dft_c2r)(const X(plan) p, \
0321 R *ri, R *ii, R *out); \
0322 \
0323 FFTW_EXTERN X(plan) \
0324 FFTW_CDECL X(plan_many_r2r)(int rank, const int *n, \
0325 int howmany, \
0326 R *in, const int *inembed, \
0327 int istride, int idist, \
0328 R *out, const int *onembed, \
0329 int ostride, int odist, \
0330 const X(r2r_kind) *kind, unsigned flags); \
0331 \
0332 FFTW_EXTERN X(plan) \
0333 FFTW_CDECL X(plan_r2r)(int rank, const int *n, R *in, R *out, \
0334 const X(r2r_kind) *kind, unsigned flags); \
0335 \
0336 FFTW_EXTERN X(plan) \
0337 FFTW_CDECL X(plan_r2r_1d)(int n, R *in, R *out, \
0338 X(r2r_kind) kind, unsigned flags); \
0339 \
0340 FFTW_EXTERN X(plan) \
0341 FFTW_CDECL X(plan_r2r_2d)(int n0, int n1, R *in, R *out, \
0342 X(r2r_kind) kind0, X(r2r_kind) kind1, \
0343 unsigned flags); \
0344 \
0345 FFTW_EXTERN X(plan) \
0346 FFTW_CDECL X(plan_r2r_3d)(int n0, int n1, int n2, \
0347 R *in, R *out, X(r2r_kind) kind0, \
0348 X(r2r_kind) kind1, X(r2r_kind) kind2, \
0349 unsigned flags); \
0350 \
0351 FFTW_EXTERN X(plan) \
0352 FFTW_CDECL X(plan_guru_r2r)(int rank, const X(iodim) *dims, \
0353 int howmany_rank, \
0354 const X(iodim) *howmany_dims, \
0355 R *in, R *out, \
0356 const X(r2r_kind) *kind, unsigned flags); \
0357 \
0358 FFTW_EXTERN X(plan) \
0359 FFTW_CDECL X(plan_guru64_r2r)(int rank, const X(iodim64) *dims, \
0360 int howmany_rank, \
0361 const X(iodim64) *howmany_dims, \
0362 R *in, R *out, \
0363 const X(r2r_kind) *kind, unsigned flags); \
0364 \
0365 FFTW_EXTERN void \
0366 FFTW_CDECL X(execute_r2r)(const X(plan) p, R *in, R *out); \
0367 \
0368 FFTW_EXTERN void \
0369 FFTW_CDECL X(destroy_plan)(X(plan) p); \
0370 \
0371 FFTW_EXTERN void \
0372 FFTW_CDECL X(forget_wisdom)(void); \
0373 FFTW_EXTERN void \
0374 FFTW_CDECL X(cleanup)(void); \
0375 \
0376 FFTW_EXTERN void \
0377 FFTW_CDECL X(set_timelimit)(double t); \
0378 \
0379 FFTW_EXTERN void \
0380 FFTW_CDECL X(plan_with_nthreads)(int nthreads); \
0381 \
0382 FFTW_EXTERN int \
0383 FFTW_CDECL X(planner_nthreads)(void); \
0384 \
0385 FFTW_EXTERN int \
0386 FFTW_CDECL X(init_threads)(void); \
0387 \
0388 FFTW_EXTERN void \
0389 FFTW_CDECL X(cleanup_threads)(void); \
0390 \
0391 FFTW_EXTERN void \
0392 FFTW_CDECL X(threads_set_callback)( \
0393 void (*parallel_loop)(void *(*work)(char *), \
0394 char *jobdata, size_t elsize, int njobs, void *data), void *data); \
0395 \
0396 FFTW_EXTERN void \
0397 FFTW_CDECL X(make_planner_thread_safe)(void); \
0398 \
0399 FFTW_EXTERN int \
0400 FFTW_CDECL X(export_wisdom_to_filename)(const char *filename); \
0401 \
0402 FFTW_EXTERN void \
0403 FFTW_CDECL X(export_wisdom_to_file)(FILE *output_file); \
0404 \
0405 FFTW_EXTERN char * \
0406 FFTW_CDECL X(export_wisdom_to_string)(void); \
0407 \
0408 FFTW_EXTERN void \
0409 FFTW_CDECL X(export_wisdom)(X(write_char_func) write_char, \
0410 void *data); \
0411 FFTW_EXTERN int \
0412 FFTW_CDECL X(import_system_wisdom)(void); \
0413 \
0414 FFTW_EXTERN int \
0415 FFTW_CDECL X(import_wisdom_from_filename)(const char *filename); \
0416 \
0417 FFTW_EXTERN int \
0418 FFTW_CDECL X(import_wisdom_from_file)(FILE *input_file); \
0419 \
0420 FFTW_EXTERN int \
0421 FFTW_CDECL X(import_wisdom_from_string)(const char *input_string); \
0422 \
0423 FFTW_EXTERN int \
0424 FFTW_CDECL X(import_wisdom)(X(read_char_func) read_char, void *data); \
0425 \
0426 FFTW_EXTERN void \
0427 FFTW_CDECL X(fprint_plan)(const X(plan) p, FILE *output_file); \
0428 \
0429 FFTW_EXTERN void \
0430 FFTW_CDECL X(print_plan)(const X(plan) p); \
0431 \
0432 FFTW_EXTERN char * \
0433 FFTW_CDECL X(sprint_plan)(const X(plan) p); \
0434 \
0435 FFTW_EXTERN void * \
0436 FFTW_CDECL X(malloc)(size_t n); \
0437 \
0438 FFTW_EXTERN R * \
0439 FFTW_CDECL X(alloc_real)(size_t n); \
0440 FFTW_EXTERN C * \
0441 FFTW_CDECL X(alloc_complex)(size_t n); \
0442 \
0443 FFTW_EXTERN void \
0444 FFTW_CDECL X(free)(void *p); \
0445 \
0446 FFTW_EXTERN void \
0447 FFTW_CDECL X(flops)(const X(plan) p, \
0448 double *add, double *mul, double *fmas); \
0449 FFTW_EXTERN double \
0450 FFTW_CDECL X(estimate_cost)(const X(plan) p); \
0451 \
0452 FFTW_EXTERN double \
0453 FFTW_CDECL X(cost)(const X(plan) p); \
0454 \
0455 FFTW_EXTERN int \
0456 FFTW_CDECL X(alignment_of)(R *p); \
0457 \
0458 FFTW_EXTERN const char X(version)[]; \
0459 FFTW_EXTERN const char X(cc)[]; \
0460 FFTW_EXTERN const char X(codelet_optim)[];
0461
0462
0463
0464
0465 FFTW_DEFINE_API(FFTW_MANGLE_DOUBLE, double, fftw_complex)
0466 FFTW_DEFINE_API(FFTW_MANGLE_FLOAT, float, fftwf_complex)
0467 FFTW_DEFINE_API(FFTW_MANGLE_LONG_DOUBLE, long double, fftwl_complex)
0468
0469
0470
0471 #if (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) \
0472 && !(defined(__ICC) || defined(__INTEL_COMPILER) || defined(__CUDACC__) || defined(__PGI)) \
0473 && (defined(__i386__) || defined(__x86_64__) || defined(__ia64__))
0474 # if !defined(FFTW_NO_Complex) && defined(_Complex_I) && defined(complex) && defined(I)
0475
0476
0477
0478
0479
0480 # undef FFTW_DEFINE_COMPLEX
0481 # define FFTW_DEFINE_COMPLEX(R, C) typedef _Complex float __attribute__((mode(TC))) C
0482 # endif
0483 FFTW_DEFINE_API(FFTW_MANGLE_QUAD, __float128, fftwq_complex)
0484 #endif
0485
0486 #define FFTW_FORWARD (-1)
0487 #define FFTW_BACKWARD (+1)
0488
0489 #define FFTW_NO_TIMELIMIT (-1.0)
0490
0491
0492 #define FFTW_MEASURE (0U)
0493 #define FFTW_DESTROY_INPUT (1U << 0)
0494 #define FFTW_UNALIGNED (1U << 1)
0495 #define FFTW_CONSERVE_MEMORY (1U << 2)
0496 #define FFTW_EXHAUSTIVE (1U << 3)
0497 #define FFTW_PRESERVE_INPUT (1U << 4)
0498 #define FFTW_PATIENT (1U << 5)
0499 #define FFTW_ESTIMATE (1U << 6)
0500 #define FFTW_WISDOM_ONLY (1U << 21)
0501
0502
0503 #define FFTW_ESTIMATE_PATIENT (1U << 7)
0504 #define FFTW_BELIEVE_PCOST (1U << 8)
0505 #define FFTW_NO_DFT_R2HC (1U << 9)
0506 #define FFTW_NO_NONTHREADED (1U << 10)
0507 #define FFTW_NO_BUFFERING (1U << 11)
0508 #define FFTW_NO_INDIRECT_OP (1U << 12)
0509 #define FFTW_ALLOW_LARGE_GENERIC (1U << 13)
0510 #define FFTW_NO_RANK_SPLITS (1U << 14)
0511 #define FFTW_NO_VRANK_SPLITS (1U << 15)
0512 #define FFTW_NO_VRECURSE (1U << 16)
0513 #define FFTW_NO_SIMD (1U << 17)
0514 #define FFTW_NO_SLOW (1U << 18)
0515 #define FFTW_NO_FIXED_RADIX_LARGE_N (1U << 19)
0516 #define FFTW_ALLOW_PRUNING (1U << 20)
0517
0518 #ifdef __cplusplus
0519 }
0520 #endif
0521
0522 #endif