@@ -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+
5562private:
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
6775template <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+
402430using MLCGSolver = MLCGSolverT<MultiFab>;
403431
404432}
0 commit comments