Skip to content

Commit acd3cc8

Browse files
author
Matthew Emmett
committed
pfasst: Add tag helper and state V-cycle on finest level.
1 parent 148fec3 commit acd3cc8

File tree

1 file changed

+28
-31
lines changed

1 file changed

+28
-31
lines changed

include/pfasst/pfasst.hpp

Lines changed: 28 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,24 @@ namespace pfasst
8989
initial = true;
9090
}
9191

92+
int tag (int level)
93+
{
94+
return level * 10000 + this->get_iteration() + 10;
95+
}
96+
97+
int tag(LevelIter l)
98+
{
99+
return tag(l.level);
100+
}
101+
102+
void post()
103+
{
104+
for (auto l = this->coarsest() + 1; l <= this->finest(); ++l) {
105+
l.current()->post(comm, tag(l));
106+
}
107+
}
108+
109+
92110
/**
93111
* Evolve ODE using PFASST.
94112
*
@@ -113,30 +131,8 @@ namespace pfasst
113131

114132
for (this->set_iteration(0); this->get_iteration() < this->get_max_iterations();
115133
this->advance_iteration()) {
116-
for (auto l = this->coarsest() + 1; l <= this->finest(); ++l) {
117-
int tag = l.level * 10000 + this->get_iteration() + 10;
118-
l.current()->post(comm, tag);
119-
}
120-
121-
perform_sweeps(this->nlevels() - 1);
122-
123-
// note: convergence checks belong here...
124-
125-
auto fine = this->get_level(this->nlevels() - 1);
126-
auto crse = this->get_level(this->nlevels() - 2);
127-
auto trns = this->get_transfer(this->nlevels() - 1);
128-
129-
int tag = (this->nlevels() - 1) * 10000 + this->get_iteration() + 10;
130-
fine->send(comm, tag, false);
131-
trns->restrict(crse, fine, true);
132-
trns->fas(this->get_time_step(), crse, fine);
133-
crse->save();
134-
135-
cycle_v(this->finest() - 1);
136-
137-
trns->interpolate(fine, crse, true);
138-
fine->recv(comm, tag, false);
139-
trns->interpolate_initial(fine, crse);
134+
post();
135+
cycle_v(this->finest());
140136
}
141137

142138
if (nblock < nblocks - 1) {
@@ -156,8 +152,11 @@ namespace pfasst
156152

157153
perform_sweeps(l.level);
158154

159-
int tag = l.level * 10000 + this->get_iteration() + 10;
160-
fine->send(comm, tag, false);
155+
if (l == this->finest()) {
156+
// note: convergence tests belong here
157+
}
158+
159+
fine->send(comm, tag(l), false);
161160

162161
auto dt = this->get_time_step();
163162
trns->restrict(crse, fine, true);
@@ -183,8 +182,7 @@ namespace pfasst
183182

184183
trns->interpolate(fine, crse, true);
185184

186-
int tag = l.level * 10000 + this->get_iteration() + 10;
187-
fine->recv(comm, tag, false);
185+
fine->recv(comm, tag(l), false);
188186
trns->interpolate_initial(fine, crse);
189187

190188
if (l < this->finest()) {
@@ -201,10 +199,9 @@ namespace pfasst
201199
{
202200
auto crse = l.current();
203201

204-
int tag = l.level * 10000 + this->get_iteration() + 10;
205-
crse->recv(comm, tag, true);
202+
crse->recv(comm, tag(l), true);
206203
this->perform_sweeps(l.level);
207-
crse->send(comm, tag, true);
204+
crse->send(comm, tag(l), true);
208205
return l + 1;
209206
}
210207

0 commit comments

Comments
 (0)