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

Embedded-boundary tensor solver mirroring MLTensorOp inside the domain. More...

#include <AMReX_MLEBTensorOp.H>

Inheritance diagram for amrex::MLEBTensorOp:
amrex::MLEBABecLap amrex::MLCellABecLapT< MultiFab > amrex::MLCellLinOpT< MultiFab > amrex::MLLinOpT< MultiFab >

Public Member Functions

 MLEBTensorOp ()
 Construct an empty EB tensor operator; call define() before using.
 MLEBTensorOp (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)
 Convenience constructor that forwards to define().
 ~MLEBTensorOp () override
 MLEBTensorOp (const MLEBTensorOp &)=delete
 MLEBTensorOp (MLEBTensorOp &&)=delete
MLEBTensorOp & operator= (const MLEBTensorOp &)=delete
MLEBTensorOp & operator= (MLEBTensorOp &&)=delete
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)
 Define the AMR hierarchy using EB-aware factories.
void setShearViscosity (int amrlev, const Array< MultiFab const *, 3 > &eta, Location a_beta_loc)
 Provide shear viscosity eta as face-centered MultiFabs.
void setShearViscosity (int amrlev, Real eta)
 Populate eta with a scalar value on AMR level amrlev.
void setBulkViscosity (int amrlev, const Array< MultiFab const *, 3 > &kappa)
 Provide bulk viscosity kappa as face-centered MultiFabs.
void setBulkViscosity (int amrlev, Real kappa)
 Populate kappa with a scalar value.
void setEBShearViscosity (int amrlev, MultiFab const &eta)
 Provide EB-face shear viscosity.
void setEBShearViscosity (int amrlev, Real eta)
 Set EB shear viscosity to a constant scalar.
void setEBShearViscosityWithInflow (int amrlev, MultiFab const &eta, MultiFab const &eb_vel)
 Provide EB shear viscosity plus inflow velocity corrections.
void setEBBulkViscosity (int amrlev, MultiFab const &kappa)
 Provide EB bulk viscosity from a MultiFab.
void setEBBulkViscosity (int amrlev, Real kappa)
 Set EB bulk viscosity to a constant value.
int getNComp () const final
 Return number of components.
bool isCrossStencil () const final
 EB discretization uses a non-cross stencil.
bool isTensorOp () const final
 Whether this operator is a tensor solve.
bool needsUpdate () const final
 True if coefficients have changed since the last prepareForSolve().
void update () final
 Not implemented for tensor operators.
void prepareForSolve () final
 Prepare shear/bulk coefficient caches and BC data before solving.
bool isSingular (int) const final
 True if AMR level amrlev is singular.
bool isBottomSingular () const final
 True if the bottom level is singular.
void apply (int amrlev, int mglev, MultiFab &out, MultiFab &in, BCMode bc_mode, StateMode s_mode, const MLMGBndry *bndry=nullptr) const final
 Apply the EB tensor operator at (amrlev,mglev).
void applyBC (int amrlev, int mglev, MultiFab &in, BCMode bc_mode, StateMode s_mode, const MLMGBndry *bndry=nullptr, bool skip_fillboundary=false) const final
 Fill the ghost cells of in, including the corner and edge cells outside two or three domain faces that the EB stencils read.
void smooth (int amrlev, int mglev, MultiFab &sol, const MultiFab &rhs, bool skip_fillboundary, int niter) const final
 Smooth with the scalar smoother of MLEBABecLap, which only needs the face ghost cells, so the corner and edge fill is skipped.
void compFlux (int amrlev, const Array< MultiFab *, 3 > &fluxes, MultiFab &sol, Location loc) const override
 Assemble viscous fluxes on AMR level amrlev.
void compVelGrad (int amrlev, const Array< MultiFab *, 3 > &grads, MultiFab &sol, Location loc) const
 Compute velocity gradients at the requested location.
void setBCoeffs (int amrlev, const Array< MultiFab const *, 3 > &beta, Location a_beta_loc)=delete
void setEBDirichlet (int amrlev, const MultiFab &phi, const MultiFab &beta)=delete
void setEBHomogDirichlet (int amrlev, const MultiFab &beta)=delete
void applyBCTensor (int amrlev, int mglev, MultiFab &vel, BCMode bc_mode, StateMode s_mode, const MLMGBndry *bndry) const
 Apply tensor boundary conditions prior to an operator call.
