6 #ifndef _EXAMPLES__ADVEC_DIFF__SPECTRAL_TRANSFER_1D_HPP_
7 #define _EXAMPLES__ADVEC_DIFF__SPECTRAL_TRANSFER_1D_HPP_
24 namespace advection_diffusion
31 template<
typename time = pfasst::time_precision>
40 void interpolate(shared_ptr<Encapsulation> dst, shared_ptr<const Encapsulation> src)
override
42 auto& fine = encap::as_vector<double, time>(dst);
43 auto& crse = encap::as_vector<double, time>(src);
45 auto* crse_z = this->fft.
forward(crse);
48 for (
size_t i = 0; i < fine.size(); i++) {
52 double c = 1.0 / crse.size();
54 for (
size_t i = 0; i < crse.size() / 2; i++) {
55 fine_z[i] = c * crse_z[i];
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];
65 void restrict(shared_ptr<Encapsulation> dst, shared_ptr<const Encapsulation> src)
override
67 auto& fine = encap::as_vector<double, time>(src);
68 auto& crse = encap::as_vector<double, time>(dst);
70 size_t xrat = fine.size() / crse.size();
72 for (
size_t i = 0; i < crse.size(); i++) {
73 crse[i] = fine[xrat*i];
81 #endif // _EXAMPLES__ADVEC_DIFF__SPECTRAL_TRANSFER_1D_HPP_
shared_ptr< workspace > get_workspace(size_t ndofs)
encap::Encapsulation< double > Encapsulation
complex< double > * forward(const DVectorT &x)
Polynomial time interpolation mixin.
Spectral (FFT) transfer routines.
Data/solution encapsulation.
void interpolate(shared_ptr< Encapsulation > dst, shared_ptr< const Encapsulation > src) override
void backward(DVectorT &x)
void restrict(shared_ptr< Encapsulation > dst, shared_ptr< const Encapsulation > src) override