Skip to content

Commit 6603957

Browse files
committed
mlsdc: Don't interpolate delta of initial conditions.
Signed-off-by: Matthew Emmett <[email protected]>
1 parent 9bd90a8 commit 6603957

File tree

4 files changed

+24
-9
lines changed

4 files changed

+24
-9
lines changed

examples/advection_diffusion/advection_diffusion_sweeper.hpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@ class AdvectionDiffusionSweeper : public pfasst::imex::IMEX<scalar,time> {
4545
}
4646
}
4747

48+
~AdvectionDiffusionSweeper()
49+
{
50+
cout << "number of f1 evals: " << nf1evals << endl;
51+
}
52+
4853
void exact(Encapsulation<scalar,time>* q, scalar t)
4954
{
5055
exact(*dynamic_cast<dvector*>(q), t);

include/pfasst/encap/encapsulation.hpp

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,9 @@ namespace pfasst {
134134

135135
virtual ~PolyInterpMixin() { }
136136

137-
virtual void interpolate(ISweeper *dst, const ISweeper *src, bool initial)
137+
virtual void interpolate(ISweeper *dst, const ISweeper *src,
138+
bool interp_delta_from_initial,
139+
bool interp_initial)
138140
{
139141
auto* fine = dynamic_cast<EncapSweeper<scalar,time>*>(dst);
140142
auto* crse = dynamic_cast<const EncapSweeper<scalar,time>*>(src);
@@ -153,25 +155,29 @@ namespace pfasst {
153155
for (int m=0; m<nfine; m++) fine_state[m] = fine->get_state(m);
154156
for (int m=0; m<ncrse; m++) fine_delta[m] = fine_factory->create(solution);
155157

156-
if (initial)
158+
if (interp_delta_from_initial)
157159
for (int m=1; m<nfine; m++)
158160
fine_state[m]->copy(fine_state[0]);
159161

160162
auto* crse_delta = crse_factory->create(solution);
161-
for (int m=0; m<ncrse; m++) {
163+
int m0 = interp_initial ? 0 : 1;
164+
for (int m=m0; m<ncrse; m++) {
162165
crse_delta->copy(crse->get_state(m));
163-
if (initial)
166+
if (interp_delta_from_initial)
164167
crse_delta->saxpy(-1.0, crse->get_state(0));
165168
else
166169
crse_delta->saxpy(-1.0, crse->get_saved_state(m));
167170
interpolate(fine_delta[m], crse_delta);
168171
}
169172
delete crse_delta;
170173

174+
if (! interp_initial)
175+
fine_delta[0]->setval(0.0);
176+
171177
fine->get_state(0)->mat_apply(fine_state, 1.0, tmat, fine_delta, false);
172178

173179
for (int m=0; m<ncrse; m++) delete fine_delta[m];
174-
for (int m=0; m<nfine; m++) fine->evaluate(m);
180+
for (int m=m0; m<nfine; m++) fine->evaluate(m);
175181
}
176182

177183
virtual void restrict(ISweeper *dst, const ISweeper *src, bool restrict_initial)

include/pfasst/interfaces.hpp

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,13 @@ namespace pfasst {
3939
class ITransfer {
4040
public:
4141
// XXX: pass level iterator to these routines as well
42-
virtual void interpolate(ISweeper *dst, const ISweeper *src, bool initial=false) = 0;
43-
virtual void restrict(ISweeper *dst, const ISweeper *src, bool initial=false) = 0;
44-
virtual void fas(double dt, ISweeper *dst, const ISweeper *src) = 0; // XXX: this needs to be templated
42+
// XXX: these needs to be templated
43+
virtual void interpolate(ISweeper *dst, const ISweeper *src,
44+
bool interp_delta_from_initial=false,
45+
bool interp_initial=false) = 0;
46+
virtual void restrict(ISweeper *dst, const ISweeper *src,
47+
bool restrict_initial=false) = 0;
48+
virtual void fas(double dt, ISweeper *dst, const ISweeper *src) = 0;
4549
};
4650

4751
class ICommunicator {

include/pfasst/mlsdc.hpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ namespace pfasst {
103103
auto* crse = leviter.coarse();
104104
auto* trns = leviter.transfer();
105105

106-
trns->interpolate(fine, crse, false);
106+
trns->interpolate(fine, crse);
107107

108108
if (leviter < this->finest())
109109
perform_sweeps(leviter, t, dt);

0 commit comments

Comments
 (0)