Block-Structured AMR Software Framework
Loading...
Searching...
No Matches
AMReX_HypreMLABecLap.H
Go to the documentation of this file.
1#ifndef AMREX_HYPRE_ML_ABECLAP_H_
2#define AMREX_HYPRE_ML_ABECLAP_H_
3#include <AMReX_Config.H>
4
6#include <AMReX_Geometry.H>
8#include <AMReX_LO_BCTYPES.H>
9#include <AMReX_MLMGBndry.H>
10#include <AMReX_MultiFab.H>
11#include <AMReX_MultiMask.H>
12
13#include <HYPRE_sstruct_ls.h>
14
15#include <limits>
16#include <unordered_map>
17#include <utility>
18
25
26namespace amrex {
27
28enum struct HypreSolverID {
30};
31
32// single component only, cell centered only
33
38{
39public:
40 HypreMLABecLap (HypreMLABecLap const&) = delete;
44
55 Vector<BoxArray> a_grids,
57 HypreSolverID a_hypre_solver_id,
58 std::string a_parmparse_prefix = "hypre_mlabeclap");
59
61
63 void setVerbose (int v) { m_verbose = v; }
65 void setMaxIter (int v) { m_maxiter = v; }
67 void setIsSingular (bool v) { m_is_singular = v; }
68
75 void setReuseSolverSetup (bool v) { m_reuse_setup = v; }
77 void resetSolverSetup () { if (m_ij_solver) { m_ij_solver->setNeedSetup(); } }
79 void setThrowException (bool t) noexcept { m_throw_exception = t; }
81 [[nodiscard]] int getNumIters () const noexcept { return m_num_iters; }
82 [[nodiscard]] Real getFinalResidualNorm () const noexcept { return m_final_res; }
83
96 void setup (Real a_ascalar, Real a_bscalar,
97 Vector<MultiFab const*> const& a_acoefs,
101 Vector<MultiFab const*> const& a_levelbcdata,
102 std::pair<MultiFab const*, IntVect> const& a_coarse_bc = {nullptr, IntVect(0)});
103
112 void solve (Vector<MultiFab*> const& a_sol, Vector<MultiFab const*> const& a_rhs,
113 Real a_reltol, Real a_abstol);
114
115 // update? updateDirichleBC? or updateCoeffs?
116
117 // public for cuda
118
125 void commBCoefs (int flev, Array<MultiFab const*,AMREX_SPACEDIM> const& a_bcoefs);
133 void commBCoefs_local (int flev, Array<MultiFab const*,AMREX_SPACEDIM> const& a_bcoefs,
134 Vector<FabArrayBase::CopyComTag> const& tags);
135
137 void buildIJMaps ();
138
140 void solveIJ (Vector<MultiFab*> const& a_sol, Vector<MultiFab const*> const& a_rhs,
141 Real a_reltol, Real a_abstol);
142
143private:
144
145 void addNonStencilEntriesToGraph ();
146
149 [[nodiscard]] Long cellId (int lev, IntVect const& iv) const;
150
151 int m_verbose = 0;
152 int m_maxiter = 200;
153 bool m_is_singular = false;
154
155 Vector<Geometry> m_geom;
156 Vector<BoxArray> m_grids;
157 Vector<DistributionMapping> m_dmap;
158 std::string m_parmparse_prefix;
159 int m_nlevels = 0;
160 MPI_Comm m_comm = MPI_COMM_NULL;
161
162 Vector<IntVect> m_ref_ratio;
163
164 Real m_ascalar = std::numeric_limits<Real>::max();
165 Real m_bscalar = std::numeric_limits<Real>::max();
172
173 Vector<std::unique_ptr<MLMGBndry>> m_bndry;
174 Vector<std::unique_ptr<BndryRegister>> m_bndry_rhs;
175 Vector<iMultiFab> m_fine_masks;
176 Vector<iMultiFab> m_crse_masks;
177
178 // For coarse cells at coarse/fine interface. The vector is for AMR
179 // levels.
180 Vector<iMultiFab> m_c2f_offset_from; // offset for sparse coarse from-cells
181 Vector<LayoutData<int>> m_c2f_total_from; // # of coarse from-cells w/ c2f entries
182 Vector<iMultiFab> m_c2f_nentries; // # of non-stencil entries
183 Vector<iMultiFab> m_c2f_offset_to; // offset for sparse to-cells, including fine (and coarse in 3d) cells
184 Vector<LayoutData<int>> m_c2f_total_to; // total sum of non-stencil entries in a Box
185
186 // B coefficients at coarse/fine interface
187 Vector<Array<iMultiFab,AMREX_SPACEDIM>> m_offset_cf_bcoefs;
188 Vector<Array<LayoutData<std::unique_ptr<Gpu::DeviceVector<Real>>>,AMREX_SPACEDIM>> m_cf_bcoefs;
189
190#ifdef AMREX_USE_GPU
191 template <class T> using HostVector = Gpu::PinnedVector<T>;
192#else
193 template <class T> using HostVector = Vector<T>;
194#endif
195
196 // For fine cells at coarse/fine interface. The non-stencil entries are
197 // from fine to coarse. The outer vector is for AMR levels.
198 Vector<HostVector<int>> m_f2c_bno; // local box number
199 Vector<HostVector<IntVect>> m_f2c_cell; // fine cell
200 Vector<Vector<HYPRE_Int>> m_f2c_nentries; // # of non-stencil entries
201 Vector<HostVector<std::size_t>> m_f2c_offset; // offset into m_f2c_values
202 Vector<HostVector<Real>> m_f2c_values; // values for non-stencil entries
203
204 HYPRE_SStructGrid m_ss_grid = nullptr;
205 HYPRE_SStructStencil m_ss_stencil = nullptr;
206 HYPRE_SStructGraph m_ss_graph = nullptr;
207 HYPRE_SStructSolver m_ss_solver = nullptr;
208 HYPRE_SStructSolver m_ss_precond = nullptr;
209 HYPRE_SStructMatrix m_ss_A = nullptr;
210 HYPRE_SStructVector m_ss_x = nullptr;
211 HYPRE_SStructVector m_ss_b = nullptr;
212
213 HYPRE_Solver m_solver = nullptr;
214
217 std::unique_ptr<HypreIJIface> m_ij_solver;
218
221 bool m_use_ij = false;
222 bool m_reuse_setup = false;
223 bool m_throw_exception = false;
224 Vector<Vector<Long>> m_box_offset; // first row id of each box, per level
225 Long m_ij_lower = 0;
226 Long m_ij_upper = -1;
228 std::unordered_map<Long,Vector<Long>> m_ns_targets;
232 Vector<std::unique_ptr<FabArray<BaseFab<Long>>>> m_cell_id;
233 Vector<LayoutData<Gpu::DeviceVector<HYPRE_BigInt>>> m_c2f_targets;
234 Vector<Gpu::DeviceVector<HYPRE_BigInt>> m_f2c_rows;
235 Vector<Gpu::DeviceVector<HYPRE_BigInt>> m_f2c_cols;
236 Gpu::DeviceVector<HYPRE_BigInt> m_ij_rowids; // the local rows
237
241 enum class Backend { hypre, algmg };
242 Backend m_backend = Backend::hypre;
243 int m_num_iters = 0; // last solve (IJ mode)
244 Real m_final_res = 0.0;
245 Vector<Long> m_rank_offset; // first row of each rank, plus the total
246 composite::OwnedCSR m_csr; // owned rows (AlgMG backend, dumps)
247 std::unique_ptr<SpMatrix<Real>> m_spA;
248 std::unique_ptr<AlgMG<Real>> m_algmg;
249
257 int m_dump_max = 0;
258 std::string m_dump_prefix;
259 Long m_dump_gather_max = 50000000;
260 void dumpSystem (int k, Gpu::DeviceVector<Real> const& v, bool solution);
262 void fail (std::string const& msg) const;
263
264 HypreSolverID m_hypre_solver_id = HypreSolverID::BoomerAMG;
265 HYPRE_Int m_hypre_object_type = HYPRE_PARCSR;
266};
267
268}
269
270#endif
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:1543
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:1209
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:2079
void resetSolverSetup()
IJ mode only: redo the solver/preconditioner setup at the next solve.
Definition AMReX_HypreMLABecLap.H:77
void setVerbose(int v)
Set HYPRE's logging verbosity (v).
Definition AMReX_HypreMLABecLap.H:63
~HypreMLABecLap()
Definition AMReX_HypreMLABecLap.cpp:248
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:1752
int getNumIters() const noexcept
Iterations and final relative residual of the last solve.
Definition AMReX_HypreMLABecLap.H:81
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:586
HypreMLABecLap(HypreMLABecLap &&)=delete
void buildIJMaps()
Build the device maps of the IJ assembly; public for cuda.
Definition AMReX_HypreMLABecLap.cpp:1445
Real getFinalResidualNorm() const noexcept
Definition AMReX_HypreMLABecLap.H:82
void setThrowException(bool t) noexcept
Throw std::runtime_error instead of aborting when the solve fails.
Definition AMReX_HypreMLABecLap.H:79
HypreMLABecLap & operator=(HypreMLABecLap const &)=delete
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