PFASST++
fft.hpp
Go to the documentation of this file.
1 
6 #ifndef _EXAMPLES__ADVEC_DIFF__FFT_HPP_
7 #define _EXAMPLES__ADVEC_DIFF__FFT_HPP_
8 
9 #include <map>
10 #include <memory>
11 #include <cstddef>
12 
13 #include <pfasst/encap/vector.hpp>
15 
16 #include <fftw3.h>
17 
18 
19 namespace pfasst
20 {
21  namespace examples
22  {
23  namespace advection_diffusion
24  {
32  class FFT
33  {
34  struct workspace {
35  fftw_plan ffft;
36  fftw_plan ifft;
37  fftw_complex* wk;
38  complex<double>* z;
39  };
40 
41  map<size_t, shared_ptr<workspace>> workspaces;
42 
43  public:
44  ~FFT()
45  {
46  for (auto& x : workspaces) {
47  shared_ptr<workspace> wk = std::get<1>(x);
48  fftw_free(wk->wk);
49  fftw_destroy_plan(wk->ffft);
50  fftw_destroy_plan(wk->ifft);
51  }
52  workspaces.clear();
53  }
54 
55  shared_ptr<workspace> get_workspace(size_t ndofs)
56  {
57  if (workspaces.find(ndofs) == workspaces.end()) {
58  shared_ptr<workspace> wk = make_shared<workspace>();
59  wk->wk = fftw_alloc_complex(ndofs);
60  wk->ffft = fftw_plan_dft_1d(ndofs, wk->wk, wk->wk, FFTW_FORWARD, FFTW_ESTIMATE);
61  wk->ifft = fftw_plan_dft_1d(ndofs, wk->wk, wk->wk, FFTW_BACKWARD, FFTW_ESTIMATE);
62  wk->z = reinterpret_cast<complex<double>*>(wk->wk);
63  workspaces.insert(pair<size_t, shared_ptr<workspace>>(ndofs, wk));
64  }
65 
66  return workspaces[ndofs];
67  }
68 
69  complex<double>* forward(const DVectorT& x)
70  {
71  shared_ptr<workspace> wk = get_workspace(x.size());
72  for (size_t i = 0; i < x.size(); i++) {
73  wk->z[i] = x[i];
74  }
75  fftw_execute_dft(wk->ffft, wk->wk, wk->wk);
76  return wk->z;
77  }
78 
79  void backward(DVectorT& x)
80  {
81  shared_ptr<workspace> wk = get_workspace(x.size());
82  fftw_execute_dft(wk->ifft, wk->wk, wk->wk);
83  for (size_t i = 0; i < x.size(); i++) {
84  x[i] = real(wk->z[i]);
85  }
86  }
87  };
88  } // ::pfasst::examples::advection_diffusion
89  } // ::pfasst::examples
90 } // ::pfasst
91 
92 #endif // _EXAMPLES__ADVEC_DIFF__FFT_HPP_
shared_ptr< workspace > get_workspace(size_t ndofs)
Definition: fft.hpp:55
pfasst::encap::VectorEncapsulation< double > DVectorT
Definition: fft.hpp:14
complex< double > * forward(const DVectorT &x)
Definition: fft.hpp:69
map< size_t, shared_ptr< workspace > > workspaces
Definition: fft.hpp:41