Block-Structured AMR Software Framework
Loading...
Searching...
No Matches
amrex::MLNodeLaplacian Class Reference

#include <AMReX_MLNodeLaplacian.H>

Inheritance diagram for amrex::MLNodeLaplacian:
amrex::MLNodeLinOp amrex::MLLinOpT< MultiFab >

Public Member Functions

 MLNodeLaplacian ()=default
 Construct an empty operator; call define() before solving.
 
 MLNodeLaplacian (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={}, Real a_const_sigma=Real(0.0))
 Convenience constructor without EB factories.
 
 MLNodeLaplacian (const Vector< Geometry > &a_geom, const Vector< BoxArray > &a_grids, const Vector< DistributionMapping > &a_dmap, const LPInfo &a_info, const Vector< EBFArrayBoxFactory const * > &a_factory, Real a_const_sigma=Real(0.0))
 Convenience constructor that accepts embedded-boundary factories.
 
 ~MLNodeLaplacian () override=default
 
 MLNodeLaplacian (const MLNodeLaplacian &)=delete
 
 MLNodeLaplacian (MLNodeLaplacian &&)=delete
 
MLNodeLaplacian & operator= (const MLNodeLaplacian &)=delete
 
MLNodeLaplacian & operator= (MLNodeLaplacian &&)=delete
 
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={}, Real a_const_sigma=Real(0.0))
 Bind the nodal operator (no EB data).
 
void define (const Vector< Geometry > &a_geom, const Vector< BoxArray > &a_grids, const Vector< DistributionMapping > &a_dmap, const LPInfo &a_info, const Vector< EBFArrayBoxFactory const * > &a_factory, Real a_const_sigma=Real(0.0))
 
std::string name () const override
 
void setRZCorrection (bool rz) noexcept
 Enable cylindrical (RZ) metric terms.
 
void setNormalizationThreshold (Real t) noexcept
 Threshold for normalization (prevents dividing by tiny averages).
 
void setSigma (int amrlev, const MultiFab &a_sigma)
 Provide per-level conductivity (cell-centered MultiFab). A multi-component input also triggers mapped-coordinate mode.
 
void compDivergence (const Vector< MultiFab * > &rhs, const Vector< MultiFab * > &vel)
 Compute rhs = div(vel) on nodal grids (used for projections).
 
void compRHS (const Vector< MultiFab * > &rhs, const Vector< MultiFab * > &vel, const Vector< const MultiFab * > &rhnd, const Vector< MultiFab * > &rhcc)
 Assemble RHS including nodal/cell-centered forcing terms.
 
void updateVelocity (const Vector< MultiFab * > &vel, const Vector< MultiFab const * > &sol) const
 Update velocities using the Poisson solution (projection correction).
 
void compSyncResidualCoarse (MultiFab &sync_resid, const MultiFab &phi, const MultiFab &vold, const MultiFab *rhcc, const BoxArray &fine_grids, const IntVect &ref_ratio)
 Build coarse-level sync residuals for multilevel projections.
 
void compSyncResidualFine (MultiFab &sync_resid, const MultiFab &phi, const MultiFab &vold, const MultiFab *rhcc)
 Build fine-level sync residuals for multilevel projections.
 
void setGaussSeidel (bool flag) noexcept
 Choose red-black Gauss-Seidel instead of Jacobi smoothing.
 
void setHarmonicAverage (bool flag) noexcept
 Toggle harmonic averaging when coarsening sigma.
 
void setMapped (bool flag) noexcept
 Enable mapped-coordinate metrics (non-orthogonal grids).
 
void setCoarseningStrategy (CoarseningStrategy cs) noexcept
 Pick between sigma-weighted or RAP coarsening (ignored if sigma constant).
 
BottomSolver getDefaultBottomSolver () const final
 
void restriction (int amrlev, int cmglev, MultiFab &crse, MultiFab &fine) const final
 Restrict nodal data from fine grids to coarse MG level cmglev.
 
void interpolation (int amrlev, int fmglev, MultiFab &fine, const MultiFab &crse) const final
 Add the prolongation of coarse data onto the fine grid (fine += prolong(crse)).
 
void averageDownSolutionRHS (int camrlev, MultiFab &crse_sol, MultiFab &crse_rhs, const MultiFab &fine_sol, const MultiFab &fine_rhs) final
 Average solution/RHS pairs from fine AMR levels onto (camrlev).
 
void reflux (int crse_amrlev, MultiFab &res, const MultiFab &crse_sol, const MultiFab &crse_rhs, MultiFab &fine_res, MultiFab &fine_sol, const MultiFab &fine_rhs) const final
 Flux register reflux coupling coarse/fine nodal solves (updates res using the solution and RHS arrays on both levels).
 
void prepareForSolve () final
 Finalize metric terms, sigma averages, and BC caches before solving.
 
bool needsUpdate () const final
 True if sigma-derived data need to be refreshed before reuse.
 
void update () final
 Refresh sigma averages/stencils and clear the dirty flag.
 
void Fapply (int amrlev, int mglev, MultiFab &out, const MultiFab &in) const final
 Apply the nodal Laplacian to in at (amrlev,mglev).
 
void Fsmooth (int amrlev, int mglev, MultiFab &sol, const MultiFab &rhs) const final
 Execute the smoother on (amrlev,mglev).
 
void normalize (int amrlev, int mglev, MultiFab &mf) const final
 Divide mf by the diagonal of the operator (used by CG-family bottom solvers).
 
void fixUpResidualMask (int amrlev, iMultiFab &resmsk) final
 Adjust residual masks so EB Dirichlet nodes remain constrained.
 
