Skip to content

Commit eae3e36

Browse files
Put loop over iter in MLMG smooth (#4352)
1 parent ae582de commit eae3e36

File tree

9 files changed

+48
-52
lines changed

9 files changed

+48
-52
lines changed

Src/LinearSolvers/MLMG/AMReX_MLCellLinOp.H

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ public:
8383
void apply (int amrlev, int mglev, MF& out, MF& in, BCMode bc_mode,
8484
StateMode s_mode, const MLMGBndryT<MF>* bndry=nullptr) const override;
8585
void smooth (int amrlev, int mglev, MF& sol, const MF& rhs,
86-
bool skip_fillboundary=false) const final;
86+
bool skip_fillboundary, int niter) const final;
8787

8888
void solutionResidual (int amrlev, MF& resid, MF& x, const MF& b,
8989
const MF* crse_bcdata=nullptr) override;
@@ -1211,15 +1211,17 @@ MLCellLinOpT<MF>::apply (int amrlev, int mglev, MF& out, MF& in, BCMode bc_mode,
12111211
template <typename MF>
12121212
void
12131213
MLCellLinOpT<MF>::smooth (int amrlev, int mglev, MF& sol, const MF& rhs,
1214-
bool skip_fillboundary) const
1214+
bool skip_fillboundary, int niter) const
12151215
{
12161216
BL_PROFILE("MLCellLinOp::smooth()");
1217-
for (int redblack = 0; redblack < 2; ++redblack)
1218-
{
1219-
applyBC(amrlev, mglev, sol, BCMode::Homogeneous, StateMode::Solution,
1220-
nullptr, skip_fillboundary);
1221-
Fsmooth(amrlev, mglev, sol, rhs, redblack);
1222-
skip_fillboundary = false;
1217+
for (int i = 0; i < niter; ++i) {
1218+
for (int redblack = 0; redblack < 2; ++redblack)
1219+
{
1220+
applyBC(amrlev, mglev, sol, BCMode::Homogeneous, StateMode::Solution,
1221+
nullptr, skip_fillboundary);
1222+
Fsmooth(amrlev, mglev, sol, rhs, redblack);
1223+
skip_fillboundary = false;
1224+
}
12231225
}
12241226
}
12251227

Src/LinearSolvers/MLMG/AMReX_MLCurlCurl.H

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ public:
7373
StateMode s_mode, const MLMGBndryT<MF>* bndry=nullptr) const override;
7474

7575
void smooth (int amrlev, int mglev, MF& sol, const MF& rhs,
76-
bool skip_fillboundary=false) const override;
76+
bool skip_fillboundary, int niter) const override;
7777

7878
void solutionResidual (int amrlev, MF& resid, MF& x, const MF& b,
7979
const MF* crse_bcdata=nullptr) override;

Src/LinearSolvers/MLMG/AMReX_MLCurlCurl.cpp

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -319,28 +319,29 @@ MLCurlCurl::apply (int amrlev, int mglev, MF& out, MF& in, BCMode /*bc_mode*/,
319319
}
320320

321321
void MLCurlCurl::smooth (int amrlev, int mglev, MF& sol, const MF& rhs,
322-
bool skip_fillboundary) const
322+
bool skip_fillboundary, int niter) const
323323
{
324324
AMREX_ASSERT(rhs[0].nGrowVect().allGE(1));
325325

326326
applyBC(amrlev, mglev, const_cast<MF&>(rhs), CurlCurlStateType::b);
327-
328327
#if (AMREX_SPACEDIM == 1)
329328
int ncolors = 2;
330329
#else
331330
int ncolors = 4;
332331
#endif
333332

334-
for (int color = 0; color < ncolors; ++color) {
335-
if (!skip_fillboundary) {
336-
applyBC(amrlev, mglev, sol, CurlCurlStateType::x);
337-
}
338-
skip_fillboundary = false;
333+
for (int i = 0; i < niter; ++i) {
334+
for (int color = 0; color < ncolors; ++color) {
335+
if (!skip_fillboundary) {
336+
applyBC(amrlev, mglev, sol, CurlCurlStateType::x);
337+
}
338+
skip_fillboundary = false;
339339
#if (AMREX_SPACEDIM == 1)
340-
smooth1D(amrlev, mglev, sol, rhs, color);
340+
smooth1D(amrlev, mglev, sol, rhs, color);
341341
#else
342-
smooth4(amrlev, mglev, sol, rhs, color);
342+
smooth4(amrlev, mglev, sol, rhs, color);
343343
#endif
344+
}
344345
}
345346
}
346347

Src/LinearSolvers/MLMG/AMReX_MLLinOp.H

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -355,9 +355,10 @@ public:
355355
* \param sol unknowns
356356
* \param rhs RHS
357357
* \param skip_fillboundary flag controlling whether ghost cell filling can be skipped.
358+
* \param niter number of (multicolor) smoothing iterations
358359
*/
359360
virtual void smooth (int amrlev, int mglev, MF& sol, const MF& rhs,
360-
bool skip_fillboundary=false) const = 0;
361+
bool skip_fillboundary, int niter) const = 0;
361362

