1#ifndef AMREX_HYPRE_ML_ABECLAP_H_
2#define AMREX_HYPRE_ML_ABECLAP_H_
3#include <AMReX_Config.H>
13#include <HYPRE_sstruct_ls.h>
16#include <unordered_map>
58 std::string a_parmparse_prefix =
"hypre_mlabeclap");
82 if (m_ij_solver) { m_ij_solver->setNeedSetup(); }
88 [[nodiscard]]
int getNumIters () const noexcept {
return m_num_iters; }
109 std::pair<MultiFab const*, IntVect>
const& a_coarse_bc = {
nullptr,
IntVect(0)});
119 void solve (Vector<MultiFab*>
const& a_sol, Vector<MultiFab const*>
const& a_rhs,
141 Vector<FabArrayBase::CopyComTag>
const& tags);
155 void solveIJ (Vector<MultiFab*>
const& a_sol, Vector<MultiFab const*>
const& a_rhs,
160 void addNonStencilEntriesToGraph ();
164 [[nodiscard]]
Long cellId (
int lev,
IntVect const& iv)
const;
168 bool m_is_singular =
false;
170 Vector<Geometry> m_geom;
171 Vector<BoxArray> m_grids;
172 Vector<DistributionMapping> m_dmap;
173 std::string m_parmparse_prefix;
177 Vector<IntVect> m_ref_ratio;
179 Real m_ascalar = std::numeric_limits<Real>::max();
180 Real m_bscalar = std::numeric_limits<Real>::max();
188 Vector<std::unique_ptr<MLMGBndry>> m_bndry;
189 Vector<std::unique_ptr<BndryRegister>> m_bndry_rhs;
190 Vector<iMultiFab> m_fine_masks;
191 Vector<iMultiFab> m_crse_masks;
195 Vector<iMultiFab> m_c2f_offset_from;
196 Vector<LayoutData<int>> m_c2f_total_from;
197 Vector<iMultiFab> m_c2f_nentries;
198 Vector<iMultiFab> m_c2f_offset_to;
199 Vector<LayoutData<int>> m_c2f_total_to;
202 Vector<Array<iMultiFab,AMREX_SPACEDIM>> m_offset_cf_bcoefs;
203 Vector<Array<LayoutData<std::unique_ptr<Gpu::DeviceVector<Real>>>,AMREX_SPACEDIM>> m_cf_bcoefs;
208 template <
class T>
using HostVector = Vector<T>;
213 Vector<HostVector<int>> m_f2c_bno;
214 Vector<HostVector<IntVect>> m_f2c_cell;
215 Vector<Vector<HYPRE_Int>> m_f2c_nentries;
216 Vector<HostVector<std::size_t>> m_f2c_offset;
217 Vector<HostVector<Real>> m_f2c_values;
219 HYPRE_SStructGrid m_ss_grid =
nullptr;
220 HYPRE_SStructStencil m_ss_stencil =
nullptr;
221 HYPRE_SStructGraph m_ss_graph =
nullptr;
222 HYPRE_SStructSolver m_ss_solver =
nullptr;
223 HYPRE_SStructSolver m_ss_precond =
nullptr;
224 HYPRE_SStructMatrix m_ss_A =
nullptr;
225 HYPRE_SStructVector m_ss_x =
nullptr;
226 HYPRE_SStructVector m_ss_b =
nullptr;
228 HYPRE_Solver m_solver =
nullptr;
232 std::unique_ptr<HypreIJIface> m_ij_solver;
236 bool m_use_ij =
false;
237 bool m_reuse_setup =
false;
238 bool m_throw_exception =
false;
240 bool m_ij_vectors_assembled =
false;
241 bool m_ij_gather_failed =
false;
243 bool m_algmg_reset =
false;
245 bool m_algmg_kept =
false;
246 int m_reuse_max_iter = 0;
247 Vector<Vector<Long>> m_box_offset;
249 Long m_ij_upper = -1;
251 std::unordered_map<Long,Vector<Long>> m_ns_targets;
255 Vector<std::unique_ptr<FabArray<BaseFab<Long>>>> m_cell_id;
256 Vector<LayoutData<Gpu::DeviceVector<HYPRE_BigInt>>> m_c2f_targets;
257 Vector<Gpu::DeviceVector<HYPRE_BigInt>> m_f2c_rows;
258 Vector<Gpu::DeviceVector<HYPRE_BigInt>> m_f2c_cols;
268 [[nodiscard]]
bool empty ()
const {
return offset.
empty(); }
269 [[nodiscard]]
Long numTriplets ()
const {
return Long(trip.size()); }
270 void clear () { offset.clear(); trip.clear(); }
274 EntryGather m_ij_gather;
279 enum class Backend { hypre, algmg };
280 Backend m_backend = Backend::hypre;
282 Real m_final_res = 0.0;
283 Vector<Long> m_rank_offset;
284 composite::OwnedCSR m_csr;
285 std::unique_ptr<SpMatrix<Real>> m_spA;
286 std::unique_ptr<AlgMG<Real>> m_algmg;
291 EntryGather m_alg_gather;
301 std::string m_dump_prefix;
302 Long m_dump_gather_max = 50000000;
305 void fail (std::string
const& msg)
const;
308 HYPRE_Int m_hypre_object_type = HYPRE_PARCSR;
Problem-domain geometry: maps between index space and physical space.
Constants describing linear-operator boundary condition types.
MultiFab-style container that stores Mask objects per grid.
#define AMREX_D_DECL(a, b, c)
Definition AMReX_SPACE.H:171
void solveIJ(Vector< MultiFab * > const &a_sol, Vector< MultiFab const * > const &a_rhs, Real a_reltol, Real a_abstol)
Solve with the IJ system (see m_use_ij); public for cuda.
Definition AMReX_HypreMLABecLap.cpp:1751
void solve(Vector< MultiFab * > const &a_sol, Vector< MultiFab const * > const &a_rhs, Real a_reltol, Real a_abstol)
Solve the assembled system with HYPRE (single-component).
Definition AMReX_HypreMLABecLap.cpp:1310
void setMaxIter(int v)
Override the maximum number of HYPRE iterations (v).
Definition AMReX_HypreMLABecLap.H:65
void setReuseSolverSetup(bool v)
IJ mode only: let setup() be called again with new coefficients (same grids), updating the matrix val...
Definition AMReX_HypreMLABecLap.H:75
HypreMLABecLap(HypreMLABecLap const &)=delete
void commBCoefs_local(int flev, Array< MultiFab const *, 3 > const &a_bcoefs, Vector< FabArrayBase::CopyComTag > const &tags)
Local portion of commBCoefs used to issue device-friendly copies.
Definition AMReX_HypreMLABecLap.cpp:2358
void resetSolverSetup()
IJ mode only: redo the solver/preconditioner setup at the next solve.
Definition AMReX_HypreMLABecLap.H:81
void setVerbose(int v)
Set HYPRE's logging verbosity (v).
Definition AMReX_HypreMLABecLap.H:63
~HypreMLABecLap()
Definition AMReX_HypreMLABecLap.cpp:274
void commBCoefs(int flev, Array< MultiFab const *, 3 > const &a_bcoefs)
Communicate b coefficients needed by level flev at coarse/fine interfaces.
Definition AMReX_HypreMLABecLap.cpp:2031
int getNumIters() const noexcept
Iterations and final relative residual of the last solve.
Definition AMReX_HypreMLABecLap.H:88
void setReuseSetupMaxIter(int n) noexcept
Definition AMReX_HypreMLABecLap.H:79
void setIsSingular(bool v)
Flag whether the assembled operator is singular (v).
Definition AMReX_HypreMLABecLap.H:67
void setup(Real a_ascalar, Real a_bscalar, Vector< MultiFab const * > const &a_acoefs, Vector< Array< MultiFab const *, 3 > > const &a_bcoefs, Array< LinOpBCType, 3 > const &a_lobc, Array< LinOpBCType, 3 > const &a_hibc, Vector< MultiFab const * > const &a_levelbcdata, std::pair< MultiFab const *, IntVect > const &a_coarse_bc={nullptr, IntVect(0)})
Assemble the HYPRE operators/storage for the provided coefficients.
Definition AMReX_HypreMLABecLap.cpp:612
HypreMLABecLap(HypreMLABecLap &&)=delete
void buildIJMaps()
Build the device maps of the IJ assembly; public for cuda.
Definition AMReX_HypreMLABecLap.cpp:1546
Real getFinalResidualNorm() const noexcept
Definition AMReX_HypreMLABecLap.H:89
void setThrowException(bool t) noexcept
Throw std::runtime_error instead of aborting when the solve fails.
Definition AMReX_HypreMLABecLap.H:86
void buildIJSlots(Gpu::DeviceVector< HYPRE_BigInt > const &rows, Gpu::DeviceVector< HYPRE_BigInt > const &cols)
Definition AMReX_HypreMLABecLap.cpp:1644
void updateIJValues(Gpu::DeviceVector< Real > const &vals)
Definition AMReX_HypreMLABecLap.cpp:1720
HypreMLABecLap & operator=(HypreMLABecLap const &)=delete
bool empty() const noexcept
Definition AMReX_PODVector.H:658
This class is a thin wrapper around std::vector. Unlike vector, Vector::operator[] provides bound che...
Definition AMReX_Vector.H:29
amrex_real Real
Floating Point Type for Fields.
Definition AMReX_REAL.H:80
amrex_long Long
Definition AMReX_INT.H:30
PODVector< T, PinnedArenaAllocator< T > > PinnedVector
A PODVector that uses the pinned memory arena.
Definition AMReX_GpuContainers.H:48
std::array< T, N > Array
Definition AMReX_Array.H:31
PODVector< T, ArenaAllocator< T > > DeviceVector
A PODVector that uses the standard memory Arena. Note that the memory might or might not be managed d...
Definition AMReX_GpuContainers.H:24
int MPI_Comm
Definition AMReX_ccse-mpi.H:51
static constexpr int MPI_COMM_NULL
Definition AMReX_ccse-mpi.H:59
Definition AMReX_Amr.cpp:50
@ bogus
Definition AMReX_LO_BCTYPES.H:39
IntVectND< 3 > IntVect
IntVect is an alias for amrex::IntVectND instantiated with AMREX_SPACEDIM.
Definition AMReX_BaseFwd.H:38
HypreSolverID
Definition AMReX_HypreMLABecLap.H:28
@ BoomerAMG
Definition AMReX_HypreMLABecLap.H:29
@ SSAMG
Definition AMReX_HypreMLABecLap.H:29