void compCrossTerms (int amrlev, int mglev, MultiFab const &mf, const MLMGBndry *bndry) const
 Compute cross-derivative stress terms for cached BC data.
Public Member Functions inherited from amrex::MLEBABecLap
 MLEBABecLap ()=default
 Construct an empty operator; call define() before use.
 MLEBABecLap (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, int a_ncomp=1)
 Convenience constructor that forwards to define().
 MLEBABecLap (const Vector< Geometry > &a_geom, const Vector< BoxArray > &a_grids, const Vector< DistributionMapping > &a_dmap, const Vector< iMultiFab const * > &a_overset_mask, const LPInfo &a_info, const Vector< EBFArrayBoxFactory const * > &a_factory, int a_ncomp=1)
 ~MLEBABecLap () override
 MLEBABecLap (const MLEBABecLap &)=delete
 MLEBABecLap (MLEBABecLap &&)=delete
MLEBABecLap & operator= (const MLEBABecLap &)=delete
MLEBABecLap & operator= (MLEBABecLap &&)=delete
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, int a_ncomp=1)
 Bind the EB operator to the AMR hierarchy.
void define (const Vector< Geometry > &a_geom, const Vector< BoxArray > &a_grids, const Vector< DistributionMapping > &a_dmap, const Vector< iMultiFab const * > &a_overset_mask, const LPInfo &a_info, const Vector< EBFArrayBoxFactory const * > &a_factory, int a_ncomp=1)
void setPhiOnCentroid ()
 Interprets phi on EB centroids instead of cell centers when set.
void setScalars (Real a, Real b)
 Set constant scalar coefficients (see MLCellABecLap semantics).
void setACoeffs (int amrlev, const MultiFab &alpha)
 Provide per-cell a coefficients for AMR level amrlev.
void setACoeffs (int amrlev, Real alpha)
 Provide a constant a coefficient.
void setBCoeffs (int amrlev, const Array< MultiFab const *, 3 > &beta, Location a_beta_loc)
 Provide spatially varying b coefficients and their location.
void setBCoeffs (int amrlev, const Array< MultiFab const *, 3 > &beta)
void setBCoeffs (int amrlev, Real beta)
 Provide constant scalar b coefficients.
void setBCoeffs (int amrlev, Vector< Real > const &beta)
 Provide component-specific constant b coefficients.
void setEBDirichlet (int amrlev, const MultiFab &phi, const MultiFab &beta)
 Specify Dirichlet values on EB faces using phi.
void setEBDirichlet (int amrlev, const MultiFab &phi, Real beta)
 Specify Dirichlet values on EB faces.
void setEBDirichlet (int amrlev, const MultiFab &phi, Vector< Real > const &beta)
 Specify Dirichlet values on EB faces.
void setEBHomogDirichlet (int amrlev, const MultiFab &beta)
 Mark EB faces as homogeneous Dirichlet (phi=0) with optional coefficients.
void setEBHomogDirichlet (int amrlev, Real beta)
 Mark EB faces as homogeneous Dirichlet (phi=0).
void setEBHomogDirichlet (int amrlev, Vector< Real > const &beta)
 Mark EB faces as homogeneous Dirichlet (phi=0).
std::unique_ptr< FabFactory< FArrayBox > > makeFactory (int amrlev, int mglev) const final
 EB-aware factory used when the solver needs auxiliary storage on (amrlev,mglev).
void applyBC (int amrlev, int mglev, MultiFab &in, BCMode bc_mode, StateMode s_mode, const MLMGBndry *bndry=nullptr, bool skip_fillboundary=false) const override
 Apply physical BCs to in on (amrlev,mglev) using the supplied BC metadata.
void apply (int amrlev, int mglev, MultiFab &out, MultiFab &in, BCMode bc_mode, StateMode s_mode, const MLMGBndry *bndry=nullptr) const override
 Apply the discrete operator to in on (amrlev,mglev) and store the result in out.
void compGrad (int amrlev, const Array< MultiFab *, 3 > &grad, MultiFab &sol, Location loc) const final
 Compute gradients from the solution sol on level amrlev at location loc.
void Fapply (int amrlev, int mglev, MultiFab &out, const MultiFab &in) const final
 Apply the operator on (amrlev,mglev) and write to out.
void Fsmooth (int amrlev, int mglev, MultiFab &sol, const MultiFab &rhs, int redblack) const final
 Execute a smoothing sweep on (amrlev,mglev). redblack selects the red (0) or black (1) half of the grid.