void getFluxes (const Vector< Array< MultiFab *, 3 > > &a_flux, const Vector< MultiFab * > &a_sol, Location a_loc) const final
 This overload is unused for nodal Laplacians (only cell-centered flux extraction is supported).
 
void getFluxes (const Vector< MultiFab * > &a_flux, const Vector< MultiFab * > &a_sol) const final
 Compute face-centered fluxes given nodal solutions.
 
void unimposeNeumannBC (int amrlev, MultiFab &rhs) const final
 Remove Neumann contributions previously imposed on rhs.
 
Vector< Real > getSolvabilityOffset (int amrlev, int mglev, MultiFab const &rhs) const override
 Compute component-wise offsets needed for solvability enforcement.
 
void fixSolvabilityByOffset (int amrlev, int mglev, MultiFab &rhs, Vector< Real > const &offset) const override
 Subtract solvability offsets from rhs.
 
void compGrad (int amrlev, const Array< MultiFab *, 3 > &grad, MultiFab &sol, Location loc) const final
 Unsupported flux-style gradient extractor (kept for interface completeness).
 
void compGrad (int amrlev, MultiFab &grad, MultiFab &sol) const
 Compute gradients of sol into nodal MultiFab grad on AMR level amrlev.
 
void averageDownCoeffs ()
 Average conductivity down across all AMR and MG levels.
 
void averageDownCoeffsToCoarseAmrLevel (int flev)
 Average coefficients from fine AMR level flev to coarse AMR level flev-1.
 
void averageDownCoeffsSameAmrLevel (int amrlev)
 Average coefficients across MG levels within AMR level amrlev.
 
void restrictInteriorNodes (int camrlev, MultiFab &crhs, MultiFab &frhs) const
 Restrict interior-node RHS from fine to coarse when syncing.
 
void FillBoundaryCoeff (MultiFab &sigma, const Geometry &geom)
 Fill ghost cells of sigma using geom for BC inference.
 
void buildStencil ()
 Build nodal operator stencils reflecting current sigma and metrics.
 
void buildIntegral ()
 
void buildSurfaceIntegral ()
 
void setEBInflowVelocity (int amrlev, const MultiFab &eb_vel)
 
bool supportsAlgMG () const override
 True if makeAlgMG is implemented for this operator.
 
void fillAlgMatrix (int mglev, MFIter const &mfi, Array4< Long const > const &gid, Array4< int const > const &lid, Long *ncols, Long *cols, Real *mat) const override
 Fill the matrix rows of one box for the algebraic solver.
 
void fillRHS (int mglev, MFIter const &mfi, Array4< int const > const &lid, Real *rhs, Array4< Real const > const &bfab) const override
 Fill the right-hand side of the rows of one box on MG level mglev.
 
template<typename AlgInt , typename AlgGid >
void fillMatrix_doit (int mglev, MFIter const &mfi, Array4< AlgGid const > const &gid, Array4< int const > const &lid, AlgInt *ncols, AlgInt *cols, Real *mat) const
 
template<typename AlgInt , typename AlgGid >
void fillMatrix_gpu (int mglev, MFIter const &mfi, Array4< AlgGid const > const &gid, Array4< int const > const &lid, AlgInt *ncols, AlgInt *cols, Real *mat) const
 
template<typename AlgInt , typename AlgGid >
void fillMatrix_cpu (int mglev, MFIter const &mfi, Array4< AlgGid const > const &gid, Array4< int const > const &lid, AlgInt *ncols, AlgInt *cols, Real *mat) const
 
- Public Member Functions inherited from amrex::MLNodeLinOp
 MLNodeLinOp ()
 
 ~MLNodeLinOp () override=default
 
 MLNodeLinOp (const MLNodeLinOp &)=delete
 
 MLNodeLinOp (MLNodeLinOp &&)=delete
 
MLNodeLinOp & operator= (const MLNodeLinOp &)=delete
 
MLNodeLinOp & operator= (MLNodeLinOp &&)=delete
 
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.
 
void setSmoothNumSweeps (int nsweeps) noexcept
 Control how many smoother passes are executed inside each Fsmooth call.
 
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.
 
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.
 
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).
 
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).
 
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).
 
Vector< Real > getSolvabilityOffset (int amrlev, int mglev, MultiFab const &rhs) const override
 Return component-wise solvability offsets for (amrlev,mglev, rhs).
 
void fixSolvabilityByOffset (int amrlev, int mglev, MultiFab &rhs, Vector< Real > const &offset) const override
 Subtract offsets produced by getSolvabilityOffset() from rhs.
 
void prepareForSolve () override
 Prepare BC caches, masks, and metadata prior to solving.
 
void preparePrecond () override
 Prepare auxiliary data used when the operator acts as a preconditioner.
 
void setDirichletNodesToZero (int amrlev, int mglev, MultiFab &mf) const override
 Zero Dirichlet nodes in mf before a correction or residual pass.
 
bool isSingular (int amrlev) const override
 Is it singular on AMR level amrlev?
 
bool isBottomSingular () const override
 Is the bottom of the multigrid hierarchy singular?
 
Real xdoty (int amrlev, int mglev, const MultiFab &x, const MultiFab &y, bool local) const final
 Dot-product helper.
 
Real dotProductPrecond (Vector< MultiFab const * > const &x, Vector< MultiFab const * > const &y) const final
 Dot product used when the operator acts as a preconditioner.
 
Real norm2Precond (Vector< MultiFab const * > const &x) const final
 L2 norm used when the operator acts as a preconditioner.
 
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.
 
