Skip to content

Commit 2a195b1

Browse files
committed
WIP: Remove assumption that state(0) is start_state.
Signed-off-by: Matthew Emmett <[email protected]>
1 parent c31d74a commit 2a195b1

File tree

2 files changed

+23
-28
lines changed

2 files changed

+23
-28
lines changed

include/pfasst/encap/encap_sweeper.hpp

Lines changed: 3 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ namespace pfasst
108108
}
109109

110110
if (coarse) {
111-
size_t num_fas = this->quadrature->left_is_node() ? num_nodes -1 : num_nodes;
111+
size_t num_fas = this->quadrature->left_is_node() ? num_nodes - 1 : num_nodes;
112112
for (size_t m = 0; m < num_fas; m++) {
113113
this->fas_corrections.push_back(this->get_factory()->create(pfasst::encap::solution));
114114
}
@@ -190,18 +190,12 @@ namespace pfasst
190190
}
191191

192192
/**
193-
* evaluates the right hand side at given time node
194-
*
195-
* This evaluates the right hand side at the given time node with index `m` as returned by
196-
* pfasst::encap::EncapSweeper::get_nodes:
197-
*
198-
* @param[in] m index of the time node to evaluate at
193+
* Re-evaluate function values.
199194
*
200195
* @note This method must be implemented in derived sweepers.
201196
*/
202-
virtual void evaluate(size_t m)
197+
virtual void reevaluate(bool initial_only=false)
203198
{
204-
UNUSED(m);
205199
throw NotImplementedYet("sweeper");
206200
}
207201

@@ -282,8 +276,6 @@ namespace pfasst
282276
virtual void recv(ICommunicator* comm, int tag, bool blocking) override
283277
{
284278
this->start_state->recv(comm, tag, blocking);
285-
// XXX
286-
this->state.front()->copy(this->start_state);
287279
}
288280

289281
virtual void broadcast(ICommunicator* comm) override
@@ -292,8 +284,6 @@ namespace pfasst
292284
this->start_state->copy(this->end_state);
293285
}
294286
this->start_state->broadcast(comm);
295-
// XXX
296-
this->state.front()->copy(this->start_state);
297287
}
298288
//! @}
299289
};

include/pfasst/encap/poly_interp.hpp

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -46,14 +46,14 @@ namespace pfasst
4646
auto fine_factory = fine.get_factory();
4747

4848
auto crse_delta = crse_factory->create(solution);
49-
this->restrict(crse_delta, fine.get_state(0));
50-
crse_delta->saxpy(-1.0, crse.get_state(0));
49+
this->restrict(crse_delta, fine.get_start_state());
50+
crse_delta->saxpy(-1.0, crse.get_start_state());
5151

5252
auto fine_delta = fine_factory->create(solution);
5353
this->interpolate(fine_delta, crse_delta);
54-
fine.get_state(0)->saxpy(-1.0, fine_delta);
54+
fine.get_start_state()->saxpy(-1.0, fine_delta);
5555

56-
fine.evaluate(0);
56+
fine.reevaluate(true);
5757
}
5858

5959

@@ -68,6 +68,11 @@ namespace pfasst
6868
tmat = pfasst::quadrature::compute_interp<time>(fine.get_nodes(), crse.get_nodes());
6969
}
7070

71+
if (interp_initial) {
72+
this->interpolate_initial(dst, src);
73+
return;
74+
}
75+
7176
size_t nfine = fine.get_nodes().size();
7277
size_t ncrse = crse.get_nodes().size();
7378

@@ -80,20 +85,15 @@ namespace pfasst
8085
for (size_t m = 0; m < ncrse; m++) { fine_delta[m] = fine_factory->create(solution); }
8186

8287
auto crse_delta = crse_factory->create(solution);
83-
size_t m0 = interp_initial ? 0 : 1;
84-
for (size_t m = m0; m < ncrse; m++) {
88+
for (size_t m = 0; m < ncrse; m++) {
8589
crse_delta->copy(crse.get_state(m));
8690
crse_delta->saxpy(-1.0, crse.get_saved_state(m));
8791
interpolate(fine_delta[m], crse_delta);
8892
}
8993

90-
if (!interp_initial) {
91-
fine_delta[0]->zero();
92-
}
93-
9494
fine.get_state(0)->mat_apply(fine_state, 1.0, tmat, fine_delta, false);
9595

96-
for (size_t m = m0; m < nfine; m++) { fine.evaluate(m); }
96+
fine.reevaluate();
9797
}
9898

9999

@@ -112,7 +112,8 @@ namespace pfasst
112112
{
113113
auto& crse = as_encap_sweeper(dst);
114114
auto& fine = as_encap_sweeper(src);
115-
this->restrict(crse.get_state(0), fine.get_state(0));
115+
this->restrict(crse.get_start_state(), fine.get_start_state());
116+
crse.reevaluate(true);
116117
}
117118

118119

@@ -128,17 +129,21 @@ namespace pfasst
128129
auto const num_crse = crse_nodes.size();
129130
auto const num_fine = fine_nodes.size();
130131

132+
if (restrict_initial) {
133+
this->restrict_initial(dst, src);
134+
return;
135+
}
136+
131137
int trat = (int(num_fine) - 1) / (int(num_crse) - 1);
132138

133-
int m0 = restrict_initial ? 0 : 1;
134-
for (size_t m = m0; m < num_crse; m++) {
139+
for (size_t m = 0; m < num_crse; m++) {
135140
if (crse_nodes[m] != fine_nodes[m * trat]) {
136141
throw NotImplementedYet("coarse nodes must be nested");
137142
}
138143
this->restrict(crse.get_state(m), fine.get_state(m * trat));
139144
}
140145

141-
for (size_t m = m0; m < num_crse; m++) { crse.evaluate(m); }
146+
crse.reevaluate();
142147
}
143148

144149

0 commit comments

Comments
 (0)