void FFlux (int amrlev, const MFIter &mfi, const Array< FArrayBox *, 3 > &flux, const FArrayBox &sol, Location loc, int face_only=0) const final
 Compute EB-aware fluxes for sol on the tilebox described by mfi, storing to flux at loc (respecting face_only).
void normalize (int amrlev, int mglev, MultiFab &mf) const final
 Divide mf by the diagonal of the operator (used by CG-family bottom solvers).
Real getAScalar () const final
 Scalar applied to the zeroth-order term.
Real getBScalar () const final
 Scalar applied to the diffusion term.
MultiFab const * getACoeffs (int amrlev, int mglev) const final
 Access the a coefficient MultiFab.
Array< MultiFab const *, 3 > getBCoeffs (int amrlev, int mglev) const final
 Access the b coefficients for (amrlev,mglev).
std::unique_ptr< MLLinOp > makeNLinOp (int) const final
 Create the NSolve counterpart of this operator with the requested grid size.
void averageDownCoeffsSameAmrLevel (int amrlev, Vector< MultiFab > &a, Vector< Array< MultiFab, 3 > > &b, const Vector< MultiFab * > &b_eb)
void restriction (int amrlev, int cmglev, MultiFab &crse, MultiFab &fine) const final
 Restrict fine-grid data onto coarse storage.
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 from fine AMR levels into (camrlev) storage.
void getEBFluxes (const Vector< MultiFab * > &a_flux, const Vector< MultiFab * > &a_sol) const override
 Extract EB face fluxes.
void applyRobinBCTermsCoeffs ()
 Apply Robin BC terms to the stored coefficients when requested.
MultiFab const * getEBBCoeffs (int amrlev, int mglev) const override
 EB Dirichlet b coefficient for the matrix assembly (nullptr without EB).
bool supportsAlgMG () const override
 The assembled matrix uses cell centers and face centers only.
Public Member Functions inherited from amrex::MLCellABecLapT< MultiFab >
 MLCellABecLapT ()=default
 ~MLCellABecLapT () override=default
 MLCellABecLapT (const MLCellABecLapT< MultiFab > &)=delete
 MLCellABecLapT (MLCellABecLapT< MultiFab > &&)=delete
MLCellABecLapT< MultiFab > & operator= (const MLCellABecLapT< MultiFab > &)=delete
MLCellABecLapT< MultiFab > & operator= (MLCellABecLapT< MultiFab > &&)=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< FAB > const * > &a_factory={})
 Describe the AMR hierarchy when overset masks are not required.
void define (const Vector< Geometry > &a_geom, const Vector< BoxArray > &a_grids, const Vector< DistributionMapping > &a_dmap, const Vector< iMultiFab const * > &a_overset_mask, const LPInfo &a_info=LPInfo(), const Vector< FabFactory< FAB > const * > &a_factory={})
 Describe the AMR hierarchy when overset masks participate.
iMultiFab const * getOversetMask (int amrlev, int mglev) const
 Overset mask for (amrlev,mglev); returns nullptr when not defined.
void setDirichletNodesToZero (int amrlev, int mglev, MultiFab &mf) const override
 Zero out Dirichlet nodes on (amrlev,mglev) so that GMRES can treat them as known.
void getFluxes (const Vector< Array< MultiFab *, 3 > > &a_flux, const Vector< MultiFab * > &a_sol, Location a_loc) const final
 Fill per-face fluxes using the supplied solution hierarchy.
void getFluxes (const Vector< MultiFab * > &a_flux, const Vector< MultiFab * > &a_sol) const final
 Guard overload that aborts if called (cell-centered flux extraction requires per-direction face arrays).
void applyInhomogNeumannTerm (int amrlev, MultiFab &rhs) const final
 Apply stored Neumann data to the RHS rhs on AMR level amrlev.
void addInhomogNeumannFlux (int amrlev, const Array< MultiFab *, 3 > &grad, MultiFab const &sol, bool mult_bcoef) const final
 Add inhomogeneous Neumann/Robin flux contributions into grad from sol (include b when mult_bcoef is true).
void applyOverset (int amrlev, MultiFab &rhs) const override
 Zero RHS entries in rhs that are covered by overset masks on level amrlev.
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.
Array< MultiFab, 3 > makeDefaultBCoeffs (int mglev) const
Public Member Functions inherited from amrex::MLCellLinOpT< MultiFab >
 MLCellLinOpT ()
 ~MLCellLinOpT () override=default
 MLCellLinOpT (const MLCellLinOpT< MultiFab > &)=delete
 MLCellLinOpT (MLCellLinOpT< MultiFab > &&)=delete