void nodalSync (int amrlev, int mglev, MultiFab &mf) const
 Synchronize nodal values across box/partition boundaries on (amrlev,mglev).
 
void buildMasks ()
 Build Dirichlet/dot-product masks and determine bottom singularity.
 
void setOversetMask (int amrlev, const iMultiFab &a_dmask)
 Mark nodes that belong to overset (known) regions.
 
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).
 
void avgDownResAmr (int, MultiFab &, MultiFab const &) const final
 Nodal average-down for residuals between AMR levels (no-op here).
 
void interpolationAmr (int famrlev, MultiFab &fine, const MultiFab &crse, IntVect const &nghost) const override
 Prolong AMR-level data during FMG initialization.
 
void averageDownAndSync (Vector< MultiFab > &sol) const override
 Average nodal solutions down the AMR hierarchy and synchronize overlaps.
 
void interpAssign (int amrlev, int fmglev, MultiFab &fine, MultiFab &crse) const override
 Overwrite fine data with the prolongation of coarse data (fine = prolong(crse)).
 
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 hypre supports implement this.
 
- Public Member Functions inherited from amrex::MLLinOpT< MultiFab >
 MLLinOpT ()=default
 
 MLLinOpT (const MLLinOpT< MultiFab > &)=delete
 
 MLLinOpT (MLLinOpT< MultiFab > &&)=delete
 
virtual ~MLLinOpT ()=default
 
MLLinOpT< MultiFab > & operator= (const MLLinOpT< MultiFab > &)=delete
 
MLLinOpT< MultiFab > & operator= (MLLinOpT< MultiFab > &&)=delete
 
void define (const Vector< Geometry > &a_geom, const Vector< BoxArray > &a_grids, const Vector< DistributionMapping > &a_dmap, const LPInfo &a_info, const Vector< FabFactory< FAB > const * > &a_factory, bool eb_limit_coarsening=true)
 Initialize the operator hierarchy on a set of AMR levels.
 
void setDomainBC (const Array< BCType, 3 > &lobc, const Array< BCType, 3 > &hibc) noexcept
 Boundary of the whole domain.
 
void setDomainBC (const Vector< Array< BCType, 3 > > &lobc, const Vector< Array< BCType, 3 > > &hibc)
 Boundary of the whole domain.
 
void setDomainBCLoc (const Array< Real, 3 > &lo_bcloc, const Array< Real, 3 > &hi_bcloc) noexcept
 Set location offsets for the physical domain boundaries.
 
bool needsCoarseDataForBC () const noexcept
 Needs coarse data for bc?
 
void setCoarseFineBC (const MultiFab *crse, int crse_ratio, LinOpBCType bc_type=LinOpBCType::Dirichlet) noexcept
 Set coarse/fine boundary conditions. For cell-centered solves only.
 
void setCoarseFineBC (const MultiFab *crse, IntVect const &crse_ratio, LinOpBCType bc_type=LinOpBCType::Dirichlet) noexcept
 
void setCoarseFineBC (const AMF *crse, int crse_ratio, LinOpBCType bc_type=LinOpBCType::Dirichlet) noexcept
 
void setCoarseFineBC (const AMF *crse, IntVect const &crse_ratio, LinOpBCType bc_type=LinOpBCType::Dirichlet) noexcept
 
void setLevelBC (int amrlev, const AMF *levelbcdata, const AMF *robinbc_a=nullptr, const AMF *robinbc_b=nullptr, const AMF *robinbc_f=nullptr)
 
void setVerbose (int v) noexcept
 Set verbosity.
 
void setPrintIndentation (std::string s)
 Prefix printed messages (e.g., to indent per level).
 
void setMaxOrder (int o) noexcept
 Set order of interpolation at coarse/fine boundary.
 
int getMaxOrder () const noexcept
 Get order of interpolation at coarse/fine boundary.
 
void setEnforceSingularSolvable (bool o) noexcept
 Control whether the solver should try to make singular problems solvable.
 
bool getEnforceSingularSolvable () const noexcept
 
virtual bool supportCustomBottomSolver () const
 Does this operator provide its own bottom solver (BottomSolver::custom)?
 
virtual void customBottomSolve (MLMGT< MultiFab > *mlmg, MultiFab &x, const MultiFab &b, RT eps_rel, RT eps_abs, int maxiter)
 Bottom solve provided by the operator itself.
 
virtual int getNComp () const
 Return number of components.
 
virtual int getNGrow (int=0, int=0) const
 
virtual void apply (int amrlev, int mglev, MultiFab &out, MultiFab &in, BCMode bc_mode, StateMode s_mode, const MLMGBndryT< MultiFab > *bndry=nullptr) const=0
 Apply the linear operator, out = L(in)
 
virtual void prepareForFluxes (int amrlev, const MultiFab *crse_bcdata=nullptr)
 Ensure BC caches are populated before flux extraction.
 
virtual void correctionResidual (int amrlev, int mglev, MultiFab &resid, MultiFab &x, const MultiFab &b, BCMode bc_mode, const MultiFab *crse_bcdata=nullptr)=0
 Compute residual for the residual-correction form, resid = b - L(x)
 
virtual void compFlux (int amrlev, const Array< MultiFab *, 3 > &fluxes, MultiFab &sol, Location loc) const
 Compute fluxes.
 
virtual void applyMetricTerm (int amrlev, int mglev, MultiFab &rhs) const
 Apply metric scaling to the RHS on (amrlev,mglev).
 
virtual void unapplyMetricTerm (int amrlev, int mglev, MultiFab &rhs) const
 Remove metric scaling previously applied via applyMetricTerm().
 
