Skip to content

Commit df0d594

Browse files
Curl Curl Solver: Option to use PCG instead of LU (#3812)
Add support for variable beta coefficient. --------- Co-authored-by: Revathi Jambunathan <41089244+RevathiJambunathan@users.noreply.github.com>
1 parent 12002e7 commit df0d594

File tree

8 files changed

+277
-117
lines changed

8 files changed

+277
-117
lines changed

Src/LinearSolvers/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ foreach(D IN LISTS AMReX_SPACEDIM)
2121
MLMG/AMReX_MLCellABecLap_K.H
2222
MLMG/AMReX_MLCellABecLap_${D}D_K.H
2323
MLMG/AMReX_MLCGSolver.H
24+
MLMG/AMReX_PCGSolver.H
2425
MLMG/AMReX_MLABecLaplacian.H
2526
MLMG/AMReX_MLABecLap_K.H
2627
MLMG/AMReX_MLABecLap_${D}D_K.H

Src/LinearSolvers/MLMG/AMReX_MLCurlCurl.H

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ public:
5858
return std::string("curl of curl");
5959
}
6060

61+
bool setUsePCG (bool flag) { return std::exchange(m_use_pcg, flag); }
62+
6163
void setLevelBC (int amrlev, const MF* levelbcdata,
6264
const MF* robinbc_a = nullptr,
6365
const MF* robinbc_b = nullptr,
@@ -137,6 +139,7 @@ private:
137139
Vector<Vector<std::unique_ptr<Gpu::DeviceScalar
138140
<LUSolver<AMREX_SPACEDIM*2,RT>>>>> m_lusolver;
139141
Vector<Vector<Array<std::unique_ptr<MultiFab>,3>>> m_bcoefs;
142+
bool m_use_pcg = false;
140143
};
141144

142145
}

Src/LinearSolvers/MLMG/AMReX_MLCurlCurl.cpp

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -353,22 +353,36 @@ void MLCurlCurl::smooth4 (int amrlev, int mglev, MF& sol, MF const& rhs,
353353
auto* plusolver = m_lusolver[amrlev][mglev]->dataPtr();
354354
ParallelFor(nmf, [=] AMREX_GPU_DEVICE (int bno, int i, int j, int k)
355355
{
356-
mlcurlcurl_gs4(i,j,k,ex[bno],ey[bno],ez[bno],rhsx[bno],rhsy[bno],rhsz[bno],
356+
mlcurlcurl_gs4_lu(i,j,k,ex[bno],ey[bno],ez[bno],
357+
rhsx[bno],rhsy[bno],rhsz[bno],
357358
#if (AMREX_SPACEDIM == 2)
358-
b,
359+
b,
359360
#endif
360-
adxinv,color,*plusolver,dinfo,sinfo);
361+
adxinv,color,*plusolver,dinfo,sinfo);
361362
});
362363
} else {
363364
auto const& bcx = m_bcoefs[amrlev][mglev][0]->const_arrays();
364365
auto const& bcy = m_bcoefs[amrlev][mglev][1]->const_arrays();
365366
auto const& bcz = m_bcoefs[amrlev][mglev][2]->const_arrays();
366-
ParallelFor(nmf, [=] AMREX_GPU_DEVICE (int bno, int i, int j, int k)
367-
{
367+
if (m_use_pcg) {
368+
ParallelFor(nmf, [=] AMREX_GPU_DEVICE (int bno, int i, int j, int k)
369+
{
368370

369-
mlcurlcurl_gs4(i,j,k,ex[bno],ey[bno],ez[bno],rhsx[bno],rhsy[bno],rhsz[bno],
370-
adxinv,color,bcx[bno],bcy[bno],bcz[bno],dinfo,sinfo);
371-
});
371+
mlcurlcurl_gs4<true>(i,j,k,ex[bno],ey[bno],ez[bno],
372+
rhsx[bno],rhsy[bno],rhsz[bno],
373+
adxinv,color,bcx[bno],bcy[bno],bcz[bno],
374+
dinfo,sinfo);
375+
});
376+
} else {
377+
ParallelFor(nmf, [=] AMREX_GPU_DEVICE (int bno, int i, int j, int k)
378+
{
379+
380+
mlcurlcurl_gs4<false>(i,j,k,ex[bno],ey[bno],ez[bno],
381+
rhsx[bno],rhsy[bno],rhsz[bno],
382+
adxinv,color,bcx[bno],bcy[bno],bcz[bno],
383+
dinfo,sinfo);
384+
});
385+
}
372386
}
373387
Gpu::streamSynchronize();
374388
}

0 commit comments

Comments
 (0)