//! @{ virtual void restrict_initial(shared_ptr<ISweeper<time>> dst, shared_ptr<const ISweeper<time>> src) override { auto& crse = as_encap_sweeper(dst); auto& fine = as_encap_sweeper(src); this->restrict(crse.get_start_state(), fine.get_start_state()); crse.reevaluate(true); }
void PolyInterpMixin<time>::restrict_initial(shared_ptr<ISweeper<time>> dst, shared_ptr<const ISweeper<time>> src) { auto& crse = as_encap_sweeper(dst); auto& fine = as_encap_sweeper(src); this->restrict(crse.get_start_state(), fine.get_start_state()); crse.reevaluate(true); }
//! @{ virtual void interpolate_initial(shared_ptr<ISweeper<time>> dst, shared_ptr<const ISweeper<time>> src) override { auto& fine = as_encap_sweeper(dst); auto& crse = as_encap_sweeper(src); auto crse_factory = crse.get_factory(); auto fine_factory = fine.get_factory(); auto crse_delta = crse_factory->create(solution); this->restrict(crse_delta, fine.get_start_state()); crse_delta->saxpy(-1.0, crse.get_start_state()); auto fine_delta = fine_factory->create(solution); this->interpolate(fine_delta, crse_delta); fine.get_start_state()->saxpy(-1.0, fine_delta); fine.reevaluate(true); }
virtual void interpolate(shared_ptr<ISweeper<time>> dst, shared_ptr<const ISweeper<time>> src, bool interp_initial) override { auto& fine = as_encap_sweeper(dst); auto& crse = as_encap_sweeper(src); if (tmat.rows() == 0) { tmat = pfasst::quadrature::compute_interp<time>(fine.get_nodes(), crse.get_nodes()); } if (interp_initial) { this->interpolate_initial(dst, src); } size_t nfine = fine.get_nodes().size(); size_t ncrse = crse.get_nodes().size(); auto crse_factory = crse.get_factory(); auto fine_factory = fine.get_factory(); EncapVecT fine_state(nfine), fine_delta(ncrse); for (size_t m = 0; m < nfine; m++) { fine_state[m] = fine.get_state(m); } for (size_t m = 0; m < ncrse; m++) { fine_delta[m] = fine_factory->create(solution); } auto crse_delta = crse_factory->create(solution); for (size_t m = 0; m < ncrse; m++) { crse_delta->copy(crse.get_state(m)); crse_delta->saxpy(-1.0, crse.get_saved_state(m)); interpolate(fine_delta[m], crse_delta); } fine.get_state(0)->mat_apply(fine_state, 1.0, tmat, fine_delta, false); fine.reevaluate(); }