virtual void applyInhomogNeumannTerm (int amrlev, MultiFab &rhs) const
 Add extra terms introduced when treating inhomogeneous Neumann BC as homogeneous.
 
virtual void applyOverset (int amrlev, MultiFab &rhs) const
 Overset-only hook for zeroing regions covered by masks.
 
virtual bool scaleRHS (int amrlev, MultiFab *rhs) const
 Optionally scale the RHS to fix solvability.
 
virtual void fixSolvabilityByOffset (int amrlev, int mglev, MultiFab &rhs, Vector< RT > const &offset) const
 Subtract previously computed offsets from the RHS.
 
virtual RT dotProductPrecond (Vector< MultiFab const * > const &x, Vector< MultiFab const * > const &y) const
 Dot product over the composite AMR hierarchy, excluding cells covered by finer levels. Used when the operator acts as a preconditioner.
 
virtual RT norm2Precond (Vector< MultiFab const * > const &x) const
 L2 norm over the composite AMR hierarchy, excluding cells covered by finer levels. Used when the operator acts as a preconditioner.
 
virtual std::unique_ptr< MLLinOpT< MultiFab > > makeNLinOp (int grid_size) const
 Create the NSolve counterpart of this operator with the requested grid size.
 
virtual void getEBFluxes (const Vector< MultiFab * > &a_flux, const Vector< MultiFab * > &a_sol) const
 Extract embedded-boundary fluxes.
 
virtual bool supportsAnisotropicCoarsening () const
 True if the operator supports MG levels coarsened in any subset of directions. Then MLMG coarsens stretched cells only in their short directions until they are nearly cubic.
 
virtual GpuArray< Real, 3 > anisotropicCoarseningCellSize (Geometry const &geom) const
 Cell size used to pick the directions to coarsen when supportsAnisotropicCoarsening() is true. A direction with weaker coupling counts as having longer cells.
 
virtual bool supportNSolve () const
 Whether this operator supports NSolve.
 
virtual void copyNSolveSolution (MultiFab &dst, MultiFab const &src) const
 Copy an NSolve solution from src to dst.
 
virtual void postSolve (Vector< MultiFab * > const &sol) const
 Optional hook invoked after the main solve completes.
 
virtual void avgDownResMG (int clev, MultiFab &cres, MultiFab const &fres) const
 Average residuals from fine to coarse MG levels (FMG helper).
 
virtual void beginPrecondBC ()
 Called when the operator starts being used as a preconditioner.
 
virtual void endPrecondBC ()
 Called when the operator stops being used as a preconditioner.
 
bool isMFIterSafe (int amrlev, int mglev1, int mglev2) const
 Check whether mixing MFIter loops for different MG levels is safe.
 
int NAMRLevels () const noexcept
 Return the number of AMR levels.
 
int NMGLevels (int amrlev) const noexcept
 Return the number of MG levels at given AMR level.
 
const Geometry & Geom (int amr_lev, int mglev=0) const noexcept
 Geometry accessor for (amr_lev,mglev).
 

Protected Member Functions

void resizeMultiGrid (int new_size) final
 
- Protected Member Functions inherited from amrex::MLNodeLinOp
void resizeMultiGrid (int new_size) override
 
void buildMGHierarchy () override
 Build the MG levels of AMR level 0 below the finest one.
 
- Protected Member Functions inherited from amrex::MLLinOpT< MultiFab >
const Vector< int > & AMRRefRatio () const noexcept
 Return AMR refinement ratios.
 
int AMRRefRatio (int amr_lev) const noexcept
 Return AMR refinement ratio at given AMR level.
 
IntVect AMRRefRatioVect (int amr_lev) const noexcept
 Return AMR refinement ratio as IntVect (1 in hidden direction)
 
FabFactory< FAB > const * Factory (int amr_lev, int mglev=0) const noexcept
 
GpuArray< BCType, 3 > LoBC (int icomp=0) const noexcept
 
GpuArray< BCType, 3 > HiBC (int icomp=0) const noexcept
 
bool hasBC (BCType bct) const noexcept
 
bool hasInhomogNeumannBC () const noexcept
 
bool hasRobinBC () const noexcept
 
virtual bool supportRobinBC () const noexcept
 
virtual bool supportInhomogNeumannBC () const noexcept
 
bool isBottomActive () const noexcept
 
MPI_Comm BottomCommunicator () const noexcept
 
MPI_Comm Communicator () const noexcept
 
void setCoarseFineBCLocation (const RealVect &cloc) noexcept
 
bool doAgglomeration () const noexcept
 
bool doConsolidation () const noexcept
 
bool doSemicoarsening () const noexcept
 
bool isCellCentered () const noexcept
 
virtual IntVect getNGrowVectRestriction () const
 
virtual void make (Vector< Vector< MultiFab > > &mf, IntVect const &ng) const
 
virtual MultiFab make (int amrlev, int mglev, IntVect const &ng) const
 
virtual MultiFab make (int amrlev, int mglev, IntVect const &ng, MFInfo const &mf_info) const
 As above, with caller-selected allocation metadata for temporary storage.
 
virtual MultiFab makeAlias (MultiFab const &mf) const
 
virtual MultiFab makeCoarseMG (int amrlev, int mglev, IntVect const &ng) const
 Allocate an MF on the next coarser MG level (mglev+1) with grow cells ng.
 
virtual MultiFab makeCoarseMG (int amrlev, int mglev, IntVect const &ng, MFInfo const &mf_info) const
 As above, with caller-selected allocation metadata for temporary storage.
 