MLCellLinOpT< MultiFab > & operator= (const MLCellLinOpT< MultiFab > &)=delete
MLCellLinOpT< MultiFab > & operator= (MLCellLinOpT< MultiFab > &&)=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< FAB > const * > &a_factory={})
 Bind the operator to an AMR hierarchy.
void setLevelBC (int amrlev, const MultiFab *levelbcdata, const MultiFab *robinbc_a=nullptr, const MultiFab *robinbc_b=nullptr, const MultiFab *robinbc_f=nullptr) final
 Provide per-level inhomogeneous boundary data.
void setLevelBC (int amrlev, const AMF *levelbcdata, const AMF *robinbc_a=nullptr, const AMF *robinbc_b=nullptr, const AMF *robinbc_f=nullptr)
void setGaussSeidel (bool flag) noexcept
 Toggle Gauss–Seidel smoothing in place of Jacobi relaxation.
void updateSolBC (int amrlev, const MultiFab &crse_bcdata) const
 Refresh stored solution BC data from coarse inputs.
void updateCorBC (int amrlev, const MultiFab &crse_bcdata) const
 Refresh stored correction BC data from coarse inputs.
virtual void applyBC (int amrlev, int mglev, MultiFab &in, BCMode bc_mode, StateMode s_mode, const MLMGBndryT< MultiFab > *bndry=nullptr, bool skip_fillboundary=false) const
 Apply physical BCs (optionally skipping FillBoundary).
BoxArray makeNGrids (int grid_size) const
 Helper that builds a BoxArray for NSolve with boxes no larger than the requested grid_size.
void interpAssign (int amrlev, int fmglev, MultiFab &fine, MultiFab &crse) const override
 Overwrite fine data with the prolongation of coarse data (fine = prolong(crse)).
void interpolationAmr (int famrlev, MultiFab &fine, const MultiFab &crse, IntVect const &nghost) const override
 Prolong AMR-level data during FMG initialization.
void apply (int amrlev, int mglev, MultiFab &out, MultiFab &in, BCMode bc_mode, StateMode s_mode, const MLMGBndryT< MultiFab > *bndry=nullptr) const override
 Apply the linear operator with boundary conditions.
void solutionResidual (int amrlev, MultiFab &resid, MultiFab &x, const MultiFab &b, const MultiFab *crse_bcdata=nullptr) override
 Compute the residual resid = b - A(x) using solution boundary data.
void prepareForFluxes (int amrlev, const MultiFab *crse_bcdata=nullptr) override
 Ensure BC caches are ready for flux computations (e.g., getFluxes).
void correctionResidual (int amrlev, int mglev, MultiFab &resid, MultiFab &x, const MultiFab &b, BCMode bc_mode, const MultiFab *crse_bcdata=nullptr) final
 Compute the correction residual with optional coarse data.
void reflux (int crse_amrlev, MultiFab &res, const MultiFab &crse_sol, const MultiFab &, MultiFab &, MultiFab &fine_sol, const MultiFab &) const final
 Reflux fine-level fluxes into the coarse residual.
void compFlux (int amrlev, const Array< MultiFab *, 3 > &fluxes, MultiFab &sol, Location loc) const override
 Compute face-centered fluxes from the supplied solution.
void compGrad (int amrlev, const Array< MultiFab *, 3 > &grad, MultiFab &sol, Location loc) const override
 Compute directional gradients of the solution.
void applyMetricTerm (int amrlev, int mglev, MultiFab &rhs) const final
 Multiply the RHS by metric terms appropriate for curvilinear coordinates.
void unapplyMetricTerm (int amrlev, int mglev, MultiFab &rhs) const final
 Remove metric scaling previously applied to the RHS.
Vector< RT > getSolvabilityOffset (int amrlev, int mglev, MultiFab const &rhs) const override
 Compute the average offset needed to enforce solvability constraints.
void fixSolvabilityByOffset (int amrlev, int mglev, MultiFab &rhs, Vector< RT > const &offset) const override
 Apply solvability offsets to the RHS (subtracting the average).
RT xdoty (int amrlev, int mglev, const MultiFab &x, const MultiFab &y, bool local) const final
 Dot product helper.
