Skip to content

Commit 148fec3

Browse files
author
Matthew Emmett
committed
interp: Flense.
1 parent bd13e5d commit 148fec3

File tree

1 file changed

+34
-56
lines changed

1 file changed

+34
-56
lines changed

include/pfasst/encap/poly_interp.hpp

Lines changed: 34 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,9 @@ namespace pfasst
2727
public:
2828
virtual ~PolyInterpMixin() { }
2929

30+
3031
virtual void interpolate_initial(shared_ptr<ISweeper<time>> dst,
31-
shared_ptr<const ISweeper<time>> src)
32+
shared_ptr<const ISweeper<time>> src) override
3233
{
3334
auto& fine = as_encap_sweeper(dst);
3435
auto& crse = as_encap_sweeper(src);
@@ -47,9 +48,10 @@ namespace pfasst
4748
fine.evaluate(0);
4849
}
4950

51+
5052
virtual void interpolate(shared_ptr<ISweeper<time>> dst,
5153
shared_ptr<const ISweeper<time>> src,
52-
bool interp_initial)
54+
bool interp_initial) override
5355
{
5456
auto& fine = as_encap_sweeper(dst);
5557
auto& crse = as_encap_sweeper(src);
@@ -69,22 +71,11 @@ namespace pfasst
6971
for (size_t m = 0; m < nfine; m++) { fine_state[m] = fine.get_state(m); }
7072
for (size_t m = 0; m < ncrse; m++) { fine_delta[m] = fine_factory->create(solution); }
7173

72-
// if (interp_delta_from_initial) {
73-
// for (size_t m = 1; m < nfine; m++) {
74-
// fine_state[m]->copy(fine_state[0]);
75-
// }
76-
// }
77-
7874
auto crse_delta = crse_factory->create(solution);
7975
size_t m0 = interp_initial ? 0 : 1;
8076
for (size_t m = m0; m < ncrse; m++) {
8177
crse_delta->copy(crse.get_state(m));
82-
// if (interp_delta_from_initial) {
83-
// crse_delta->saxpy(-1.0, crse->get_saved_state(0));
84-
// // crse_delta->saxpy(-1.0, crse->get_state(0));
85-
// } else {
86-
crse_delta->saxpy(-1.0, crse.get_saved_state(m));
87-
// }
78+
crse_delta->saxpy(-1.0, crse.get_saved_state(m));
8879
interpolate(fine_delta[m], crse_delta);
8980
}
9081

@@ -97,35 +88,29 @@ namespace pfasst
9788
for (size_t m = m0; m < nfine; m++) { fine.evaluate(m); }
9889
}
9990

100-
virtual void restrict(shared_ptr<ISweeper<time>> dst,
101-
shared_ptr<const ISweeper<time>> src,
102-
bool restrict_initial,
103-
bool restrict_initial_only)
104-
{
105-
shared_ptr<EncapSweeper<time>> crse = dynamic_pointer_cast<EncapSweeper<time>>(dst);
106-
assert(crse);
107-
shared_ptr<const EncapSweeper<time>> fine = dynamic_pointer_cast<const EncapSweeper<time>>(src);
108-
assert(fine);
10991

110-
this->restrict(crse, fine, restrict_initial, restrict_initial_only);
92+
virtual void restrict_initial(shared_ptr<ISweeper<time>> dst,
93+
shared_ptr<const ISweeper<time>> src) override
94+
{
95+
auto& crse = as_encap_sweeper(dst);
96+
auto& fine = as_encap_sweeper(src);
97+
this->restrict(crse.get_state(0), fine.get_state(0));
11198
}
11299

113-
virtual void restrict(shared_ptr<EncapSweeper<time>> crse,
114-
shared_ptr<const EncapSweeper<time>> fine,
115-
bool restrict_initial,
116-
bool restrict_initial_only)
100+
101+
virtual void restrict(shared_ptr<ISweeper<time>> dst,
102+
shared_ptr<const ISweeper<time>> src,
103+
bool restrict_initial) override
117104
{
118-
if (restrict_initial_only) {
119-
this->restrict(crse->get_state(0), fine->get_state(0));
120-
return;
121-
}
105+
auto& crse = as_encap_sweeper(dst);
106+
auto& fine = as_encap_sweeper(src);
122107

123-
auto dnodes = crse->get_nodes();
124-
auto snodes = fine->get_nodes();
108+
auto dnodes = crse.get_nodes();
109+
auto snodes = fine.get_nodes();
125110

126-
size_t ncrse = crse->get_nodes().size();
111+
size_t ncrse = crse.get_nodes().size();
127112
assert(ncrse > 1);
128-
size_t nfine = fine->get_nodes().size();
113+
size_t nfine = fine.get_nodes().size();
129114

130115
int trat = (int(nfine) - 1) / (int(ncrse) - 1);
131116

@@ -134,31 +119,24 @@ namespace pfasst
134119
if (dnodes[m] != snodes[m * trat]) {
135120
throw NotImplementedYet("coarse nodes must be nested");
136121
}
137-
this->restrict(crse->get_state(m), fine->get_state(m * trat));
122+
this->restrict(crse.get_state(m), fine.get_state(m * trat));
138123
}
139124

140-
for (size_t m = m0; m < ncrse; m++) { crse->evaluate(m); }
125+
for (size_t m = m0; m < ncrse; m++) { crse.evaluate(m); }
141126
}
142127