virtual MultiFab makeCoarseAmr (int famrlev, IntVect const &ng) const
 Allocate an MF on the next coarser AMR level (famrlev-1) with grow cells ng.
 
virtual MultiFab makeCoarseAmr (int famrlev, IntVect const &ng, MFInfo const &mf_info) const
 As above, with caller-selected allocation metadata for temporary storage.
 
virtual std::unique_ptr< FabFactory< FAB > > makeFactory (int, int) const
 
void prepareMGHierarchy ()
 Build the deferred MG levels of AMR level 0 once. See supportsAnisotropicCoarsening.
 
bool hasHiddenDimension () const noexcept
 
int hiddenDirection () const noexcept
 
Box compactify (Box const &b) const noexcept
 
Array4< T > compactify (Array4< T > const &a) const noexcept
 
T get_d0 (T const &dx, T const &dy, T const &) const noexcept
 
T get_d1 (T const &, T const &dy, T const &dz) const noexcept
 

Additional Inherited Members

- Public Types inherited from amrex::MLNodeLinOp
enum struct  CoarseningStrategy : int { Sigma , RAP }
 
- Public Types inherited from amrex::MLLinOpT< MultiFab >
using MFType = MultiFab
 
using FAB = typename FabDataType< MultiFab >::fab_type
 
using RT = typename FabDataType< MultiFab >::value_type
 
using BCType = LinOpBCType
 
using BCMode = LinOpEnumType::BCMode
 
using StateMode = LinOpEnumType::StateMode
 
using Location = LinOpEnumType::Location
 
- Static Public Member Functions inherited from amrex::MLNodeLinOp
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).
 
- Public Attributes inherited from amrex::MLLinOpT< MultiFab >
Vector< Array< BCType, 3 > > m_lobc
 
Vector< Array< BCType, 3 > > m_hibc
 
Vector< Array< BCType, 3 > > m_lobc_orig
 
Vector< Array< BCType, 3 > > m_hibc_orig
 
- Protected Attributes inherited from amrex::MLNodeLinOp
std::unique_ptr< iMultiFab > m_owner_mask_top
 
std::unique_ptr< iMultiFab > m_owner_mask_bottom
 
Vector< Vector< std::unique_ptr< iMultiFab > > > m_dirichlet_mask
 
Vector< std::unique_ptr< iMultiFab > > m_cc_fine_mask
 
Vector< std::unique_ptr< iMultiFab > > m_nd_fine_mask
 
Vector< std::unique_ptr< LayoutData< int > > > m_has_fine_bndry
 
MultiFab m_bottom_dot_mask
 
MultiFab m_coarse_dot_mask
 
Vector< MultiFab > m_precond_weight_mask
 
Vector< std::unique_ptr< iMultiFab > > m_norm_fine_mask
 
CoarseningStrategy m_coarsening_strategy = CoarseningStrategy::RAP
 
bool m_masks_built = false
 
bool m_overset_dirichlet_mask = false
 
int m_smooth_num_sweeps = 2
 
bool m_in_solution_mode = true
 
- Protected Attributes inherited from amrex::MLLinOpT< MultiFab >
int mg_box_min_width
 
int mg_domain_min_width
 
int mg_agg_no_split_direction
 
bool mg_odd_coarsening
 
bool mg_independent_coarsening
 
LPInfo info
 
int verbose
 
std::string print_ident
 
int maxorder
 
bool enforceSingularSolvable
 
bool m_mg_deferred
 MG levels of AMR level 0 built at first solve.
 
bool m_mg_built
 
int m_num_amr_levels
 
Vector< int > m_amr_ref_ratio
 
Vector< int > m_num_mg_levels
 
const MLLinOpT< MultiFab > * m_parent
 
IntVect m_ixtype
 
bool m_do_agglomeration
 
bool m_do_consolidation
 
bool m_do_semicoarsening
 
Vector< IntVect > mg_coarsen_ratio_vec
 
Vector< Vector< Geometry > > m_geom
 first Vector is for amr level and second is mg level
 
Vector< Vector< BoxArray > > m_grids
 
Vector< Vector< DistributionMapping > > m_dmap
 
Vector< Vector< std::unique_ptr< FabFactory< FAB > > > > m_factory
 
Vector< int > m_domain_covered
 
MPI_Comm m_default_comm
 
MPI_Comm m_bottom_comm
 
std::unique_ptr< CommContainer > m_raii_comm
 
Array< Real, 3 > m_domain_bloc_lo
 
Array< Real, 3 > m_domain_bloc_hi
 
bool m_needs_coarse_data_for_bc
 
LinOpBCType m_coarse_fine_bc_type
 
IntVect m_coarse_data_crse_ratio
 
RealVect m_coarse_bc_loc
 
const MultiFab * m_coarse_data_for_bc
 
MultiFab m_coarse_data_for_bc_raii
 
bool m_precond_mode
 
- Static Protected Attributes inherited from amrex::MLLinOpT< MultiFab >
static constexpr int mg_coarsen_ratio
 

Constructor & Destructor Documentation

◆ MLNodeLaplacian() [1/5]

amrex::MLNodeLaplacian::MLNodeLaplacian ( )
default

Construct an empty operator; call define() before solving.

◆ MLNodeLaplacian() [2/5]

amrex::MLNodeLaplacian::MLNodeLaplacian ( 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 = {},
Real  a_const_sigma = Real(0.0) 
)

Convenience constructor without EB factories.

