isce3 0.25.0
Loading...
Searching...
No Matches
FFTPlanBase.icc
1#ifndef ISCE_FFT_DETAIL_FFTPLANBASE_ICC
2#error "FFTPlanBase.icc is an implementation detail of FFTPlanBase.h"
3#endif
4
5#include <isce3/except/Error.h>
6
7namespace isce3 { namespace fft { namespace detail {
8
9template<int Sign, typename T>
10inline
11FFTPlanBase<Sign, T>::FFTPlanBase()
12:
13 _plan(std::make_shared<fftw_plan_t>())
14{}
15
16template<int Sign, typename T>
17inline
18FFTPlanBase<Sign, T>::FFTPlanBase(std::complex<T> * out,
19 std::complex<T> * in,
20 int n,
21 int batch,
22 unsigned flags,
23 int threads)
24:
25 FFTPlanBase(out, in, &n, &n, 1, n, &n, 1, n, batch, flags, 1, Sign, threads)
26{}
27
28template<int Sign, typename T>
29template<int Rank>
30inline
31FFTPlanBase<Sign, T>::FFTPlanBase(std::complex<T> * out,
32 std::complex<T> * in,
33 const int (&n)[Rank],
34 int batch,
35 unsigned flags,
36 int threads)
37:
38 FFTPlanBase(out, in, n, n, 1, product(n), n, 1, product(n), batch, flags, Rank, Sign, threads)
39{}
40
41template<int Sign, typename T>
42inline
43FFTPlanBase<Sign, T>::FFTPlanBase(std::complex<T> * out,
44 std::complex<T> * in,
45 int n,
46 int nembed,
47 int stride,
48 int dist,
49 int batch,
50 unsigned flags,
51 int threads)
52:
53 FFTPlanBase(out, in, &n, &nembed, stride, dist, &nembed, stride, dist, batch, flags, 1, Sign, threads)
54{}
55
56template<int Sign, typename T>
57template<int Rank>
58inline
59FFTPlanBase<Sign, T>::FFTPlanBase(std::complex<T> * out,
60 std::complex<T> * in,
61 const int (&n)[Rank],
62 const int (&nembed)[Rank],
63 int stride,
64 int dist,
65 int batch,
66 unsigned flags,
67 int threads)
68:
69 FFTPlanBase(out, in, n, nembed, stride, dist, nembed, stride, dist, batch, flags, Rank, Sign, threads)
70{}
71
72template<int Sign, typename T>
73inline
74FFTPlanBase<Sign, T>::FFTPlanBase(std::complex<T> * out,
75 std::complex<T> * in,
76 int n,
77 int inembed,
78 int istride,
79 int idist,
80 int onembed,
81 int ostride,
82 int odist,
83 int batch,
84 unsigned flags,
85 int threads)
86:
87 FFTPlanBase(out, in, &n, &inembed, istride, idist, &onembed, ostride, odist, batch, flags, 1, Sign, threads)
88{}
89
90template<int Sign, typename T>
91template<int Rank>
92inline
93FFTPlanBase<Sign, T>::FFTPlanBase(std::complex<T> * out,
94 std::complex<T> * in,
95 const int (&n)[Rank],
96 const int (&inembed)[Rank],
97 int istride,
98 int idist,
99 const int (&onembed)[Rank],
100 int ostride,
101 int odist,
102 int batch,
103 unsigned flags,
104 int threads)
105:
106 FFTPlanBase(out, in, n, inembed, istride, idist, onembed, ostride, odist, batch, flags, Rank, Sign, threads)
107{}
108
109template<int Sign, typename T>
110inline
111void FFTPlanBase<Sign, T>::execute() const
112{
113 executePlan(*_plan);
114}
115
116template<int Sign, typename T>
117template<typename U, typename V>
118FFTPlanBase<Sign, T>::FFTPlanBase(U * out,
119 V * in,
120 const int * n,
121 const int * inembed,
122 int istride,
123 int idist,
124 const int * onembed,
125 int ostride,
126 int odist,
127 int batch,
128 unsigned flags,
129 int rank,
130 int sign,
131 int threads)
132{
133 // construct shared pointer with custom deleter to destroy the plan
134 _plan = std::shared_ptr<fftw_plan_t>(new fftw_plan_t,
135 [](fftw_plan_t * plan) noexcept {
136 destroyPlan(*plan);
137 delete plan;
138 });
139
140 // create plan
141 *_plan = initPlan(rank, n, batch, in, inembed, istride, idist, out, onembed, ostride, odist, sign, flags, threads);
142
143 // make sure plan creation was successful
144 if (!(*_plan)) {
145 throw isce3::except::RuntimeError(ISCE_SRCINFO(), "FFT plan creation failed");
146 }
147}
148
149template<int N>
150inline
151int product(const int (&arr)[N])
152{
153 int prod = 1;
154 for (auto x : arr) { prod *= x; }
155 return prod;
156}
157
158}}}
base interpolator is an abstract base class
Definition BinarySearchFunc.cpp:5

Generated for ISCE3.0 by doxygen 1.13.2.