RT dotProductPrecond (Vector< MultiFab const * > const &x, Vector< MultiFab const * > const &y) const final
 Dot product over the composite AMR hierarchy, excluding cells covered by finer levels (used when the operator is a preconditioner).
RT norm2Precond (Vector< MultiFab const * > const &x) const final
 L2 norm over the composite AMR hierarchy, excluding cells covered by finer levels (used when the operator is a preconditioner).
virtual void FFlux (int amrlev, const MFIter &mfi, const Array< FAB *, 3 > &flux, const FAB &sol, Location loc, int face_only=0) const=0
RT normInf (int amrlev, MultiFab const &mf, bool local) const override
 Infinity norm helper used by solvers and diagnostics.
void averageDownAndSync (Vector< MultiFab > &sol) const override
 Average the solution hierarchy down (fine-to-coarse) and sync.
void avgDownResAmr (int clev, MultiFab &cres, MultiFab const &fres) const override
 Average a residual from a fine AMR level to its coarse parent.
void beginPrecondBC () override
 Called when the operator starts being used as a preconditioner.
void endPrecondBC () override
 Called when the operator stops being used as a preconditioner.
void setInterpBndryHalfWidth (int w)
 Control how many cells the interpolation boundary stencil spans.
Public Member Functions inherited from amrex::MLLinOpT< MultiFab >
 MLLinOpT ()=default
virtual ~MLLinOpT ()=default
 MLLinOpT (const MLLinOpT< MultiFab > &)=delete
 MLLinOpT (MLLinOpT< MultiFab > &&)=delete
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.
virtual std::string name () const
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 BottomSolver getDefaultBottomSolver () const
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 getNGrow (int=0, int=0) const
virtual void interpCoarseFineSolution (int famrlev, MultiFab &fine_sol, const MultiFab &crse_sol) const
 Before a composite solve, set the solution at the nodes that fine AMR level famrlev takes from the coarse level (the coarse/fine nodes of MLNodeLaplacian) to the interpolated coarse solution. The solve only adds interpolated corrections there, so the result would otherwise depend on the initial guess. The default does nothing.
virtual void unimposeNeumannBC (int amrlev, MultiFab &rhs) const
 Undo Neumann contributions stored on the RHS.
virtual bool scaleRHS (int amrlev, MultiFab *rhs) const
 Optionally scale the RHS to fix solvability.
virtual void preparePrecond ()
 Prepare auxiliary data used when the operator acts as a preconditioner.
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).
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 Attributes

bool m_has_kappa = false
bool m_has_eb_kappa = false
Vector< Vector< Array< MultiFab, 3 > > > m_kappa
Vector< Vector< MultiFab > > m_eb_kappa
Vector< Vector< Array< MultiFab, 3 > > > m_tauflux
Protected Attributes inherited from amrex::MLEBABecLap
int m_ncomp = 1
Location m_beta_loc
Location m_phi_loc
Vector< Vector< iMultiFab > > m_cc_mask
Vector< std::unique_ptr< MultiFab > > m_eb_phi
Vector< Vector< std::unique_ptr< MultiFab > > > m_eb_b_coeffs
Vector< int > m_is_singular
int m_is_eb_inhomog
Vector< Vector< TagVector< MLMGABCEBTag< RT > > > > m_eb_bc_tags
Protected Attributes inherited from amrex::MLCellABecLapT< MultiFab >
Vector< Vector< std::unique_ptr< iMultiFab > > > m_overset_mask
LPInfo m_lpinfo_arg
Protected Attributes inherited from amrex::MLCellLinOpT< MultiFab >
bool m_has_metric_term
Vector< std::unique_ptr< MLMGBndryT< MultiFab > > > m_bndry_sol
Vector< std::unique_ptr< BndryRegisterT< MultiFab > > > m_crse_sol_br
Vector< std::unique_ptr< MLMGBndryT< MultiFab > > > m_bndry_cor
Vector< std::unique_ptr< BndryRegisterT< MultiFab > > > m_crse_cor_br
Vector< std::unique_ptr< MLMGBndryT< MultiFab > > > m_bndry_sol_zero
Vector< Vector< std::unique_ptr< BndryCondLoc > > > m_bcondloc
Vector< Vector< BndryRegisterT< MultiFab > > > m_undrrelxr
Vector< Vector< Array< MultiMask, 2 *3 > > > m_maskvals
Vector< std::unique_ptr< iMultiFab > > m_norm_fine_mask
Vector< YAFluxRegisterT< MultiFab > > m_fluxreg
bool m_use_gauss_seidel
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