Parameters
a_geomPer-level geometries.
a_gridsPer-level grids.
a_dmapDistribution mappings.
a_infoLPInfo overrides.
a_factoryOptional nodal factories per level.
a_const_sigmaUniform conductivity. Zero selects variable conductivity; setSigma() must then supply nonzero coefficients.

◆ MLNodeLaplacian() [3/5]

amrex::MLNodeLaplacian::MLNodeLaplacian ( const Vector< Geometry > &  a_geom,
const Vector< BoxArray > &  a_grids,
const Vector< DistributionMapping > &  a_dmap,
const LPInfo &  a_info,
const Vector< EBFArrayBoxFactory const * > &  a_factory,
Real  a_const_sigma = Real(0.0) 
)

Convenience constructor that accepts embedded-boundary factories.

◆ ~MLNodeLaplacian()

amrex::MLNodeLaplacian::~MLNodeLaplacian ( )
overridedefault

◆ MLNodeLaplacian() [4/5]

amrex::MLNodeLaplacian::MLNodeLaplacian ( const MLNodeLaplacian &  )
delete

◆ MLNodeLaplacian() [5/5]

amrex::MLNodeLaplacian::MLNodeLaplacian ( MLNodeLaplacian &&  )
delete

Member Function Documentation

◆ averageDownCoeffs()

void amrex::MLNodeLaplacian::averageDownCoeffs ( )

Average conductivity down across all AMR and MG levels.

◆ averageDownCoeffsSameAmrLevel()

void amrex::MLNodeLaplacian::averageDownCoeffsSameAmrLevel ( int  amrlev)

Average coefficients across MG levels within AMR level amrlev.

◆ averageDownCoeffsToCoarseAmrLevel()

void amrex::MLNodeLaplacian::averageDownCoeffsToCoarseAmrLevel ( int  flev)

Average coefficients from fine AMR level flev to coarse AMR level flev-1.

◆ averageDownSolutionRHS()

void amrex::MLNodeLaplacian::averageDownSolutionRHS ( int  camrlev,
MultiFab &  crse_sol,
MultiFab &  crse_rhs,
const MultiFab &  fine_sol,
const MultiFab &  fine_rhs 
)
finalvirtual

Average solution/RHS pairs from fine AMR levels onto (camrlev).

Reimplemented from amrex::MLLinOpT< MultiFab >.

◆ buildIntegral()

void amrex::MLNodeLaplacian::buildIntegral ( )

◆ buildStencil()

void amrex::MLNodeLaplacian::buildStencil ( )

Build nodal operator stencils reflecting current sigma and metrics.

◆ buildSurfaceIntegral()

void amrex::MLNodeLaplacian::buildSurfaceIntegral ( )

◆ compDivergence()

void amrex::MLNodeLaplacian::compDivergence ( const Vector< MultiFab * > &  rhs,
const Vector< MultiFab * > &  vel 
)

Compute rhs = div(vel) on nodal grids (used for projections).

◆ compGrad() [1/2]

void amrex::MLNodeLaplacian::compGrad ( int  amrlev,
const Array< MultiFab *, 3 > &  grad,
MultiFab &  sol,
Location  loc 
) const
inlinefinalvirtual

Unsupported flux-style gradient extractor (kept for interface completeness).

Parameters
amrlevAMR level index (ignored).
gradDestination MultiFabs (ignored).
solSolution hierarchy (ignored).
locRequested location (ignored).

Reimplemented from amrex::MLLinOpT< MultiFab >.

◆ compGrad() [2/2]

void amrex::MLNodeLaplacian::compGrad ( int  amrlev,
MultiFab &  grad,
MultiFab &  sol 
) const

Compute gradients of sol into nodal MultiFab grad on AMR level amrlev.

Parameters
amrlevAMR level index.
gradDestination gradient MultiFab.
solSolution supplying nodal values.

◆ compRHS()

void amrex::MLNodeLaplacian::compRHS ( const Vector< MultiFab * > &  rhs,
const Vector< MultiFab * > &  vel,
const Vector< const MultiFab * > &  rhnd,
const Vector< MultiFab * > &  rhcc 
)

Assemble RHS including nodal/cell-centered forcing terms.

◆ compSyncResidualCoarse()

void amrex::MLNodeLaplacian::compSyncResidualCoarse ( MultiFab &  sync_resid,
const MultiFab &  phi,
const MultiFab &  vold,
const MultiFab *  rhcc,
const BoxArray &  fine_grids,
const IntVect &  ref_ratio 
)

Build coarse-level sync residuals for multilevel projections.

◆ compSyncResidualFine()

void amrex::MLNodeLaplacian::compSyncResidualFine ( MultiFab &  sync_resid,
const MultiFab &  phi,
const MultiFab &  vold,
const MultiFab *  rhcc 
)

Build fine-level sync residuals for multilevel projections.

◆ define() [1/2]

void amrex::MLNodeLaplacian::define ( const Vector< Geometry > &  a_geom,
const Vector< BoxArray > &  a_grids,
const Vector< DistributionMapping > &  a_dmap,
const LPInfo &  a_info,
const Vector< EBFArrayBoxFactory const * > &  a_factory,
Real  a_const_sigma = Real(0.0) 
)

◆ define() [2/2]

void amrex::MLNodeLaplacian::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 = {},
Real  a_const_sigma = Real(0.0) 
)

Bind the nodal operator (no EB data).

Parameters
a_geomPer-level geometries.
a_gridsPer-level grids.
a_dmapDistribution mappings.
a_infoLPInfo overrides.
a_factoryOptional nodal factories per level.
a_const_sigmaUniform conductivity. Zero selects variable conductivity; setSigma() must then supply nonzero coefficients.

