Block-Structured AMR Software Framework
Loading...
Searching...
No Matches
AMReX_MLNodeLinOp.H
Go to the documentation of this file.
1#ifndef AMREX_ML_NODE_LINOP_H_H
2#define AMREX_ML_NODE_LINOP_H_H
3#include <AMReX_Config.H>
4
5#include <AMReX_MLLinOp.H>
6#include <AMReX_iMultiFab.H>
7#include <AMReX_MultiFab.H>
8
9#if defined(AMREX_USE_HYPRE) && (AMREX_SPACEDIM > 1)
10#include <AMReX_HypreNodeLap.H>
11#endif
12
13namespace amrex {
14
20
22 : public MLLinOp
23{
24public:
25
26 friend class HypreMLNodeLap;
27
28 enum struct CoarseningStrategy : int { Sigma, RAP };
29
30 MLNodeLinOp ();
31 ~MLNodeLinOp () override = default;
32
33 MLNodeLinOp (const MLNodeLinOp&) = delete;
37
49 void define (const Vector<Geometry>& a_geom,
50 const Vector<BoxArray>& a_grids,
51 const Vector<DistributionMapping>& a_dmap,
52 const LPInfo& a_info = LPInfo(),
53 const Vector<FabFactory<FArrayBox> const*>& a_factory = {},
54 int a_eb_limit_coarsening = -1);
55
65 void setSmoothNumSweeps (int nsweeps) noexcept {
66 m_smooth_num_sweeps = nsweeps;
67 }
68
69 void setLevelBC (int /*amrlev*/, const MultiFab* /*levelbcdata*/,
70 const MultiFab* = nullptr, const MultiFab* = nullptr,
71 const MultiFab* = nullptr) final {}
72
84 void apply (int amrlev, int mglev, MultiFab& out, MultiFab& in, BCMode bc_mode,
85 StateMode s_mode, const MLMGBndry* bndry=nullptr) const final;
86
97 void smooth (int amrlev, int mglev, MultiFab& sol, const MultiFab& rhs,
98 bool skip_fillboundary, int niter) const override;
99
101 void solutionResidual (int amrlev, MultiFab& resid, MultiFab& x, const MultiFab& b,
102 const MultiFab* crse_bcdata=nullptr) override;
104 void correctionResidual (int amrlev, int mglev, MultiFab& resid, MultiFab& x, const MultiFab& b,
105 BCMode bc_mode, const MultiFab* crse_bcdata=nullptr) override;
106
108 Vector<Real> getSolvabilityOffset (int amrlev, int mglev,
109 MultiFab const& rhs) const override;
111 void fixSolvabilityByOffset (int amrlev, int mglev, MultiFab& rhs,
112 Vector<Real> const& offset) const override;
113
115 void prepareForSolve () override;
116
118 void preparePrecond () override;
119
121 void setDirichletNodesToZero (int amrlev, int mglev, MultiFab& mf) const override;
122
123 bool isSingular (int amrlev) const override
124 { return (amrlev == 0) ? m_is_bottom_singular : false; }
125 bool isBottomSingular () const override { return m_is_bottom_singular; }
126
128 Real xdoty (int amrlev, int mglev, const MultiFab& x, const MultiFab& y, bool local) const final;
129
132 Vector<MultiFab const*> const& y) const final;
133
135 Real norm2Precond (Vector<MultiFab const*> const& x) const final;
136
147 virtual void applyBC (int amrlev, int mglev, MultiFab& phi, BCMode bc_mode, StateMode state_mode,
148 bool skip_fillboundary=false) const;
149
158 virtual void Fapply (int amrlev, int mglev, MultiFab& out, const MultiFab& in) const = 0;
167 virtual void Fsmooth (int amrlev, int mglev, MultiFab& sol, const MultiFab& rhs) const = 0;
168
170 void nodalSync (int amrlev, int mglev, MultiFab& mf) const;
171
179 static std::unique_ptr<iMultiFab> makeOwnerMask (const BoxArray& ba,
180 const DistributionMapping& dm,
181 const Geometry& geom);
182
184 void buildMasks ();
185
186 // omask is either 0 or 1. 1 means the node is an unknown. 0 means it's known.
193 void setOversetMask (int amrlev, const iMultiFab& a_dmask);
194
195 virtual void fixUpResidualMask (int /*amrlev*/, iMultiFab& /*resmsk*/) { }
196
198 Real normInf (int amrlev, MultiFab const& mf, bool local) const override;
199
201 void avgDownResAmr (int, MultiFab&, MultiFab const&) const final { }
202
211 void interpolationAmr (int famrlev, MultiFab& fine, const MultiFab& crse,
212 IntVect const& nghost) const override;
213
219 void averageDownAndSync (Vector<MultiFab>& sol) const override;
220
230 void interpAssign (int amrlev, int fmglev, MultiFab& fine, MultiFab& crse) const override;
231
232#if (AMREX_SPACEDIM > 1)
233 [[nodiscard]] std::unique_ptr<MLAlgMG> makeAlgMG (int mglev) const override;
234#endif
235
236#if defined(AMREX_USE_HYPRE) && (AMREX_SPACEDIM > 1)
243 [[nodiscard]] std::unique_ptr<HypreNodeLap> makeHypreNodeLap(
244 int bottom_verbose,
245 const std::string& options_namespace) const override;
246
247 virtual void fillIJMatrix (MFIter const& /*mfi*/,
249 Array4<int const> const& /*lid*/,
250 HypreNodeLap::Int* /*ncols*/,
251 HypreNodeLap::Int* /*cols*/,
252 Real* /*mat*/) const
253 {
254 amrex::Abort("MLNodeLinOp::fillIJMatrix: how did we get here?");
255 }
256#endif
257
266 virtual void fillAlgMatrix (int /*mglev*/, MFIter const& /*mfi*/,
267 Array4<Long const> const& /*gid*/,
268 Array4<int const> const& /*lid*/,
269 Long* /*ncols*/, Long* /*cols*/, Real* /*mat*/) const
270 {
271 amrex::Abort("MLNodeLinOp::fillAlgMatrix: not supported by this operator");
272 }
273
275 virtual void fillRHS (int /*mglev*/, MFIter const& /*mfi*/,
276 Array4<int const> const& /*lid*/,
277 Real* /*rhs*/,
278 Array4<Real const> const& /*bfab*/) const
279 {
280 amrex::Abort("MLNodeLinOp:fillRHS: how did we get here?");
281 }
282
283protected:
284
285 void resizeMultiGrid (int new_size) override;
286
287 void buildMGHierarchy () override;
288
289 std::unique_ptr<iMultiFab> m_owner_mask_top; // ownership of nodes
290 std::unique_ptr<iMultiFab> m_owner_mask_bottom;
292 Vector<std::unique_ptr<iMultiFab> > m_cc_fine_mask; // cell-centered mask for cells covered by fine
293 Vector<std::unique_ptr<iMultiFab> > m_nd_fine_mask; // nodal mask: 0: this level node, 1: c/f boundary, 2: fine node
294 Vector<std::unique_ptr<LayoutData<int> > > m_has_fine_bndry; // does this fab contain c/f boundary?
298
300
301#ifdef AMREX_USE_EB
303#else
305#endif
306
307 bool m_masks_built = false;
310 mutable bool m_in_solution_mode = true;
311
312private:
313 bool m_is_bottom_singular = false;
314};
315
316}
317
318#endif
Reference-counted collection of Boxes.
Definition AMReX_BoxArray.H:681
Calculates the distribution of FABs to MPI processes.
Definition AMReX_DistributionMapping.H:51
Abstract factory interface for creating, aliasing, and destroying FAB objects.
Definition AMReX_FabFactory.H:73
Rectangular problem domain geometry.
Definition AMReX_Geometry.H:87
HYPRE_Int Int
Definition AMReX_HypreNodeLap.H:59
Iterator for looping ever tiles and boxes of amrex::FabArray based containers.
Definition AMReX_MFIter.H:88
MLNodeLinOp(MLNodeLinOp &&)=delete
Vector< std::unique_ptr< iMultiFab > > m_nd_fine_mask
Definition AMReX_MLNodeLinOp.H:293
friend class HypreMLNodeLap
Definition AMReX_MLNodeLinOp.H:26
void nodalSync(int amrlev, int mglev, MultiFab &mf) const
Synchronize nodal values across box/partition boundaries on (amrlev,mglev).
Definition AMReX_MLNodeLinOp.cpp:118
MultiFab m_coarse_dot_mask
Definition AMReX_MLNodeLinOp.H:296
Real dotProductPrecond(Vector< MultiFab const * > const &x, Vector< MultiFab const * > const &y) const final
Dot product used when the operator acts as a preconditioner.
Definition AMReX_MLNodeLinOp.cpp:199
void correctionResidual(int amrlev, int mglev, MultiFab &resid, MultiFab &x, const MultiFab &b, BCMode bc_mode, const MultiFab *crse_bcdata=nullptr) override
Residual helper for correction solves (optionally homogeneous BCs) on (amrlev,mglev).
Definition AMReX_MLNodeLinOp.cpp:153
void define(const Vector< Geometry > &a_geom, const Vector< BoxArray > &a_grids, const Vector< DistributionMapping > &a_dmap, const LPInfo &a_info=LPInfo(), const Vector< FabFactory< FArrayBox > const * > &a_factory={}, int a_eb_limit_coarsening=-1)
Bind the nodal operator to an AMR hierarchy.
Definition AMReX_MLNodeLinOp.cpp:24
bool isBottomSingular() const override
Is the bottom of the multigrid hierarchy singular?
Definition AMReX_MLNodeLinOp.H:125
bool m_in_solution_mode
Definition AMReX_MLNodeLinOp.H:310
virtual void fixUpResidualMask(int, iMultiFab &)
Definition AMReX_MLNodeLinOp.H:195
bool m_masks_built
Definition AMReX_MLNodeLinOp.H:307
CoarseningStrategy
Definition AMReX_MLNodeLinOp.H:28
@ Sigma
Definition AMReX_MLNodeLinOp.H:28
@ RAP
Definition AMReX_MLNodeLinOp.H:28
std::unique_ptr< iMultiFab > m_owner_mask_bottom
Definition AMReX_MLNodeLinOp.H:290
virtual void Fsmooth(int amrlev, int mglev, MultiFab &sol, const MultiFab &rhs) const =0
Low-level smoother invoked by the base class.
MultiFab m_bottom_dot_mask
Definition AMReX_MLNodeLinOp.H:295
void interpAssign(int amrlev, int fmglev, MultiFab &fine, MultiFab &crse) const override
Overwrite fine data with the prolongation of coarse data (fine = prolong(crse)).
Definition AMReX_MLNodeLinOp.cpp:705
MLNodeLinOp & operator=(const MLNodeLinOp &)=delete
virtual void fillAlgMatrix(int, MFIter const &, Array4< Long const > const &, Array4< int const > const &, Long *, Long *, Real *) const
Fill the matrix rows of one box for the algebraic solver.
Definition AMReX_MLNodeLinOp.H:266
void interpolationAmr(int famrlev, MultiFab &fine, const MultiFab &crse, IntVect const &nghost) const override
Prolong AMR-level data during FMG initialization.
Definition AMReX_MLNodeLinOp.cpp:651
void smooth(int amrlev, int mglev, MultiFab &sol, const MultiFab &rhs, bool skip_fillboundary, int niter) const override
Invoke the nodal smoother on (amrlev,mglev).
Definition AMReX_MLNodeLinOp.cpp:170
Real normInf(int amrlev, MultiFab const &mf, bool local) const override
Infinity norm helper operating on level amrlev (set local to true to skip MPI reduction).
Definition AMReX_MLNodeLinOp.cpp:597
MLNodeLinOp(const MLNodeLinOp &)=delete
void avgDownResAmr(int, MultiFab &, MultiFab const &) const final
Nodal average-down for residuals between AMR levels (no-op here).
Definition AMReX_MLNodeLinOp.H:201
Vector< std::unique_ptr< LayoutData< int > > > m_has_fine_bndry
Definition AMReX_MLNodeLinOp.H:294
bool m_overset_dirichlet_mask
Definition AMReX_MLNodeLinOp.H:308
Vector< Real > getSolvabilityOffset(int amrlev, int mglev, MultiFab const &rhs) const override
Return component-wise solvability offsets for (amrlev,mglev, rhs).
Definition AMReX_MLNodeLinOp.cpp:226
std::unique_ptr< MLAlgMG > makeAlgMG(int mglev) const override
Build the algebraic system of MG level mglev of AMR level 0 for the AlgMG solver. Operators that hypr...
Definition AMReX_MLNodeLinOp.cpp:748
void setLevelBC(int, const MultiFab *, const MultiFab *=nullptr, const MultiFab *=nullptr, const MultiFab *=nullptr) final
Set boundary conditions for given level. For cell-centered solves only.
Definition AMReX_MLNodeLinOp.H:69
void preparePrecond() override
Prepare auxiliary data used when the operator acts as a preconditioner.
Definition AMReX_MLNodeLinOp.cpp:416
Real norm2Precond(Vector< MultiFab const * > const &x) const final
L2 norm used when the operator acts as a preconditioner.
Definition AMReX_MLNodeLinOp.cpp:213
void fixSolvabilityByOffset(int amrlev, int mglev, MultiFab &rhs, Vector< Real > const &offset) const override
Subtract offsets produced by getSolvabilityOffset() from rhs.
Definition AMReX_MLNodeLinOp.cpp:251
Vector< std::unique_ptr< iMultiFab > > m_cc_fine_mask
Definition AMReX_MLNodeLinOp.H:292
Real xdoty(int amrlev, int mglev, const MultiFab &x, const MultiFab &y, bool local) const final
Dot-product helper.
Definition AMReX_MLNodeLinOp.cpp:183
void solutionResidual(int amrlev, MultiFab &resid, MultiFab &x, const MultiFab &b, const MultiFab *crse_bcdata=nullptr) override
Residual helper that uses solution BCs and optional coarse data (operates on AMR level amrlev).
Definition AMReX_MLNodeLinOp.cpp:124
void averageDownAndSync(Vector< MultiFab > &sol) const override
Average nodal solutions down the AMR hierarchy and synchronize overlaps.
Definition AMReX_MLNodeLinOp.cpp:683
virtual void fillRHS(int, MFIter const &, Array4< int const > const &, Real *, Array4< Real const > const &) const
Fill the right-hand side of the rows of one box on MG level mglev.
Definition AMReX_MLNodeLinOp.H:275
void prepareForSolve() override
Prepare BC caches, masks, and metadata prior to solving.
Definition AMReX_MLNodeLinOp.cpp:101
void buildMasks()
Build Dirichlet/dot-product masks and determine bottom singularity.
Definition AMReX_MLNodeLinOp.cpp:288
std::unique_ptr< iMultiFab > m_owner_mask_top
Definition AMReX_MLNodeLinOp.H:289
Vector< Vector< std::unique_ptr< iMultiFab > > > m_dirichlet_mask
Definition AMReX_MLNodeLinOp.H:291
Vector< std::unique_ptr< iMultiFab > > m_norm_fine_mask
Definition AMReX_MLNodeLinOp.H:299
MLNodeLinOp()
Definition AMReX_MLNodeLinOp.cpp:18
int m_smooth_num_sweeps
Definition AMReX_MLNodeLinOp.H:309
void apply(int amrlev, int mglev, MultiFab &out, MultiFab &in, BCMode bc_mode, StateMode s_mode, const MLMGBndry *bndry=nullptr) const final
Apply the nodal operator with the requested BC/state modes.
Definition AMReX_MLNodeLinOp.cpp:162
void resizeMultiGrid(int new_size) override
Definition AMReX_MLNodeLinOp.cpp:538
void buildMGHierarchy() override
Build the MG levels of AMR level 0 below the finest one.
Definition AMReX_MLNodeLinOp.cpp:572
void setSmoothNumSweeps(int nsweeps) noexcept
Control how many smoother passes are executed inside each Fsmooth call.
Definition AMReX_MLNodeLinOp.H:65
void setDirichletNodesToZero(int amrlev, int mglev, MultiFab &mf) const override
Zero Dirichlet nodes in mf before a correction or residual pass.
Definition AMReX_MLNodeLinOp.cpp:470
static std::unique_ptr< iMultiFab > makeOwnerMask(const BoxArray &ba, const DistributionMapping &dm, const Geometry &geom)
Build a nodal mask that marks points owned by this rank (used for sync).
Definition AMReX_MLNodeLinOp.cpp:109
Vector< MultiFab > m_precond_weight_mask
Definition AMReX_MLNodeLinOp.H:297
bool isSingular(int amrlev) const override
Is it singular on AMR level amrlev?
Definition AMReX_MLNodeLinOp.H:123
~MLNodeLinOp() override=default
CoarseningStrategy m_coarsening_strategy
Definition AMReX_MLNodeLinOp.H:302
virtual void applyBC(int amrlev, int mglev, MultiFab &phi, BCMode bc_mode, StateMode state_mode, bool skip_fillboundary=false) const
Apply physical BCs prior to smoothing/apply.
Definition AMReX_MLNodeLinOp.cpp:508
void setOversetMask(int amrlev, const iMultiFab &a_dmask)
Mark nodes that belong to overset (known) regions.
Definition AMReX_MLNodeLinOp.cpp:489
virtual void Fapply(int amrlev, int mglev, MultiFab &out, const MultiFab &in) const =0
Low-level apply invoked by the base class.
A collection (stored as an array) of FArrayBox objects.
Definition AMReX_MultiFab.H:40
This class is a thin wrapper around std::vector. Unlike vector, Vector::operator[] provides bound che...
Definition AMReX_Vector.H:29
A Collection of IArrayBoxes.
Definition AMReX_iMultiFab.H:34
amrex_real Real
Floating Point Type for Fields.
Definition AMReX_REAL.H:80
amrex_long Long
Definition AMReX_INT.H:30
ArrayND< T, 4, true > Array4
Convenient alias for a 4D ArrayND with three spatial dimensions plus a component dimension.
Definition AMReX_Array4.H:1340
MLLinOpT< MultiFab > MLLinOp
Definition AMReX_MLLinOp.H:2286
Definition AMReX_Amr.cpp:50
MLMGBndryT< MultiFab > MLMGBndry
Definition AMReX_MLMGBndry.H:211
@ y
Definition AMReX_Orientation.H:14
@ x
Definition AMReX_Orientation.H:14
SpMatrix< T, Allocator > RAP(SpMatrix< T, Allocator > const &R, SpMatrix< T, Allocator > const &A, SpMatrix< T, Allocator > const &P, AlgPartition const &col_partition)
Galerkin product R (A P), with the result of SpGEMM(R, SpGEMM(A, P, col_partition),...
Definition AMReX_SpGEMM.H:1368
IntVectND< 3 > IntVect
IntVect is an alias for amrex::IntVectND instantiated with AMREX_SPACEDIM.
Definition AMReX_BaseFwd.H:38
void Abort(const std::string &msg)
Print a fatal-error message to stderr and abort execution.
Definition AMReX.cpp:244
Configuration knobs for multilevel linear operators (grid agglomeration, metrics, etc....
Definition AMReX_MLLinOp.H:53