Skip to content

Commit d75c04b

Browse files
authored
solve_bicgstab: use fewer MFs (#3635)
## Summary This PR cuts the number of MFs used in `solve_bicgstab`, saving on memory and LocalCopy operations. In particular, the MFs `ph` and `sh` are removed. ## Additional background This is a follow up to avoid-use-of-s and other PRs to improve `solve_bicgstab`. My own testing has shown that this PR gives the same results as before, but regression testing should be done to verify this in all cases.
1 parent 175b99d commit d75c04b

File tree

1 file changed

+11
-14
lines changed

1 file changed

+11
-14
lines changed

Src/LinearSolvers/MLMG/AMReX_MLCGSolver.H

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -90,14 +90,12 @@ MLCGSolverT<MF>::solve_bicgstab (MF& sol, const MF& rhs, RT eps_rel, RT eps_abs)
9090

9191
const int ncomp = sol.nComp();
9292

93-
MF ph = Lp.make(amrlev, mglev, sol.nGrowVect());
94-
MF sh = Lp.make(amrlev, mglev, sol.nGrowVect());
95-
ph.setVal(RT(0.0));
96-
sh.setVal(RT(0.0));
93+
MF p = Lp.make(amrlev, mglev, sol.nGrowVect());
94+
MF r = Lp.make(amrlev, mglev, sol.nGrowVect());
95+
p.setVal(RT(0.0)); // Make sure all entries are initialized to avoid errors
96+
r.setVal(RT(0.0));
9797

9898
MF sorig = Lp.make(amrlev, mglev, nghost);
99-
MF p = Lp.make(amrlev, mglev, nghost);
100-
MF r = Lp.make(amrlev, mglev, nghost);
10199
MF rh = Lp.make(amrlev, mglev, nghost);
102100
MF v = Lp.make(amrlev, mglev, nghost);
103101
MF t = Lp.make(amrlev, mglev, nghost);
@@ -151,8 +149,7 @@ MLCGSolverT<MF>::solve_bicgstab (MF& sol, const MF& rhs, RT eps_rel, RT eps_abs)
151149
MF::Saxpy(p, -omega, v, 0, 0, ncomp, nghost); // p += -omega*v
152150
MF::Xpay(p, beta, r, 0, 0, ncomp, nghost); // p = r + beta*p
153151
}
154-
ph.LocalCopy(p,0,0,ncomp,nghost);
155-
Lp.apply(amrlev, mglev, v, ph, MLLinOpT<MF>::BCMode::Homogeneous, MLLinOpT<MF>::StateMode::Correction);
152+
Lp.apply(amrlev, mglev, v, p, MLLinOpT<MF>::BCMode::Homogeneous, MLLinOpT<MF>::StateMode::Correction);
156153
Lp.normalize(amrlev, mglev, v);
157154

158155
RT rhTv = dotxy(rh,v);
@@ -164,9 +161,10 @@ MLCGSolverT<MF>::solve_bicgstab (MF& sol, const MF& rhs, RT eps_rel, RT eps_abs)
164161
{
165162
ret = 2; break;
166163
}
167-
MF::Saxpy(sol, alpha, ph, 0, 0, ncomp, nghost); // sol += alpha * ph
168-
MF::Saxpy(r, -alpha, v, 0, 0, ncomp, nghost); // r += -alpha * v
164+
MF::Saxpy(sol, alpha, p, 0, 0, ncomp, nghost); // sol += alpha * p
165+
MF::Saxpy(r, -alpha, v, 0, 0, ncomp, nghost); // r += -alpha * v
169166

167+
rnorm = norm_inf(r);
170168
rnorm = norm_inf(r);
171169

172170
if ( verbose > 2 && ParallelDescriptor::IOProcessor() )
@@ -179,8 +177,7 @@ MLCGSolverT<MF>::solve_bicgstab (MF& sol, const MF& rhs, RT eps_rel, RT eps_abs)
179177

180178
if ( rnorm < eps_rel*rnorm0 || rnorm < eps_abs ) { break; }
181179

182-
sh.LocalCopy(r,0,0,ncomp,nghost);
183-
Lp.apply(amrlev, mglev, t, sh, MLLinOpT<MF>::BCMode::Homogeneous, MLLinOpT<MF>::StateMode::Correction);
180+
Lp.apply(amrlev, mglev, t, r, MLLinOpT<MF>::BCMode::Homogeneous, MLLinOpT<MF>::StateMode::Correction);
184181
Lp.normalize(amrlev, mglev, t);
185182
//
186183
// This is a little funky. I want to elide one of the reductions
@@ -201,8 +198,8 @@ MLCGSolverT<MF>::solve_bicgstab (MF& sol, const MF& rhs, RT eps_rel, RT eps_abs)
201198
{
202199
ret = 3; break;
203200
}
204-
MF::Saxpy(sol, omega, sh, 0, 0, ncomp, nghost); // sol += omega * sh
205-
MF::Saxpy(r, -omega, t, 0, 0, ncomp, nghost); // r += -omega * t
201+
MF::Saxpy(sol, omega, r, 0, 0, ncomp, nghost); // sol += omega * r
202+
MF::Saxpy(r, -omega, t, 0, 0, ncomp, nghost); // r += -omega * t
206203

207204
rnorm = norm_inf(r);
208205

0 commit comments

Comments
 (0)