Skip to content

Commit f05231a

Browse files
authored
Correct FMG routine to start prolongation at the proper level (#124)
1 parent 3134b8b commit f05231a

2 files changed

Lines changed: 26 additions & 26 deletions

File tree

src/GMGPolar/solver.cpp

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -194,38 +194,38 @@ void GMGPolar::initializeSolution()
194194
}
195195
else {
196196
// Start from the coarsest level
197-
int FMG_start_level_depth = number_of_levels_ - 1;
198-
Level& FMG_level = levels_[FMG_start_level_depth];
197+
int coarsest_depth = number_of_levels_ - 1;
198+
Level& coarsest_level = levels_[coarsest_depth];
199199

200200
// Solve directly on the coarsest level
201-
FMG_level.solution() = FMG_level.rhs();
202-
FMG_level.directSolveInPlace(FMG_level.solution()); // Direct solve on coarsest grid
201+
coarsest_level.solution() = coarsest_level.rhs();
202+
coarsest_level.directSolveInPlace(coarsest_level.solution()); // Direct solve on coarsest grid
203203

204204
// Prolongate the solution from the coarsest level up to the finest, while applying Multigrid Cycles on each level
205-
for (int current_level = FMG_start_level_depth - 1; current_level > 0; --current_level) {
206-
Level& FMG_level = levels_[current_level]; // The current level
207-
Level& next_FMG_level = levels_[current_level - 1]; // The finer level
205+
for (int depth = coarsest_depth; depth > 0; --depth) {
206+
Level& coarse_level = levels_[depth]; // Current coarse level
207+
Level& fine_level = levels_[depth - 1]; // Next finer level
208208

209209
// The bi-cubic FMG interpolation is of higher order
210-
FMGInterpolation(current_level, next_FMG_level.solution(), FMG_level.solution());
210+
FMGInterpolation(coarse_level.level_depth(), fine_level.solution(), coarse_level.solution());
211211

212212
// Apply some FMG iterations
213213
for (int i = 0; i < FMG_iterations_; i++) {
214-
if (current_level - 1 == 0 && (extrapolation_ != ExtrapolationType::NONE)) {
214+
if (fine_level.level_depth() == 0 && (extrapolation_ != ExtrapolationType::NONE)) {
215215
switch (FMG_cycle_) {
216216
case MultigridCycleType::V_CYCLE:
217-
implicitlyExtrapolatedMultigrid_V_Cycle(current_level - 1, next_FMG_level.solution(),
218-
next_FMG_level.rhs(), next_FMG_level.residual());
217+
implicitlyExtrapolatedMultigrid_V_Cycle(fine_level.level_depth(), fine_level.solution(),
218+
fine_level.rhs(), fine_level.residual());
219219
break;
220220

221221
case MultigridCycleType::W_CYCLE:
222-
implicitlyExtrapolatedMultigrid_W_Cycle(current_level - 1, next_FMG_level.solution(),
223-
next_FMG_level.rhs(), next_FMG_level.residual());
222+
implicitlyExtrapolatedMultigrid_W_Cycle(fine_level.level_depth(), fine_level.solution(),
223+
fine_level.rhs(), fine_level.residual());
224224
break;
225225

226226
case MultigridCycleType::F_CYCLE:
227-
implicitlyExtrapolatedMultigrid_F_Cycle(current_level - 1, next_FMG_level.solution(),
228-
next_FMG_level.rhs(), next_FMG_level.residual());
227+
implicitlyExtrapolatedMultigrid_F_Cycle(fine_level.level_depth(), fine_level.solution(),
228+
fine_level.rhs(), fine_level.residual());
229229
break;
230230

231231
default:
@@ -237,18 +237,18 @@ void GMGPolar::initializeSolution()
237237
else {
238238
switch (FMG_cycle_) {
239239
case MultigridCycleType::V_CYCLE:
240-
multigrid_V_Cycle(current_level - 1, next_FMG_level.solution(), next_FMG_level.rhs(),
241-
next_FMG_level.residual());
240+
multigrid_V_Cycle(fine_level.level_depth(), fine_level.solution(), fine_level.rhs(),
241+
fine_level.residual());
242242
break;
243243

244244
case MultigridCycleType::W_CYCLE:
245-
multigrid_W_Cycle(current_level - 1, next_FMG_level.solution(), next_FMG_level.rhs(),
246-
next_FMG_level.residual());
245+
multigrid_W_Cycle(fine_level.level_depth(), fine_level.solution(), fine_level.rhs(),
246+
fine_level.residual());
247247
break;
248248

249249
case MultigridCycleType::F_CYCLE:
250-
multigrid_F_Cycle(current_level - 1, next_FMG_level.solution(), next_FMG_level.rhs(),
251-
next_FMG_level.residual());
250+
multigrid_F_Cycle(fine_level.level_depth(), fine_level.solution(), fine_level.rhs(),
251+
fine_level.residual());
252252
break;
253253

254254
default:

tests/GMGPolar/solve_tests.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,7 @@ using gmgpolar_test_suite = testing::Types<
190190
std::integral_constant<ResidualNormType, ResidualNormType::EUCLIDEAN>, // residualNormType
191191
std::integral_constant<double, 1e-8>, // absoluteTolerance
192192
std::integral_constant<double, 1e-8>, // relativeTolerance
193-
std::integral_constant<int, 28>, // expected_iterations
193+
std::integral_constant<int, 26>, // expected_iterations
194194
std::integral_constant<double, 2e-6>, // expected_l2_error
195195
std::integral_constant<double, 9e-6>, // expected_inf_error
196196
std::integral_constant<double, 0.7> // expected_residual_reduction
@@ -227,7 +227,7 @@ using gmgpolar_test_suite = testing::Types<
227227
std::integral_constant<ResidualNormType, ResidualNormType::EUCLIDEAN>, // residualNormType
228228
std::integral_constant<double, 1e-8>, // absoluteTolerance
229229
std::integral_constant<double, 1e-8>, // relativeTolerance
230-
std::integral_constant<int, 28>, // expected_iterations
230+
std::integral_constant<int, 26>, // expected_iterations
231231
std::integral_constant<double, 2e-6>, // expected_l2_error
232232
std::integral_constant<double, 9e-6>, // expected_inf_error
233233
std::integral_constant<double, 0.7> // expected_residual_reduction
@@ -264,7 +264,7 @@ using gmgpolar_test_suite = testing::Types<
264264
std::integral_constant<ResidualNormType, ResidualNormType::EUCLIDEAN>, // residualNormType
265265
std::integral_constant<double, 1e-8>, // absoluteTolerance
266266
std::integral_constant<double, 1e-8>, // relativeTolerance
267-
std::integral_constant<int, 28>, // expected_iterations
267+
std::integral_constant<int, 26>, // expected_iterations
268268
std::integral_constant<double, 2e-6>, // expected_l2_error
269269
std::integral_constant<double, 9e-6>, // expected_inf_error
270270
std::integral_constant<double, 0.7> // expected_residual_reduction
@@ -299,7 +299,7 @@ using gmgpolar_test_suite = testing::Types<
299299
std::integral_constant<ResidualNormType, ResidualNormType::INFINITY_NORM>, // residualNormType
300300
std::integral_constant<double, 1e-12>, // absoluteTolerance
301301
std::integral_constant<double, 1e-10>, // relativeTolerance
302-
std::integral_constant<int, 14>, // expected_iterations
302+
std::integral_constant<int, 12>, // expected_iterations
303303
std::integral_constant<double, 6e-6>, // expected_l2_error
304304
std::integral_constant<double, 2e-5>, // expected_inf_error
305305
std::integral_constant<double, 0.3> // expected_residual_reduction
@@ -472,7 +472,7 @@ using gmgpolar_test_suite = testing::Types<
472472
std::integral_constant<ResidualNormType, ResidualNormType::WEIGHTED_EUCLIDEAN>, // residualNormType
473473
std::integral_constant<double, 1e-8>, // absoluteTolerance
474474
std::integral_constant<double, -1.0>, // relativeTolerance
475-
std::integral_constant<int, 15>, // expected_iterations
475+
std::integral_constant<int, 14>, // expected_iterations
476476
std::integral_constant<double, 9e-5>, // expected_l2_error
477477
std::integral_constant<double, 3e-4>, // expected_inf_error
478478
std::integral_constant<double, 0.6> // expected_residual_reduction

0 commit comments

Comments
 (0)