Skip to content

Commit b9ea3bd

Browse files
committed
Add more detailed error messages to MLCGSolver
1 parent edb4c25 commit b9ea3bd

File tree

2 files changed

+38
-3
lines changed

2 files changed

+38
-3
lines changed

Src/LinearSolvers/MLMG/AMReX_MLCGSolver.H

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,13 @@ public:
5252

5353
[[nodiscard]] int getNumIters () const noexcept { return iter; }
5454

55+
std::string solverName () const
56+
{
57+
58+
}
59+
60+
std::string returnValueExplanation () { return m_return_value_explanation; }
61+
5562
private:
5663

5764
MLLinOpT<MF>& Lp;
@@ -62,6 +69,7 @@ private:
6269
int maxiter = 100;
6370
IntVect nghost = IntVect(0);
6471
int iter = -1;
72+
std::string m_return_value_explanation = "Unknown return value";
6573
};
6674

6775
template <typename MF>
@@ -129,6 +137,7 @@ MLCGSolverT<MF>::solve_bicgstab (MF& sol, const MF& rhs, RT eps_rel, RT eps_abs)
129137
<< ", rnorm = " << rnorm
130138
<< ", eps_abs = " << eps_abs << std::endl;
131139
}
140+
m_return_value_explanation = "Converged at Iteration 0 since rnorm0 " + (rnorm == RT(0.0) ? "== 0" : "< eps_abs");
132141
return ret;
133142
}
134143

@@ -137,6 +146,7 @@ MLCGSolverT<MF>::solve_bicgstab (MF& sol, const MF& rhs, RT eps_rel, RT eps_abs)
137146
const RT rho = dotxy(rh,r);
138147
if ( rho == 0 )
139148
{
149+
m_return_value_explanation = "Failed to converge due to rho == 0";
140150
ret = 1; break;
141151
}
142152
if ( iter == 1 )
@@ -159,6 +169,7 @@ MLCGSolverT<MF>::solve_bicgstab (MF& sol, const MF& rhs, RT eps_rel, RT eps_abs)
159169
}
160170
else
161171
{
172+
m_return_value_explanation = "Failed to converge due to rhTV == 0";
162173
ret = 2; break;
163174
}
164175
MF::Saxpy(sol, alpha, p, 0, 0, ncomp, nghost); // sol += alpha * p
@@ -175,7 +186,11 @@ MLCGSolverT<MF>::solve_bicgstab (MF& sol, const MF& rhs, RT eps_rel, RT eps_abs)
175186
<< rnorm/(rnorm0) << '\n';
176187
}
177188

178-
if ( rnorm < eps_rel*rnorm0 || rnorm < eps_abs ) { break; }
189+
if ( rnorm < eps_rel*rnorm0 || rnorm < eps_abs )
190+
{
191+
m_return_value_explanation = "Converged at Half Iter " + std::string(iter);
192+
ret = 0; break;
193+
}
179194

180195
Lp.apply(amrlev, mglev, t, r, MLLinOpT<MF>::BCMode::Homogeneous, MLLinOpT<MF>::StateMode::Correction);
181196
Lp.normalize(amrlev, mglev, t);
@@ -196,6 +211,7 @@ MLCGSolverT<MF>::solve_bicgstab (MF& sol, const MF& rhs, RT eps_rel, RT eps_abs)
196211
}
197212
else
198213
{
214+
m_return_value_explanation = "Failed to converge due to dot(t,t) == 0";
199215
ret = 3; break;
200216
}
201217
MF::Saxpy(sol, omega, r, 0, 0, ncomp, nghost); // sol += omega * r
@@ -211,10 +227,15 @@ MLCGSolverT<MF>::solve_bicgstab (MF& sol, const MF& rhs, RT eps_rel, RT eps_abs)
211227
<< rnorm/(rnorm0) << '\n';
212228
}
213229

214-
if ( rnorm < eps_rel*rnorm0 || rnorm < eps_abs ) { break; }
230+
if ( rnorm < eps_rel*rnorm0 || rnorm < eps_abs )
231+
{
232+
m_return_value_explanation = "Converged at Iteration " + std::string(iter);
233+
ret = 0; break;
234+
}
215235

216236
if ( omega == 0 )
217237
{
238+
m_return_value_explanation = "Failed to converge due to omega == 0";
218239
ret = 4; break;
219240
}
220241
rho_1 = rho;
@@ -233,6 +254,11 @@ MLCGSolverT<MF>::solve_bicgstab (MF& sol, const MF& rhs, RT eps_rel, RT eps_abs)
233254
if ( verbose > 0 && ParallelDescriptor::IOProcessor() ) {
234255
amrex::Warning("MLCGSolver_BiCGStab:: failed to converge!");
235256
}
257+
if (iter != maxiter)
258+
{
259+
amrex::Warning("MLCGSolver_BiCGStab:: iter expected be the same as maxiter here!");
260+
}
261+
m_return_value_explanation = "Failed to converge under tolerances after max iterations = " + std::string(maxiter);
236262
ret = 8;
237263
}
238264

@@ -399,6 +425,8 @@ MLCGSolverT<MF>::norm_inf (const MF& res, bool local) -> RT
399425
return result;
400426
}
401427

428+
429+
402430
using MLCGSolver = MLCGSolverT<MultiFab>;
403431

404432
}

Src/LinearSolvers/MLMG/AMReX_MLMG.H

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1530,7 +1530,14 @@ MLMGT<MF>::bottomSolveWithCG (MF& x, const MF& b, typename MLCGSolverT<MF>::Type
15301530

15311531
int ret = cg_solver.solve(x, b, bottom_reltol, bottom_abstol);
15321532
if (ret != 0 && verbose > 1) {
1533-
amrex::Print() << "MLMG: Bottom solve failed.\n";
1533+
std::string typename = "Unknown CG type";
1534+
if ( type == MLCGSolverT<MF>::Type::BiCGStab) {
1535+
typename = "BiCGStab";
1536+
} else if (type == MLCGSolverT<MF>::Type::CG) {
1537+
typename = "CG";
1538+
}
1539+
amrex::Print() << "MLMG: Bottom solve with " << typename << " failed,"
1540+
<< "return value = " << ret << "\n";
15341541
}
15351542
m_niters_cg.push_back(cg_solver.getNumIters());
15361543
return ret;

0 commit comments

Comments
 (0)