Additional Inherited Members

Public Types inherited from amrex::MLCellABecLapT< MultiFab >
using FAB
using RT
using Location
Public Types inherited from amrex::MLCellLinOpT< MultiFab >
using FAB
using RT
using BCType
using BCMode
using StateMode
using Location
Public Types inherited from amrex::MLLinOpT< MultiFab >
using MFType
using FAB
using RT
using BCType
using BCMode
using StateMode
using Location
Public Attributes inherited from amrex::MLEBABecLap
Real m_a_scalar = std::numeric_limits<Real>::quiet_NaN()
 Scalar multiplier for the a term (set via setScalars()).
Real m_b_scalar = std::numeric_limits<Real>::quiet_NaN()
Vector< Vector< MultiFab > > m_a_coeffs
Vector< Vector< Array< MultiFab, 3 > > > m_b_coeffs
bool m_scalars_set = false
bool m_acoef_set = false
Public Attributes inherited from amrex::MLCellLinOpT< MultiFab >
Vector< std::unique_ptr< MultiFab > > m_robin_bcval
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 Types inherited from amrex::MLCellLinOpT< MultiFab >
using RealTuple
using BCTuple
Protected Member Functions inherited from amrex::MLEBABecLap
bool isEBDirichlet () const noexcept
void averageDownCoeffs ()
 Average coefficients down across all AMR and MG levels.
void averageDownEBPhi ()
 Average inhomogeneous EB Dirichlet values down across AMR levels.
void averageDownCoeffsToCoarseAmrLevel (int flev)
 Average coefficients from fine AMR level flev to coarse AMR level flev-1.
bool supportRobinBC () const noexcept override
Protected Member Functions inherited from amrex::MLCellABecLapT< MultiFab >
bool supportInhomogNeumannBC () const noexcept override
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
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 void resizeMultiGrid (int new_size)
void prepareMGHierarchy ()
 Build the deferred MG levels of AMR level 0 once. See supportsAnisotropicCoarsening.
virtual void buildMGHierarchy ()
 Build the MG levels of AMR level 0 below the finest one.
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
Static Protected Attributes inherited from amrex::MLLinOpT< MultiFab >
static constexpr int mg_coarsen_ratio

Detailed Description

Embedded-boundary tensor solver mirroring MLTensorOp inside the domain.

Constructor & Destructor Documentation

◆ MLEBTensorOp() [1/4]

amrex::MLEBTensorOp::MLEBTensorOp ( )

Construct an empty EB tensor operator; call define() before using.

◆ MLEBTensorOp() [2/4]

amrex::MLEBTensorOp::MLEBTensorOp ( 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 )

Convenience constructor that forwards to define().

Requires EB factories for each AMR level.

◆ ~MLEBTensorOp()

amrex::MLEBTensorOp::~MLEBTensorOp ( )
overridedefault

◆ MLEBTensorOp() [3/4]

amrex::MLEBTensorOp::MLEBTensorOp ( const MLEBTensorOp & )
delete

◆ MLEBTensorOp() [4/4]

amrex::MLEBTensorOp::MLEBTensorOp ( MLEBTensorOp && )
delete

Member Function Documentation

◆ apply()

void amrex::MLEBTensorOp::apply ( int amrlev,
int mglev,
MultiFab & out,
MultiFab & in,
BCMode bc_mode,
StateMode s_mode,
const MLMGBndry * bndry = nullptr ) const
final

Apply the EB tensor operator at (amrlev,mglev).

Parameters
amrlevAMR level targeted by the apply.
mglevMultigrid level within that AMR level.
outDestination MultiFab receiving L(in).
inSource MultiFab storing the vector field being operated on.
bc_modeBoundary-condition handling (homogeneous vs inhomogeneous).
s_modeState interpretation (solution vs correction).
bndryOptional boundary metadata supplied by MLMG.

◆ applyBC()

void amrex::MLEBTensorOp::applyBC ( int amrlev,
int mglev,
MultiFab & in,
BCMode bc_mode,
StateMode s_mode,
const MLMGBndry * bndry = nullptr,
bool skip_fillboundary = false ) const
final

Fill the ghost cells of in, including the corner and edge cells outside two or three domain faces that the EB stencils read.

◆ applyBCTensor()