362363
//! Divide mf by the diagonal component of the operator. Used by bicgstab.
363364
virtual void normalize (int amrlev, int mglev, MF& mf) const {

Src/LinearSolvers/MLMG/AMReX_MLMG.H

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1317,10 +1317,7 @@ MLMGT<MF>::mgVcycle (int amrlev, int mglev_top)
13171317

13181318
setVal(cor[amrlev][mglev], RT(0.0));
13191319
bool skip_fillboundary = true;
1320-
for (int i = 0; i < nu1; ++i) {
1321-
linop.smooth(amrlev, mglev, cor[amrlev][mglev], res[amrlev][mglev], skip_fillboundary);
1322-
skip_fillboundary = false;
1323-
}
1320+
linop.smooth(amrlev, mglev, cor[amrlev][mglev], res[amrlev][mglev], skip_fillboundary, nu1);
13241321

13251322
// rescor = res - L(cor)
13261323
computeResOfCorrection(amrlev, mglev);
@@ -1364,11 +1361,8 @@ MLMGT<MF>::mgVcycle (int amrlev, int mglev_top)
13641361
}
13651362
setVal(cor[amrlev][mglev_bottom], RT(0.0));
13661363
bool skip_fillboundary = true;
1367-
for (int i = 0; i < nu1; ++i) {
1368-
linop.smooth(amrlev, mglev_bottom, cor[amrlev][mglev_bottom],
1369-
res[amrlev][mglev_bottom], skip_fillboundary);
1370-
skip_fillboundary = false;
1371-
}
1364+
linop.smooth(amrlev, mglev_bottom, cor[amrlev][mglev_bottom],
1365+
res[amrlev][mglev_bottom], skip_fillboundary, nu1);
13721366
if (verbose >= 4)
13731367
{
13741368
computeResOfCorrection(amrlev, mglev_bottom);
@@ -1391,9 +1385,7 @@ MLMGT<MF>::mgVcycle (int amrlev, int mglev_top)
13911385
amrex::Print() << print_ident << "AT LEVEL " << amrlev << " " << mglev
13921386
<< " UP: Norm before smooth " << norm << "\n";
13931387
}
1394-
for (int i = 0; i < nu2; ++i) {
1395-
linop.smooth(amrlev, mglev, cor[amrlev][mglev], res[amrlev][mglev]);
1396-
}
1388+
linop.smooth(amrlev, mglev, cor[amrlev][mglev], res[amrlev][mglev], false, nu2);
13971389

13981390
if (cf_strategy == CFStrategy::ghostnodes) { computeResOfCorrection(amrlev, mglev); }
13991391

@@ -1512,10 +1504,7 @@ MLMGT<MF>::actualBottomSolve ()
15121504
if (bottom_solver == BottomSolver::smoother)
15131505
{
15141506
bool skip_fillboundary = true;
1515-
for (int i = 0; i < nuf; ++i) {
1516-
linop.smooth(amrlev, mglev, x, b, skip_fillboundary);
1517-
skip_fillboundary = false;
1518-
}
1507+
linop.smooth(amrlev, mglev, x, b, skip_fillboundary, nuf);
15191508
}
15201509
else
15211510
{
@@ -1589,9 +1578,7 @@ MLMGT<MF>::actualBottomSolve ()
15891578
setVal(cor[amrlev][mglev], RT(0.0));
15901579
}
15911580
const int n = (ret==0) ? nub : nuf;
1592-
for (int i = 0; i < n; ++i) {
1593-
linop.smooth(amrlev, mglev, x, b);
1594-
}
1581+
linop.smooth(amrlev, mglev, x, b, false, n);
15951582
}
15961583
}
15971584