128+
143129
virtual void fas(time dt, shared_ptr<ISweeper<time>> dst,
144-
shared_ptr<const ISweeper<time>> src)
130+
shared_ptr<const ISweeper<time>> src) override
145131
{
146-
shared_ptr<EncapSweeper<time>> crse = dynamic_pointer_cast<EncapSweeper<time>>(dst);
147-
assert(crse);
148-
shared_ptr<const EncapSweeper<time>> fine = dynamic_pointer_cast<const EncapSweeper<time>>(src);
149-
assert(fine);
132+
auto& crse = as_encap_sweeper(dst);
133+
auto& fine = as_encap_sweeper(src);
150134

151-
this->fas(dt, crse, fine);
152-
}
135+
size_t ncrse = crse.get_nodes().size(); assert(ncrse >= 1);
136+
size_t nfine = fine.get_nodes().size(); assert(nfine >= 1);
153137

154-
virtual void fas(time dt, shared_ptr<EncapSweeper<time>> crse,
155-
shared_ptr<const EncapSweeper<time>> fine)
156-
{
157-
size_t ncrse = crse->get_nodes().size(); assert(ncrse >= 1);
158-
size_t nfine = fine->get_nodes().size(); assert(nfine >= 1);
159-
160-
auto crse_factory = crse->get_factory();
161-
auto fine_factory = fine->get_factory();
138+
auto crse_factory = crse.get_factory();
139+
auto fine_factory = fine.get_factory();
162140

163141
EncapVecT crse_z2n(ncrse - 1), fine_z2n(nfine - 1), rstr_z2n(ncrse - 1);
164142

@@ -167,13 +145,13 @@ namespace pfasst
167145
for (size_t m = 0; m < nfine - 1; m++) { fine_z2n[m] = fine_factory->create(solution); }
168146

169147
// compute '0 to node' integral on the coarse level
170-
crse->integrate(dt, crse_z2n);
148+
crse.integrate(dt, crse_z2n);
171149
for (size_t m = 1; m < ncrse - 1; m++) {
172150
crse_z2n[m]->saxpy(1.0, crse_z2n[m - 1]);
173151
}
174152

175153
// compute '0 to node' integral on the fine level
176-
fine->integrate(dt, fine_z2n);
154+
fine.integrate(dt, fine_z2n);
177155
for (size_t m = 1; m < nfine - 1; m++) {
178156
fine_z2n[m]->saxpy(1.0, fine_z2n[m - 1]);
179157
}
@@ -186,7 +164,7 @@ namespace pfasst
186164

187165
// compute 'node to node' tau correction
188166
EncapVecT tau(ncrse - 1), rstr_and_crse(2 * (ncrse - 1));
189-
for (size_t m = 0; m < ncrse - 1; m++) { tau[m] = crse->get_tau(m); }
167+
for (size_t m = 0; m < ncrse - 1; m++) { tau[m] = crse.get_tau(m); }
190168
for (size_t m = 0; m < ncrse - 1; m++) { rstr_and_crse[m] = rstr_z2n[m]; }
191169
for (size_t m = 0; m < ncrse - 1; m++) { rstr_and_crse[ncrse - 1 + m] = crse_z2n[m]; }
192170

0 commit comments

Comments
 (0)