void amrex::MLEBTensorOp::applyBCTensor ( int amrlev,
int mglev,
MultiFab & vel,
BCMode bc_mode,
StateMode s_mode,
const MLMGBndry * bndry ) const

Apply tensor boundary conditions prior to an operator call.

Parameters
amrlevAMR level index.
mglevMultigrid level index.
velVelocity field updated in place.
bc_modeBoundary-condition mode supplied by MLMG.
s_modeState interpretation (solution/correction).
bndryBoundary metadata (may be null to rebuild on the fly).

◆ compCrossTerms()

void amrex::MLEBTensorOp::compCrossTerms ( int amrlev,
int mglev,
MultiFab const & mf,
const MLMGBndry * bndry ) const

Compute cross-derivative stress terms for cached BC data.

Parameters
amrlevAMR level index.
mglevMultigrid level index.
mfMultiFab providing the field whose derivatives are needed.
bndryBoundary metadata describing where to store the terms.

◆ compFlux()

void amrex::MLEBTensorOp::compFlux ( int amrlev,
const Array< MultiFab *, 3 > & fluxes,
MultiFab & sol,
Location loc ) const
override

Assemble viscous fluxes on AMR level amrlev.

Parameters
amrlevLevel whose fluxes are being computed.
fluxesDestination arrays (one per spatial direction).
solSolution whose fluxes are being computed.
locGeometric location for the stencil (face center, centroid, etc.).

◆ compVelGrad()

void amrex::MLEBTensorOp::compVelGrad ( int amrlev,
const Array< MultiFab *, 3 > & grads,
MultiFab & sol,
Location loc ) const

Compute velocity gradients at the requested location.

Parameters
amrlevAMR level index.
gradsDestination gradient MultiFabs per direction.
solSolution whose gradients are computed.
locLocation (cell/face center, centroid, etc.).

◆ define()

void amrex::MLEBTensorOp::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 )

Define the AMR hierarchy using EB-aware factories.

Parameters
a_geomPer-level geometries (fine to coarse).
a_gridsPer-level grids.
a_dmapDistribution mappings.
a_infoOptional LPInfo overrides.
a_factoryEB factories per AMR level.

◆ getNComp()

int amrex::MLEBTensorOp::getNComp ( ) const
inlinenodiscardfinalvirtual

Return number of components.

Reimplemented from amrex::MLEBABecLap.

◆ isBottomSingular()

bool amrex::MLEBTensorOp::isBottomSingular ( ) const
inlinenodiscardfinalvirtual

True if the bottom level is singular.

Reimplemented from amrex::MLEBABecLap.

◆ isCrossStencil()

bool amrex::MLEBTensorOp::isCrossStencil ( ) const
inlinenodiscardfinalvirtual

EB discretization uses a non-cross stencil.

Reimplemented from amrex::MLEBABecLap.

◆ isSingular()

bool amrex::MLEBTensorOp::isSingular ( int amrlev) const
inlinenodiscardfinalvirtual

True if AMR level amrlev is singular.

Reimplemented from amrex::MLEBABecLap.

◆ isTensorOp()

bool amrex::MLEBTensorOp::isTensorOp ( ) const
inlinenodiscardfinalvirtual

Whether this operator is a tensor solve.

Reimplemented from amrex::MLCellLinOpT< MultiFab >.

◆ needsUpdate()

bool amrex::MLEBTensorOp::needsUpdate ( ) const
inlinenodiscardfinalvirtual

True if coefficients have changed since the last prepareForSolve().

The operator may be reused for any number of solves as long as its coefficients are left untouched.

Reimplemented from amrex::MLEBABecLap.

◆ operator=() [1/2]

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

◆ operator=() [2/2]

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

◆ prepareForSolve()

void amrex::MLEBTensorOp::prepareForSolve ( )
finalvirtual

Prepare shear/bulk coefficient caches and BC data before solving.

Reimplemented from amrex::MLEBABecLap.

◆ setBCoeffs()

void amrex::MLEBTensorOp::setBCoeffs ( int amrlev,
const Array< MultiFab const *, 3 > & beta,
Location a_beta_loc )
delete

◆ setBulkViscosity() [1/2]

void amrex::MLEBTensorOp::setBulkViscosity ( int amrlev,
const Array< MultiFab const *, 3 > & kappa )

Provide bulk viscosity kappa as face-centered MultiFabs.