Src/LinearSolvers/MLMG/AMReX_MLNodeLinOp.H

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public:
4545
StateMode s_mode, const MLMGBndry* bndry=nullptr) const final;
4646

4747
void smooth (int amrlev, int mglev, MultiFab& sol, const MultiFab& rhs,
48-
bool skip_fillboundary=false) const override;
48+
bool skip_fillboundary, int niter) const override;
4949

5050
void solutionResidual (int amrlev, MultiFab& resid, MultiFab& x, const MultiFab& b,
5151
const MultiFab* crse_bcdata=nullptr) override;

Src/LinearSolvers/MLMG/AMReX_MLNodeLinOp.cpp

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -167,12 +167,15 @@ MLNodeLinOp::apply (int amrlev, int mglev, MultiFab& out, MultiFab& in, BCMode b
167167

168168
void
169169
MLNodeLinOp::smooth (int amrlev, int mglev, MultiFab& sol, const MultiFab& rhs,
170-
bool skip_fillboundary) const
170+
bool skip_fillboundary, int niter) const
171171
{
172-
if (!skip_fillboundary) {
173-
applyBC(amrlev, mglev, sol, BCMode::Homogeneous, StateMode::Correction);
172+
for (int i = 0; i < niter; ++i) {
173+
if (!skip_fillboundary) {
174+
applyBC(amrlev, mglev, sol, BCMode::Homogeneous, StateMode::Correction);
175+
}
176+
Fsmooth(amrlev, mglev, sol, rhs);
177+
skip_fillboundary = false;
174178
}
175-
Fsmooth(amrlev, mglev, sol, rhs);
176179
}
177180

178181
Real

Src/LinearSolvers/MLMG/AMReX_MLNodeTensorLaplacian.H

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public:
5858
MultiFab& fine_res, MultiFab& fine_sol, const MultiFab& fine_rhs) const final;
5959

6060
void smooth (int amrlev, int mglev, MultiFab& sol, const MultiFab& rhs,
61-
bool skip_fillboundary=false) const final;
61+
bool skip_fillboundary, int niter) const final;
6262

6363
void prepareForSolve () final;
6464
void Fapply (int amrlev, int mglev, MultiFab& out, const MultiFab& in) const final;

Src/LinearSolvers/MLMG/AMReX_MLNodeTensorLaplacian.cpp

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -225,18 +225,20 @@ MLNodeTensorLaplacian::Fapply (int amrlev, int mglev, MultiFab& out, const Multi
225225

226226
void
227227
MLNodeTensorLaplacian::smooth (int amrlev, int mglev, MultiFab& sol, const MultiFab& rhs,
228-
bool skip_fillboundary) const
228+
bool skip_fillboundary, int niter) const
229229
{
230230
BL_PROFILE("MLNodeTensorLaplacian::smooth()");
231-
for (int redblack = 0; redblack < 4; ++redblack) {
232-
if (!skip_fillboundary) {
233-
applyBC(amrlev, mglev, sol, BCMode::Homogeneous, StateMode::Correction);
231+
for (int i = 0; i < niter; ++i) {
232+
for (int redblack = 0; redblack < 4; ++redblack) {
233+
if (!skip_fillboundary) {
234+
applyBC(amrlev, mglev, sol, BCMode::Homogeneous, StateMode::Correction);
235+
}
236+
m_redblack = redblack;
237+
Fsmooth(amrlev, mglev, sol, rhs);
238+
skip_fillboundary = false;
234239
}
235-
m_redblack = redblack;
236-
Fsmooth(amrlev, mglev, sol, rhs);
237-
skip_fillboundary = false;
240+
nodalSync(amrlev, mglev, sol);
238241
}
239-
nodalSync(amrlev, mglev, sol);
240242
}
241243

242244
void

0 commit comments

Comments
 (0)