◆ Fapply()

void amrex::MLNodeLaplacian::Fapply ( int  amrlev,
int  mglev,
MultiFab &  out,
const MultiFab &  in 
) const
finalvirtual

Apply the nodal Laplacian to in at (amrlev,mglev).

Implements amrex::MLNodeLinOp.

◆ fillAlgMatrix()

void amrex::MLNodeLaplacian::fillAlgMatrix ( int  ,
MFIter const &  ,
Array4< Long const > const &  ,
Array4< int const > const &  ,
Long *  ,
Long *  ,
Real *   
) const
overridevirtual

Fill the matrix rows of one box for the algebraic solver.

Same packed layout as the Hypre version: ncols[lid] entries per row, diagonal first, neighbors without a row dropped. The MG level is on AMR level 0. Global row ids are numeric_limits<Long>::max() and local ids negative where there is no row.

Reimplemented from amrex::MLNodeLinOp.

◆ FillBoundaryCoeff()

void amrex::MLNodeLaplacian::FillBoundaryCoeff ( MultiFab &  sigma,
const Geometry &  geom 
)

Fill ghost cells of sigma using geom for BC inference.

◆ fillMatrix_cpu()

template<typename AlgInt , typename AlgGid >
void amrex::MLNodeLaplacian::fillMatrix_cpu ( int  mglev,
MFIter const &  mfi,
Array4< AlgGid const > const &  gid,
Array4< int const > const &  lid,
AlgInt *  ncols,
AlgInt *  cols,
Real *  mat 
) const

◆ fillMatrix_doit()

template<typename AlgInt , typename AlgGid >
void amrex::MLNodeLaplacian::fillMatrix_doit ( int  mglev,
MFIter const &  mfi,
Array4< AlgGid const > const &  gid,
Array4< int const > const &  lid,
AlgInt *  ncols,
AlgInt *  cols,
Real *  mat 
) const

◆ fillMatrix_gpu()

template<typename AlgInt , typename AlgGid >
void amrex::MLNodeLaplacian::fillMatrix_gpu ( int  mglev,
MFIter const &  mfi,
Array4< AlgGid const > const &  gid,
Array4< int const > const &  lid,
AlgInt *  ncols,
AlgInt *  cols,
Real *  mat 
) const

◆ fillRHS()

void amrex::MLNodeLaplacian::fillRHS ( int  ,
MFIter const &  ,
Array4< int const > const &  ,
Real *  ,
Array4< Real const > const &   
) const
overridevirtual

Fill the right-hand side of the rows of one box on MG level mglev.

Reimplemented from amrex::MLNodeLinOp.

◆ fixSolvabilityByOffset()

void amrex::MLNodeLaplacian::fixSolvabilityByOffset ( int  amrlev,
int  mglev,
MultiFab &  rhs,
Vector< Real > const &  offset 
) const
override

Subtract solvability offsets from rhs.

◆ fixUpResidualMask()

void amrex::MLNodeLaplacian::fixUpResidualMask ( int  amrlev,
iMultiFab &  resmsk 
)
finalvirtual

Adjust residual masks so EB Dirichlet nodes remain constrained.

Reimplemented from amrex::MLNodeLinOp.

◆ Fsmooth()

void amrex::MLNodeLaplacian::Fsmooth ( int  amrlev,
int  mglev,
MultiFab &  sol,
const MultiFab &  rhs 
) const
finalvirtual

Execute the smoother on (amrlev,mglev).

Parameters
amrlevAMR level index.
mglevMultigrid level index.
solCorrection updated in place.
rhsRHS supplied to the smoother.

Implements amrex::MLNodeLinOp.

◆ getDefaultBottomSolver()

BottomSolver amrex::MLNodeLaplacian::getDefaultBottomSolver ( ) const
inlinefinalvirtual

Reimplemented from amrex::MLLinOpT< MultiFab >.

◆ getFluxes() [1/2]

void amrex::MLNodeLaplacian::getFluxes ( const Vector< Array< MultiFab *, 3 > > &  a_flux,
const Vector< MultiFab * > &  a_sol,
Location  a_loc 
) const
inlinefinalvirtual

This overload is unused for nodal Laplacians (only cell-centered flux extraction is supported).

Parameters
a_fluxDestination arrays (ignored).
a_solSolution hierarchy (ignored).
a_locRequested location (ignored).

Reimplemented from amrex::MLLinOpT< MultiFab >.

◆ getFluxes() [2/2]

void amrex::MLNodeLaplacian::getFluxes ( const Vector< MultiFab * > &  a_flux,
const Vector< MultiFab * > &  a_sol 
) const
finalvirtual

Compute face-centered fluxes given nodal solutions.

Reimplemented from amrex::MLLinOpT< MultiFab >.

◆ getSolvabilityOffset()

Vector< Real > amrex::MLNodeLaplacian::getSolvabilityOffset ( int  amrlev,
int  mglev,
MultiFab const &  rhs 
) const
overridevirtual

Compute component-wise offsets needed for solvability enforcement.

Reimplemented from amrex::MLLinOpT< MultiFab >.

◆ interpolation()

void amrex::MLNodeLaplacian::interpolation ( int  amrlev,
int  fmglev,
MultiFab &  fine,
const MultiFab &  crse 
) const
finalvirtual

Add the prolongation of coarse data onto the fine grid (fine += prolong(crse)).

Implements amrex::MLLinOpT< MultiFab >.

◆ name()

std::string amrex::MLNodeLaplacian::name ( ) const
inlineoverridevirtual

Reimplemented from amrex::MLLinOpT< MultiFab >.

