1#ifndef AMREX_ML_NODE_LINOP_H_H
2#define AMREX_ML_NODE_LINOP_H_H
3#include <AMReX_Config.H>
9#if defined(AMREX_USE_HYPRE) && (AMREX_SPACEDIM > 1)
52 int a_eb_limit_coarsening = -1);
93 bool skip_fillboundary,
int niter) const override;
97 const
MultiFab* crse_bcdata=
nullptr) override;
104 MultiFab const& rhs) const override;
119 {
return (amrlev == 0) ? m_is_bottom_singular :
false; }
143 bool skip_fillboundary=
false)
const;
207 IntVect const& nghost)
const override;
227#if defined(AMREX_USE_HYPRE) && (AMREX_SPACEDIM > 1)
234 [[nodiscard]] std::unique_ptr<HypreNodeLap> makeHypreNodeLap(
236 const std::string& options_namespace)
const override;
238 virtual void fillIJMatrix (
MFIter const& ,
245 amrex::Abort(
"MLNodeLinOp::fillIJMatrix: how did we get here?");
248 virtual void fillRHS (MFIter
const& ,
249 Array4<int const>
const& ,
251 Array4<Real const>
const& )
const
253 amrex::Abort(
"MLNodeLinOp:fillRHS: how did we get here?");
289 bool m_is_bottom_singular =
false;
Array4< int const > offset
Definition AMReX_HypreMLABecLap.cpp:1129
Array4< Real > fine
Definition AMReX_InterpFaceRegister.cpp:90
Array4< Real const > crse
Definition AMReX_InterpFaceRegister.cpp:92
Reference-counted collection of Boxes.
Definition AMReX_BoxArray.H:676
Calculates the distribution of FABs to MPI processes.
Definition AMReX_DistributionMapping.H:51
Definition AMReX_FabFactory.H:50
Rectangular problem domain geometry.
Definition AMReX_Geometry.H:75
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
Abstract base class for multilevel linear operators used by MLMG and the bottom solvers.
Definition AMReX_MLLinOp.H:137
LinOpEnumType::StateMode StateMode
Definition AMReX_MLLinOp.H:152
LinOpEnumType::BCMode BCMode
Definition AMReX_MLLinOp.H:151
Boundary helper for MLMG that manages coarse/fine and physical BC metadata.
Definition AMReX_MLMGBndry.H:20
Definition AMReX_MLNodeLinOp.H:23
MLNodeLinOp(MLNodeLinOp &&)=delete
Vector< std::unique_ptr< iMultiFab > > m_nd_fine_mask
Definition AMReX_MLNodeLinOp.H:265
void nodalSync(int amrlev, int mglev, MultiFab &mf) const
Synchronize nodal values across box/partition boundaries on (amrlev,mglev).
Definition AMReX_MLNodeLinOp.cpp:117
MultiFab m_coarse_dot_mask
Definition AMReX_MLNodeLinOp.H:268
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:198
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:152
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:23
bool isBottomSingular() const override
Is the bottom of the multigrid hierarchy singular?
Definition AMReX_MLNodeLinOp.H:120
bool m_in_solution_mode
Definition AMReX_MLNodeLinOp.H:286
virtual void fixUpResidualMask(int, iMultiFab &)
Definition AMReX_MLNodeLinOp.H:190
bool m_masks_built
Definition AMReX_MLNodeLinOp.H:279
CoarseningStrategy
Definition AMReX_MLNodeLinOp.H:26
std::unique_ptr< iMultiFab > m_owner_mask_bottom
Definition AMReX_MLNodeLinOp.H:262
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:267
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:631
MLNodeLinOp & operator=(const MLNodeLinOp &)=delete
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:578
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:169
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:566
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:196
Vector< std::unique_ptr< LayoutData< int > > > m_has_fine_bndry
Definition AMReX_MLNodeLinOp.H:266
bool m_overset_dirichlet_mask
Definition AMReX_MLNodeLinOp.H:280
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:225
void setLevelBC(int, const MultiFab *, const MultiFab *=nullptr, const MultiFab *=nullptr, const MultiFab *=nullptr) final
Definition AMReX_MLNodeLinOp.H:64
void preparePrecond() override
Prepare auxiliary data used when the operator acts as a preconditioner.
Definition AMReX_MLNodeLinOp.cpp:412
Real norm2Precond(Vector< MultiFab const * > const &x) const final
L2 norm used when the operator acts as a preconditioner.
Definition AMReX_MLNodeLinOp.cpp:212
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:250
Vector< std::unique_ptr< iMultiFab > > m_cc_fine_mask
Definition AMReX_MLNodeLinOp.H:264
Real xdoty(int amrlev, int mglev, const MultiFab &x, const MultiFab &y, bool local) const final
Dot-product helper.
Definition AMReX_MLNodeLinOp.cpp:182
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:123
void averageDownAndSync(Vector< MultiFab > &sol) const override
Average nodal solutions down the AMR hierarchy and synchronize overlaps.
Definition AMReX_MLNodeLinOp.cpp:610
void prepareForSolve() override
Prepare BC caches, masks, and metadata prior to solving.
Definition AMReX_MLNodeLinOp.cpp:100
void buildMasks()
Build Dirichlet/dot-product masks and determine bottom singularity.
Definition AMReX_MLNodeLinOp.cpp:287
std::unique_ptr< iMultiFab > m_owner_mask_top
Definition AMReX_MLNodeLinOp.H:261
Vector< Vector< std::unique_ptr< iMultiFab > > > m_dirichlet_mask
Definition AMReX_MLNodeLinOp.H:263
Vector< std::unique_ptr< iMultiFab > > m_norm_fine_mask
Definition AMReX_MLNodeLinOp.H:271
MLNodeLinOp()
Definition AMReX_MLNodeLinOp.cpp:17
int m_smooth_num_sweeps
Definition AMReX_MLNodeLinOp.H:282
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:161
void resizeMultiGrid(int new_size) override
Definition AMReX_MLNodeLinOp.cpp:533
void setSmoothNumSweeps(int nsweeps) noexcept
Control how many smoother passes are executed inside each Fsmooth call.
Definition AMReX_MLNodeLinOp.H:60
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:466
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:108
Vector< MultiFab > m_precond_weight_mask
Definition AMReX_MLNodeLinOp.H:269
bool isSingular(int amrlev) const override
Is it singular on AMR level amrlev?
Definition AMReX_MLNodeLinOp.H:118
~MLNodeLinOp() override=default
CoarseningStrategy m_coarsening_strategy
Definition AMReX_MLNodeLinOp.H:274
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:503
void setOversetMask(int amrlev, const iMultiFab &a_dmask)
Mark nodes that belong to overset (known) regions.
Definition AMReX_MLNodeLinOp.cpp:485
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:79
Definition AMReX_Amr.cpp:50
void Abort(const std::string &msg)
Print a fatal-error message to stderr and abort execution.
Definition AMReX.cpp:241
A multidimensional array accessor.
Definition AMReX_Array4.H:288
Configuration knobs for multilevel linear operators (grid agglomeration, metrics, etc....
Definition AMReX_MLLinOp.H:51