15 template<
typename time>
19 template<
typename time>
26 auto crse_factory = crse.get_factory();
27 auto fine_factory = fine.get_factory();
29 auto crse_delta = crse_factory->create(
solution);
30 this->restrict(crse_delta, fine.get_start_state());
31 crse_delta->saxpy(-1.0, crse.get_start_state());
33 auto fine_delta = fine_factory->create(
solution);
34 this->interpolate(fine_delta, crse_delta);
35 fine.get_start_state()->saxpy(-1.0, fine_delta);
37 fine.reevaluate(
true);
40 template<
typename time>
48 if (tmat.rows() == 0) {
49 tmat = pfasst::quadrature::compute_interp<time>(fine.get_nodes(), crse.get_nodes());
53 this->interpolate_initial(dst, src);
56 size_t nfine = fine.get_nodes().size();
57 size_t ncrse = crse.get_nodes().size();
59 auto crse_factory = crse.get_factory();
60 auto fine_factory = fine.get_factory();
62 EncapVecT fine_state(nfine), fine_delta(ncrse);
64 for (
size_t m = 0; m < nfine; m++) { fine_state[m] = fine.get_state(m); }
65 for (
size_t m = 0; m < ncrse; m++) { fine_delta[m] = fine_factory->create(
solution); }
67 auto crse_delta = crse_factory->create(
solution);
68 for (
size_t m = 0; m < ncrse; m++) {
69 crse_delta->copy(crse.get_state(m));
70 crse_delta->saxpy(-1.0, crse.get_saved_state(m));
71 interpolate(fine_delta[m], crse_delta);
74 fine.get_state(0)->mat_apply(fine_state, 1.0, tmat, fine_delta,
false);
79 template<
typename time>
87 template<
typename time>
93 this->restrict(crse.get_start_state(), fine.get_start_state());
94 crse.reevaluate(
true);
97 template<
typename time>
100 bool restrict_initial)
105 auto const crse_nodes = crse.get_nodes();
106 auto const fine_nodes = fine.get_nodes();
107 auto const num_crse = crse_nodes.size();
108 auto const num_fine = fine_nodes.size();
110 if (restrict_initial) {
111 this->restrict_initial(dst, src);
114 int trat = (int(num_fine) - 1) / (
int(num_crse) - 1);
116 for (
size_t m = 0; m < num_crse; m++) {
117 if (crse_nodes[m] != fine_nodes[m * trat]) {
118 ML_CLOG(FATAL,
"Controller",
"coarse nodes must be nested");
121 this->restrict(crse.get_state(m), fine.get_state(m * trat));
127 template<
typename time>
135 template<
typename time>
142 auto const ncrse = crse.get_nodes().size(); assert(ncrse >= 1);
143 auto const nfine = fine.get_nodes().size(); assert(nfine >= 1);
145 auto crse_factory = crse.get_factory();
146 auto fine_factory = fine.get_factory();
148 EncapVecT crse_int(ncrse), fine_int(nfine), rstr_int(ncrse);
150 for (
size_t m = 0; m < ncrse; m++) { crse_int[m] = crse_factory->create(
solution); }
151 for (
size_t m = 0; m < ncrse; m++) { rstr_int[m] = crse_factory->create(
solution); }
152 for (
size_t m = 0; m < nfine; m++) { fine_int[m] = fine_factory->create(
solution); }
155 crse.integrate(dt, crse_int);
158 fine.integrate(dt, fine_int);
161 int trat = (int(nfine) - 1) / (
int(ncrse) - 1);
162 for (
size_t m = 0; m < ncrse; m++) {
163 this->restrict(rstr_int[m], fine_int[m * trat]);
167 EncapVecT tau(ncrse), rstr_and_crse(2 * ncrse);
169 for (
size_t m = 0; m < ncrse; m++) { tau[m] = crse.get_tau(m); }
170 for (
size_t m = 0; m < ncrse; m++) { rstr_and_crse[m] = rstr_int[m]; }
171 for (
size_t m = 0; m < ncrse; m++) { rstr_and_crse[ncrse + m] = crse_int[m]; }
173 if (fmat.rows() == 0) {
174 fmat.resize(ncrse, 2 * ncrse);
177 for (
size_t m = 0; m < ncrse; m++) {
179 fmat(m, ncrse + m) = -1.0;
183 for (
size_t n = 0; n < m; n++) {
185 fmat(m, ncrse + n) = 1.0;
190 tau[0]->mat_apply(tau, 1.0, fmat, rstr_and_crse,
true);
Not implemented yet exception.
#define ML_CLOG(level, logger_id, x)
same as CLOG(level, logger, x) from easylogging++
EncapSweeper< time > & as_encap_sweeper(shared_ptr< ISweeper< time >> x)
Polynomial time interpolation mixin.
vector< shared_ptr< Encapsulation< time > > > EncapVecT
Data/solution encapsulation.
#define UNUSED(expr)
Denoting unused function parameters for omitting compiler warnings.