◆ needsUpdate()

bool amrex::MLNodeLaplacian::needsUpdate ( ) const
inlinefinalvirtual

True if sigma-derived data need to be refreshed before reuse.

Reimplemented from amrex::MLLinOpT< MultiFab >.

◆ normalize()

void amrex::MLNodeLaplacian::normalize ( int  amrlev,
int  mglev,
MultiFab &  mf 
) const
finalvirtual

Divide mf by the diagonal of the operator (used by CG-family bottom solvers).

Reimplemented from amrex::MLLinOpT< MultiFab >.

◆ operator=() [1/2]

MLNodeLaplacian & amrex::MLNodeLaplacian::operator= ( const MLNodeLaplacian &  )
delete

◆ operator=() [2/2]

MLNodeLaplacian & amrex::MLNodeLaplacian::operator= ( MLNodeLaplacian &&  )
delete

◆ prepareForSolve()

void amrex::MLNodeLaplacian::prepareForSolve ( )
finalvirtual

Finalize metric terms, sigma averages, and BC caches before solving.

Implements amrex::MLLinOpT< MultiFab >.

◆ reflux()

void amrex::MLNodeLaplacian::reflux ( int  crse_amrlev,
MultiFab &  res,
const MultiFab &  crse_sol,
const MultiFab &  crse_rhs,
MultiFab &  fine_res,
MultiFab &  fine_sol,
const MultiFab &  fine_rhs 
) const
finalvirtual

Flux register reflux coupling coarse/fine nodal solves (updates res using the solution and RHS arrays on both levels).

Reimplemented from amrex::MLLinOpT< MultiFab >.

◆ resizeMultiGrid()

void amrex::MLNodeLaplacian::resizeMultiGrid ( int  new_size)
finalprotectedvirtual

Reimplemented from amrex::MLLinOpT< MultiFab >.

◆ restrictInteriorNodes()

void amrex::MLNodeLaplacian::restrictInteriorNodes ( int  camrlev,
MultiFab &  crhs,
MultiFab &  frhs 
) const

Restrict interior-node RHS from fine to coarse when syncing.

◆ restriction()

void amrex::MLNodeLaplacian::restriction ( int  amrlev,
int  cmglev,
MultiFab &  crse,
MultiFab &  fine 
) const
finalvirtual

Restrict nodal data from fine grids to coarse MG level cmglev.

Implements amrex::MLLinOpT< MultiFab >.

◆ setCoarseningStrategy()

void amrex::MLNodeLaplacian::setCoarseningStrategy ( CoarseningStrategy  cs)
inlinenoexcept

Pick between sigma-weighted or RAP coarsening (ignored if sigma constant).

Parameters
csDesired coarsening strategy enum.

◆ setEBInflowVelocity()

void amrex::MLNodeLaplacian::setEBInflowVelocity ( int  amrlev,
const MultiFab &  eb_vel 
)

◆ setGaussSeidel()

void amrex::MLNodeLaplacian::setGaussSeidel ( bool  flag)
inlinenoexcept

Choose red-black Gauss-Seidel instead of Jacobi smoothing.

Parameters
flagTrue selects Gauss-Seidel.

◆ setHarmonicAverage()

void amrex::MLNodeLaplacian::setHarmonicAverage ( bool  flag)
inlinenoexcept

Toggle harmonic averaging when coarsening sigma.

Parameters
flagTrue enables harmonic averaging.

◆ setMapped()

void amrex::MLNodeLaplacian::setMapped ( bool  flag)
inlinenoexcept

Enable mapped-coordinate metrics (non-orthogonal grids).

Parameters
flagTrue enables mapped-coordinate support.

◆ setNormalizationThreshold()

void amrex::MLNodeLaplacian::setNormalizationThreshold ( Real  t)
inlinenoexcept

Threshold for normalization (prevents dividing by tiny averages).

Parameters
tMinimum average magnitude allowed before rescaling.

◆ setRZCorrection()

void amrex::MLNodeLaplacian::setRZCorrection ( bool  rz)
inlinenoexcept

Enable cylindrical (RZ) metric terms.

Parameters
rzTrue activates RZ corrections.

◆ setSigma()

void amrex::MLNodeLaplacian::setSigma ( int  amrlev,
const MultiFab &  a_sigma 
)

Provide per-level conductivity (cell-centered MultiFab). A multi-component input also triggers mapped-coordinate mode.

Parameters
amrlevAMR level receiving the coefficients.
a_sigmaCell-centered MultiFab containing nonzero conductivity coefficients.

◆ supportsAlgMG()

bool amrex::MLNodeLaplacian::supportsAlgMG ( ) const
inlineoverridevirtual

True if makeAlgMG is implemented for this operator.

Reimplemented from amrex::MLLinOpT< MultiFab >.

◆ unimposeNeumannBC()

void amrex::MLNodeLaplacian::unimposeNeumannBC ( int  amrlev,
MultiFab &  rhs 
) const
finalvirtual

Remove Neumann contributions previously imposed on rhs.

Reimplemented from amrex::MLLinOpT< MultiFab >.

◆ update()

void amrex::MLNodeLaplacian::update ( )
finalvirtual

Refresh sigma averages/stencils and clear the dirty flag.

Reimplemented from amrex::MLLinOpT< MultiFab >.

◆ updateVelocity()

void amrex::MLNodeLaplacian::updateVelocity ( const Vector< MultiFab * > &  vel,
const Vector< MultiFab const * > &  sol 
) const

Update velocities using the Poisson solution (projection correction).


The documentation for this class was generated from the following files: