5 #ifndef _EXAMPLES__BORIS__INJECTIVE_TRANSFER__HPP_
6 #define _EXAMPLES__BORIS__INJECTIVE_TRANSFER__HPP_
43 CVLOG(2,
"BorisTransfer") <<
"interpolating initial particle only";
48 CVLOG(5,
"BorisTransfer") <<
"coarse: " << crse->get_start_state();
50 auto crse_factory = crse->get_factory();
51 auto fine_factory = fine->get_factory();
53 shared_ptr<encap_type> crse_delta = dynamic_pointer_cast<encap_type>(crse_factory->create(
solution));
54 this->
restrict(crse_delta, dynamic_pointer_cast<const encap_type>(fine->get_start_state()));
55 crse_delta->positions() -= dynamic_pointer_cast<
const encap_type>(crse->get_start_state())->positions();
56 crse_delta->velocities() -= dynamic_pointer_cast<
const encap_type>(crse->get_start_state())->velocities();
58 shared_ptr<encap_type> fine_delta = dynamic_pointer_cast<encap_type>(fine_factory->create(
solution));
60 shared_ptr<encap_type> fine_start = dynamic_pointer_cast<encap_type>(fine->get_start_state());
61 fine_start->positions() -= fine_delta->positions();
62 fine_start->velocities() -= fine_delta->velocities();
64 fine->set_start_state(fine_start);
65 CVLOG(5,
"BorisTransfer") <<
"interpolated: " << fine->get_start_state();
70 bool interp_initial =
false)
override
72 CVLOG(2,
"BorisTransfer") <<
"interpolating";
82 auto const ncrse = crse->get_nodes().size(); assert(ncrse >= 1);
83 auto const nfine = fine->get_nodes().size(); assert(nfine >= 1);
85 auto crse_factory = crse->get_factory();
86 auto fine_factory = fine->get_factory();
88 vector<shared_ptr<encap_type>> fine_delta(nfine), crse_delta(ncrse);
90 for (
size_t m = 0; m < fine->get_nodes().size(); ++m) {
91 shared_ptr<encap_type> crse_state = dynamic_pointer_cast<encap_type>(crse->get_state(m));
92 shared_ptr<encap_type> fine_state = dynamic_pointer_cast<encap_type>(fine->get_state(m));
93 CVLOG(5,
"BorisTransfer") <<
"coarse[" << m <<
"]: " << crse_state;
94 CVLOG(5,
"BorisTransfer") <<
"fine[" << m <<
"]: " << fine_state;
96 crse_delta[m] = dynamic_pointer_cast<encap_type>(crse_factory->create(
solution));
97 this->
restrict(crse_delta[m], fine_state);
98 crse_delta[m]->positions() -= crse_state->positions();
99 crse_delta[m]->velocities() -= crse_state->velocities();
100 CVLOG(5,
"BorisTransfer") <<
" crse_delta[" << m <<
"]: " << crse_delta[m];
102 fine_delta[m] = dynamic_pointer_cast<encap_type>(fine_factory->create(
solution));
104 CVLOG(5,
"BorisTransfer") <<
" fine_delta[" << m <<
"]: " << fine_delta[m];
105 fine_state->positions() -= fine_delta[m]->positions();
106 fine_state->velocities() -= fine_delta[m]->velocities();
108 fine->set_state(fine_state, m);
110 CVLOG(5,
"BorisTransfer") <<
"interpolated[" << m <<
"]: "
111 << dynamic_pointer_cast<encap_type>(fine->get_state(m));
119 CVLOG(5,
"BorisTransfer") <<
"interpolate cloud: " << src;
121 CVLOG(5,
"BorisTransfer") <<
" --> " << dst;
127 CVLOG(5,
"BorisTransfer") <<
"interpolate cmpnt: <" << src <<
">" << *(src.get());
128 *(dst.get()) = *(src.get());
129 CVLOG(5,
"BorisTransfer") <<
" --> <" << dst <<
">" << *(dst.get());
136 CVLOG(2,
"BorisTransfer") <<
"restricting initial particle only";
141 CVLOG(5,
"BorisTransfer") <<
"fine: " << fine->get_start_state();
143 CVLOG(5,
"BorisTransfer") <<
"restricted: " << coarse->get_start_state();
150 CVLOG(2,
"BorisTransfer") <<
"restricting";
160 for (
size_t m = 0; m < coarse->get_nodes().size(); ++m) {
161 CVLOG(5,
"BorisTransfer") <<
"fine[" << m <<
"]: "
163 coarse->set_state(dynamic_pointer_cast<const encap_type>(fine->get_state(m)), m);
164 CVLOG(5,
"BorisTransfer") <<
"restricted[" << m <<
"]: "
173 CVLOG(5,
"BorisTransfer") <<
"restrict cloud: " << src;
175 CVLOG(5,
"BorisTransfer") <<
" --> " << dst;
181 CVLOG(5,
"BorisTransfer") <<
"restrict cmpnt: <" << src <<
">" << *(src.get());
182 *(dst.get()) = *(src.get());
183 CVLOG(5,
"BorisTransfer") <<
" --> <" << dst <<
">" << *(dst.get());
190 CVLOG(2,
"BorisTransfer") <<
"computing FAS correction";
198 auto const ncrse = crse->get_nodes().size(); assert(ncrse >= 1);
199 auto const nfine = fine->get_nodes().size(); assert(nfine >= 1);
203 const size_t crse_dim = crse_factory->dim();
207 const size_t fine_dim = fine_factory->dim();
210 vector<shared_ptr<force_type>> crse_int_q(ncrse), fine_int_q(nfine), rstr_int_q(ncrse);
211 vector<shared_ptr<force_type>> crse_int_qq(ncrse), fine_int_qq(nfine), rstr_int_qq(ncrse);
212 for (
size_t m = 0; m < ncrse; m++) {
213 crse_int_q[m] = make_shared<force_type>(cloud_component_factory<scalar>(crse_nparticle, crse_dim));
214 crse_int_qq[m] = make_shared<force_type>(cloud_component_factory<scalar>(crse_nparticle, crse_dim));
215 rstr_int_q[m] = make_shared<force_type>(cloud_component_factory<scalar>(crse_nparticle, crse_dim));
216 rstr_int_qq[m] = make_shared<force_type>(cloud_component_factory<scalar>(crse_nparticle, crse_dim));
218 for (
size_t m = 0; m < nfine; m++) {
219 fine_int_q[m] = make_shared<force_type>(cloud_component_factory<scalar>(fine_nparticle, fine_dim));
220 fine_int_qq[m] = make_shared<force_type>(cloud_component_factory<scalar>(fine_nparticle, fine_dim));
224 CVLOG(5,
"BorisTransfer") <<
"computing coarse integral";
225 crse->integrate(dt, crse_int_q, crse_int_qq);
228 CVLOG(5,
"BorisTransfer") <<
"computing fine integral";
229 fine->integrate(dt, fine_int_q, fine_int_qq);
232 CVLOG(5,
"BorisTransfer") <<
"restricting fine integral";
233 int trat = (int(nfine) - 1) / (
int(ncrse) - 1);
234 for (
size_t m = 0; m < ncrse; m++) {
235 this->
restrict(rstr_int_q[m], fine_int_q[m * trat]);
236 this->
restrict(rstr_int_qq[m], fine_int_qq[m * trat]);
239 CVLOG(5,
"BorisTransfer") <<
"get previous node-to-node tau correction";
241 vector<shared_ptr<force_type>> tau_q(ncrse), tau_qq(ncrse);
242 for (
size_t m = 0; m < ncrse; m++) {
243 tau_q[m] = crse->get_tau_q_as_force(m);
244 tau_qq[m] = crse->get_tau_qq_as_force(m);
245 CVLOG(5,
"BorisTransfer") <<
"previous tau_q[" << m <<
"]: <" << tau_q[m] <<
">" << *(tau_q[m].get());
246 CVLOG(5,
"BorisTransfer") <<
"previous tau_qq[" << m <<
"]: <" << tau_qq[m] <<
">" << *(tau_qq[m].get());
247 zero(*(tau_q[m].
get()));
248 zero(*(tau_qq[m].
get()));
251 CVLOG(5,
"BorisTransfer") <<
"convert node-to-node tau correction from 0-to-node";
252 for (
size_t m = 0; m < ncrse; ++m) {
256 *(tau_q[m].get()) = *(rstr_int_q[m].
get()) - *(crse_int_q[m].
get());
260 *(tau_qq[m].get()) = *(rstr_int_qq[m].
get()) - *(crse_int_qq[m].
get());
275 for (
size_t m = 0; m < ncrse; ++m) {
276 CVLOG(5,
"BorisTransfer") <<
"new tau_q[" << m <<
"]: <" << tau_q[m] <<
">" << *(tau_q[m].get());
277 CVLOG(5,
"BorisTransfer") <<
"new tau_qq[" << m <<
"]: <" << tau_qq[m] <<
">" << *(tau_qq[m].get());
286 #endif // _EXAMPLES__BORIS__INJECTIVE_TRANSFER__HPP_
virtual void restrict(shared_ptr< ParticleCloud< scalar >> dst, shared_ptr< const ParticleCloud< scalar >> src)
virtual void interpolate(shared_ptr< ParticleCloudComponent< scalar >> dst, shared_ptr< const ParticleCloudComponent< scalar >> src)
static void zero(vector< precision > &data)
virtual ~InjectiveTransfer()
virtual void interpolate_initial(shared_ptr< ISweeper< time >> dst, shared_ptr< const ISweeper< time >> src) override
Interpolate initial condition from the coarse sweeper to the fine sweeper.
BorisSweeper< scalar, time >::encap_type encap_type
virtual void restrict(shared_ptr< ISweeper< time >> dst, shared_ptr< const ISweeper< time >> src, bool restrict_initial=false) override
Restrict, in time and space, from the fine sweeper to the coarse sweeper.
vector< precision > ParticleCloudComponent
size_t num_particles() const
BorisSweeper< scalar, time >::acceleration_type force_type
interfaces for SDC/MLSDC/PFASST algorithms.
Abstract time/space transfer (restrict/interpolate) class.
virtual void restrict_initial(shared_ptr< ISweeper< time >> dst, shared_ptr< const ISweeper< time >> src) override
Restrict initial condition from the fine sweeper to the coarse sweeper.
ParticleCloudComponent< scalar > acceleration_type
virtual void interpolate(shared_ptr< ISweeper< time >> dst, shared_ptr< const ISweeper< time >> src, bool interp_initial=false) override
Interpolate, in time and space, from the coarse sweeper to the fine sweeper.
virtual void fas(time dt, shared_ptr< ISweeper< time >> dst, shared_ptr< const ISweeper< time >> src) override
Compute FAS correction between the coarse and fine sweepers.
virtual void interpolate(shared_ptr< ParticleCloud< scalar >> dst, shared_ptr< const ParticleCloud< scalar >> src)
virtual void restrict(shared_ptr< ParticleCloudComponent< scalar >> dst, shared_ptr< const ParticleCloudComponent< scalar >> src)