Parameters
amrlevAMR level receiving the data.
kappaArray of MultiFabs (per spatial direction).

◆ setBulkViscosity() [2/2]

void amrex::MLEBTensorOp::setBulkViscosity ( int amrlev,
Real kappa )

Populate kappa with a scalar value.

Parameters
amrlevAMR level receiving the constant.
kappaScalar bulk viscosity.

◆ setEBBulkViscosity() [1/2]

void amrex::MLEBTensorOp::setEBBulkViscosity ( int amrlev,
MultiFab const & kappa )

Provide EB bulk viscosity from a MultiFab.

Parameters
amrlevAMR level receiving the data.
kappaEB-face bulk viscosity.

◆ setEBBulkViscosity() [2/2]

void amrex::MLEBTensorOp::setEBBulkViscosity ( int amrlev,
Real kappa )

Set EB bulk viscosity to a constant value.

Passing zero still counts as providing the EB bulk viscosity, so setBulkViscosity must be called as well.

Parameters
amrlevAMR level receiving the value.
kappaScalar EB bulk viscosity.

◆ setEBDirichlet()

void amrex::MLEBTensorOp::setEBDirichlet ( int amrlev,
const MultiFab & phi,
const MultiFab & beta )
delete

◆ setEBHomogDirichlet()

void amrex::MLEBTensorOp::setEBHomogDirichlet ( int amrlev,
const MultiFab & beta )
delete

◆ setEBShearViscosity() [1/2]

void amrex::MLEBTensorOp::setEBShearViscosity ( int amrlev,
MultiFab const & eta )

Provide EB-face shear viscosity.

Parameters
amrlevAMR level receiving the data.
etaEB-face MultiFab describing the viscosity.

◆ setEBShearViscosity() [2/2]

void amrex::MLEBTensorOp::setEBShearViscosity ( int amrlev,
Real eta )

Set EB shear viscosity to a constant scalar.

Parameters
amrlevAMR level receiving the value.
etaScalar EB viscosity.

◆ setEBShearViscosityWithInflow()

void amrex::MLEBTensorOp::setEBShearViscosityWithInflow ( int amrlev,
MultiFab const & eta,
MultiFab const & eb_vel )

Provide EB shear viscosity plus inflow velocity corrections.

Parameters
amrlevAMR level receiving the data.
etaEB-face viscosity MultiFab.
eb_velEB-face inflow correction velocities.

◆ setShearViscosity() [1/2]

void amrex::MLEBTensorOp::setShearViscosity ( int amrlev,
const Array< MultiFab const *, 3 > & eta,
Location a_beta_loc )

Provide shear viscosity eta as face-centered MultiFabs.

Parameters
amrlevAMR level receiving the data.
etaArray of MultiFabs (per spatial direction).
a_beta_locGeometric location of the supplied coefficients.

◆ setShearViscosity() [2/2]

void amrex::MLEBTensorOp::setShearViscosity ( int amrlev,
Real eta )

Populate eta with a scalar value on AMR level amrlev.

Parameters
amrlevAMR level receiving the constant viscosity.
etaScalar viscosity applied to every face.

◆ smooth()

void amrex::MLEBTensorOp::smooth ( int amrlev,
int mglev,
MultiFab & sol,
const MultiFab & rhs,
bool skip_fillboundary,
int niter ) const
finalvirtual

Smooth with the scalar smoother of MLEBABecLap, which only needs the face ghost cells, so the corner and edge fill is skipped.

Reimplemented from amrex::MLCellLinOpT< MultiFab >.

◆ update()

void amrex::MLEBTensorOp::update ( )
inlinefinalvirtual

Not implemented for tensor operators.

Changing viscosity or a coefficients after prepareForSolve() is not supported; build a new operator instead.

Reimplemented from amrex::MLEBABecLap.

Member Data Documentation

◆ m_eb_kappa

Vector<Vector<MultiFab> > amrex::MLEBTensorOp::m_eb_kappa
protected

◆ m_has_eb_kappa

bool amrex::MLEBTensorOp::m_has_eb_kappa = false
protected

◆ m_has_kappa

bool amrex::MLEBTensorOp::m_has_kappa = false
protected

◆ m_kappa

Vector<Vector<Array<MultiFab,3> > > amrex::MLEBTensorOp::m_kappa
protected

◆ m_tauflux

Vector<Vector<Array<MultiFab,3> > > amrex::MLEBTensorOp::m_tauflux
mutableprotected

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