PFASST++
spectral_transfer_1d.hpp
Go to the documentation of this file.
1 
6 #ifndef _EXAMPLES__ADVEC_DIFF__SPECTRAL_TRANSFER_1D_HPP_
7 #define _EXAMPLES__ADVEC_DIFF__SPECTRAL_TRANSFER_1D_HPP_
8 
9 #include <cassert>
10 #include <cstdlib>
11 #include <memory>
12 using namespace std;
13 
14 #include <pfasst/encap/vector.hpp>
16 
17 #include "fft.hpp"
18 
19 
20 namespace pfasst
21 {
22  namespace examples
23  {
24  namespace advection_diffusion
25  {
31  template<typename time = pfasst::time_precision>
33  : public encap::PolyInterpMixin<time>
34  {
36 
38 
39  public:
40  void interpolate(shared_ptr<Encapsulation> dst, shared_ptr<const Encapsulation> src) override
41  {
42  auto& fine = encap::as_vector<double, time>(dst);
43  auto& crse = encap::as_vector<double, time>(src);
44 
45  auto* crse_z = this->fft.forward(crse);
46  auto* fine_z = this->fft.get_workspace(fine.size())->z;
47 
48  for (size_t i = 0; i < fine.size(); i++) {
49  fine_z[i] = 0.0;
50  }
51 
52  double c = 1.0 / crse.size();
53 
54  for (size_t i = 0; i < crse.size() / 2; i++) {
55  fine_z[i] = c * crse_z[i];
56  }
57 
58  for (size_t i = 1; i < crse.size() / 2; i++) {
59  fine_z[fine.size() - crse.size() / 2 + i] = c * crse_z[crse.size() / 2 + i];
60  }
61 
62  this->fft.backward(fine);
63  }
64 
65  void restrict(shared_ptr<Encapsulation> dst, shared_ptr<const Encapsulation> src) override
66  {
67  auto& fine = encap::as_vector<double, time>(src);
68  auto& crse = encap::as_vector<double, time>(dst);
69 
70  size_t xrat = fine.size() / crse.size();
71 
72  for (size_t i = 0; i < crse.size(); i++) {
73  crse[i] = fine[xrat*i];
74  }
75  }
76  };
77  } // ::pfasst::examples::advection_diffusion
78  } // ::pfasst::examples
79 } // ::pfasst
80 
81 #endif // _EXAMPLES__ADVEC_DIFF__SPECTRAL_TRANSFER_1D_HPP_
shared_ptr< workspace > get_workspace(size_t ndofs)
Definition: fft.hpp:55
STL namespace.
complex< double > * forward(const DVectorT &x)
Definition: fft.hpp:69
Polynomial time interpolation mixin.
Definition: poly_interp.hpp:20
Data/solution encapsulation.
void interpolate(shared_ptr< Encapsulation > dst, shared_ptr< const Encapsulation > src) override
void restrict(shared_ptr< Encapsulation > dst, shared_ptr< const Encapsulation > src) override